Witajcie, dziś przedstawie i pokaże jak zbudować sterownik pasków LED RGB + LED jednokolorowych sterowanych pilotem oraz trybem reagowania na muzyke :)
Wszystkie robicie na własną odpowiedzialność, nie odpowiadam za uszkodzenie karty dźwiekowej lub czegokolwiek.
Potrzebne części:
- tranzystory MOSFET N np. BUZ11 – 4 sztuki
- odbiornik podczerwieni np. TSOP31236
- rezystor z zakresu 47k-100k – 4 sztuki
- rezystor 10R – 4 sztuki
- zasilacz 12 V o odpowiedniej mocy
- taśma LED RGB
- taśma LED jednokolorowa
- gniazdo jack 3.5 mm
- przedlużacz jack-jack wtyk-wtyk
- kondensator 10uF
- rezystor 10k – 1 sztuka
- rezystor 100k – 2 sztuki
- kabelki i kable :)
Przez arduino maksymalnie może iść prąd 1A. W przypadku używania większego prądu musicie zasilacz podpiąc do płytki stykowej i połączyć mase zasilacza z masą arduino.
Lutowanie
Dobra jeśli mamy już potrzebne części, zacznijmy od przylutowania kabli do pasków :) Kolorki przy taśmie jedno kolorowej to: czerwony kabel do + lub +12, czarny do -. W RGB lutujemy najlepiej czerwony kabel do R, zielony do G, niebieski do B, a pozostały kabel np. biały do +12 (RGB – Red Green Blue – Czerwony Zielony Niebieski :) ). Odrazu możemy także przylutować 2 kabelki do gniazda jack. Do wyprowadzenia 1 lutujemy np. niebieski kabel bo to masa. Do 2 lub 3 (są to kanały lewy i prawy) lutujemy jakiś kabelek, jeżeli mamy gniazdo mono lutujemy tylko jedno wyprowadzenie :)
Łączenie w całość
Najtrudniejszą robote mamy za sobą :) Teraz już tylko powtykać co nieco, w płytkę stykową i napisać program :) Z arduino lub uC (mikrokontroler) sygnałem PWM sterujemy “otwarciem” tranzystora.
Rezystory po kolorach odnajdziecie, ale wam też napisze to.
- pomiędzy masą a pierwszą od lewej nóżką MOSFET – 47k (można w zakresie 47k-100k)
- pomiędzy arduino a pierwszą od lewej nóżka MOSFET – 10R (do tej samej nózki co rezystor wyżej, pierwsza nózka od lewej patrząc tak, że metalową obudowe mamy z tyłu [bodajże radiator?]).
- pomiędzy kanałem audio a kondensatorem – 10k
- pomiędzy masą a kondensatorem oraz 5V i kondensatorem – 100k
- Kondensator 10uF, jego minus podłączony do rezystora 10k od kanału audio.
PS. Przepraszam, nie ogarniam fritzing :C
Programowanie
Dobra teraz troszkę programowania :)
Najpierw pobierz biblioteke IR Remote do obsługi naszego odbiornika podczerwieni – IR Remote.
Po pobraniu, wejdź do folderu gdzie masz Arduino (np. Program Files), libraries, i wrzuć tam folder z tą biblioteką tak aby po otworzeniu widać było pliki .cpp i .h.
Następnie, wgraj na arduino taki kod:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include <IRremote.h> #define irP 2 IRrecv ir1(irP); decode_results results; void setup() { Serial.begin(9600); ir1.enableIRIn(); } void loop() { if (ir1.decode(&results)) { Serial.println(results.value, HEX); delay(250); ir1.resume(); } } |
Jest to kod umożliwiający odczyt kodów przycisków pilota. Po wgraniu w Arduino IDE wejdź w Narzędzia > Monitor portu szeregowego lub kliknij Ctrl+Shift+M.
W prawym dolnym rogu wybierz “9600 baud”. Teraz gdy naciśniesz przycisk na pilocie i będzie on skierowany na odbiornik, powinieneś zobaczyć kod przycisku na monitorze. Powciskaj przyciski których będziesz używał i je sobie zapisz.
Programowanie cd.
Po zapisaniu wszystkich kodów przycisków, wgraj na arduino taki program, ustawiając kody przycisków w odpowiednich miejscach (results2==”TUTAJ”).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 |
#include <IRremote.h> #define irPin 2 //Pin odbiornika IR IRrecv irrecv(irPin); decode_results results; //Część ustawien - edytuj to co w tej części oraz 2 linijke kodu int D1Pin = 6; // Pin PWM do tranzystora taśmy jednokolorowej int D2PinR = 9; // Pin PWM do tranzystora koloru czerwonego taśmy RGB int D2PinG = 10;// Pin PWM do tranzystora koloru zielonego taśmy RGB int D2PinB = 5; // Pin PWM do tranzystora koloru niebieskiego taśmy RGB //Koniec części ustawień int D1Status = HIGH; int D1Jasnosc = 255; int D2Status = HIGH; int D2PinRA = 255; int D2PinGA = 255; int D2PinBA = 255; int Mode = 0; int M2K = 0; int M2V = 0; int M2D = 0; int M1C = 0; const int M4W = 50; unsigned int M4S; int M4L = 0; int M4MAX = 0;<br>int M4CNT = 0;<br>int M4CNN = 0; String lastkey = ""; String results2 = ""; //Funkcja do ustawiania koloru taśmy RGB void rgb_set(char r, char g, char b) { analogWrite(D2PinR, r); analogWrite(D2PinG, g); analogWrite(D2PinB, b); } //Funkcja do ustawiania janości taśmy jednokolorowej void led_set(char m) { analogWrite(D1Pin, m); } void setup() { Serial.begin(9600); Serial.println("Starting..."); irrecv.enableIRIn(); // "Włączamy" odbiornik IR pinMode(D1Pin, OUTPUT); for(int x=0; x < 50; x++) { led_set(x); rgb_set(x,x,x); delay(25); } for(int x=50; x < 100; x=x+2) { led_set(x); rgb_set(x,x,x); delay(25); } for(int x=100; x < 150; x=x+5) { led_set(x); rgb_set(x,x,x); delay(25); } for(int x=150; x < 255; x=x+10) { led_set(x); rgb_set(x,x,x); delay(25); } // Ta i 3 wcześniejsze linijki służą za w miare płynne rozjaśnianie taśm podczas włączania. led_set(255); rgb_set(255,255,255); attachInterrupt(0, ir_check, CHANGE); // Definiujemy przerwanie aby przy odbiorze czegoś z odbiornika IR się wykonywało M4MAX=10; Serial.println("Started !"); } //Przerwanie obsługująca odbiornik IR void ir_check() { if (irrecv.decode(&results)) { if(results.value==0xFFFFFFFF) { results2=String(lastkey); } else { results2=String(results.value, HEX); } //Jeżeli przytrzymano przycisk, to uzywa ostatnio uzywanego przycisku. Serial.print(results2); if(results2=="f740bf") { Serial.print(" - D1 ON/OFF"); D1Status = ~D1Status; if(D1Status==HIGH) { for(int x=0; x < D1Jasnosc; x++) { analogWrite(D1Pin, x); delay(50); } analogWrite(D1Pin, D1Jasnosc); } else { for(int x=D1Jasnosc; x >= 0; x--) { analogWrite(D1Pin, x); delay(50); } analogWrite(D1Pin, 0); } } else if(results2=="f700ff") { Serial.print(" - D1 LIGHT UP - "); if(D1Status<=0) { for(int x=0; x < D1Jasnosc; x++) { analogWrite(D1Pin, x); delay(50); } analogWrite(D1Pin, D1Jasnosc); } if(D1Jasnosc < 1) {D1Jasnosc = D1Jasnosc+1;} else if(D1Jasnosc < 10) {D1Jasnosc = D1Jasnosc+5;} else if(D1Jasnosc<40) {D1Jasnosc = D1Jasnosc+10;} else if(D1Jasnosc<150) {D1Jasnosc = D1Jasnosc+20;} Serial.print(D1Jasnosc); analogWrite(D1Pin, D1Jasnosc); D1Status=HIGH; } else if(results2=="f7807f") { //f7807f zamieniamy na kod przycisku z własnego pilota Serial.print(" - D1 LIGHT DOWN - "); if(D1Status<=0) { for(int x=0; x < D1Jasnosc; x++) { analogWrite(D1Pin, x); delay(50); } analogWrite(D1Pin, D1Jasnosc); } if(D1Jasnosc>150) {D1Jasnosc = D1Jasnosc-20;} else if(D1Jasnosc>40) {D1Jasnosc = D1Jasnosc-10;} else if(D1Jasnosc > 10) {D1Jasnosc = D1Jasnosc-5;} else if(D1Jasnosc > 1) {D1Jasnosc = D1Jasnosc-1;} Serial.print(D1Jasnosc); analogWrite(D1Pin, D1Jasnosc); D1Status=HIGH; } else if(results2=="f7c03f") { Serial.print(" - D2 ON/OFF"); D2Status = ~D2Status; if(D2Status==HIGH) { for(int x=0; x < 255; x++) { if(x<=D2PinRA) { analogWrite(D2PinR, x); } if(x<=D2PinGA) { analogWrite(D2PinG, x); } if(x<=D2PinBA) { analogWrite(D2PinB, x); } delay(50); } analogWrite(D2PinR, D2PinRA); } else { int mx = D2PinRA; if(mx<D2PinGA) { mx=D2PinGA; } if(mx<D2PinBA) { mx=D2PinBA; } for(int x=mx; x >= 0; x--) { if(x<D2PinRA) { analogWrite(D2PinR, x); } if(x<D2PinGA) { analogWrite(D2PinG, x); } if(x<D2PinBA) { analogWrite(D2PinB, x); } delay(50); } rgb_set(0,0,0); } } else if(results2=="f710ef") { Serial.print(" - D2 RED"); D2PinRA=255; D2PinGA=0; D2PinBA=0; rgb_set(D2PinRA, D2PinGA, D2PinBA); D2Status=HIGH; } else if(results2=="f7906f") { Serial.print(" - D2 GREEN"); D2PinRA=0; D2PinGA=255; D2PinBA=0; rgb_set(D2PinRA, D2PinGA, D2PinBA); D2Status=HIGH; } else if(results2=="f750af") { Serial.print(" - D2 BLUE"); D2PinRA=0; D2PinGA=0; D2PinBA=255; rgb_set(D2PinRA, D2PinGA, D2PinBA); D2Status=HIGH; } else if(results2=="f7e01f") { Serial.print(" - D2 WHITE"); D2PinRA=255; D2PinGA=255; D2PinBA=255; rgb_set(D2PinRA, D2PinGA, D2PinBA); D2Status=HIGH; } else if(results2=="f7d02f") { Serial.print(" - D2 LIGHT UP"); if(D2PinBA < 255&&D2PinGA < 255&&D2PinBA < 255) {D2PinRA = D2PinRA+5; D2PinGA = D2PinGA+5; D2PinBA = D2PinBA+5;} rgb_set(D2PinRA, D2PinGA, D2PinBA); D2Status=HIGH; } else if(results2=="f7f00f") { Serial.print(" - D2 LIGHT DOWN"); if(D2PinBA > 0&&D2PinGA > 0&&D2PinBA > 0) {D2PinRA = D2PinRA-5; D2PinGA = D2PinGA-5; D2PinBA = D2PinBA-5;} rgb_set(D2PinRA, D2PinGA, D2PinBA); D2Status=HIGH; } else if(results2=="f7e817") { Serial.print(" - MODE"); switch(Mode) { case 0: Mode=1; break; case 1: Mode=2; break; case 2: Mode=0; break; default: Mode=0; break; } D2Status=HIGH; } else if(results2=="f7c837") { Serial.print(" - MUSIC"); if(Mode>=0&&Mode<4) { Mode=4; } else if (Mode==4) { Mode=0; } else { Mode=0; } D2Status=HIGH; } delay(250); if(results2!="ffffffff") { lastkey = results2; } // Jeśli teraz był przytrzymany przycisk to jako ostatni przycisk używa jeszcze wcześniejszego. Serial.println(""); irrecv.resume(); } } void loop() { if(D2Status<=0) { rgb_set(0, 0, 0); delay(50); return; } //Jeżeli status paska 2 (RGB) jest wylaczony to wylacza go i od nowa wykonuje loop(); if(Mode==1) // Jeśli tryb == 1 (światła policyjne) { switch(M1C) { case 0: D2PinRA=255; D2PinGA=0; D2PinBA=0;//Czerwony M1C++; break; case 1: D2PinRA=0; D2PinGA=0; D2PinBA=0;//Brak M1C++; break; case 2: D2PinRA=255; D2PinGA=0; D2PinBA=0;//Czerwony M1C++; break; case 3: D2PinRA=0; D2PinGA=0; D2PinBA=0;//Brak M1C++; break; case 4: D2PinRA=255; D2PinGA=255; D2PinBA=255;//Biały M1C++; break; case 5: D2PinRA=0; D2PinGA=0; D2PinBA=0;//Brak M1C++; break; case 6: D2PinRA=0; D2PinGA=0; D2PinBA=255;//Niebieski M1C++; break; case 7: D2PinRA=0; D2PinGA=0; D2PinBA=0;//Brak M1C++; break; case 8: D2PinRA=0; D2PinGA=0; D2PinBA=255;//Niebieski M1C=0; break; default: D2PinRA=255; D2PinGA=255; D2PinBA=255;//Biały (tylko gdyy wystapi blad). M1C=0; break; } rgb_set(D2PinRA, D2PinGA, D2PinBA);// Ustawia kolory ze sweitcha wyzej. delay(100);//Odstep miedzy kazdym kolorem a brakiem koloru(0, 0, 0) i miedzy brakiem koloru a kolorem } else if (Mode==2) { //Tryb drugi - stroboskop D2PinRA=0; D2PinGA=0; D2PinBA=0; //Brak koloru (ciemno) rgb_set(D2PinRA, D2PinGA, D2PinBA); delay(50); D2PinRA=255; D2PinGA=255; D2PinBA=255; //Biały rgb_set(D2PinRA, D2PinGA, D2PinBA); delay(50); } else if (Mode==4) { unsigned long startMillis= millis(); // Start of sample window unsigned int peakToPeak = 0; // peak-to-peak level unsigned int signalMax = 0; unsigned int signalMin = 1024; M4CNN++; while (millis() - startMillis < M4W) { M4S = analogRead(0); if (M4S < 1024) { if (M4S > signalMax) { signalMax = M4S; } else if (M4S < signalMin) { signalMin = M4S; } } } peakToPeak = signalMax - signalMin; if(M4MAX<peakToPeak) { M4MAX=peakToPeak*1.1; M4CNN=0; M4CNT=0; Serial.print("POZIOMOWANIE UP : "); Serial.println(M4MAX); } if(peakToPeak<(M4MAX*0.6)) { M4CNT++; } if(M4CNN>=20) { if(M4CNT>(M4CNN/2)) { M4MAX=M4MAX*0.5; M4CNN=0; M4CNT=0; if(M4MAX<20) { M4MAX=20; } Serial.print("POZIOMOWANIE DN : "); Serial.println(M4MAX); } } if(peakToPeak<=5) { D2PinRA=255; D2PinGA=255; D2PinBA=255; } else { if(peakToPeak>(M4MAX*0.95)) { D2PinRA=255; D2PinGA=0; D2PinBA=0; } else if(peakToPeak>(M4MAX*0.9)) { D2PinRA=255; D2PinGA=0; D2PinBA=120; } else if(peakToPeak>(M4MAX*0.8)) { D2PinRA=200; D2PinGA=0; D2PinBA=0; } else if(peakToPeak>(M4MAX*0.7)) { D2PinRA=255; D2PinGA=0; D2PinBA=255; } else if(peakToPeak>(M4MAX*0.6)) { D2PinRA=0; D2PinGA=50; D2PinBA=255; } else if(peakToPeak>(M4MAX*0.5)) { D2PinRA=0; D2PinGA=150; D2PinBA=255; } else if(peakToPeak>(M4MAX*0.4)) { D2PinRA=0; D2PinGA=255; D2PinBA=180; } else if(peakToPeak>(M4MAX*0.3)) { D2PinRA=0; D2PinGA=255; D2PinBA=0; } else if(peakToPeak>(M4MAX*0.2)) { D2PinRA=102; D2PinGA=255; D2PinBA=0; } else if(peakToPeak>(M4MAX*0.1)) { D2PinRA=234; D2PinGA=255; D2PinBA=0; } else { D2PinRA=255; D2PinGA=255; D2PinBA=255; } } rgb_set(D2PinRA, D2PinGA, D2PinBA); } else { if(D2Status==HIGH) { rgb_set(D2PinRA, D2PinGA, D2PinBA); } else { rgb_set(0, 0, 0); } delay(50); } } |
Kod starałem się opisać w komentarzach :)
No to zostało tylko podłączyć LED-y do tranzystorów, 12V do arduino, audio do gniazda jack przez przedłużacz audio. I odpalać :)
Obrazki
Koniec
Na razie to wszystko :) Może dodam drugą część i tam będzie troche bardziej zaawansowane sterowanie muzyką, przeniesienie na ATmege i ew. jakaś płytka PCB :).
Jeżeli ktoś widzi jakiś błąd w schemacie, elektronice lub czym kolwiek, proszę napisać, elektronikiem nie jestem, ale staram się ogarniać to jak umiem :)
Aktualizacja
2013-10-18 23:15 – dodałem do kodu auto poziomowanie dźwięku :)
Pomysł fajny – kiedyś wiedziałem coś podobnego jako ‘ambient light’ do monitora, z tyłu były paski led i w zależności od tego co się dzieje na pulpicie windowsa ledy zmieniały kolor :)
Tylko coś dziwnie działa Ci ten tryb reakcji na muzykę – niby masz PWM, ale na filmiku widzę tylko i wyłącznie jak się włączają kolory czerwony i niebieski, żadnych przejściowych nie widzę. Ale to pewnie tylko kwestia dopracowania albo odczytu analogowego sygnału albo samego sterowania PWMem.
Poprawiłem teraz troche i jest lepiej, bo dodałem poziomowanie dźwieku, puścisz głośniej muzyke to się poziom zwiększa i więcej V potrzeba aby zaświecił się czerwony, puścisz cisze, poziom się obniża i mniej V potrzeba aby zaświecił się czerwony. Po za tym normalnie lepiej to wygląda niż na filmiku, może zaraz nagram jak to wygląda teraz. I jest tylko 10 kolorów, nie ustawiałem że w zależności od sygnału to wyliczalo kolor, tylko jak jest powyżej iluśtam to np. czerwony, troche ciszej to mniej czerwony (255 czerwonego i np. 100 niebeiskiego). Zaraz nagram i podeśle linka nowego.
Dobra, dodałem nowy filmik przedstawiający całe działanie sterownika :)
Fajne
Też pomyślałem że fajne, potem stwierdziłem że sobie takie cos zrobie, ale potem zobaczyłem że na arduini i taki chu* :D
Ja również ale jeśli ktoś chce to przedstawię alternatywę w postaci analogowej. ;) Jeśli uda mi się to dzisiaj zrobić to przedstawię na stronie, czy zwykły użytkownik może prezentować projekty? Jeśli ktoś chce bez Arduino niech pisze w komentarzy, pozdro 600 v. xxx32f9832h@gmail.com
7837684[
Czegokolwiek – piszemy razem :) (W czerwonej ramce)
Poprawione, dzięki :)
czekam aż user cube napisze że fritzing to nie schemat .
Za projekcik masz 5 :) Pozdrawiam
Chcę od jakiegoś czasu zrobić sobie lampkę rgb lecz napotkał mnie problem z tym, że uc jest na 5 v ,a diody na 12v. Tu dał mi pomysł ten post na użycie BUZ 11 ale po przeczytaniu zauważyłem błąd. W treści pisze ,że pierwsza nóżka do masy przez opornik ,a na rysunku jest ,że pierwsza nóżka do Andruino. Proszę o pomoc z podłączeniem BUZ ‘a.
Patrząc od przodu czyli metalowa cześć z tyłu jest, to pierwsza nózka od lewej – przez opornik 47k-100k do masy, oraz przez opornik 10R do arduino, środkowa nózka – środkowa do LEDów, a prawa do masy :)
Dziękuje za szybką odpowiedź.Pozdrawiam.
ugh, ten kod jest paskudny :V
ugh, ta ortografia jest paskudna :V
ugh, za piękny ten kod nie jest ale ciii…
ugh, pisałem jak umiałem, nie robię tego specjalnie, ugh.
Ps. O autokorekcie nie mów nic, nie mam polskiego windowsa >.< Więc wszystko mam podkreślone :) A propo kodu, to co Cię w nim tak boli ?
co do kodu to się zgodzę ale to arduino:( a ortografia jest nie ważna :), tak swoją drogą można by dodać szybką FT, lepiej by reagowało na poszczególne składowe.
szybka FT ? Yyy… sorry, nie wiem co to :/ Mógłbyś napisać jakoś bardziej opisowo czy coś :D To może skojarze :D
matrix14 Niewiem czy to to i czy mnei kojazysz jeszccze (Ddylon991) jezeli to ty wejdz na Ts :D ^^ Ah i fajny pomysl :)
Dzięki ;) Tak to ja :D Na korna ts ?
Tak :D bede o wieczorem na TS
Ddylon
Ja piernicze, skąd wy się bierzecie chłopaki? :D
no dokladnie! świetne pomysly!
pomysł – podłączyć lampki choinkowe/ledy, tak ze 4-5 zestawów i żeby zapalały się i gasły w rytm muzyki. Coś w tym stylu https://youtu.be/2ZH0eZ9KT1U
Ja jestem lama, ale może ktoś?
a czy może być arduino mega 2560 r3 zamiast tego co użyłeś ?
tak to wygląda:
http://arduinosolutions.com/environment/cache/images/0_0_productGfx_5a8dd67b23163fd4ea0d86626e6193e6.jpg
Witam
złożyłem na pająku ten układ, jako ze nie posiadałem czujnika podczerwieni a chciałem sprawdzić jak działa w trybie “mrugania w rytm muzyki” zmieniłem parametr z 19 linijki kogu na mode = 4, ale niestety rugają tylko 2 kolory 3 jest cały czas wyłączony.
czy kod jest poprawny czy jakoś inaczej trzeba ten tryb zainicjować??
pozdrawiam
Dodatkowo zauważyłem ze nie da sie ustawić 11 pinu pwm w tym programie. Dlaczego???
Tego sam nie wiem, ja chyba pomijałem pin 11 bo miałem problem z tym.
Mrugają w rytm muzyki ? Jeśli tak, to jest wszystko ok, bo program sam reguluje sobie dane i jak jest cichsza muzyka to jest bardziej wyczulone, spróbuj puścić cichą muzyke i nagle podgłoś na maximum.
Projekt bardzo ciekawy. Wiem że minęło już trochę czasu, ale może ktoś kombinował, jak przenieść całość na atmegę?
Witam. Wiem że robię wielki odkop, ale mam pytanie. Co zrobić jeżeli chcę podpiąć taśmę rgb, która ma 5m i pobór 36W ? Co należy zmienić w układzie?
Zasilanie nie z arduino tylko osobne