drti

Prvi koraki v Arduino – avtomobilček

 

Milan Gaberšek in Slavko Kocijančič , članek v reviji TIM, številka 10, letnik 2019/20

 

V desetem zaporednem prispevku na temo Prvi koraki v Arduino bomo krmilnik Arduino uporabili za krmiljenje modela avtomobilčka. Prek štirih tipk bomo lahko avtomobilček premikali levo, desno, naprej in nazaj. Pri tem bomo poleg Arduina uporabili tiskano vezje H-mostič – modul z dvema integriranima vezjema L9110. Modul omogoča, da Arduino lahko krmili dva enosmerna motorčka za poganjanje levega in desnega kolesa avtomobilčka. V naslednjih prispevkih bomo model avtomobilčka nadgradili tako, da tipke za ročno krmiljenje ne bodo potrebne in bo vožnja avtonomna.

 

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

 

 

//
// Program Arduino -
// avtomobileek

// Pina tipk za krmiljenje motorja levega kolesa
const int pinTipkaA1 = 2;
const int pinTipkaA2 = 3;
// Pina tipk za krmiljenje motorja desnega kolesa
const int pinTipkaB1 = 4;
const int pinTipkaB2 = 5;
//Pina za krmiljenje

// Pina motoreka levega kolesa za modul L9110
const int pinMotorA1 = 9;
const int  pinMotorA2 = 10;

// Pina motoreka desnega kolesa za modul L9110
const int pinMotorB1 = 11;
const int  pinMotorB2 = 12;

// Nastavitev vhodov in izhodov krmilnika Arduina
void setup() {
  // Nastavitev tipk
  pinMode(pinTipkaA1, INPUT_PULLUP);
  pinMode(pinTipkaA2, INPUT_PULLUP);
  pinMode(pinTipkaB1, INPUT_PULLUP);
  pinMode(pinTipkaB2, INPUT_PULLUP);
  // Nastavitev izhodov za motoreka
  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);
  }
}

// Preveri stanje tipk in vrni vrednost
// true, ee je pogoj izpolnjen, oziroma false, ee ni
bool preveriTipki(int pinTipka1, bool stanje1, int pinTipka2, bool stanje2) {
  if ( (digitalRead(pinTipka1) == stanje1)
    && (digitalRead(pinTipka2) == stanje2) ) {
      return true;
  } 
  else {
      return false;
  }
}

void loop() {
  // Motor levega kolesa
  int stanjeMotorja = 0; // Privzeto stanje - kolo se ne vrti
  if (preveriTipki(pinTipkaA1, HIGH, pinTipkaA2, LOW)) {
    stanjeMotorja = 1;  
  } 
  else if (preveriTipki(pinTipkaA1, LOW, pinTipkaA2, HIGH)) {
    stanjeMotorja = -1;
  }
  motor(pinMotorA1, pinMotorA2, stanjeMotorja);

  // Motor desnega kolesa
  int stanjeMotorja2 = 0; // Privzeto stanje - kolo se ne vrti
  if (preveriTipki(pinTipkaB1, HIGH, pinTipkaB2, LOW)) {
    stanjeMotorja2 = 1;
  } 
  else if (preveriTipki(pinTipkaB1, LOW, pinTipkaB2, HIGH)) {
    stanjeMotorja2 = -1;
  }
  motor(pinMotorB1, pinMotorB2, stanjeMotorja2);
}