LEDウインカー走行線図。 AliExpressのDIYキットから自分の手でダイナミックウインカー(スタック)を作る方法

LEDウインカー走行線図。 AliExpressのDIYキットから自分の手でダイナミックウインカー(スタック)を作る方法

去年私は「ゴップ」と言った - ジャンプする時が来た :)
というか、約束の走行方向指示器の見直しをしましょう。
シリコンチューブに入った黒色の WS2812B テープ (LED 144 個) を 1 メートル注文しました。注文時に「黒色 1m 144led IP67」を選択しました (おそらく誰かがそれを好むでしょう) 白色基板、そのような選択肢があります)。

注意事項

2つの0.5メートルの部分をはんだ付けしたテープを受け取りました。 この欠点は、はんだ付け箇所が脆弱であること (時間の経過とともに接点が破損する可能性がある) と、LED 間の隙間が増加することです。
ご購入前にこの点について販売者にご確認ください。

複数の部品を直列に接続するために、トロリ線をテープの両側で半田付けしました。 これは必要なかったので、片側のワイヤーをはんだ付けしてすべてを密閉しました 中性シーラントそしてさらに黒い電気テープを巻きました。



ガラスに透明両面テープなどで貼り付けます。

インストールの詳細

表面を脱脂してから接着します ガムテープチューブ(断面は長方形ですがそう呼んでおきます)にはみ出した余分な部分をさらに切り落とします 幅広テープ、チューブの端を天井との間の亀裂に挿入します。 上部リアピラーの装飾パネル(コネクタを備えたトロリ線をパネルの後ろに隠しました)を中央に配置し、ガラスに押し付け始め、ゆっくりと引き抜きます 保護層テープ。
残念ながらビデオはありません - ハンズフリー撮影用のものはありませんでしたし、車は人それぞれ違います。
不明な点がある場合は、コメントで質問してください。
検査 夏の暑さそれは成功しました - 何も外れたり浮いたりしませんでした。
唯一のマイナス点は、ガラスの角度が緩やかで、LEDが上向きに光ることです。 晴れた日は見えにくいですが、重複した信号なので、

さて、電子詰め物に移りましょう。
使ってたけど最近発見した

ほぼ同じコストでより多くの特典が得られます

スケッチはArduino IDEでプログラミングする際にWemos上で特別な変更を加えることなく動作し、小規模なWebサーバーを実装した場合、Wi-Fi経由でそれに接続すると遅延時間などの変数の値を変更できます。点滅間隔、急ブレーキ時の減速度など。
将来、誰かが ESP8266 でプロジェクトを実装することに興味がある場合は、Web インターフェイスを介して設定を変更し、EEPROM に保存して読み取る例を投稿することができます。
Web サーバーは、たとえば、イグニッションがオンになっているときに方向指示器がオンになり、ブレーキ ペダルが踏まれることによって起動できます (セットアップ手順で、対応する入力のステータスをポーリングします)。

急ブレーキ時の点滅モードを実装するために購入しました。
このスケッチでは、ブレーキ ペダルを踏んだときの減速度レベルが監視されており、それが 0.5G を超えると (急な減速度だがブレーキ鳴きはしない)、さらに注意を引くために点滅モードが数秒間オンになります。
ストップ、ターンシグナル、リバースの「プラス」からArduino入力への制御信号は、電流制限抵抗を備えたフォトカプラによるガルバニック絶縁を通じて供給され、最終的にArduino入力でLOWレベルを形成します(10 kΩの抵抗を介して常にプラスにプルされます)。 。
電源 - DC-DC 降圧コンバータ経由 5 ボルト。
全体がサンドイッチ状に折りたたまれ、適切な箱に梱包されます。箱には、重力センサーの正しい向きを示す取り付け方向が矢印でマークされています。

図と写真



プルアップ (正への) 抵抗の公称値は標準 - 10 kOhm で、フォトカプラ抵抗の電流は 1 kOhm に制限されます。 古いボードからフォトカプラを取り外しました。2 つは PC123、2 つは PC817 でした。


