Skip to content

Instantly share code, notes, and snippets.

@KeitetsuWorks
Last active January 31, 2021 07:43
Show Gist options
  • Select an option

  • Save KeitetsuWorks/917eb0d1c34836993c9041035082aebd to your computer and use it in GitHub Desktop.

Select an option

Save KeitetsuWorks/917eb0d1c34836993c9041035082aebd to your computer and use it in GitHub Desktop.
Get digital input values from Arduino
#!/usr/bin/env python
# -*- coding: utf-8 -*-
##
## @file arduino_comm.py
## @brief Get digital input values from Arduino
## @author Keitetsu
## @date 2021/01/31
## @copyright Copyright (c) 2021 Keitetsu
## @par License
## This software is released under the MIT License.
##
import argparse
import sys
import serial
def recieve_din_values(ser, num_din_values=5):
# 文字列の長さの期待値を計算する
# デジタル入力ピンの数 + 区切り文字の数 (デジタル入力ピンの数 - 1)
expected_line_len = num_din_values + (num_din_values - 1)
# 1行受信する
line = ser.readline()
# 改行コードを削除し,文字列に変換する
line_string = line.strip().decode("utf-8")
# ","で文字列を分割する
line_elements = line_string.split(",")
# 文字列の長さが期待値に一致かつ
# 分割結果がデジタル入力ピンの数であれば,リストに値を格納する
if ((len(line_string) == expected_line_len) and (len(line_elements) == num_din_values)):
din_values = [0] * num_din_values
for i, din_value in enumerate(line_elements):
din_values[i] = int(din_value)
else:
din_values = None
return din_values
if __name__ == "__main__":
parser = argparse.ArgumentParser(
description = "Get digital input values from Arduino"
)
parser.add_argument(
"--port",
"-p",
type = str,
default = "/dev/ttyUSB0",
help = "Serial port (Arduino)"
)
args = parser.parse_args()
# 引数を変数に格納
port = args.port
# デジタル入力ピンのリスト
din_pins = ("g0", "g1", "g2", "Button", "mode")
# シリアルポートをオープン
try:
ser = serial.Serial(port=port, baudrate=9600)
except:
print("No Arduino found", file=sys.stderr)
raise
try:
print("Press Ctrl+C to quit")
while True:
din_values = recieve_din_values(ser, 5)
# 正常に受信できた場合は,各デジタル入力ピンの値を表示する
if (din_values is not None):
buf = ""
for i, din_pin in enumerate(din_pins):
buf += "%s: %1u" % (din_pin, din_values[i])
if (i != (len(din_pins) - 1)):
buf += ", "
print(buf)
except KeyboardInterrupt:
# シリアルポートをクローズ
ser.close()
/**
* @file serial.ino
* @brief Arduino Data Transmitter
* @author Keitetsu
* @date 2021/01/31
* @copyright Copyright (c) 2021 Keitetsu
* @par License
* This software is released under the MIT License.
*/
#define DIN_NUM 5 /**< デジタル入力ピンの数 */
/** @{ */
/**
* @brief デジタル入力ピンのリストのインデックス
*/
#define DIN_G0 0 /**< g0入力 */
#define DIN_G1 1 /**< g1入力 */
#define DIN_G2 2 /**< g2入力 */
#define DIN_BUTTON 3 /**< button入力 */
#define DIN_MODE 4 /**< mode入力 */
/** @} */
#define BUF_SIZE 10 /**< シリアル通信の送信バッファのサイズ */
#define INTERVAL_TIME 500 /**< 周期実行の間隔 */
/**
* @brief デジタル入力ピンのリスト
*/
uint8_t din_pins[DIN_NUM] = {2, 3, 4, 5, 6};
unsigned long prev_time; /**< 周期実行の前回実行時刻 */
unsigned long interval_time; /**< 周期実行の間隔 */
/**
* @brief 入出力値のシリアル送信
*/
void sendData()
{
uint8_t i;
uint8_t din_values[DIN_NUM];
char buf[BUF_SIZE];
// デジタル入力ピンの値を取得する
for (i = 0; i < DIN_NUM; i++) {
din_values[i] = digitalRead(din_pins[i]);
}
// 送信する
sprintf(
buf,
"%1u,%1u,%1u,%1u,%1u",
din_values[DIN_G0],
din_values[DIN_G1],
din_values[DIN_G2],
din_values[DIN_BUTTON],
din_values[DIN_MODE]);
Serial.println(buf);
}
/**
* @brief セットアップ関数
*/
void setup()
{
uint8_t i;
// シリアル通信の初期化
Serial.begin(9600);
// デジタル入力ピンの初期化
for (i = 0; i < DIN_NUM; i++) {
pinMode(din_pins[i], INPUT_PULLUP);
}
// 周期実行の初期化
prev_time = 0;
interval_time = INTERVAL_TIME;
}
/**
* @brief ループ関数
*/
void loop()
{
unsigned long curr_time;
// 現在時刻を取得する
curr_time = millis();
// 周期実行
if ((curr_time - prev_time) >= interval_time) {
prev_time += interval_time;
sendData();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment