Kamarád mi poprosil o pomoc s tím že v současnosti potřebuje v jednom projektu ovládat čtyři reléové moduly, kdy jeden obsahuje šestnáct relátek které zakoupil v [1] a již má hotovou část zapojení přípravku, s tím že časem by chtěl ovládání z PC „po otestování“, ovládat diody pomocí tabletu nebo chytrého telefonu. Na tento počet ovládání relé je potřeba 64 ovládacích pinů, což ani ARDUINO MEGA 2560 s potřebou dalších vstupů které budou potřeba není možné použít. Po návrzích s posuvnými registry kterých by bylo potřeba osm kusů a složitosti zapojení mi napadlo použít pásek NEOPIXEL s RGB led diodami kdy na ovládání stačí jeden výstup z ARDUINA. Tak že pro pokusy co a jak půjde použít, jsem použil modul relátek osazený dvěma relátky, modul s MOSFET tranzistorem, Neopixel pásek s osmi RGB led diodami WS2812B, fototranzistor GL5528 a bluetooth JDY-33 pro komunikaci s tabletem chytrým telefonem vše zakoupené v [1]. Napsané programy jsou celkem dva jeden pouze pro ovládání Neopixel s osmi RGB led diodami, druhý pak umožňuje ovládat maximálně 255 RGB led použitých v Neopixel pásku. Oba programy umožňují ovládat libovolnou RGB diodu nebo více RGB led diod na Neopixel pásku včetně barev a dají se upravit dle potřeby. Přípravek může posloužit při vlastních pokusech s RGB LED Neopixel pásky a zároveň doplňuje články v [2]. Ovládání RGB diod je zde řešeno s ARDUINO NANO je možné použít i ARDUINO UNO. Programové ovládání RGB led diod na Neopixel pásku je dle požadavků kamaráda.
POPIS PŘÍPRAVKU
Pro Arduino NANO při testování programů a zapojení jej osazuji IO shield desky, ve finální verzi je použit shield pro ARDUINO NANO se svorkovnicemi a řadovými dutinkami pro osazení Arduino NANO zakoupenými v [1]. Napájení přípravku při testování bylo z nastavitelného zdroje, kde je na-staveno výstupní napětí 7VDC, současně je ze zdroje napájen i stabilizátor 7805 pro napájení RGB led Neopixel pásku a modulů s relé nebo modulů s tranzistory MOSFET. Vstupní PIN Neopixel pásku označený DIN je připojený na PIN Arduina PIN3. Pro komunikaci s PC nebo tabletem po-mocí bluetooth, je RXD na ARDUINO na PINU10 a je připojený na výstup TXD bluetooth nebo na TXD převodníku USB/COM TTL CH340. Pin TXD na ARDUINO je na PINU11 a je připojený na vstup RXD bluettoth nebo na RXD převodníku USB/COM TTL CH340, pro fotorezistor jsem při tes-tu osadil do obyčejného kolíčku ve kterém je vyvrtaný otvor o Ø 5mm a tento pak přichycen na RGB led diodu Neopixel pásku. Jeden vývod fotorezistoru je poté připojen ke kladnému nebo záporné-mu pólu podle toho jaké ovládací napětí je použito u ovládaného zařízení, v případě použití zakou-peného modulu s relé je jeden vývod fotorezistoru připojen k zápornému napájecímu napětí, proto-že relátka jsou spínána záporným napájecím napětím a druhý vývod fotorezistoru je připojen na řídící PIN DIN1 na DPS relátek. Při ovládání modulu s MOSFET tranzistorem je jeden vývod fotore-zistoru připojen ke kladnému napájecímu napětí, protože tranzistor je spínán kladným napětím a druhý vývod fotorezistoru je připojen na GATE MOSFET tranzistoru. V konečném provedení ovlá-dání 64 relé je osazení fotorezistorů řešeno tak že je použit gumový pásek o tloušťce 3 – 5mm kde jsou dle osazení RGB LED diod na Neopixel pásku vyseknuty otvory o Ø 5mm, poté jsou do nich osazeny fotorezistory a odzkoušeny zda sedí přímo na RGB led diodách na Neopixel pásku, délka gumového pásku je podle osmi led diod na Neopixel pásku. Pokud je vše v pořádku osadíme vý-vody fotorezistorů do otvorů univerzální vrtané destičky a zaletujeme, takto vyrobený protikus poté smontujeme s DPS RGB LED diodami Neopixel pásku. Výroba držáku fotorezistorů je čistě indivi-duální věc. Schéma zapojení je na Obr.č.01, Obr.č.02 a na Obr.č.03. V žádném případě nesmíme překročit maximální proud použitého fotorezistoru dle technické dokumentace, všechny použité moduly a součástky jsou bohatě popsány v [1].
POPIS PROGRAMŮ
Programy májí názvy RELÉ_RGB.INO, RELÉ_NEOPIXEL.INO jsou uloženy v adresáři PROGRA-MY v PODADRESÁŘI ARDUINO, první program je napsaný čistě pro tento účel pro ovládání osmi RGB LED diod na Neopixel pásku včetně barev. Druhý program umožňuje zadávání čísla RGB led diod na Neopixel pásku včetně barev do maximálního počtu 255. Které pak ovládají pomocí fotore-zistorů elektroniku pro spínání relátek nebo tranzistorů. Umožňují libovolně zapnout jakoukoliv RGB LED diodu na Neopixel pásku buď jednu nebo více současně a u každé si zvolit použité barvy. V druhém PODADRESÁŘI je ADRESÁŘ s názvem POČÍTAČ kde je uložen program AR-DUINO RS232.EXE s popisem k programu v souboru PDF jde o sériový terminálový program. V terminálu zadáváme parametry pro ovládání RGB LED diod v pořadí 1,255,255,255 kde 1 zna-mená pořadí RGB LED diody kterou chceme aby se rozsvítila, další hodnota 255 znamená svit čer-vené led diody, druhá hodnota 255 znamená svit zelené led diody, třetí hodnota 255 znamená svit modré led diody, pokud zadáme u zvolené RGB led diody na Neopixel pásku 5,255,255,255 navo-lená dioda svítí bílou barvou, po zadání hodnot pak odešleme do ARDUINA. V programu RE-LÉ_RGB.INO je možné zadat najednou více RGB led diod například 1,200,0,0,3,0,200,0 a poté odeslat do ARDUINA, barvy u každé RGB led diody je možné různě kombinovat. V programu RE-LÉ_NEOPIXEL.INO zadáváme více RGB led na neopixel pásku vždy po jedné 60,200,0,200 a ode-šleme a pak zadáváme další diodu. Vypnutí navolené RGB led diody na Neopixel pásku provede-me tak že za požadované číslo RGB led diody zapíšeme 1,0,0,0 stejně tak postupujeme i při vypí-nání více RGB LED diod které chceme vypnout a odešleme do ARDUINA. Program využívá dvě knihovny jedna je pro komunikaci s RGB led diodami „ ADAFRUINT_NEOPIXEL „ a druhá pro ko-munikaci po sériové lince při použití jiných pinů „ SOFTWARESERIAL „.
Program pro Arduino RELÉ_RGB:
/* program na ovladani vice rele s pouzitim Neopixel RGB led diod WS2812B nebo WS2811 pri pouziti WS2811 se MUSI ZMENIT HODNOTA NEO_KHZ800 ZA HODNOTU NEO_KHZ400 zadavani cisla ovladane RGB didy a hodnot je mozny z PC pomoci prevodniku USB/COM TTL s CH340 nebo z tabletu. www.mojeelektronika.mzf.cz vagnervlastimil@seznam.cz */ #include <Adafruit_NeoPixel.h> Adafruit_NeoPixel LED = Adafruit_NeoPixel(8, 3, NEO_GRB + NEO_KHZ800); // max pocet LED, pin pro vystup, rezim #include <SoftwareSerial.h> //prihrani knihovny pro komunikaci SoftwareSerial BT = SoftwareSerial(10, 11); // RXD=10 TXD=11 KOMUNIKACNI PINY na ARDUINU byte dioda, R, G, B; //promenne void setup() { // zacatek hlavni smycky pinMode(3, OUTPUT); // pin pro ovladani RGB LED v pasku BT.begin(9600); // komunikacni rychlost LED.begin(); // inicializace komunikace s Neopixel LED.show(); // povel pro prenos dat do led } void loop() { // hlavni smycka programu if (BT.available() > 0) { // nacteni hodnoty pokud je odeslana dioda = BT.parseInt(); // prvni hodnota je poradi LED R = BT.parseInt(); // druha hodnota je cislo pro intensitu jasu cervene diody G = BT.parseInt(); // treti hodnota je cislo pro intensitu jasu zelene diody B = BT.parseInt(); // ctvrta hodnota je cislo pro intensitu jasu modre diody if (dioda == 1) { // pokud je hodnota diody shodna s hodnotou jedna pokracuje se na dalsim radku for (int i = 0; i < dioda; i++) { // opakovani pro cely pasek led LED.setPixelColor(i, R, G, B); } // prikaz pro rozsviceni barev diody LED.show(); // prikaz pro prenos hodnot z pameti LED diody do cipu BT.print("prijate hodnoty"); // zobrazeni prijatych hodnot na monitoru PC nebo tabletu BT.print(dioda); // zobrazeni hodnoty navolene diody BT.print(R); // zobrazeni hodnoty pro cervenou barvu BT.print(G); // zobrazeni hodnoty pro zelenou barvu BT.println(B); // zobrazeni hodnoty pro modrou barvu dioda = 0; // do promenne dioda se ulozi hodnota "0" delay(500); // casova prodleva } // konec smycky if dioda 1 if (dioda == 2) { // pokud je hodnota diody shodna s hodnotou dve pokracuje se na dalsim radku for (int i = 1; i < dioda; i++) { // opakovani pro cely pasek led LED.setPixelColor(i, R, G, B); } // prikaz pro rozsviceni barev diody LED.show(); // prikaz pro prenos hodnot z pameti LED diody do cipu BT.print("prijate hodnoty"); // zobrazeni prijatych hodnot na monitoru PC nebo tabletu BT.print(dioda); // zobrazeni hodnoty navolene diody BT.print(R); // zobrazeni hodnoty pro cervenou barvu BT.print(G); // zobrazeni hodnoty pro zelenou barvu BT.println(B); // zobrazeni hodnoty pro modrou barvu dioda = 0; // do promenne dioda se ulozi hodnota "0" delay(500); // casova prodleva } // konec smycky volby if dioda 2 if (dioda == 3) { // pokud je hodnota diody shodna s hodnotou dve pokracuje se na dalsim radku for (int i = 2; i < dioda; i++) { // opakovani pro cely pasek led LED.setPixelColor(i, R, G, B); } // prikaz pro rozsviceni barev diody LED.show(); // prikaz pro prenos hodnot z pameti LED diody do cipu BT.print("prijate hodnoty"); // zobrazeni prijatych hodnot na monitoru PC nebo tabletu BT.print(dioda); // zobrazeni hodnoty navolene diody BT.print(R); // zobrazeni hodnoty pro cervenou barvu BT.print(G); // zobrazeni hodnoty pro zelenou barvu BT.println(B); // zobrazeni hodnoty pro modrou barvu dioda = 0; // do promenne dioda se ulozi hodnota "0" delay(500); // casova prodleva } // konec smycky if dioda 3 if (dioda == 4) { // pokud je hodnota diody shodna s hodnotou dve pokracuje se na dalsim radku for (int i = 3; i < dioda; i++) { // opakovani pro cely pasek led LED.setPixelColor(i, R, G, B); } // prikaz pro rozsviceni barev diody LED.show(); // prikaz pro prenos hodnot z pameti LED diody do cipu BT.print("prijate hodnoty"); // zobrazeni prijatych hodnot na monitoru PC nebo tabletu BT.print(dioda); // zobrazeni hodnoty navolene diody BT.print(R); // zobrazeni hodnoty pro cervenou barvu BT.print(G); // zobrazeni hodnoty pro zelenou barvu BT.println(B); // zobrazeni hodnoty pro modrou barvu dioda = 0; // do promenne dioda se ulozi hodnota "0" delay(500); // casova prodleva } // konec smycky if dioda 4 if (dioda == 5) { // pokud je hodnota diody shodna s hodnotou dve pokracuje se na dalsim radku for (int i = 4; i < dioda; i++) { // opakovani pro cely pasek led LED.setPixelColor(i, R, G, B); } // prikaz pro rozsviceni barev diody LED.show(); // prikaz pro prenos hodnot z pameti LED diody do cipu BT.print("prijate hodnoty"); // zobrazeni prijatych hodnot na monitoru PC nebo tabletu BT.print(dioda); // zobrazeni hodnoty navolene diody BT.print(R); // zobrazeni hodnoty pro cervenou barvu BT.print(G); // zobrazeni hodnoty pro zelenou barvu BT.println(B); // zobrazeni hodnoty pro modrou barvu dioda = 0; // do promenne dioda se ulozi hodnota "0" delay(500); // casova prodleva } // konec smycky if dioda 5 if (dioda == 6) { // pokud je hodnota diody shodna s hodnotou dve pokracuje se na dalsim radkufor (int i = 5; i < dioda; i++){ // opakovani pro cely pasek led for (int i = 5; i < dioda; i++) { // opakovani pro cely pasek led LED.setPixelColor(i, R, G, B); } // prikaz pro rozsviceni barev diody LED.show(); // prikaz pro prenos hodnot z pameti LED diody do cipu BT.print("prijate hodnoty"); // zobrazeni prijatych hodnot na monitoru PC nebo tabletu BT.print(dioda); // zobrazeni hodnoty navolene diody BT.print(R); // zobrazeni hodnoty pro cervenou barvu BT.print(G); // zobrazeni hodnoty pro zelenou barvu BT.println(B); // zobrazeni hodnoty pro modrou barvu dioda = 0; // do promenne dioda se ulozi hodnota "0" delay(500); // casova prodleva } // konec smycky if dioda 6 if (dioda == 7) { // pokud je hodnota diody shodna s hodnotou dve pokracuje se na dalsim radku for (int i = 6; i < dioda; i++) { // opakovani pro cely pasek led LED.setPixelColor(i, R, G, B); } // prikaz pro rozsviceni barev diody LED.show(); // prikaz pro prenos hodnot z pameti LED diody do cipu BT.print("prijate hodnoty"); // zobrazeni prijatych hodnot na monitoru PC nebo tabletu BT.print(dioda); // zobrazeni hodnoty navolene diody BT.print(R); // zobrazeni hodnoty pro cervenou barvu BT.print(G); // zobrazeni hodnoty pro zelenou barvu BT.println(B); // zobrazeni hodnoty pro modrou barvu dioda = 0; // do promenne dioda se ulozi hodnota "0" delay(500); // casova prodleva } // knec smycky if dioda 7 if (dioda == 8) { // pokud je hodnota diody shodna s hodnotou dve pokracuje se na dalsim radku for (int i = 7; i < dioda; i++) { // opakovani pro cely pasek led LED.setPixelColor(i, R, G, B); } // prikaz pro rozsviceni barev diody LED.show(); // prikaz pro prenos hodnot z pameti LED diody do cipu BT.print("prijate hodnoty"); // zobrazeni prijatych hodnot na monitoru PC nebo tabletu BT.print(dioda); // zobrazeni hodnoty navolene diody BT.print(R); // zobrazeni hodnoty pro cervenou barvu BT.print(G); // zobrazeni hodnoty pro zelenou barvu BT.println(B); // zobrazeni hodnoty pro modrou barvu dioda = 0; // do promenne dioda se ulozi hodnota "0" delay(500); // casova prodleva } // konec smycky if dioda 8 } // konec smycky if avilable delay(1000); // casova prodleva } // konec hlavni smycky
Program pro Arduino RELÉ_NEOPIXEL:
/* program na ovladani vice rele (zde zadano MAX 255)s pouzitim Neopixel RGB led diod WS2812B nebo WS2811, pri pouziti WS2811 se MUSI ZMENIT HODNOTA NEO_KHZ800 ZA HODNOTU NEO_KHZ400. Zadavani cisla ovladane RGB didy a hodnot R, G, B, je mozny z PC pomoci prevodniku USB/COM TTL s CH340 a seriovym terminalem, nebo z tabletu pomoci bluetooth JDY-33 a seriovym terminalem pro ANDROID. Po odladeni programu je mozne prikazy BT.print pro odesilani dat do PC nebo tabletu smazat. www.mojeelektronika.mzf.cz vagnervlastimil@seznam.cz */ #include <Adafruit_NeoPixel.h> Adafruit_NeoPixel LED = Adafruit_NeoPixel(255, 3, NEO_GRB + NEO_KHZ800); // max pocet LED, pin pro vystup, rezim #include <SoftwareSerial.h> //prihrani knihovny pro komunikaci SoftwareSerial BT = SoftwareSerial(10, 11); // RXD=10 TXD=11 KOMUNIKACNI PINY na ARDUINU byte R, G, B; //promenne int dioda, poradi; //promenne void setup() { // zacatek hlavni smycky pinMode(3, OUTPUT); // pin pro ovladani RGB LED v pasku BT.begin(9600); // komunikacni rychlost LED.begin(); // inicializace komunikace s Neopixel LED.show(); // povel pro prenos dat do led } void loop() { // hlavni smycka programu if (BT.available() > 0) { // nacteni hodnoty pokud je odeslana z terminalu PC nebo tabletu dioda = BT.parseInt(); // prvni hodnota je poradi LED R = BT.parseInt(); // druha hodnota je cislo pro intensitu jasu cervene diody G = BT.parseInt(); // treti hodnota je cislo pro intensitu jasu zelene diody B = BT.parseInt(); // ctvrta hodnota je cislo pro intensitu jasu modre diody poradi = (dioda - 1); // prepocet na pozadovanou RGB LED diodu Neopixel for (int i = poradi; i < dioda; i++) { // opakovani pro cely pasek led LED.setPixelColor(i, R, G, B); } // prikaz pro rozsviceni barev diody LED.show(); // prikaz pro prenos hodnot z pameti LED diody do cipu BT.print("prijate hodnoty"); // zobrazeni prijatych hodnot na monitoru PC nebo tabletu BT.print(dioda); // zobrazeni hodnoty navolene diody BT.print(R); // zobrazeni hodnoty pro cervenou barvu BT.print(G); // zobrazeni hodnoty pro zelenou barvu BT.println(B); // zobrazeni hodnoty pro modrou barvu dioda = 0; // do promenne "dioda" se ulozi hodnota "0" poradi = 0; // do promenne "poradi" se ulozi hodnota "0" delay(500); // casova prodleva } // konec smycky if BT.available } // konec hlavni smycky
Zadání hodnoty v sériovém terminálu na počítači:
Použité prameny:
Bližší informace: vagnervlastimil@seznam.cz