Inhoudsopgave:

Handgemaakte Arduino-aangedreven RGB Moodlamp - Ajarnpa
Handgemaakte Arduino-aangedreven RGB Moodlamp - Ajarnpa

Video: Handgemaakte Arduino-aangedreven RGB Moodlamp - Ajarnpa

Video: Handgemaakte Arduino-aangedreven RGB Moodlamp - Ajarnpa
Video: De Bluetooth Tank 2024, Juli-
Anonim
Handgemaakte Arduino-aangedreven RGB Moodlamp
Handgemaakte Arduino-aangedreven RGB Moodlamp
Handgemaakte Arduino-aangedreven RGB Moodlamp
Handgemaakte Arduino-aangedreven RGB Moodlamp

Dit instructable is onderverdeeld in 5 delen:- Planning van de constructie (Step1)- De handgemaakte kap (Step2+3)- Het elektronische circuit voor het aansturen van 3W LED's met de ATmega8-controller (Step4)- De code (Step5)- Hoe het te krijgen stand-alone (flash de Arduino-bootloader met PonyProg en brand de schets) (Stap6) binnenkort beschikbaar Vid: Some Impressions

de.youtube.com/watch?v=apZ9NpaUG84 Pic1: De Moodlamp Pic2: Een machtige 3W LED

Stap 1: Planning van de constructie:

De bouw plannen
De bouw plannen
De bouw plannen
De bouw plannen

Ik vind het heerlijk om een concept op slechts één vel papier te maken. Op het eerste vel zie je een aantal vroege ideeën. Ik koos voor het ontwerp rechtsonder. De tweede pagina toont enkele details voor de constructie. De metingen zijn zoals elke keer experimenteel, maar oké voor mij;-) Mijn hardware-gedachten waren: - Kan ik de materialen aan? - Zal het licht schijnen door de kap? - Welke verhouding moet hij hebben? - Hoeveel knoppen en potten heb ik nodig voor een eenvoudige interface? Mijn software-gedachten waren: hoeveel verschillende functies moet de lamp hebben? - Automatische RGB-fading met veranderlijke snelheid - Handmatige kleuraanpassing - Wit met instelbare helderheid

Stap 2: De handgemaakte schaduw

De handgemaakte schaduw
De handgemaakte schaduw
De handgemaakte schaduw
De handgemaakte schaduw
De handgemaakte schaduw
De handgemaakte schaduw

Het verzamelen van de materialen: De kap: ik vond een 3 voet x 3 voet plaat van 30 mille plastic in de winkel (Pic1-3). Gebruik een scherp mes om het te snijden. Ik mat het plastic met schuurpapier (Pic4-6). krijg een gladde cilinder Ik heb het allemaal samen geschroefd na het boren van de juiste gaten (Pic7-8). Monteer de plastic kappen op de schroefdraad messing steunen. Het ziet er mooi uit en is vrij gemakkelijk te krijgen en te hanteren. Ik heb de gaten geboord en getapt om te passen bij de 1/8e draadstang (Pic9-10). Ondertussen heb ik een koellichaam gemaakt om de 3W-LED's af te koelen en om een solide basis te hebben. Om niet te veel tinten van de as te krijgen, heb ik een kleine kooi van lasdraad gebouwd met een M8-moer erop (foto 12). Als afwerking heb ik alles in elkaar gezet. De kleine schroeven en moeren waren een beetje lastig, maar 30 minuten later kreeg ik het voor elkaar.

Stap 3: De handgemaakte schaduw

De handgemaakte schaduw
De handgemaakte schaduw
De handgemaakte schaduw
De handgemaakte schaduw
De handgemaakte schaduw
De handgemaakte schaduw

De basis: de schijven werden in de draaibank gegooid om het glad en rond te krijgen. Daarna heb ik het gekleurd met een mahoniehouten beits zodat het grenen er goed uitziet. Wat nu?!? Ik besloot om een basis te maken met dezelfde mat plastic als de kap, en verlicht het met een RGB microLED (foto 5). De knoppen: ik heb de knop gemaakt van een stuk mahonie en de knoppen van een restant van notenhout.

Stap 4: Het elektrische circuit:

Het elektrische circuit
Het elektrische circuit
Het elektrische circuit
Het elektrische circuit
Het elektrische circuit
Het elektrische circuit

