DSM2 讀書心得 2

上次根據RC group上的討論做了一個給Futaba FF9用的DSM2 用的low power module後, 信心大增...
傳說DX4e裏的module是full range的, 弄了一個來看看....沒錯....18dbm.....


背面....

產線上裝配時應該是先用雙面膠黏起來,再焊排針的....拆的時候, 我先用尺把泡棉雙面膠搞破, 再在排針面上一堆錫, 來回加熱 慢慢拔起....要小心...

這個module除了是full range外, 他還支援DSMX.....我沒有很清楚DSMX跟DSM2是改了哪些地方...但是這個模組是兩者共用的,應該是軟體的差異....

RC group上給 futaba 用的chematic是這樣接的...這個先生的code使用了arduino的 internal pull high, 所以沒有pull high D8...

這回要接的是SD-10G, SD10G的PPM 訊號型態跟futaba相同, 但是信號準位約在6~8V,要看當時的電池電壓....
我第一次試著用10K可變電阻去分壓, 不知為何, 一接上去, 訊號元的準位就低到一個不行....放棄....

改用這樣接, 將D8 pull high到3.3V(我還是用3.3V的8Mhz pro mini), 再接一個蕭基特二極體, 這樣當PPM low的時候就會把D8 拉到low了...

這樣也有個問題, 那個 Low的時候, 不會到0V,而且跟pull high的阻值有關...可能是跟SD-10G PPM signal的內部線路有關吧...我試過,那個電阻約4K, arduino就能讀到信號了....最後我是拿17.8K(因為手頭上只有這個),這時low的準位看起來比較好....

接好後, 程式看來也沒問題, C2PO的程式有個debug的選項, 可以先在PC上用serial monitor用115200去看要傳的資料有沒有對....

幾個小心得:

1.使用debug,請把原來的#define DE_BUG 改成 #define DEBUG
2. 他的程式有rising edage跟falling edage選項, (很奇怪 他把Sanwa歸類跟JR成falling edage, 可是我的情況是跟futaba一樣, 應該是rising edage)


TCCR1B = (1<<ICES1) | (1<<CS11);        // capture using rising edge,  prescaler = 8, such as JR, SanWa
//    TCCR1B = (1<<CS11);                     // capture using falling edge, prescaler = 8, such as Futaba

3.原本的code是輸出6channel, 如果要改成8channels 輸出要改以下幾個地方:

#define DSM2_CHANNELS 8 // Max number of DSM2 Channels transmitted

channel index也要把後面兩動補上(我順便改成我喜歡的順序)

static byte ChanIndex[] = {1,2,3,4,5,6,7,8}; //PPM to DSM2 Channel Mapping Table for my sd 10G, and adding 7 and 8

下面這一個是Binding時的channel value, 原本只有6動, 其實不改還是能Bind, 我把它改成8動...7跟8的值我是copy第6動...

static byte DSM2_Channel[DSM2_CHANNELS*2] = {0x00,0xAA,0x05,0xFF,0x09,0xFF,0x0D,0xFF,0x13,0x54,0x14,0xAA,0x14,0xAA,0x14,0xAA};

4. 設fail save的地方, 他有把油門那一動(3)改成1100, 我的油門是設在第一動...

Failsafe[1] = Pulses[1] = 1100; // set channel 1 failsafe pulse width to min throttle

5. Header的部分,我有量過 DX4e出來的header是18 00跟98 00(binding),細節參照前一篇裏的說明....
我測試時是用小橘子接收, 他應該是DSM2的, header我用 00 00也可以動, 18 00也可以動...有機會試試DSMX的接收...

6. RC group上有位先生說header的第二個byte是拿來做識別用的, 他有試過, bind 3個接收, 分別用不同的數值, 可以分別對各接收下命令...
所以說可以一對多到256個....這樣好像好厲害...運用上不知道有沒有特別的地方...

最後來到痛苦的地方,一切正常的情況下, FF9/3PK都可以正常動做....但是SD-10G可以bind, 但是servo動起來似乎有delay, 還會有格....
他會動, 方向跟大小都正確, 但是就是會跳格....

用LA下去看, 3PK的PPM約是14ms, FF9是22ms, Dx4e的serial command 是22ms送一次....
SD-10G是24ms....

C2PO的code在每次ppm decode完之後會送一次serial command, 所以送週期跟PPM的週期有關....
顯然這個module 對超過22ms的週期反應不良....

所以我在PPM channel 1抓好後, 加送一次serial command, 配上原本在PPM decode結束時的那一次, 兩次的間距雖不固定, 但是也覺不會超過22ms....
這招有改善, servo 動得比較好了, 但是還是有跳動, 不夠順暢....

看來除了週期不超過22ms, 還得要有固定的間距....

一開始考慮很多, 想用timer interrupt,來送serial command, 但是又怕去影響到PPM用的 interrupt....
如果以8 channels(16bytes), 再加2bytes的 header, 8N1的config, 總共是180bits....用125000下去傳約要1.44ms....
不過, uart應該有buffer, ISR裏只是將東西搬到buffer裏.....不用很久吧...

最後取消原本code裏的 sendDSM2(), 在loop 結束前加了這個...current_time 是 unsigned long

if((millis()-current_time) > 20) {
sendDSM2(); // send frame
current_time = millis();
}

再用LA下去看, 看來狀況不錯, serial command是用20ms下去給, PPM decode的值似乎也沒有受到影響...
Servo 的動作也很順暢了....看來是OK了....1~6動我都試過....






留言

  1. 請問一下那裡可以單買到DX4e裡的發射模組?

    回覆刪除
  2. 我是在網路上找的, 賣家是個三重的模型店,之前進一堆整套的直升機, 拿來拆賣...你可以問問他: 02 2986 3654 郭先生...

    回覆刪除
    回覆
    1. 十分感謝提供資訊,可否再請問他所販賣的價錢大概是多少錢呢?
      是單賣模組抑或是賣整支遙控器?(應該為後者吧)

      目前市售商品只有spektrum的dm8模組可以將futaba轉成dsm2
      這個如果可以弄成dsm2/dsmx雙模的話,感覺十分強悍啊XD

      刪除
  3. 作者已經移除這則留言。

    回覆刪除

張貼留言

這個網誌中的熱門文章

Heltec ESP32+OLED+Lora, hardware testing

micro SD card for ESP32, on lolin32 with OLED and heltec 32 lora oled

Install Network Time Protocol(NTP) on BeagleBone with Angstrom linux and set local time zone