Python3でGUIを作ってArduinoと連携

More than 3 years have passed since last update.


GCODEを送る簡易的なGUI

自作工作機械を作る課程で、GUIを使ってArduinoを操作しようと試みました。GCODEを送る簡易的なGUIの製作を目指してますが、ひとまず通信するところのメモ。

「ON」、「OFF」と書かれたボタンを押すとArduinoの附属LED(13番ピン)のON, OFFができる。


概要


  • PythonのGUIは標準のTkInterを使用

  • モジュールとしてpySerialを入れる

  • Pythonのバージョンは3.5.0

  • ArduinoUnoを使用


ハマった箇所

シリアル通信でPythonのGUIからArduinoへ文字を送るとき、そのまま送るとTypeError: an integer is requiredというエラーが発生。調べていると文字のエンコードが問題と判明。文字はsomechar.encode('utf-8')のようにUTF-8を指定して送るとエラーが出なくなり、正常に動くようになりました。


Python

from tkinter import *

import serial

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')

class Ser:
def on():
flag = 's'
arduino.write(flag.encode('utf-8'))
def off():
flag = 'd'
arduino.write(flag.encode('utf-8'))
def init():
flag = 'a'

root = Tk()
# 通信を開始
arduino = serial.Serial("/dev/tty.usbmodem1411", 9600)
# 画面の大きさを指定
root.geometry('400x300')
app = App(root)
root.mainloop()
# 通信を終了
arduino.close()


Arduino

void setup()

{
pinMode(13,OUTPUT);
Serial.begin(9600);
}

void loop()
{
int input;

if(Serial.available()>0){
input = Serial.read();
switch(input){
case 's':
digitalWrite(13,HIGH);
break;
case 'd':
digitalWrite(13,LOW);
break;
}
} else {
}
}

自分の環境(Mac OS:Yosemite)では正常に動作しましたが、他の環境で動作するかは分かりません。