Close

Arduino lampion

Arduino lampion

Znáte tu atmosféru, kdy se celé město večer zabalí do tmy, přestanou troubit auta a všechno se zklidní a zpomalí. Vzduchem se nese vůně blížících se Vánoc a do ulic mohou vyrazit světlonoši v tajemném průvodu plném světel a barev. Ano, máme tady zrovna dobu lampionových průvodů. Tyto průvody měly v minulosti různé důvody. Třeba takový Arduino lampionový průvod manifestuje krásu hraní a tvoření s Arduinem.

Tak proč si nepostavit lampion přímo s Arduinem a RGB LED páskem? Ovládat to můžeme celé přes Bluetooth z mobilu. To bude Arduino světlonoš. Co vy na to?

Dáme si tam možnost zvolení barvy lampionu, efekt stroboskopu a také barevnou hudbu! Kdo se bude opravdu snažit, přidá si další režimy podle sebe. Vytvoříme si aplikaci pro Android v online grafickém IDE. Se sestavou Arduina, Bluetooth a NeoPixel LED páskem můžeme barevně osvětlit v podstatě cokoliv a řídit to na dálku z mobilního telefonu. Na vánoční stromek to bude také pasovat. Zajímavá je flexibilita takto jednoduchého Arduino projektu, možnost napájení z baterie a kompaktní rozměry. NeoPixel LED se opravdu povedly a dá se s nimi užít hodně zábavy.

Arduino lampion – jdeme na to!

Nejprve zvolíme vhodné komponenty pro stavbu. Jako základ potřebujeme nějaké malé Arduino. Použijeme Arduino NANO, protože je kompaktní a dá se přímo připojit k počítači. Dále potřebujeme Bluetooth modul HC-05 pro bezdrátovou komunikaci s mobilem a RGB LED pásek. Bude se hodit také LiPol baterie 3,7V s modulem pro nabíjení a zvyšujícím měničem pro výrobu napětí 5 V, aby nebyl lampion závislý na napájení ze síťového zdroje. Jako tělo lampiónu použijeme levné stínidlo z IKEA.

Při konstrukci hardwaru šlo vše hladce. Zarazil jsem se až při psaní kódu. Osvěžil jsem si „delay“ bez funkce delay() s použitím Arduino času millis(). Protože nelze používat delay() a sériovou komunikaci, jen pokud je prodleva opravdu malá. Postupoval jsem svou oblíbenou metodou „pokus omyl“. Po chvíli laborování se vše podařilo. A teď se na celý postup podíváme podrobněji.

Rychlokurz ai2.appinventor.mit.edu grafického IDE

Nejprve si vytvořte účet, ideální je použít spárování s Google účtem. Toto online IDE pro tvorbu Android aplikací je vhodné jak pro začátečníky tak pro pokročilé. Tvorba appky je intuitivní. Také je v IDE spousta příkladů, podle kterých se dá jednoduše postupovat ve vlastním projektu. Mně osobně nejvíce vyhovuje jednoduchá inicializace Bluetooth a následná komunikace s Arduinem. Pro téměř každý můj projekt používám toto online IDE jako univerzální ovladač a display pro Arduino. V podstatě nahrazuje tlačítka, potenciometry, displeje, klávesnice. Co se komu hodí. A když někdo vidí, jak ovládáš věci z telefonu, říká „Cože, jak si to udělal?“. Ty odpovíš jen: „Ty ještě neděláš v APP Inventoru“?

Po rozkliknutí odkazu a úspěšném přihlášení do online IDE vidíme design screen. Zde se vytvářejí ovládací prvky aplikace. Vpravo nahoře je tlačítko ‚Blocks‘ to nás přepne do grafického skládání kódu, podobně jako například u Mblock, které znáte od robotů mBot.

APP Inventor – design screen

APP Inventor - design screen

APP Inventor – design screen

Grafická část skládání bloků kódu

APP Inventor - vkládání bloků

APP Inventor – vkládání bloků

