Arduino Pro Mini用のLED点滅ストップライト

Arduino Miniのストップライト用の点滅LEDストリング 車のリアウィンドウにステッカーを貼りたくなかっただけです。夜間に誰が車を通り過ぎるのか、碑文に対する反応はどうなるのかはわかりません。 リアウィンドウの下にLEDの碑文を作成することにしました。 非アクティブ時には、まったく表示されません(背面の色付きガラス)。また、必要に応じてオン/オフを切り替えることができます。 まあ、少し後で、ブレーキライトが点灯し、赤いLEDで碑文を作成するときにのみ碑文をオンにするというアイデアが浮上しました-停止信号の単純な複製が得られますが、追加情報があります。 作業はすべて午後3時でした。



もちろん、ランニングラインまたはライトボードを購入してリアウィンドウの下に置くだけです...しかし、これらのデバイスの価格を超えてすぐに、それはすぐにお金に残念になり、自分でやることに決めました。



まず、ハードウェアを決定しました-これはArduino Pro Miniで、eBayで4ドルかかります。 なぜ彼女なのか? 豊富でさえ、それで十分だからです。 LEDの輝度を制御できるように、LEDをPWMチャネルに接続することが計画されていました。 Arduino Miniにはこれらの出力が6つしかありません-これで十分です。 実際、Arduinaは私たちの仕事に絶対に適しています。



Arduino Pro Mini 次に、碑文を決定し、6つの独立したセクションに分割しました。 これは非常に多くのことが判明したため、5つのアクティブなものだけを残し、Prozapas用に1つのチャネルを計画しました。 各セクションでは、2〜4文字になっており、各文字には約10〜20個のLEDが必要です。



ご存じのとおり、Arduinoの出力は40mAしか消費しません。このため、このような大規模なLEDをArduinoの出力に直接接続しても機能しません。 この問題を解決するために、P16NF06 MOSFETが使用されました。これは、ザシャシニクに20人いる強力なフィールドワーカーです。 最大1アンペアまで電流を切り替えることができます(たとえば、長さの短いLEDストリップを静かに引っ張ります)。 代わりに、より安価な単純なバイポーラトランジスタを使用できます。 ただし、MOSFETはArduinoピンに直接接続できます。 入力インピーダンスが高く、同じ理由で、抵抗器の形のボディキットは必要ありません。



次に、在庫から約130個の赤色5mm LEDを割り当てなければなりませんでした。 残念ながら、私は手にそれほど多くの赤いLEDを持っていなかったので、私はいくつかの文字を緑にする必要がありました。 ご存じのように、LEDは抵抗を介して接続し、電流を制限する必要があります。 6個を直列に接続し、抵抗を介してこのLEDブロックを+ 12Vに接続することが決定されました。 6個のLEDと12Vの供給電圧の場合、約50オームの抵抗が必要であることが経験的に計算され選択されました。



将来のデバイスの主なポイントが示されているので、ビジネスに取りかかりましょう。



パネルの基礎として、古い箱から普通の段ボールが取り出されました。 80x15 cmの2つのストリップを切り取りましたが、このサイズは車のリアウィンドウの下に配置するのに最適でした。 次に、テキスト行がプリンターで印刷され、文字のフォントが選択されました-サイズがCalibri 300で、段ボールに貼り付けることで、碑文がストリップに転写されました。 ピンセットを使用して、LEDに穴を開けました。 ここでは、LEDが6個のブロックで接続されていることを考慮する必要があるため、6の倍数のLEDの数を各チャネルに接続する必要があります。 原則として、これは他の数量から一連のLEDを作成し、それらを12Vに接続するための抵抗を計算することで回避できます。



DIY LEDパネール



また、LEDの脚をそのままにしておくことも非常に重要だったので、他のデザインで使用できるようになりました。 したがって、脚を接続するには、わずかに折り返して互いにはんだ付けします。 要するに、構造は約3時間で組み立てられ、はんだ付けされました。



DIY LEDパネール



Arduino Miniは通常、脚なしで販売されているため、最初に行うことは脚をはんだ付けすることです。 それはほとんどArduino Nanoであることが判明しましたが、3.3Vなしでのみ:)



画像



コントローラボードを挿入するためのコネクタもブレッドボードにはんだ付けされています。 次に、MOSFETをはんだ付けして、1つのヒートシンクをネジ止めします(ただし、電流は非常に小さいため、ここではヒートシンクは不要です)。 Arduino MiniのPWMピン3、5、6、9、10、および11は、対応するMOSFETの対応する入力にはんだ付けされています。



画像



