Prvi koraki v Arduino – avtomobilček
Milan
Gaberšek in Slavko Kocijančič
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);
}
|