電子工作」カテゴリーアーカイブ

カーナビでYoutubeを見る方法を探してつけてみようと思った Anycast導入編

ということで、カーナビでYoutubeを見るためにHDMIを使った接続をしてみよう、ただし480pなどの解像度もサポートされているようにしたい、ということで値段も手頃なAnycastを導入してみることにしました。ここからはかなり技術の話になりますので難しい表現が出てくるかもしれません。

 

Anycastの購入

つまりこれですね。

ただし、ある理由で購入には踏み切りづらいものがあります。というのも、

  • そもそも中国製で信頼していいのか悪いのか不明
  • 購入するサイトや発送元によっては互換品や偽物をつかまされる可能性がある
  • 正式な型番が何かが書かれていない場合があり、手元に届いたときに初めて型番がわかることがある

というものです。こればっかりはどうすることもできないかな、と思います。とりあえず上の画像のリンクで購入した場合は「私が購入した場合」はこれになりました。

Anycast M18 Plusd

「Anycast M18 Plus」というものです。安定版がM9 Plusだったのでそれになるのかな~と思ったらこれでした。M9 Plusより新しい世代ですので性能がよいことを期待しましょう。あと、金額も(現在は)2,200円ほどですので怪しげなサイトでもない限りはほしい場合は買ってみてもよいような気はします。自己責任ですが。

 

Anycastとは

ここで、Anycastについて確認しておきましょう。単純にいうと「Wi-FI経由でHDMIの信号を受信する端末」だと思えばよいです。現段階でスマートフォンと画像を送受信する場合は

  • Miracastを使う(Androidの場合)
    • AirPlayを使う(iOS系の場合)
    • GoogleHome経由でChromecastに接続する(Android,iOSともに可能)

といったものがあります。Anycastはこの全てに対応している…型番があります、というところです。型番によっては対応してないものがあったり、これらの接続の待ち受けを手動で切り替えたり、4Kまで対応していたりしていなかったり、とかなりブレがあります。なのでそこまで考えて購入するのであれば型番を指定できるサイトを使うべきかな~というのが実情です。

 

Anycastに接続してみる

使っている端末がAndroid系なので、Miracastの機能を使って接続してみました。セットアップなどは次のようになります。

  1. Anycastに付属のケーブルを接続する
  2. AnycastのHDMI端子をディズプレイなどに接続する
  3. AnycastのUSB端子を電源に接続する
  4. しばらく待つとディスプレイに待機画面が表示される
  5. スマートフォンの端末などでWi-Fiを有効にするとAnycastの端末が見える(待機画面に端末名が表示されている)ので、そのWi-Fiに接続する
  6. パスワードを入力する(初期パスワードから変更した場合でも待機画面に表示されているパスワードを入力すればよい)
  7. Wi-Fiを接続した端末でブラウザを開き、待機画面に表示されているIPを直接入力する
  8. 設定画面が表示されるので必要な設定を行う(特にこの後でカーナビに接続する場合は画面解像度の設定を忘れないこと)
  9. Wi-Fiの接続を切断する
  10. 画面を表示したい端末の設定からMiracastの機能を検索して接続する
  11. 画面に端末の画面が表示される

という流れです。ちなみにMiracastに相当する機能の名前は端末によって異なるらしく、Xperia系では「スクリーンミラーリング」、Zenfone系では「PlayTo」という名前になっているようです。

 

端末によってAnycastで動画再生をしたときの状態がかなり異なる

どちらかというとこの話が今回のメインです。まず、Miracastの機能は端末のパワーをかなり使うらしく、多少古い端末だったり、解像度が高めに設定されていると送受信が間に合わなくなり、音が飛んだり画像が飛んだりしてしまいます。ある程度力がある端末でやりましょう。

