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
en:arduino [2015/12/10 15:16] raivo.sellen:arduino [2020/07/20 12:00] (current) – external edit 127.0.0.1
Line 1: Line 1:
 +====== 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 =====
 +
 +<code c>
 +
 +// 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
 +  }
 +}
 +</code>
 +
 +===== Example 1.2 On button push LED turns of for 1 second =====
 +<code c>
 +// 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
 +}
 +</code>
 +
 +===== Example 1.3 LED turns on on button release =====
 +<code c>
 +// 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
 +  } 
 +}
 +</code>
 +
 +===== 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 =====
 +
 +
 +<code c>
 +
 +// 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
 +}
 +</code>
 +
 +===== Example #2.2 LED blinking speed depends on potentiometer value =====
 +
 +
 +<code c>
 +
 +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 <sensorValue> milliseconds 
 +  digitalWrite(led, LOW); // turn on LED
 +  delay(pote); // generate delay <sensorValue> milliseconds
 +}
 +</code>
 +
 +===== 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 =====
 +
 +
 +<code c>
 +
 +#include <LiquidCrystal.h> // 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
 +  
 +}
 +</code>
 +
 +===== Example #3.2 LCD and analog inputs =====
 +
 +<code c>
 +
 +#include <LiquidCrystal.h> // 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);  
 +}
 +
 +
 +</code>
 +
 +===== 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 =====
 +
 +
 +<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; // 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
 +  
 +}
 +</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);
 +  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
 +
 +
 +</code>
 +
 +===== 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 =====
 +
 +<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.
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