Op de eerste foto zie je mijn schema. En hier is nog een video:

Stap 5: De code:

De code
De code
De code
De code
De code
De code

Op de foto's zie je mijn proces met Arduino. Eerst heb ik wat geprobeerd met mijn zelfgemaakte ProtoShield, een batterijpakket en een paar soorten LED's. Ik begon een paar maanden geleden met "Spooky Projects" en "BionicArduino" van TodEKurt.https://todbot.com/blog/spookyarduino/Mijn code is gewoon een lastige combinatie van zijn projectcode. "RGBMoodlight", "RGBPotMixer"en enkele extensies. Drie analoge-in en.één digitale-in als modusschakelaar (met dank aan Ju. voor de interrupt-routine:). De LED's zijn aangesloten naar D9, D10 en D11 die PulseWithModulation ondersteunen. Als je wilt, kan ik de schets publiceren, maar het is echt een kale combinatie van deze twee geweldige codes. Hier is mijn originele code van de lamp. Het ziet er een beetje rommelig uit, omdat het mijn zeer vroeg stadium van programmeren… Maar als je het kopieert, zou het geweldig moeten werken.

Code voor mijn "Moodlamp", gebaseerd op "dimmingLEDs" van Clay Shirky

*nejo sep 2008

  • Definitieve code voor de moodlamp met interrupt-mode-schakelaar, analoog snelkiesnummer voor RGB-fading en RGB-kleurverandering.
  • De dimfunctie werkt alleen voor de witte kleur

*nejo oktober 2008

  • Geluidsverlenging voor de sfeerlamp:
  • Een condensatormicrofoon met een kleine LM368 Amp, een gelijkrichter en een RC-laagdoorlaatfilter
  • met een andere analoge ingang gebruik ik de RGBPotMixer-functie om de kleur te veranderen door het microfoonsignaal te krijgen.

* * *Code voor cross-fading 3 LED's, rood, groen en blauw, of één driekleurige LED, met behulp van PWM

  • Het programma vervaagt langzaam van rood naar groen, groen naar blauw en blauw naar rood
  • De foutopsporingscode gaat uit van Arduino 0004, omdat het de nieuwe Serial.begin()-achtige functies gebruikt
  • oorspronkelijk "dimmingLEDs" door Clay Shirky

*

  • AnalogRead is ingeschakeld op Pin A0 om de RGB-fadingsnelheid te variëren
  • AnalogRead is ingeschakeld op Pin A2 om de hueRGB-kleur te variëren

