====== Arduino näited ======
/*
Palun täida koolituse lõpus ka
[[https://docs.google.com/spreadsheet/viewform?usp=drive_web&formkey=dDZ3QVNmU0E2WkhRNWdzekhCRTl5dEE6MQ#gid=0|tagasiside]].
{{:koolitused:i_p_arduino_koolirobootikas_2015.pdf|Koolitusmaterjal - Loeng}}
English:
{{:koolitused:c_robotics.pdf|Robotics and Didactics}} {{:koolitused:c2_arduino.pdf|Arduino programming}}
*/
====== Viited ======
[[http://itead-europe.com/pm/platform/shield/1602%20lcd%20shield/SCH_IM120417018_Arduino1602LCDShield.pdf|LCD Shield datasheet]]\\
[[http://www.sharpsma.com/webfm_send/1489|Sharp 10-80cm analoog andur]]
====== Näide 1 Digitaalsed I/O ======
===== Näide 1.1 Nupule vajutades süttib LED =====
/*
Nimetus: Näide #1.1 Digitaalsed sisend-väljundid
Kirjeldus: Programm demonstreerib nupu ja LED-i kasutamist
Autor: Raivo Sell
Kuupäev: 15.01.2013
*/
// Konstandid
const int nupp = A0; // Viik kuhu on ühendatud nupp
const int LED = 13; // Viik kuhu on ühendatud nupp roheline LED
// Globaalsed muutujad
int NupuOlek = 0; // Nupu oleku muutuja
void setup() {
pinMode(LED, OUTPUT); // algväärtustame LED viigu väljundiks
pinMode(nupp, INPUT); // algväärtustame nupu viigu sisendiks
digitalWrite(nupp, HIGH); // lülitame sisemised pullup takistid sisse
}
void loop(){
NupuOlek = digitalRead(nupp); // salvestame muutujasse nupu hetke väärtuse
if (NupuOlek == LOW) { // Kui nupu on alla vajutatud
digitalWrite(LED, HIGH); // süütame LED-i
}
else { // vastasel juhul
digitalWrite(LED, LOW); // kustutame LED-i
}
}
===== Näide 1.2 Nupule vajutades süttib LED 1 sekundiks =====
// Algus identne näitega #1.1
void loop(){
if (digitalRead(nupp) == LOW) { // Kui nupu olek on madal
digitalWrite(LED, HIGH); // süütame LED-i
delay(1000); // ootame 1 sekundi (1000 millisekundit)
}
digitalWrite(LED, LOW); // kustutame LED-i
}
===== Näide 1.3 LED süttib nupu vabastamisel =====
// Algus identne näitega #1.1
void loop(){
if (digitalRead(nupp) == LOW) { // Nupule vajutus
while (digitalRead(nupp) == LOW){} // Ootame nupu lahtilaskmist
digitalWrite(LED, HIGH); // süütame LED-i
}
}
===== Harjutus #1.1 =====
Modifitseerida näiteprogrammi nii, et nupule vajutades vilgub LED (LCD laiendusplaadi korral võib kasutada taustavalguse LED-e) kolm korda.
===== Harjutus #1.2 =====
Modifitseerida näiteprogrammi nii, et nupule vajutades hakkab LED konstantselt vilkuma 1 sekundilise intervalliga ja teine nupule vajutus katkestab vilkumise.
====== Näide #2 Analoog sisendid ======
===== Näide #2.1 Potentsiomeetri max nivoo ületamisel süttib LED =====
/*
Nimetus: Näide #2.1 Analoog sisend
Kirjeldus: Programm demonstreerib analoogsisendi kasutamist
Autor: Raivo Sell
*/
// määrame nivoo, millest kõrgemal väärtusel //süüdatakse LED
const int nivoo = 512;
int pote_sisend = A0; // määrame potentsiomeetri sisendviigu
int led = 13; // määrame LED ühendusviigu
int pote = 0; // muutuja potentsiomeetri väärtuse salvestamiseks
void setup() {
pinMode(led, OUTPUT); // algväärtustame LED viigu väljundiks
}
void loop() {
pote = analogRead(pote_sisend); // loeme analoogsisendi väärtuse
// kui väärtus on suurem nivoost, süütame LED-i
if (pote>nivoo) digitalWrite(led, HIGH);
else digitalWrite(led, LOW); // vastasel korral kustutame LED-i
}
===== Näide #2.2 LED-i vilkumise sagedus sõltub potentsiomeetri sisendist =====
/*
Nimetus: Näide #2.2 Analoog sisendi teisendamine ajaks
Kirjeldus: Programm demonstreerib analoogsisendi kasutamist
Autor: David Cuartielles
Täiendused: Tom Igoe
Kohandused: Raivo Sell
OriginaalURL: http://arduino.cc/en/Tutorial/AnalogInput
*/
int pote_sisend = A0; // määrame potentsiomeetri sisendviigu
int led = 13; // määrame LED ühendusviigu
int pote = 0; // muutuja potentsiomeetri väärtuse salvestamiseks
void setup() {
pinMode(led, OUTPUT); // algväärtustame LED viigu väljundiks
}
void loop() {
pote = analogRead(pote_sisend); // loeme anduri väärtuse
digitalWrite(led, HIGH); // kustutame LED-i
delay(pote); // tekitame viite millisekundit
digitalWrite(led, LOW); // süütame LED-i
delay(pote); // tekitame viite millisekundit
}
===== Harjutus #2 =====
Modifitseerida näiteprogrammi nii, et potentsiomeetriga määratakse LED-i heledus, kasutades selleks delayMicroseconds() funktsioone.
====== Näide #3 LCD ======
Ühendada Arduino plaadiga LCD laiendusplaat. Selleks esmalt eemaldada USB kaabel ja ühendada lahti kõik muud ühendused, mis ette jäävad.
===== Näide #3.1 LCD kasutamine =====
/*
Nimetus: Näide #3.1 LCD kasutamine
Kirjeldus:Kasutab LiquidCrystal.h teeki ja ITEAD Studio 2x16 teksti laiendusplaati
Autor: Tom Igoe
Modifikatsioon: Raivo Sell
Kuupäev: 4.06.2014
Versioon: 1.0
*/
#include // Kaasame vajaliku teegi
// Initsialiseerime LCD koos vastavate viikude ühendamisega
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup() {
lcd.begin(16, 2); //Määrame LCD read ja veerud
lcd.print("Tere Tallinn!"); // Trükime tervitusteksti
}
void loop() {
lcd.setCursor(0, 1); //Viime kursori esimesele reale esimesse positsiooni (1. rida on indeksiga 0)
lcd.print(millis()/1000); //Trükime loenduri väärtuse
}
===== Näide #3.2 LCD kasutamine analoogsisendiga =====
/*
Nimetus: Näide #3.2 LCD kasutamine analoogsisendiga
Kirjeldus:
Kasutab LiquidCrystal.h teeki ja ITEAD Studio 2x16 teksti laiendusplaati
Autor: Tom Igoe
Modifikatsioon: Raivo Sell
Kuupäev: 4.06.2014
Versioon: 1.0
*/
#include // Kaasame vajaliku teegi
// Initsialiseerime LCD koos vastavate viikude ühendamisega
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int pote_sisend = A1; // määrame potentsiomeetri sisendviigu
void setup() {
lcd.begin(16, 2); //Määrame LCD read ja veerud
lcd.print("Potentsiomeeter"); // Trükime tervitusteksti
}
void loop() {
lcd.setCursor(0, 1); //Viime kursori esimesele reale esimesse positsiooni (1. rida on indeksiga 0)
lcd.print(analogRead(pote_sisend)); //Trükime analoogsisendi väärtuse
lcd.print(" "); //Trükime tühikud, et vana väärtus ei jääks segama
delay (100);
}
===== Harjutus #3.1 =====
Koostada programm, mis trükib potentsiomeetri väärtuse rea algusesse. Vajutades nupule vahetatakse rida ja jooksev väärtus kirjutatakse uuele reale. Vajutades uuesti nuppu vahetatakse aktiivse kirjutamise rida tagasi.
====== Näide 4 Andurid ja LCD ======
===== Näide #4.1 Temperatuuri andur koos matemaatika teegiga =====
/*
Nimetus: Näide #4.1 Temperatuuri andur koos matemaatika teegiga
Kirjeldus:
Kasutab Steinhart-Hart termistori valemit:
temperatuur kelvinites = 1 / {A + B[ln(R)] + C[ln(R)]^3}
kus A = 0.001129148, B = 0.000234125 ja C = 8.76741E-08
Autor: Milan Malesevic and Zoran Stupic
Modifikatsioon: Raivo Sell
Kuupäev: 15.01.2013/4.06.2014
Versioon: 1.1
*/
// Kaasame vajalikud teegid
#include
#include
// Initsialiseerime LCD koos vastavate viikude ühendamisega
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int andur = A1; // määrame temperatuurianduri (termistori) sisendviigu
void setup() {
lcd.begin(16, 2); //Määrame LCD read ja veerud
lcd.print("Temperatuur"); // Trükime tervitusteksti
delay (1000);
}
void loop() {
Termistor(analogRead(andur)); // Käivitame funktsooni
delay(1000); // Ootame 1 sek.
lcd.clear(); // Puhastame ekraani vanadest andmetest
}
void Termistor(int RawADC) {
double Temp;
long Takistus;
// Valem: Takistus = (1024 * JaguriTakisti/ADC) - JaguriTakisti
Takistus=((10240000/RawADC) - 10000);
//Esimene rida
lcd.setCursor(0, 0);
lcd.print("AD=");
lcd.print(RawADC); //Trükime analoogsisendi väärtuse
lcd.setCursor(8, 0);
lcd.print("U=");
lcd.print(((RawADC*5.0)/1024.0),3); //Trükime pinge väärtuse
//Teine rida
lcd.setCursor(0, 1);
lcd.print("R=");
lcd.print(Takistus); //Trükime takistuse väärtuse
Temp = log(((10240000/RawADC) - 10000));
Temp = 1/(0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp))* Temp);
Temp = Temp - 273.15; // Konverteeri Kelvinid Celciustesse
lcd.setCursor(8, 8);
lcd.print("T=");
lcd.print(Temp); //Trükime temperatuuri väärtuse
}
===== Näide #4.2 Kaugusandurid =====
// Reading analog and digital sensors
void setup()
{
// For visualization we can use serial monitor
Serial.begin(9600);
}
void loop()
{
// Read the input on analog pin 2 and 3:
int AnalogSensorValue = analogRead(A2); //Sharp analoog kaugusandur
int DigitalSensorValue = digitalRead(A3); //Digtaalne lähedusandur
Serial.println(AnalogSensorValue); // Print out the analog value
Serial.println(DigitalSensorValue); // Print out the digital value
delay(500); // Delay in between readings for readability
}
===== Harjutus #4.1 =====
Modifitseerida programmi nii, et potentsiomeetriga määratakse temperatuuri nivoo, mis salvestatakse nupuga programmi mällu ja selle nivoo ületamisel käivitatakse täiturmehhanism (milleks on LED).\\
**Lisaülesanne:**
Kombineerida LED-i heleduse programm ja eelnev temperatuuri juhtimise programm, kus LED-i heledus sõltub sellest, kui palju nivootemperatuuri ületati (1 kraad: heledus 25 %, 2 kraadi: heledus 50 %, 3 kraadi: heledus 75 % ja 5 kraadi: heledus 10
===== Harjutus #4.2 =====
Modifitseerida kaugusandurite lugemise programmi nii, et andurite info kuvatakse LCD ekraanile ja ühikuteks on sentimeetrid (+-5cm täpsus). Kui pole võimalust mõõtevahendit kasutada, siis kasutada anduri andmelehe graafikut.
====== Näide #5 Mootor ======
Servomootorite kasutamiseks eemaldada Arduino pealt LCD laiendusplaat. Selleks esmalt ühendada lahti USB kaabel ja andurid ning seejärel ettevaatlikult tõmmata kaks plaati lahti.
===== Näide #5.1 Servomootor =====
#include
Servo right_motor,left_motor; // create servo object to control a servo
void setup()
{
right_motor.attach(11); // attaches the servo on pin 11
left_motor.attach(12); // attaches the servo on pin 12
}
void loop()
{
// Control servo with value 0-180. 90 means that servo stands still
right_motor.write(0); // 0 - Servo with maximum speed backward
left_motor.write(180); // 180 - Servo with maximum speed forward
}
===== Näide #5.2 Potentsiomeetriga juhitav servomootor =====
#include
Servo right_motor,left_motor; // create servo object to control a servo
void setup()
{
while (digitalRead(10)==1){}; // Question - What this row does?
right_motor.attach(11); // Attaches the servo on pin 11
left_motor.attach(12); // Attaches the servo on pin 12
}
void loop()
{
int AnalogSensorValue = analogRead(A0); // Read front sensor value
// Compare it with reference
if (AnalogSensorValue>500) { // If TRUE
left_motor.write(0); // Reverse one motor
delay(750); // Wait until turn is enough
}
right_motor.write(0); // Drive forward
left_motor.write(180); // Drive forward
}
===== Harjutus #5.1 =====
Luua programm, mis võimaldab servomootori positsiooni muuta vastavalt analoog kaugusanduri väärtusele (kasutada map funktsiooni).
===== Harjutus #5.2 =====
Luua programm, mis servomootori baasil ehitatud radariga ja analoog kaugusanduriga leiaks ruumist lähima punkti (objekti otsimine tühjast ruumist).
====== Näide 6 Kommunikatsioon ======
===== Näide #6.1 Jadaliides =====
/*
Nimetus: Näide #6.1 Jadaliides
*/
#include
int NTC_sisend = A2; // määrame temperatuurianduri sisendviigu
void setup() {
Serial.begin(9600);
}
void loop() {
Termistor(analogRead(NTC_sisend)); // Käivita funktsoon
Serial.println(""); // Tekita reavahetus
delay(1000); // Oota 1 sek.
}
double Termistor(int RawADC) {
double Temp;
long Takistus;
// Valem: Takistus = (1024 * JaguriTakisti/ADC) - JaguriTakisti
Takistus=((10240000/RawADC) - 10000);
Serial.print("ADC: ");
Serial.print(RawADC);
Serial.print("/1024"); // Prindi ADC tulemus
Serial.print(", Pinge: ");
Serial.print(((RawADC*5.0)/1024.0),3);
Serial.print(" volti"); // Prindi pinge
Serial.print(", Takistus: ");
Serial.print(Takistus);
Serial.print(" oomi");
Temp = log(((10240000/RawADC) - 10000));
Temp = 1/(0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp))* Temp);
Temp = Temp - 273.15; // Konverteeri Kelvinid Celciustesse
Serial.print(", Temperatuur: ");
Serial.print(Temp);
Serial.print(" kraadi C");
return Temp;
}
===== Harjutus #6 =====
Luua programm, mis jadaliidesest saadetud teksti kirjutaks LCD ekraanile. Märk „+“ vahetab rida ning märk „-“ kustutab kogu ekraani.
====== Praktiline projekt #1 ======
Luua programm, mis temperatuurinivoo ületamisel muudab õhuklapi asendit (servo mootor). Temperatuurinivoo määratakse potentsiomeetriga. Õhuklapi asend sõltub temperatuuri erinevusest. Iga temperatuuri kraad, mis ületab nivood lisab klapi nurga 25%. Lüliti katkestab igal ajahetkel süsteemi töö (hädastop) ja viib klapi algasendisse tagasi, jättes punase LED-i vilkuma. Edasijõudnud võivad kasutada katkestust.
====== Praktiline projekt #2 ======
Ventilaatori juhtimine XRF kaudu.
Luua programm, mis suudab XRF raadiomooduliga lugeda kaugmoodulilt temperatuuri ning kui temperatur ületab kohalikul kontrolleril seatud nivoo käivitatakse kaugmoodulil asetsev ventilaator. Suhtkuseks kaugmooduliga tuleb kasutada allolevat protokolli: \\
* xTEMP – tagastab kümnekordse temperatuuri Celsiuse kraadides (24,5C puhul saadetakse 245)
* vastus: xNNN
* xFANn – FAN1 käivitab ventilaatori, FAN0 peatab ventilaatori
* vastus xFANn
Protokollis tähistab „x“ kohaliku seadme numbrit, mille annab juhendaja igale tiimile erineva.
===== Lihtne roboti navigatsioon =====
#include
Servo right_motor,left_motor; // create servo object to control a servo
void setup()
{
// Viktoriiniküsimus - mida see plokk teeb?
digitalWrite(9, HIGH); // lülitame sisemised pullup takistid sisse
while (digitalRead(9)==1){};
right_motor.attach(11); // Attaches the servo on pin 11
left_motor.attach(12); // Attaches the servo on pin 12
}
void loop()
{
// Compare it with reference
if (digitalRead(10)==0) { // If TRUE
left_motor.write(0); // Reverse one motor
delay(750); // Wait until turn is enough
}
right_motor.write(0); // Drive forward
left_motor.write(180); // Drive forward
}