棒状の器具にLEDが並び、棒を振ることでLEDがタイミングよく点滅して、何もない空中に文字や図形を表示できるおもちゃがあります。
「棒を振ると、空中に文字」で検索(別ウインドウが開きます)
今回はこのおもちゃの真似事をしてみたいと思います。
早速、工作に必要な部品をリストアップしてみましょう。
必要な材料(部品等)は以下の様な感じでしょうか?
完成したら、装置全体をぶんぶん振り回すことになるので、ブレッドボード+ジャンパ線的な配線では強度不足でしょう。等々、モノづくりの課題が山積みだと思われます。
そこまで気合い入れて作る元気は無いな〜。
必要な材料(部品等)は以下の様な感じでしょうか?
前節の工作と違って、棒の振り始めを検知するセンサ類が必要ありません。サーボモータでRGB LEDパネルを振り回すので、タイミングはソフトウェア(プログラム)で制御可能だからです。
RGB LEDパネルをサーボモータに取り付けて振り回させておいて、うまくタイミングを合わせてLEDを点滅させると、空中に文字を表示できるだろう、と言う魂胆です。
可動するのは2軸カメラマウントと、そこに取り付けたRGB LEDパネルだけですので、配線を長めに確保しておけば、動きの分は吸収できるでしょう。恐らく、ブレッドボードを使った試作で十分なので、モノ作りの難易度が一気に低下します。
こっちを採用、です。
現実世界では、物体と物体が接触すると、その間に摩擦力が働きます。摩擦力には大きく分けて以下の2種類が存在します。
一般に、静止摩擦力>>動摩擦力です。これをモータの回転🔄に当てはめてみましょう。
これを念頭にシステムを構築します。
制御手順は以下の通りです。
データシートなどによると、今回使用するサーボモータ(SG90)の回転速度は、大体0.1s/60°くらいの様です。
180°回転するのに必要な時間air_MS180≒300msとなります。
制御プログラムで、サーボモータを回転させ始めた時間を0sとして時間を計測します。T[ms]後には、サーボモータは約T[ms]/air_MS180×180°の回転角度に到達しているはずです。
では、180°の中に何文字くらい表示できるでしょうか?まず、1ドットを回転角度に換算しましょう。
定数air_DGPDTを1ドット辺りの回転角度[°/ドット]とします。回転可能な範囲は0〜180[°]なので、180°回転する間に表示可能なドット数は、180°/air_DGPDT[ドット]です。
8ピクセルのRGB LEDパネルを使うので、8×8[ドット]のASCIIフォントを使います。すると、180°回転する間に表示可能な文字数は180°/air_DGPDT/8ドット[文字]となります。
air_DGPDT=3[°/ドット]に設定してみると、180°に表示可能な文字数はおよそ7文字となりました。
※表示したい文字数から逆算するなどair_DGPDTを小さくすると、もっと多くの文字数を表示できますが、ドットとドットの間が詰まってしまって視認性が低下します。実際に確認しながら調整して見てください。
1ドット表示するのに、8ピクセル分の表示データをシリアルRGB LED(WS2812B)へ送信する必要があります。
データの送信時間については「#11-2 円形配置RGB LED(WS2812B)を使う」に解説があります。
データ送信時間(概算)=50μs(リセット)+1.25μs×24ビット×8ピクセル=290μs
サーボモータの180°回転時間はair_MS180[ms]なので、1ドット分のair_DGPDT[°]回転するのに要する時間は、約air_MS180/180°×air_DGPDT=5msだと解ります。
データ送信時間約290μs(=0.29ms)に比べて十分大きいので、送信データの準備時間を考慮に入れても、破綻することは無いでしょう。
※もっと高速回転できるサーボモータを使ったり、air_DGPDTを小さくして解像度を上げたりする場合には、データ通信速度を考慮して破綻しないように設計してください。
以下に完成した制御プログラムをリンクしておきます。
制御プログラム:air_display.ino
コンパイルしてUNOへ書き込むと、シリアルモニタから以下のコマンドを受け付けるようになっています。
シリアルモニタコマンド仕様:
今回はArduino UNOを使いました。RGB LEDパネルもサーボモータ(SG90)も5V定格なので、同じく5V定格のUNOが使い易かったと言うのが主な理由です。
いずれの応用も、制御の基本は前節にリンクしたプログラム(air_display.ino)と同様ですので、各自工夫して見てください。
以下図が今回必要な回路図です。
Arduino UNOの指定端子(D3,D4)とGNDを接続してください。また、RGB LEDパネルもサーボモータ(SG90)も、電流を沢山消費するので、Arduino UNOの5Vピンソケットからの給電では足りません。別途、以下図の様な電源モジュールを使って、電源を供給してください。
以下図に実験中の様子を示します。
実験サンプル:【 】内はシリアルモニタからの送信データ
【demo】
OK: demo finished
【demo】コマンドを実行した時の様子を以下動画にしておきました。
サーボモータの回転速度がSG90の実力頼みになっているので、ちょっと回転が安定していないようです。RGB LEDパネルへ発光データを送信するデュポンワイヤも、サーボモータの回転に伴って動いてしまうため、やっぱり、ブレッドボードでの接続では、時々通信エラーが起きているような感もあります(上動画でも、時々表示が消えている個所がある)。
それでも何とか、意図した文字が表示されているように見えました(少なくとも筆者には!(1^^;))。以下図は、動画から抽出した、空中に表示された文字です。
サーボモータの回り出しである「H」の文字幅が少し狭くて、代わりに次の「E」が間延びしているように見えます。その後の「LLO」は、ほぼ等幅ですね。(ちょっと緑の「L」が狭いかな?)LEDの更新は一定時間毎に実行しているので、サーボモータの回転速度が一定していないためだと考えられます。
※そういえば、表示中に割り込みを禁止していなかったな……。システムタイマ(TC0)の割り込みが発生すると、上図の「E」みたいに間延びして見えるのかも?……ただし未確認、なので必要に応じて各自対応してください。
モノ作りが手間ですが、手で振るタイプの器具を制作して、手動で振り回した方が安定するかも?です。そちらの作成は、モノ作りが得意な皆様へ譲ります……。