2016年8月3日 星期三

debug USB - use usbmon, usbfs

dump usb data
  1. 編kernel時,在driver/usb/下選擇usb monitor
  2. mount -t debugfs debugfs /sys/kernel/debug
  3. 之後在此目錄下就會看到usbmon目錄
  4. 可以在此dump出urb的資料(ascii) 

  • 可以使用/dev/usbmon[XX]來dump出raw data,之後自己寫程式去parse
  • 詳細文件參考Documentation/usb/usbmon.txt 

查看linux上所有USB裝置的詳細資訊



  1. mount -t usbfs usbfs /proc/bus/usb/
  2. cat /proc/bus/usb/devices
  3. 各攔位介紹
    1. http://www.linux-usb.org/USB-guide/c607.html
  4. 詳細文件: Documentation/usb/proc_usb_info.txt

/proc/bus/usb/devices各欄位資料

  • T開頭(topology)
    • Bus: which bus the device is on
    • Lev: the level of the device
      • level 00 for the root hub
      • level 01 for any device attached to the root hub
      • level 02 for devices attached to hubs at level 01, and so on.
    • Prnt: the parent device for this device 
      • always 00 for the root hub
      • 01 for the devices attached to the root hub
    • Port: the port on the parent device
      • starting at 00 for the first port on each device.
      • Prnt/Port is unique per bus.
    • Cnt: what number device this is, based on the enumeration order within that level of the topology, starting at 01 for the first device.
    • Dev#: what number device this is, irrespective of level, based on the bus enumeration order. This is unique per bus
    • Spd: what speed this device is running at, in Mbps (either 1.5 or 12 with the current version of USB).
    • MxCh: how many devices can be connected to this device
      • 00 for anything except a hub. 
    • Driver: which device driver is being used for this device 
      • an entry of (none) indicates that no driver is being used.
  • D開頭(device descriptor)
    • Ver: which USB specification version the device claims to meet. 
    • Cls: which device class the device is claiming to meet, in both hexadecimal and as a string. 
      • Cls entry of 00(>ifc) indicates that the device class specification compliance is interface dependent, and the interface descriptor should be read for device class information.
    • Sub: which sub-class (within the Cls entry), the device meets.
    • Prot: which protocol within a class or sub-class the device claims to meet.
    • MxPS: how big the packets from Endpoint 0 are.
    • #Cfgs: how many configurations this device has.
  • P開頭(pid/vid)
    • Vendor: the Vendor Identification code for the device
    • ProdID: the Product Identification code for the device. 
    • Rev: the product revision number.
  • S開頭: vendor and product strings that the device returned.
  • C開頭(configuration descriptor)
    • the number of C:lines per device is given by #Cfgs, and the entry followed by an asterisk is the current configuration. 
    • #If: how many interfaces the device has.
    • Cfg#: which configuration is being described. 
    • Atr: hexadecimal indication of the device attributes 
      • 0x80 for bus-powered
      • 0x40 for self-powered
      • 0x20 for remote wake-up capable
    • MxPwr: maximum power draw for this device configuration, in milliamps(mA). 
  • I開頭(interface descriptor)
    • If#: which interface is being described within a given device configuration.
    • Alt: which alternate setting of this interface is being described.
    • #EPs: how many endpoints there are within the alternate setting for this endpoint.
    • Cls: which class the alternate setting of the interface corresponds to, in both hexadecimal and as a character string. 
    • Sub: which sub-class the alternate setting of the interface belongs to. 
    • Prot: which interface protocol (within a class and sub-class tuple) the alternate setting of the interface conforms to. 
    • Driver: which of the various USB drivers has claimed this interface. 
  • E開頭(endpoint descriptor)
    • Endpoint 0 is not displayed. 
    • Ad: endpoint address, with a letter to indicate whether the endpoint is an In or Out endpoint.
    • Atr: the attribute (transfer type) associated with the endpoint, followed by a string translating the transfer type. 
    • MxPS: maximum packet size this endpoint is capable of sending or receiving, as appropriate.
    • Ivl: the interval, in milliseconds, between polling of interrupt endpoints.
      • ignored for bulk and control transfers, and is set to 1 for isochronous transfers.






================================================= 

example

root@ocgod-ubuntu9:/proc/bus/usb# cat devices

