This is an old revision of the document!


TTU Summer School programming

Project 1 Controlling LED with button

Arduino ühendusskeem

Example #1.1 LED light up when button is pressed

Theory: https://www.arduino.cc/en/Tutorial/DigitalPins.

/*
Example #1.1
*/
 
/* Konstandid */
// Viik kuhu on ühendatud nupp
const int nupp = A0; 
 
// Viik kuhu on ühendatud LED
const int led = 13; 
 
/* Globaalsed muutujad */
// Nupu muutuja oleku salvestamine ja selle algväärtustamine
int nupuOlek = 0; 
 
void setup() 
{ 
  // LED viigu väljundi seadistamine 
  pinMode(led, OUTPUT); 
  // Nupu viigu sisendi seadistamine ja sisemise "pull-up" takisti aktiveermine
  pinMode(nupp, INPUT_PULLUP); 
}
 
void loop()
{
  // Nupu muutuja hetkeväärtuse salvestamine
  nupuOlek = digitalRead(nupp); 
  // Kui nupp on alla vajutatud, siis seadistame LED viigu kõrgeks ehk LED süttib
  if (nupuOlek == LOW) 
  { 
    digitalWrite(led, HIGH);
  } 
  // Muul juhul seadistame LED viigu madalaks ehk LED ei põle
  else 
  { digitalWrite(led, LOW);
  }
}

Näide #1.2 Short push on the button makes LED light up for 1 second

/*
Example #1.2
*/
 
// Algus identne näitega #1.1 (kommenteeritud koodi vaata sealt)
const int nupp = A0; 
const int led = 13; 
 
int nupuOlek = 0; 
 
void setup() 
{ 
  pinMode(led, OUTPUT); 
  pinMode(nupp, INPUT_PULLUP); 
}
 
void loop()
{
  // Nupu muutuja hetkeväärtuse salvestamine
  nupuOlek = digitalRead(nupp); 
 
  /* Kui nupp on alla vajutatud, siis seadistame LED viigu kõrgeks ehk LED süttib,
     programm seisab 1 sekund ja pärast seda seatakse viik tagasi madalaks */
  if (nupuOlek == LOW) 
  { 
    digitalWrite(led, HIGH);
    delay(1000); // 1000 millisekundit ehk 1 sekund
  } 
  digitalWrite(led, LOW);
}

Näide #1.3 Nupule vajutades muudab LED oma olekut

/*
Example #1.3
*/
 
// Algus identne näitega #1.1 (kommenteeritud koodi vaata sealt)
const int nupp = A0; 
const int led = 13; 
 
int nupuOlek = 0; 
 
void setup() 
{ 
  pinMode(led, OUTPUT); 
  pinMode(nupp, INPUT_PULLUP); 
}
 
void loop() 
{
  // Programm ei tee midagi kuni vajutatakse nuppu
  if (digitalRead(nupp) == LOW) 
    {
   // Lüliti kontaktide värelemise (debounce) efekti mõju vähendamiseks väike viide
    delay(50); 
    while (digitalRead(nupp) == LOW)
     { //Tsükkel hoiab programmi kinni kuni nupu viigu olek muutub kõrgeks
     }
    /* LED viigu olek inverteeritakse ehk seatakse
       vastupidiseks kasutades hetkeväärtust */
    digitalWrite(led, !digitalRead(led)); 
 
   // Lüliti kontaktide värelemise (debounce) efekti mõju vähendamiseks väike viide
    delay(50); 
    }
}

Exercises

Exercise #1.1

Modify example so that on button press LED blinks 3 times.

Exercise #1.2

Modify example so that on button press LED starts to blink with constant interval. Second press ends the blinking.

 

Project 2 Controlling LED with potentiometer

Example #2.1 Potentiometer controls state of LED

/*
Example #2.1
*/
 
// Viik kuhu on ühendatud potentsiomeeter
const int pote = A1; 
 
// Viik kuhu on ühendatud LED
const int led = 13; 
 
// Potentsiomeetri muutuja väärtuse salvestamine ja selle algväärtustamine
int poteOlek = 0; 
 
void setup()
{
  /* Mikrokontrolleri viigud on tavaolekus sisendid ja seega ei pea
  potentsiomeetri sisendit eraldi seadistama */
  pinMode(led, OUTPUT); // Seadistame LED viigu väljundiks
}
 
void loop() 
{
  // Viigu muutuja hetkeväärtuse salvestamine
  poteOlek = digitalRead(pote); 
 
  // Kui sisendviik on kõrge, siis seame LED viigu kõrgeks
  if(poteOlek > 0)
  {
    digitalWrite(led, HIGH);
  }
  // Muul juhul seame led viigu madalaks
  else
  {
    digitalWrite(led, LOW);
  }
}