そしてAnycastが「スマートフォンなどの端末の画面を表示するもの」、ということから来る悲しい性質があります。その性質とは、次のようなものです。

  • Anycastの出力はアスペクト比が16:9を想定している(480p、720pなど)
  • 端末のアスペクト比が16:9でない場合、Anycastはレターボックスやピラーボックスにより、多少表示領域を削っても元の端末のアスペクト比の表示となるようにする
  • ここに(例えば)16:9の動画を表示しようとすると端末側はレターボックスやピラーボックスにより端末の画面に合うように表示する
  • ところが、Anycast側にはすでに端末の画面を表示するためのボックスが入っているため、動画が画面全体に表示されず、中央に少し小さめに表示されてしまう

おまけにカーナビの画面側のアスペクト比も16:9でない場合はレターボックスとピラーボックスが何段階にも挿入されて動画が中央に小さく表示、という現象が発生してしまうことが発覚しました。

簡単にどうにかできる方法としては「端末自体が16:9のアスペクト比のものを使う」です。こうすれば少なくても端末からAnycastの段階で画面が小さくなることは防げるので多少ましになります。

ちなみにこれが検証段階でわかったので、Youtube用の端末も用意する必要もあることを考えて、(私の中では)現役を引退していたZenfone3が復活する、という事態になったわけです。何じゃそりゃ…

 

Youtubeでの検証はまだ

適当なデータ通信用SIMを契約して入れてあげれば完成なのであとは処理能力との釣り合いがどうなっているか、というところですか…。

 

カーナビでYoutubeを見る方法を探してつけてみようと思った 考察編

というわけで、様々なサイトでやり方が紹介はされていますが、カーナビでYoutubeを見てみよう、という話です。正確にはカーナビでYoutubeやモバイル回線を使わないでスマートフォンに入っている動画をカーナビ上でうまく見られないか?というところから始まっています。ただし、このサイトは技術的な要素も大きく説明していますのでご注意を。

 

簡単な方法から準備に品物がいる例まであるが…

一応前提条件としては

  • Youtubeを見るための端末は用意されている
  • 端末はモバイル回線に接続可能、テザリングも可能、HDMI出力も可能
  • カーナビ側にはHDMI入力やRCA入力、USB入力、Bluetooth接続が可能

という条件はつけておきます。この条件がないと下の方法のいくつかができませんので気をつけてください。

 

音声(音楽)だけならかなり簡単

というか、ほとんどのカーナビは運転中に安全機能として映像を映すことができないような仕掛けになっていますので、後部座席にいる人(主に子どもを想定)に見せることがこの話の前提になってきます。運転中に動画を見ると集中力がそちらにとられて運転がおざなりになり事故を起こす可能性が非常に高くなりますので。

まずは音声(音楽)だけです。音声(音楽)だけならそれほど難しくはありません。その場合はBluetooth接続でBluetooth Audioモードにすればたいていは終わりです。それ以外の入力を使うとピットインしての作業が必要になってくると思います。

 

映像も見たい人向け

やっと本題です。可能性がある方法としては

  • USB接続する(Apple CarPlay、Android Autoなど)
  • HDMI出力をRCAコンバータを通してRCAで入力する
  • 端末のHDMI出力とカーナビ側のHDMI入力をつないでHDMIで信号を送る
  • Wi-FI経由で映像を飛ばしてHDMIに変換して入力する(AppleTV、FireTVStick、Anycastなど)

なんですが、これがまた知識がないとかなり難しいです。

 

USB接続を使った方法はかなり知識が必要

というか、前提条件として「CarPlayやAndroid AutoにYoutubeを見る機能はどこにもない」ということなんです。つまり、この方法はすでに破綻しています。無理にやろうとすると特別なAndroidが入った端末をUSBで接続することでYoutubeを見られるようにすることなのですが、買う端末の種類や使い方がわからない人は怖すぎて無理があると思います。常にテザリングをしないとだめですからね。

 

RCA接続も初期投資が大変