最初の写真には、方向指示器用に作成した追加の端子が 2 つあります。 私の車では、ステアリングコラムレバーをオンにするとアースにショートが発生するため、ワイヤーをレバーブロックとArduino入力に接続しました。 ステアリングコラムレバーがプラスに切り替わる場合、または左右のウインカーランプの「+」から信号を取得する場合は、ガルバニック絶縁を介して接続してください。



さて、スケッチ自体(Arduino IDE)

#含む #含む // いくつかの一般的なコメント // 一番外側の LED の 1 つをオフにしました。なぜなら... 彼らは反省した 装飾パネル//このサイクルの例で見ることができます for (int i=1; i<143; i++) //если отключать не нужно, заменяем на for (int i=0; i<144; i++) //задний ход и аварийка у меня не используются, т.к. в первом случае яркость никакая, во втором надо подключать входы к лампам поворотников //поворотники и стоп-сигнал одновременно не включаются, чтобы это реализовать, нужно переписывать соответствующий код скетча (делить ленту на три секции, подбирать тайминги миганий, менять диапазон переменных циклов). //Дерзайте - все в ваших руках // Пин для подключения управляющего сигнала светодной ленты const int PinLS = 2; //Пины для подключения датчиков //если более удобно будет подключать контакты в другом порядке - просто поменяйте значения переменных const int buttonPinL = 3; const int buttonPinR = 4; const int buttonPinS = 6; const int buttonPinD = 5; //начальные статусы входов (подтянуты к плюсу) int buttonStateS = HIGH; int buttonStateD = HIGH; int buttonStateL = HIGH; int buttonStateR = HIGH; // пауза pause_pov1 (в миллисекундах) нужна, чтобы синхронизировать циклы "пробегания" полоски и включения лампочки поворотника // такое может быть, если используется меньше половины светодиодов // в моем случае паузы нет (pause_pov1 = 0) int pause_pov1 = 1; // этой паузой регулируем длительность состояния, когда все светодиоды выключены //я определял опытным путем - включал поворотник, засекал по отдельности время ста мыргов лампочкой и ста беганий полоски, разницу делил на 100, на полученное время увеличивал или уменьшал значение переменной (в зависимости от того, отставали или убегали вперед лампочки) int pause_pov2 = 62; // переменная для получения значения ускорения int ix; Adafruit_NeoPixel strip = Adafruit_NeoPixel(144, PinLS, NEO_GRB + NEO_KHZ800); Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345); void setup() { pinMode(buttonPinS, INPUT); pinMode(buttonPinD, INPUT); pinMode(buttonPinL, INPUT); pinMode(buttonPinR, INPUT); strip.begin(); // гасим ленту for (int i=0; i<144; i++) strip.setPixelColor(i, strip.Color(0,0,0)); strip.show(); accel.begin(); // ограничиваем измеряемый диапазон четырьмя G (этого хватит с большим запасом) accel.setRange(ADXL345_RANGE_4_G); accel.setDataRate(ADXL345_DATARATE_100_HZ); } void loop() { // СТОПЫ: если включены - высший приоритет //Чтобы сделать меняющуюся по ширине полоску в зависимости от интенсивности торможения //(уточнение - никакой светомузыки, ширина полосы после нажатия на тормоз не меняется!) //от плавного торможения до тапки в пол. //Добавляем еще одну переменную, например, ix2, //присваиваем ей значение ix с коэффициентом умножения, //заодно инвертируем и округляем до целого //ix = event.acceleration.x; //ix2 = -round(ix*10); //ограничиваем для плавного торможения в пробках //(чтобы не менялась при каждом продвижении на 5 метров) //if (ix2<10) ix2 = 0; //и для резкого торможения. //Реальный диапазон изменения переменной ix - от 0 до -5 //для максимальной ширины полосы при G равном или большем 0.5 //if (ix2 >50) ix2 = 50; //次に、STOP ブロック内のサイクルを (int i=1; i<143; i++) на for (int i=51-ix2; i<93+ix2; i++) //Получаем минимальную ширину полоски ~30 см (для стояния в пробке) и максимальную для резкого торможения //конец комментария buttonStateS = digitalRead(buttonPinS); if (buttonStateS == LOW) { sensors_event_t event; accel.getEvent(&event); ix = event.acceleration.x; // проверка резкого торможения - мигающий режим // значение 5 - это 0,5G, минус - торможение if (ix < -5) { for (int is=0; is<15; is++) { for (int i=1; i<143; i++) strip.setPixelColor(i, strip.Color(240,0,0)); strip.show(); delay(10 + is*10); for (int i=1; i<143; i++) strip.setPixelColor(i, strip.Color(0,0,0)); strip.show(); delay(10 + is*3); buttonStateS = digitalRead(buttonPinS); if (buttonStateS == HIGH) return; } } // помигали - и хватит, включаем постоянный режим, если педаль тормоза еще нажата // или если не было резкого торможения и предыдущее условие не сработало if (buttonStateS == LOW) { for (int i=1; i<143; i++) strip.setPixelColor(i, strip.Color(200,0,0)); strip.show(); while(buttonStateS == LOW){ buttonStateS = digitalRead(buttonPinS); delay(50); } // плавно гасим for (int is=0; is<20; is++) { for (int i=1; i<143; i++) strip.setPixelColor(i, strip.Color(190 - is*10,0,0)); strip.show(); delay(10); } // СТОПЫ конец } } else // если СТОПЫ выключены { // ЗАДНИЙ ХОД: если включен - средний приоритет buttonStateD = digitalRead(buttonPinD); if (buttonStateD == LOW) { for (int i=1; i<37; i++) strip.setPixelColor(i, strip.Color(63,63,63)); for (int i=107; i<143; i++) strip.setPixelColor(i, strip.Color(63,63,63)); strip.show(); while(buttonStateD == LOW){ buttonStateD = digitalRead(buttonPinD); delay(50); } //плавно гасим for (int is=0; is<16; is++) { for (int i=1; i<37; i++) strip.setPixelColor(i, strip.Color(60 - is*4,60 - is*4,60 - is*4)); for (int i=107; i<143; i++) strip.setPixelColor(i, strip.Color(60 - is*4,60 - is*4,60 - is*4)); strip.show(); delay(10); } } buttonStateL = digitalRead(buttonPinL); buttonStateR = digitalRead(buttonPinR); // если включена аварийка if (buttonStateL == LOW && buttonStateR == LOW) { for (int il=0; il<71; il++) { strip.setPixelColor(71-il, strip.Color(63,31,0)); strip.setPixelColor(il+72, strip.Color(63,31,0)); strip.show(); delay(pause_pov1); } for (int il=0; il<71; il++) { strip.setPixelColor(71-il, strip.Color(0,0,0)); strip.setPixelColor(il+72, strip.Color(0,0,0)); strip.show(); delay(pause_pov1); } delay(pause_pov2); } // если включен ЛЕВЫЙ ПОВОРОТНИК if (buttonStateL == LOW && buttonStateR == HIGH) { for (int il=0; il<71; il++) { strip.setPixelColor(il+72, strip.Color(220,120,0)); strip.show(); delay(pause_pov1); } for (int il=0; il<71; il++) { strip.setPixelColor(il+72, strip.Color(0,0,0)); strip.show(); delay(pause_pov1); } delay(pause_pov2); } // если включен ПРАВЫЙ ПОВОРОТНИК if (buttonStateL == HIGH && buttonStateR == LOW) { for (int il=0; il<71; il++) { strip.setPixelColor(71-il, strip.Color(220,120,0)); strip.show(); delay(pause_pov1); } for (int il=0; il<71; il++) { strip.setPixelColor(71-il, strip.Color(0,0,0)); strip.show(); delay(pause_pov1); } delay(pause_pov2); } //правый поворотник конец } //конец условия else Стоп // задержка для следующего опроса датчиков delay(10); }

