LEDつないだらモーターが動かなくなった時(Betaflight)
LED_STRIPを有効化することでモーターが動作しない現象が起きる場合
以下コマンドを入力することでLED・モーターとも動作するようになる。
set dshot_bitbang = OFF
この設定をすると、双方向D-Shotの動作がBitbangではなくTimerベースとなる。
どちらでも動作するが、Bitbangの方がTimerより少ないエラー数で動作する模様。
どうしてもBitbangで動作させたい場合は
- LED_STRIPの使用をあきらめ、単色のLEDを電源につないでただ光らせるだけにする。
- もしくは、LEDストリップのパッドを別のタイマーで動作しているパッドにRemapし、タイマー設定をずらすと上手くいくかも(未検証)。
最近の国内Tiny大会ではLEDの装着がレギュレーションに規定されている。先日出場していた人のLEDを見せていただいたところ、単色LEDの電源接続が主流のようにうかがえた。(つまり上記[1]の解決方針)簡単確実で良いのかもしれない。
上記[2]の解決策の実施のため、以下に調べたことをメモ。
(ちなみに、TinyWhoopのFCの場合余剰パッドがないためそもそもできないと思う)
■調べること
- dmaの設定状態
- timerの設定状態
DMAというのはDirectMemoryAccessの略で、CPUを介さずメモリーと周辺レジスタとの間でデーター転送を行う機能
timerはモーター制御、LED制御、カメラコントロール機能などで使われている模様。
■(LED_STRIP設定前)各設定の確認
LEDつけず、正常に飛ぶ状態で設定を確認し、メモっておく
dma show
Currently active DMA:
--------------------
DMA1 Stream 0: MOTOR 3
DMA1 Stream 1: FREE
DMA1 Stream 2: FREE
DMA1 Stream 3: MOTOR 4
DMA1 Stream 4: MOTOR 1
DMA1 Stream 5: MOTOR 2
DMA1 Stream 6: FREE
DMA1 Stream 7: FREE
DMA2 Stream 0: SPI_MISO 1
DMA2 Stream 1: FREE
DMA2 Stream 2: FREE
DMA2 Stream 3: SPI_MOSI 1
DMA2 Stream 4: ADC 1
DMA2 Stream 5: FREE
DMA2 Stream 6: FREE
DMA2 Stream 7: FREE
timer show
Currently active Timers:
-----------------------
TIM1:
CH1 : DSHOT_BITBANG 1
TIM2: FREE
TIM3: FREE
TIM4: FREE
TIM5: FREE
TIM6: FREE
TIM7: FREE
TIM9: FREE
TIM10: FREE
TIM11: FREE
■LED_STRIP有効後、設定変化の観察
基本設定 タブでLED_STRIPを有効化し、モーターが動かなくなった状態で再度dma・timerを確認。差分だけ記載するが、以下の感じになった
dma show
Currently active DMA:
--------------------
DMA2 Stream 6: LED_STRIP
timer show
Currently active Timers:
-----------------------
TIM1:
CH1 : LED_STRIP
dmaはFREEだったDMA2 Stream 6にLED_STRIPが割り当て
TIM1(タイマー1)が競合し、DSHOT_BITBANGがLED_STRIPに上書きされていることがわかる。
■LED_STRIPのパッドを調べる
resource
resource LED_STRIP 1 A08
このFCの場合、A08だった。
■LED_STRIPのパッドに紐付くdmaを確認する
dma pin A08 list
# 0: DMA2 Stream 6 Channel 0
# 1: DMA2 Stream 1 Channel 6
# 2: DMA2 Stream 3 Channel 6
もしdmaも競合している場合、このパッドでは0,1,2の選択肢でdmaのチャンネルを変更できる
例えば2を使うなら
dma pin A08 2
でDMA2 Stream 3 Channel 6を使うように変更できる。
ソフトシリアルなどもこの辺のチャンネルを食い合うものなので、ソフトシリアルをOFFにして空いたところにLED_STRIPを通す。とかすることになると思われる。
■LED_STRIPのパッドに紐つくtimerを確認する
timer
timer A03 AF3
# pin A03: TIM9 CH2 (AF3)
timer B04 AF2
# pin B04: TIM3 CH1 (AF2)
timer B05 AF2
# pin B05: TIM3 CH2 (AF2)
timer B06 AF2
# pin B06: TIM4 CH1 (AF2)
timer B07 AF2
# pin B07: TIM4 CH2 (AF2)
timer B03 AF1
# pin B03: TIM2 CH2 (AF1)
timer B10 AF1
# pin B10: TIM2 CH3 (AF1)
timer A00 AF2
# pin A00: TIM5 CH1 (AF2)
timer A02 AF2
# pin A02: TIM5 CH3 (AF2)
timer A08 AF1
# pin A08: TIM1 CH1 (AF1)
LED_STRIPのパッドA08はTIM1に設定されていることが確認できる
違うタイマーに設定しようと
timer A08 AF3
など試したが、
###ERROR IN timer: INVALID ALTERNATE FUNCTION FOR A08: 'AF3'###
などと出て許してもらえなかったので、ここに別のパッドにしないと問題が解決しない原因がある。
■よって
timerが有効になっており、かつDSHOT_BITBANGが使うタイマー番号ではないtimerが割り振られているパッドをLED_STRIP用のパッドにremappingし、dma streamのチャンネル競合も起こらないように確認して設定すれば、おそらくLED_STRIPとDSHOT_BITBANGの共存が可能。
■最後に
プライベートが忙しく、LEDレギュレーションの規定された大会に出ていなかったが、最近大会に出れそうなのでいざLEDを付けようとしたらこの問題に当たった。
もしかしたらもうすでにみんな通った道なのかもしれないが、自分にとっては久しぶりにBetaflightの知識が少し増えたので本記事に残す。
(参考)
https://github.com/betaflight/betaflight/issues/11268
https://github.com/betaflight/betaflight/discussions/11425
https://github.com/mathiasvr/betaflight-deciphered/blob/master/README.md#dshot_bitbang_timer
set dshot_bitbang_timer = TIM8
一応TIM1からTIM8に移ってくれるかなと思ってやってみたけど上手く動かなかった。