Clignotants dynamiques - nous fabriquons des feux de circulation à partir du kit KIT. Exécution des clignotants sur la bande WS2812 et Arduino Vidéo comment fonctionne notre phare

De nombreux automobilistes, afin d'améliorer l'apparence de leur voiture, accordent leur "Swallow" avec des lumières LED. L'une des options de réglage est un clignotant en marche qui attire l'attention des autres usagers de la route sur lui-même. L'article fournit des instructions pour l'installation et la configuration des clignotants avec feux de position.

[Cacher]

instructions de montage

Les lampes LED sont des éléments semi-conducteurs qui brillent sous l'influence d'un courant électrique. L'élément principal en eux est le silicium. Selon les impuretés utilisées, la couleur des bulbes change.

Galerie de photos "Variantes possibles d'indicateurs de direction dynamiques"

Outils et matériaux

Pour faire un clignotant en marche de vos propres mains, vous aurez besoin des outils suivants:

  • fer à souder;
  • pinces coupantes ou pinces latérales;
  • fer à souder et matériel de soudure;
  • testeur.

À partir de consommables, vous devez préparer de la fibre de verre. Elle est nécessaire à la fabrication d'un circuit imprimé sur lequel sera placé l'élément semi-conducteur. Les LED requises sont sélectionnées. En fonction des caractéristiques des LED et des valeurs du courant et de la tension du réseau de bord, les caractéristiques des résistances de protection sont calculées. À l'aide des calculs, le reste des composants du réseau est sélectionné (vidéo d'Evgeny Zadvornov).

Séquence de travail

Avant de faire les clignotants, vous devez choisir un schéma approprié.

Ensuite, sur la base du schéma, réalisez une carte de circuit imprimé et appliquez des marquages ​​dessus pour accueillir les futurs éléments.

L'assemblage consiste en une séquence d'actions :

  1. Tout d'abord, vous devez mettre la voiture hors tension en débranchant la borne négative de la batterie.
  2. Ensuite, vous devez retirer les anciens indicateurs de direction et les démonter soigneusement.
  3. Dévissez les vieilles ampoules.
  4. Les joints doivent être nettoyés de la colle, dégraissés, lavés et laissés sécher.
  5. A la place de chaque ancien élément, un nouveau feu de circulation est installé.
  6. De plus, l'assemblage et l'installation des lanternes s'effectuent dans l'ordre inverse.
  7. Après l'installation, les fils sont connectés.

A l'étape suivante, une alimentation stabilisée supplémentaire est connectée au réseau. Son entrée est alimentée par un relais intermédiaire et la sortie est connectée à une diode. Il est préférable de le placer dans le tableau de bord.

Lors de la connexion des LED, assurez-vous que l'anode est connectée au positif de l'alimentation et la cathode au négatif. Si la connexion n'est pas effectuée correctement, les éléments semi-conducteurs ne brilleront pas et peuvent même griller.


Caractéristiques d'installation et de configuration des indicateurs de direction de marche

Vous pouvez installer des clignotants dynamiques à la place des LED classiques. Pour cela, une carte avec des LED et des résistances de limitation de courant est retirée et démontée. Sur le répéteur, vous devez déchirer le verre du boîtier. Ensuite, découpez soigneusement le réflecteur et retirez-le.

À la place du réflecteur à distance, une carte SMD 5730 est installée, sur laquelle se trouvent les LED jaunes. Étant donné que le répéteur a une forme incurvée, la planche devra être stratifiée et légèrement pliée. Pour l'ancienne carte, vous devez couper la partie avec le connecteur et la souder pour connecter le contrôleur. Ensuite, tous les composants sont remis à leur place.

Pour ajuster la synchronisation des lumières LED en marche, un interrupteur est soudé au microcontrôleur. Lorsqu'une vitesse appropriée est trouvée, des cavaliers sont soudés au lieu d'un interrupteur. Lors de la connexion de deux broches à la terre, le temps minimum entre les clignotements des LED est de 20 ms. Lorsque les contacts sont fermés, ce temps sera de 30 ms.