Přikládám na stažení soubor aplikace a také kód aplikace, který otevřetete v online IDE. Kliknutím na ‚projekt‘ ==> ‚import project from my computer‘  vložíte stažené „jmeno souboru“.aia  z odkazu.  

Podrobněji se na online Android IDE zaměříme třeba příště. Zde je odkaz na spoustu užitečných tutoriálů.

Výsledná aplikace vypadá na displeji mobilu nějak takto.

Arduino android lampion app

Arduino android lampion app

Nejprve aktivujte komunikaci s Bluetooth modulem HC-05. V aplikaci si můžete vybrat, jestli má nastavení platit pro celý pásek (v celku) a nebo postupně pro jednotlivé LED (horizontálně). Můžete nastavit barvu v barevném kole a aktivovat funkce pro Equalizer a Stroboskop. Equalizer převádí signál z mikrofonu podle jeho intenzity na barevné efekty LED. Stroboskop pak vytvoří světelný efekt, tak jak ho známe z různých tanečních akcí. Ideální je si to vyzkoušet.

Konstrukce Arduino lampionu

Ideální je začít spojovat Arduino a jednotlivé moduly na kontaktním poli, aby se dalo všechno pohodlně odzkoušet.

Schéma pokusného zapojení Arduino lampionu

Na kontaktním poli je vidět Arduino NANO s připojeným Bluetooth a zvukovým modulem. Zapojený je také LED pásek. Není tady zahrnuta LiPol baterie, nabíjecí modul a zvyšující měnič pro napájení.

Arduino lampion - schéma propojení modulů

Arduino lampion – schéma propojení modulů

Na následujícím obrázku vidíme pokusné zapojení pro zkoušení funkčnosti.

Zapojení Arduino lampionu na kontaktním poli

Zapojení Arduino lampionu na kontaktním poli

Před nahráním kódu naimportujte do Arduino IDE NeoPixel knihovny. Následující kód zkopírujte do Arduino IDE. Propojení jednotlivých modulů a pinů je na začátku kódu pro Arduino.

/* piny
 * HC-05
 * Tx 2
 * Rx 3
 * Vcc 5V+
 * GND gnd
 *
 * Mikrofon senzor
 * Vcc 5V+
 * GND gnd
 * A0 - A0
 *
 * NeoPixel pásek
 * DIN 6
 * VCC 5V+
 * GND gnd
 */
