2016年7月26日 星期二

使用python與arduino連接控制LED之GUI圖形介面


        這篇文章示範如何使用Python跟Arduino連結.並使用Python建立出來的圖形介面來控制
Arduino上LED 的ON/OFF.

底下是第一個範例的介紹連結:
http://arbu00.blogspot.tw/2016/07/pythonarduinoled.html

    所建立出來的圖形介面如下圖所示,按下按鈕<Connect>去跟Arduino確認是否連線成功.
按下按鈕<ButtonA>則會傳送字元'a' 到arduino當指令去啟動LED跑馬燈1
按下按鈕<ButtonB>則會傳送字元'b' 到arduino當指令去啟動LED跑馬燈2
按下按鈕<ButtonC>則會傳送字元'c' 到arduino當指令去啟動LED閃燈的動作.
按下按鈕<Exit>則會傳送'ESC'鍵 字元到arduino當指令去結束視窗跟所有動作.
 




有關這個範例的實際示範及詳細的說明可以觀看底下的影片教學.






底下是本範例的Python &Arduino程式碼.

<Python source code>


# -*- coding:utf-8 -*-
from time import sleep
import serial
from msvcrt import getch
import tkinter
##==============================================================================
ser =serial.Serial("COM4", 115200, timeout=2) # Establish the connection on a specific port
##==============================================================================
##counter = 65  # "A"
##ser.write(chr(counter).encode('utf-8')) # Convert the decimal number to ASCII then send it to the Arduino
#cmd="Key in the Command".encode("utf-8") 
#SerialWrite(cmd)

##======Write Serial Command to arduino============
def SerialWrite(command):
    ser.write(command)
    rv=ser.readline()
    #print (rv) # Read the newest output from the Arduino
    print (rv.decode("utf-8")) 
    sleep(1) # Delay for one tenth of a second
    ser.flushInput()
##====================================

##===When button A be pressed then Send 'a' to arduino============
def SendCmdA():
    Arduino_cmd='a'
    cmd=Arduino_cmd.encode("utf-8") 
    SerialWrite(cmd)
    #Show to LabelA----------------
    LabelA.config(text="Send the command 'a' to Arduino")
    LabelA.update_idletasks()
    Tkwindow.update()

##===When button A be pressed then Send 'a' to arduino============
def SendCmdB():
    Arduino_cmd='b'
    cmd=Arduino_cmd.encode("utf-8") 
    SerialWrite(cmd)
    #Show to LabelA----------------
    LabelA.config(text="Send the command 'b' to Arduino")
    LabelA.update_idletasks()
    Tkwindow.update()
##====================================
##===When button A be pressed then Send 'a' to arduino============
def SendCmdC():
    Arduino_cmd='c'
    cmd=Arduino_cmd.encode("utf-8") 
    SerialWrite(cmd)
    #Show to LabelA----------------
    LabelA.config(text="Send the command 'c' to Arduino")
    LabelA.update_idletasks()
    Tkwindow.update()

##==Serial connect and Get arduino  Ready================
def Serial_Connect():
    print("Connecting to Arduino.....")
    #Show to LabelA----------------
    LabelA.config(text="Connecting to Arduino.....")
    LabelA.update_idletasks()
    Tkwindow.update()
    sleep(1)
    for i in range (1,10):
         rv=ser.readline()
         print("Loading...")
         #Show to LabelA----------------
         LabelA.config(text="Loading...")
         LabelA.update_idletasks()
        Tkwindow.update()
        #----------------
        #Debug print (rv) # Read the newest output from the Arduino
        print (rv.decode("utf-8")) 
        ser.flushInput()
        sleep(1) # Delay 
        Str_Message=rv.decode("utf-8")
        #Debug print(Str[0:5])
        if Str_Message[0:5]=="Ready":  
            print("Get Arduino Ready !")
            #Show to LabelA----------------
            LabelA.config(text="Get Arduino Ready !")
            buttonStart.config(state="disabled")
            LabelA.update_idletasks()
            Tkwindow.update()
            break

##==Serial connect Exit================
def All_Exit():
    print("Exit.....")
    #Show to LabelA----------------
    LabelA.config(text="Exit.....")
    LabelA.update_idletasks()
    Tkwindow.update()
    sleep(1)
    chr_num = 27  ##ESC
    cmd=(chr(chr_num).encode('utf-8'))
    SerialWrite(cmd)
    ser.close()
    Tkwindow.destroy() # Kill the root window! 

