DIY Givi V56 Topbox Lightbox Kit med integrerade signaler: 4 steg (med bilder)
DIY Givi V56 Topbox Lightbox Kit med integrerade signaler: 4 steg (med bilder)
Anonim
Image
Image
DIY Givi V56 Topbox Lightbox Kit med integrerade signaler
DIY Givi V56 Topbox Lightbox Kit med integrerade signaler
DIY Givi V56 Topbox Lightbox Kit med integrerade signaler
DIY Givi V56 Topbox Lightbox Kit med integrerade signaler

Som motorcyklist är jag alltför bekant med att bli behandlad som att jag är osynlig på vägen. En sak som jag alltid lägger till i mina cyklar är en toppbox som vanligtvis har ett integrerat ljus. Jag uppgraderade nyligen till en ny cykel och köpte Givi V56 Monokey -lådan eftersom den hade gott om plats för föremål. Denna låda har plats för ett fabriksljuskit som består av två remsor av lysdioder för varje sida. Problemet är att detta kit kostar cirka $ 70 och bara bromsar. Det finns ett eftermarknadssats som förmodligen gör liknande saker och kan vara lite lättare att installera, men ditt pris går upp till $ 150. Eftersom jag var en påhittig person och letade efter en ursäkt för att prova de adresserbara LED -remsorna, bestämde jag mig för att skapa ett integrerat system som inte bara skulle ha bromsljus, utan körljus (tänd vid rörelse), blinkers och varningsljus. Bara för fan, jag har till och med lagt till en startsekvens … för jag kunde. Observera att detta tog mycket arbete att göra även om jag hade många saker att ta reda på. Trots arbetet är jag ganska nöjd med hur detta blev. Förhoppningsvis slutar detta vara användbart för någon annan.

Den grundläggande funktionen för hur detta system fungerar är Arduino -enheten som letar efter signaler på stiften: bromsljus, vänster svängljus och höger svängljus. För att läsa 12 -voltsignalen från motorcykeln använde jag optoisolatorer för att konvertera 12V -signalen till en 5V -signal som Arduino kan läsa. Koden väntar sedan på en av dessa signaler och matar sedan ut kommandona till LED -remsan med hjälp av FastLED -biblioteket. Det är grunderna nu för att komma in i detaljerna.

Tillbehör

Det här är de saker som jag använde eftersom jag för det mesta redan hade dem liggande. Uppenbarligen kan de bytas ut efter behov:

  1. Arduino - Jag använde en nano för storlekskänslor men du kan använda vad du vill så länge du har fem stift att använda.
  2. 5V regulator - jag använde en L7805CV som kunde 1,5 ampere. Detta projekt kommer att använda 0,72 ampere för lysdioderna plus effekten för nano, så 1,5 fungerar bra för detta projekt.
  3. Kondensatorer - du behöver en 0,33 uF och en 0,1 uF för att spänningsregulatorn ska fungera korrekt.
  4. 3x optoisolatorer - för att göra signalomvandlingen från 12V till 5V. Jag använde PC817X -typ som bara har fyra stift vilket är allt vi behöver.
  5. Motstånd - du behöver två typer, tre av varje typ. Det första måste vara tillräckligt för att minska strömmen genom optoisolator IR LED. Du behöver minst 600 ohm, men 700 skulle vara en bättre idé att hantera ändrade spänningar på motorcykeln. Den andra måste vara någonstans mellan 10k och 20k för en snabb signal på andra sidan av optoisolatorn.
  6. Prototypbräda - Jag hade några som var tillräckligt små för att passa inuti en liten projektlåda med lite trimning.
  7. Projektlåda - tillräckligt stor för att passa komponenterna, men tillräckligt liten för att vara lätt att montera.
  8. Wire - Jag använde Cat 6 ethernet wire eftersom jag hade mycket av det sittande. Denna har åtta trådar alla färgkodade vilket hjälpte till med alla olika anslutningar och var en tillräckligt stor mätare för att hantera de aktuella dragningarna.
  9. Pluggar - var som helst du vill att systemet ska vara lätt att ta bort. Jag använde en vattentät kontakt för att låta den övre lådan tas bort och för att hantera eventuellt regn eller vatten som kommer på den. Jag behövde också mindre pluggar för LED -remsorna så att jag inte behövde borra stora hål.
  10. Dragkedjor och dragkedjor för att hålla allt på plats.
  11. Krympa för att städa upp anslutningarna.

