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

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

Další podobné články

Senzor oxidu uhelnatého MQ-9

Senzor reaguje nejvíce na oxid uhelnatý (CO) ale i na hořlavé plyny metan a propan. Aktivním prvkem tohoto senzoru je tenká vrstva SnO2, jejíž odpor se mění s koncentrací zmíněných plynů.

RFID Systém s LCD displejem, bzučákem a servomotorem

Tento projekt ukazuje, jak vytvořit jednoduchý přístupový systém pomocí RFID čtečky, LCD displeje, bzučáku a servomotoru. Systém umožňuje kontrolu přístupu pomocí RFID tagů – při správném tagu se servo otočí, zobrazí se zpráva, a systém se resetuje. Při špatném tagu bzučák vydá zvuk a zobrazí se zamítnutí přístupu.