Witam,
Chciałbym przedstawić projekt odbiornika IR umożliwiającego sterowanie dowolnym urządzeniem (np. na 230v) za pomocą pilota IR. Założenia były takie, aby umożliwiał on szybką zmianę pilota i był zbudowany z elementów które miałem pod ręką. Wiem że na majsterkowie podobny projekt był już opublikowany, ale moje opracowanie ma jedno udogodnienie. Mianowicie przycisk do ustawiania kodu.
To do dzieła!
Elementy jakie będziemy potrzebować w wersji testowej to:
- Arduino
- Odbiornik IR
- Tact Switche
- Płytka stykowa np taka i przewody do niej np. takie
- rezystory, kondensatory, diody itp.
Na początek zajmiemy się podłączeniem do arduino.
Przed wgraniem programu należy pobrać i przenieść do środowiska Arduino bibliotekę IRremote
Kod programu jaki musimy wkleić do środowiska Arduino
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 #include <IRremote.h>#include <EEPROM.h>#define button 2 //pin przycisku zmiany stanu diody#define setPin 7 //pin zmiany kodu pilota#define outPin 8 // pin diody/triaka (out)#define irPin 9 // pin podłączenia odbiornika IRIRrecv irrecv(irPin);decode_results results;byte a,b,c,d; // kod pilota podzielony na 4 częścibyte on = 0; // zmienna stanu diodyvoid setup() {irrecv.enableIRIn();pinMode(setPin, INPUT_PULLUP);pinMode(button, INPUT_PULLUP);pinMode(outPin, OUTPUT);}void loop() {if(digitalRead(button) == LOW){ // warunek odpowiadający za manualne włączenie diody/triakaon = !on;digitalWrite(outPin, on);delay(200);}if (irrecv.decode(&results)) {a = lowByte(results.value); //podzielenie 32 bitowego kodu na 4 zmienne a,b,c,db = (results.value >> 8); //przez użycie przesunięcia bitowegoc = (results.value >> 16);d = (results.value >> 24);if (digitalRead(setPin) == LOW){ // warunek zapisujący nowy kod do EEPROMEEPROM.write(0, a); //zapis poszczególnych kodów z pilota (adres pamięci, wycinek kodu z pilota)EEPROM.write(1, b);EEPROM.write(2, c);EEPROM.write(3, d);}byte a1 = EEPROM.read(0); //odczyt poszczególnych kodów z pilotabyte b1 = EEPROM.read(1);byte c1 = EEPROM.read(2);byte d1 = EEPROM.read(3);if (a == a1 && b == b1 && c == c1 && d == d1){ // warunek sprawdzający czy kody odebrane z pilota == kodom zapisanym w EEPROMon = !on;digitalWrite(outPin, on);delay(100);}irrecv.resume();}}
Teraz opiszę krótko zasadę działania: Na początku deklarowane są biblioteki, piny. W funkcji setup() ustawiane są odpowiednie piny jako wejścia, wyjścia i uruchamiana jest obsługa podczerwieni. W pętli loop() rozpoczyna wykonywanie się głównego programu. Czeka on na wciśnięcie buttona lub odebranie sygnału z pilota. Kiedy odbierze go to dzieli na cztery zmienne: a, b, c, d. Jeśli przy okazji będzie wciśnięty setPin to zapisze te zmienne do EEPROM. Jeżeli jest na odwrót to z EEPROM są sczytywane wartości. W ostatnim warunku sprawdzana jest zgodność kodów odebranych z pilota z kodami z EEPROM. W kodzie są także komentarze więc myślę że nikt nie będzie miał problemu ze zrozumieniem go.
To tyle w kwestii programu. Teraz zajmiemy się wykonaniem finalnej wersji.
Do finalnej wersji przydadzą się jeszcze:
- czysty mikrokontroler Atmega328
- Płytka uniwersalna
- triak np. Bt138 i optotriak np. moc3021
- zasilacz 5v np ze starego telefony komórkowego
- kabel i gniazdko 230v
- jakaś obudowa
Na schemacie zaznaczone są nazwy pinów w Arduino aby łatwiej się wszystko łączyło.
Przy budowie części odpowiadającej za sterowanie 230v należy zachować szczególną ostrożność gdyż pomyłka może mieć tragiczne skutki.
Robisz to na własną odpowiedzialność!
Jakby ktoś pytał jak to jest połączone w rzeczywistości to tak to wygląda: plątanina kabelków i trochę termogluta :)
Dodaję jeszcze filmik z działania:
Na koniec jeszcze krótko przypomnę jak programuje się czysty mikrokontroler:
Ja to robię w środowisku arduino 1.0.6
Więc tak do Atmegi podłączamy programator tak jak na powyższym schemacie:
SCK – PB5
MISO – PB4
MOSI – PB3
RST – Do pinu reset uC
+5v uC – +5v programatora
GND – GND (podłącz nawet wtedy gdy nie podajesz zasilania z programatora!)
Nie zapomnijcie dodać także kondensatorów filtrujących przy uC 100uF elektrolityczny i 100nF ceramiczny. Bez nich wasz układ może działać niepoprawnie.
Obrazek pochodzi z tej strony.
Na końcu pozostało zmodyfikować trochę wpis boards.txt aby środowisko Arduino zaczęło obsługiwać atmegę328 z wewnętrznym oscylatorem 8MHz. W tym wątku jest napisane więcej o tym pliku (co oznaczają poszczególne linie).
Dodajemy na końcu tego pliku
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
################################################################# atmega328.name=ATmega328 @ 8 MHz atmega328.upload.maximum_size=30720 atmega328.bootloader.low_fuses=0xE2 atmega328.bootloader.high_fuses=0xDA atmega328.bootloader.extended_fuses=0x05 atmega328.bootloader.unlock_bits=0x3F atmega328.bootloader.lock_bits=0x0F atmega328.bootloader.path=arduino:atmega atmega328.build.mcu=atmega328p atmega328.build.f_cpu=8000000L atmega328.build.core=arduino:arduino atmega328.build.variant=arduino:standard |
Przez tę modyfikację w menu narzędzia-płytka mamy na końcu do wyboru tą płytkę. Pozostało jeszcze wybrać odpowiedni programator (USB-ASP) poprzez kliknięcie w narzędzia-programator-usbasp.
Gdy już mamy wszystko podłączone to klikamy: narzędzia-wypal bootloader co ustawi fusebity procesora (bootloader się nie wgra, bo nie jest zdefiniowany w powyższym pliku ale i tak go nie potrzebujemy bo programujemy przez ISP nie przez UART). Na koniec aby wgrać program do procesora/płytki klikamy załaduj bądź plik-załaduj używając programatora. Temat programowania mikrokontrolerów w Arduino jest bardzo rozległy więc ja przedstawiłem jak to zrobiłem.
Dziękuję za uwagę. Zapraszam do komentowania i oceniania :)
Fajny projekt, brawo za zwiększenie uniwersalności przez dodanie programowania pilota na pewno w przyszłości wykorzystam do własnych projektów, daje 5.
Super projekt. Czy Kolega ma może filmik z działania tego układu?
Spróbuję dzisiaj wrzucić
Naprawdę ciekawy projekt. W przyszłości z pewnością go zbuduję, a może z ciekawości dołożę ze 2 kanały – było by super.
Zasłużone – 5
ps. bardzo dobry opis.
ps2. Czy nie dało by się tu wstawić atmegi 8?
Dzięki,
na Atmedze 8 powinno się dać ale nie testowałem
Na ATmedze 8 się nie zmieści bibliteka IRremote
Tylko jedna uwaga odnośnie filtracji napięcia
Dwa kondensatory nie wystarczą. Szczególnie jeśli układ jest podłączony do 230V.
Należy dodać kondensatory pomiędzy GND i VCC na każdym pinie zasilającym. Nawet jeśli wydaje się , że wszystko gra. Bo wystarczy nagły wzrost zakłóceń ( np. postawisz układ koło mikrofalówki , uruchomiSz odkurzacz czy coś w tym stylu. ) i mikrokontroler się zawiesi. Zazwyczaj stosuje się jeden kondensator ceramiczny 100nF i jeden kondensator elektrolityczny 1 uF ( low ESR ). To zazwyczaj wystarcza a jeśli występują większe wahania napięcia to dodaje się też jeden stabilizator napięcia wraz z odpowiednimi kondensatorami na wejściu i wyjściu. Duży kondensator elektrolityczny ma sens jeśli występują krótkotrwałe wahania napięcia ale przy większych nie wystarczy. Lepiej dmuchać na zimne bo potem można się długo zastanawiać czemu układ nagle przestał działać. Kondensatory nie są drogie a w większości przypadków zapewniają stabilną pracę układu.
Oj przepraszam.
Właśnie zauwaźyłem , że w tekście jest o filtracji zasilania.
Ale po co aż 100 uF ?
W zupełności wystarczy 5 uF. Duże kondensatory wcale nie są lepsze bo mają wysoką impedancję.
Co do kondensatorów filtrujących ja daję 1 ceramiczny 100nF i 1 elektrolityczny 100uF. Więcej o filtracji jest tutaj https://youtu.be/CjZcKRFV4Sk
Już nawet wiem, gdzie to można zastosować.
Jak toś ma TV z zewnętrznym system Audio, który w przypadku braku sygnału na MUX buczy, może tak sobie zakodować ten układ, by kod włączający TV załączał zasilanie dla systemu audio :>
Na czym polega zapisanie wzorca kodu pilota, czy można zastosować dowolny pilot, niekoniecznie w standardzie rc5?
Wszystko jest wytłumaczone w opisie programu.
Co do innego pilota to prawdopodobnie tak ale trzeba by sprawdzić.
Opis i kod nie wyjaśniają jak działa funkcja irrecv, chyba na tym polega “urok” arduino, coś działa ale nie wiadomo dokładnie jak
Jeśli interesuje cię jak to działa “od kuchni” to wystarczy otwożyć plik .h i .cpp z biblioteki irremote aby się dowiedzieć. Po to właśnie powstało arduino aby każdy bez zagłębiania się w szczegóły programowania może stwożyć działające urządzenie :)
NEC, SONY, RC5, RC6 https://www.pjrc.com/teensy/td_libs_IRremote.html
Czy można ten projekt wgrać do atetin85