MicroPython TPYBoard v102 無線紅外遙控舵機(基於紅外解/編碼模塊)


轉載請注明文章來源,更多教程可自助參考docs.tpyboard.com,QQ技術交流群:157816561,公眾號:MicroPython玩家匯

紅外解碼/編碼模塊介紹

模塊上搭載了紅外接收頭、紅外發射器以及編碼芯片。主要功能:

1、具備紅外發射功能。

2、具備紅外編碼功能。

3、帶紅外發射頭擴展接口。

4、具備串口通信功能,通信電平為TTL。

5、可控制紅外格式設備,包括電視機、電風扇等電子電器設備。

6、支持編碼芯片

7、可作為紅外無線數據通信、數據傳輸、紅外控制等功能

該模塊使用方法非常簡單,只需要掌握基本的單片機TTL串口通信知識即可。將模塊與開發板進行串口連接,通過串口發送指定的指令進行控制模塊發射;通過串口接收方式進行紅外解碼操作,獲取遙控編碼信息。

解碼

解碼時不需要發送任何指令,只需要拿起遙控對准模塊的接收頭按下某一個鍵,這時模塊的串口就會輸出該鍵的紅外編碼值給開發板,開發板只要從串口里讀取到數據,進行分析就會得出按下的是哪一個鍵。

編碼(發射)

編碼時需要根據一定格式發送指令,通過串口發送5個字節的指令,就可以將對應編碼的紅外信號發送出去。利用這紅外的收發功能,我們可以做紅外數據傳輸和控制,使用2個就可以完成收發操作了。

紅外解碼/編碼模塊相關資料 下載 


本次教程僅來學習解碼功能。開發板寫個串口讀取的程序,先來看下遙控器按下之后,我們到底能接收到什么樣的數據。這里,我們選取開發板UART3(TX-Y9,RX-Y10)。

接線圖

TPYBoard v102 紅外解/編碼模塊
VIN 5V
Y10 TXD
Y9 RXD
GND GND

 

 

 

 

 

 

 

from pyb import UART

uart = UART(3,9600,timeout=50)

while True:
    if uart.any() > 0:
        print(uart.read())

 

程序保存后運行,打開PuTTY工具,按下遙控器左上角的第一個鍵CH-。

PuTTY打印:

b'\x00\xffE'

micropython進行串口讀取時,返回的是bytes類型,是一種不可變序列,跟字符串類似。返回了3個字節的內容,多按幾個鍵你就會發現,前面2個字節是用戶碼固定不變,也就是說我們只要判斷第3個字節就可以找到對應的鍵。bytes中可以直接通過索引來獲取元素,也支持負數的索引。比如-1,就是從右向左數的第一個,依次類推。這里需要注意一點,獲取某個元素時,他返回的是對應的十進制的數值。

例如:

>>> b = b'\x00\xffE'
>>> b[1]
255
>>> b[-1]
69

 

咦?最后一個元素E為什么是69呢?這是因為在bytes保存的就是原始的字節(二進制格式)數據,它會將一些16進制的值轉換為對應的ascii字符。ascii中大寫的E對應的十進制就是69。如果你用電腦接紅外解編碼模塊的話,串口調試助手里打印的就應該是 00 FF 45。

根據上面的經驗,總結了鍵值對應關系表,大家可以直接拿到程序中用。

 接下來,結合舵機做個實例。用遙控器上的|<<快進鍵和快退鍵>>|,控制舵機進行正反方向的轉動。micropython中Servo類使用參考 點擊查看 

TPYBoard v102 舵機
VIN 電源正極(紅色線)
X1

信號線(橙色線)

GND 電源負極(棕色線)

 

 

 

 

 

 

首先,將舵機通過程序設置到0角度的狀態,安上個小翅子方便查看轉動效果。

from pyb import Servo

#舵機信號線接X1,可以創建4個Servo,分別是1~4,對應的引腳是X1~X4
s1 = Servo(1)
#調整舵機轉動到0角度的位置
s1.angle(0)

程序增加上對按鍵的判斷,每按一次轉動15度,整體代碼如下。

from pyb import UART,Servo

#舵機信號線接X1,可以創建4個Servo,分別是1~4,對應的引腳是X1~X4
s1 = Servo(1)
#調整舵機轉動到0角度的位置
s1.angle(0)

uart = UART(3,9600,timeout=10)

def setServoTurn(flag):
    turn_angle = s1.angle()
    if flag:
        #逆時針 值遞增 最大值90度
        turn_angle += 15 #每按一次轉15度
        if turn_angle <= 90:
            s1.angle(turn_angle)
    else:
        #順時針 值遞減 最小值-90度
        turn_angle -= 15
        if turn_angle >= -90:
            s1.angle(turn_angle)
while True:
    if uart.any() > 0:
        val = uart.read()[-1]
        if val == 68:
            setServoTurn(True)
        elif val == 64:
            setServoTurn(False)

下載源碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM