Informace z kurzů - arduino.praha12.net
Česká verze projektu - arduino.cz
Arduino obchod - arduino-shop.cz
Původní verze projektu - arduino.cc
Inspirace a nápady (krom vlastních) jsou převzaty z výše uvedených odkazů nebo případně z následných odkazů uvnitř uvedených. Jako zdroj informací v češtině doporučuji českou verzi projektu kde je většina základních informací přeložena a doplněna. Převážná většina modulů uvedených v příkladech je ke koupi v českém arduino shopu s dodáním do tří pracovních dnů, širší výběr modulů včetně popisu a knihoven je pak možné najít na stránkách původního projektu arduino.cc, alternativní klony originálů většinou kompatabilních prodává většina známých čínských eshopů kde jsou k dizpozici za zlomek ceny, bohužel dodání je v řádu nekolika tydnů...
Pro práci s fyzickým světem existuje spousta mikrokontrolérů a platforem. Parallax Basic Stamp, BX-24 od Netmedia, Phidgets, Handyboard od MIT a mnoho dalších s obdobnou funkčností. Všechny tyto nástroje zpracovávají nepřehledné detaily o programovaní mikrokontrolérů a upravují je do přehledné podoby. Oproti ostatním nástrojům Arduino rovněž zjednodušuje práci s mikrokontroléry, ale poskytuje následující výhody pro učitele, studenty či nadšené amatéry
Nejdříve nainstalujeme prostředí Arduino (IDE), které v průběhu instalace nainstaluje i USB ovladače podporovaných desek a modulů, návod například zde, pokud máme čínský klon je třeba jeste doinstalovat USB ovladač CH340 převodníku na sériový port (originál používá převodník FTDI), ke stažení například zde
Integrované vývojové prostředí (integrated development environment = IDE) je složeno z celé řady nástrojů, které nám při programování Arduina přijdou vhod. Nejvýraznějším prvkem je bílé okno s textovým editorem pro psaní kódu. Nalezneme zde také různé nabídky, například pro výběr typu Arduina, sériové linky, ke které je připojeno, nebo seznam ukázkových příkladů. Často používaným pomocníkem je také okno pro zobrazení zpráv ze sériové linky. Velmi přehledně zpracovaný popis zde.
Většina rozšiřujících modulů jako jsou LCD displeje, klávesnice, bezdrátové moduly, relé a různá čidla a senzory které jsou určeny pro použití s Arduino mají vytvořenu takzvanou 'knihovnu', jedná se komprimovanou složku ve které jsou potřebné informace pro začlenění do IDE a následného použití v našem scketch/programu.
Je programovací jazyk vytvořený pro programování mikrokontroléru bez specifických znalostí hardware. V současné době je nejznámější jako součást open-source platformy Arduino, kde má podobu frameworku v jazyce C. Wiring vznikl pro vývojový kit podobný Arduinu a vychází z dalšího open-source projektu.
Pro programování v jazyce Wiring se nejčastěji používá integrované vývojové prostředí Arduino IDE, k dispozici jsou ale i další vývojová prostředí (Arduino Eclipse plugin). Wiring vyžaduje mikrokontrolér se zaváděcím programem, typicky desku Arduino osazenou čipy ATmega. Prvotním autorem jazyka je Hernando Barragán, který ho definoval ve své diplomové práci na italském institutu IDII (Interaction Design Institute Ivrea) jako součát prototypovacích nástrojů pro elektroniku a programování.
Program se nazývá sketch a typicky má dvě hlavní části:
Většinou předchází krátký popis funkce programu, jako komentář následně definice konstant a vložené hlavičkové soubory použitých modulů aby bylo přehledně vidět na jednom místě co program používá a potřebuje.
Prvním programem pro začátečníky je blikání LED (light-emitting diode - dioda emitující světlo):
/*
Blink
Turns on an LED on for one second, then off for one second, repeatedly.
Most Arduinos have an on-board LED you can control. On the UNO, MEGA and ZERO
it is attached to digital pin 13, on MKR1000 on pin 6. LED_BUILTIN takes care
of use the correct LED pin whatever is the board used.
If you want to know what pin the on-board LED is connected to on your Arduino model, check
the Technical Specs of your board at https://www.arduino.cc/en/Main/Products
This example code is in the public domain.
*/
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
Pro pokročilejší programování Arduina se používá jazyk C++. Jeho kód se zapisuje běžným způsobem přímo do kódu ve Wiring, protože Arduino IDE používá překladač C.
Detailní popis jazyka WIRING včetně příkladů a manuálů nejběznějších desek a modulů najdete zde.
Dalším příkladem spojení dílčích periferií do jednoho funkčního celku je jednoduchý kódový zámek/alarm. Zapojení obsahuje tři periferie - klávesnici s 16ti tlačítky, LCD displej a piezo reproduktor, zadním správného 6-ti místného PINu se zámek odemkne (rozsvítí buildin-led), po opětovném zadání správného PINu zámek zamkne (zhasne build-in LED), PIN může obsahovat čísla 0-9 a písmena A-D. Stejné chování dostaneme i při zadávání znaků pomocí sériového portu.
'Sketch' používá dvě jednoduché knihovny Dimmer a KeyBoard, jsou použity pro zpřehlednění psaného kódu a nedělají nic komplikovaného, celý uvedený příklad by se dal ještě zpřehlednit použitím další knihovny například pro menu. Většinu knihoven nejen jako součást k nějakému hardware/modulu lze najit zde.
#include "LiquidCrystal.h"
#include "KeyBoard.h"
#include "Dimmer.h"
#define DOOR 13
const char empty[] = " ";
const char main[] = " ARDUINO-DOOR ";
const char mainmenu[] = "MAIN MENU: ";
const char doorclosed[] = "DOOR CLOSED ";
const char dooropened[] = "DOOR OPENED ";
const char retry[] = "fail, try again ";
const char pin[] = "ENTER PIN:______";
Dimmer dim(10);
LiquidCrystal lcd (12, 11, 5, 4, 3, 2);
KeyBoard kb(14, 15, 16, 17, 2, 3, 4, 5);
char menustate = 0;
char masterpin[] = "123456";
char userpin[] = "000000";
char enteredpin[] = "******";
int enteredchars = 0;
void setup() {
pinMode(DOOR, OUTPUT);
Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
analogWrite(9, 10); // set contrast VO (pwm)
lcd.begin(16, 2);
dim.on(128, 30000, 1200);
menu(0);
for (int i = 1200; i <= 1600; i += 200) {
tone(6, i, 20);
delay(25);
}
}
void loop() {
if (dim.available() > 0)
if (dim.dimming()) {
draw(empty, empty);
menustate = 0;
}
if (kb.available() > 0) {
dim.on(128, 10000, 600);
while (char key = kb.read()) {
tone(6, 1600, 20);
menu(key);
}
}
if (Serial.available() > 0) {
char key;
dim.on(128, 10000, 600);
while ((key = Serial.read()) != -1)
if ((key >= '0' && key <= '9') || (key >= 'A' && key <= 'D')) {
menustate = 1;
menu(key);
}
else if ( key == 0x0d || key == 0x0a ) {
tone(6, 1600, 20);
enteredchars = 0;
}
}
}
void menu(char key) {
switch (menustate) {
case 0:
draw(main, pin);
lcd.setCursor(10, 1);
enteredchars = 0;
menustate = 1;
break;
case 1:
case 3:
switch (key) {
case '#':
if (enteredchars == 0) {
draw(mainmenu, pin);
lcd.setCursor(10, 1);
menustate = 3;
}
break;
case '*':
draw(main, pin);
lcd.setCursor(10, 1);
enteredchars = 0;
break;
default:
enteredpin[enteredchars++] = key;
lcd.print('*');
if (enteredchars == 6) {
switch (menustate) {
case 1:
if (compare(enteredpin, masterpin, 6) || compare(enteredpin, userpin, 6)) {
changedoorstate();
menustate = 0;
}
else {
draw(retry, pin);
lcd.setCursor(10, 1);
}
break;
case 3:
if (compare(enteredpin, masterpin, 6)) {
draw(mainmenu, empty);
menustate = 4;
}
else {
draw(retry, pin);
lcd.setCursor(10, 1);
}
break;
}
delay(300);
enteredchars = 0;
}
}
break;
case 4:
break;
}
}
void changedoorstate () {
if (digitalRead(DOOR)) {
digitalWrite(DOOR, LOW);
draw(dooropened, empty);
Serial.println(dooropened);
}
else {
digitalWrite(DOOR, HIGH);
draw(doorclosed, empty);
Serial.println(doorclosed);
}
}
void draw(const char* line1, const char* line2) {
lcd.setCursor(0, 0);
lcd.print(line1);
lcd.setCursor(0, 1);
lcd.print(line2);
}
bool compare(char* a, char* b, int len) {
while (--len >= 0)
if (a[len] != b[len])
return ( false );
return true;
}
Zapojíme periferie podle obrázku, otestujeme samostatně funkci build-in led (předchozí příklad BLINK), následně piezo reproduktoru přidáme (příklad TONE), následně LCD a klávesnici, při stisku klávesy by se mělo ozvat z reproduktoru krátké pípnutí jako signál že byla klávesa stištěna, na LCD by se zobrazí * aby bylo viditelné kolik znaků je již zadáno, klávesa * zruší vše, klávesa # pokud jsme ještě nezačali zadávat PIN přejde do hlavního menu(není součástí předchozího programu). Po neaktivitě LCD zhasne a vrátí se na začátek, stiskem libovolné klávesy se rosvítí.
Činost celého kódu je dána nekonečným prováděním smyčky loop(), při každém průchodu (neměl by trvat více jak pár milisekund) se postupně otestuje zdali knihovna Dimmer nepotřebuje zavolat interní funkci pro stmívání LCD (provádí na základě uloženého časového razítka a počítá že je volána opakovaně, tím je dána i plynulost stmívání), dále se pomocí knihovny KeyBoard otestuje není-li stiknuta klávesa, pokud ano obslouží přijaté klávesy, stejně tak se sériovým portem, vše se do nekonečna rychle opakuje, tak že se z pohledu uživatele jeví jako jeden funkční celek, i když jsou jednotlivé kroky zpracovávany postupně. Kombinace událostí pak má následný vliv na proměnou menustate a enteredchars kde se podle příslušných kombinací vypisují na LCD udaje informující uživatele co právě dělá (zadávání PIN, otevření nebo zavření dveřního zámku apod.)