T: Bus=05 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2
B: Alloc= 0/900 us ( 0%), #Int= 0, #Iso= 0
D: Ver= 1.10 Cls=09(hub ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=1d6b ProdID=0001 Rev= 2.06
S: Manufacturer=Linux 2.6.28-18-generic uhci_hcd
S: Product=UHCI Host Controller
S: SerialNumber=0000:00:10.3
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr= 0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub
E: Ad=81(I) Atr=03(Int.) MxPS= 2 Ivl=255ms

T: Bus=04 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2
B: Alloc= 0/900 us ( 0%), #Int= 0, #Iso= 0
D: Ver= 1.10 Cls=09(hub ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=1d6b ProdID=0001 Rev= 2.06
S: Manufacturer=Linux 2.6.28-18-generic uhci_hcd
S: Product=UHCI Host Controller
S: SerialNumber=0000:00:10.2
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr= 0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub
E: Ad=81(I) Atr=03(Int.) MxPS= 2 Ivl=255ms

T: Bus=03 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2
B: Alloc= 0/900 us ( 0%), #Int= 0, #Iso= 0
D: Ver= 1.10 Cls=09(hub ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=1d6b ProdID=0001 Rev= 2.06
S: Manufacturer=Linux 2.6.28-18-generic uhci_hcd
S: Product=UHCI Host Controller
S: SerialNumber=0000:00:10.1
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr= 0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub
E: Ad=81(I) Atr=03(Int.) MxPS= 2 Ivl=255ms

T: Bus=02 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2
B: Alloc= 34/900 us ( 4%), #Int= 3, #Iso= 0
D: Ver= 1.10 Cls=09(hub ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=1d6b ProdID=0001 Rev= 2.06
S: Manufacturer=Linux 2.6.28-18-generic uhci_hcd
S: Product=UHCI Host Controller
S: SerialNumber=0000:00:10.0
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr= 0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub
E: Ad=81(I) Atr=03(Int.) MxPS= 2 Ivl=255ms

T: Bus=02 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=1.5 MxCh= 0
D: Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
P: Vendor=13ba ProdID=0017 Rev= 0.01
S: Product=Generic USB K/B
C:* #Ifs= 2 Cfg#= 1 Atr=a0 MxPwr=100mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=01 Prot=01 Driver=usbhid
E: Ad=81(I) Atr=03(Int.) MxPS= 8 Ivl=24ms
I:* If#= 1 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=01 Prot=02 Driver=usbhid
E: Ad=82(I) Atr=03(Int.) MxPS= 5 Ivl=10ms

T: Bus=02 Lev=01 Prnt=01 Port=01 Cnt=02 Dev#= 3 Spd=1.5 MxCh= 0
D: Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
P: Vendor=04d9 ProdID=0499 Rev= 2.90
C:* #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr=100mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=01 Prot=02 Driver=usbhid
E: Ad=81(I) Atr=03(Int.) MxPS= 8 Ivl=10ms

T: Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=480 MxCh= 8
B: Alloc= 0/800 us ( 0%), #Int= 0, #Iso= 0
D: Ver= 2.00 Cls=09(hub ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=1d6b ProdID=0002 Rev= 2.06
S: Manufacturer=Linux 2.6.28-18-generic ehci_hcd
S: Product=EHCI Host Controller
S: SerialNumber=0000:00:10.4
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr= 0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub
E: Ad=81(I) Atr=03(Int.) MxPS= 4 Ivl=256ms

linux 上使用蜂鳴器通知某指令完成

1.先寫一隻能夠使蜂鳴器發出聲音的程式
  //b2.c
  #include   
  #include   

  void   play(unsigned   int*   freq,   unsigned   int*   delay);

  int main(int argc, char* argv[])
  {
        speaker(330, 5);
        speaker(  0, 5);
        speaker(330, 5);

        return 0;
  }
  
  int   speaker(unsigned   int   freq,unsigned   int   delay)
  {   static   int   flag=0,bit;
          if(flag==0)
          {
                  flag=1;
                  iopl(3);
          }
          outb(0xb6,0x43);
          outb((freq   &   0xff),0x42);
          outb((freq   >>   8),0x42);
          bit=inb(0x61);
          outb(3   |   bit,0x61);
          usleep(10000*delay);
          outb(0xfc   |   bit,0x61);
        return;
  }


2.beep:一個shell script使b2在指令完成時執行
$*
sudo ./b2


3.把b2 and beep放至/bin

4.由於b2發出聲音要有root的權限,所以b2擁有者要設為root,然後對beep作setuid
http://www.google.com/url?q=http%3A%2F%2Flinux.vbird.org%2Flinux_basic%2F0220filemanager.php%23suid&sa=D&sntz=1&usg=AFrqEzfx6HcqK_4BpogqAlU2s7Ts5ttsug

使用split 分割檔案

要把資料打包放到隨身碟上,
不過卻發現隨身碟為fat32,不支援單一大檔案,
所以google一下方便的分割方法

參考:
http://blog.24reader.com/vincentlam/2009/04/22/%E4%BD%BF%E7%94%A8tar%E6%89%93%E5%8C%85%E5%A3%93%E7%B8%AE%E4%B8%A6%E5%88%86%E5%89%B2%E7%82%BA%E5%9B%BA%E5%AE%9A%E5%A4%A7%E5%B0%8F%E7%9A%84%E6%AA%94%E6%A1%88/
http://lovejuan1314.javaeye.com/blog/457841


原本壓縮:
tar -zcvf XXXX.tar.gz XXXX

原本解壓縮:
tar -zxvf XXXX.tar.gz



壓縮並分割:
tar -zcvf- XXXX| split -a 1 -b 1000m - ./XXXX.tar.gz.
壓縮結果:
XXXX.tar.gz.a
XXXX.tar.gz.b
XXXX.tar.gz.c
...

解壓縮:
cat XXXX.tar.gz* | tar -zxvf-

C 程式的Comma operator

Comma operator 在wiki上的介紹:
http://en.wikipedia.org/wiki/Comma_operator


假設...
int aaa(){
...
}

void bbb(){
...
}



若遇到下面這種寫法
ret=flag? aaa(): bbb();
編譯時會發生錯誤:
error: void value not ignored as it ought to be

因為此時若flag為0,則ret=bbb();
但是bbb()沒有回傳東西(void),
此時可以使用下面這種寫法:
ret=flag? aaa(): (bbb(),NULL);

其中(bbb(),NULL)永遠回傳0(NULL)


android app 將檔案放入程式在/data下的目錄中

之前寫測試apk的經驗:

==================================
在專案的res下面增加raw資料夾
將需要的檔案放進去(不要包含".")

使用  copyFile("XXX.sh", R.raw.XXX);

存放進去的路徑可使用this.getFilesDir()取得

目錄應該是/data/data/com.YYY.ZZZ/files


    private boolean copyFile(String fName, int rawId){
     InputStream inS = null;
     OutputStream outS = null;
          byte [] buf = new byte[1024];
     int readByte = 0;
          try {
inS = getApplicationContext().getResources().openRawResource(rawId);
outS = openFileOutput(fName,MODE_PRIVATE);
while((readByte = inS.read(buf, 0, 1024)) != -1){
outS.write(buf, 0, readByte);
}
inS.close();
outS.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
          return true;
    }

android 使用標示為hide的API - java reflection

framework中,有許多function上面使用@hide標示為隱藏,

在eclipse上面使用也無法編譯

不過可以使用下列方法解決:
http://eeepage.info/java-hide-class/
http://java.sun.com/developer/technicalArticles/ALT/Reflection/


舉例來說,開關softap使用wifiManager.setWifiApEnabled(),
但setWifiApEnabled()標示hide

可以用下列方法直接呼叫:
Method mMethod = mWifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
mMethod.invoke(mWifiManager, new Object[] { null, true });



class.getMethod()的第一個參數為method名稱(字串),後面為這個method自己所需的參數(args)
method.invoke的第一個參數為執行這個method的class, 第二個參數為物件陣列,內容是要傳進此method的參數

X9D+ 使用NRF24L01 (v2x2 protocol)控制jj1000





整體架構大致如下,架構還蠻簡單的

  1. X9D+ 遙控器輸出電源與PPM訊號
  2. Arduino 
    1. 負責選擇protocol
    2. 控制NRF24L01對頻
    3. 收PPM訊號,解析出來
      1. http://ddddiy.blogspot.tw/2016/08/arduino-ppm.html
    4. 透過NRF24L01傳送各通道訊號



目前可以動了,但有幾個問題
  1. jj1000 led 燈幾秒會閃一下
  2. 不動時,有時油門會突然稍微轉一下
    1. 目前懷疑控輸出的PPM 有問題,導致arduino 計算錯誤
  3. 上面兩個問題可以調整timing解決
    1. http://ddddiy.blogspot.tw/2016/08/arduino-ppm.html


jj1000 對頻方法
  1. jj1000 開機
  2. 遙控端切換protocol(PROTO_V2X2, 值為0, 我修改的code 可以印出debug message)
    1. 按著前傾
    2. ch12最大




X9D
Leonardo
NRF24L01
PPM(pin1)
pin2

Vout(battery voltage, pin3)
Vin

GND(pin4)
GND
GND

SPI-MISO(pin14)
MISO

SPI-MOSI(pin15)
MOSI

SPI-SCK(pin16)
SCK

pin9
CE

pin10
CS

3.3V
VCC




DBG(pin6 to 5V or 0V)









我的code(porting to Arduino Leonardo)
Use D:\work\arduino\arduino-1.6.8

porting to arduino leonardo
1. change pin define
2. add debug function and dynamic debug message
- set DBG_ON=1 in source code
- connect DBG_pin(enable debug) to VCC or GND(disable debug)
3. abstract PPM_INPUT_MIN/MAX
4. fix bu
g about PPM ISR setup
- use digitalPinToInterrupt(PPM_pin)
5. increase throttle safe check delay to 1s

來自 <https://github.com/cy-arduino/nrf24_multipro/commit/8c776f6ef0f2fd794154fa3c51ff08ce60b72803>


原始github source









nrf24l01 pin define








除了AETR前四個通道,其餘通道功能如下(依協定不同有些微差異)
Channel 5: led light, 3 pos. rate on CX-10, H7, inverted flight on H101
Channel 6: flip control
Channel 7: still camera
Channel 8: video camera
Channel 9: headless
Channel 10: calibrate Y (V2x2), pitch trim (H7), RTH (H8 mini/H20), 360deg flip mode (H8 mini 3D/H22)
Channel 11: calibrate X (V2x2), roll trim (H7)

Channel 12: Reset / Rebind













reference:
    遙控器輸出PPM格式 http://www.geek-workshop.com/thread-2408-1-1.html

FrSky X9D+ 雙向傳輸協定

為了之後使用arduino  DIY  接收機的參考資料:


arduino有現成的lib可以用!!!



官方spec
https://drive.google.com/file/d/0B3S1vckBpeolUFR5T1docXprSjQ/view?usp=sharing
https://drive.google.com/file/d/0B3S1vckBpeolVkJYd0E1MEE2Skk/view?usp=sharing
https://drive.google.com/file/d/0B3S1vckBpeoldzBMUzlRbVQ0S0k/view?usp=sharing

快速線上測試各種語言程式

這個網站很方便,有時候想要快速測試一下語法很好用



http://www.tutorialspoint.com/codingground.htm


例如標準的C可以使用這個:
http://www.tutorialspoint.com/compile_c99_online.php

FrSky X9D+ 使用 PC 直接設定遙控器

可使用PC直接設定遙控器功能,比較方便不用一直按

(我用win10不用另外裝驅動)

FrSky X9D+ 遙控器語音製作

這支遙控器使用開源的opentx 系統,自由度非常高
可以在各種情境下撥放聲音,例如開關切換、時間倒數電壓警示....

內建語音的部分直接置換SD card內的聲音檔即可,網路上也已經有人做好各國語言的版本可以下載
也可以自己轉聲音檔進去,利用遙控器開關做切換與撥放

自製聲音檔須注意:

  • 格式須為wav 32k 16bit mono

參考:

[TTS]文字轉語音


線上轉換聲音檔格式

線上轉換檔案格式

這個網站可以直接給影片或音樂的網址來轉檔

 例如傳聲音或給影片or 聲音網址(youtube/土豆網等…)轉換成wav:

[TTS]文字轉語音


使用各式線上服務, 自行錄下

  1. Google 翻譯錄下來
    1. https://translate.google.com.tw/

機器產生的替代文字:
Google 
welcom to open TX. 
flight mode on. 
trim center. 
*RCPopenTX.

工研院文字轉語音Web服務



使用acapela 轉換成語音後可以直接下載,下列是教學

https://www.youtube.com/watch?v=Wvsq4Iio_OA

[80%]DIY 無刷抽風扇

材料:

  1. 四軸淘汰下來的2212 1000KV + 1050槳
  2. 250直升機的舊電變
  3. 12v 5A變壓器
  4. 伺服機測試器
  5. 鐵絲網
馬達鎖上附贈的轉接座,
把變壓器改成T插接頭,直接接上直升機的舊電變(內建BEC),即可使用


下一步目標用有厚度的保麗龍切割成圓形,圍在螺旋槳沒有遮蓋到的地方,作成類似導風扇的效果










2015年10月12日 星期一

Diy 520 培林 安裝/移除 工具

使用四驅車齒輪,上面的洞剛好可以放入520培林

使用螺絲緊迫來安裝或移除導輪培林

2015年5月3日 星期日

LG G2 Kitkat 升級 Lollipop 失敗

使用LG PC Suite ,前天收到Android lollipop更新,
但是按下去更新到一半就失敗,無法重開機進入系統,每次開機都卡在download的畫面


LG PC Suite可以重試,但一直無法成功
不過發現到一個現象: 每次更新image,成功的%都漸漸增加,感覺只要花時間一遍遍更新,就可以達到100%

經歷了一整天的重試,終於達到100%而順利開機了!!!!!



============================================================
由於重試幾次失敗後,重新更新就又會需要重新下載更新檔
有找到一個做法可以不用重新下載:
  1. 下載官方image
    1. 使用imei查詢機台可用最新的image(KDZ)
      1. 回傳的XML內會帶下載網址
    2. 或是上網直接抓
      1. http://lg-phone-firmware.com/index.php?id_mod=36
      2. 國家與電信商沒差,只須確認
        1. 型號 (D802/F320K/F320L...)
        2. ROM 大小(16/32)
  2. 使用LG Flash Tool 2014燒錄KDZ

      1. 上網抓LG Flash Tool 2014
        1. 解壓縮後將KDZ放到相同資料夾內
      2. 開啟LGFlashTool2014.exe
        1. Normal Flash: 不清data
        2. CSE Flash:  清data
      3. 第二個頁面按下start即可開始燒錄
      4. 燒錄失敗後重插USB,繼續重試

2015年1月11日 星期日

linux bash function for switch tmux session(若不存在則重新建立)

可以直接切換到Tmux 不同session

加在.bashrc內

tmux_goto_branch ()
{
        P="$1"

        if [ "$P" == ""]
        then
                echo "$0: must enter branch name..."
                exit
        fi

        tmux has -t $PROJ
        if [[ "$?" == "0" ]];
        then
                echo "$0: Session exist, switch to it";
                tmux attach -t $PROJ
        else
                echo "$0: Session not exist, create a new one"
                tmux new -s $PROJ -n $PROJ
        fi

}

用法: tmux_goto_branch BRANCH_TEST

設定linux shell 提示字元與ssh 登入的title

查看ubuntu 的.bashrc, 可以發現下列設定:


if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
    ;;
*)
    ;;
esac


其中可以看到如果要改顏色,可以使用顏色標示包起來

登入shell時,提示符號預設長這樣  username@server:~$

使用putty等軟體經由SSH 連入時,可以看到登入視窗的title也會跟著變,由此可知這個title是從linux內拿來的,就是上述最後一組PS1變數的設定


所以經由上述分析,可以寫一個function, 放在.bashrc內,之後就可以簡單的手動設定想要的提示符號與title

set_title ()
{
        PS1="${debian_chroot:+($debian_chroot)}\[\033[01;32m\]$*\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ "
        PS1="\[\e]0;${debian_chroot:+($debian_chroot)}$*: \w\a\]$PS1"
}



使用方法:
    set_title "test title"


2014年12月15日 星期一

製作windows7 安裝隨身碟,啟用版本選擇

win7開始microsoft已經把所有版本(家用版/專業版....)整合在一起
不過教育版安裝時不會出現選單

前一陣子把筆電重灌,要使用筆電自帶家用進階版的序號,但安裝時如果不裝成家用進階版會拒絕吃這組序號

研究了一下後已經成功,寫個筆記紀錄一下
  1. 取得win7 ISO(win7 image 皆包含所有版本)
  2. 下載refus, 使用他將ISO檔製作開機USB 碟
  3. 雖然win7 image 皆包含所有版本,但有的ISO 無法選擇版本
    1. 原因是版本已經寫死在source/ei.cfg,由於已經做成隨身碟,將這個檔案拿掉即可選擇

2014年10月9日 星期四

四軸飛行器除錯

目前使用qq super飛控,基本上x 四軸模式可以飛行

配置:
qq super
xxd2212 x4
xsd 30a esc x4
11.1v 2200mah 25c
skyartec sky705 controller/receiver
450機架

飛行時間約11分

不過飛到一半常常會漸漸往左旋轉 ,且飛完後右上與左下無刷馬達會稍微熱一點

目前要等確認機身沒問題後,再開始自製飛控

猜測可能發生問題的地方:
1  正反槳浮力不同
        換一組槳也是一樣
2 馬達馬力不同
        目前交換左上與左下馬達  下次換測試交換右上與右下馬達看看
3 電變輸出不同
        設定跑掉 or 不同批? <== 研究如何設定好盈電變