Operácie

Blikajúca vežička pre mačky: Rozdiel medzi revíziami

Zo stránky SensorWiki

StudentDTV (diskusia | príspevky)
StudentDTV (diskusia | príspevky)
 
(17 medziľahlých úprav od rovnakého používateľa nie je zobrazených.)
Riadok 1: Riadok 1:
{|
{|
|Autor:      || '''Viktor Lučkanič'''  
|Autor:      || '''Monika Bírová'''  
|-
|-
|Študijný odbor:  || Robotika a kybernetika || 3. Bc.  ('''2019''')  
|Študijný odbor:  || Jadrové a fyzikálne inžinierstvo || 3. Bc.  ('''2019''')  
|}
|}


Riadok 28: Riadok 28:


''Postup výroby:''
''Postup výroby:''
* ako prvé si na laseri vyrežeme kusy z preglejky (pre každý senzor obdĺžnik 5 x 10 cm, kruh spriemerom 7 cm a dve kúsky 2.5 x 1 cm) na zostavenie váhového senzoru a zlepíme ich dokopy ako vidíme na obrázku:
* základnom je nosná konštrukcia - "vežička", ja som použila 3D, tlač, ale bolo by ju možné skonštruovať aj z vyrezanej preglejky


* napájkujeme kábliky z váhového senzora na prevodník HX711
* servomotorčeky zložíme spolu s jednotlivými vytlačenými časťami


* podľa schémy v časti "Popis riešenia" zapojíme Arduino Nano a všetky periférie do nepájivého kontaktného poľa
* na základe schémy v časti "Popis riešenia" zapojíme Arduino Nano a všetky periférie do nepájivého kontaktného poľa


* na 3D tlačiarni vytlačíme model, na ktorý následne nanesieme tmel a nastriekame farbou
* modul s diódou prilepíme pomocou (napríklad) tavnej pištole ku konštrukcii vežičky


* váhové senzory prilepíme do vnútra modelu, aby ich snímače boli približne v strede nosných plôch. Taktiež prilepíme aj kontaktné pole so zvyšnou elektronikou
* do Arduina nahráme kód


* na snímače nalepíme nosné plochy modelu (je treba vypodložkovať ich, aby sme dosiahli potrebnú výšku)
* aby bolo zariadenie pripravené na použitie, pomocou potenciometrov a stlačením tlačidla uvedieme zariadenie do "kalibračného módu" - určíme mu plochu, v ktorej bude svietiť


* led pásik nalepíme po obvode miesta na pohár
* počas jeho prevádzky je možné vykonávať priebežne kalibráciu (v predchádzajúcom bode)


* v tejto fáze nakalibrujeme oba snímače podľa návodu


