OVLÁDÁNÍ VÍCE RELÉ S NEOPIXEL RGB  ARDUINEM

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

Program pro PC:

Sdílet článek

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Mohlo by se také líbit