drti

Prvi koraki v Arduino – avtomobilček za vožnjo po črti

 

Milan Gaberšek in Slavko Kocijančič , članek v reviji TIM, številka 2, letnik 2020/21

 

V dvanajstem zaporednem prispevku na temo Prvi koraki v Arduino bomo obstoječi avtomobilček s krmilnikom Arduino nadgradili za vožnjo po črti. Najprej bomo izdelali in preskusili senzor svetlobe, ga namestili na avtomobilček in ga kot pravega robota sprogramirali za novo nalogo.

 

Za oba programa si kodo preko kopiraj/prilepi prenesite v Arduino IDE, da vam ne bo treba pretipkavati.  

 

 

//
// Program Arduino - 
// Testiranje jakosti odbite svetlobe
//

// Led bela lučka na D8
const int led = 8;
// Svetlobno spremenljivi upor na A0
const int senzorSvetlobe = A0;
// Vrednost jakosti odbite svetlobe
// bomo shranili v spremenljivko
int jakostSvetlobe = 0;

void setup() {
  // Branje podatkov preko
  // serijskega vmesnika USB
  Serial.begin(9600);
  pinMode(led, OUTPUT);
  // svetleea dioda bo vklopljena ves eas
  digitalWrite(led, HIGH);
}

void loop() {
  // Z ukazom analogRead preberemo
  // digitalno jakost odbite svetlobe
  jakostSvetlobe = analogRead(senzorSvetlobe);
  // Dobljeni podatek izpišemo na zaslon
  Serial.println(jakostSvetlobe);
}

_________________________________________________________________________________________________
//
// Program Arduino -
// Avtomobilček za vožnjo po črti

// Led bela lueka na D8
const int led = 8;
// Svetlobno spremenljivi upor na A0
const int senzorSvetlobe = A0;
// Vrednost jakosti odbite svetlobe
// bomo shranili v spremenljivko
int jakostSvetlobe = 0;
// S testnim programom smo izmerili jakost 
// na erni in beli podlagi, vnesemo ju
// v jakostCrna in jakostBela
int jakostCrna = 50; // Jakost na crni podlagi
int jakostBela = 150; // Jakost na beli podlagi 
// Povpreeje obeh vrednosti shranimo v refSvetloba
float refSvetlobe = (jakostCrna + jakostBela) / 2; 

// Pini za oba motoreka (preko modula L9110)
const int pinMotorA1 = 9;
const int  pinMotorA2 = 10;
const int pinMotorB1 = 11;
const int  pinMotorB2 = 12;

// Nastavitev vhodov in izhodov krmilnika Arduina
void setup() {
  // Branje podatkov preko
  // serijskega vmesnika USB
  Serial.begin(9600);
  pinMode(led, OUTPUT);
  // svetleea dioda bo vklopljena ves eas
  digitalWrite(led, HIGH);
  // Nastavitev izhodov za motorčka
  pinMode(pinMotorA1, OUTPUT);
  pinMode(pinMotorA2, OUTPUT);
  pinMode(pinMotorB1, OUTPUT);
  pinMode(pinMotorB2, OUTPUT);
}

// Prva parametra povesta, katera pina poganjata motor
// tretji parameter pove smer:
// -1 kolo se vrti nazaj, 0 miruje, 1 kolo se vrti naprej
void motor(int pinMotor1, int pinMotor2, int nSmer) {
  if (nSmer == 1) { // Naprej
    digitalWrite(pinMotor1, HIGH);
    digitalWrite(pinMotor2, LOW); 
  } 
  else if (nSmer == -1) { // Nazaj
    digitalWrite(pinMotor1, LOW);
    digitalWrite(pinMotor2, HIGH); 
  }
  else  { // Se ne vrti
    digitalWrite(pinMotor1, LOW);
    digitalWrite(pinMotor2, LOW);
  }
}

void vrtiVDesno(){
  motor(pinMotorA1, pinMotorA2, 1);
  motor(pinMotorB1, pinMotorB2, -1);
}

void vrtiVLevo(){
  motor(pinMotorA1, pinMotorA2, -1);
  motor(pinMotorB1, pinMotorB2, 1);
}

void peljiNaprej(){
  motor(pinMotorA1, pinMotorA2, 1);
  motor(pinMotorA1, pinMotorA2, 1);
}

void loop() {
  // Z ukazom analogRead preberemo
  // digitalno jakost odbite svetlobe
  jakostSvetlobe = analogRead(senzorSvetlobe);
  // Dobljeni podatek izpišemo na zaslon
  Serial.println(jakostSvetlobe);
  delay(10);
  // Če je jakost odbite svetlobe
  // manjša od sto, se peljemo v levo,
  // drugače v desno 
  if (jakostSvetlobe <= refSvetlobe) {
    vrtiVLevo(); delay(20);
  } else {
    vrtiVDesno(); delay(20);
  }    
  peljiNaprej(); delay(10);
}