Example #2.2 Controlling LED blinking frequency with potentiometer

/* 
Example #2.2
*/
 
// Algus identne näitega #2.1 (kommenteeritud koodi vaata sealt)
const int pote = A1; 
const int led = 13; 
 
int poteOlek = 0; 
 
void setup()
{
  pinMode(led, OUTPUT);
}
 
void loop() 
{
  // Potentsiomeetri muutuja hetkeväärtuse salvestamine 
  poteOlek = analogRead(pote); 
 
  // LED viigu oleku kõrgeks seadmine
  digitalWrite(led, HIGH); 
 
  // Viite tekitamine, mille pikkus on võrdne potentsiomeetri sisendi väärtusega
  delay(poteOlek);  
 
  // LED viigu oleku madalaks seadmine
  digitalWrite(led, LOW); 
 
  // Viite tekitamine, mille pikkus on võrdne potentsiomeetri sisendi väärtusega
  delay(poteOlek); 
}

Example #2.3 Controlling LED brightness with potentiometer

/*
Example #2.3
*/
// Algus identne näitega #2.1 (kommenteeritud koodi vaata sealt)
 
const int pote = A1; 
const int led = 13; 
int poteOlek = 0; 
 
void setup()
{
  pinMode(led, OUTPUT);
}
 
void loop() 
{
  // Potentsiomeetri muutuja hetkeväärtuse salvestamine
  poteOlek = analogRead(pote); 
 
/* Kui potentsiomeetri väärtus on suurem kui 0, siis seame LED viigu kõrgeks,
   seejärel programm ootab potentsiomeetri väärtusega võrdse arvu mikrosekundeid */
  if (poteOlek > 0) 
  {
    digitalWrite(led, HIGH);
    delayMicroseconds(poteOlek); 
  }
 
  // Seame LED viigu madalasse olekusse
  digitalWrite(led, LOW); 
 
  // Programm ootab ülejäänud arvu mikrosekundeid perioodist 
  delayMicroseconds(1023 - poteOlek); 
}

Exercises

Exercise #2.2

Control LED on and off time with potentiometer.

Project 3 Alphabetical LCD

Example #3.1 Writing on LCD screen

Theory: https://www.arduino.cc/en/Reference/LiquidCrystal

/*
Example #3.1
*/
// Vajaliku teegi kaasamine
#include <LiquidCrystal.h> 
 
// LCD objekti tekitamine ja ühendusviikude määramine. 
// NB! Need viigud võivad olla erinevatel LCD laiendusplaatidel erinevad
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
 
void setup() 
{
  // LCD ridade ja veergude määramine vastavalt riistvarale 
  lcd.begin(16, 2); 
 
  // Ekraani tervitusteksti kuvamine
  lcd.print("Tere Tallinn!"); 
}
 
void loop() 
{
  // Kursori asukohta muutmine: esimene veerg(tähis 0) ja teine rida (tähis 1)
  lcd.setCursor(0, 1); 
 
  // Ekraani loenduri väärtuse kuvamine
  lcd.print(millis()/1000); 
}

Example #3.2 Custom characters writing on LCD

/*
Example #3.2
*/
// Vajaliku teegi kaasamine
#include <LiquidCrystal.h>
 
// LCD objekti tekitamine ja ühendusviikude määramine
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
 
/* Massiiv erikujulise tähemärgi tekitamiseks,
   "0b" numbrite ees ütleb kompilaatorile, et tegemist on kahendsüsteemis arvuga.
   Kahendsüsteemi arvude kasutamisel tekib parem arusaam
   kuvatavate pikslite asukohtadest. */
byte customChar[8] = 
{
  0b11111,
  0b00000,
  0b01010,
  0b00000,
  0b10001,
  0b01110,
  0b00000,
  0b11111
};
 
void setup()
{
  // Tekitab uue erikujulise tähemärgi draiveri mällu kohale 0
  lcd.createChar(0, customChar); 
 
  // LCD ridade ja veergude määramine vastavalt riistvarale
  lcd.begin(16, 2); 
 
  //  Draiveri mälus kohal 0 oleva erikujulise tähemärgi kuvamine ekraanile
  lcd.write((uint8_t)0); 
}
void loop()
{
  /* Tsüklis ei tehta midagi kogu tegevus
     on sooritatud juba //setup// funktsioonis */
}

Example #3.3 Reading LCD shield buttons

/*
Nimetus: Näide #3.3
Kirjeldus: LCD laiendusplaadi nuppude lugemine
*/
// Vajaliku teegi kaasamine
#include <LiquidCrystal.h>
 
