【Arduino】GUIのボタンからArduinoのLチカ制御【PySerial】【Tkinter】

はじめに

こんにちは、がんがんです。
Arduino×PySerialをよく調べていますが、これをGUIから操作できないかなと思いました。
そこで調べてみると、一応同じような人の記事を見つけることができました!

今回はそちらを試してみたときの備忘録です。

参考記事

今回の参考
qiita.com

Tkinterに関する参考メモ
qiita.com

qiita.com

やりたいこと

最終的にやりたいこと

Pythonで処理した結果をGUIArduinoにどちらも反映させる。
(例)LEDマトリクスとGUIに同じ表示をさせる

今回やること

PySerialを用いてArduinoと通信し、書き込まれた値によってLチカ

コード

Python

#------------------------------------------------------------
#
#	Python×Arduino×Tkinter
#	  LチカさせながらGUIも制御
#		python_tkinter.py
#
#------------------------------------------------------------
import serial
from tkinter import *

"""
  GUIクラス
"""
class App:
	def __init__(self, master):
		frame = Frame(master)
		frame.pack()

		#  アプリを終了
		self.quit = Button(frame,
			              text="QUIT", fg="red",
			              command=frame.quit)
		self.quit.pack(side=RIGHT)

		self.init = Button(frame,
			              text="INIT",
			              command=self.init)
		self.init.pack(side=LEFT)

		#  LED ON
		self.on = Button(frame,
			            text="ON",
			            command=Ser.on)
		self.on.pack(side=LEFT)

		#  LED OFF
		self.off = Button(frame,
			            text="OFF",
			            command=Ser.off)
		self.off.pack(side=LEFT)

	def init(self):
		print("initialize printer")

"""
  PySerialクラス
"""
class Ser:
	def on():
		ArduinoSerial.write(b"1")
	
	def off():
		ArduinoSerial.write(b"0")
	
	def init():
		ArduinoSerial.write(b"2")


"""
  メイン
"""
root = Tk()
root.title("Arduino Push Buttons")

#  通信開始
ArduinoSerial = serial.Serial("COM4", 9600)

#  画面の大きさを指定
root.geometry("400x300")
app = App(root)
root.mainloop()

#  通信終了
ArduinoSerial.close()

Arduino

/*
 * python_tkinter.ino
 */
#define LED 13

void setup() {
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
  digitalWrite(LED, LOW);
}

void loop() {
  byte data;

  if(Serial.available() > 0){
    data = Serial.read();
    switch(data){
      case '1':
        digitalWrite(LED, HIGH);
//        Serial.println(digitalRead(LED));
        data = '2';
        break;
      case '0':
        digitalWrite(LED, LOW);
//        Serial.println(digitalRead(LED));
        data = '2';
        break;
    }
  }
}

実行結果

GUIの画面はこんな感じです。
f:id:gangannikki:20190125041226j:plain

まとめ

今回はPythonGUIArduinoを同時に制御してみました。
最終的には出力結果をGUIArduinoにて共有できるように改良していきます。