Arduinoで遊んでみた

しばらく更新が止まったままになっていたりする物もありますが、たいていの原因はこれです。とある都合でArduinoでいろいろと実験してみる必要が出てきたのでArduinoを購入していろいろと実験をしていた、というわけです。ただ、ブレッドボードを持っているわけではないので実験用の回路を作ってみるのでも一度簡易的であれ回路図を作った上でユニバーサル基板上に落として部品を組み立ててみる、という工程を取っているのであまりにも効率が悪かったりします。たぶん次はRaspberry Piも試すことになると思うのでそのときはブレッドボード(+ジャンパ線)を購入して試せる様にしたいと思います。まあ、今回はちょっとしたテストなのでそれほど複雑なことは考えずにがんがんやっていった結果、で書いています。

 

実験レベルの物なら31.5kBものメモリを使うのは難しいよね・・・と思ったら

いきなりいろいろと話題に入っていきたいと思います。プログラムでは映像系や音楽系などが好きな人間なのでその手を初めに試すのがやり方なのでまずは音を鳴らす様なルーチンを組んでからそれを拡張を、とやっていったわけですが、いろいろと大変でした。音楽系については外部のチップを使わないパターンでもArduino Tone Libraryやその他いろいろな人がライブラリを使っていますのでそれを使えば意外とあっさりと音を出すことはできます。動作的には大変ですが、プログラム上でミキシングなどもできますしね。音系に関してはピンの制約も大きいので回路を作る場合はそのあたりは気をつけた方がいいです。最低でもPWMを使えるピンにつなげた方がいいですし、アナログ的な波形を作り出すときにはハードウェアカウンタの協力が必要なので。

で、調子に乗って楽譜を組み込んで再生させてみよう、というわけではまったのがこの現象。Arduinoではコード実行中に読み込み専用となるデータの場合はフラッシュメモリ上に残したままで実行が可能で特殊な命令で読み込む、ということ基本となります。そのため、通常メモリ内に楽譜データなど意外と大きいデータを置いたまま実行すると実行にプログラムが使用できるメモリはそれほどない(最も一般的と思われるArduino Unoで2kB)なので、フラッシュ内に残る様に指示をしないとローダーで読み取られるプログラム部+データ部で2kBを使い尽くしてプログラムが実行できない、という間抜けな状態になってしまいます。そのあたりはいろいろと考えましょう。

ちなみに、フラッシュメモリにデータを残したままにしても楽譜の様にどれだけでもデータとして組み入れることができる物を考えると31.5kBなんて意外とあっさりと食われます。たとえば8bitのPCMデータをフラッシュメモリに転送してArduino経由でPWMを使って再生する、なんかをやると少なすぎることになりますからね。音楽系でArduinoを調べるとMIDIやFM音源、といった要素に行き着くことが多いのも当たり前と言えば当たり前ですからね。

 

ハードウェアを直接動かすプログラムは楽しい

いつもはPCやiOSなどのプログラムを組んでいるのでだいたいはOS上で管理される資源にアクセスするだけなのですが、Arduinoのようになってくるとたとえばデータによっては1byteを争う様なことも多く、列挙型がint型と同じメモリ容量を使う=2byteを使うのでフラッシュメモリ内に置くのであればbyte型の使用を検討してみたりやタイマ割り込みを使うためにライブラリではなく自前で各種レジスタにアクセスして処理を作ってみたりや、最後にはライブラリ関数を使わずにいくつかの処理をハードウェアを直接たたいて使うことで動作速度を向上させていったりとか。こういう変なチューニングはOSの動作の中で、に慣れきった状態からだと余り思いつかないですからね。画像処理などでSIMDの演算を使う、ということはないわけではないですが。

あとはプログラム以外にもスイッチからの入力やLEDやスピーカーを回路を構成して配線することで直接制御するなどプログラムの醍醐味でもある「自分の思ったとおりにハードウェアを動かす」というのがPC上でのプログラム以上によく見えるので少しC言語を勉強した後であれば教育用の教材としてもおもしろいかも知れないな~と考えながら実験をしていました。回路の知識もある程度必要なので純粋なプログラムとはちょっと違うかも知れませんが、それでもおもしろいことに変わりは無いです。別のチップと組み合わせてみたり、というのも知識さえあれば遊べますからね。

今からの季節だと一番あり得そうなのが「クリスマスのイルミネーションをArduinoで制御する」と言った発想でしょうか。出力端子はArduino Unoで13本(PWM制御を使用する場合でも6本)あるのでそれにオペアンプやパワーMOSFETなどをドライブさせてLEDをちかちかさせればツリーレベルでもどうにかできるはずですし。絶対にできることは保証しますがLEDの仕掛けを作るのが面倒ですか。

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

この記事のトラックバック用URL