そもそもRCA接続するための端子はカーナビの裏側にあることがほとんどなので、一度裏側にアクセスして線を接続する必要があります。結局一度ピットインして作業する必要がありますし、変換のための機材が必要になってきます。調べた限りだとこれが有効でしょうか。

BeatSonicの「IF36」というもので、HDMI入力をRCA出力に変換するものです。車用品らしく、電源も12Vから直接とれるようになっています。もちろんこれだけではなく電源端子からとるような細工をしたり、RCAケーブルをカーナビに接続したりするので一度カー用品店に相談する必要はあると思います。それが終われば普通に見ることができそうです。

 

HDMIでもちょっとした細工が必要

HDMIの場合はカーナビ側の前提条件を確認する必要があります。ここ数年間で発売されたカーナビにはHDMIの入力に前提条件がある場合が多く、それが「入力の画像解像度として受け入れ可能なものが480pしかない」というパターンです。

で、これの何が問題かというと「Youtubeを見るための端末がある程度高性能(もしくは逆にかなり古い)でない限りはHDMIの出力解像度として480pをサポートしていない」ということが考えられるからです。この場合、HDMI出力にそのままつないでも映像を見ることができません。

実際、私が自分のカーナビと端末(スマートフォン)がこの状態で、スマートフォンの画面が横長になっていると16:9の出力モードを持っていなかったり、持っていても1080pしかない、なんてパターンがかなりあります。ということで、直接接続だけだとうまくいかないパターンがかなりあるということは認識しておいてください。そうなると考えられる方法は、

  • HDMIコンバータを通して解像度を強制的に固定させる
  • 480pを出力できるHDMI出力器にWi-Fi等で接続して映像送信をする

となってしまいます。それぞれ見ていきましょう。

 

HDMIコンバータは…うまくいくのか?

商品的にはこれが可能のように見えるのですが、試していません。

BeatSonicの「IF33A」です。本来はHDMIの信号を2つのディズプレイに送信するためのもので、フロントモニタとリアモニタに送る、という機能がメインです。が、これの副機能として「送信するときの解像度を720pや480pに強制的に固定する」機能があります。この機能を利用してHDMI入力に入れてしまおう、という発想です。

まあ、電源が12Vからとるようなケーブルになっていますのでシガーソケットからとるように細工するには手間がかかりますし、値段もそれ相応なのでやっぱり初期投資が必要です。さらには今のスマートフォンから入力させたら本当に480pにできるのか?がわからないのが痛いです。他の人のレビューを見ている限りはできそうな気はするのですが…

 

無線接続を考える

ということで、最後のWi-Fi経由で接続する方法です。この辺になってくるとほかのサイトに解説を譲った方が早そうですね。とりあえず欠点だけ先に書くと

AppleTV:100V電源端子が必要なのでシガーソケットからの変換などが必要。少し大きい。Android系は不可。

FireTVStick:Wi-FI接続が必要なのでテザリングやWi-Fiルータが必要。ネットからの動画は見られるがスマートフォンに入れてあるコンテンツは直接見られない。

Anycast:種類がありすぎ+説明書がわかりづらいなど初心者には難しい。接続が安定せず切れることがある。iOS系から接続しようとするとWi-Fiルータに接続する必要がある。買うサイトを間違えると変なものをつかまされるかも。

ということで、どれも一癖二癖あるのが実情です。もちろん、このサイトは技術系なのでAnycastに挑んでみようと思います。はずれをひかないように注意して試してみたいと思います。

 

 

micro:bitのタスクシステムを考察してみた

というわけで、なんとなく気になったので書いてみたくなったネタです。電子工作系と教育系を兼ね備えるものといえばmicro:bitな訳ですが、そのタスクシステムにちょっとした疑問があるので考察して+調べてみよう、というわけです。

 

MakeCode(Scratch)でmicro:bitのプログラムを作った時を前提とする