// LCD objekti tekitamine ja ühendusviikude määramine
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
 
// Nupude konstandi defineerimine 
const int nuppRIGHT = 0;
const int nuppUP    = 1;
const int nuppDOWN  = 2;
const int nuppLEFT  = 3;
const int nuppSELECT = 4;
const int nuppNONE  = 5;
 
/* Globaalsed muutujad */
// Vajutatud nupu muutuja konstandi salvestamine
int vajutatudNupp;
// Aanaloogsisendi muutuja väärtuse salvestamine
int nupuSisend; 
 
void setup() 
{
  // LCD ridade ja veergude määramine vastavalt riistvarale
  lcd.begin(16, 2); 
 
  // Ekraani info kuvamine
  lcd.print("ADC: ");
 
  // Ekraani analoogsisendi A0 väärtuse kuvamine
  lcd.print(analogRead(A0)); 
}
void loop() 
{
  /* Kutsub välja funktsiooni kontrolliNuppe 
   ja salvestab tagastatud väärtuse muutujasse */
  vajutatudNupp = kontrolliNuppe(); 
 
  // Kontrollib kas mõni nupp on alla vajutatud 
  if(vajutatudNupp < nuppNONE)
  {
    lcd.clear(); // Puhastab ekraani ja liigutab kursori tagasi algasendisse
 
    lcd.print("ADC: "); // Teksti kuvamine ekraanil
 
    lcd.print(nupuSisend); // Muutuja väärtuse kuvamine ekraanil
 
    delay(500); // Lühike viide, et ekraanil väärtust liiga kiirelt ei uuendataks
  }
}
// Funktsioon võtab analoogsisendi väärtuse ja võrdleb olemasolevate väärtustega.
// Tagastab arvu vahemikus 0 kuni 5 vastavalt defineeritud konstandile
int kontrolliNuppe()
{
 // Salvestab muutujasse analoogväärtuse viigult A0
 nupuSisend = analogRead(A0);
 if (nupuSisend < 50)   return nuppRIGHT;
 if (nupuSisend < 195)  return nuppUP;
 if (nupuSisend < 380)  return nuppDOWN;
 if (nupuSisend < 555)  return nuppLEFT;
 if (nupuSisend < 790)  return nuppSELECT;
 // Kui ühtegi nuppu pole vajutatud, siis tagastatakse "nuppNONE"
 return nuppNONE;
}

Exercises

Exercise #3.1

Modify example so that text is center aligned.

Exercise #3.2

Make a small animation with custom characters. Custom character code generator https://omerk.github.io/lcdchargen/

Project 4 Reading sensors and displaying results on LCD

Example #4.2 Distance and proximity sensors reading

Libraries: https://www.arduino.cc/en/guide/libraries#toc4

/*
Example #4.2 
*/
 
// Vajalike teekide kaasamine
// LCD ekraani funktsioone sisaldav teek
#include <LiquidCrystal.h> 
// Ultrahelianduri funktsioone sisaldav teek
#include <NewPing.h> 
 
// Andurite ühendusviikude määramine
const int ultraheliKaugusandur_TRIGGER = A2;
const int ultraheliKaugusandur_ECHO = A3;
const int infrapunaLahedusandur = A4;
 
/* Globaalsed muutujad ja konstandid */
const int ultraheliKaugusandur_maksimumKaugus = 200;
int ultraheliKaugus, infrapunaNaebObjekti;
 
// LCD objekti tekitamine ja ühendusviikude määramine
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
 
// Ultraheli kaugusanduri objekti tekitamine koos viikude ühendamisega
NewPing sonar(ultraheliKaugusandur_TRIGGER, ultraheliKaugusandur_ECHO,
ultraheliKaugusandur_maksimumKaugus);
 
void setup() 
{
  // LCD ridade ja veergude määramine vastavalt riistvarale
  lcd.begin(16, 2); 
 
  // Selgitavate tekstide kuvamine ekraanil
  lcd.print("Kaugus:");
  lcd.setCursor(0, 1);
  lcd.print("Naeb:");
}
void loop() 
{
  // Ultrahelianduriga kaguse mõõtmine sentimeetrites ja muutujasse salvestamine
  ultraheliKaugus = sonar.ping_cm();
 
  // Lähedusanduri väärtuse lugemine ja muutujasse salvestamine
  infrapunaNaebObjekti = digitalRead(infrapunaLahedusandur); 
 
  // Kursori esimesele reale ja tähemärgile 9 nihutamine
  lcd.setCursor(9, 0);
 
  // Ekraani kaugusanduri mõõdetud kauguse kuvamine
  lcd.print(ultraheliKaugus); 
 
  /* Trükime üle järgnevad kolm tähemärki tühikutega,
     et vana lugemi väärtus ei jääks ekraanil näha */
  lcd.print("   "); 
 
  // Kursori teisele reale ja tähemärgile 9 nihutamine
  lcd.setCursor(9, 1); 
 
  // Kui infrapunalähedusanduri väljund on kõrge, siis kirjuta ekraanile "ei"
  if(infrapunaNaebObjekti == 1) lcd.print("ei "); 
 
  // Kui infrapunalähedusanduri väljund on madal, siis kirjuta ekraanile "jah"
  else lcd.print("jah"); 
 
  // Väike viide, et tekst ekraanil oleks loetavam
  delay(500); 
}