DC DCコンバーター 次に、タスクはArduino Miniに安定した電力を供給することでした。 ご存知のように、車のシガーライターからは12Vが得られますが、この電圧は車を使用している特定の時間で13ボルトと14ボルトになる可能性があります。 Arduino Miniのドキュメントには、最大供給電圧は12Vを超えないことが記載されており、わずかな過剰でもボードが無効になる可能性があることがフォーラムで読まれました。 そのため、Arduinoに電力を供給するために、個別の調整可能なDC-DCレギュレーターを使用することが決定されました。 EBayで注文することもできます(1ドルの費用がかかります)が、自分で組み立てることができます。 私はそのようなブロックを持っているので、私は既製のものを使用しました。 したがって、12Vは個別のスタビライザー(または最大30Vまで)に供給され、出力は、たとえば6Vに設定され、Arduino MiniのRAW出力に供給されます。 LEDは(MOSFETを介して)12Vから直接給電されます。




プリント回路基板の設計を思いついた結果、次の要素の配置を得ました。



画像



これで、すべての信号がオンになる信号によって決定する時が来ました。 最初は、デバイス全体を車のブレーキライトに直接平行に接続することが計画されていました。 しかし、残念なことに、電圧がArduinoに印加されると、コントローラーが初期化され、1秒よりかなり長く続きます。 さらに、スイッチをオンにした直後、Arduino出力はZ状態にあり、MOSFETは非常にランダムな方法でこれに反応します。 その結果、スイッチをオンにした後、コントローラーの初期化期間全体で任意の指示が発生します。 もちろん、追加のボディキットの助けを借りて、キーの初期状態を設定できますが、これにはより多くの詳細と時間が必要です...



2番目のオプションは、車のブレーキライトからの信号をArduinoデジタル入力に接続することでした。 これを行うには、ブレーキランプの電圧を5Vに下げる必要がありましたが、これは原則として難しくありません。 しかし、このオプションは、リアパネルを巻き戻して何らかの形でブレーキライトに接続する必要があるという事実のために非実用的であることが判明しました...



フォトレジタ 完全にシンプルなソリューションが必要でしたが、見つかりました! Arduinoアナログ入力に接続された簡単なフォトレジスターを使用することが決定されました。 フォトレジスタ自体は、停止信号のあるボックスに単純に配置されます。 そのような種類のオプトペアが判明します:)このソリューションにより、車の電気系統にまったく適合しなくなります。 確かに、これは、ブレーキライトがキャビンのガラスの下にあり、フォトレジスターを挿入できる場合にのみ可能です。 要するに、私はそのようなアクセス権を持っているので、まさにそれをしました。



さらに、フォトレジスタのオプションにより、周囲の光に依存するグローの輝度という別の問題を解決することができました。 フォトレジスタを使用すると、路上での照明をほぼ評価し、日中はバックライトをより明るく、夜は暗くすることができます。 私はプログラムでこれを考慮しましたが、実際には夜間はLEDがライダーの後ろで盲目にならないことが判明しました。



フォトレジスタは、端子A0と+ 5Vに接続されています。 端子A0からグランドへの10kΩ抵抗も必要です。 フォトレジスタのタイプと分周器の抵抗の値は、プログラムで設定される定数に影響します(実験的に選択できます)。



結果はそのようなボードです:



画像



FTDIベーシック それでは、私たちのお気に入りの娯楽であるプログラミングに取り掛かりましょう。 Arduino Pro Miniにプログラムをアップロードするには、USBシリアルコンバーターが必要です。 私はこの目的のためにFTDI Basicを使用していますが、これはeBayでも購入できます。



これは、ファームウェアを起動する前のArduino Pro Miniの外観です。



Arduino Pro Miniファームウェア



これを行うには、Arduino開発環境をロードします。 すべてが正しくインストールされていれば、COMポートがサービス/シリアルポートメニューに表示されるはずです。 存在しない場合は、プラットフォーム自体の「drivers」フォルダーから適切なドライバーをインストールする必要があります。



ポートを選択したら、間違いなくService / Board / Arduino Miniを選択する必要があります。 残念ながら、ここではすべてがそれほど単純ではありません。 ブートローダーのバージョンによっては、コントローラーにプログラムを書き込むことができない場合があります。 コンパイル後に次のようなエラーが発生した場合



stk500_getsync(): not in sync: resp=0x00







、開発環境のCOMポート速度がブートローダーで指定された同じパラメーターと一致しない可能性があります。 これを修正するには、次のことをお勧めします。



  1. サービス/ボード/ Arduino Nanoを選択します。 これは通常は役立ちますが、うまくいかない場合は、次の段落をご覧ください。
  2. 開発環境フォルダーに、ファイル「\ hardware \ arduino \ avr \ boards.txt」があります。 このファイルには、セクション「mini.name = Arduino Mini」、パラメーター「menu.cpu.mini.atmega328.upload.speed = 57600」があります。 ここでは、57600の値(何か他のものがあるかもしれません)を他の値に変更しようとしています。 可能なすべての速度値は、モニターで見つけることができます。サービス/ポートモニターメニューで、選択は右下隅にあります。 チェックする前に、開発環境をオーバーロードする必要があります。




