drti

Prvi koraki v Arduino – avtomobilček robot

 

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

 

Robot je naprava, ki jo lahko programiramo tako, da opravlja neko nalogo. V enajstem zaporednem prispevku na temo Prvi koraki v Arduino bomo že zgrajeni avtomobilček predelali tako, da ga ne bomo več krmilili s tipkami, temveč bo deloval brez našega posredovanja. Napisali in naložili bomo tak program, da bo avtomobilček zaplesal, s čimer bo postal pravi robot. To bo prvi korak k njegovi samostojnosti. Nato bomo na sprednji del avtomobilčka pritrdili posebno tipalko, prek katere bo robotek zaznaval ovire na desni, levi in na sredini ter se ob primerno napisanem programu ustrezno odzval z umikom in spremembo smeri.

 

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

 

 

//
// Program Arduino -
// ples avtomobilčka

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

// Nastavitev izhodov krmilnika Arduina
void setup() {
  // 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 peljiNaprej(){
  motor(pinMotorA1, pinMotorA2, 1);
  delay(150);
  motor(pinMotorB1, pinMotorB2, 1);
}

void peljiNazaj(){
  motor(pinMotorA1, pinMotorA2, -1);
  delay(150);  
  motor(pinMotorB1, pinMotorB2, -1);
}

void peljiVDesno(){
  motor(pinMotorA1, pinMotorA2, 1);
  motor(pinMotorB1, pinMotorB2, 0);
}

void peljiVLevo(){
  motor(pinMotorA1, pinMotorA2, 0);
  motor(pinMotorB1, pinMotorB2, 1);
}

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

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

void ustavi(){
  motor(pinMotorA1, pinMotorA2, 0);
  motor(pinMotorA1, pinMotorA2, 0);
}

void loop() {
  // Petkrat ponovi
  for (int i=0; i<5; i++) {
    // Plesni koraki 
    peljiNaprej(); delay(500);
    peljiVDesno(); delay(300);
    peljiNazaj(); delay(500);
    vrtiVLevo(); delay(800);
  }
  ustavi(); delay(100);
}
_________________________________________________________________________________________________

//
// Program Arduino -
// avtomobilček robot

// Pini za tipki za zaznavanje ovire 
const int pinTipkaLeva = 2;
const int pinTipkaDesna = 4;

// Pini za oba motorčka (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() {
  // Nastavitev tipk
  pinMode(pinTipkaLeva, INPUT_PULLUP);
  pinMode(pinTipkaDesna, INPUT_PULLUP);
  // 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 peljiNaprej(){
  motor(pinMotorA1, pinMotorA2, 1);
  delay(150);
  motor(pinMotorB1, pinMotorB2, 1);
}

void peljiNazaj(){
  motor(pinMotorA1, pinMotorA2, -1);
  delay(150);  
  motor(pinMotorB1, pinMotorB2, -1);
}

void peljiVDesno(){
  motor(pinMotorA1, pinMotorA2, 1);
  motor(pinMotorB1, pinMotorB2, 0);
}

void peljiVLevo(){
  motor(pinMotorA1, pinMotorA2, 0);
  motor(pinMotorB1, pinMotorB2, 1);
}

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

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

void ustavi(){
  motor(pinMotorA1, pinMotorA2, 0);
  motor(pinMotorA1, pinMotorA2, 0);
}

void loop() {
  if ( (digitalRead(pinTipkaLeva) == LOW)
    && (digitalRead(pinTipkaDesna) == LOW) ) {
    // Obe tipki sta sklenjeni, ovira pred nami, 
    // zato pomik nazaj, nato obrni v desno
    peljiNazaj(); delay(300);
    vrtiVDesno(); delay(400);
  } 
  else if (digitalRead(pinTipkaLeva) == LOW) {
    // Pritisnjena leva tipka, ovira na levi, 
    // zato pomik nazaj, nato obrni v desno
    peljiNazaj(); delay(300);
    vrtiVDesno(); delay(400);
  }
  else if (digitalRead(pinTipkaDesna) == LOW) {
    // Pritisnjena desna tipka, ovira na desni, 
    // zato pomik nazaj, nato obrni v levo
    peljiNazaj(); delay(300);
    vrtiVLevo(); delay(400);
  }  
  else {
    // Pritisnjena nobena tipka, vozi naprej
    peljiNaprej();
  } 
}