自從買了微雪的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

這就是我一直想學的,感謝
回覆刪除張貼留言