##------------------------------------------------------
Tkwindow=tkinter.Tk()
Tkwindow.title("Using Python to Control Arduino LED ON/OFF")
Tkwindow.minsize(600,400)
LabelA=tkinter.Label(Tkwindow,
                  bg='white',
                  fg='black',
                  text="Press 'connect' button to start",
                  width=30,
                  height=10,
                  justify=tkinter.LEFT
                  )
LabelA.pack(side=tkinter.TOP)
buttonA=tkinter.Button(Tkwindow,
                  anchor=tkinter.S,
                  text="Button A",
                  width=10,
                  height=1,
                  command=SendCmdA)
buttonA.pack(side=tkinter.LEFT)
buttonB=tkinter.Button(Tkwindow,
                  anchor=tkinter.S,
                  text="Button B",
                  width=10,
                  height=1,
                  command=SendCmdB)
buttonB.pack(side=tkinter.LEFT)
buttonC=tkinter.Button(Tkwindow,
                  anchor=tkinter.S,
                  text="Button C",
                  width=10,
                  height=1,
                  command=SendCmdC)
buttonC.pack(side=tkinter.LEFT)
buttonStart=tkinter.Button(Tkwindow,
                  anchor=tkinter.S,
                  text="Connect",
                  width=10,
                  height=1,
                  command=Serial_Connect)
buttonStart.pack(side=tkinter.RIGHT)

buttonEnd=tkinter.Button(Tkwindow,
                  anchor=tkinter.S,
                  text="Exit",
                  width=10,
                  height=1,
                  command=All_Exit)
buttonEnd.pack(side=tkinter.RIGHT)
Tkwindow.mainloop()



<Arduino source code>


//*****************************************************************************
//ArbuluckyChat  V1.0
//阿布拉機的3D列印與機器人
//http://arbu00.blogspot.tw/
//
//2016/07/20 Writen By Ashing Tsai
//
//******************************************************************************
const int LedPin12=12;
const int LedPin11=11;
const int LedPin10=10;
String Str01="";
void setup() {
Serial.begin(115200); // set the baud rate
Serial.println("Ready"); // print "Ready" once
   pinMode(LedPin12,OUTPUT);
   pinMode(LedPin11,OUTPUT);
   pinMode(LedPin10,OUTPUT);
   digitalWrite(LedPin12,LOW);
   digitalWrite(LedPin11,LOW);
   digitalWrite(LedPin10,LOW);
}
void loop() {
  if (Serial.available())
{  
   Str01="";
   delay(1);
   while(Serial.available())
    {
      Str01+=(char)Serial.read(); 
    }
    Serial.println(Str01); // send the data back in a new line so that it is not all one long line
}


if (Str01[0]=='a')
{
   digitalWrite(LedPin12,HIGH);
   digitalWrite(LedPin11,LOW);
   digitalWrite(LedPin10,LOW);
   delay(500);
   digitalWrite(LedPin12,LOW);
   digitalWrite(LedPin11,HIGH);
   digitalWrite(LedPin10,LOW);
   delay(500);
   digitalWrite(LedPin12,LOW);
   digitalWrite(LedPin11,LOW);
   digitalWrite(LedPin10,HIGH);
   delay(500);
}

if (Str01[0]=='b')
{
   digitalWrite(LedPin12,HIGH);
   digitalWrite(LedPin11,LOW);
   digitalWrite(LedPin10,LOW);
   delay(100);
   digitalWrite(LedPin12,LOW);
   digitalWrite(LedPin11,HIGH);
   digitalWrite(LedPin10,LOW);
   delay(100);
   digitalWrite(LedPin12,LOW);
   digitalWrite(LedPin11,LOW);
   digitalWrite(LedPin10,HIGH);
   delay(100);
}
if (Str01[0]=='c')
{
   digitalWrite(LedPin12,HIGH);
   digitalWrite(LedPin11,HIGH);
   digitalWrite(LedPin10,HIGH);
   delay(300);
   digitalWrite(LedPin12,LOW);
   digitalWrite(LedPin11,LOW);
   digitalWrite(LedPin10,LOW);
   delay(300);
}


}
  

  


加入阿布拉機的3D列印與機器人的FB粉絲團
https://www.facebook.com/arbu00/

Scan QRcode to join FB Fans.