Raspberry Pi 筆記(40):LCD 觸控螢幕開關

自從買了微雪的LCD螢幕後,一直說要找時間學習如何在 Python 上撰寫 LCD 畫面觸控程式,一直到最近看Simon Monk的 Raspberry Pi Cookbook 第二版,才決定將 LCD裝上去,撰寫畫面程式來當作 LED 的開關,另外使用 Tkinter 的物件 Silder ,畫出一個拉桿的圖樣,透過數值的變化,改變 PWM 的數值,伺服馬達的角度也會隨著改變。


[材料]

• 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

1 留言

張貼留言

較新的 較舊