(更新完成2016-07-24)Arduino Infrared Remote Control (AIRC)
本帖最後由 C_Law 於 2016-7-24 18:49 編輯
更新:
2016-07-24
15#
ExcelAIRC 內新增 Sheet:Wav2Pulses。
2016-03-06
6#
新增 ExcelAIRC,用 Excel 控制 AIRC。
Arduino Infrared Remote Control (AIRC)
今個新年假的搞作,用 Arduino 接收和發射紅外線遙控器訊號。玩開 Arduino 的朋友就算不打算玩紅外線遙控玩意,都值得玩下 AIRC,用來讀取平時屋企用開的遙控器,記低資料當買個保險,萬一日後壞遙控器(啋 …新年流流講呢尐,真係大吉利是,要 Lur 口水講過! ),都可以用 AIRC 發射訊號讓有學習功能的萬用遙控器去學。
「按這裡」下載 AIRC.rar。
AIRC.rar 內有以下四個檔案:
1. ReadMe.txt 使用說明
2. AIRC.ino AIRC 程式
3. Changes to Library.txt 修改 Library 說明
4. ir_Sharp.cpp.new 包含 Sharp 解碼程序的 cpp 檔
安裝及修改 Library:
AIRC 是建基於以下 Library 的 Arduino 紅外線遙控收發器:
A Multi-Protocol Infrared Remote Library for the Arduino
Written by Ken Shirriff
Version 2.0.1 June, 2015
http://www.righto.com/2009/08/mu ... remote-library.html
下載 Library:
https://github.com/z3t0/Arduino-IRremote
根據 GitHub 的 Library 安裝說明,這 Library 同 Arduino IDE 本身的 RobotIRremote Library 有衝突,所以先要將 RobotIRremote 的 Folder 從 Arduino IDE 的 Library folder 移走。再將這 Library 解壓入去 Library folder。
AIRC 需要對 Library 內的五個檔案作少許修改,有關修改詳情已在 Changes to Library.txt 列出。
1. IRremote.h
如不需要解碼 Sharp 的遙控器訊號,可以不改。
2. IRremoteInt.h
建議增加 RAWBUF 數目到 255。
3. irRecv.cpp
建議將紅外線接收器 Data 腳的 pinMode 改為 INPUT_PULLUP。
如需要解碼 Sharp 遙控訊號,加入有關的程式碼在 #if DECODE_SONY 之上。
4. ir_Sony.cpp
如需要解碼 15/20 bit 的 Sony 遙控訊號,建議將 SONY_DOUBLE_SPACE_USECS 數值由 500 改為 200。否則 Press and Hold 遙控鍵時只可以解碼到第一下訊號。
5. ir_Sharp.cpp
Sharp 的訊號分兩段:Normal(N)、Inverted(i),即使短按遙控器按鈕一下,也會先後發出 N 和 i 訊號,而 Sharp 的電器需要先後收到兩段訊號才會有反應。當 Press and hold Sharp 遙控器按鈕時,兩段訊號會梅花間竹的輪流發送(即是:NiNiNiNi.....)。原本的 Library 會發送 3 段訊號(NiN),其實足以正常遙控到 Sharp 電器,不過,如果想模擬 Press and hold 的話,重複去執行 Sharp 的發射程序的時候會發送出(NiNNiNNiN....),跟真正遙控器不一樣。因此,如果需要發射 Sharp 訊號,建議將發射次數改為雙數的 2(或者 4),令 AIRC 可以好似真正按遙控器一樣發射出 (NiNiNiNi....)。
另外,這個 Library 本身只提供 Sharp 的發射程序,並無 Sharp 的解碼器,我自己加上了解碼程序。
ir_Sharp.cpp.new 是修改後的新檔,改將發射次數改為 2,並加入解碼程序。如需發射接收 Sharp 遙控訊號號,可用這新檔複蓋原本 Library 的 ir_Sharp.cpp。
硬件:
Arduino UNO
紅外線接收器
IR LED 和限流電阻。
為了方便,我將 UNO 的 Digital pin 4, 5, 6 分別用作 IR LED 的 Gnd、接收器的 Vcc 和 Gnd。我用 110Ω 的限流電阻只因為剛好手頭上有,發射距離只有 2~3m,不過亦夠光足以讓有學習功能的萬用遙控器去學習。根據 ATMEGA 328P 的 Datasheet,每條 Pin 的最大電流是 40mA,應該還可以用再略低阻值的限流電阻以增加發射距離,又或者 IR LED 從 Vcc 取電,由 Pin 3 經 Transistor 去推粒 IR LED。
使用說明:
將 AIRC.ino 上載到 Arduino 後,打開 Arduino IDE 的 Serial Monitor 便可使用,記得要將 Buad rate 設定做 115200,以及 Newline。
接收及發射:
AIRC 預設會自動解碼接收到的遙控訊號,AIRC 能解碼 Ken Shirriff 的 Library 提供的所有遙控器 Protcol,不過我無所有相關的電器作測試,所以這裡只集中講我有測試過的 4 個 Protocol:NEC、Sharp、Panasonic、Sony。
NEC
NEC 是我最常用的 Protocol,MagicTV/8仔高清電視機頂盒、有線電視解碼器,以及好多大陸山寨 DVD 機/Media player 的遙控器都是用 NEC Protocol。以下網頁有 NEC Protocol 的詳細說明:
http://www.sbprojects.com/knowledge/ir/nec.php
註:SB-Project 網頁內的說明是以 LSB 行先,不過 Ken Shirriff 的 Library 是以 MSB 行先,其它 Protocol 都一樣。
AIRC 收到 NEC 訊號後會顯示出它的編碼,例如有線電視遙控器的 ↑ 按鈕:
Rx:
NEC h2FF58A7 32
Rx:
NEC hFFFFFFFF 0
以上的 NEC h2FF58A7 32 代表接收到的訊號屬於 NEC protocol,數值是 16 進制的 h2FF58A7,訊號長度是 32 bit。
NEC 的主訊號(即是以上的 h2FF58A7,其實應該是 h02FF58A7,只不過開頭個 0 被省去)只會發射一次,當 Press and hold 遙控按鈕時,發射一次主訊號後,之後會重複發射一組 Repeat stream,AIRC 會用 hFFFFFFFF 顯示 Repeat stream。
NEC 的發射指令是:
NEC Data Nbits Repeat
Data 是訊號數值
Nbits 是訊號長度 bit 數,預設值是 32,可省去
Repeat 重複發射次數,預設是 0,可省去
所有發射指令的數值參數以空格或 Tab 分隔,每個數值參數都可以用 2、10 或 16 進制,預設是 10 進制;如果用 2 進制就要在數值前加上 b,例如 b1001;如果要用 16 進制就要在數值前加上 h,例如 h2FF58A7。為了清楚輸入數值,可以加入 - 或 , 做分隔,例如 b0010-1111-1111-0101-1000-1010-0111、h02FF-58A7、50,288,807。
例如要發射一次上面提到的有線電視↑按鈕訊號,只需複製 Rx: 之後的一整行字串 NEC h2FF58A7 32,又或者省去 Nbits 只複製 NEC h2FF58A7,貼入 Arduino IDE 的 Serial Monitor 再按 Send。
如果需要重複發射,可在字串最尾再加上重複次數(不能省去 Nbits),例如:
NEC h2FF58A7 32 5
按 Send 後就會發射 1 次主訊號 h2FF58A7 另加 5 次重複訊號。
NEC 以及其它發射指令的最大重複次數是 999,如果打入 1000 或以上,AIRC 將會不斷重複發射。重複發射中途只要按一下 Send 就可以停止發射。也可以直接打入下一個指令(Pulses 除外)再按 Send 去發射新訊號。
Sharp
以下是 Sharp protocol 的詳細說明:
http://www.sbprojects.com/knowledge/ir/sharp.php
之前提過,Sharp 的遙控訊號分 Normal 和 Inverted 兩段。AIRC 會用以下方式顯示:
Rx:
Sharp h18 h99, Normal, SharpRaw h6266 15
Rx:
Sharp h18 h99, Inverted, SharpRaw h6199 15
前面 Sharp 的 h18 和 h99 分別是 Sharp 的 Address 和 Command code;之後是 Normal 或 Inverted,Sharp 的遙控器發射時是先後 Normal + Inverted,所以即使是短按遙控按扭,都會分別收到一行 Normal 和一行 Inverted;再後面 SharpRaw 的 h6266/h6199 就是將前面的 Address、Command 以及 Expansion 和 Check bit 串連成一組 15 bit 數值。
Sharp 的發射指令是 Sharp 或 SharpRaw:
Sharp Address Command Repeat
Address Address code,通常同一件電器每個按鈕的 Address 都一樣
Command 個別按鈕的 Command code
Repeat 重複發射次數,預設是 0,可省去
SharpRaw Data Nbits Repeat
Data 將 Address、Command 以及 Expansion 和 Check bit 串連成一組的數值
Nbits 訊號長度 bit 數,預設值是 15,可省去
Repeat 重複發射次數,預設是 0,可省去
例如要發射一次上面提到的訊號,可以用:
Sharp h18 h99
或者
SharpRaw h6199 15
或者省去 Nbits 的
SharpRaw h6199
如果想故意先發射 Inverted 訊號,可用 Inverted 的 Data:SharpRaw h6199 15 或者 SharpRaw h6199。
如要重複發射,例如想重複發射多 5 次,可在後面加上重複次數,例如:
Sharp h18 h99 5
SharpRaw h6199 15 5 (不能省去 Nbits)
以上指令會發射 1 次之後再重複發射多 5 次,即是總共 6 次。Sharp 的訊號必定是一段 Normal 加一段 Inverted,所以用以上指令是一共發射 12 段訊號。
Panasonic
SB Project 並無 Panasonic protocol 相關的說明。它的訊號在 Header 之後有 48 bit 長, Ken Shirriff 的 Library 將這 48 bit 分割成 16 bit address + 32 bit data(command),例如 Panasonic VHS 錄影機的 Stop 按鈕訊號用以下方式顯示:
Rx:
Panasonic h4004 h9000009
前面的 h4004 是 16 bit address,後面的 h9000009 是 32 bit data(其實應該是 h09000009,只不過開頭個 0 被省去)。
不過,我有個 Panasonic VHS 錄影機的遙控器,它有個掣可以切換控制 Panasonic 的錄影機/電視機,我發覺當設定做錄影機遙控時,48 bit 的頭 32 bit 都完全相同(h40040900),而設定做電視機遙控時,所有按鈕的頭 32 bit 都是相同(h40040100),所以我覺得將 48 bit 分割成頭 32 bit address + 尾 16 bit command 會比較合理。但既然個 Library 用開 16+32,我暫時都照跟個 Library。
Panasonic 的發射指令是:
Panasonic Address Data Repeat
Address Address code
Data Data code
Repeat 重複發射次數,預設是 0,可省去
例如上面提到的:
Panasonic h4004 h9000009 (省去 Repeat,只發射一次)
Panasonic h4004 h9000009 5 (包括 5 次重複,即是總共 6 次)
Sony
以下是 Sony protocol 的詳細說明:
http://www.sbprojects.com/knowledge/ir/sirc.php
AIRC 會用以下方式顯示接收到 Sony 訊號:
Rx:
Sony h13A4 20
前面的 h13A4 是數值(其實應該是 h013A4,只是前面的 0 被省去),後面的 20 是 bit 數。我以前是用舊版 Library 和朋友家的 Sony 電視機做測試,試過 12 bit 和 20 bit 都正常(朋友個遙控器無 15 bit 的訊號)。趁新年放假得閒,想話執執個 AIRC.ino 放上來,才發現個 Library 早已推出新版,於是因應新 Library 再改改我的 AIRC.ino,雖然無大改動,但朋友家已經換電視,我無得再試。
Sony 的發射指令是:
Sony Data Nbits Repeat
Data 是訊號數值
Nbits 是訊號長度 bit 數,根據 SB Project 的說明,可以是 12、15 或 20
Repeat 重複發射次數,預設是 0,可省去
例如上面提到的:
Sony h13A4 20 (省去 Repeat,只發射一次)
Sony h13A4 20 5 (包括 5 次重複,即是總共 6 次)
無法解碼的訊號
AIRC 預設會列出無法解碼訊號的 Pulse length,例如:
Rx:
Unknown encoding: C4FDF993 (32 bits)
36 Pulses: s82000 m550 s100 m350 s100 m350 ...(部份省去)... m350 s300 m300
Pulses length 的單位是 μs,解像度為 50μs。s 字頭代表 Space,m 代表 Mark。第一個 Space 數值代表這個訊號串和之前一個訊號串之間的間格時間。不過由於解碼以及 Serial.print 一大堆文字都需要一段時間,Serial.print 完之後可能已經過了之後的訊號串,所以第一個 Space 的數值未必真正是兩個訊號串之間的間隔。
AIRC 可以用 PLxxx 指令控制是否顯示 Pulse length:
PLHide 完全隱藏 Pulse length,即使未能解碼的訊號也不會顯示
PLGap 只顯示兩個訊號串之間的間隔時間
PLUnknown 只顯示未能解碼訊號的 Pulses length(預設)
PLShow 不論能否解碼都顯示 Pulses length
在 Serial Monitor 輸入 PLGap(無需理會大小階)後按 Send,再按遙控按鈕,就會顯示出兩個訊號串之間的間隔時間,以 NEC protocol 為例:
Rx:
NEC h2FF58A7 32
Gap: s2923000
Rx:
NEC hFFFFFFFF 0
Gap: s38400 ←主訊號後的間隔
Rx:
NEC hFFFFFFFF 0
Gap: s96450 ←之後每個重複訊號的間隔
Rx:
NEC hFFFFFFFF 0
Gap: s96450 ←之後每個重複訊號的間隔
PLGap 對於 NEC protocol 尤為重要,因為主訊號只發射一次,而主訊號後面的間隔和再之後每個重複訊號串的間隔並不一樣,如果 Serial.print 出整個訊號的 Pulse length,已經超過第一個間隔,再 Serial.print 可能係再之後的重複訊號串,無法顯示出第一個間隔,例如:
Rx:
NEC h2FF58A7 32
68 Pulses: s2027950 m9050 s4300 m750 ...(省去部份)... s1550 m700
Rx:
NEC hFFFFFFFF 0
4 Pulses: s96500 m9100 s2100 m750 ←上面 Serial.print 完之後已錯過第一個重複訊號串
這裡顯示的 Gap 其實是再之後的重複訊號串間隔
Rx:
NEC hFFFFFFFF 0
4 Pulses: s96450 m9100 s2100 m700
ReadPulses
雖然用 PLUnknown 可顯示無法解碼的訊號 Pulse length,用 PLShow 更可以強制顯示,不過,每收一段訊號,AIRC 會先嘗試解碼,又要 Serial.print 出 Pulse length,當中都花幾多時間,過程中可能已錯過下一組甚至多組訊號。所以我另外寫多個 ReadPulses 指令,它會一直讀取 Pulse length 直至用完 Buffer(之前修改 Library 提到將 RAWBUF 改到 255 就是為了這用途),又或者一秒內再無接收到新 Pulse,然後才 Serial.print 出 Pulse length 及嘗試解碼。用法是:
ReadPulses Gap
Gap 間隔時間 μs,當讀到一個 Sapce 的長度超過 Gap 就會分割開,之後的 Pulses 會當作是下一個訊號。如果省去的話,預設是 5000μs。
輸入指令後按 Send,在 5 秒內按遙控器按鈕,以有線電視 ↑ 按鈕為例,會得到以下 Pulses length 資料:
ReadPulses 5000. Press a key within 5s....
123 puluses were read. An extra space of 1s is added to the end.
RxPulses:
Pulses kHz 68 Repeat m9196 s4344 m728 ...(部份省去)... m736 s1536 m708 s38752
RxCode:
NEC h2FF58A7 32
RxPulses:
Pulses kHz 4 Repeat m9200 s2092 m708 s96260
RxCode:
NEC hFFFFFFFF 0
RxPulses:
Pulses kHz 4 Repeat m9196 s2092 m716 s96260
RxCode:
NEC hFFFFFFFF 0
(部份省去)
RxPulses:
Pulses kHz 4 Repeat m9164 s2120 m708 s1000000
RxCode:
NEC hFFFFFFFF 0
每行 RxPulses: 之後是一段訊號的數據,以第一段 RxPulses 為例(先不理 kHz 和 Repeat,稍後在 Pulses 會講)。在 kHz 和 Repeat 之間的 68 代表這一組訊號總共有 68 個 Mark + Space,這數目是由第一個 Mark m9196 起計,到最尾的 Space s38752,所以一定是雙數,以 NEC protocol 來講,開頭的 Header 有一個 Mark 加 一個 Space,之後 32 bit 數值又每 bit 有一個 Mark 加 一個 Space,加上最後的 End mark 和 Gap space,所以總共是 1 + 1 + 32*2 +1 + 1 = 68。
每行 RxCode: 是根據 Pulses length 解碼出來的 Protocol 和數值。如果無法解碼會顯示 Unknown encoding。
留意最後一組 RxPulses 的最尾一個 Space 是 1 秒,因為我未等到 AIRC 讀滿 Buffer 已放開遙控器按鈕,所以它最後讀到的是最後一段 NEC repeat stream 的 End mark,由於 AIRC 做 ReadPulses 時一定讀雙數的 Pulses length,所以會自動在最後加多 1 秒的 Space,並不代表真正收到 1 秒的 Space。另外,如果我長按到裝會 Buffer,以 RAWBUF = 255 以及 NEC 訊號為例,主訊號總共有 68 個 M + S,之後每個重複訊號有 4 個,Buffer 裝到滿的時候,最後一個重複訊號只夠位裝一個 Mark 以及額外加上 1 秒的 Space,因此使用 ReadPulses 時不要信最尾一組訊號的數值。
我將 RAWBUF 改為 255,其實都不算多,以 48 bit 的 Panasonic 訊號為例,連同 Header、End Mark 及 Gap Space,一段訊號都已經用了 100,255 都只夠裝到約兩段半訊號。如果想讀取係冷氣機的遙控器訊號可能都只是勉強夠,以我房部陳年"凶宅"(日立 OEM 年代)的遙控器,按一個掣就要用 212(連最後加上的 1 秒 Space)。
Pulses
既然 AIRC 可以讀取訊號的 Pulse length,當然也可以用 Pulse length 資料去發射訊號,甚至乎可以發射天馬行空的自製訊號(有無電器讀得明又是另一回事 ),發射指令的格式是:
Pulses kHz InitialEnd Repeat m1 s2 m3 s4......sX
是否覺得以上格式有點似層相識?皆因之前 ReadPulses 時也是以這格式顯示讀取的 Pulse length,方便 ReadPulses 後直接複製出來用。以下是 Pulses 後面各參數的說明:
kHz
發射的 Carrier frequency。不同的 Protocol 會用不同的 Carrier frequency,一般家電遙控器都用 3x~4x kHz,而根據 Library 的說明,可用的 kHz 範圍是 36~40 kHz。雖然 AIRC 無法讀取 Carrier frequency 的數值,但我發覺不太重要,以 Sony protocol 為例,根據 SB Project 網頁的說明是用 40kHz,但我之前用朋友家的 Sony 電視機做測試,由 36~40 都試過,全部都正常遙控得到部電視機,而且也不會因為我不是用 40 而影響到接收距離(就算有都不明顯);我屋企用 NEC protocol 的電器,應該是 38kHz,但同樣由 36~40 都試過,也不覺得有分別。
如果輸入的 kHz 數值是 0,AIRC 只會嘗試解碼,而不會發射。
InitialEnd
主訊號的 Mark + Space 總數量。如果輸入 0,會自動改為後面 m1 s2 m3...sX 的總數量。
Repeat
額外重複發送次數。
m1 s2 m3 s4....sX
訊號中每個 Pulse 的時間長度,單位是 μs,最大是 1000000(即是 1 秒)。由 Mark 開始,最尾是 Gap space。如果輸入的最尾數值不是 Space,會自動加多 1 秒 Space。Mark + Space 的總數量是 RAWBUF - 1(如果 RAWBUF 是雙數就是 RAWBUF - 2)。
對於長按遙控按鈕時會將主訊號重複發送的 Protocol(例如 Sony、Panasonic),用 ReadPulses 讀得 Pulses 後,只要將 Pulses 行複製,再修改 kHz 和 Repeat 後就可以按 Send 發射出去。例如以下是 ReadPulses 讀取的 20 bit Sony 訊號:
RxPulses:
Pulses kHz 42 Repeat m2532 s476 m1332 ...(部份省去)... m736 s496 m732 s13756
RxCode:
Sony h813A4 20
如果要額外發射多 5 下 Repeat,應該改為:
Pulses 40 42 5 m2532 s476 m1332 ...(部份省去)... m736 s496 m732 s13756
對於主訊號只發射一次的 Protocol(例如 NEC),ReadPulses 會讀得:
RxPulses:
Pulses kHz 68 Repeat m9196 s4340 ...(部份省去)... m732 s38724
RxCode: (↑主訊號↑)
NEC h2FF58A7 32
RxPulses:
Pulses kHz 4 Repeat m9176 s2120 m732 s96236
RxCode: (↑重複訊號↑)
NEC hFFFFFFFF 0
RxPulses:
Pulses kHz 4 Repeat m9204 s2092 m728 s96240
RxCode: (↑重複訊號↑)
NEC hFFFFFFFF 0
在主訊號之後的每個重複訊號都是相同的 4 個 Mark + Space,可以先複製主訊號的 Pulses 行(紅色),修改 kHz(38) 和 Repeat(例如想在主訊號後再發射多 5 次重複訊號),InitialEnd(68)保持不變,然後再將一個重複訊號的 4 個 Mark +Space(綠色)加到最尾,整個 Pulses 指令即是:
Pulses 38 68 5 m9196 s4340 ...(部份省去)... m732 s38724 m9204 s2092 m728 s96240
以上指令一共有 72 個 Mark+Space,開頭的 1~68(主訊號)只會發射一次,之後會根據 Repeat 數值(5)重複發射 69~72(重複訊號)。
至於一個訊號會分開兩組輪流發射的 Protocol(例如 Sharp),用 ReadPulse 會讀到:
RxPulses:
Pulses kHz 32 Repeat m452 s1560 ...(部份省去)... m432 s45576
RxCode:
Sharp h10 h80, Normal, SharpRaw h4202 15
RxPulses:
Pulses kHz 32 Repeat m456 s1556 ...(部份省去)... m424 s39544
RxCode:
Sharp h10 h80, Inverted, SharpRaw h41FD 15
先複製屬於 Normal 的 Pulses 整行(紅色),再將屬於 Inverted 的 Mark + Space(綠色)加到最尾。由於 Normal 和 Inverted 都分別有 32 個 Mark+Space,而重複時是兩組輪流發射,所以 InitialEnd 要改為 32+32 = 64,再修改 kHz(38) 和 Repeat(5,例如要額外發送多 5 次),整行 Pulses 指令就是:
Pulses 38 64 5 m452 s1560 ...(部份省去)... m432 s45576 m456 s1556 ...(部份省去)... m424 s39544
之前有提過,當 AIRC 正在重複發射訊號時,打入新的指令行就可以終止現有的重複發射並且執行新指令行,新指令行可以是 NEC、Sony…之類的發射指令,也可以是其它非發射指令,唯獨是新指令不能是 Pulses 指令行。曾經試過在重複發射中途輸入新的 Pulses 指令行,雖然能終止目前的重複發射,但新的 Pulses 指令行卻沒有正常執行,唯有在程式中做手腳,如果舊發射指令不是自然結束,而新指令又是 Pulses,就會要求重新再輸入新指令。如果有需要在重複發射中途輸入新的 Pulses 指令,應該先按一下 Send 發出一行空白的指令行去終止目前的重複發射,然後才輸入新的 Pulses 指令。
我都不肯定當舊的重複發射中途輸入新的 Pulses 指令為何會不能正常執行。純綷靠估,可能是舊的重複發射被終止後還有小小手尾要跟,未有即時讀取新的指令行,由於 Pulses 的指令行字數太多,當 Serial in 的 Buffer 被填滿都未開始讀取的話,再後面的字就無法讀取,引至指令行不原整而無法正常執行,而其它指令行的字數相對地較小,就算無即時讀取都未必填滿 Buffer,所以後來仍然能正常讀取和執行。不過真係純綷靠估,請問有無玩開 Arduino 的師兄可以指點迷津!?
其它指令
RxEnable 啟用接收解碼(預設)
RxDisable 停用接收解碼
TxHide 隱藏發射指令(預設)
TxShow 當收到發射指令行後會 Serial.print 出來
Status Serial.print 出 Rx、Tx、PL 狀態,例如:
Status: RxEnable, TxHide, PLUnknown
所有指令
再列出一次所有指令:
發射:
NEC Data Nbits Repeat
Sharp Address Command Repeat
SharpRaw Data Nbits Repeat
Panasonic Address Data Repeat
Sony Data Nbits Repeat
Pulses kHz InitialEnd Repeat m1 s2 m3 s4......sX
接收:
ReadPulses Gap
其它:
Status
RxEnable
RxDisable
TxHide
TxShow
PLHide
PLGap
PLUnknown
PLShow
總算在放假的最後一日完成!
無真正學過寫 C,以前間中玩玩 Arduino,都只係上網抄多過自己寫。今次算係寫得最長的一次,邊抄邊學邊寫,所以寫得好核突 ,獻醜了! |
|
|