Arduino carに圧電スピーカーを追加したけど、

立ち上げで初期化完了時にサウンド、バックするときにも違うサウンドを出す、としたいけど、初期化完了時はともかく、バックする時にサウンド出すと、なぜか前進切り替わり時にDCモーターの左側が動いたり動かなかったり(大半は動かない)。なんで圧電スピーカーならすDIO(pin14)とそれ以外のDIOが干渉するか分かりませんが、どうもタスクコントロールに問題があるんだろうからFreeRTOSに理解が浅いだけだろうと思う。

スピーカーはArduinoやDCモーター駆動基板を覆うような形で作ってみた。造形時間3時間ぐらいで、天井に圧電スピーカーをマウントできるようにしています。Arduinoとの接続はハンダ付だと分解が大変そうなので、ピンをArduinoのコネクタに差し込むようにして対応。

 

P.S.

タスクにしないで、直接関数呼び出しても同じ現象が起こるから、RTOS問題では無さそう。tone()関数はCPUのタイマー使っているから、実はそれがRTOSと競合しているとかあるのかな?

DIOを14から16に変えても状況に変化無し。

ということでback_sound()ではtone()関数使わないで、”ド4(およそ262Hz)”の音をおよそ0.3秒間出すようにしてみたらDCモーターがマトモに動くようです。

setup()からはtone()を呼び出してもこれは問題ないからそのまま使います。ArduinoライブラリにはFreeRTOS、つまりマルチタスク環境では上手く動作しない関数(thread safeでは無い関数)があるのかもしれません。

int pinNo = 16;
void buzzer_setup() {
  tone( pinNo, 98, 200 );   // Gの音を発信
  delay( 220 );
  tone( pinNo, 110, 200 );  // Aの音を発信
  delay( 220 );
  tone( pinNo, 123, 200 );  // Bの音を発信
  delay( 220 );
  tone( pinNo, 130, 200 );  // Cの音を発信
  delay( 1000 );
}

void back_sound() {
  //tone( pinNo, 98, 100 );  // Gの音を発信
  //delay( 150 );
  //tone( pinNo, 98, 100 );  // Gの音を発信
  //delay( 150 );

  for(uint16_t count=0; count<78; count++){
    digitalWrite(pinNo, HIGH);
    delayMicroseconds(1908);
    digitalWrite(pinNo, LOW);
    delayMicroseconds(1909);
  }
}

現状のソースコードやstlファイルのリンクはこちら。

https://github.com/chateight/arduino/tree/master/smart_car_RTOS

 

admin