Steg 1: Bygg kretsen

Bygga kretsen
Bygga kretsen
Bygga kretsen
Bygga kretsen
Bygga kretsen
Bygga kretsen

Uppenbarligen, om du följer min konstruktion behöver du inte gå igenom mängden tester jag gjorde. Det första jag gjorde var att se till att min kod fungerade och att jag kunde få en signal från optoisolatorerna och kontrollera LED -remsorna ordentligt. Det tog en stund att ta reda på hur man bäst skulle fästa signalstiften på isolatorerna men genom försök och fel hittade jag rätt riktning. Jag använde precis en vanlig prototypbräda eftersom jag bara byggde en och räknade ut ett spårmönster skulle ha tagit mer tid än det var värt. Den övre delen av kretskortet ser bra ut, men botten ser ut som lite rörig, men åtminstone är den funktionell.

Grunddesignen börjar med att mata in 12V -strömmen från en omkopplad källa (en kabel som bara är på när motorcykeln är på). Ett kopplingsschema kan verkligen hjälpa till att hitta denna tråd. Detta matas in på en sida av spänningsregulatorn. En 0,33 uF kondensator binder denna ingång till marken på spänningsregulatorn som sedan matar tillbaka till marken på motorcykeln. Spänningsregulatorns utgång kommer att ha en 0.1uF kondensator bunden i den till marken. Dessa kondensatorer hjälper till att jämna ut spänningen från regulatorn. Om du inte hittar dem på bilden av kretskortet är de under spänningsregulatorn. Därifrån går 5V -ledningen till Vin på Arduino, till strömstiftet som matar LED -remsorna och två källsidan av optoisolatorn som matas in i Arduino -stiften som ger den 5V -signal som behövs.

När det gäller optoisolatorerna finns det två sidor: en med en IR -LED och den andra med en transistor med och IR -detektor. Vi vill använda IR LED -sidan för att mäta 12V -signalen. Eftersom lysdioden har en framspänning på 1,2V behöver vi ett strömbegränsande motstånd i serie. 12V - 1.2V = 10.8V och för att köra lysdioden vid 18 mA (jag gillar alltid att köra mindre än 20 mA av livstidsskäl) behöver du ett motstånd på R = 10.8V/0.018A = 600 ohm. Spänningar på fordon tenderar också att gå högre, potentiellt upp till 14V, så det är bättre att planera för det, vilket är cirka 710 ohm, men 700 skulle vara mer än rimligt. Utgången för LED -sidan matas sedan tillbaka till marken. För optoisolatorns utsida använder ingången 5V -signalen från regulatorn, sedan kommer utgången att ansluta till ett annat motstånd innan det går till marken. Detta motstånd behöver bara vara runt 10k - 20k ohm, det är åtminstone vad min datablad visade. Detta ger en snabb signalmätning eftersom vi inte har att göra med en bullrig miljö. Utgången till Arduino -stiftet kommer att släppas mellan motståndet och utsignalen från optoisolatorn så att när signalen är avstängd är stiftet lågt och när signalen är på stiftet är hög.

LED -remsorna har tre ledningar kopplade till dem: Ström, jord och data. Strömmen måste vara 5V. Detta projekt använder totalt 12 lysdioder (även om jag har fler lysdioder på remsorna men jag använder bara var tredje lysdiod) och tar varje 60mA när vitt ljus används vid full ljusstyrka. Detta ger totalt 720 mA. Vi är väl inom uteffekten för spänningsregulatorn, så vi är bra. Se bara till att tråden är tillräckligt stor för att hantera strömmen, jag använde 24 gauge Cat 6 ethernet wire. Ethernet -tråd var något som jag satt och hade 8 färgkodade trådar så det fungerade bra för det här projektet. De enda ledningarna som sedan behöver gå till själva toppboxen är ström och jord (som båda delas mellan remsorna) och två datalinjer (en för varje remsa).