可能な限りコメントするようにしましたが、質問があればコメントを追加するように努めます(そのため、コメントは添付ファイルとしてではなく、レビューの本文に記載しています)。 ちなみに、これはレビューの他の点にも当てはまります。コメントに重大な質問がある場合は補足します。

そして最後に、作業のデモンストレーションです (ビデオではデモ モードでスケッチを使用しました)。

アップしました。 すべてを 1 つの短いビデオに収めるために、デモ モードでスケッチを作成しました。
ブレーキライトは急ブレーキ時のみ点滅します(これについては上で説明しました)。低速ブレーキ時と渋滞中に立っているときは、後続のドライバーを刺激することなく点灯するだけです。
夜の明るさはそれほどでもないので... ガラスの傾斜により、光は後方よりも上方に向けられます。
標準のライトは通常どおり機能し、このストリップはそれらを複製します。

+95を購入する予定です お気に入りに追加 レビューが気に入りました +89 +191

Aliexpress のランニング ライトの設計者は、プリント基板と無線コンポーネントのセットです。 必要なのは、コンポーネントをボードにはんだ付けすることだけです。

しかし、ランニングライトのさらに興味深い効果を得ることができます。 たとえば、車の方向指示器やブレーキランプ、または休日の花輪などに使用できます。


この回路は、3 ~ 15 ボルトの電源電圧範囲で動作できます。 パルス発生器は NE555 チップ上に組み立てられ、パルスはデコーダ付きの 10 進カウンタ (CD4017 (または K561IE8) チップ) に送信され、その出力には電流制限抵抗を介して LED が接続されます。

