SSブログ

MP3N18E01にサーボ信号を付加 その1 [ds-DCCデコーダ]

 新型コロナウイルスを拡散させている元凶として、小中高校が休みになったため、うちも子供が毎日、一日中家でYoutubeとマイクラ(マインクラフト)とWiiのマリオカートをやり続けています。毎日会社に行かないといけない身としては、ずるいなあ、いいなあと思いつつ、国全体の教育を一か月消したために数十年後にボディーブローのように国力に悪影響するんだろうなあとちょっとだけ心配しています。
 また、これで本当に東京オリンピックをやらなかったら、大友克洋のAKIRAの映画(2020年にオリンピックの予定だったが、東京が壊滅して、たぶん中止)が当たって怖いですが。
 さて、なごでんさんより、Next18仕様のMp3デコーダスケッチのMP3N18E01にサーボ機能を付けられないかと相談を受けたので、ちょっと作ってみました。
 入れるべきところはAUX3,AUX4のようですので、ATMEGAのピン配置ではPD6,PD5のようです。
 ATMEGA328はTimerを0~2の3つ持っていますが、0番はいろいろArudinoのタイミング制御に使っているようで使ってはいけないようなので、使いません。1はVVVFの疑似音に使用し、2はモーターのPWM制御に使っています。今回、サーボをTimer1で共用して使えないかという話でしたので、検討しました。
 Timer1は31KHzで動いていて、VVVF_sound.cpp内で割り込みの関数ISRを定義しています。31kHz(32usごと)にISRが呼ばれますが、実は、2回に1回しか波形を変更しておりません。なぜ31KHzで呼びつつ半分の16KHzで処理しているかというと、もともと16KHzで割り込みをして波形を毎回変更していたのですが、16KHzのモスキートノイズが発生してしまったためです。そのため、現在、呼ばれた割り込みの2回に1回は何もせずに割り込みを終わらせているため、この、何もしていないサイクルにサーボモーターの波形処理を入れることにしました。
 波形は16ms周期で、パルスの幅は0~16msまで0~255で対応します。値1あたり64usぐらい。
 命令は
void servo3(bool use_flag ,unsigned char angle)
void servo4(bool use_flag ,unsigned char angle)
で、use_flag にtrueを指定すると、パルスを出力します。angleに0~255を指定しますが、PICで遊ぶ電子工作 様を見ると、パルスは最大でも2.3msぐらいとのことで、angle = 3~35ぐらいと思います。
で、適当に作って、動かしてみました。今回、適当にnotifyDccFunc内を改造しF5~F8でservo3のangleが変わり、F9~F12でservo4のangleが変わるように適当なデバッグをしています。特にF5やF9はパルスを出さない設定にしているので、もしかしたら動作がおかしいかもです。
なお、next18環境の書き込みが難しいので、今回はかなり古いdesktop station様のdecoder development boardの改造品でデバッグしています。DS blue boxからの制御で疑似音、モーター、サーボ波形ともに一応出ることは確認しました。つまり、サーボの実稼働はさせておりません。(あと、たぶん、サーボ実装時はファンクションの使い方が違うと思います)
 スケッチはこちら
re_DSC02907.jpg



コメント(4) 

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。