Last active
January 31, 2021 07:43
-
-
Save KeitetsuWorks/917eb0d1c34836993c9041035082aebd to your computer and use it in GitHub Desktop.
Get digital input values from Arduino
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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() |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /** | |
| * @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