micro:bitで動くプログラムを作ることができるツールはいくつかあるわけですが、今回はMicrosoftのMakeCodeを前提としたいと思います。MuやらPython Editor for micro:bitやらあるのですが、小学校や中学校でも使えるレベルで、となると大半がMakeCode経由のような気がしますので、これで話をしたいと思います。

 

「ずっと(forever)」を何個も使うと一体どんな実行のされ方をするのか?

まずはこれを見てください。

 

MakeCodeである3つのブロックを使おうとしたときの状態です。見てわかるとおり「最初だけ」のように複数あると意味がわからなくなるものや「ボタン○○を押したとき」のように、入力の割り込みによって動くのものは1つしか有効にならないようになっています。これはわかります。

ところが、「ずっと(forever)」に当たるブロックを作ろうとすると上の図にあるように2個作ってもどちらも有効です。なお、基本的には何個でも有効になります。つまり、「すべて動作させることができる」という(プログラムをやったことがない人から見ると)不思議な現象が発生します。だとすると「Aをずっと繰り返す」「Bをずっと繰り返す」「Cをずっと繰り返す」を同時にしたいときに「A、B、Cの順にしてそれを繰り返す」のように無理に直列化して書かなくても個別に書いてよい、ということになるのでしょうか。これをちょっと見てみたいと思います。

 

次のように書くとどう実行されるのか?

というわけで、こういうプログラムを作りました。

「ずっと」ブロック×3と「ボタンAが押されたとき」の動作です。ちなみにこれはちょっとしたトリックがあって、「ずっと」のブロックの上下が0の出力と256の出力だと256の出力が下になるように配置しています。

で、これを(あくまでシミュレータ上ですが)実行するとこういう動きになります。

「0を出力」→「256を出力」→「512を出力」→「0を出力」→「256を出力」→「512を出力」→「0を出力」→…

つまり、「ずっと」のブロックを上から3つを順番に回しながらに実行しているだけ、となりました。ちなみにボタンAによる割り込みをかけてみたのですが、「ずっと」による実行順番は変わらず、という結果になっています。あくまでシミュレータ上ですのでオシロスコープなどで実機計測すると微妙に違うかもしれません。

これについてはある程度推測ができて、

  • 「ずっと」ブロックを使うとそれぞれがタスクとして独立に実行待ちキューに入る
  • 実行時間になると実行待ちキューの先頭にあるタスクが実行状態となり実行される
  • ブロックの実行が終了すると再度実行待ちキューの最後に入り待機状態となる
  • 割り込みは特別なタスク扱いとなり、「ずっと」のタスクが実行されていないときにチェックされて状態が確認されればタスクとして実行される

という動きになっているのではないか、というものです。で、これをチェックするために「このプログラムをPython(もどき)で表したもの」とタスク実行に関する説明書(のようなもの)を見て確認してみました。

 

このプログラムをPythonで表すと…

MakeCodeのPythonで表す機能を使ってプログラムを変換するとこうなりました。

def on_button_pressed_a():
    pins.analog_write_pin(AnalogPin.P0, 768)
input.on_button_pressed(Button.A, on_button_pressed_a)

def on_forever():
    pins.analog_write_pin(AnalogPin.P0, 0)
basic.forever(on_forever)

def on_forever2():
    pins.analog_write_pin(AnalogPin.P0, 256)
basic.forever(on_forever2)

def on_forever3():
    pins.analog_write_pin(AnalogPin.P0, 512)
basic.forever(on_forever3)

どうでしょうか。「ずっと」の3つのブロックがon_forever関数、on_forever2関数、on_forever3関数の3つとして定義され、basic.forever関数を呼び出して渡されています。このコードとシミュレータの動きから推測するとbasic.foreverの動きは「渡された関数を(無限実行をする)実行待ちキューに登録する」ものだと考えられます。リファレンスのbasic.foreverの説明ではforeverのループとeventのループについて少し書いてありましたが、この動作については明確には改訂ないような気がします。

 

