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