立ち上げで初期化完了時にサウンド、バックするときにも違うサウンドを出す、としたいけど、初期化完了時はともかく、バックする時にサウンド出すと、なぜか前進切り替わり時に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