Prix ​​d'émission

Vous pouvez faire un clignotant de feux de circulation à partir des feux de jour. Leur coût est de 600 roubles. Comme sources lumineuses dans ce cas, vous pouvez prendre des LED RVB "pixels" à raison de 7 pièces pour chaque clignotant en cours d'exécution. Le coût d'un élément est de 19 roubles. Pour contrôler les LED, vous devez acheter un Arduino UNO d'une valeur de 250 roubles. Ainsi, le coût total sera de 1060 roubles.

Tous ceux qui ont vu une voiture plus ou moins moderne et pas pour la deuxième fois, et s'il y avait encore une conduite au volant, ont depuis longtemps noté l'une des options utiles pour eux-mêmes ... Les gens l'appellent un clignotant paresseux ou un indicateur de direction poli. Toute son essence se résume au fait qu'en tournant à droite ou à gauche, le conducteur ne touche qu'une seule fois le levier des clignotants, sans fixation. C'est-à-dire qu'il déclenche simplement les circuits des clignotants, mais n'active pas cet interrupteur. En conséquence, une fois le levier relâché, les indicateurs de direction se déclenchent encore 3 à 4 fois et le conducteur peut déjà à ce moment vaquer à ses occupations, c'est-à-dire s'abandonner complètement à la route. Cette option est très utile lorsque vous devez changer de voie. En effet, lorsque le levier d'indicateur de direction est complètement allumé, l'arrêt automatique ne se produira pas, en raison du léger angle de braquage, ce qui signifie que vous devrez pousser d'avant en arrière avec l'indicateur lui-même ou le soutenir constamment avec votre main au bord de l'allumer pour imiter le clignotant. Et s'il existe une telle option, alors il a juste touché un peu le levier et a oublié. En général, nous pensons que l'essence du travail a été pleinement révélée, mais il convient maintenant de mentionner la mise en œuvre possible d'une telle option sur votre machine.

Pour quels circuits électriques un clignotant poli convient-il à Arduino

Avant d'aller partout sur la production d'un clignotant poli, vous devez comprendre pour quels schémas de câblage électrique il s'adaptera sans modifier le circuit électrique de la voiture.
On nous présente ici deux options principales, différentes dans leur principe. Le premier est lorsque les clignotants s'allument lorsque vous les connectez en tant que charge. C'est-à-dire que l'allumage se produit en raison de la commutation du circuit du clignotant, dans lequel se trouve le levier indicateur de direction lui-même, c'est lui qui ferme le circuit, après quoi l'opération se produit. Dans ce cas, l'utilisation de notre option ne fonctionnera pas, car lorsque le levier ouvre le circuit avec des lampes, nous désactivons immédiatement la possibilité d'indication lumineuse, même si un signal parvient au levier lui-même, il n'ira tout simplement pas plus loin.
La deuxième option est la nôtre, lorsqu'il y a des signaux de commande et qu'il y a des signaux de puissance de sortie. Dans ce cas, au lieu du relais standard, vous pouvez mettre uniquement le circuit que nous souhaitons porter à votre attention.

Module d'alimentation de relais qui peut être acheté en ligne pour contrôler les charges d'alimentation

Croquis et schéma d'un clignotant paresseux (poli) sur un Arduino

Ainsi, vous pouvez discuter de l'utilisation d'Arduino comme unité principale en tant que clignotants paresseux, car ce n'est pas non plus une solution idéale, qui a ses inconvénients. Disons que vous aurez besoin d'une puissance constante après avoir mis le contact, afin d'assurer la vitesse, il faudra brancher les circuits d'alimentation. Dans le même temps, le cerclage lui-même des composants radio inutiles est, en principe, inutile ici, car dans ce cas, vous pouvez simplement programmer un microcontrôleur et l'utiliser uniquement. Mais ce moins est aussi un plus, car tous ceux qui l'ont peuvent se permettre de programmer l'Arduino, et pour les microcontrôleurs, vous aurez également besoin d'un programmeur.
L'écriture d'un programme sera l'une des tâches les plus difficiles. Ici, un débutant devra passer plus d'une heure de son temps libre et étudier le travail des algorithmes, mais heureusement il y a Internet et nous le sommes. Voici donc un croquis.

