Vlastimil Vágner
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 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. 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. 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. Napájení přípravku při testování bylo z nastavitelného zdroje, kde je nastaveno 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 pomocí bluetooth, je RXD na ARDUINO na PINU10 a je připojený na výstup TXD bluetooth nebo na TXD převodníku USB/UART. Pin TXD na ARDUINO je na pinu 11 a je připojený na vstup RXD bluettoth nebo na RXD převodníku USB/UART, pro fotorezistor jsem při testu 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í zakoupené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 fotorezistoru 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ě individuá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!
POPIS PROGRAMŮ
Programy májí názvy RELÉ_RGB.INO, RELÉ_NEOPIXEL.INO. 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í fotorezistorů 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. Další program je program pro počítač s názvem ARDUINO RS232.EXE. 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 znamená pořadí RGB LED diody kterou chceme aby se rozsvítila, další hodnota 255 znamená svit červené 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 navolená dioda svítí bílou barvou, po zadání hodnot pak odešleme do ARDUINA. V programu RELÉ_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 RELÉ_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 provedeme 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 komunikaci po sériové lince při použití jiných pinů „ SOFTWARESERIAL „.
použitý RGB LED pásek 8 x RGB
Použitý RGB LED pásek ze strany pájecích pinů
Testovací modul který používám při testování programů zde testování programu RGB LED
Rozsvícené RGB LED diody po příkazu z terminálu PC
Zadání více příkazů pro RGB LED diody v terminálu pro ANDROID v programu RELÉ_RGB.INO
Rozsvícené RGB LED diody po příkazu odeslaného z tabletu přes bluetooth
Osazení fotorezistoru při testování zde aktivní RGB LED dioda č.2 pro sepnutí relé na modulu
Použitý modul relátek zde aktivován vstup DIN1 relé sepnuto
Použitý modul s MOSFET tranzistorem připraveno k otestování
Sepnutí MOSFET tranzistoru na modulu a rozsvícení LED diody na modulu a LED diody v kontaktním poli.
Zadání hodnoty v sériovém terminálu na počítači
Zadání více příkazů pro rozsvícení více RGB LED diod
Programy pro Arduino:
/* 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
/* 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