ランニングライトのスイッチング速度はトリミング抵抗によって調整されます。 トリガーと出力トランジスタスイッチを備えた回路を追加します。 何もプログラムする必要はありません。 その結果、ランニングライトのより興味深い照明効果を得ることができます。 K561TM2 トリガーと KT815 電源スイッチを備えた別のプリント基板を作成する必要があります。 K561IE8 の各出力からのパルスは、「ラッチ」原理を使用してトリガー入力に供給されます。つまり、CD4017(K561IE8) マイクロ回路のピン 11 からリセット パルスが到着するまで、トリガー出力の信号は一定のままです。 サイクルごとに 9 チャネルがオンになります。

すべてはビデオで詳しく説明されています。

多くの自動車愛好家は、車の外観を向上させるために、「スワロー」を LED ライトでチューニングします。 チューニング オプションの 1 つは、他の道路利用者の注意を引く走行方向指示器です。 この記事では、ランニング ライト付き方向指示器の取り付けと設定の手順について説明します。

[隠れる]

組立説明

LEDランプは電流を流すと発光する半導体素子です。その主成分はシリコンです。 どのような不純物が使用されているかに応じて、電球の色が変わります。

フォトギャラリー「動的方向指示器の可能なオプション」

道具と材料

自分の手でランニングウインカーを作成するには、次のツールが必要です。

  • はんだごて;
  • サイドカッターまたはペンチ。
  • はんだごておよびはんだ材料。
  • テスター。

消耗品からグラスファイバーラミネートを準備する必要があります。 半導体素子を搭載するプリント基板の製造に必要となります。 必要な LED が選択されます。 LEDの特性とオンボードネットワークの電流値と電圧値に応じて、保護抵抗の特性が計算されます。 計算を使用して、ネットワークの残りのコンポーネントが選択されます (ビデオの作成者は Evgeny Zadvornov です)。

作業の流れ

方向指示器を作成する前に、適切なスキームを選択する必要があります。

次に、図に基づいてプリント基板を作成し、その上に将来の要素を配置するためのマーキングを適用します。

アセンブリは、次の一連のアクションで構成されます。

  1. まず、バッテリーからマイナス端子を外して車の電源を切ります。
  2. 次に、古いウインカーを取り外し、慎重に分解する必要があります。
  3. 古い電球はネジを外す必要があります。
  4. 接合部から接着剤を取り除き、脱脂し、洗浄して乾燥させる必要があります。
  5. 古い各要素の代わりに、新しいランニングライトターンシグナルが取り付けられています。
  6. 後は逆の手順でライトの組み立てと取り付けを行います。
  7. 設置後は配線を接続します。

次の段階では、追加の安定化電源がネットワークに接続されます。 その入力は中間リレーから電力を受け取り、出力はダイオードに接続されています。 インストルメントパネル内に設置した方が良いでしょう。

LED を接続するときは、アノードが電源のプラスに接続され、カソードがマイナスに接続されていることを確認する必要があります。 正しく接続されていないと半導体素子が点灯しなかったり、焼損する恐れがあります。


