オシロにラスタ形式で絵を描く
製作動機
ニコニコ動画やYoutubeでオシロスコープに絵を描いてる人をよく見かけます.
一度はArduinoで作ってみたいと思っていたのですが,最近になってラジオペンチさんのブログ(電装を作るときに参考にさせてもらいました,後日それについても記事を書く予定です)を眺めていたところ,「アナログオシロでラスタ形式の描画をする」方法が書かれていました.
ラスタ表示は中身が詰まったきれいな絵になりそうだと思い早速作ってみることに.
構成
プログラムは全く同じですが,部品は手元にあった物を使っています.
コンデンサと抵抗はRCローパスフィルタ用ですから,2つの積さえ一致していれば実質同じです.
・ダイオード:BAT43→1N4148
・コンデンサ:0.01uF(103)→0.1uF(104)
・抵抗:100kΩ→10kΩ
・Arduino:Uno→Nano
結果
ゲイン調整で少し苦労しましたが,とりあえず上手くいきました.
Z軸(輝度)入力は付いていなかったので,ADDで上に飛ばして表示しています.
それから
アナログオシロと言えばブラウン管,ブラウン管と言えば「イ」の文字,ということでこの文字を40×40pxで描くことにしました.
(世界で初めてブラウン管に伝送・受像されたのは走査線40本の「イ」の文字)
まずモノクロ画像からデータを取り出します.
gimpとTeraPadで画像ファイルをこねくり回すと,各ピクセルの0と1のデータが取り出せます.(本当はCでプログラム書いて自動化したかったんですが,Arduinoに慣れすぎたせいか変数の初期化などで詰まって諦めました)
[2018.12.19 追記]
C++を使って自動化できるようになりました.
あとは参考元と同様にビットとしてunsigned intに直して16進数に変換して…と行きたいところですが,この型は32ビットが上限であり40ビットは格納できないので,泣く泣く40×40のboolean配列に格納しました.
なお下手にCharやStringで定義すると,RAM不足でコンパイラに怒られるので注意しましょう.(現状でもRAM不足ぎみだと文句を言われています)
この値をタイミングに合わせて読み込みdigitalWriteすれば,次のような画面になります.
気になったこと
よく見ると,描画している絵は上に行くほど上下方向に潰れているような気がします.
元々RCフィルタで作った三角波はステップ応答を切り出した形で近似しているので,そこが影響しているのではないかと考えています.
オシロ側が悪い可能性もありますが,ファンクションジェネレータで確かめるのはまだ先になりそうです.
また,せっかく解像度を上げたのに縁の部分にギザギザが生じています.プログラムの問題かノイズが乗っているのかは分かりませんが,いずれ直したいです.
今後の展望
・画像・映像を大量に表示することを考えるとプログラム内に01を記録することは現実的ではないので,SDカードなどから読み込むようにする.
・様々なオシロで使うことを考えるとゲインやタイミングの調整が非常に面倒なので,基板上で変えられるようにしたい.
・オシロの画面を撮影するには長時間露光(1/15~1s)するので,手ぶれと映り込みを防止するため治具を作る.