プログラム自体はここに隠されています
 #define pinZA 3 #define pinNA 5 #define pinVAL 6 #define pinNO 9 #define pinGO 10 #define pinEMPTY 11 #define pinSTOPSIGNAL 0 #define sensValue 900 //  .  0-1024 #define sensNight 200 //    ,    .  0-1024 #define lightDay 255 //  .  0-255 #define lightNight 150 //  .  0-255 int currentMaxValueLight = 255; void setup() { Serial.begin(9600); pinMode(pinZA, OUTPUT); pinMode(pinNA, OUTPUT); pinMode(pinVAL, OUTPUT); pinMode(pinNO, OUTPUT); pinMode(pinGO, OUTPUT); setAll(0); } int currentEffect = 1; int maxEffects = 2; //     void loop() { if(checkState()){ switch(currentEffect){ case 1: //  1 effect_1(); delayWithStateCheck(2000); effect_off(); break; case 2: //  2 effect_2(); delayWithStateCheck(2000); effect_off(); break; case 3: //  3...  . // ................... break; } currentEffect++; if(currentEffect > maxEffects){ //   ,    currentEffect = 1; } } } void effect_2(){ for(int i=0; i <= 1; i++){ fade(pinZA, 3, true); fade(pinNA, 3, true); fade(pinVAL, 3, true); fade(pinNO, 3, true); fade(pinGO, 3, true); fade(pinZA, 3, false); fade(pinNA, 3, false); fade(pinVAL, 3, false); fade(pinNO, 3, false); fade(pinGO, 3, false); fade(pinGO, 3, true); fade(pinNO, 3, true); fade(pinVAL, 3, true); fade(pinNA, 3, true); fade(pinZA, 3, true); fade(pinGO, 3, false); fade(pinNO, 3, false); fade(pinVAL, 3, false); fade(pinNA, 3, false); fade(pinZA, 3, false); } setAll(currentMaxValueLight); delayWithStateCheck(200); setAll(0); delayWithStateCheck(100); setAll(currentMaxValueLight); delayWithStateCheck(200); } void effect_1(){ fade(pinZA, 10, true); fade(pinNA, 10, true); fade(pinVAL, 10, true); fade(pinNO, 10, true); fade(pinGO, 10, true); fade(pinGO, 3, false); fade(pinGO, 3, true); fade(pinGO, 3, false); fade(pinGO, 3, true); } void effect_off(){ fade(pinGO, 3, false); fade(pinNO, 3, false); fade(pinVAL, 3, false); fade(pinNA, 3, false); fade(pinZA, 3, false); } void fade(int pin, int d, boolean side){ // /   fade if(side){ for(int value = 0 ; value <= currentMaxValueLight; value+=5){ if(!checkState()) break; analogWrite(pin, value); delay(d); } }else{ for(int value = currentMaxValueLight; value >=0; value-=5){ if(!checkState()) break; analogWrite(pin, value); delay(d); } } } void delayWithStateCheck(int d){ //         for(int value = 0 ; value <= d; value++){ if(!checkState()) break; delay(1); } } boolean checkState(){ //    - int val = analogRead(pinSTOPSIGNAL); boolean state = val > sensValue; if(!state){ // -   setAll(0); if(val < sensNight){ //       currentMaxValueLight = lightNight; //    }else{ currentMaxValueLight = lightDay; //   } } return state; } void setAll(int val){ //      analogWrite(pinZA, val); analogWrite(pinNA, val); analogWrite(pinVAL, val); analogWrite(pinNO, val); analogWrite(pinGO, val); }
      
      











プログラムの主な「複雑さ」は、標準遅延機能をバイパスすることです。 実際には、ブレーキライトが消えた直後にすべてをオフにする必要があります。 これを行うには、割り込みを使用するか、フォトレジスターの照明を常に調べる必要があります。 なぜなら 人類はまだアナログ入力割り込みを発生させていません(キットを作成して回路にしきい値を縫う必要があります)。そして、停止信号が出たときに「クラッシュ」する自家製のdelayWithStateCheck関数を使用します。



結果は次のとおりです。







デバイスのインストール準備完了:



画像



内蔵フォトレジスターによる停止信号:



画像



夜景:



画像







費用



すべてのコンポーネントは、事前に中国または香港のeBayで購入しました。



合計:403ルーブル。



結論



Arduinoの開発における幸運と成功。 まあ、もちろん、嘘をつかないでください:)



All Articles