* do Arduina nahráme kód (s nakalibrovanými hodnotami)
[http://www.example.com link title]
[[Súbor:MojObrazok2.jpg|center|300px]]
[[Médiá:MojZdrojak.c]]


* Ako to má vyzerať v praxi:  https://www.youtube.com/watch?v=hHIrxL0giJQ#action=share


'''Použité zdroje:'''  
'''Použité zdroje:'''  


* Zdroj kódu a návod kalibrácie:  https://www.youtube.com/watch?v=nGUpzwEa4vg
* Zdroj pôvodného kódu a nápadu:  https://github.com/LucasBerbesson/Laser-cat


* Zdroj objektu na 3D tlač (koštrukcia vežičky):  https://www.thingiverse.com/thing:107957


__TOC__
__TOC__
Riadok 64: Riadok 56:
== Analýza ==
== Analýza ==


V tejto časti popíšete ako idete daný problém riešiť. Uvediete sem aj všetky potrebné technické údaje,
ktoré sú potrebné na úspešné vyriešenie projektu. Napríklad:


* popis komunikačnej zbernice (i2c, 1-wire, RS-232 a pod.)
* zlúčila som pôvodný zdrojový kód z webu s kódom na kalibráciu rozsahu, zariadenie sa prepína pomocou tlačidla
* obrázok zapojenia vývodov použitej súčiastky
* odkaz na katalógový list
* priebehy dôležitých signálov
* este jedna polozka


* pôvodné zapojenie iba so servo motorčekmi a led-diódou som rozšírila o potenciometre a tlačidlo (na zjednodušené uvedenie do kalibračného módu)


== Popis riešenia ==
== Popis riešenia ==


Ako hlavný riadiaci prvok bolo použité Arduino Nano, na ktoré boli pripojené ďalšie periférie. Boli použité 2 váhové senzory spolu s dvoma prevodníkmi, ktoré zabrali na Arduine každé po 2 digitálne piny. Ďalej bola pripojená jedna sirénka na jeden digitálny pin a taktiež RGB led pásik so samostatne adresovateľnými ledkami s jedným dátovým vstupom.
Základnou súčiastkou vežičky je okrem samotnej konštrukcie aj Arduino Nano, na ktoré pripojené všetky ostatné periférne moduly. Na samotné Arduino sa cez analógové výstupy pripájajú 2 servomotory a stredné piny potenciometrov. Na napájacie konektory (5V a zem) sa pripájajú servomotorčeky, potenciometre a dióda. Sériové (aby sa predišlo skratu) spojenie tlačidla a rezistora a Arduina je cez jeho digitálne vstupy. Konkrétne čísla vstupov sú uvedené v zdrojovom kóde a nasledujúcich schémach:
 
Sem opíšete ako konkrétne ste problém vyriešili. Začnite popisom pripojenia k procesoru
(nezabudnite na schému zapojenia!) a zdôraznite ktoré jeho periférie ste pritom využili.  


'''Schéma zapojenia Arduina s perifériami'''
'''Schéma zapojenia Arduina s perifériami'''
[[Súbor:obvodLoadCell.png|center|900px]]
[[Súbor:fritzling-schema1.png|center|900px]]
 
[[Súbor:Example.jpg]]
 
Pozn.: Názov obrázku musí byť jedinečný, uvedomte si, že Obr1.jpg už pred vami skúsilo
nahrať už aspoň 10 študentov.


[[Súbor:MojObrazok.jpg|center|250px]]
[[Súbor:fritzling-schema2.png|center|900px]]


=== Algoritmus a program ===
=== Algoritmus a program ===


Program bol vytvorený v prostredí Arduino IDE 1.8.8. Ako základ bol použitý kód s návodom na kalibráciu váhového senzoru uvedený v zdrojoch ako ''Zdroj kódu''. Celý program sa skladá z 3 zdrojových súborov (dve pôvodné a jeden mnou upravený a doplnený). Mnou písaný súbor je LoadCell.ino.
Program bol vytvorený v prostredí Arduino IDE 1.8.9. Ako základ bol použitý pôvodný zdrojový kód z webu (uvedený v zdrojoch).


'''Algoritmus'''
'''Algoritmus'''
* vo funkcii setup() je nastavený výstupný pin pre led pásik a pre sirénku
* vo funkcii setup() inicializujeme pripojenie periférií na jednotlivé piny a servomotorčeky uvedieme do počiatočnej polohy (do stredu)
* vo funkcii loop() sa pravidelne kontroluje váha na daných senzoroch a podľa toho sa ledky rozsvietia želanou farbou podľa podmienok nasledovne:
* vo funkcii loop() je podmienka, ktorá rozdeľuje činnosť na dva módy na základe stlačenia tlačidla: pri stlačení prebieha čítanie vstupov z potenciometrov, ktoré určujú maximálny rozsah plochy, ak nie je stlačené tlačidlo, zariadenie prechádza do módu, v ktorom vykonáva náhodne pohyb (náhodne vygenerované súradnice vrámci rozsahu určeného potenciometrami)
** ak je na senzore mobilu prítomný mobil a na senzore pohára je pohár rozsvietia sa na zeleno
* pohyb motorčeka je ošetrený tak, aby pri vygenerovaní súradníc príliš blízko súčasných bol vykonaný pohyb aspoň o 5 krokov
** ak na senzore mobilu nie je prítomný mobil a na senzore pohára je pohár ledky blikajú na červeno a sirénka vydáva pipanie.
** ak na senzore pohára nie je nič tak ledky svietia na modro   
 
Uveďte stručný popis algoritmu, v akom jazyku a verzii vývojového prostredia ste ho vytvorili.
Je vhodné nakresliť aspoň hrubú štruktúru programu napríklad vo forme vývojového diagramu.
Rozsiahly program pre lepšiu prehľadnosť rozdeľte do viacerých súborov.
 
Vyberte podstatné časti zdrojového kódu, použite na to prostredie ''source'':
 
<source lang="c">
#define FASTLED_INTERRUPT_RETRY_COUNT 0
#define FASTLED_ESP8266_RAW_PIN_ORDER
 
#include "HX711.h"
#include <FastLED.h>
 
#define NUM_LEDS 8
 
HX711 cellM(9, 10); //DT,SCK  //senzor pre mobil
HX711 cellP(4, 5); //DT,SCK    //senzor pre pohar
CRGB leds[8];
const int ledPin = 7;
const int sirenPin = 12;
const int mobil = 80;
const int pohar = 15;
const int rychlost = 4;
const int krok = 1;
 
//long val=0;
long valM = 0;
long valP = 0;
float count = 0;
float vahaM = 0;
float vahaP = 0;
 
 
void setup() {
 
  Serial.begin(9600);
  FastLED.addLeds<WS2812B, ledPin, RGB>(leds, NUM_LEDS);
 
  pinMode(sirenPin, OUTPUT);
}
 
 
void loop() {
 
  char farba ;
  int pocetCImp = 0;
 
  while (1) {
 
    count = count + 1;
 
    //vyrazy na kalibraciu vahovych senzorov
    //val = ((count-1)/count) * val    +  (1/count) * cellP.read();  // dlhodoby priemer
    //val = 0.8 * val    +  0.2 * cell.read();                      // kratkodoby priemer
    valM = cellM.read(); // most recent reading
    valP = cellP.read(); // most recent reading
 
    //vypocet aktualnej vahy na senzoroch v [g]
    vahaM = ((valM - 8572579) / 31748.0f) * 32.6;
    vahaP = ((valP - 8230240) / 33190.0f) * 32.6;
    Serial.print("Mobil:  ");
    Serial.print(vahaM);
    Serial.print(" [g] \t\t");
    Serial.print("Pohar: ");
    Serial.print(vahaP);
    Serial.println(" [g]");
 
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
 
    // situacia ked je tam mobil a aj pohar
    if (vahaM > mobil && vahaP > pohar) {      //ZELENA ZIADANA
 
      if (farba != 'z') {
 
        if (farba == 'm') {
          for (int j = 255; j >= 0; j -= krok) {
            for (int i = 0; i < NUM_LEDS; i++) {
              leds[i] = CRGB(0, 0, j);        //MODRA stmievanie                  //GRB
            }
 
            FastLED.show();
            delay(rychlost);
          }
        }
 
 
        for (int j = 0; j <= 255; j += krok) {
          for (int i = 0; i < NUM_LEDS; i++) {
            leds[i] = CRGB(j, 0, 0);      //ZELENA rozsvecovanie                  //GRB
          }
 
          FastLED.show();
          delay(rychlost);
        }
      }
      farba = 'z';
 
      //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
    // situacia ked mobil nie je na mieste a pohar je
    } else if (vahaP > pohar && vahaM < mobil) {        //CERVENA ZIADANA
 
      pocetCImp = 0;
 
      if (farba != 'c') {
        for (int j = 255; j >= 0; j -= krok) {
          for (int i = 0; i < NUM_LEDS; i++) {
            if (farba == 'm') {
             
              leds[i] = CRGB(0, 0, j);      //MODRA stmievanie                  //GRB
            }
            else if (farba == 'z') {
 
              leds[i] = CRGB(j, 0, 0);      //ZELENA stmievanie                  //GRB
            }
          }
 
          FastLED.show();
          delay(rychlost);
        }
 
        // blikanie cervenej
        while (1) {  //cervena
 
          if (pocetCImp > 1) {
            siren();
          }
 
          for (int j = 0; j <= 255; j += krok) {
            for (int i = 0; i < NUM_LEDS; i++) {
              leds[i] = CRGB(0, j, 0);      //CERVENA rozsvecovanie
            }
 
            FastLED.show();
            delay(rychlost);
          }
 
 
          if (pocetCImp > 1) {
            siren();
          }
 
          for (int j = 255; j >= 0; j -= krok) {
            for (int i = 0; i < NUM_LEDS; i++) {
              leds[i] = CRGB(0, j, 0);      //CERVENA stmievanie
            }
 
            FastLED.show();
            delay(rychlost);
          }
 
          pocetCImp++;
 
          // kontrola vahy pre vyskocenie z cyklu blikania cervenej
          valM = cellM.read(); // most recent reading
          valP = cellP.read(); // most recent reading
          vahaM = ((valM - 8572579) / 31748.0f) * 32.6;
          vahaP = ((valP - 8230240) / 33190.0f) * 32.6;
          Serial.print("Mobil:  ");
          Serial.print(vahaM);
          Serial.print(" [g] \t\t");
          Serial.print("Pohar:  ");
          Serial.print(vahaP);
          Serial.println(" [g]");
 
          if (vahaM > mobil || vahaP < pohar) {
            break;
          }
        }
 
        pocetCImp = 0;
        farba = 'c';
      }
 
      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
    // situacia ked pohar nie je pritomny, na mobile nezalezi
    } else {                //MODRA ZIADANA
 
      if (farba != 'm') {
        if (farba == 'z') {
          for (int j = 255; j >= 0; j -= krok) {
            for (int i = 0; i < NUM_LEDS; i++) {
              leds[i] = CRGB(j, 0, 0);      //ZELENA stmievanie                  //GRB
            }
 
            FastLED.show();
            delay(rychlost);
          }
        }
 
        for (int j = 0; j <= 255; j += krok) {
          for (int i = 0; i < NUM_LEDS; i++) {
            leds[i] = CRGB(0, 0, j);      //MODRA rozsvecovanie                      //GRB
          }
 
          FastLED.show();
          delay(rychlost);
        }
 
        farba = 'm';
      }
    }
  }
}
 
 
//funkcia pipania sireny
void siren() {
 
  digitalWrite(sirenPin, HIGH);
  delay(50);
  digitalWrite(sirenPin, LOW);
  delay(50);
  digitalWrite(sirenPin, HIGH);
  delay(50);
  digitalWrite(sirenPin, LOW);
 
}
</source>
 
Nezabudnite však nahrať aj kompletné zdrojové kódy vášho programu!
 
Zdrojový kód: [[Médiá:Serial.h|serial.h]] a [[Médiá:Pip.c|main.c]]


[[Médiá:MojProgram.c|program.c]]


Zdrojový kód: [[Médiá:cat_lazertower.ino]]


=== Výsledok ===
=== Výsledok ===


Nezabudnite zdokumentovať výsledok vašej práce. Určite sem patria fotografie, video
Skonštruované zariadenie funguje podľa očakávaní. Počas testovania bola zistená nestabilita kódu pri nastavení širokých hraníc na potenciometroch (v čase odovzdania práce nevyriešené). Implementácia tlačidla potenciálne umožňuje prepínať zariadenie aj do iných režimov, ktoré je potrebné naprogramovať dodatočne. Keďže je zariadenie určené pre zviera, je potrebné ho chrániť pred mechanickým poškodením (riešenie napríklad navrhnutím vhodného krytu), čomu som sa nevenovala.
a zhodnotenie ako ste spokojní s výsledkom,
'''Fotografia zhotoveného projektu:'''


Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.
[[Súbor:mb_lasertower_20190610_174510.jpg|center|900px]]




[[Category:DTV2019]]
[[Category:DTV2019]]

Aktuálna revízia z 18:22, 11. jún 2019

Autor: Monika Bírová
Študijný odbor: Jadrové a fyzikálne inžinierstvo 3. Bc. (2019)

Opis projektu

Ako záverečný projekt predmetu DTV som si zvolila blikajúcu vežičku pre mačky - zariadenie, ktoré svieti svetlom na náhodné miesta v určenom plošnom rozsahu.

Prečo?

Nakoľko je moje zameranie štúdia vzdialené robotike, rozhodla som sa pre menej náročný projekt. Zadanie požadovalo využitie niektorej z technológií (3D tlač, laser, ..), ktoré sme si počas semestra vyskúšali a zakomponovanie modulu Arduino v našom výslednom zariadení. Keďže máme doma neposednú mačku vyžadujúcu veľa času na hranie, a vieme, že mačky rady naháňajú blikajúce svetielko, tak bola moja voľba jasná.

Ako ?

Na výrobu modelu budeme potrebovať nasledujúce komponenty:

  1. vytlačenú 3D konštrukciu zloženú z viacerých častí
  2. Arduino Nano
  3. servo motorčeky Micro Servo 9g Tower Pro
  4. predpripravené káble na prepájanie
  5. potenciometre
  6. modul s diódou emitujúcou laserové svetlo
  7. tlačidlo
  8. rezistor 10k
  9. nepájivé kontaktné pole
  10. USB mini kábel na napájanie

Postup výroby:

  • základnom je nosná konštrukcia - "vežička", ja som použila 3D, tlač, ale bolo by ju možné skonštruovať aj z vyrezanej preglejky
  • servomotorčeky zložíme spolu s jednotlivými vytlačenými časťami
  • na základe schémy v časti "Popis riešenia" zapojíme Arduino Nano a všetky periférie do nepájivého kontaktného poľa
  • modul s diódou prilepíme pomocou (napríklad) tavnej pištole ku konštrukcii vežičky
  • do Arduina nahráme kód
  • aby bolo zariadenie pripravené na použitie, pomocou potenciometrov a stlačením tlačidla uvedieme zariadenie do "kalibračného módu" - určíme mu plochu, v ktorej bude svietiť
  • počas jeho prevádzky je možné vykonávať priebežne kalibráciu (v predchádzajúcom bode)


Použité zdroje:

Analýza

  • zlúčila som pôvodný zdrojový kód z webu s kódom na kalibráciu rozsahu, zariadenie sa prepína pomocou tlačidla
  • pôvodné zapojenie iba so servo motorčekmi a led-diódou som rozšírila o potenciometre a tlačidlo (na zjednodušené uvedenie do kalibračného módu)

Popis riešenia

Základnou súčiastkou vežičky je okrem samotnej konštrukcie aj Arduino Nano, na ktoré sú pripojené všetky ostatné periférne moduly. Na samotné Arduino sa cez analógové výstupy pripájajú 2 servomotory a stredné piny potenciometrov. Na napájacie konektory (5V a zem) sa pripájajú servomotorčeky, potenciometre a dióda. Sériové (aby sa predišlo skratu) spojenie tlačidla a rezistora a Arduina je cez jeho digitálne vstupy. Konkrétne čísla vstupov sú uvedené v zdrojovom kóde a nasledujúcich schémach:

Schéma zapojenia Arduina s perifériami

Algoritmus a program

Program bol vytvorený v prostredí Arduino IDE 1.8.9. Ako základ bol použitý pôvodný zdrojový kód z webu (uvedený v zdrojoch).

Algoritmus

  • vo funkcii setup() inicializujeme pripojenie periférií na jednotlivé piny a servomotorčeky uvedieme do počiatočnej polohy (do stredu)
  • vo funkcii loop() je podmienka, ktorá rozdeľuje činnosť na dva módy na základe stlačenia tlačidla: pri stlačení prebieha čítanie vstupov z potenciometrov, ktoré určujú maximálny rozsah plochy, ak nie je stlačené tlačidlo, zariadenie prechádza do módu, v ktorom vykonáva náhodne pohyb (náhodne vygenerované súradnice vrámci rozsahu určeného potenciometrami)
  • pohyb motorčeka je ošetrený tak, aby pri vygenerovaní súradníc príliš blízko súčasných bol vykonaný pohyb aspoň o 5 krokov


Zdrojový kód: Médiá:cat_lazertower.ino

Výsledok

Skonštruované zariadenie funguje podľa očakávaní. Počas testovania bola zistená nestabilita kódu pri nastavení širokých hraníc na potenciometroch (v čase odovzdania práce nevyriešené). Implementácia tlačidla potenciálne umožňuje prepínať zariadenie aj do iných režimov, ktoré je potrebné naprogramovať dodatočne. Keďže je zariadenie určené pre zviera, je potrebné ho chrániť pred mechanickým poškodením (riešenie napríklad navrhnutím vhodného krytu), čomu som sa nevenovala.

Fotografia zhotoveného projektu: