This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| et:arduino [2015/12/21 11:00] – kaupo.raid | et:arduino [2020/07/20 12:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== Arduino näited ====== | ||
| + | /* | ||
| + | Palun täida koolituse lõpus ka | ||
| + | [[https:// | ||
| + | |||
| + | {{: | ||
| + | |||
| + | English: | ||
| + | {{: | ||
| + | */ | ||
| + | ====== Viited ====== | ||
| + | |||
| + | [[http:// | ||
| + | [[http:// | ||
| + | |||
| + | ====== Näide 1 Digitaalsed I/O ====== | ||
| + | |||
| + | ===== Näide 1.1 Nupule vajutades süttib LED ===== | ||
| + | |||
| + | <code c> | ||
| + | /* | ||
| + | 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, | ||
| + | pinMode(nupp, | ||
| + | digitalWrite(nupp, | ||
| + | } | ||
| + | |||
| + | void loop(){ | ||
| + | NupuOlek = digitalRead(nupp); | ||
| + | if (NupuOlek == LOW) { // Kui nupu on alla vajutatud | ||
| + | digitalWrite(LED, | ||
| + | } | ||
| + | else { // vastasel juhul | ||
| + | digitalWrite(LED, | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== Näide 1.2 Nupule vajutades süttib LED 1 sekundiks ===== | ||
| + | <code c> | ||
| + | // Algus identne näitega #1.1 | ||
| + | void loop(){ | ||
| + | if (digitalRead(nupp) == LOW) { // Kui nupu olek on madal | ||
| + | digitalWrite(LED, | ||
| + | delay(1000); | ||
| + | } | ||
| + | digitalWrite(LED, | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== Näide 1.3 LED süttib nupu vabastamisel ===== | ||
| + | <code c> | ||
| + | // Algus identne näitega #1.1 | ||
| + | void loop(){ | ||
| + | if (digitalRead(nupp) == LOW) { // Nupule vajutus | ||
| + | while (digitalRead(nupp) == LOW){} // Ootame nupu lahtilaskmist | ||
| + | digitalWrite(LED, | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== 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 | ||
| + | |||
| + | |||
| + | <code c> | ||
| + | /* | ||
| + | Nimetus: Näide #2.1 Analoog sisend | ||
| + | Kirjeldus: Programm demonstreerib analoogsisendi kasutamist | ||
| + | Autor: Raivo Sell | ||
| + | */ | ||
| + | |||
| + | // määrame nivoo, millest kõrgemal väärtusel // | ||
| + | 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, | ||
| + | } | ||
| + | |||
| + | void loop() { | ||
| + | pote = analogRead(pote_sisend); | ||
| + | // kui väärtus on suurem nivoost, süütame LED-i | ||
| + | if (pote> | ||
| + | else digitalWrite(led, | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== Näide #2.2 LED-i vilkumise sagedus sõltub potentsiomeetri sisendist ===== | ||
| + | |||
| + | |||
| + | <code c> | ||
| + | /* | ||
| + | Nimetus: Näide #2.2 Analoog sisendi teisendamine ajaks | ||
| + | Kirjeldus: Programm demonstreerib analoogsisendi kasutamist | ||
| + | Autor: David Cuartielles | ||
| + | Täiendused: | ||
| + | Kohandused: Raivo Sell | ||
| + | OriginaalURL: | ||
| + | */ | ||
| + | |||
| + | 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, | ||
| + | } | ||
| + | void loop() { | ||
| + | pote = analogRead(pote_sisend); | ||
| + | digitalWrite(led, | ||
| + | delay(pote); | ||
| + | digitalWrite(led, | ||
| + | delay(pote); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== 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 ===== | ||
| + | |||
| + | |||
| + | <code c> | ||
| + | /* | ||
| + | Nimetus: Näide #3.1 LCD kasutamine | ||
| + | Kirjeldus: | ||
| + | Autor: Tom Igoe | ||
| + | Modifikatsioon: | ||
| + | Kuupäev: 4.06.2014 | ||
| + | Versioon: 1.0 | ||
| + | */ | ||
| + | |||
| + | #include < | ||
| + | |||
| + | // Initsialiseerime LCD koos vastavate viikude ühendamisega | ||
| + | LiquidCrystal lcd(8, 9, 4, 5, 6, 7); | ||
| + | |||
| + | void setup() { | ||
| + | lcd.begin(16, | ||
| + | lcd.print(" | ||
| + | } | ||
| + | |||
| + | void loop() { | ||
| + | | ||
| + | lcd.setCursor(0, | ||
| + | | ||
| + | lcd.print(millis()/ | ||
| + | | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== Näide #3.2 LCD kasutamine analoogsisendiga ===== | ||
| + | |||
| + | <code c> | ||
| + | /* | ||
| + | Nimetus: Näide #3.2 LCD kasutamine analoogsisendiga | ||
| + | Kirjeldus: | ||
| + | Kasutab LiquidCrystal.h teeki ja ITEAD Studio 2x16 teksti laiendusplaati | ||
| + | Autor: Tom Igoe | ||
| + | Modifikatsioon: | ||
| + | Kuupäev: 4.06.2014 | ||
| + | Versioon: 1.0 | ||
| + | */ | ||
| + | |||
| + | #include < | ||
| + | |||
| + | // 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, | ||
| + | lcd.print(" | ||
| + | } | ||
| + | |||
| + | void loop() { | ||
| + | | ||
| + | lcd.setCursor(0, | ||
| + | lcd.print(analogRead(pote_sisend)); | ||
| + | lcd.print(" | ||
| + | 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 ===== | ||
| + | |||
| + | |||
| + | <code c> | ||
| + | |||
| + | /* | ||
| + | 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, | ||
| + | Autor: Milan Malesevic and Zoran Stupic | ||
| + | Modifikatsioon: | ||
| + | Kuupäev: 15.01.2013/ | ||
| + | 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, | ||
| + | lcd.print(" | ||
| + | delay (1000); | ||
| + | } | ||
| + | |||
| + | void loop() { | ||
| + | | ||
| + | | ||
| + | | ||
| + | } | ||
| + | |||
| + | void Termistor(int RawADC) { | ||
| + | | ||
| + | long Takistus; | ||
| + | // Valem: Takistus = (1024 * JaguriTakisti/ | ||
| + | Takistus=((10240000/ | ||
| + | |||
| + | //Esimene rida | ||
| + | lcd.setCursor(0, | ||
| + | lcd.print(" | ||
| + | lcd.print(RawADC); | ||
| + | |||
| + | lcd.setCursor(8, | ||
| + | lcd.print(" | ||
| + | lcd.print(((RawADC*5.0)/ | ||
| + | |||
| + | |||
| + | //Teine rida | ||
| + | lcd.setCursor(0, | ||
| + | lcd.print(" | ||
| + | lcd.print(Takistus); | ||
| + | |||
| + | Temp = log(((10240000/ | ||
| + | Temp = 1/ | ||
| + | Temp = Temp - 273.15; // Konverteeri Kelvinid Celciustesse | ||
| + | | ||
| + | lcd.setCursor(8, | ||
| + | lcd.print(" | ||
| + | lcd.print(Temp); | ||
| + | | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Näide #4.2 Kaugusandurid ===== | ||
| + | |||
| + | <code c> | ||
| + | // 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); | ||
| + | int DigitalSensorValue = digitalRead(A3); | ||
| + | | ||
| + | Serial.println(AnalogSensorValue); | ||
| + | Serial.println(DigitalSensorValue); | ||
| + | | ||
| + | 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 ===== | ||
| + | |||
| + | <code c> | ||
| + | #include < | ||
| + | |||
| + | Servo right_motor, | ||
| + | |||
| + | void setup() | ||
| + | { | ||
| + | right_motor.attach(11); | ||
| + | left_motor.attach(12); | ||
| + | } | ||
| + | |||
| + | void loop() | ||
| + | { | ||
| + | // Control servo with value 0-180. 90 means that servo stands still | ||
| + | right_motor.write(0); | ||
| + | left_motor.write(180); | ||
| + | } | ||
| + | |||
| + | </ | ||
| + | |||
| + | ===== Näide #5.2 Potentsiomeetriga juhitav servomootor ===== | ||
| + | |||
| + | <code c> | ||
| + | #include < | ||
| + | Servo right_motor, | ||
| + | |||
| + | void setup() | ||
| + | { | ||
| + | while (digitalRead(10)==1){}; | ||
| + | right_motor.attach(11); | ||
| + | left_motor.attach(12); | ||
| + | } | ||
| + | |||
| + | void loop() | ||
| + | { | ||
| + | int AnalogSensorValue = analogRead(A0); | ||
| + | // Compare it with reference | ||
| + | if (AnalogSensorValue> | ||
| + | | ||
| + | | ||
| + | } | ||
| + | right_motor.write(0); | ||
| + | left_motor.write(180); | ||
| + | |||
| + | } | ||
| + | |||
| + | </ | ||
| + | |||
| + | ===== 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 ===== | ||
| + | |||
| + | |||
| + | <code c> | ||
| + | /* | ||
| + | Nimetus: Näide #6.1 Jadaliides | ||
| + | */ | ||
| + | #include < | ||
| + | int NTC_sisend = A2; // määrame temperatuurianduri sisendviigu | ||
| + | void setup() { | ||
| + | | ||
| + | } | ||
| + | |||
| + | void loop() { | ||
| + | | ||
| + | | ||
| + | | ||
| + | } | ||
| + | |||
| + | double Termistor(int RawADC) { | ||
| + | | ||
| + | long Takistus; | ||
| + | // Valem: Takistus = (1024 * JaguriTakisti/ | ||
| + | Takistus=((10240000/ | ||
| + | |||
| + | Serial.print(" | ||
| + | Serial.print(RawADC); | ||
| + | Serial.print("/ | ||
| + | Serial.print(", | ||
| + | Serial.print(((RawADC*5.0)/ | ||
| + | Serial.print(" | ||
| + | Serial.print(", | ||
| + | Serial.print(Takistus); | ||
| + | Serial.print(" | ||
| + | |||
| + | Temp = log(((10240000/ | ||
| + | Temp = 1/ | ||
| + | Temp = Temp - 273.15; // Konverteeri Kelvinid Celciustesse | ||
| + | Serial.print(", | ||
| + | Serial.print(Temp); | ||
| + | Serial.print(" | ||
| + | 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, | ||
| + | * vastus xFANn | ||
| + | |||
| + | Protokollis tähistab „x“ kohaliku seadme numbrit, mille annab juhendaja igale tiimile erineva. | ||
| + | |||
| + | |||
| + | ===== Lihtne roboti navigatsioon ===== | ||
| + | |||
| + | <code c> | ||
| + | #include < | ||
| + | Servo right_motor, | ||
| + | |||
| + | void setup() | ||
| + | { | ||
| + | // Viktoriiniküsimus - mida see plokk teeb? | ||
| + | digitalWrite(9, | ||
| + | while (digitalRead(9)==1){}; | ||
| + | | ||
| + | right_motor.attach(11); | ||
| + | left_motor.attach(12); | ||
| + | } | ||
| + | |||
| + | void loop() | ||
| + | { | ||
| + | |||
| + | // Compare it with reference | ||
| + | if (digitalRead(10)==0) { // If TRUE | ||
| + | | ||
| + | | ||
| + | } | ||
| + | right_motor.write(0); | ||
| + | left_motor.write(180); | ||
| + | |||
| + | } | ||
| + | |||
| + | </ | ||