タスク実行に関する説明から考察してみる

で、このforeverの動きや「バックグラウンドで実行する」とはどういうことか?を説明しているのが(直リンクは張りませんが)「The micro:bit – a reactive system」というところです。micro:bitのタスク実行について実行間隔やポーリング、タスクを並行(Concurrent)で実行する方法について、ボタンを押す、などのイベントがあったときにどう動くのか?といったことについて詳しく書いてありますので見てみるとよいと思います。プログラム、特に組み込み処理に関して詳しい人ならば読めると思いますが、今回の処理に必要な部分を読んでみると、

  • サブルーチン(この場合はforeverとして登録されるタスク)を登録するときには優先度がないタスクとして実行待ちキューに入る
  • 一時停止(Pause処理)がタスク上で発生したときに一時停止キューで時間待ちを行う
  • システムによりタスクが実行可能となったときは実行待ちキューの先頭にあるタスクを削除し実行状態に戻す
  • 実行終了するか一時停止時間が経過したサブルーチン(foreverタスク)は実行待ちキューの最後に戻す

と書いてあることから上の考察の大半は合っているのではないか、と思われます。

 

「ずっと」ブロック内の時間待ちについて

micro:bitの時間待ちのうち「一時停止」よる時間待ちは上の説明から「一時停止キューにタスクを移す」ことにより待ちを行っていますので一度実行状態から抜けることになります。そのため、別のforever処理や入力割り込みによる処理などがあればそれを実行する時間がとれることになります。しかし「whiteなどによる無駄ループを使った時間待ち」は上の説明からmicro:bitのタスクとして待ち状態や実行待ちには移らず実行状態のままになりますのでタスク切り替えがうまくできません。そのため、入力の検知などを行う時間で割り込みそのものは検知できるのですが、割り込み後に動かすルーチンは実行待ちキューに移されるだけとなり実行されない、ということになるかと思います。

これは特にforever関数で長い処理を実行するタイプのタスク+ある程度の反応速度が求められる処理だとちょっと厳しいことになるかと思いますのでロボット操作をやるときやある程度速い周期で処理する必要があるルーチンでは気をつける必要があるかと思います。そもそもタスクの切り替え周期もどれだけ出せるのか微妙なところですか。

 

単に教育用として簡単なものを作るだけなら知る必要はないが…

例えば自由研究などで複雑なプログラムを作り実行させるとうまく動かない、というときにこういうことが絡んでいる可能性はあるかな~という例でした。MicroPythonを入れる例だとこういう風に動くのかどうかはまた別の検証が必要そうなので今はしません。ADVゲームシステムなどで本体内に別のスクリプトシステム(Luaなど)を使うタイプだと似たような現象が発生するのでちょっと調べてみた、というところにしておいてください。はい。

 

 

Arduinoのシールドを使うときはピンアサインを確かめよう

常識的なことかも知れませんがこういうことを書いておくのは悪いことでは無いと思うので書いておきます。

さて、今回はArduinoのシールド(Shield)についてです。Arduinoの機能を拡張するボードでArduinoの上に重ねて配置していきます。複数使うことができる物もあり、それに対して連動して処理を作ることもできます。例としてはモータードライバ+USBホストコントローラという組み合わせでしょうか。モーターをUSB機器から制御する物で、USBホストコントローラにBluetoothのドングルをつけてやるとBluetoothから制御できますし、それ以外の機器でも制御ができる様になります。

しかし、こういう風に組み合わせるときには「組み合わせるシールドのピンアサインをあらかじめ調べておく」必要があります。これは制御ICが同じ物であっても出しているメーカーによってはArduinoと通信するデジタルピンのアサインがかなり異なるからです。今回はちょっとその例を出してみたいと思います。

ちなみに以下で出てくる加工をもし行う場合はは自己責任でお願いします。

 

同じメーカーが出しているのに同時使用ができないとは

