Funduino výukový multi shield je Arduino modul, který je velice vhodným shieldem pro Arduino začátečníky. Tento shield na sobě obsahuje velké množství součástek a konektorů a může tedy sloužit nejen jako výukový modul, ale také jako základ pro nejrůznější projekty. Obsahuje čtyři SMD LED diody, tři tlačítka, piezo sirénku, čtyřčíselný segmentový displej s ovládacím obvodem 74HC595 a víceotáčkový trimr. A co se týká dalších konektorů, tak se na shieldu nachází konektor pro připojení infračerveného přijímače, teploměru LM35 nebo DS18B20, konektor pro komunikační moduly jako například Bluetooth a také čtyři konektory pro připojení servomotorů. Seznam všech propojovacích pinů je uveden na konci návodu v přehledné tabulce.

Funduino výukový multi shield

Pro úspěšné propojení Funduino výukového multi shieldu stačí zapojit shield na Arduino desku. Mezi podporované patří všechny Arduino desky, ale velikost shieldu odpovídá hlavně deskám formátu UNO, Leonardo a podobně.

Schéma zapojení Funduino výukového multi shieldu

Ukázkový kód obsahuje na svém začátku nastavení propojovacích pinů pro všechny součástky na shieldu. Jsou zde tedy piny pro segmentový displej, trimr, LED diody, tlačítka a sirénku. Současně se zde nachází také definování stavů pro zjednodušení detekce zapnutí a vypnutí. Jde totiž o to, že na tomto shieldu jsou tlačítka a LED diody ovládány opačnou logikou, tedy logická nula rozsvítí diodu a opačně. My ale po definování a používání stavů ON/OFF můžeme zjednodušit psaní pro začátečníky. Jako další je zde vytvořena proměnná pro počítadlo stisku tlačítek a také mapa čísel pro segmentový displej společně s mapou číslic na segmentovém displeji, abychom mohli vypisovat čísla 0 až 9 na všech čtyřech číslicích displeje. V podprogramu setup nastavíme postupně všechny výstupní piny a také provedeme vypnutí LED diod a sirénky. V nekonečné smyčce loop si můžeme všimnout oddělených sekcí pro jednotlivé součástky. Jako první je zde práce se segmentovým displejem a trimrem, kde v prvním kroku načteme hodnotu z analogového pinu do nově vytvořené proměnné. Tuto hodnotu v dalším kroku zapíšeme na segmentový displej pomocí podprogramu zapisCisloNaSegment, kde jako první argument uvedeme číslici na displeji a jako druhý vypisované číslo. Je tedy nutné získat všechny čtyři číslice pomocí přepočtu, který je uveden v programu a je v něm využito dělení a zbytek po dělení. Další sekcí je obsluha tlačítek, LED diod a sirénky. Prvním krokem je opět načtení stavu všech tlačítek do nově vytvořených proměnných. Dále si zkontrolujeme jako první stisk prvního tlačítka. Pokud je toto tlačítko stisknuto, přičteme jedničku do počítadla a pokud by počítadlo přeteklo přes hodnotu 15, tak ho nastavíme na 15. Toto chování je zvoleno z toho důvodu, že v dalším kroku rozsvítíme LED diody podle binárního tvaru počítadla. A jelikož lze na čtyřech LED diodách dosáhnout maximálně čísla 15, tak proto je tak počítadlo omezeno. Po nastavení svitu LED diod, pro které je použita funkce bitRead, už následuje jen pauza 200 milisekund pro plynulejší přičítání do počítadla. Jako další se v programu nachází kontrola stisku druhého tlačítka, která je shodná s první tlačítkem, pouze je zde změna na odčítání jedničky z počítadla a kontrola na podtečení pod nulu. Na konci nekonečné smyčky se nachází kontrola stisku třetího tlačítka. Pokud je toto tlačítko stisknuto, tak je vytvořena proměnná s uložením hraného tónu, který v základu hraje na frekvenci 440 Hz, tedy komorní A. Avšak tento tón lze měnit, respektive zvyšovat jeho frekvenci, protože do výpočtu je přičteno také počítadlo vynásobené číslem 100. Po vypočtení tónu je tedy zahrán tento tón na sirénce po dobu 20 milisekund. Pod nekonečnou smyčkou už se nachází pouze podprogram zapisCisloNaSegment pro zápis čísla na zadaný segment.

// Arduino Multifunkční shield
#include <Arduino.h>
// nastavení propojovacích pinů pro segmentový displej
#define pinLatch 4
#define pinClk 7
#define pinData 8
// nastavení propojovacích pinů pro trimr
#define trimr A0
// nastavení propojovacích pinů pro LED diody
const byte LED[] = {13, 12, 11, 10};
// nastavení propojovacích pinů pro tlačítka
#define tlacitkoA1 A1
#define tlacitkoA2 A2
#define tlacitkoA3 A3
// nastavení propojovacích pinů pro sirénku
#define pinSirenka 3
// definování stavů pro vypnutí a zapnutí
#define ON  LOW
#define OFF HIGH