* * */#include // Outputint ledPin = 13; // controlPin voor debuggingint redPin = 9; // Rode LED, aangesloten op digitale pin 9int greenPin = 10; // Groene LED, aangesloten op digitale pin 10int bluePin = 11; // Blauwe LED, aangesloten op digitale pin 11int dimredPin = 3; // Pinnen voor de analoge dimwaarde, aangesloten op de transistor driverint dimgreenPin = 5;int dimbluePin = 6;// Inputint switchPin = 2; // schakelaar is aangesloten op pin D2int val = 0; // variabele voor het lezen van de pin statusint buttonState; // variabele om de knop te houden stateint buttonPresses = 0; // 3 keer drukken om te gaan!int potPin0 = 0; // Pot voor het aanpassen van de vertraging tussen vervaging in Moodlamp; int potPin2 = 2; // Potentiometeruitgang voor het wijzigen van de hueRGB colorint potVal = 0; // Variabele om de invoer van de potentiometerint maxVal = 0 op te slaan; // waarde om de standaard dimfactor op te slaan is 255, als er geen Pot is aangesloten, dimPin = 4; // Pot aangesloten op A4 om de helderheid te dimmen // Programmavariabelenint redVal = 255; // Variabelen om de waarden op te slaan die naar de pinsint moeten worden gestuurd greenVal = 1; // De beginwaarden zijn rood vol, groen en blauw ofint blueVal = 1;int i = 0; // Lusteller int wachten;// = 15; // 50 ms (0,05 seconde) vertraging; verkorten voor snellere fadesint k = 0; // waarde voor de controlLED in de blink-functionint DEBUG = 0; // DEBUG-teller; indien ingesteld op 1, zal waarden terugschrijven via serialint LCD = 0; // LCD-teller; indien ingesteld op 1, zal waarden terugschrijven via serialvoid setup(){ pinMode(ledPin, OUTPUT); pinMode (redPin, UITGANG); // stelt de pinnen in als output pinMode (greenPin, OUTPUT); pinMode (bluePin, UITGANG); pinMode (dimredPin, OUTPUT); pinMode (dimgreenPin, OUTPUT); // stelt de pinnen in als output pinMode (dimbluePin, OUTPUT); pinMode (potPin2, INPUT); // pinMode (potPin0, INPUT); // pinMode (dimPin, INPUT); // pinMode (switchPin, INPUT); // Stel de schakelpin in als invoer attachInterrupt (0, isr0, RISING); if (DEBUG) { // Als we de pin-waarden voor debuggen willen zien… Serial.begin (9600); // … stel de seriële uitvoer in op 0004-stijl }}// Hoofdprogrammavoid loop (){ if (buttonPresses == 0) { Moodlamp (); // roept de Moodlight-functie } if (buttonPresses == 1) { RGBPotMixer(); // roept de handmatige mix-functie op } if (buttonPresses == 2) { White (); // Het is hier allemaal wit } if (buttonPresses == 3) { } //Moodlamp(); //RGBPotMixer(); //Wit(); Toezicht houden op(); dim();}void Monitor(){ // Send State naar de monitor if (DEBUG) { // Als we de output willen lezen DEBUG += 1; // Verhoog de DEBUG-teller als (DEBUG> 10) { // Print elke 10 lussen DEBUG = 1; // Reset de teller Serial.print(i); // Seriële commando's in 0004-stijl Serial.print ("\t"); // Druk een tabblad af Serial.print("R:"); // Geef aan dat de uitvoer een rode waarde is Serial.print (redVal); // Print rode waarde Serial.print ("\t"); // Druk een tabblad af Serial.print("G:"); // Herhaal dit voor groen en blauw… Serial.print(greenVal); Serieel.print("\t"); Serial.print("B:"); Serial.print(blueVal); // println, om te eindigen met een regelterugloop Serial.print("\t"); Serial.print("dimValue:"); Seriële.afdruk (maxVal); // println, om te eindigen met een regelterugloop Serial.print("\t"); Serial.print("wacht:"); Serial.print(wacht); // schrijft de waarde van de potPin0 naar de monitor Serial.print ("\t"); Serial.print("hueRGBvalue"); Serial.print(potVal); // schrijft de waarde van de potPin0 naar de monitor Serial.print ("\t"); Serial.print("buttonState:"); Serial.print(knopState); // schrijft de waarde van de potPin0 naar de monitor Serial.print ("\t"); Serial.print("buttonPersen:"); Serial.println(knopPersen); // schrijft de waarde van de button Presses naar de monitor } }} void dim() // Functie voor het dimmen van wit // misschien later voor alle modi {maxVal = analogRead(dimPin); maxVal /= 4; // Analoog bereik van 0..1024 te veel voor het dimmen van de 0..255 waarde analogWrite (dimredPin, maxVal); analogWrite(dimgreenPin, maxVal); analogWrite(dimbluePin, maxVal);}void Moodlamp(){ wait = analogRead (potPin0); // zoek naar de waarde van de potPin0; // als er geen Pot is aangesloten: wacht 255 i += 1; // Verhogingsteller // i = i - maxVal; if (i < 255) // Eerste fase van vervaging { redVal -= 1; // Rood omlaag groenVal += 1; // Groen omhoog blauwVal = 1; // Blauw laag } else if (i <509) // Tweede fase van vervaging {redVal = 1; // Rood laag groenVal -= 1; // Groen omlaag blauwVal += 1; // Blue up } else if (i < 763) // Derde fase van fades { redVal += 1; // Rood omhoog groenVal = 1; // Groen lo2 blueVal -= 1; // Blue down } else // Stel de teller opnieuw in en start de fades opnieuw { i = 1; } // we doen "255-redVal" in plaats van alleen "redVal" omdat de // LED's zijn aangesloten op +5V in plaats van Gnd analogWrite(redPin, 255 - redVal); // Schrijf huidige waarden naar LED-pinnen analogWrite (greenPin, 255 - greenVal); analogWrite(bluePin, 255 - blueVal); /* dimredVal =min (redVal - maxVal, 255); //dimmen dimredVal =max (redVal - maxVal, 0); dimgreenVal =min(greenVal - maxVal, 255); dimgreenVal =max(greenVal - maxVal, 0); dimblueVal =min (blueVal - maxVal, 255); dimblueVal =max(blueVal - maxVal, 0); analogWrite(redPin, 255 - dimredVal); // Schrijf huidige waarden naar LED-pinnen analogWrite (greenPin, 255 - dimgreenVal); analogWrite(bluePin, 255 - dimblueVal); */ wacht /=4; vertraging (wacht); // Pauzeer milliseconden 'wacht' voordat de lus wordt hervat} void RGBPotMixer () {potVal = analogRead (potPin2); // lees de waarde van de potentiometer op de ingangspin potVal = potVal / 4; // converteer van 0-1023 naar 0-255 hue_to_rgb (potVal); // behandel potVal als tint en converteer naar rgb vals // "255-" is omdat we common-anode-LED's hebben, niet common-kathode analogWrite (redPin, 255-redVal); // Schrijf waarden naar LED-pinnen analogWrite (greenPin, 255-greenVal); analogWrite (bluePin, 255-blueVal); }void White(){ analogWrite(redPin, maxVal); // Schrijf waarden naar LED-pinnen analogWrite (greenPin, maxVal); analogWrite(bluePin, maxVal); }/*

  • Gegeven een variabele tint 'h', die varieert van 0-252,
  • stel de RGB-kleurwaarde op de juiste manier in.
  • Gaat uit van maxValimum verzadiging & maximale waarde (helderheid)
  • Voert puur integere wiskunde uit, geen drijvende komma.

