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)では正常に動作しましたが、他の環境で動作するかは分かりません。