// proměnná pro počítadlo stisku tlačítek
int pocitadlo = 0;
// mapa čísel pro segmentový displej - čísla 0 až 9
const byte mapaSegment[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0X80, 0X90};
// mapa číslic na segmentovém displeji
const byte mapaCisloSeg[] = {0xF1, 0xF2, 0xF4, 0xF8};
void setup () {
  // nastavení propojovacích pinů pro
  // segmentový displej, LED diody
  // a sirénku jako výstup
  pinMode(pinLatch, OUTPUT);
  pinMode(pinClk, OUTPUT);
  pinMode(pinData, OUTPUT);
  pinMode(LED[0], OUTPUT);
  pinMode(LED[1], OUTPUT);
  pinMode(LED[2], OUTPUT);
  pinMode(LED[3], OUTPUT);
  pinMode(pinSirenka, OUTPUT);
  // vypnutí všech LED diod
  digitalWrite(LED[0], OFF);
  digitalWrite(LED[1], OFF);
  digitalWrite(LED[2], OFF);
  digitalWrite(LED[3], OFF);

  /* dvě možnosti pro vypnutí sirénka*/
  digitalWrite(pinSirenka, HIGH); //vypnutí sirénky (obrácená logika)

  noTone(pinSirenka);   //vypnutí sirénky pomocí PWM
}
void loop() {
  /* práce se segmentovým displejem a trimrem */
  // vytvoření proměnné pro načtení analogového vstupu z trimru
  int analogTrimr = analogRead(trimr);
  // zapsání analogové hodnoty na segmentový displej,
  // zápis je po číslech - tisícovky, stovky, ..
  zapisCisloNaSegment(0 , analogTrimr / 1000);
  zapisCisloNaSegment(1 , (analogTrimr / 100) % 10);
  zapisCisloNaSegment(2 , (analogTrimr / 10) % 10);
  zapisCisloNaSegment(3 , analogTrimr % 10);
  /* obsluha tlačítek, LED diod a sirénky */
  // načtení stavu tlačítek do proměnných
  bool tlac1 = digitalRead(tlacitkoA1);
  bool tlac2 = digitalRead(tlacitkoA2);
  bool tlac3 = digitalRead(tlacitkoA3);
  // pokud je stisknuto první tlačítko, přičteme jedničku
  // do počítadla a zobrazíme na LED diodách v binárním tvaru
  if (tlac1 == ON) {
    pocitadlo++;
    // na 4 LED diody lze vypsat maximálně číslo 15 v bin. tvaru
    if (pocitadlo > 15) {
      pocitadlo = 15;
    }
    // zápis pomocí funkce bitRead(proměnná, pozice bitu)
    // nutné znegovat pomocí ! - opačná logika zapínání LED diod
    digitalWrite(LED[0], !(bitRead(pocitadlo, 0)));
    digitalWrite(LED[1], !(bitRead(pocitadlo, 1)));
    digitalWrite(LED[2], !(bitRead(pocitadlo, 2)));
    digitalWrite(LED[3], !(bitRead(pocitadlo, 3)));
    digitalWrite(pinSirenka, HIGH); //vypnutí sirénky
    // pauza pro plynulejší přičítaní mezi stisky tlačítek
    delay(200);
  }
  // pokud je stisknuto druhé tlačítko, odečteme jedničku
  // z počítadla, zbytek je stejný jako u tlačítka 1
  if (tlac2 == ON) {
    pocitadlo--;
    if (pocitadlo < 0) {
      pocitadlo = 0;
    }
    digitalWrite(LED[0], !(bitRead(pocitadlo, 0)));
    digitalWrite(LED[1], !(bitRead(pocitadlo, 1)));
    digitalWrite(LED[2], !(bitRead(pocitadlo, 2)));
    digitalWrite(LED[3], !(bitRead(pocitadlo, 3)));
    digitalWrite(pinSirenka, LOW); //zapnutí sirénky
    delay(200);
  }
  // pokud je stisknuto třetí tlačítko, zahrajeme tón
  if (tlac3 == ON) {

    int ton = 440 + (analogTrimr); //tón se mění podle hodnotu trimru

    tone(pinSirenka, ton, 20); //zapnutí sirénky o určitém tónu (pomocí PWM)
  }
}
// podprogram pro zápis čísla na zadaný segment
void zapisCisloNaSegment(byte segment, byte hodnota) {
  digitalWrite(pinLatch, LOW);
  shiftOut(pinData, pinClk, MSBFIRST, mapaSegment[hodnota]);
  shiftOut(pinData, pinClk, MSBFIRST, mapaCisloSeg[segment] );
  digitalWrite(pinLatch, HIGH);
}

Po nahrání ukázkového kódu do Arduino desky s Funduino multi shieldem dostaneme například tento výsledek:

Funduino výukový multi shield pro Arduino je zajímavou volbou jak pro domácí, tak i pro školní účely. Může totiž sloužit i jako základ pro větší projekty, kdy můžeme využít například displej pro zobrazení teplot z připojeného teplotního čidla nebo přidat i tlačítka, připojit na servo konektory spínací relé a vytvořit si vlastní Arduino termostat. Ještě bych rád zmínil jednu věc a to je umístění displeje. Na své Arduino Duemilanove desce se mi totiž stalo, že se mi některé segmenty displeje špatně spínaly a bylo to způsobeno zkratem některých pinů vespod desky USB konektorem. Stačilo tedy odizolovat USB konektor od shieldu a problémy zmizely.

 

ZařízeníČíslo Arduino pinu
4 červené LED diody 10, 11, 12, 13
3 tlačítka A1, A2, A3
Trimr (10 kOhm) A0
4-číselný 7-segmentový LED displej řízený 74HC595 Latch 4, Clock 7, Data 8
Buzzer/sirénka 3
Konektor pro IR senzor 2
Konektor pro teploměr LM35 nebo DS18B20 A4
Konektor pro komunikační senzory GND, +5v, 0, 1 (rx/tx)
Konektor pro serva - řídící piny 5, 6, 9, A5

Seznam použitých komponent:

http://dratek.cz/arduino/1511-original-arduino-uno-rev3-1485165418.html

http://dratek.cz/arduino/1203-funduino-vyukovy-multi-shield-do-skol-1456079896.html

FB tw

Další podobné články