int blok;           // hodnota registru
const int sampleWindow = 50;  // prodleva dat z mikrofonu
unsigned int sample;
#include <Adafruit_NeoPixel.h> // knihovna neo_pixel pásku
#ifdef __AVR__
#include <avr/power.h>
#endif
#define PIN 6            // din pin LED pásku
Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ800);
#include <SoftwareSerial.h> // inport knihovny softwareserial
#include <Wire.h>
SoftwareSerial BT(2, 3); // Bluetooth piny (RX,TX)
// proměné pro dekódování hodnoty barvy
int RED_LED = 13;
String RGB = "";
String RGB_Previous = "255.255.255)";
String ON = "ON";
String OFF = "OFF";
boolean RGB_Completed = false, style = false;
int r, g, b, rh, gh, bh, s;
float cas;
void setup() {
 BT.begin(9600); // inicializace softwareserial na pinech (2,3) s rychlostí 9600
 RGB.reserve(30);
 Serial.begin(9600); // inicializace serial(9600);
#if defined (__AVR_ATtiny85__)
 if (F_CPU == 16000000) clock_prescale_set(clock_div_1); // ověření setup knihovny
#endif
 strip.begin();// start pásku
 strip.show(); // ukaž co máč navolené
 blok = 0;
 r = 255;   // startovní barva je červená
}
void loop() {
 {
   while (BT.available()) { // pokud jsou přijatá nějaká data
     char ReadChar = (char) BT.read();
     if (ReadChar == 'b') { // apka posílá příkazy jako písmena
       blok = 1;                  // pokud se shoduje, blok registr se přiřadí příslušná hodnota a spustí se
     }
     else { // void () se shodným číslem 
       if (ReadChar == 'd' || ReadChar == 'c') {
       }
       else {
         blok = 0;
       }
     }
     if (ReadChar == 'c') {
       style = true;
     }
     if (ReadChar == 'd') {
       style = false;
     }
     if (ReadChar == 'i') {
       blok = 3;
       cas = millis();
     }
     if (ReadChar == ')') {     
       // pokud je natažen znak ) znamená to že RGB kód byl přijat, apka posílá String R.G.B)
       RGB_Completed = true;    // takže červená vypadá takto 255.0.0)
     } 
     else {
       RGB += ReadChar;
     }
   }
   //Když je příkazový kód přijat úplně s koncovým znakem ')'
   if (RGB_Completed) {
     if (RGB == ON) {
       digitalWrite(13, HIGH);
       RGB = RGB_Previous;
       Light_RGB_LED();
     } 
     else if (RGB == OFF) {
       digitalWrite(13, LOW);
       RGB = "0.0.0)";
       Light_RGB_LED();
     } 
     else {
       //zapni barvu podle barevného kódu ze sériového portu Bluetooth
       if (blok == 0) {
         Light_RGB_LED();
       }
       RGB_Previous = RGB;
     }
     RGB = "";
     RGB_Completed = false;
   }
 }
 if (blok == 1) { // rozřazení co uživatel zmáčknul za funkci
   equalizer();
 }
 if (blok == 3) {
   if (style == true) {
     strobo(100);
   }
   else {
     bourka(200);
   }
 }
}
void equalizer()     // void pro equalizer
{
 unsigned long startMillis = millis();
 unsigned int peakToPeak = 0;   // úroveň špiček
 unsigned int signalMax = 0;
 unsigned int signalMin = 1024;
 // sbírej data po 50 mS
 while (millis() - startMillis < sampleWindow) {
   sample = analogRead(0);
   if (sample < 1024) {
     if (sample > signalMax) {
       signalMax = sample;
     } else if (sample < signalMin) {
       signalMin = sample;
     }
   }
 }
 peakToPeak = signalMax - signalMin;  // amplitude
 int volts = (peakToPeak * 500) / 1024;  // TADY JE SOFTWARE nastavení citlivosti
 // přepisuje se hodnota 500 čím vyší hodnota tím je citlivější
 // u mě to jelo výborně s tímto nastavením
 if (style == false)              // equalizer celý
 {
   for (int i = 0; i < volts; i++) {
     if (i < 5){
       strip.setPixelColor(i, 0, 255, 0);
     }
     if (i > 4 && i < 10) {
       strip.setPixelColor(i, 0, 0, 255);
     }
     if (i > 9) {
       strip.setPixelColor(i, 255, 0, 0);
     }
   }
   for (int i = volts; i < 16; i++){
     strip.setPixelColor(i, 0);
   }
   strip.show();
 } else                  // equalizer horizontálně
 {
   for (int i = 0; i < 15; i++) {
     if (volts < 8){
       strip.setPixelColor(i, 0, 255, 0);
     }
     if (volts > 8 && volts < 12){
       strip.setPixelColor(i, 0, 0, 255);
     }
     if (volts > 12){
       strip.setPixelColor(i, 255, 0, 0);
     }
   }
 }
 strip.show();
}
void Light_RGB_LED() {             // dekódování String řetězce do jednotlivých int hodnot
 if (RGB.length() > 5 && RGB.length() < 12) {
   int SP1 = RGB.indexOf('.');
   int SP2 = RGB.indexOf('.', SP1 + 1);
   int SP3 = RGB.indexOf('.', SP2 + 1);
   String R = RGB.substring(0, SP1);
   String G = RGB.substring(SP1 + 1, SP2);
   String B = RGB.substring(SP2 + 1, SP3);
   r = R.toInt();
   g = G.toInt();
   b = B.toInt();
   //vypíše debug info na Serial monitoru
   Serial.print("R=");
   Serial.println(constrain(R.toInt(), 0, 255));
   Serial.print("G=");
   Serial.println(constrain(G.toInt(), 0, 255));
   Serial.print("B=");
   Serial.println(constrain(B.toInt(), 0, 255));
   for (int i = 0; i < 16; i++) { // promítne hodnoty na pásek
     strip.setPixelColor(i, R.toInt(), G.toInt(), B.toInt());
   }                    
     
   strip.show();
 }
}
void strobo(int prodleva) {
 if (millis() > cas - prodleva / 2) {
   for (int i = 0; i < 15; i++) {
     strip.setPixelColor(i, 0, 0, 0);
   }
 }
 if (millis() > cas) {
   for (int i = 0; i < 15; i++){
     strip.setPixelColor(i, 255, 255, 255);
   }
   cas += prodleva;
 }
 strip.show();
}
void bourka(int prodleva) {
 int in[15];
 for (int i = 0; i < 15; i++){
   in[i] = i;
 }
   
 if (millis() < cas - (prodleva / 2)) {
   strip.setPixelColor(in[s], r, g, b);
   strip.show();
 }
 if (millis() > cas - (prodleva / 2)) {
   for (int i = 0; i < 15; i++) {
     strip.setPixelColor(i, 0, 0, 0);
   }
   s = random(0, 14);
   if (millis() > cas)
     cas += prodleva;
   strip.show();
 }
}