Resten av ledningarna ansluter till stiften på arduino och matar den ström. Stiften som användes för detta projekt var följande:

  1. Vin - ansluten till 5V
  2. Gnd - ansluten till jord
  3. Pin2 - ansluten till vänster banddatalinje
  4. Pin3 - ansluten till höger banddatalinje
  5. Pin4 - ansluten till bromssignal från optoisolatorn
  6. Pin5 - ansluten till vänster blinkers från optoisolatorn
  7. Pin6 - ansluten till höger blinkers från optoisolatorn

Steg 2: Kabeldragning och installation

Kabeldragning och installation
Kabeldragning och installation
Kabeldragning och installation
Kabeldragning och installation
Kabeldragning och installation
Kabeldragning och installation

När kretsen väl är byggd är det dags att faktiskt koppla in den på plats. Med hjälp av din kopplingsschema för din cykel måste du hitta följande:

  • Växlad strömförsörjning
  • Jord
  • Bromssignal in
  • Vänster blinkersignal
  • Höger svängningssignal

För min var det en enda kontakt som hade alla dessa på den, så jag använde den bara. Med tillräckligt med tid hade jag kanske kunnat hitta samma pluggstil och bara göra en plug -in -modul, men det gjorde jag inte, så jag tog bara bort isoleringen på platser och lodde den nya tråden till den. Jag använde pluggar på dessa skarvade anslutningar så att jag kunde ta bort resten om jag någonsin skulle behöva i framtiden. Därifrån placerade jag Arduino, som nu finns i en förseglad projektlåda, under sätet där jag fäst den. Utmatningskabeln går sedan längs med stativramen till en vattentät kontakt, går sedan in i lådan och går längs baksidan till locket där den delas för varje sida. Ledningarna löper längs insidan av locket till den punkt där anslutningarna för lysdioderna finns. Tråden hjälper till på plats med dragkedjor som är fästa vid dragkedjefästen utomhus med en självhäftande baksida. Du hittar dessa i kabelinstallationsavsnittet i en butik för förbättringar av hemmet

Jag använde två mini JST -kontakter på LED -remsorna eftersom jag behövde en plugg som var tillräckligt liten för att gå igenom ett hål med minsta diameter och för att jag ville se till att det fanns tillräckligt med tråd för att klara de nuvarande kraven. Återigen kan det ha varit överkill och jag hade inga små pluggar med tre ledningar till hands. Hålet i lådan för ljusbandstrådarna att passera genom förseglades för att hålla vattnet ute. När det gäller att placera LED -remsorna, eftersom det finns en liten ojämnhet i avståndet (det var ungefär 1 - 1,5 mm skillnad i avståndet mellan hålen i reflektorn och lysdioderna) placerade jag dem så att de skulle dela skillnaden mellan LED och hålet så mycket som möjligt. Jag använde sedan varmt lim för att klistra dem på plats och tätningsmedel för att helt försegla området. Själva LED -remsorna är vattentäta, så inga problem om de blir blöta. Även om det verkar mycket att installera, gör detta systemet lättare att ta bort i framtiden eller byta ut delar eftersom det kan hända.

Steg 3: Koden

Min källkod bör vara i början av denna instruktionsbok. Jag kommenterar alltid min kod kraftigt så det är lättare att förstå senare. Friskrivningsklausul: Jag är inte en professionell kodskrivare. Koden skrevs på en metod som var lättare att komma igång först och några förbättringar gjordes, men jag vet att den kan bli mer förfinad. Jag använder också en stor mängd fördröjning () -funktion för timing som inte är lika idealisk. Signalerna som enheten tar emot är dock inte snabba signaler i jämförelse, så jag kände mig fortfarande berättigad att hålla dem över med något som millis (). Jag är också en mycket upptagen pappa och make, så att spendera tid på att förbättra något som i slutändan inte kommer att förändra funktionen är inte högt på listan.

