Okazuje się, że robot może mieć czuprynkę. Może niezbyt estetyczną, ale kolorową. To plątanina kabli. Mikrokontroler, układ scalony sterujący kierunkiem obrotów silników, serwo modelarskie i czujnik ultradźwiękowy. Dzisiaj próbowaliśmy to wszystko razem oprogramować. Robot ma jechać do przodu i czujnikiem ultradźwiękowym „wymacywać” przeszkody. Jeżeli taką dostrzeże daje silnikom stop, cała wstecz i zakręca tam gdzie więcej miejsca. Tyle w teorii. W praktyce prawie też.
Tradycyjnie filmik, zdjęcie (miss robotów nie zostanie, ale jest swój) oraz kod programu. Uczniowie na zajęciach mocno go przerabiali i pewnie jeszcze będą.
I jak zawsze kod programu
#include <Servo.h>
// ——————————
int silnik_lewy[] = {2, 3};
int silnik_prawy[] = {7, 8};
// ultradzwiekowy czyli czujnik na głowie robota
int trig = 11; // Numer pinu wyzwolenia
int echo = 10; // Numer pinu odpowiedzi
int czas, odleglosc_lewa, odleglosc,odleglosc_prawa; //czas trwania
impulsu, pomiary stron
Servo myservo; //definicja serwa czyli glowy robota
// ——————————
void setup() {
Serial.begin(9600);
// do silników
int i;
for(i = 0; i < 2; i++){
pinMode(silnik_lewy[i], OUTPUT);
pinMode(silnik_prawy[i], OUTPUT);
}
// ustalenie co z czym jesli chodzi o ultradzwiękowy – wysyłanie i
odbiór sygnału
pinMode(trig, OUTPUT);
pinMode(echo, INPUT);
myservo.attach(5);
}
// ——————————
void loop() {
silniki_stop();
delay(20);
Odleglosc_pomiar();//robot zaczyna ostrożnie od pomiaru przed nim
Serial.println(odleglosc);
Serial.println(odleglosc_lewa)
if(odleglosc<=17){ //odebrał pomiar przodu jeżli trochę krótko
(równo lub mniej niż 17)
Odleglosc_prawa(); //zerka w prawo
Odleglosc_lewa(); //zerka w lewo
myservo.write(90); //pozycja serwa srodek po spojrzeniu
if(odleglosc_lewa>=odleglosc_
podjecia decyzji
jazda_tyl(); //trochę cofnie
delay(800);
zakret_lewo(); //lepiej w lewo
delay(550);
}
else{ //odwrotnie z wolnym polem
jazda_tyl(); //troche cofnie
delay(800);
zakret_prawo(); //lepiej w prawo
delay(550);
}
}
else{//nie zaszedł warunek odleglosc wieksza niz zakladana
jazda_przod(); //zaiwaniam do przodu
delay(400);
}
}
// ——————————
void silniki_stop(){
digitalWrite(silnik_lewy[0], LOW);
digitalWrite(silnik_lewy[1], LOW);
digitalWrite(silnik_prawy[0], LOW);
digitalWrite(silnik_prawy[1], LOW);
delay(25);
}
void jazda_przod(){
digitalWrite(silnik_lewy[0], HIGH);
digitalWrite(silnik_lewy[1], LOW);
digitalWrite(silnik_prawy[0], HIGH);
digitalWrite(silnik_prawy[1], LOW);
}
void jazda_tyl(){
digitalWrite(silnik_lewy[0], LOW);
digitalWrite(silnik_lewy[1], HIGH);
digitalWrite(silnik_prawy[0], LOW);
digitalWrite(silnik_prawy[1], HIGH);
}
void zakret_lewo(){
digitalWrite(silnik_lewy[0], LOW);
digitalWrite(silnik_lewy[1], HIGH);
digitalWrite(silnik_prawy[0], HIGH);
digitalWrite(silnik_prawy[1], LOW);
}
void zakret_prawo(){
digitalWrite(silnik_lewy[0], HIGH);
digitalWrite(silnik_lewy[1], LOW);
digitalWrite(silnik_prawy[0], LOW);
digitalWrite(silnik_prawy[1], HIGH);
}
//definicja pomiarow
void Odleglosc_pomiar(){ //pomiar przodu bez ruchu serwa na boki
delay(50);
digitalWrite(trig, HIGH);
delayMicroseconds(1000);
digitalWrite(trig, LOW);
czas = pulseIn(echo, HIGH);
odleglosc = (czas/2) /29.1;
Serial.println(odleglosc);
}
void Odleglosc_lewa(){ //pomiar lewej strony z ruchem serwa
myservo.write(160);
delay(1000);
delay(50);
digitalWrite(trig, HIGH);
delayMicroseconds(1000);
digitalWrite(trig, LOW);
czas = pulseIn(echo, HIGH);
odleglosc_lewa = (czas/2) /29.1;
}
void Odleglosc_prawa(){ //pomiar prawej strony z ruchem serwa
myservo.write(20);
delay(1000);
delay(50);
digitalWrite(trig, HIGH);
delayMicroseconds(1000);
digitalWrite(trig, LOW);
czas = pulseIn(echo, HIGH);
odleglosc_prawa = (czas/2) /29.1;
}