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
Grafická část skládání bloků kódu
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.
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í.
Na následujícím obrázku vidíme pokusné zapojení pro zkoušení funkčnosti.
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í.
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.
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.
Součástky použité pro Arduino lampion
- Arduino deska Arduino NANO
- Bluetooth modul HC-05 pro komunikaci s mobilním telefonem
- RGB NeoPixel LED pásek – délka 0,5 m
- Snímač zvuku s vysokou citlivostí pro vytvoření barevné hudby
- Kontaktní pole s propojovacími drátky pro vytvoření prototypu
- Univerzální plošný spoj pro finální řešení lampionu
- Akumulátor LiPol 3,7 V 1800 mAh pro provoz lampionu bez připojení k externímu napájení
- USB nabíječka LiPol s ochranou pro nabíjení akumulátoru
- Měnič napětí z 0,9 V na 5 V USB – zajišťuje výrobu napětí 5 V pro napájení Arduina
- Stínidlo REGOLIT z IKEA
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?