進行方向指示器の設置と構成の特徴

従来のLEDの代わりにダイナミックウインカーを取り付けることができます。 これを行うには、LED と電流制限抵抗を備えた基板を取り外して分解します。 リピーターではガラスを本体から引き剥がす必要があります。 次に、リフレクターを慎重に切り取って取り外します。

リモートリフレクターの代わりに、黄色の LED が配置された SMD 5730 ボードが取り付けられています。 リピーターは湾曲した形状をしているため、基板を剥離して少し曲げる必要があります。 コントローラーを接続するには、古い基板からコネクタのある部分を切り取り、はんだ付けする必要があります。 その後、すべてのコンポーネントが元の場所に戻ります。

動作中の LED ライトのタイミングを調整するために、スイッチがマイクロコントローラーにはんだ付けされています。 適切な速度が見つかったら、スイッチの代わりにジャンパーがはんだ付けされます。 2 つのピンをグランドに接続すると、LED の点滅間の最小時間は 20 ミリ秒になります。 接点が閉じている場合、この時間は 30ms になります。


価格問題

デイタイムランニングライトからランニングライトウインカーを作ることができます。 料金は600ルーブルです。 この場合、走行方向指示器ごとに 7 個の「ピクセル」RGB LED を光源として使用できます。 1つの要素のコストは19ルーブルです。 LEDを制御するには、250ルーブルのArduino UNOを購入する必要があります。 したがって、総費用は1060ルーブルになります。

ルノー クリオ車のヘッドライトの例を使用して、アウディのような走行方向指示器を作成することを考えてみましょう。 ウインカーとDRLを1つのデバイスで作りましょう。

このために必要なもの: ws2812b LED で構成される LED ストリップ Arduinoナノコントローラー(他のフォームファクターでも使用可能) USB 出力を備えた携帯電話用カーチャージャー。 Arduino コントローラーは 5V の電圧を必要とするため、この充電器を 12V から 5V への電圧変換器として使用します。 5V KR142EN5V (KREN5V) またはその他の輸入アナログ用の電圧安定器。 プルアップ抵抗として 3 つの 10 kOhm 抵抗。

接続図

Arduino コントローラーは、イグニッションをオンにすることで回路に電圧が供給されるように、12V -> 5V コンバーターを介して車のネットワークに接続する必要があります。 既存のウインカーからのプラス線をKREN5V電圧安定器に接続する必要があります。 この記事では、1 つの方向指示器のみの接続とファームウェアについて説明します。2 つ目の方向指示器を作成するには、同様に 2 番目の LED ストリップを Arduino の空きデジタル出力 (たとえば 7) に接続し、そのためのコードを追加する必要があります。この例によるファームウェア。

コントローラーファームウェア

ピクセル LED を操作するにはライブラリが必要です 。 次のようにインストールできます: スケッチ -> ライブラリの接続 -> ライブラリの管理。 次に、検索メニューにライブラリAdafruit_NeoPixel.hの名前を入力し、インストールボタンをクリックします。 その後、スケッチをプログラムに挿入し、コード内の LED の数を置き換えます (22 個のダイオードを使用します)。