För detta projekt krävs bara ett bibliotek som är FastLED -biblioteket. Denna har all kod för styrning av LED -remsor av typen WS2811/WS2812B. Därifrån kommer jag att täcka de grundläggande funktionerna som kommer att användas.

Den första andra än standarddefinitionerna är att deklarera dina två remsor. Du kommer att använda följande kod för varje remsa:

FastLED.addLeds (leds [0], NUM_LEDS);

Denna kodrad anger Pin 2 definierar denna remsa som remsa 0 med antalet lysdioder definierade av konstanten NUM_LEDS, som i mitt fall är satt till 16. För att definiera den andra remsan blir 2: an 3 (för pin3) och remsan kommer att märkas som remsa 1.

Nästa rad som kommer att vara viktig är färgdefinition.

leds [0] [1] = Color_high CRGB (r, g, b);

Denna kodrad används dock i olika utseende (de flesta av mina använder en konstant). I grund och botten skickar denna kod ett värde till var och en av LED -kanalerna (rött, grönt, blått) som definierar varje ljusstyrka. Ljusstyrkan kan definieras med siffran 0 - 255. Genom att ändra ljusstyrkan för varje kanal kan du definiera olika färger. För det här projektet vill jag ha en vit färg för att hålla ljuset så starkt som möjligt. Så de enda ändringarna jag gör är att ställa in ljusstyrkan på samma sätt över alla tre kanalerna.

Nästa uppsättning kod används för att tända varje ljus individuellt. Observera att för varje remsa har varje lysdiod en adress som börjar på 0 för den som ligger närmast datalinjeförbindelsen ända upp till den högsta sifferdioden du har minus 1. Exempel, dessa är 16 LED -remsor, så den högsta är 16 - 1 = 15. Anledningen till detta är att den första lysdioden är märkt 0.

