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.
Obsah článku:
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?
- 1. Arduino.cz Challenge – Dřevorubec - 3.4.2022
- Arduino Bluetooth RC auto - 21.3.2022
- Vytvořte si pro Arduino vlastní appku! - 24.7.2018
Stepan
15.10.2019 at 9:00Díky za návod, jen dva dotazy:
1) ten led pásek je k tišťáku připájen napevno nebo je tma nějaký konektor? případně jaký a kde ho objednat?
2) USB nabíječka k akumulátoru je potřebná k provozu nebo je jenom pro nabíjení akumulátoru? Tj. když ho budu nabíjet nabíječkou co jsem k němu dostal tak ji nepotřebuju. A stejně jako ten LED pásek – je připojenej do nějakého konektoru nebo připájenej napevno?
Zdesim
29.9.2018 at 10:38Autor si asi neuvědomil, že nabíjení akumulátoru Li-Pol nabíječku na Li-ion akumulátory nebude to pravé ořechové.
Oldřich Horáček
29.9.2018 at 10:50Dobrý den Zdeňku, v čem myslíte, že by měl nastat problém? Díky za odpověď.
Zdesim
5.10.2018 at 11:18Asi se nemá s Vámi cenu pouště do podrobnějších diskuzí. Jen mi je divné, že výrobci na celém světě dělají nabíječky pro LiPol akumulátory a jiné pro Li-ion akumulátory. Tím si myslím, že tam nějaký rozdíl asi bude. Ale jistě se najdou odborníci, kterým je tento nepodstatný rozdíl fuk.
Zbyněk Daněk
1.10.2018 at 9:04Li-pol a li- ion se liší v elektrolitu a rozdílnou krystalickou mřížkou uhlíkové anody. Na nabíjení tyto nepatrné rozdíly nemají téměř žádný vliv.
Zdesim
5.10.2018 at 11:19Asi se nemá s Vámi cenu pouště do podrobnějších diskuzí. Jen mi je divné, že výrobci na celém světě dělají nabíječky pro LiPol akumulátory a jiné pro Li-ion akumulátory. Tím si myslím, že tam nějaký rozdíl asi bude. Ale jistě se najdou odborníci, kterým je tento nepodstatný rozdíl fuk.
Leo
11.12.2017 at 8:06Ten APP Invertor vypadá zajímavě.
https://www.youtube.com/watch?v=Vdo8UdkgDD8
Jen widget přes to asi nejde?
Zbyněk Daněk
11.12.2017 at 9:57Ahoj Leo. Připravuji podrobný článek o tomto web IDE. Myslím že lze vytvářet pouze widgety, ale osobně jsem to zatím nezkoušel. Zaměřím se na to.
Leo
12.12.2017 at 10:36Jsem se na to dnes trochu víc zaměřil a bych řek že v záložce connectivity je to ubohé a pro lamy co to chtěj pro arduino – raspberry skoro nepoužitelné.
Na netu je par návodu jak s programem pracovat i v češtině.
Da se koupit i příručka přeložena do CZ
https://knihy.abz.cz/prodej/app-inventor-1
Mně by spíše jako fandu takovejch těch hračiček zajímalo, jak spustit na arduinu nějaký PHP skript. Jak přes to ovládat rasi přes ssh a podobné kravinky
Zbyněk Daněk
12.12.2017 at 10:43Ahoj. Webové rozhraní se teprve učím. Když v článcích pohledáš je tam „wifi loďička“ mohl by jsi tam najít co hledáš.
davidhart
18.11.2017 at 22:27Dobrý 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Ě
Zbyněk Daněk
11.12.2017 at 10:01Ahoj Davide. Podrobný návod připravuji. Dík za odhalení chyby opravím to.
Přihlásit se | info@hwkitchen.cz
Bastlírnu provozuje e-shop HWkitchen.cz 2014-2024