====== Arduino Examples ====== /* 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}} */ ====== References ====== [[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 analog distance sensor]] ====== Example 1 Digital I/O ====== ===== Example 1.1 Push down button to light up LED ===== // Constants const int nupp = A0; // Viik kuhu on ühendatud nupp const int LED = 13; // Viik kuhu on ühendatud nupp roheline LED // Global variables int NupuOlek = 0; // Button state void setup() { pinMode(LED, OUTPUT); // define LED pin as output pinMode(nupp, INPUT); // define button pin as input digitalWrite(nupp, HIGH); // turn on internal pull-up resistor on button pin } void loop(){ NupuOlek = digitalRead(nupp); // read current button state to variable if (NupuOlek == HIGH) { // if button state is high (+5 V) digitalWrite(LED, LOW); // turn LED off } else { // if button state is not high (GND) digitalWrite(LED, HIGH); // turn led on } } ===== Example 1.2 On button push LED turns of for 1 second ===== // First part of code copy from example #1.1 void loop(){ if (digitalRead(nupp) == LOW) { // if button state is high (+5V) digitalWrite(LED, HIGH); // turn on LED delay(1000); // wait 1 second (1000 milliseconds) } digitalWrite(LED, LOW); // turn LED off } ===== Example 1.3 LED turns on on button release ===== // First part of code copy from example #1.1 void loop(){ if (digitalRead(nupp) == LOW) { // if button pressed while (digitalRead(nupp) == LOW){} // wait for button release digitalWrite(LED, HIGH); // turn on LED } } ===== Task #1.1 ===== Modify example program so that LED blinks three times. /*Modifitseerida näiteprogrammi nii, et nupule vajutades vilgub LED (LCD laiendusplaadi korral võib kasutada taustavalguse LED-e) kolm korda.*/ ===== Task #1.2 ===== Modify example program so that on button press LED starts to blink with 1 second intervals. On second button press led stops blinking. /*Modifitseerida näiteprogrammi nii, et nupule vajutades hakkab LED konstantselt vilkuma 1 sekundilise intervalliga ja teine nupule vajutus katkestab vilkumise. 0 %).*/ ====== Example #2 Analog inputs ====== ===== Example #2.1 When exceeding potentiometer threshold value the LED turns on ===== // Set threshold value at which the LED turns on const int nivoo = 512; int pote_sisend = A0; // set potentiometer input pin int led = 13; // set LED pin int pote = 0; // integer variable to hold potentiometer value void setup() { pinMode(led, OUTPUT); // set LED pin to output } void loop() { pote = analogRead(pote_sisend); // read Analog input value // if value is greater than threshold then turn on LED if (pote>nivoo) digitalWrite(led, HIGH); else digitalWrite(led, LOW); // other cases turn LED off } ===== Example #2.2 LED blinking speed depends on potentiometer value ===== int pote_sisend = A0; // set potentiometer pin int led = 13; // set LED pin int pote = 0; // integer variable to hold potentiometer value void setup() { pinMode(led, OUTPUT); // define LED pin as output } void loop() { pote = analogRead(pote_sisend); // read potentiometer value and write into variable digitalWrite(led, HIGH); // turn off LED delay(pote); // generate delay milliseconds digitalWrite(led, LOW); // turn on LED delay(pote); // generate delay milliseconds } ===== Task #2 ===== Modify example program so that its possible to change LED brifgtness with potentiometer. Use delay functions. /*Modifitseerida näiteprogrammi nii, et potentsiomeetriga määratakse LED-i heledus, kasutades selleks delay funktsioone.*/ ====== Example #3 LCD ====== Connect LCD shield to Arduino board. Before attaching remove all connections from the board. ===== Example #3.1 LCD using ===== #include // include needed libraries // Initialize LCD LiquidCrystal lcd(8, 9, 4, 5, 6, 7); void setup() { lcd.begin(16, 2); // set LCD cursor column and row lcd.print("Tere Tallinn!"); // Print text on LCD } void loop() { lcd.setCursor(0, 1); //set cursor position to first row and column 0 (1. rida on indeksiga 0) lcd.print(millis()/1000); // Print sensor value to LCD } ===== Example #3.2 LCD and analog inputs ===== #include // include needed library // Initialize LCD LiquidCrystal lcd(8, 9, 4, 5, 6, 7); int pote_sisend = A1; // set potentiometer pin void setup() { lcd.begin(16, 2); // set LCD column and row lcd.print("Potentsiomeeter"); // Print out sensor name on LCD } void loop() { lcd.setCursor(0, 1); //set cursor position first row and column 0 (1. rida on indeksiga 0) lcd.print(analogRead(pote_sisend)); //Print out potentiometer value to LCD lcd.print(" "); //Print out empty spaces delay (100); } ===== Task #3.1 ===== Make a program that on button press changes LCD row. Potentiometer value has to be printed only on the new row. /*Koostada programm, mis võimaldab nupuvajutusega vahetada LCD rida, kuhu trükitakse potentsiomeetri väärtus.*/ ====== Example 4 Sensors and LCD ====== ===== Example #4.1 Temperature sensor with math library ===== /* 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; // set thermistor input pin 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); int DigitalSensorValue = digitalRead(A3); 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 hilisemal ületamisel käivitatakse täiturmehhanism (milleks on LED). **Extra:** 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 ===== Modify distance sensor example so that it would print values on the LCD in centimeters (+-5cm accuracy). If no measureing tool is available then use the sensor datasheet graph. ====== Näide #5 Mootor ====== Disconnect the LCD shield before using motors. Before disconnecting remove all connections from shield and Arduino board. ===== 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.