for (int i = NUM_LEDS -1; i> -1; i = i -3) {// Detta ändrar ljuset för var tredje lysdiod som går från den sista till den första. leds [0] = Color_low; // Ställ in remsan 0 LED -färg på den valda färgen. leds [1] = Color_low; // Ställ in remsa 1 LED -färg på den valda färgen. FastLED.show (); // Visa de uppsatta färgerna. leds [0] = CRGB:: Svart; // Stäng av den inställda färgen i förberedelserna för nästa färg. leds [1] = CRGB:: Svart; fördröjning (150); } FastLED.show (); // Visa de uppsatta färgerna.

Sättet med denna kod är att en variabel (i) används inom en for loop som LED -adressen som sedan refereras till hela antalet lysdioder (NUM_LEDS). Anledningen till detta är att jag vill att lamporna ska börja i slutet av remsan snarare än början. Inställningen matas ut till både remsor (leds [0] och leds [1]) och sedan utfärdas ett kommando för att visa ändringen. Därefter släcks denna lampa (CRGB:: Svart) och nästa lampa tänds. Den svarta referensen är en specifik färg i FastLED -biblioteket så jag behöver inte utfärda 0, 0, 0 för varje kanal även om de skulle göra samma sak. For-slingan avancerar 3 lysdioder åt gången (i = i-3) eftersom jag bara använder varannan lysdiod. I slutet av den här slingan kommer ljussekvensen att gå från en LED till nästa med bara en tänd per remsa, en slags Knight Rider -effekt. Om du vill hålla varje ljus tänt så att stapeln byggs upp tar du bara bort linjerna som stänger av lysdioderna som händer i nästa koduppsättning i programmet.

for (int i = 0; i <dim; i ++) {// Tona snabbt ljus till körnivå. rt = rt + 1; gt = gt + 1; bt = bt + 1; for (int i = 9; i <NUM_LEDS; i = i +3) {// Detta kommer att tända de tre sista lamporna för positionsljuset. leds [0] = CRGB (rt, gt, bt); // Ställ in strip 0 LED -färg på den valda färgen. leds [1] = CRGB (rt, gt, bt); // Ställ in remsa 1 LED -färg på den valda färgen. } FastLED.show (); fördröjning (3); }

Det sista exemplet på kod som jag använder för lysdioderna är en blekningsslinga. Här använder jag tillfälliga platser för ljusstyrkan för varje kanal (rt, gt, bt) och ökar dem med 1 med en fördröjning mellan varje visning för att uppnå det utseende jag vill ha. Observera också att den här koden bara ändrar de tre senaste lysdioderna eftersom detta bleknar i körljusen så jag börjar vid 9 istället för 0.

Resten av LED -koden är iterationer av dessa. Allt annat är fokuserat kring att leta efter en signal på de tre olika trådarna. Loop () -området i koden letar efter bromsljus, som de kommer att blinka en gång innan de stannar på (detta kan justeras om så önskas) eller letar efter blinkers. För den här koden, eftersom jag inte kunde anta att vänster och höger svängljus skulle tända exakt samma tid för faror, har jag koden leta efter endera först, sedan efter en liten fördröjning kontrollerar jag om båda lyser för att indikera varningslamporna är tända. Den enda knepiga delen jag hade var blinkers eftersom ljuset slocknar under en period, så hur kan jag se skillnaden mellan signalen som fortfarande är på men i avstängd period och en avbruten signal? Det jag kom på var att implementera en fördröjningsslinga som är inställd på att fortsätta längre än fördröjningen mellan signalblixtar. Om blinkers fortfarande är på fortsätter signalslingan. Om signalen inte tänds igen när fördröjningen slutar, går den tillbaka till början av slingan (). För att justera fördröjningens längd ändrar du numret för konstant lightDelay som kommer ihåg för varje 1 i lightDelay fördröjningen ändras med 100 ms.

medan (digitalRead (leftTurn) == LOW) {för (int i = 0; i <lightDelay; i ++) {leftTurnCheck (); if (digitalRead (leftTurn) == HIGH) {leftTurnLight (); } fördröjning (100); } för (int i = 0; i <NUM_LEDS; i = i +3) {// Detta ändrar ljuset för var tredje lysdiod som går från den sista till den första. leds [0] = CRGB (0, 0, 0); // Ställ in strip 0 LED -färg på den valda färgen. } för (int i = 9; i <NUM_LEDS; i = i +3) {// Detta kommer att ställa in körljusen som bara använder de tre sista. leds [0] = Color_low; // Ställ in remsan 0 LED -färg på den valda färgen. } FastLED.show (); // Utgångsinställningar återgår; // När blinkers inte längre är på, gå tillbaka till loop. }

Förhoppningsvis är resten av koden självförklarande. Det är bara en upprepad uppsättning kontroller och agerar på signaler.

Steg 4: Resultat

Resultat
Resultat

Den fantastiska delen var att detta system fungerade första gången jag kopplade det till cykeln. För att vara rättvis testade jag det starkt på bänken före detta, men jag förväntade mig fortfarande att ha ett problem eller en justering. Det visade sig att jag inte behövde göra några justeringar av koden såväl som anslutningarna. Som du kan se i videon går systemet genom startsekvensen (som du inte behöver ha) och ställs sedan in som körljus. Efter det letar det efter bromsarna, i så fall tänds alla lysdioder till full ljusstyrka och blinkar en gång innan de fortsätter tills bromsarna släpps. När en blinkers används gjorde jag en rullningseffekt för sidan att svängen är indikerad och den andra sidan kommer antingen att vara körljus eller bromsljus om den är på. Varningslampor blinkar bara i tid med de andra lamporna.

Förhoppningsvis med dessa extra lampor blir jag mer synlig för andra människor. Åtminstone är det ett trevligt tillägg för att få min låda att sticka ut lite mer än andra samtidigt som den ger nytta. Jag hoppas att det här projektet också är användbart för någon annan även om de inte arbetar med motorcykelbelysning. Tack!