*/void hue_to_rgb(byte tint) {if(tint > 252) tint = 252; // terugval naar 252!! nejo byte hd = tint / 42; // 36 == 252/7, 252 == H_MAX byte hi = hd % 6; // geeft 0-5 byte f = tint % 42; byte fs = f * 6; switch (hi) {geval 0: redVal = 252; groenVal = fs; blauwVal = 0; pauze; geval 1: redVal = 252-fs; groenVal = 252; blauwVal = 0; pauze; geval 2: roodVal = 0; groenVal = 252; blauwVal = fs; pauze; geval 3: roodVal = 0; groenVal = 252-fs; blauwVal = 252; pauze; geval 4: redVal = fs; groenVal = 0; blauwVal = 252; pauze; geval 5: roodVal = 252; groenVal = 0; blueVal = 252-fs; pauze; } } void isr0(){ Serial.println("\n \n onderbroken \n"); buttonState = digitalRead (switchPin); // lees de initiële status delayMicroseconds (100000); //if (val != buttonState) { // de knopstatus is veranderd! // if (buttonState == HIGH) { // controleer of de knop nu is ingedrukt buttonPresses++; //} // val = buttonState; // sla de nieuwe staat op in onze variabele if (buttonPresses == 3) { // zur cksetzen buttonPresses = 0; } } // }De volgende stap waren de transistor-drivers. Ik gebruikte 3 PNP-transistoren met een maximale stroom op 3 Ampere. Nadat de voorwaartse stroom en de spanning waren geregeld, werkte de LEDemitter uitstekend met volle intensiteit.

Stap 6: Krijg het standalone met PonyProg-gebrande Bootloader

Krijg het standalone met PonyProg-gebrande Bootloader
Krijg het standalone met PonyProg-gebrande Bootloader

Hoe u uw parallelle poort gebruikt om de arduino-bootloader op een ATmega168 of ATmega8 te branden om een goedkope lege chip te gebruiken met de arduino-omgeving. komt binnenkort … misschien op een aparte instructie Hier is ook een goede instructie om de chip standalone te gebruiken: https:/ /www.instructables.com/id/uDuino-Very-Low-Cost-Arduino-Compatible-Developme/?ALLE STAPPEN

Stap 7: Dus dat is mijn Arduino Moodlamp

Dus dat is mijn Arduino Moodlamp
Dus dat is mijn Arduino Moodlamp

Als je het leuk vond, beoordeel me dan alsjeblieft.

Aanbevolen: