はじめに
この記事では、Pythonを使用してArduinoのGPIOピンから出力を行う方法をわかりやすく説明します。
やりたいこと
目指すのは、PythonでGUIボタンをクリックすることでArduinoボードにトリガー信号を送り、特定のピンからHighレベル(5Vまたは3.3V)の信号を出力させることです。この信号はLEDを用いて視覚的に確認します。PythonはPC上で実行し、ArduinoはUSBケーブルを通じてPCに接続されます。
必要なもの
- Arduinoボード (例:Arduino Uno)
- LED と抵抗
- USBケーブル (ArduinoをPCに接続)
- Arduino IDE (Arduinoプログラムを書くため)
- Python (Pythonスクリプトを実行するため)
- PySerialライブラリ (Pythonからシリアル通信を行うため)
Arduino スケッチの準備
Arduino IDEを開き、新しいスケッチを作成します。
- トリガーを受け取り、指定されたピンをHIGHに設定するコードを書きます。
- 例えば、ピン13にLEDを接続している場合は以下のようになります。
- スケッチをArduinoボードにアップロードします。
void setup() {
pinMode(13, OUTPUT); // ピン13を出力モードに設定
Serial.begin(9600); // シリアル通信の開始
}
void loop() {
if (Serial.available() > 0) { // シリアルポートでデータが利用可能かチェック
char data = Serial.read(); // データを読み込む
if (data == '1') {
digitalWrite(13, HIGH); // ピン13をHIGHに設定
} else if (data == '0') {
digitalWrite(13, LOW); // ピン13をLOWに設定
}
}
}
Pythonスクリプトの作成
1. 基本コード
- Pythonスクリプトを作成し、PySerialを使ってArduinoと通信します。
- 以下はPythonスクリプトの基本的な例です。
import serial
import time
# シリアルポートの設定(ポート名は環境によって異なる)
ser = serial.Serial('COM3', 9600) # Windowsの場合
# ser = serial.Serial('/dev/ttyACM0', 9600) # Linuxの場合
# ser = serial.Serial('/dev/tty.usbmodem14201', 9600) # macOSの場合
time.sleep(2) # Arduinoとの接続が安定するまで待機
# LEDを点灯
ser.write(b'1')
time.sleep(10) # 10秒間点灯
# LEDを消灯
ser.write(b'0')
ser.close() # シリアルポートを閉じる
注意点
- シリアルポート: Arduino IDEのツールメニューで使用しているシリアルポートを確認し、Pythonスクリプトのserial.Serialで指定するポートを合わせてください。
- 通信速度: ArduinoスケッチとPythonスクリプトの両方で同じボーレート(この例では9600)を設定してください。
- 接続の安定化: PythonスクリプトでArduinoとの接続後、少し待機することで通信が安定します。
これで、PythonからArduinoにトリガーを送り、LEDを制御するシステムが完成します。
2. GUIコード
Tkinterを使ってGUIボタンを作成し、そのボタンを押すとArduino経由でLEDが10秒間点灯するPythonスクリプトを作成します。以下はその基本的なコードです。
import tkinter as tk
import serial
import time
def toggle_led():
ser.write(b'1') # LEDを点灯
window.after(10000, lambda: ser.write(b'0')) # 10秒後にLEDを消灯
# シリアルポートの設定(環境に応じて適宜変更)
ser = serial.Serial('COM3', 9600) # Windowsの場合
# ser = serial.Serial('/dev/ttyACM0', 9600) # Linuxの場合
# ser = serial.Serial('/dev/tty.usbmodem14201', 9600) # macOSの場合
time.sleep(2) # Arduinoとの接続が安定するまで待機
# Tkinterウィンドウの作成
window = tk.Tk()
window.title("LED Control")
# ボタンの作成
button = tk.Button(window, text="LEDを点灯", command=toggle_led)
button.pack(pady=20)
# ウィンドウのメインループ
window.mainloop()
# ウィンドウを閉じたらシリアルポートを閉じる
ser.close()
実行結果
以下の画像とGIFは、上記のスクリプトを実行した際の結果を示しています。Pythonを用いたGUIからArduinoボードへのトリガー送信により、LEDの点灯と消灯が正常に行われることが確認できます。