次のステップは、LEDの取り付けです。 幸いなことに、レゴの穴の直径は正確に5mmなので、ダイオードは多大な労力で完全にフィットし、動作中に緩むことはありません。 彼はカソードを一緒に接続し、0.05の柔らかいワイヤーでアノードを個別に外側に持ってきました。 9本のコンダクターが見つかりましたが、エンジン出力は十分です。
次に、同期を処理する必要があります。 私のエンジンは最もシンプルです-ステップ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です。
次は?
- LEDをデジタル出力に直接接続するのではなく、スイングバーに直接取り付けることができる8ビットバスエクステンダーPCF 8574を介して接続することができます。 次に、8本(I2Cの場合は電源と2本)ではなく、4本の線で十分です。
- モノクロの代わりにRGB LEDを挿入して、色を「TV」にすることができます。
- Arduino UNOでは、USBポートはAtmel ATmega8U2コンバーターに接続されています。 デフォルトでは、コンピュータからはシリアルポートとして認識されますが、マウスやジョイスティックなどのように再プログラムできます。 外付けモニターとして認識できるようにできるのではないか?
参照資料
レゴを使用するというアイデアは、Michael Gasperiの本Extreme NXTから引用されました。 幸いなことに、Mindstorms NXTを300ユーロで購入する必要はありません。Arduinoを1桁安く購入することもできます。