Arduino lampion – prototyp

Prototyp lampionu jsem vytvořil na univerzálním plošném spoji, aby byla zajištěna dobrá odolnost proti otřesům. Při vhodném rozmístění modulů je spojení velmi jednoduché a pájení minimální.

Arduino lampión - řídící PCB (Arduino NANO, Bluetooth HC-05, zvukový modul)

Arduino lampion – řídící PCB (Arduino NANO, Bluetooth HC-05, zvukový modul)

Na spodní straně univerzálního plošného spoje jsou vidět zapájené propojky. Ty se dají snadno udělat tak, že teplotu pájecího hrotu nastavím na minimum.

Řídící deska pro Arduino lampión - zespodu

Řídící deska pro Arduino lampion – zespodu

Celý lampion můžeme napájet například z USB Powerbanky, ale proč si nepostavit vlastní řešení s kvalitním LiPol akumulátorem? Celá konstrukce je jednoduchá. LiPol akumulátor je připojený k nabíjecímu modulu. Ten dále napájí zvyšující měnič, který vytváří napájecí napětí 5 V pro Arduino desku.

Arduino lampión - zálohovaný napájecí zdroj

Arduino lampion – zálohovaný napájecí zdroj

Arduino lampión - střeva (řídící PCB, zálohovaný zdroj, LED pásek)

Arduino lampion – střeva (řídící PCB, zálohovaný zdroj, LED pásek)

Vnitřek Arduino lampionu + aplikace pro Android

Vnitřek Arduino lampionu + aplikace pro Android

 

Součástky použité pro Arduino lampion

Svůj Arduino lampion můžete samozřejmě dále vylepšovat. Dalo by se připojit více LED pásků pro silnější vizuální efekt, udělat nové barevné funkce nebo například zkusit mezi sebou propojit více lampionů tak, aby barevně ladily a něco zobrazovaly. Fantazii se meze nekladou. Někdo nosí LED pásky i pod oblečením…

No představte si, kdybyste v noci ve městě potkali skupinu takovýchto barevných koulí. To by byla síla.

Tak možná ji jednou potkáte.

1. Arduino lampionový průvod. Jdete do toho, co říkáte?

Zbyněk Daněk

Zbyněk Daněk

Kreativní tvůrce pro Arduino platformu. Zaměření strojírenství a automatizace. Arduino je moje hobby!
Zbyněk Daněk

Latest posts by Zbyněk Daněk (see all)

One Comment on “Arduino lampion

davidhart
18.11.2017 at 22:27

Dobrý den, podrobnější návod na APP Invertor bych rozhodně uvítal. I když si stáhnu Váš případ, nějak přesně nevím, jak se tím „prokousat“. Každopádně děkuji za velmi lákavé téma.
P.S. V aplikaci máte překlep ve slově HORIZONTÁLNĚ

Napsat komentář