#含む // ライブラリを接続します
Adafruit_NeoPixel ストリップ = Adafruit_NeoPixel(22, 8, NEO_GRB + NEO_KHZ800);
int t,t1,t2,t3,t4,p2,p1 = 0;//時間変数
void setup() (
ピンモード(2, 入力);
ピンモード(3, 入力);
ピンモード(4, 入力);
デジタル書き込み(2, LOW);
デジタル書き込み(3, LOW);
デジタル書き込み(4, LOW);

ストリップ.begin();
ストリップショー();

}
void ループ() (
if (digitalRead(2) == LOW) ( //ウインカーがオフの場合
for(int i = 0; i< 23; i++) {
ストリップ.setPixelColor(i, ストリップ.カラー(255,255,255)); // R=255、G=255、B=255 - LED の白色。オンにするとランニング ライトが点灯します。
}
ストリップショー();
}

if ((digitalRead(2) == HIGH) & (t == 1)) ( // 方向指示器がオンかどうかを確認する
for(int i = 0; i< 23; i++) {
ストリップ.setPixelColor(i, ストリップ.Color(0, 0, 0)); // すべてのダイオードを消す
}
ストリップショー();
for(int k = 0; k< 3; k++){ // цикл до трех - сигнал «перестроения» , при кратковременном включении мигает 3 раза,

for(int i = 0; i< 23; i++){

if (digitalRead(2) == HIGH) (k = 0;) // 方向指示器が点滅している間に別の正の信号を受信した場合、方向指示器が少なくともあと 3 回点滅するようにカウンタをリセットします。
ストリップ.setPixelColor(i, ストリップ.Color(255, 69, 0)); // R=255、G=69、B=0 - LEDの色

遅延((t4)/22);
ストリップショー();

}
if (digitalRead(2) == HIGH) (t4=t4+20;) // すべてのダイオードが黄色に点灯しているが、リレーからの信号がまだ来ている場合は、燃焼時間を増やします
if (digitalRead(2) == LOW) (t4=t4-20;) // すべてのダイオードが黄色に点灯しているが、リレーからの信号がまだ来ている場合は、燃焼時間を増やします

for(int i = 0; i< 23; i++){

ストリップ.setPixelColor(i, ストリップ.Color(0, 0, 0)); // R=0、G=0、B=0 - LED の色

遅延((t3)/22);
ストリップショー();

}
if ((digitalRead(2) == LOW)) (t3=t3+20;)
if ((digitalRead(2) == HIGH)) (t3=t3-20;)
}

if ((digitalRead(2) == HIGH) & (t == 0)) ( // 方向指示器がオンかどうかを確認する

t1 = ミリス(); // 電源を入れた時間を覚えておいてください
for(int i = 0; i< 22; i++) {
ストリップ.setPixelColor(i, ストリップ.Color(255, 69, 0)); // 初めて方向指示器をオンにするときは、すべてのダイオードを黄色にオンにします
}
ストリップショー();
while (digitalRead(2) == HIGH) ()
t2 = ミリス(); // 方向指示器が消えた時間を覚えておく
t4=t2-t1;

for(int i = 0; i< 22; i++) {
ストリップ.setPixelColor(i, ストリップ.Color(0, 0, 0)); // ターンリレーからの信号が消えたらダイオードを消す
}
ストリップショー();
while (digitalRead(2) == LOW) (
if ((millis()-t2)>2000)(break;)
}
if ((ミリス()-t2)<2000) {
t3 = ミリス()-t2; // 方向指示器が消えるまでの時間
t = 1; // フラグ。時間値が保存されたことがわかります。
}
}

if (digitalRead(4) == HIGH) ( //特別な信号
for(int j = 0; j< 16; j++) {
for(int i = 0; i< 22; i++) {
ストリップ.setPixelColor(i, ストリップ.Color(255, 0, 0)); // R=255、G=0、B=0 - LEDの色
}
ストリップショー();
遅延(20);
for(int i = 0; i< 22; i++){

}
ストリップショー();
遅延(20);
}

for(int j = 0; j< 16; j++) {
for(int i = 0; i< 22; i++) {
ストリップ.setPixelColor(i, ストリップ.Color(0, 0, 255)); // R=0、G=0、B=255 - LED の色
}
ストリップショー();
遅延(20);
for(int i = 0; i< 22; i++){
ストリップ.setPixelColor(i, ストリップ.Color(0, 0, 0)); // R=0、G=0、B=0 - LED の色
}
ストリップショー();
遅延(20);
}
}

if (digitalRead(3) == HIGH) ( //ストローブ
for(int j = 0; j< 24; j++) {
for(int i = 0; i< 22; i++) {
ストリップ.setPixelColor(i, ストリップ.Color(255, 255, 255)); // R=255、G=255、B=255 - LED の色
}
ストリップショー();

遅延(15);
for(int i = 0; i< 22; i++){
ストリップ.setPixelColor(i, ストリップ.Color(0, 0, 0)); // R=0、G=0、B=0 - LED の色
}
ストリップショー();
遅延(15);
}
遅延(500);

2番目のウインカーのコードについても同じことを行います。

ヘッドライトの仕組みのビデオ



サイトの新着情報

>

最も人気のある