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.
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ě.
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