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

12 Comments on “Arduino lampion

Stepan
15.10.2019 at 9:00

Dí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:38

Autor 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:50

Dobrý den Zdeňku, v čem myslíte, že by měl nastat problém? Díky za odpověď.

Zdesim
5.10.2018 at 11:18

Asi 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:04

Li-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:19

Asi 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:06

Ten 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:57

Ahoj 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:36

Jsem 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:43

Ahoj. 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: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Ě

Zbyněk Daněk
11.12.2017 at 10:01

Ahoj Davide. Podrobný návod připravuji. Dík za odhalení chyby opravím to.

Napsat komentář