購入した店で扱っていたのがSparkFunの製品で、今回対象にしたのは

[amazonjs asin=”B0081XM8US” locale=”JP” title=”Arduino用モータードライバシールド「Ardumoto」”]
[amazonjs asin=”B0081X5F6W” locale=”JP” title=”スイッチサイエンス USBホストシールド”]

の二つです。どちらも単体としては普通のシールドです。一応今回の工作ではモータードライバシールドを使って動く物が作れたので良かったのですが、それはまあ置いておいて。

問題はこの二つの製品のピンアサインです。どういうことかと言いますと

  • モータードライバ:ピン3,11~13を使用
  • USBホストシールド:ピン7~13を使用

というように、この場合はピン11~13が重複していることになります。こうなると基本的に正しい動作を望むことができなくなり、この二つは同時に使用できない、ということになります。無理に同時使用するならおそらくモータードライバシールドを加工することになると思うのですが

  1. ピンヘッダが付いている状態で半田付けで以下のピンを基板の裏側でつなぐ(できるだけ根元で)(3pin=>5pin、11pin=>6pin、12pin=>2pin、13pin=>4pin)
  2. 3、11~13pinの半田付けした部分より下をラジオペンチで切断する(絶縁処理でも可)
  3. このモーターシールドを使用するときは最上段になるようにし、PWM A=>5pin、DIR A=>2pin、PWM B=>6pin、DIR B=>4pinで使用する

という方法が考えられます。が、やりたくはないですよね。失敗すると数千円+手間が吹っ飛びますから。またはICの足を持ち上げてプリント基板から切り離した上で線を接続する、という方法もありますが、それもそれで大変ですね。それよりはピンアサインがかぶっていない基板を探す方が簡単ですよね。たとえば秋月電子通商が扱っているモータードライバシールドとUSBホストシールドの組み合わせだと

  • モータードライバ:ピン4~7を使用
  • USBホストシールド:ピン8~13を使用

で重複していないため同時使用が可能です。本当はモータードライバだけでも大丈夫だと思ったのですが、SparkFunの製品だと7pinをUSBホストシールドのリセットピンとしてアサインしているためカットかICの足を持ち上げる加工が必要です。カットの場合は元に戻すことは基本的にできないですし、ICの足を持ち上げるのはICのピッチが狭いのでよほど慣れていないと失敗します。(一応この後の手順を紹介すると、足をカットした場合は7pinとRSTピンを裏側で配線すればOKのはず)

 

この辺の加工も醍醐味と言えば醍醐味

うまく使える様にピンをわざと切ってしまうのもおもしろいと言えばおもしろいです。実際、SparkFunのモータードライバシールドでは外部電源を入れようとするとVinと直接つながっているため、そのままではなんとモータードライバシールドに電源をつなぎ、Arduinoには電源をつながずに乗せるとArduinoに電源が入ります。モーターの電力の問題から単一の電源でやるときにはこうした方がいいかもしれませんがまあ何とも。対処法としては(試していないので何ともいえませんが)ArduinoにつながるピンのうちVinを切断するとこの問題は解決できると思います。別のモータードライバシールドだと外部電源との分離設定が基板上にあることもあるのですが。

ただ、SparkFunの基板はほかの完成基板と違って空き領域にユニバーサル基板の様な配線を組める領域があるのでこちらで自分が考えた回路を実装することで拡張することができる分うまく回路を組めばさらにスタックする必要が無いことがないのが特徴でしょうか。素直に別の基板をスタックすればすむだけと考える人もいるかも知れませんが、高さを抑えることができる分いいかもしれません。

 

ほかの基板でもこういうピンアサインの問題はあるので購入前には調べましょう

調べなかった私が悪いのかも知れませんが・・・。組み合わせで対象の動作ができることは分かっても組み合わせそのものができなくなるのは想定外でしたし。まあいろいろと楽しませていただきました、ということで。

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の仕掛けを作るのが面倒ですか。