Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
et:arduino [2015/12/21 11:19] kaupo.raidet: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://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 =====
 +
 +<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, 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 
 +  }
 +}
 +</code>
 +
 +===== 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, HIGH); // süütame LED-i 
 +    delay(1000); // ootame 1 sekundi (1000 millisekundit)
 +  } 
 +  digitalWrite(LED, LOW); // kustutame LED-i 
 +}
 +</code>
 +
 +===== 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, HIGH); // süütame LED-i 
 +  } 
 +}
 +</code>
 +
 +===== 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 =====
 +
 +
 +<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 //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
 +}
 +</code>
 +
 +===== 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: 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 <sensorValue> millisekundit 
 +  digitalWrite(led, LOW); // süütame LED-i 
 +  delay(pote); // tekitame viite <sensorValue> millisekundit
 +}
 +</code>
 +
 +===== 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: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 <LiquidCrystal.h> // 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
 +  
 +}
 +</code>
 +
 +===== 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: Raivo Sell
 +Kuupäev: 4.06.2014
 +Versioon: 1.0
 +*/
 +
 +#include <LiquidCrystal.h> // 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);  
 +}
 +
 +
 +</code>
 +
 +
 +===== 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, 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 <math.h>
 +#include <LiquidCrystal.h>
 +
 +// 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
 +  
 +}
 +</code>
 +
 +
 +===== 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); //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
 +
 +
 +</code>
 +
 +===== 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.h> 
 + 
 +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
 +
 +
 +</code>
 +
 +===== Näide #5.2 Potentsiomeetriga juhitav servomootor =====
 +
 +<code c>
 +#include <Servo.h> 
 +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
 +
 +
 +
 +</code>
 +
 +===== 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 <math.h>
 +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;
 +}
 +
 +</code>
 +
 +===== 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 =====
 +
 +<code c>
 +#include <Servo.h> 
 +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
 +
 +
 +
 +</code>
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0