Exercises

Exercise #4.1

Find out which sensor sample time is faster.

Project 5 DC motor drive and speed control

Example #5.1 DC motor ad H-bridge

/*
Example #5.1
*/
// Mootori viikude määramine juhtmooduli juhtimiseks.
// Mootori liikumissuund sõltub ka mootori ühendamise polaarsusest.
const int vasak_A = 10; // juhtmooduli viik A-1A
const int vasak_B = 12; // juhtmooduli viik A-1B
const int parem_A = 11; // juhtmooduli viik B-1A
const int parem_B = 13; // juhtmooduli viik B-2A
 
void setup() 
{
  // Mootori juhtviikude väljundiks seadistamine
  pinMode(vasak_A,OUTPUT);
  pinMode(vasak_B,OUTPUT);
  pinMode(parem_A,OUTPUT);
  pinMode(parem_B,OUTPUT);
 
  mootorid(0,0); // Mootori algne peatamine
  delay(2000); // Viide, et robot laua pealt kohe plehku ei paneks
}
 
void loop() 
{
 
  mootorid(1,1); // Robot sõidab otse
  delay(2000); // Viide - robot säilitab viite pikkuse liikumise
 
  mootorid(-1,1); // Robot keerab vasakule
  delay(500);  // Viide - robot säilitab viite pikkuse liikumise
}
 
// Funktsioon mootori liikumissuundade määramiseks
void mootorid(int vasak, int parem)
{
  // Vasak mootor
  if(vasak == 1)
  { // Vasak mootor edasi
    digitalWrite(vasak_A,HIGH);
    digitalWrite(vasak_B,LOW);
  }
  else if(vasak == -1)
  { // Vasak mootor tagasi
    digitalWrite(vasak_A,LOW);
    digitalWrite(vasak_B,HIGH);
  }
  else
  { // Vasak mootor seisma
    digitalWrite(vasak_A,LOW);
    digitalWrite(vasak_B,LOW);
  }
 
  // Parem mootor
  if(parem == 1)
  { // Parem mootor edasi
    digitalWrite(parem_A,HIGH);
    digitalWrite(parem_B,LOW);
  }
  else if(parem == -1)
  { // Parem mootor tagasi
    digitalWrite(parem_A,LOW);
    digitalWrite(parem_B,HIGH);
  }
  else
  { // Parem mootor seisma
    digitalWrite(parem_A,LOW);
    digitalWrite(parem_B,LOW);
  }
}

Example #5.2 DC motor speed controlling

/* Nimetus: 
Example #5.2
*/
// Mootori viikude määramine juhtmooduli juhtimiseks
// Mootori liikumissuund sõltub ka mootori ühendamise polaarsusest
const int vasak_A = 10; // juhtmooduli viik A-1A
const int vasak_B = 12; // juhtmooduli viik A-1B
const int parem_A = 11; // juhtmooduli viik B-1A
const int parem_B = 13; // juhtmooduli viik B-2B
 
void setup() 
{
  // Mootori juhtviikude väljundiks seadistamine
  pinMode(vasak_A,OUTPUT);
  pinMode(vasak_B,OUTPUT);
  pinMode(parem_A,OUTPUT);
  pinMode(parem_B,OUTPUT);
 
  mootorid(0,0); // Mootori algne peatamine
  delay(2000); // Viide, et robot laua pealt kohe plehku ei paneks
}
void loop()
 {
  mootorid(100,100); // Robot sõidab otse aeglaselt
  delay(2000); // Viide - robot säilitab viite pikkuse liikumise
  mootorid(100,255); // Robot keerab sujuvalt vasakule
  delay(2000); // Viide - robot säilitab viite pikkuse liikumise
  mootorid(-255,-255); // Robot tagurdab kiiresti
  delay(2000); // Viide - robot säilitab viite pikkuse liikumise
  mootorid(-255,-100); // Robot tagurdab sujuvalt paremale
  delay(2000); // Viide - robot säilitab viite pikkuse liikumise
  mootorid(150,-150); // Robot keerab kohapeal paremale
  delay(2000); // Viide - robot säilitab viite pikkuse liikumise
}
 