Int switchPinR = 8; int switchPinL = 7 ; int ledPinR = 11; int ledPinL = 12; booléen ledOn = faux ; entier je = 0; entier z = 0; void setup () (// mettez votre code de configuration ici, à exécuter une fois : pinMode (switchPinR, INPUT); pinMode (switchPinL, INPUT); pinMode (ledPinR, OUTPUT); pinMode (ledPinL, OUTPUT); Serial.begin (9600 );) void loop () (// mettez votre code principal ici, à exécuter à plusieurs reprises: // 2 label: if (digitalRead (switchPinR) == HIGH && digitalRead (switchPinL) == HIGH) (digitalWrite (ledPinR, HIGH) ; digitalWrite (ledPinL, HIGH); i = 0; tandis que (i<7) { ledOn = !ledOn; digitalWrite(ledPinR, ledOn); digitalWrite(ledPinL, ledOn); delay(400); i++; z++; if (digitalRead(switchPinL) == LOW && digitalRead(switchPinR) == LOW && z>= 7) (break;))) else (digitalWrite (ledPinR, LOW); digitalWrite (ledPinL, LOW); z = 0;) // boucle d'alarme if (digitalRead (switchPinR) == HIGH && digitalRead (switchPinL) == HIGH) (goto label;) // Clignotant droit. if (digitalRead (switchPinR) == HIGH) (digitalWrite (ledPinR, HIGH); i = 0; while (i<7) { ledOn = !ledOn; digitalWrite(ledPinR, ledOn); delay(400); i++; z++; if (digitalRead(switchPinR) == LOW && z>= 7) (break;))) else (digitalWrite (ledPinR, LOW); z = 0;) // Clignotant gauche. if (digitalRead (switchPinL) == HIGH) (digitalWrite (ledPinL, HIGH); i = 0; while (i<7) { ledOn = !ledOn; digitalWrite(ledPinL, ledOn); delay(400); i++; z++; if (digitalRead(switchPinL) == LOW && z>= 7) (break;))) else (digitalWrite (ledPinL, LOW); z = 0;)))

En un mot, l'esquisse a 2 entrées et 2 sorties. Dans ce cas, lorsque l'entrée est positive, c'est-à-dire un niveau élevé du signal à l'entrée (8.7), on obtient un certain nombre de clignotements (z ou i) à la sortie correspondante (11.12). Bref, quelque chose comme ça. Autrement dit, si vous souhaitez modifier quelque chose dans le croquis concernant le nombre de clignotements et les sorties des entrées, faites attention à ces variables. S'il est nécessaire de modifier la durée des clignotements, votre attention doit être concentrée sur la fonction de retard.
Une autre caractéristique du programme est une sortie quelque peu inhabituelle vers la signalisation d'urgence. Tout d'abord, les clignotants gauche et droit sont élaborés, puis les feux de détresse sont allumés. Ceci est dû au fait qu'il ne peut s'allumer que s'il y a une entrée haute en même temps aux entrées 8 et 7. Et cette condition ne sera remplie qu'au deuxième cycle, car appuyer simultanément sur deux boutons en même temps va pas travailler seulement physiquement. La vitesse du microcontrôleur vous permettra de lire plus rapidement la sortie élevée de certains boutons et de décider qu'il s'agit toujours d'une condition pour le clignotant et non d'une alarme. Bien que vous ne devriez pas vous en soucier, sauf qu'il sera problématique de dire merci sur la route.

Caractéristiques de la connexion d'un clignotant paresseux (poli) à un Arduino dans une voiture

N'utilisez pas la broche 13 comme sortie, car à chaque mise sous tension, les indicateurs qui seront connectés à cette sortie peuvent clignoter.
Lors du passage des signaux de contrôle aux signaux de puissance, utilisez les blocs correspondants achetés sur Internet ou assemblés par vos soins. Nous avons déjà parlé de ces blocs - modules.
Lors de la réception du signal 1 d'une tension de 12 volts, placez une résistance de 10 ohms devant l'entrée.

C'est en fait tous les mots d'adieu pour faire un clignotant paresseux pour une voiture sur un microcontrôleur Arduino, et maintenant à peu près la même chose dans la vidéo ...

J'ai dit l'année dernière "Gop" - il est temps de sauter :)
Faites plutôt l'examen promis des clignotants en marche.
J'ai commandé 1 mètre de ruban noir WS2812B (144 LEDs) dans un tube en silicone, lors de la commande j'ai choisi "Black 1m 144led IP67" (peut-être que quelqu'un aimera la couleur blanche du substrat, il y a un tel choix).

Une petite mise en garde

J'ai reçu un ruban soudé à partir de deux pièces d'un demi-mètre. L'inconvénient de ceci est le point vulnérable de la soudure (les contacts peuvent être rompus avec le temps) et l'écart accru entre les LED.
Avant d'acheter, vérifiez auprès du vendeur pour ce moment

Les fils de contact ont été soudés au ruban des deux côtés pour la connexion en série de plusieurs pièces, car Je n'en avais pas besoin, puis j'ai scellé les fils d'un côté, scellé le tout avec un scellant neutre et enroulé un peu plus de ruban électrique noir.



Fixé au verre avec du ruban adhésif transparent double face, par exemple.

Détails de l'installation

Il a dégraissé les surfaces, a d'abord collé du ruban adhésif sur le tube (je l'appellerai ainsi, même si la section transversale est rectangulaire), a coupé l'excès saillant d'un ruban plus large, a poussé les bords du tube dans les fentes entre les plafond et les parties supérieures des panneaux décoratifs des piliers arrière (j'ai caché les fils de contact avec un connecteur derrière un panneau ), l'ai centré et a commencé à le presser contre le verre, en retirant lentement la couche protectrice du ruban adhésif.
Malheureusement, il n'y a pas de vidéo - il n'y avait pas les mains libres pour tourner et les voitures de chacun sont différentes.
Si quelque chose n'est pas clair, demandez dans les commentaires.
Le test de chaleur d'été a été un succès - rien ne s'est détaché ou n'a flotté.
Le seul point négatif est que l'angle d'inclinaison du verre est faible, les LED brillent davantage vers le haut. Par une journée ensoleillée, il est difficile de voir, mais comme ce sont des signaux en double, alors

Passons maintenant à la farce électronique.
J'ai utilisé, mais il n'y a pas si longtemps découvert

Pour environ le même coût, nous obtenons plus de petits pains

L'esquisse fonctionnera sur Wemos sans aucune modification particulière lors de la programmation dans l'IDE Arduino, et si vous implémentez un petit serveur Web, puis lorsque vous y êtes connecté via Wi-Fi, vous pouvez modifier les valeurs de variables telles que le temps de retard entre les clignotements, la quantité de décélération lors d'un freinage d'urgence, etc.
Ici, à l'avenir, si quelqu'un est intéressé par la mise en œuvre d'un projet sur l'ESP8266, je peux poster un exemple pour modifier les paramètres via l'interface Web, les enregistrer dans l'EEPROM, puis les lire.
Le serveur Web peut être lancé, par exemple, par un clignotant allumé et un appui sur la pédale de frein lorsque le contact est mis (dans la procédure de configuration, interroger l'état des entrées correspondantes).

Pour la mise en œuvre du mode clignotant avec freinage brusque, a été acheté
Le croquis surveille le niveau de décélération lorsque la pédale de frein est enfoncée, s'il dépasse 0,5 G (décélération brutale, mais sans grincement des freins), un mode clignotant est alors activé pendant quelques secondes pour attirer une attention supplémentaire.
Les signaux de contrôle vers les entrées Arduino provenant du "plus" des arrêts, des clignotants et de la marche arrière sont alimentés par des isolateurs galvaniques - des optocoupleurs avec des résistances de limitation de courant, qui forment finalement un niveau BAS aux entrées Arduino (ils sont constamment tirés vers le positif jusqu'à 10 kΩ résistances).
Alimentation - 5 volts via un convertisseur DC-DC buck.
Le tout est plié en sandwich et emballé dans une boîte adaptée, sur laquelle une flèche marquait le sens d'installation pour la bonne orientation du capteur de gravité

Schéma et photo



La valeur nominale des résistances de rappel (vers le positif) est standard - 10 kOhm, les résistances de limitation de courant de l'optocoupleur sont de 1 kOhm. J'ai abandonné les optocoupleurs des anciennes cartes, deux PC123, deux PC817.


Sur la première photo, vous pouvez voir deux conclusions supplémentaires, je les ai faites pour les clignotants. Étant donné que dans ma voiture, lorsque le levier de la colonne de direction est activé, un court-circuit à la masse se produit, j'ai connecté les fils au bloc de levier et aux entrées Arduino. Si le levier de la colonne de direction commute plus ou si vous prenez le signal des ampoules "+" des clignotants gauche / droite, connectez-les via une isolation galvanique.



Eh bien, maintenant le croquis lui-même (Arduino IDE)

#comprendre #comprendre // quelques commentaires généraux // J'ai éteint une LED de bord à la fois. ils brillaient sur les panneaux décoratifs des racks // vu dans l'exemple de cette boucle 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 ; // puis change les boucles dans le bloc STOP pour (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); }

J'ai essayé de le commenter autant que possible, mais si j'ai des questions, j'essaierai d'ajouter des commentaires (je le place donc dans le texte de la critique, et non dans le fichier joint). Soit dit en passant, cela s'applique également à d'autres points de l'examen - je le compléterai également s'il y a des questions importantes dans les commentaires.

Et enfin, une démonstration de travail (pour la vidéo j'ai utilisé un sketch avec un mode démo).

Mise à jour. Le croquis avec le mode démo a été spécialement conçu pour tout faire tenir dans une courte vidéo.
Le feu stop ne clignote que lors d'un freinage brusque (comme décrit ci-dessus), en douceur et en position debout dans les embouteillages, il s'allume simplement, sans irriter les conducteurs derrière.
La luminosité dans l'obscurité n'est pas excessive. les lumières sont dirigées plus vers le haut que vers l'arrière en raison de l'inclinaison du verre.
Les lumières standard fonctionnent comme d'habitude, cette bande les duplique.

J'ai dit l'année dernière "Gop" - il est temps de sauter :)
Faites plutôt l'examen promis des clignotants en marche.
J'ai commandé 1 mètre de ruban noir WS2812B (144 LEDs) dans un tube en silicone, lors de la commande j'ai choisi "Black 1m 144led IP67" (peut-être que quelqu'un aimera la couleur blanche du substrat, il y a un tel choix).

Une petite mise en garde

J'ai reçu un ruban soudé à partir de deux pièces d'un demi-mètre. L'inconvénient de ceci est le point vulnérable de la soudure (les contacts peuvent être rompus avec le temps) et l'écart accru entre les LED.
Avant d'acheter, vérifiez auprès du vendeur pour ce moment

Les fils de contact ont été soudés au ruban des deux côtés pour la connexion en série de plusieurs pièces, car Je n'en avais pas besoin, puis j'ai scellé les fils d'un côté, scellé le tout avec un scellant neutre et enroulé un peu plus de ruban électrique noir.



Fixé au verre avec du ruban adhésif transparent double face, par exemple.

Détails de l'installation

Il a dégraissé les surfaces, a d'abord collé du ruban adhésif sur le tube (je l'appellerai ainsi, même si la section transversale est rectangulaire), a coupé l'excès saillant d'un ruban plus large, a poussé les bords du tube dans les fentes entre les plafond et les parties supérieures des panneaux décoratifs des piliers arrière (j'ai caché les fils de contact avec un connecteur derrière un panneau ), l'ai centré et a commencé à le presser contre le verre, en retirant lentement la couche protectrice du ruban adhésif.
Malheureusement, il n'y a pas de vidéo - il n'y avait pas les mains libres pour tourner et les voitures de chacun sont différentes.
Si quelque chose n'est pas clair, demandez dans les commentaires.
Le test de chaleur d'été a été un succès - rien ne s'est détaché ou n'a flotté.
Le seul point négatif est que l'angle d'inclinaison du verre est faible, les LED brillent davantage vers le haut. Par une journée ensoleillée, il est difficile de voir, mais comme ce sont des signaux en double, alors

Passons maintenant à la farce électronique.
J'ai utilisé, mais il n'y a pas si longtemps découvert

Pour environ le même coût, nous obtenons plus de petits pains

L'esquisse fonctionnera sur Wemos sans aucune modification particulière lors de la programmation dans l'IDE Arduino, et si vous implémentez un petit serveur Web, puis lorsque vous y êtes connecté via Wi-Fi, vous pouvez modifier les valeurs de variables telles que le temps de retard entre les clignotements, la quantité de décélération lors d'un freinage d'urgence, etc.
Ici, à l'avenir, si quelqu'un est intéressé par la mise en œuvre d'un projet sur l'ESP8266, je peux poster un exemple pour modifier les paramètres via l'interface Web, les enregistrer dans l'EEPROM, puis les lire.
Le serveur Web peut être lancé, par exemple, par un clignotant allumé et un appui sur la pédale de frein lorsque le contact est mis (dans la procédure de configuration, interroger l'état des entrées correspondantes).

Pour la mise en œuvre du mode clignotant avec freinage brusque, a été acheté
Le croquis surveille le niveau de décélération lorsque la pédale de frein est enfoncée, s'il dépasse 0,5 G (décélération brutale, mais sans grincement des freins), un mode clignotant est alors activé pendant quelques secondes pour attirer une attention supplémentaire.
Les signaux de contrôle vers les entrées Arduino provenant du "plus" des arrêts, des clignotants et de la marche arrière sont alimentés par des isolateurs galvaniques - des optocoupleurs avec des résistances de limitation de courant, qui forment finalement un niveau BAS aux entrées Arduino (ils sont constamment tirés vers le positif jusqu'à 10 kΩ résistances).
Alimentation - 5 volts via un convertisseur DC-DC buck.
Le tout est plié en sandwich et emballé dans une boîte adaptée, sur laquelle une flèche marquait le sens d'installation pour la bonne orientation du capteur de gravité

Schéma et photo



La valeur nominale des résistances de rappel (vers le positif) est standard - 10 kOhm, les résistances de limitation de courant de l'optocoupleur sont de 1 kOhm. J'ai abandonné les optocoupleurs des anciennes cartes, deux PC123, deux PC817.


Sur la première photo, vous pouvez voir deux conclusions supplémentaires, je les ai faites pour les clignotants. Étant donné que dans ma voiture, lorsque le levier de la colonne de direction est activé, un court-circuit à la masse se produit, j'ai connecté les fils au bloc de levier et aux entrées Arduino. Si le levier de la colonne de direction commute plus ou si vous prenez le signal des ampoules "+" des clignotants gauche / droite, connectez-les via une isolation galvanique.



Eh bien, maintenant le croquis lui-même (Arduino IDE)

#comprendre #comprendre // quelques commentaires généraux // J'ai éteint une LED de bord à la fois. ils brillaient sur les panneaux décoratifs des racks // vu dans l'exemple de cette boucle 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 ; // puis change les boucles dans le bloc STOP pour (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); }

J'ai essayé de le commenter autant que possible, mais si j'ai des questions, j'essaierai d'ajouter des commentaires (je le place donc dans le texte de la critique, et non dans le fichier joint). Soit dit en passant, cela s'applique également à d'autres points de l'examen - je le compléterai également s'il y a des questions importantes dans les commentaires.

Et enfin, une démonstration de travail (pour la vidéo j'ai utilisé un sketch avec un mode démo).

Mise à jour. Le croquis avec le mode démo a été spécialement conçu pour tout faire tenir dans une courte vidéo.
Le feu stop ne clignote que lors d'un freinage brusque (comme décrit ci-dessus), en douceur et en position debout dans les embouteillages, il s'allume simplement, sans irriter les conducteurs derrière.
La luminosité dans l'obscurité n'est pas excessive. les lumières sont dirigées plus vers le haut que vers l'arrière en raison de l'inclinaison du verre.
Les lumières standard fonctionnent comme d'habitude, cette bande les duplique.

Je prévois d'acheter +97 Ajouter aux Favoris J'ai aimé la critique +89 +191

Considérons la création d'un clignotant en marche comme une Audi, en utilisant l'exemple d'un phare d'une voiture Renault Clio. Nous ferons des clignotants et des DRL dans un seul appareil.

Ce dont vous avez besoin pour cela : Bande LED composée de LED ws2812b Contrôleur Arduino nano(peut être utilisé dans n'importe quel autre facteur de forme) Chargeur de voiture pour téléphones portables avec sortie USB. Puisque le contrôleur Arduino a besoin d'une tension de 5V, nous utiliserons ce chargeur comme convertisseur de tension de 12V à 5V. Stabilisateur de tension pour 5V KR142EN5V (KREN5V) ou tout autre analogue importé. 3 résistances 10 kOhm, comme résistance pull-up.

Diagramme de connexion

Le contrôleur arduino doit être connecté au réseau de la voiture via un convertisseur 12V -> 5V afin que la tension soit fournie au circuit à partir de l'allumage. Le fil positif du clignotant actuel doit être connecté au régulateur de tension KREN5V. Cet article traite de la connexion et du firmware d'un seul clignotant, afin de créer un deuxième clignotant, vous devez également connecter la deuxième bande LED à n'importe quelle sortie numérique libre de l'Arduino (par exemple 7), ainsi que d'ajouter le code pour cela dans le firmware selon notre exemple.

Micrologiciel du contrôleur

Pour travailler avec des LED de pixels, vous aurez besoin d'une bibliothèque ... Vous pouvez l'installer comme suit : Sketch -> Connect library -> Manage library. Ensuite, dans le menu de recherche, entrez le nom de la bibliothèque Adafruit_NeoPixel.h et cliquez sur le bouton d'installation. Après cela, insérez le croquis dans le programme et remplacez le nombre de LED dans le code (nous utilisons 22 diodes):

#comprendre // connecter la bibliothèque
Bande Adafruit_NeoPixel = Adafruit_NeoPixel (22, 8, NEO_GRB + NEO_KHZ800);
int t, t1, t2, t3, t4, p2, p1 = 0 ; // variable de temps
void setup () (
pinMode (2, ENTREE);
pinMode (3, ENTREE);
pinMode (4, ENTREE);
digitalWrite (2, FAIBLE);
digitalWrite (3, FAIBLE);
digitalWrite (4, FAIBLE);

strip.begin ();
strip.show ();

}
boucle vide () (
if (digitalRead (2) == LOW) (// Si le clignotant est éteint
pour (int i = 0; i< 23; i++) {
strip.setPixelColor (i, strip.Color (255,255,255)); // R = 255, G = 255, B = 255 - couleur blanche de la LED, lorsqu'elle est allumée, nous allumons les feux de circulation
}
strip.show ();
}

if ((digitalRead (2) == HIGH) & (t == 1)) (// vérifier si le clignotant est allumé
pour (int i = 0; i< 23; i++) {
strip.setPixelColor (i, strip.Color (0, 0, 0)); // éteint toutes les diodes
}
strip.show ();
pour (entier k = 0; k< 3; k++){ // цикл до трех - сигнал «перестроения» , при кратковременном включении мигает 3 раза,

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

if (digitalRead (2) == HIGH) (k = 0;) // si pendant le clignotement du clignotant nous obtenons un autre signal de touche, alors réinitialiser le compteur pour que le clignotant clignote au moins 3 fois de plus
strip.setPixelColor (i, strip.Color (255, 69, 0)); // R = 255, G = 69, B = 0 - Couleur LED

retard ((t4) / 22);
strip.show ();

}
if (digitalRead (2) == HIGH) (t4 = t4 + 20;) // si toutes les diodes sont allumées en jaune, mais que le signal du relais est toujours activé, alors nous augmentons le temps de combustion
if (digitalRead (2) == LOW) (t4 = t4-20;) // si toutes les diodes sont allumées en jaune, mais que le signal du relais est toujours allumé, alors nous augmentons le temps de combustion

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

strip.setPixelColor (i, strip.Color (0, 0, 0)); // R = 0, G = 0, B = 0 - Couleur LED

retard ((t3) / 22);
strip.show ();

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

if ((digitalRead (2) == HIGH) & (t == 0)) (// vérifier si le clignotant est allumé

t1 = millièmes (); // rappelez-vous à quelle heure vous avez allumé
pour (int i = 0; i< 22; i++) {
strip.setPixelColor (i, strip.Color (255, 69, 0)); // lorsque vous allumez le clignotant pour la première fois, allumez toutes les diodes en jaune
}
strip.show ();
while (digitalRead (2) == HIGH) ()
t2 = millièmes (); // rappelez-vous à quelle heure le clignotant s'est éteint
t4 = t2-t1 ;

pour (int i = 0; i< 22; i++) {
strip.setPixelColor (i, strip.Color (0, 0, 0)); // éteint les diodes lorsque le signal du relais de tour disparaît
}
strip.show ();
while (digitalRead (2) == LOW) (
si ((millis () - t2)> 2000) (pause ;)
}
si ((millis () - t2)<2000) {
t3 = millis () - t2; // heure d'extinction des clignotants
t = 1 ; // flag, nous savons que la valeur de temps a été enregistrée.
}
}

if (digitalRead (4) == HIGH) (// signaux spéciaux
pour (int j = 0; j< 16; j++) {
pour (int i = 0; i< 22; i++) {
strip.setPixelColor (i, strip.Color (255, 0, 0)); // R = 255, G = 0, B = 0 - Couleur LED
}
strip.show ();
retard (20);
pour (int i = 0; i< 22; i++){

}
strip.show ();
retard (20);
}

pour (int j = 0; j< 16; j++) {
pour (int i = 0; i< 22; i++) {
strip.setPixelColor (i, strip.Color (0, 0, 255)); // R = 0, G = 0, B = 255 - Couleur LED
}
strip.show ();
retard (20);
pour (int i = 0; i< 22; i++){
strip.setPixelColor (i, strip.Color (0, 0, 0)); // R = 0, G = 0, B = 0 - Couleur LED
}
strip.show ();
retard (20);
}
}

if (digitalRead (3) == HIGH) (// stroboscope
pour (int j = 0; j< 24; j++) {
pour (int i = 0; i< 22; i++) {
strip.setPixelColor (i, strip.Color (255, 255, 255)); // R = 255, G = 255, B = 255 - Couleur LED
}
strip.show ();

retard (15);
pour (int i = 0; i< 22; i++){
strip.setPixelColor (i, strip.Color (0, 0, 0)); // R = 0, G = 0, B = 0 - Couleur LED
}
strip.show ();
retard (15);
}
retard (500);

Faites de même pour le deuxième clignotant en utilisant le code.

Vidéo comment fonctionne notre phare

Vous avez aimé l'article ? A partager entre amis :