自從買了微雪的LCD螢幕後,一直說要找時間學習如何在 Python 上撰寫 LCD 畫面觸控程式,一直到最近看Simon Monk的 Raspberry Pi Cookbook 第二版,才決定將 LCD裝上去,撰寫畫面程式來當作 LED 的開關,另外使用 Tkinter 的物件 Silder ,畫出一個拉桿的圖樣,透過數值的變化,改變 PWM 的數值,伺服馬達的角度也會隨著改變。
• LCD x 1
• LED x 1
• 4.7K 電阻 x 1
• 伺服馬達 MG996R x 1
• 連接線 x 4
• 麵包板 x 1
• LED燈負極接地,Pi 的 Pin 39 也接地
• 伺服馬達紅色線接電池正極,棕色線接地,橘色線接 Pi的 Pin 37
* 註:LCD是3.5吋的,上圖以2.4吋表示
註:伺服馬達的位置是依據脈衝的長度而定的,伺服馬達期望每20毫秒收到一個脈衝,假使脈衝高於1毫秒,伺服機的角度就會為零,假使高於1.5毫秒,會停在中間位置,如果是高於2毫秒,就會在180度位置。本範例的PWM頻率為 100 Hz,亦即會每10毫秒送給伺服機一個脈衝,變數angle 轉換成介於 0 跟 100之間的值。
• Raspberry Pi GUI Tutorial:Create your own GUI (Graphical User Interface) with TkInter and Python
[材料]
• Raspberry Pi 2 x 1• LCD x 1
• LED x 1
• 4.7K 電阻 x 1
• 伺服馬達 MG996R x 1
• 連接線 x 4
• 麵包板 x 1
[接線圖]
• LED燈正極接電阻,電阻再接 Pi 的 Pin 40• LED燈負極接地,Pi 的 Pin 39 也接地
• 伺服馬達紅色線接電池正極,棕色線接地,橘色線接 Pi的 Pin 37
* 註:LCD是3.5吋的,上圖以2.4吋表示
[程式]
# -*- coding: utf-8 -*- # 使用utf-8 編碼,這樣程式執行時才不會產生錯誤 from Tkinter import * import tkFont import RPi.GPIO as GPIO GPIO.setmode(GPIO.BOARD) GPIO.setup(40, GPIO.OUT) GPIO.output(40, GPIO.LOW) GPIO.setup(37, GPIO.OUT) pwm = GPIO.PWM(37, 100) pwm.start(5) win = Tk() # 使用仿宋體字型 myFont = tkFont.Font(family = 'fangsongti', size = 24) # 定義函數,當作開關,讓 LED明滅 def ledBtn(): if GPIO.input(40) : GPIO.output(40,GPIO.LOW) ledButton["text"] = "LED 開" else: GPIO.output(40,GPIO.HIGH) ledButton["text"] = "LED 關" # 結束程式 def exitBtn(): GPIO.cleanup() win.quit() # 依據Slider變更的值,傳給PWM當作 Frequency 的值 def rotate(angle): duty = float(angle) / 10.0 + 2.5 pwm.ChangeDutyCycle(duty) # 建立視窗 win.title("第一個 GUI 程式") win.geometry('480x320') # 建立離開按鍵 exitButton = Button(win, text = "離開", font = myFont, command = exitBtn, height =1 , width = 6) exitButton.pack(side = BOTTOM) # 建立LED按鍵 ledButton = Button(win, text = "LED 開", font = myFont, command = ledBtn, height = 1, width = 6 ) ledButton.pack() # 建立Slider Bar scale = Scale(win, from_=0, to=180, orient=HORIZONTAL, command=rotate, length = 240) scale.pack() mainloop()
註:伺服馬達的位置是依據脈衝的長度而定的,伺服馬達期望每20毫秒收到一個脈衝,假使脈衝高於1毫秒,伺服機的角度就會為零,假使高於1.5毫秒,會停在中間位置,如果是高於2毫秒,就會在180度位置。本範例的PWM頻率為 100 Hz,亦即會每10毫秒送給伺服機一個脈衝,變數angle 轉換成介於 0 跟 100之間的值。
[結果]
[參考資料]
• Simon Monk:Raspberry Pi Cookbook 第二版• Raspberry Pi GUI Tutorial:Create your own GUI (Graphical User Interface) with TkInter and Python
這就是我一直想學的,感謝
回覆刪除張貼留言