// Funktsioon mootori liikumissuuna ja kiiruse määramiseks
void mootorid(int vasak, int parem)
 {
  // Vasak mootor
  if(vasak > 0 && vasak <= 255)
  { // Vasak mootor otse
    analogWrite(vasak_A,vasak);
    digitalWrite(vasak_B,LOW);
  }
  else if(vasak < 0 && vasak >= -255)
  { // Vasak mootor tagurpidi
    analogWrite(vasak_A,255+vasak);
    digitalWrite(vasak_B,HIGH);
  }
  else
  { // Vasak mootor seisma
    digitalWrite(vasak_A,LOW);
    digitalWrite(vasak_B,LOW);
  }
 
  // Parem mootor
  if(parem > 0 && parem <= 255)
  { // Parem mootor otse
    analogWrite(parem_A,parem);
    digitalWrite(parem_B,LOW);
  }
  else if(parem < 0 && parem >= -255)
  { // Parem mootor tagurpidi
    analogWrite(parem_A,255+parem);
    digitalWrite(parem_B,HIGH);
  }
  else
  { // Parem mootor seisma
    digitalWrite(parem_A,LOW);
    digitalWrite(parem_B,LOW);
  }
}

Exercises

Exercise #5.1

Modify exampe so that robot drives number eight shape.

Harjutus #5.2

Make robot parallel park itself.

Project 6 Servo motor combine with distance sensors

Example #6.1 Servo motor and PWM

Theory: https://www.arduino.cc/en/Reference/Map

/*
Example #6.1
*/
 
// Vajalike teekide kaasamine
#include <Servo.h> 
 
// Servo objekti tekitamine nimega mootor
Servo mootor; 
 
// Seadmete ühendusviikude määramine
const int pote = A1; 
const int servo = 3;
 
void setup()
{
  // Servo objekti sidumine kindla Arduino viiguga
  mootor.attach(servo);
}
 
void loop()
{
 /* Muutuja tekitamine ja map funktsiooni kasutamine,
    et väärtused sobivasse vahemikku teisendada */
  int servoAsend = map(analogRead(pote),0,1023,0,180);
 
 /* Servomootorile positsiooni andmine vahemikus 0-180
    (üldiselt vastab väärtus mootori pöördenurga kraadidele) */
  mootor.write(servoAsend);
}

Example #6.2 Servo motor and distance sensor

/*
Example #6.2
*/
 
// Kõikide vajalike teekide lisamine
#include <Servo.h>
#include <NewPing.h>
 
// Servo ja ultrahelianduri ühendusviikude määramine
#define MOOTOR 3
#define TRIG A3
#define ECHO A4
 
// Servo objekti tekitamine nimega sensM
Servo sensM;
 
// Anduri objekti tekitamine nimega sonar
NewPing sonar(TRIG, ECHO, 200);
 
void setup()
{
  // Servo objekti ja ühendusviigu sidumine
  sensM.attach(MOOTOR); 
 
  // Jadaliidese tavakiirusel käivitamine (9600 baudi)
  Serial.begin(9600); 
}
 
void loop() 
{
 
  // Jadaliidesesse selgitava teksti saatmine
  Serial.print("Kaugus: ");
 
  // Tsükkel, mis iga 10 kraadise servo liikumise järel teostab kauguse mõõtmise 
  for (int i = 0; i <= 180; i += 10) 
  {
    // Servo hoova liigutamine positsiooni i
    sensM.write(i); 
 
    // Viide, et servo jõuaks saavutada ette antud positsiooni enne uut mõõtmist
    delay(250); 
 
    // Uus kaugus mõõtmine ja  tulemuse jadapordi kirjutamine
    Serial.print(sonar.ping_cm()); 
    Serial.print(", ");
  }
 
  // Servo algpositsiooni liigutamine
  sensM.write(0); 
 
  // Viide, et servo jõuaks tagasi algpositsiooni
  delay(1000); 
 
  // Reavahetuse tekitamine jadapordis
  Serial.println(""); 
}

Exercises

Exercise 6.1

Modify the example so that servo motor tries to be towards a close by object.

Exercise 6.2

Modify the example so that it returns the minimum and maximum distances and at what angles they were taken. Write data to serial port.

en/arduino/examples.1500962788.txt.gz · Last modified: 2020/07/20 09:00 (external edit)
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