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)
下載原始碼
&n