|
本文章最後由 gsm7 於 2018-6-3 04:59 PM 編輯
我先說句實話,碰到這台讓我很幹,心情不好。不是很難修,而是品質真是太糟了!
第一眼見到時,按鍵全沒反應,加上首部斷裂,擺頭固定螺絲不知道飛到那裡去了?拆開簡單量了一下控制基板,發現有短路的問題。研判只是簡單的晶體或電容問題,拆回處理。結果發現是 MCU 掛點,沒救,只能買片新基板交差。想想雖然材料成本高了很多,但基本還是正值。
新基板到了,裝上去,會開機了,但還是不會動。這下我傻眼,客戶也傻眼。上控制基板拆回檢查,發現 OSC 沒動作,更新無效,MCU 又掛了。頭都已經洗到一半了,不得已再叫了一片新基板。錢結算下來變成負值。
好了。換基板誰不會?但下次再碰到這種的該怎麼辦呢?一次把兩片基板都換新的嗎?我一度想乾脆重新換個新的 MCU 上去算了,反正也不是什麼複雜的東西,一兩天的工夫而已。這次買了新基板下來之後,就把這兩片基板的控制協定資料先記下來,未來會用到也說不定。
以下是通訊協定解說︰
這是單線單向控制協定,邏輯 1 為 5V,0 為 0V,idle 為 1,開始位元 0,單位元長 5ms,總長 35 ([0:34])bits (這地方有點誤差,可能是 34 bits,因為 MCU 控制精度不良,不能確定)。
每秒重覆發送一次封包。
bit 0-1 固定為 0
bit 2 為 POWER, 1=ON,0=OFF
bit 3 為 擺頭控制,1=ON,0=OFF
bit 4-7 為風速,bit4=LSB,bit7=MSB,最低為 1([4:7]=1000),最高為 8(4:7]=0001),全部八段
bit 8 用途不明,固定為 0
bit 9 為 自然風,1=ON,0=OFF,風速由操作基板控制 ([bit4:7] 值隨機變化)
bit 10 為 睡眠風,1=ON,0=OFF
bit 11 用途不明,固定為 1
bit 12 為 負離子,1=ON,0=OFF
bit 13 為 節能,1=ON,0=OFF
bit 14 為 偶同位檢查碼,前面所有的 bit 至此全部的 1 為偶數個
bit [15:34] 為固定值,用途不明,其值為 [15:34]=0010 1101 0111 1000 0000
馬達的 VSP 信號解說︰
這是第一段的波形
為 寬度 64us (15.7KHZ) 的 PWM 信號,電壓 5V。無動作時為 0
第一段 6.4us
第二段 11us
第三段 15us
第四段 18us
第五段 27.5us
第六段 31us
第七段 36us
第八段 45us
這是第八段的波形
簡單用 Arduino 寫一個程式,送開機信號給上控制基板,命令它打開馬達
Arduino UNO Pin2 接按鍵開關至地,Pin3 為輸出 DATA
以下是程式
- //
- // Panasonic F-H16BND control program
- //
- // Powered by G7 in pigoo
- //
- #define SER_LINE 3
- #define POWER_BUTTON 2
- int flag_pw;
- int key_lock;
- void sendSerialCmd(int pw)
- {
- digitalWrite(SER_LINE,LOW);
- delay(5); // bit 0
- delay(5); // bit 1
- if(pw) digitalWrite(SER_LINE,HIGH);
- else digitalWrite(SER_LINE,LOW);
- delay(5); // bit 2 power
- digitalWrite(SER_LINE,LOW);
- delay(5); // bit 3
- delay(5); // bit 4 fan speed low_bit
- delay(5); // bit 5 fan speed
- digitalWrite(SER_LINE,HIGH);
- delay(5); // bit 6 fan speed
- digitalWrite(SER_LINE,LOW);
- delay(5); // bit 7
-
- delay(5); // bit 8 unknown
- delay(5); // bit 9
- delay(5); // bit 10
- digitalWrite(SER_LINE,HIGH);
- delay(5); // bit 11
- digitalWrite(SER_LINE,LOW);
- delay(5); // bit 12
- delay(5); // bit 13 ECO
- if(pw) digitalWrite(SER_LINE,HIGH);
- else digitalWrite(SER_LINE,LOW);
- delay(5); // bit 14 even bit check
- digitalWrite(SER_LINE,LOW);
- delay(5); // bit 15 0
- delay(5); // bit 16 0
- digitalWrite(SER_LINE,HIGH);
- delay(5); // bit 17 1
- digitalWrite(SER_LINE,LOW);
- delay(5); // bit 18 0
- digitalWrite(SER_LINE,HIGH);
- delay(5); // bit 19 1
- delay(5); // bit 20 1
- digitalWrite(SER_LINE,LOW);
- delay(5); // bit 21 0
- digitalWrite(SER_LINE,HIGH);
- delay(5); // bit 22 1
- digitalWrite(SER_LINE,LOW);
- delay(5); // bit 23 0
- digitalWrite(SER_LINE,HIGH);
- delay(5); // bit 24 1
- delay(5); // bit 25 1
- delay(5); // bit 26 1
- delay(5); // bit 27 1
- digitalWrite(SER_LINE,LOW);
- delay(5); // bit 28 0
- delay(5); // bit 29 0
- delay(5); // bit 30 0
- delay(5); // bit 31 0
- delay(5); // bit 32 0
- delay(5); // bit 33 0
- delay(5); // bit 34 0
- digitalWrite(SER_LINE,HIGH);
- }
- void setup() {
- // put your setup code here, to run once:
- flag_pw = 0;
- key_lock = 0;
-
- pinMode(POWER_BUTTON,INPUT); // POWER Button
- pinMode(SER_LINE,OUTPUT); // Serial Output
- digitalWrite(SER_LINE,HIGH);
- }
- void loop() {
- // put your main code here, to run repeatedly:
- int key_ret;
- key_ret = digitalRead(POWER_BUTTON);
- if(key_ret == HIGH){
- key_lock = 0;
- }
- else if(key_ret == LOW && key_lock == 0){
- delay(20);
- key_ret = digitalRead(POWER_BUTTON);
- if(key_ret == LOW){
- flag_pw = !flag_pw;
- key_lock = 1;
- }
- }
-
- sendSerialCmd(flag_pw);
-
- delay(830);
- }
複製代碼
僅用幾分鐘寫出來的程式,請不要要求太多,反正能用,作個 demo 功能就好了。
親測可用。記得不要將原本的 DATA 線短路到,要先拉開,不然又要買新基板了。原配的 MCU 超不耐用。
簡單寫到這邊。如有需要更換 MCU 的話,以上這些資料,配合舊基板線路即已足夠。看是要 8051,AVR 還是 PIC 隨自己的爽度來決定。
不過我還是希望不要再讓我碰到這台了。
上述的 protocol 若有誤請指正。
sorry 感覺有點噁,去廁所準備一下……
|
評分
-
23
查看全部評分
-
|