Inhaltsverzeichnis:
2025 Autor: John Day | [email protected]. Zuletzt bearbeitet: 2025-01-13 06:56
Als Motorradfahrer bin ich nur allzu vertraut damit, im Straßenverkehr wie unsichtbar behandelt zu werden. Eine Sache, die ich meinen Fahrrädern immer hinzufüge, ist ein Topcase, das normalerweise ein integriertes Licht hat. Ich habe vor kurzem auf ein neues Fahrrad umgerüstet und die Givi V56 Monokey Box gekauft, da sie viel Platz für Gegenstände bietet. Diese Box hat einen Spot für ein Fabrikbeleuchtungsset, das aus zwei LED-Streifen für jede Seite besteht. Das Problem ist, dass dieses Kit etwa 70 US-Dollar kostet und nur bremst. Es gibt ein Aftermarket-Kit, das wahrscheinlich ähnliche Dinge tut und möglicherweise etwas einfacher zu installieren ist, aber Ihr Preis beträgt bis zu 150 US-Dollar. Als einfallsreicher Mensch und auf der Suche nach einer Ausrede, um die adressierbaren LED-Streifen auszuprobieren, beschloss ich, ein integriertes System zu entwickeln, das nicht nur Bremslichter, sondern auch Lauflichter (bei jeder Bewegung eingeschaltet), Blinker und Warnblinker hat. Nur zum Teufel habe ich sogar eine Startsequenz hinzugefügt…. weil ich konnte. Beachten Sie, dass dies viel Arbeit erforderte, obwohl ich eine Menge Dinge herausfinden musste. Trotz der Arbeit bin ich ziemlich zufrieden mit dem Ergebnis. Hoffentlich ist dies am Ende nützlich für jemand anderen.
Die grundlegende Funktionsweise dieses Systems besteht darin, dass die Arduino-Einheit nach Signalen an den Pins sucht: Bremslicht, linkes Abbiegelicht und rechtes Abbiegelicht. Um das 12-Volt-Signal vom Motorrad zu lesen, habe ich Optoisolatoren verwendet, um das 12-V-Signal in ein 5-V-Signal umzuwandeln, das Arduino lesen kann. Der Code wartet dann auf eines dieser Signale und gibt dann die Befehle mithilfe der FastLED-Bibliothek an den LED-Streifen aus. Das sind die Grundlagen, jetzt kommen wir ins Detail.
Lieferungen
Das sind die Dinge, die ich benutzt habe, weil ich sie zum größten Teil schon herumliegen hatte. Selbstverständlich können sie bei Bedarf ausgetauscht werden:
- Arduino - Ich habe aus Größengründen einen Nano verwendet, aber Sie können alles verwenden, was Sie möchten, solange Sie fünf Stifte verwenden können.
- 5V-Regler - Ich habe einen L7805CV verwendet, der 1,5 Ampere leistet. Dieses Projekt verwendet 0,72 Ampere für die LEDs plus die Leistung für den Nano, also funktioniert 1,5 für dieses Projekt hervorragend.
- Kondensatoren - Sie benötigen einen 0,33 uF und einen 0,1 uF, damit der Spannungsregler ordnungsgemäß funktioniert.
- 3x Optoisolatoren - um die Signalumwandlung von 12V auf 5V durchzuführen. Ich habe den Typ PC817X verwendet, der nur vier Pins hat, was alles ist, was wir brauchen.
- Widerstände - Sie benötigen zwei Typen, drei von jedem Typ. Der erste muss ausreichen, um den Strom durch die IR-LED des Optoisolators zu reduzieren. Sie benötigen mindestens 600 Ohm, aber 700 sind eine bessere Idee, um mit wechselnden Spannungen am Motorrad umzugehen. Der andere muss irgendwo zwischen 10k und 20k liegen, um ein schnelles Signal auf der anderen Seite des Optoisolators zu erhalten.
- Prototypenplatine - Ich hatte einige, die klein genug waren, um mit etwas Beschnitt in eine kleine Projektbox zu passen.
- Projektbox – groß genug für die Komponenten, aber klein genug für eine einfache Montage.
- Kabel - Ich habe Cat 6-Ethernet-Kabel verwendet, weil ich viel davon hatte. Dies hat acht Drähte, die alle farbkodiert sind, was bei all den verschiedenen Anschlüssen geholfen hat und groß genug war, um die Stromentnahmen zu bewältigen.
- Stecker – überall dort, wo das System leicht abnehmbar sein soll. Ich habe einen wasserdichten Stopfen verwendet, damit die Top-Box entfernt werden kann und Regen oder Wasser darauf kommt. Ich brauchte auch kleinere Stecker für die LED-Streifen, damit ich keine großen Löcher bohren musste.
- Kabelbinder und Kabelbinder-Klebehalterungen, um alles an Ort und Stelle zu halten.
- Schrumpffolie zum Aufräumen der Verbindungen.
Schritt 1: Aufbau der Schaltung
Wenn Sie meinem Build folgen, müssen Sie natürlich nicht so viele Tests durchführen wie ich. Das erste, was ich tat, war, sicherzustellen, dass mein Code funktionierte und ich ein Signal von den Optoisolatoren richtig erhalten und die LED-Streifen richtig steuern konnte. Es dauerte einen Moment, um herauszufinden, wie man die Signalstifte am besten an die Isolatoren anschließt, aber durch Ausprobieren fand ich die richtige Ausrichtung. Ich habe nur ein Standard-Prototyp-Board verwendet, da ich nur eines gebaut habe und das Herausfinden eines Spurmusters mehr Zeit in Anspruch genommen hätte, als es wert war. Der obere Teil der Platine sieht toll aus, aber der untere sieht etwas unordentlich aus, ist aber zumindest funktional.
Das grundlegende Design beginnt mit der Eingabe der 12-V-Stromversorgung von einer geschalteten Quelle (einem Kabel, das nur eingeschaltet ist, wenn das Motorrad eingeschaltet ist). Ein Schaltplan kann wirklich helfen, diesen Draht zu finden. Dieser wird in eine Seite des Spannungsreglers eingespeist. Ein Kondensator mit 0,33 uF verbindet diesen Eingang mit der Masse des Spannungsreglers, der dann auf die Masse des Motorrads zurückgeführt wird. Der Ausgang des Spannungsreglers hat einen 0,1uF-Kondensator, der mit Masse verbunden ist. Diese Kondensatoren helfen, die Spannung vom Regler zu glätten. Wenn Sie diese auf dem Bild der Platine nicht finden, befinden sie sich unter dem Spannungsregler. Von dort geht die 5V-Leitung zum Vin auf dem Arduino, zum Power-Pin, der die LED-Streifen speist, und zwei zur Source-Seite des Optoisolators, die in die Arduino-Pins einspeisen, die das benötigte 5V-Signal liefern.
Bei den Optoisolatoren gibt es zwei Seiten: eine mit einer IR-LED und die andere mit einem Transistor mit einem IR-Detektor. Wir möchten die IR-LED-Seite verwenden, um das 12V-Signal zu messen. Da die LED eine Durchlassspannung von 1,2 V hat, benötigen wir einen Strombegrenzungswiderstand in Reihe. 12V - 1,2V = 10,8V und um die LED mit 18 mA zu betreiben (ich möchte aus Lebensdauergründen immer weniger als 20 mA betreiben), benötigen Sie einen Widerstand von R = 10,8V/0,018A = 600 Ohm. Die Spannungen an Fahrzeugen neigen auch dazu, höher zu laufen, möglicherweise bis zu 14 V, daher ist es besser, dies einzuplanen, was etwa 710 Ohm beträgt, obwohl 700 mehr als vernünftig wären. Der Ausgang für die LED-Seite führt dann auf Masse zurück. Für die Ausgangsseite des Optoisolators verwendet der Eingang das 5V-Signal des Reglers, dann wird der Ausgang mit einem anderen Widerstand verbunden, bevor er auf Masse geht. Dieser Widerstand muss nur etwa 10k - 20k Ohm betragen, zumindest hat das mein Datenblatt gezeigt. Dies ermöglicht eine schnelle Signalmessung, da wir es nicht mit einer lauten Umgebung zu tun haben. Der Ausgang zum Arduino-Pin wird zwischen dem Widerstand und dem Ausgang des Optoisolators ausgeschaltet, so dass, wenn das Signal ausgeschaltet ist, der Pin niedrig ist und wenn das Signal am Pin hoch ist.
Den LED-Streifen sind drei Drähte zugeordnet: Strom, Masse und Daten. Die Stromversorgung muss 5V betragen. Dieses Projekt verwendet insgesamt 12 LEDs (obwohl ich mehr LEDs auf den Streifen habe, aber ich verwende nur jede dritte LED) und jede benötigt 60 mA, wenn weißes Licht bei voller Helligkeit verwendet wird. Das ergibt insgesamt 720 mA. Wir sind gut innerhalb der Ausgangsleistung für den Spannungsregler, also sind wir gut. Stellen Sie nur sicher, dass das Kabel groß genug ist, um die Leistung zu bewältigen. Ich habe ein 24-Gauge-Cat-6-Ethernet-Kabel verwendet. Ethernet-Draht war etwas, das ich herumgesessen hatte und es hat 8 farbcodierte Drähte, so dass es für dieses Projekt gut funktioniert hat. Die einzigen Drähte, die dann zur Topbox selbst gehen müssen, sind Strom und Masse (die beide zwischen den Streifen aufgeteilt werden) und zwei Datenleitungen (eine für jeden Streifen).
Der Rest der Verkabelung wird mit den Pins des Arduino verbunden und mit Strom versorgt. Die Pins, die für dieses Projekt verwendet wurden, waren die folgenden:
- Vin - an 5V. angeschlossen
- Gnd - mit Masse verbunden
- Pin2 - verbunden mit der linken Strip-Datenleitung
- Pin3 - verbunden mit der rechten Streifendatenleitung
- Pin4 - verbunden mit Bremssignal vom Optoisolator
- Pin5 - verbunden mit dem linken Blinker vom Optoisolator
- Pin6 - verbunden mit dem rechten Blinker vom Optoisolator
Schritt 2: Verkabelung und Installation
Sobald die Schaltung aufgebaut ist, ist es an der Zeit, diese tatsächlich zu verdrahten. Anhand Ihres Schaltplans für Ihr Fahrrad müssen Sie Folgendes finden:
- Schaltnetzteil
- Boden
- Bremssignaleingang
- Linker Blinkereingang
- Rechter Blinker In
Für meinen gab es einen einzigen Stecker, der all dies hatte, also habe ich ihn einfach verwendet. Mit genügend Zeit hätte ich vielleicht den gleichen Steckerstil finden und nur ein Steckmodul herstellen können, aber das tat ich nicht, also habe ich nur stellenweise die Isolierung entfernt und das neue Kabel daran angelötet. Ich habe Stecker an diesen gespleißten Verbindungen verwendet, damit ich den Rest entfernen kann, falls ich es in Zukunft jemals brauchen sollte. Von dort habe ich den Arduino, der sich jetzt in einer versiegelten Projektbox befindet, unter den Sitz gelegt, an dem ich ihn befestigt habe. Das Ausgangskabel verläuft dann entlang des Rackrahmens zu einem wasserdichten Stecker, tritt dann in die Box ein und verläuft entlang der Rückseite zum Deckel, wo es sich für jede Seite teilt. Die Drähte laufen an der Innenseite des Deckels entlang bis zu der Stelle, an der sich die Anschlüsse für die LEDs befinden. Der Draht wird mithilfe von Kabelbindern befestigt, die an Kabelbindern in Outdoor-Qualität mit einer selbstklebenden Rückseite befestigt sind. Diese finden Sie im Bereich Kabelinstallation im Baumarkt
Ich habe zwei Mini-JST-Stecker an den LED-Streifen verwendet, weil ich einen Stecker brauchte, der klein genug war, um durch ein Loch mit minimalem Durchmesser zu gehen, und weil ich sicherstellen wollte, dass genügend Draht vorhanden war, um die aktuellen Anforderungen zu erfüllen. Auch hier war es vielleicht übertrieben und ich hatte keine kleinen Stecker mit drei Drähten zur Hand. Das Loch in der Box für die Durchführung der Lichtbanddrähte wurde abgedichtet, um Wasser fernzuhalten. Was die Positionierung der LED-Streifen anbelangt, habe ich sie so positioniert, dass sie den Unterschied zwischen der LED und den LEDs aufteilen, da der Abstand leicht nicht übereinstimmt (es gab etwa 1 - 1,5 mm Abstand zwischen den Löchern im Reflektor und den LEDs). das Loch so weit wie möglich. Ich habe dann Heißkleber verwendet, um sie an Ort und Stelle zu kleben, und Dichtungsmittel, um den Bereich vollständig zu versiegeln. Die LED-Streifen selbst sind wasserdicht, also kein Problem, wenn sie nass werden. Obwohl es viel zu installieren zu sein scheint, erleichtert dies das Entfernen des Systems in Zukunft oder es werden Teile ausgetauscht, da dies passieren könnte.
Schritt 3: Der Code
Mein Quellcode sollte am Anfang dieses Instructable stehen. Ich kommentiere meinen Code immer stark, damit er später leichter zu verstehen ist. Haftungsausschluss: Ich bin kein professioneller Code-Autor. Der Code wurde in einer Methode geschrieben, die zuerst einfacher zu starten war, und es wurden einige Verbesserungen vorgenommen, aber ich weiß, dass er verfeinert werden könnte. Ich verwende auch einen Großteil der Funktion delay () für das Timing, was nicht so ideal ist. Allerdings sind die Signale, die das Gerät empfängt, im Vergleich keine schnellen Signale, daher fühlte ich mich immer noch berechtigt, sie mit etwas wie millis() zu behalten. Ich bin auch ein sehr beschäftigter Vater und Ehemann, daher steht es nicht ganz oben auf der Liste, Zeit zu investieren, um etwas zu verbessern, das die Funktion letztendlich nicht ändert.
Für dieses Projekt wird nur eine Bibliothek benötigt, nämlich die FastLED-Bibliothek. Dies hat den gesamten Code zur Steuerung der LED-Streifen vom Typ WS2811/WS2812B. Von dort aus werde ich die grundlegenden Funktionen behandeln, die verwendet werden.
Die erste andere als die Standarddefinitionen besteht darin, Ihre beiden Streifen zu deklarieren. Sie verwenden den folgenden Code für jeden Streifen:
FastLED.addLeds(leds[0], NUM_LEDS);
Diese Codezeile richtet Pin 2 ein, definiert diesen Streifen als Streifen 0 mit der Anzahl der LEDs, die durch die Konstante NUM_LEDS definiert sind, die in meinem Fall auf 16 gesetzt ist. Um den zweiten Streifen zu definieren, wird die 2 zu 3 (für Pin3) und der Streifen wird mit Streifen 1 bezeichnet.
Die nächste wichtige Zeile ist die Farbdefinition.
leds[0][1] = Color_high CRGB(r, g, b);
Diese Codezeile wird jedoch in verschiedenen Looks verwendet (die meisten von mir verwenden eine Konstante). Grundsätzlich sendet dieser Code an jeden der LED-Kanäle (rot, grün, blau) einen Wert, der jede Helligkeit definiert. Der Helligkeitswert kann durch eine Zahl von 0 - 255 definiert werden. Durch Ändern der Helligkeit für jeden Kanal können Sie verschiedene Farben definieren. Für dieses Projekt möchte ich eine weiße Farbe, um das Licht so hell wie möglich zu halten. Die einzige Änderung, die ich vornehme, besteht darin, die Helligkeitsstufe für alle drei Kanäle gleich einzustellen.
Der nächste Codesatz wird verwendet, um jedes Licht einzeln zu beleuchten. Beachten Sie, dass jede LED für jeden Streifen eine Adresse hat, die bei 0 für diejenige beginnt, die der Datenleitungsverbindung am nächsten ist, bis zur höchsten LED-Nummer minus 1. Beispiel, dies sind 16 LED-Streifen, also ist die höchste 16 - 1 = 15. Der Grund dafür ist, dass die erste LED mit 0 beschriftet ist.
for (int i = NUM_LEDS-1; i > -1; i = i - 3) {// Dies ändert das Licht für jede dritte LED von der letzten zur ersten. leds[0] = Color_low; // Setze die LED-Farbe des Streifens 0 auf die gewählte Farbe. LEDs[1] = Color_low; // Setze die LED-Farbe des Streifens 1 auf die gewählte Farbe. FastLED.show(); // Zeigen Sie die eingestellten Farben an. leds[0] = CRGB::Schwarz; // Deaktivieren Sie die eingestellte Farbe in der Vorbereitung für die nächste Farbe. LEDs[1] = CRGB::Schwarz; Verzögerung (150); } FastLED.show(); // Zeigen Sie die eingestellten Farben an.
Die Funktionsweise dieses Codes besteht darin, dass eine Variable (i) innerhalb einer for-Schleife als LED-Adresse verwendet wird, die dann auf die volle Anzahl von LEDs (NUM_LEDS) referenziert wird. Der Grund dafür ist, dass ich möchte, dass die Lichter am Ende des Streifens beginnen und nicht am Anfang. Die Einstellung wird auf beide Streifen (leds[0] und leds[1]) ausgegeben, dann wird ein Befehl ausgegeben, um die Änderung anzuzeigen. Danach wird dieses Licht ausgeschaltet (CRGB::Black) und das nächste Licht leuchtet. Die Black-Referenz ist eine bestimmte Farbe in der FastLED-Bibliothek, sodass ich nicht 0, 0, 0 für jeden Kanal ausgeben muss, obwohl sie dasselbe tun würden. Die For-Schleife schaltet 3 LEDs gleichzeitig (i = i-3) weiter, da ich nur jede andere LED verwende. Am Ende dieser Schleife geht die Lichtsequenz von einer LED zur nächsten, wobei nur eine pro Streifen aufleuchtet, eine Art Knight-Rider-Effekt. Wenn Sie jedes Licht leuchten lassen möchten, damit sich die Leiste aufbaut, entfernen Sie einfach die Zeilen, die die LEDs ausschalten, was im nächsten Codesatz im Programm geschieht.
for (int i = 0; i < dim; i++) {// Lichter schnell auf Lauflichtniveau überblenden. rt = rt + 1; gt = gt + 1; bt = bt + 1; for (int i = 9; i < NUM_LEDS; i = i +3) {// Dies wird die letzten drei Lichter für das Positionslicht aufleuchten. leds[0] = CRGB(rt, gt, bt); // Setze die LED-Farbe des Streifens 0 auf die gewählte Farbe. LEDs [1] = CRGB (rt, gt, bt); // Setze die LED-Farbe von Streifen 1 auf die gewählte Farbe. } FastLED.show(); Verzögerung(3); }
Das letzte Codebeispiel, das ich für die LEDs verwende, ist eine Fade-Schleife. Hier verwende ich temporäre Slots für die Helligkeit für jeden Kanal (rt, gt, bt) und erhöhe sie um 1 mit einer Verzögerung zwischen den einzelnen Anzeigen, um das gewünschte Erscheinungsbild zu erzielen. Beachten Sie auch, dass dieser Code nur die letzten drei LEDs ändert, da dies die Lauflichter einblendet, sodass ich bei 9 und nicht bei 0 starte.
Der Rest des LED-Codes besteht aus Iterationen davon. Alles andere konzentriert sich darauf, auf den drei verschiedenen Drähten nach einem Signal zu suchen. Der Loop()-Bereich des Codes sucht nach Bremslichtern, die einmal blinken, bevor sie eingeschaltet bleiben (dies ist auf Wunsch einstellbar) oder nach Blinkern suchen. Da ich für diesen Code nicht davon ausgehen konnte, dass die linken und rechten Abbiegelichter für Gefahren genau gleichzeitig eingeschaltet werden, lasse ich den Code zuerst nach einem suchen und dann nach einer kleinen Verzögerung prüfen, ob beide eingeschaltet sind die Warnblinkanlage brennt. Der einzige knifflige Teil, den ich hatte, waren Blinker, da das Licht für einige Zeit ausgeht. Was ich herausgefunden habe, war die Implementierung einer Verzögerungsschleife, die so eingestellt ist, dass sie länger dauert als die Verzögerung zwischen den Signalblitzen. Wenn der Blinker noch leuchtet, wird die Signalschleife fortgesetzt. Wenn das Signal am Ende der Verzögerung nicht wieder einschaltet, geht es zurück zum Anfang der Schleife(). Um die Länge der Verzögerung anzupassen, ändern Sie die Zahl für die konstante lightDelay, wobei sich die Verzögerung für jede 1 in lightDelay um 100 ms ändert.
Während (digitalRead (leftTurn) == LOW) { for(int i = 0; i <lightDelay; i++) { leftTurnCheck(); if (digitalRead (leftTurn) == HIGH) { leftTurnLight (); } Verzögerung (100); } for (int i = 0; i < NUM_LEDS; i = i +3) {// Dies ändert das Licht für jede dritte LED von der letzten zur ersten. LEDs[0] = CRGB(0, 0, 0); // Setze die LED-Farbe des Streifens 0 auf die gewählte Farbe. } for (int i = 9; i < NUM_LEDS; i = i +3) { // Dadurch werden die Lauflichter eingerichtet, die nur die letzten drei verwenden. leds[0] = Color_low; // Setze die LED-Farbe des Streifens 0 auf die gewählte Farbe. } FastLED.show(); // Ausgabeeinstellungen zurück; // Sobald der Blinker nicht mehr eingeschaltet ist, gehen Sie zurück zur Schleife. }
Hoffentlich ist der Rest des Codes selbsterklärend. Es ist nur eine sich wiederholende Reihe von Überprüfungen und Reaktionen auf Signale.
Schritt 4: Ergebnisse
Das Erstaunliche daran war, dass dieses System funktionierte, als ich es zum ersten Mal mit dem Fahrrad verkabelte. Um fair zu sein, habe ich es vorher auf der Bank ausgiebig getestet, aber ich habe immer noch erwartet, dass es ein Problem oder eine Anpassung gibt. Es stellte sich heraus, dass ich keine Anpassungen am Code sowie an den Verbindungen vornehmen musste. Wie Sie im Video sehen können, durchläuft das System die Startsequenz (die Sie nicht haben müssen) und wechselt dann standardmäßig in das Lauflicht. Danach sucht es nach den Bremsen, in diesem Fall werden alle LEDs auf volle Helligkeit leuchten und einmal blinken, bevor sie eingeschaltet bleiben, bis die Bremsen gelöst werden. Wenn ein Blinker verwendet wird, habe ich einen Scroll-Effekt für die Seite erstellt, auf der die Abbiegung angezeigt wird, und die andere Seite ist entweder ein Lauflicht oder ein Bremslicht, wenn es eingeschaltet ist. Warnblinker blinken einfach im Takt mit den anderen Lichtern.
Hoffentlich werde ich mit diesen zusätzlichen Lichtern für andere besser sichtbar. Zumindest ist es eine nette Ergänzung, um meine Box ein bisschen mehr als andere hervorzuheben und gleichzeitig einen Nutzen zu bieten. Ich hoffe, dieses Projekt ist auch für jemand anderen nützlich, auch wenn er nicht mit einer Motorrad-Top-Box-Beleuchtung arbeitet. Vielen Dank!