わるくないドローン

TinyWhoopと5インチのレース取り組み。その他お遊び機体の制作などメモします。Twitter:@walkunaikera (※引用歓迎、無断転載禁止)お仕事・ご依頼はTwitterのDMで待ってます

LEDつないだらモーターが動かなくなった時(Betaflight)

LED_STRIPを有効化することでモーターが動作しない現象が起きる場合

以下コマンドを入力することでLED・モーターとも動作するようになる。

set dshot_bitbang = OFF

この設定をすると、双方向D-Shotの動作がBitbangではなくTimerベースとなる。

どちらでも動作するが、Bitbangの方がTimerより少ないエラー数で動作する模様。

 

どうしてもBitbangで動作させたい場合は

  1. LED_STRIPの使用をあきらめ、単色のLEDを電源につないでただ光らせるだけにする。
  2. もしくは、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

Betaflight | ほいほい堂blog

 

https://github.com/mathiasvr/betaflight-deciphered/blob/master/README.md#dshot_bitbang_timer

set dshot_bitbang_timer = TIM8

一応TIM1からTIM8に移ってくれるかなと思ってやってみたけど上手く動かなかった。