Sahara's WebLog

日記のような、備忘録のような、うらみつらみのような、自慢のような…。

Arduino NanoでZockの起動時の音とモノアイの動きの再現

某掲示板で表題の内容に取り組んでる人がいた。
しばらく眺めていて、Timerの使い方の練習になると思って自分も始めてみた。
件の人はDFPlayerという外付けの音再生モジュールを使うことにしたようだった。
実は先日すでにこのモジュールは買って「DFPlayer Mini + Arduino NANO」で動作テストも済んでいる。
でもそれじゃ何の工夫も必要無いし、タイマー割り込みの練習にもならないので、Nanoだけでやるという条件を勝手に課してやってみることにした。

音再生関連のネタ元はここだ。
ここで得られるのは、データをSRAMではなくフラッシュメモリに置く方法に関する知識だ。
下のように、プログラムメモリの方が圧倒的に多いので、これを使うのが容量的には有利だということらしい。

詳細はPROGMEMで探せば出てくる。
https://www.arduino.cc/reference/en/language/variables/utilities/progmem/
データの作成に関しては上のリンク先の通りだが、余裕がありそうだったので8kHzとなっているところを16kHzのサンプリング周波数とした。
VMware上のUbuntuでXXDコマンドを実行した。

リンク先ではdelayで時間稼ぎをしているのだが、LEDを点滅させる関係上からTimerを使った割り込みの方が結局は楽が出来ると踏んだので、delayはやめてTimer1でタイミングを取ることにした。
最近、PICでやるときの余るほどの数のTimerに慣れてしまっているので、Arduinoのタイマーは若干窮屈だ。
斜めに調べた限りでは以下のような3つのタイマーがある。

使用状況はUNOの場合を示す。
Timer0~2がある。
Timer0 : 8bit、Arduinoの時間を管理する用途で利用、delay(), millis(), micros()など、5,6番ピンのPWM
Timer1 : 16bit、Servoライブラリ、9,10番ピンのPWM、TimerOneというライブラリ
Timer2 : 8bit, tone()、3,11番ピンのPWM、MsTimer2というライブラリ

つまり、予約というか他で使われているので、自分の用で使うなら何かを犠牲にしなければならない排他利用ということになる。

3番ピンのPWMはすでに音に使っているのでそっちを優先するとTimer2は使えない。
LEDの点滅より音の周期の方が細かいのでこっちに16bitを使うべきなんだろうという安易な考えで、音のタイミングにTimer1を使うことにした。
例によってTimerOneというライブラリが用意されているのでそのまま使う。

http://playground.arduino.cc/Code/Timer1

ってな感じだ。

あとはLEDの点滅だが、こちらはTimer0を使う。
ただ、ふと、millis();をやってるのがTimer0だと知った瞬間に、millis();の増分で判断するんでもいいかなって思ってそうすることにした。

何か支障が出たらちゃんと割り込みでやることにするが、当面はこれで問題なさそうだ。
モノ・アイは下のようになっているので、LEDは都合9個用意する必要がありそうだ。

贅沢にD4~D12までをそれぞれ1つのLEDに割り当てることにした。
だが、手持ちには昔作った8LEDの手作りのモジュールしかないので、1灯分はとりあえずあとまわしにする。
全部の点灯パターンをデータにして音と同様に持たせることにした。

このエントリーをはてなブックマークに追加

Posted under: Arduino系


コメントを残す

メールアドレスが公開されることはありません。

Time limit is exhausted. Please reload CAPTCHA.