レゴとArduino機械式ディスプレイ

教科書を信じているなら、最初の「テレビ」はニプコフのディスクで機械的にスキャンされました。 もちろん、誰もがテレビの独自の定義を持ち、家庭での使用にはメカニックはほとんど役に立たないが、私は機械式ディスプレイを作ってみることにした。 幸いなことに、8歳のモーターの専門家がこの家族に現れ、彼は「ハードウェア」をインストールの一部にしました。 Lego Power Functions Medium Motorは9ボルトで駆動し、クランクメカニズムの助けを借りて、数ヘルツの周波数でバーを15の穴にスイングできます。



メカニカルスキャン



次のステップは、LEDの取り付けです。 幸いなことに、レゴの穴の直径は正確に5mmなので、ダイオードは多大な労力で完全にフィットし、動作中に緩むことはありません。 彼はカソードを一緒に接続し、0.05の柔らかいワイヤーでアノードを個別に外側に持ってきました。 9本のコンダクターが見つかりましたが、エンジン出力は十分です。



LED



次に、同期を処理する必要があります。 私のエンジンは最もシンプルです-ステップ1ではなく、エンコーダーがないので、フォトセルでサイクルの始まりをキャッチすることにしました。 モーターの後ろには、細いチューブを通して輝く明るいLEDが補強されています。 各回転での光線は、クランクと交差し、フォトレジスタを暗くします。 外部照明からの干渉を減らすために、彼はLEDを正確に、またチューブを通して見ます。



フォトセル



フォトレジスタは、2つのレゴブロックの間に挟むだけで固定されました。



フォトセル



これで、設計をArduinoに接続することができます。 LEDを150オームの制限抵抗を介してデジタル出力に接続し、フォトレジスタをADC入力に接続しました。



回路図



その結果、私の「テレビ」は次のようになり始めました。



機械式ディスプレイ



フォトレジスタが暗くなるのを待つ簡単なプログラムを入力し、指定された間隔で必要なデータをデジタル出力(2..9)で撮影します。 1ピクセルの水平サイズは、手動で選択した遅延によって決定されます。私のインストールでは、最適値は2.3ミリ秒でした。



/* Shows a picture on mechanical desply connected to Arduino Display's LED connected to digital pins 2..9 via 150 Ohm resisitors Photoresistor connected to analog pin 0 and GND. It is also connected to 5V using 10 kOhm resistor. */ void setup() { for (int i = 2; i <= 9; i++) { pinMode(i, OUTPUT); } } // Bit map of the picture (right to left) that we are going to show unsigned char Pivo[] = { B01111100, B10000010, B10000010, B10000010, B10000010, B01111100, B00000000, B00000000, B01101100, B10010010, B10010010, B11111110, B00000000, B00000000, B11111110, B01000000, B00111000, B00000100, B11111110, B00000000, B00000000, B11111110, B10000000, B10000000, B10000000, B11111110 }; void loop() { // Wait for the synchronization (photoresistor covered by the motor bar) waitForBegin(); // Do not start from the imidiatelly as the LED beam is moving too slow in the first milliseconds delay(20); int del = 2300; // pixel "length" in microseconds for(int i = 0; i < 26; i++) { showByte(Pivo[i], del); } } void waitForBegin() { while (analogRead(0) > 650) { delayMicroseconds(200); } } void showByte(int info, long del) { // Light LEDs if necessary for (int i = 2; i <= 9; i++) { digitalWrite(i, (info & 0x01) ? HIGH : LOW); info >>= 1; } // Wait a little if (del < 30000) { delayMicroseconds(del); } else { delay (del/1000); } // Turn LEDs off for (int i = 2; i <= 9; i++) { digitalWrite(i, LOW); } }
      
      





さあ、息を止めて、電源を入れてください。ここが素晴らしい瞬間です!



稼働中のデバイス



水平方向に30ピクセル、垂直方向に8ピクセル程度の解像度で、遅延が小さいとピクセルが圧縮されすぎます。 フレームレートは毎秒約5です。



次は?




参照資料


レゴを使用するというアイデアは、Michael Gasperiの本Extreme NXTから引用されました。 幸いなことに、Mindstorms NXTを300ユーロで購入する必要はありません。Arduinoを1桁安く購入することもできます。



All Articles