Witam serdecznie wszystkich Majsterkowiczów :)
Zainspirował mnie temat przewodni tego miesiąca – “Recykling”. Postanowiłem zrobić “coś z niczego”, a dokładniej “coś z niepotrzebnych rzeczy” i nadać im drugie życie. Przy każdym przedmiocie, który został “odzyskany” będę pisał [EKO], aby podkreślić, że do majsterkowania potrzebna jest kreatywność, a materiały same się znajdą.
Z racji, że chciałem popracować nad mobilizacją oraz organizacją swojej pracy, zdecydowałem, że zrobię przyciągającą wzrok tablicę, podświetlaną RGB led. Wszystko sterowane pilotem na podczerwień.
Materiały:
- [EKO] Płyta styropianowa (Szanowna Pani sąsiadka zastanawiała się gdzie może wyrzucić, uprościłem jej zadanie),
- [EKO] Stare piłeczki ping-pongowe,
- [EKO] Elementy elektroniczne: rezystory, tranzystory, micro switche (odlutowane ze starych części),
- [EKO] Pilot na podczerwień
- [EKO] Kabel skrętka
- [EKO] Płytka uniwersalna
- Odbiornik IR
- ArduinoUNO (LINK), Atmega 328P (LINK)
- Folia termokurczliwa i izolacja
Przygotowanie tablicy
Na początku zabrałem się od obcięcia gorszych części płyty styropianowej. Rogi były połamane i okropnie to wyglądało. Krawędzie obkleiłem czarną izolacją, aby były dobrze widoczne na białej ścianie i żeby nie kruszyły się.
Następnie trzeba było w jakiś sposób przymocować, coś na czym można byłoby go powiesić.
Użyłem do tego [EKO] starego kabla żyłowego, nieprzydatnego mi w elektronice. Aby szybko i solidnie przyczepić go do płyty, zawiązałem końcówki i wsadziłem je we wcześniej zrobione dziury. Węzły nadzwyczaj dobrze utrzymują kabel w ustalonej pozycji.
Wykonanie lamp
Wyczyszczone piłeczki poprzecinałem na pół i wygładziłem krawędzie na papierze ściernym. Zaostrzoną końcówką noża zrobiłem podłużny otwór na wyjścia diod.
Powkładałem diody od wewnętrznej strony piłki. Kiedyś po docinaniu skrętki został mi nadmiar, który teraz doskonale się przyda. [EKO] Wykorzystam plastyczne kable, jak i koszulkę. Do nóżek LED RGB dolutowuję kabelki, izoluje je czerwonymi foliami termokurczliwymi o równych długościach.
Następnie wszystkie zgrzewam w czarnej koszulce w celu usztywnienia podstawy “lampy”. W skrętce są kable o różnych kolorach, wykorzystałem to i orientacyjnie przylutowałem do końcówek odpowiadające im kolory kabelków. Intuicyjne oznaczenia znacznie przyspieszyły mi pracę w dalszych etapach montażu.
Po odmierzeniu równych odstępów, wystarczy ostrym cienkim przedmiotem ( ja użyłem wkładu do długopisu) zrobić otwory na lampy. Zagiąć z tyłu przy równych wysokościach oraz, jak w przypadku mocowania kabla do wieszania, wkładam w przecięty styropian i zabezpieczam taśmą.
Magistrala
Pierwotnie zamysł był inny, planowałem zbudować magistralę na 6 pinach PWM (arduino oraz atmega 328P, na którą to przeniesiemy, posiadają po 6 wyjść PWM). W efekcie musiałem zmniejszyć tą liczbę do 3, gdyż załączenie biblioteki IRremote powoduje naruszenie zegarów PWM i nie działają prawidłowo. Zjadło mi parę godzin głowienia się nad swoim kodem i szukania błędu, a on leżał gdzieś indziej.
Użycie wyjść PWM umożliwiło mi dostęp do całej palety barw, a nie tylko do 8. Wspólne anody przerzuciłem po dwie na jeden tranzystor – klucz.
Kabli narobiło się trochę za dużo, poradziłem sobie z tym używając [EKO] pozostałości po skrętce.
Przeniesienie na oddzielny układ – programowanie
Programowanie oddzielnej Atmegi 328P poszło całkowicie bezproblemowo dzięki: Artykułowi Macieja Czapli oraz wpisu na forum Łukasza.
Gdy pierwszy raz używamy uC, musimy wgrać Bootloader od Arduino. Przy kolejnych zmianach softu, już tej operacji powtarzać nie trzeba.
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 |
#include "IRremote.h" #define RED 0 #define GREEN 1 #define BLUE 2 // PINy //....................................... const int irPin = 8; const int LED_red = 9; const int LED_green = 6; const int LED_blue = 10; const int tran_0 = 4; const int tran_1 = 2; // Stany //....................................... boolean POWER = true; int STATE = 1; // zmienne i stale CORE //....................................... IRrecv irrecv(irPin); decode_results odebrane; const int CORE_RGBFLOW_SPEED = 2; // o ile skok w iteracji (zakres 0-255) wiec preferowane 2 const int MAX_LED = 2; // 2 x 2, ilosc roznych diod zapamietanych const int MUX = 1000; // wyswietlanie bramki microseconds int CORE_diody[MAX_LED][3] = {{0,255,0},{0,0,255}}; //tab trzymajaca wartosci led //_________________________________________________________________ // FUNKCJE //....................................... void pulseON(int tran_){ digitalWrite(tran_, HIGH); delayMicroseconds(MUX); digitalWrite(tran_, LOW); } void ustawDiode(int ktora, int r, int g, int b){ CORE_diody[ktora][RED] = r; CORE_diody[ktora][GREEN]= g; CORE_diody[ktora][BLUE] = b; } void ustawWszystkieDiody(int r0, int g0, int b0, int r1, int g1, int b1){ CORE_diody[0][RED] = r0; CORE_diody[0][GREEN]= g0; CORE_diody[0][BLUE] = b0; CORE_diody[1][RED] = r1; CORE_diody[1][GREEN]= g1; CORE_diody[1][BLUE] = b1; } void kopiujDiode(int ktora, int gdzie){ CORE_diody[gdzie][RED] = CORE_diody[ktora][RED]; CORE_diody[gdzie][GREEN]= CORE_diody[ktora][GREEN]; CORE_diody[gdzie][BLUE] = CORE_diody[ktora][BLUE]; } void show(int dane[MAX_LED][3], int opoznienie = 100){ for(int i = 0; i < opoznienie; i++){ analogWrite(LED_red, dane[0][RED]); analogWrite(LED_green, dane[0][GREEN]); analogWrite(LED_blue, dane[0][BLUE]); pulseON(tran_0); analogWrite(LED_red, dane[1][RED]); analogWrite(LED_green, dane[1][GREEN]); analogWrite(LED_blue, dane[1][BLUE]); pulseON(tran_1); } } void wykonajCMD(int CMD){ irrecv.resume(); switch(CMD){ //POWER - (EQ) case 55: if(POWER) POWER = false; else POWER = true; break; //TRYB - jeden kolor (CH) case 27: STATE = 1; ustawWszystkieDiody(0, 200, 255, 0, 200, 255); break; //TRYB - plynne przechodzenie (CH-) case 51: STATE = 2; break; } if(STATE == 1){ switch(CMD){ // opisane przyciski 0-9 // poustawialem sobie rozne kolory pod kazdym z przyciskow case 14: ustawWszystkieDiody(0, 0, 255, 0, 0, 255); break; case 79: ustawWszystkieDiody(0, 200, 255, 0, 200, 255); break; case 72: ustawWszystkieDiody(125, 0, 255, 125, 0, 255); break; case 43: ustawWszystkieDiody(255, 255, 0, 255, 255, 0); break; case 48: ustawWszystkieDiody(255, 255, 255, 255, 255, 255); break; case 88: ustawWszystkieDiody(255, 125, 0, 0, 125, 255); break; case 98: ustawWszystkieDiody(255, 0, 0, 255, 0, 0); break; case 66: ustawWszystkieDiody(40, 40, 255, 255, 40, 40); break; case 67: ustawWszystkieDiody(0, 255, 0, 0, 255, 0); break; case 19: ustawWszystkieDiody(255, 0, 255, 255, 0, 255); break; } } } int sprawdzPilot(){ return irrecv.decode(&odebrane); } void przygotujDiody(){ if(STATE == 0){ /* slot na dodatkowe przyszle rozszerzenia */ } else if(STATE == 1){ show(CORE_diody); } else if(STATE == 2){ for(int flow_0 = 0; flow_0 < 256 && sprawdzPilot() == 0; flow_0+=CORE_RGBFLOW_SPEED){ ustawDiode(0, 0, 255-flow_0, flow_0); ustawDiode(1, 0, 255-flow_0, flow_0); show(CORE_diody, 20); } for(int flow_1 = 0; flow_1 < 256 && sprawdzPilot() == 0; flow_1+=CORE_RGBFLOW_SPEED){ ustawDiode(0, flow_1, 0, 255-flow_1); ustawDiode(1, flow_1, 0, 255-flow_1); show(CORE_diody, 20); } for(int flow_2 = 0; flow_2 < 256 && sprawdzPilot() == 0; flow_2+=CORE_RGBFLOW_SPEED){ ustawDiode(0, 255-flow_2, flow_2, 0); ustawDiode(1, 255-flow_2, flow_2, 0); show(CORE_diody, 10); } } } //_______________________________________________________________________________________________ //_______________________________________________________________________________________________ void setup() { POWER = true; irrecv.enableIRIn(); pinMode(LED_red, OUTPUT); pinMode(LED_green, OUTPUT); pinMode(LED_blue, OUTPUT); pinMode(tran_0, OUTPUT); pinMode(tran_1, OUTPUT); ustawWszystkieDiody(0, 200, 255, 0, 200, 255); randomSeed(analogRead(0)); } void loop() { if (irrecv.decode(&odebrane)){ int okrojone = odebrane.value%100; wykonajCMD(okrojone); //irrecv.resume(); } if(POWER){ przygotujDiody(); } } |
Nazwy zmiennych oraz funkcji dobrane zostały dość intuicyjnie. Wyjaśnię działanie kilku z nich:
- ustawDiode(..), ustawWszystkieDiody(..) – służą do ustawiania tablicy opisującej aktualne kolory
- show(..) – naprzemienne wyświetlanie kolorów na diodach 1 – 2 oraz 3 – 4. Dzięki temu mam kontrolę nad dwójkami LED, a nie jako całością. Można rozszerzyć to do kontroli nad każdą jedną, ale jak na taki projekt jest to zbędne. Na 3 wyjścia analogowe puszczane są odpowiednie wartości (ustalone przez ustawDiode(..), ustawWszystkieDiody(..)) i tranzystorem puszczane jest napięcie na odpowiednie diody. Wartości z analogowych wyjść zmeniają się, po czym otwierany jest tranzystor podłączony do kolejnych LED.
- wykonajCMD(..) – funkcja nic nie wyświetla, lecz analizuje odebrany kod przycisku z pilota IR, lecz modyfikuje wewnętrzne zmienne opisujące dany stan, kolory itp.
- przygotujDiody(..) – funkcja analizuje ww zmienne i dzięki nim może płynnie wyświetlać to co chcemy
Przeniesienie na oddzielny układ – lutowanie
Zrobiłem kiedyś podstawkę do programowania attiny2313 i attiny83, [EKO] zostało na niej sporo nadmiaru, które można było wykorzystać do umieszczenia uC wraz z resztą elementów elektronicznych z projektu.
Odciąłem część i zabrałem się za przylutowanie podstawki pod mikrokontroler, [EKO] odlutowanych tranzystorów i rezystorów ze starych elementów i intuicyjnie oznaczonych wyjść. Aby znów ułatwić sobie przyszłą pracę uwzględniłem również wyjścia SPI (piny digital 10-13) oraz I2C (piny analog A4 i A5). Podczas pisania programu debugowałem go wysyłając komunikaty na I2C, a wyjścia SPI ograniczają przeprogramowanie zamontowanego okładu wyłącznie do podłączenia kabelków, bez wyjmowania Atmegi z podstawki.
Wszystko zlutowane zgodnie ze schematem:
Należy pamiętać, aby kondensatory filtrujące były jak najbliżej nóżek uC.
Priorytetem przy lutowaniu było to, aby zmieścić układ na małej płytce. Niestety traci on nieco na wyglądzie, ale wszystko jest zgodnie z powyższym schematem. Całość i tak będzie trzymana zamknięta w obudowie.
Tworzenie obudowy na układ
Z ograniczonymi funduszami i rozbudzoną, recyklingową kreatywnością szukałem pomysłu na schowaniem układu, uwzględniając prosty dostęp do SPI i I2C. Od tej samej sąsiadki zwinąłem [EKO] pustą i niezniszczoną paczkę po papierosach. Chyba jedyny pożytek z tego wydatku.
Z jednej strony, należało zrobić otwory na wyjścia zasilania, led, tranzystory jako klucze i odbiornik IR. Wyjścia do programowania zostawiam dostępne przez oryginalne otwarcie paczki.
W celu zasłonięcia rzucającego się w oczy koloru opakowania, okleiłem je czarną taśmą izolacyjną.
Kończenie tablicy
Wkładamy układ do wcześniej przygotowanej obudowy i łączę wyjścia z okablowaniem na tablicy. Należy jeszcze przylutować odbiornik IR, podprowadzić pod mikrokontroler oraz umiejscowić po zewnętrznej stronie naszej skrzynki.
Efekt końcowy
Oto kilka zdjęć prezentujących tablicę:
Jak widać możliwości jest bardzo dużo, każdy znajdzie coś dla siebie :). Osobiście wolę tryb, w którym kolory przelewają się …->GREEN -> BLUE -> RED ->… . Na białym styropianie świetnie widać wszystkie barwy. Efekt jest wręcz hipnotyzujący :). (Gdy tylko dorwę lepszy sprzęt, przedstawię ten tryb na filmiku).
Przypominam, że udało nam się wykorzystać przedmioty, które na co dzień trafiają do kosza.
Przepraszam za jakość zdjęć. Prezentacja tablicy zostanie poprawiona.
Filmik pojawi się w ciągu kilku najbliższych dni.
Dziękuję za uwagę i do zobaczenia następnym razem.
Pozdrawiam Bartek :)
Mam pomysł, jak poprawić odbicie światła od piłeczek. Spróbuj wykleić wewnętrzną stronę folią aluminiową, np z opakowania czekolady
Świetny pomysł :), w wolnej chwili na pewno zmodernizuje projekcik.
Sam artykuł bardzo fajny i ciekawie opisany, ode mnie 5/5, ale mam jedno pytanie do pana Łukasza.
W jaki sposób dokonywana jest decyzja czy post przechodzi na główną czy nie? Pytam, ponieważ mój artykuł wisi od wczoraj w poczekalni, a ten pojawił się dziś wieczorem i już jest na głównej. I po prostu ciekawi mnie na jakiej podstawie jeden artykuł przechodzi, a drugi czeka.
To pytanie to nie jest żadna ironia czy złośliwość lub zazdrość, ale zwyczajnie nie rozumiem zasady wg. której posty przechodzą.
Prosiłbym usunąć ten post i wyciąć pytanie do pana Łukasza, otrzymałem już odpowiedź na maila :>
Może nie jest Łukaszem, ale w FAQ jest wszystko opisane: https://majsterkowo.pl/pomoc/#poczekalnia Zależy od oceny i ilości głosów ;)
No właśnie Łukasz mi na maila dokładnie ten link podesłał :>
Po pierwsze zero filtrowania zasilania.
Po drugie wartości rezystorów na bazach to skąd się wzięły? z kosmosu?
Po trzecie zajrzyj do datasheet odbiornika TSOP i zobacz co producent zaleca przy podłączeniu.
Jeśli już coś się robi i udostępnia jako “pomoc” naukowa dla innych to warto zrobić to jak należy. Czyli dobre nawyki i poprawne rozwiązania a nie partyzantka “może zadziała”.
Rewelacja masturbacja!
103 głosy w lekko ponad 12 godzin, musisz mieć solidną grupę wsparcia bo niektóre tematy w miesiąc wyciągają połowę tego. Druga sprawa pomysł fajny ale wykonanie to tragedia, sory ale ja bym tego na ścianie nie powiesił. Kable dyndają bez ładu i składu. No i to o czym pisał Paweł to jak dla mnie gwóźdź do trumny. Ode mnie 2 na zachętę.
Dziękuję za subiektywnie sprawiedliwą ocenę :)
Link poleciał na Facebooka, tam również udostępniam wpisy z profilu majstorkowo.pl oraz z samej strony majsterkowo.pl
Wezmę uwagi do serca i na następny raz postaram się zrobić to wszystko staranniej.
Pozdrawiam i czekam na Twój artykuł :)
Jeden który potrafi przyjąć krytykę, czekam na następne projekty z lepszym wykonaniem. Pozdrawiam
Wykonanie tragedia? To spróbuj sam zrobić to estetyczniej wykorzystując w większości rzeczy, które normalnie lądują na śmietniku i pochwal się nam zdjęciami. ;)
Jak dla mnie, biorąc pod uwagę pochodzenie materiałów, wygląda to bardzo ciekawie.
O samym pomyśle nie wspominam, bo brak mi słów. :O
Plus za opis wykonania, elektronikę itp ale całość wygląda właśnie tak hmmm…. recyklingowo :)
Rzucam pomysł, przedstawiam i inspiruję. Gdy ktoś chce, to może sobie wykonać taki bajer z najlepszych produktów na rynku, najlepszymi narzędziami i wynająć najlepszych majsterkowiczów.
To już od nich zależy “CO CHCĄ POWIESIĆ NA ŚCIANIE” :P
Dzięki za opinie, są one dla mnie ważne. Widzę, że muszę położyć nacisk na staranność wykonania.
Fajne. Na pierwszy rzut oka wygląda jak interaktywna tablica.
Myślę, że wykorzystam sam pomysł “lampek” do oświetlenia w nocy tablicy korkowej :) Pozdrawiam.
I właśnie z takim zamysłem to pisałem!
Życzę powodzenia i pozdrawiam :)
Fajny pomysł. Moje gratulacje. Pozdrawiam.
Pomysł super! Gorzej z programowaniem … czy ktoś wykonał taką tablicę według tego pomysłu?
Witam, bardzo ciekawy przepis. Przyjemnie się czytało. Pozdrawiam