Robot wykrywający przeszkody
2011-11-05 14:25:13
//określamy, które piny sterują silnikami
//piny sterujące prędkością silników
int EN1 = 6;
int EN2 = 5;
//piny sterujące kierunkiem jazdy
int IN1 = 7;
int IN2 = 4;
int R = 1; //jazda do przodu
int F = 0; //jazda do tyłu
//pin pod który jest podłączony czujnik
int SEN1 = 8;
//funkcje sterujące silnikami – pwm określa prędkość, reverse kierunek
void Motor1(int pwm, boolean reverse) {
analogWrite(EN1,pwm); //ustawia wypełnienie PWM: 0 - silnik zatrzymany, 255 - pełna prędkość
if(reverse) {
digitalWrite(IN1,HIGH);
}else{
digitalWrite(IN1,LOW);
}
}
void Motor2(int pwm, boolean reverse) {
analogWrite(EN2,pwm); //ustawia wypełnienie PWM: 0 - silnik zatrzymany, 255 - pełna prędkość
if(reverse) {
digitalWrite(IN2,HIGH);
}else{
digitalWrite(IN2,LOW);
}
}
//dla drugiego silnika identycznie, tylko IN1 i EN1 zamienione są na IN2 i EN2
void setup(){
int i;
for(i=4;i pinMode(i, OUTPUT); //ustaw piny 4,5,6,7 jako wyjścia
}
pinMode(SEN1,INPUT); //pin pod który podłączono czujnik jako wejście
}
void loop() {
boolean in_range;
in_range = !digitalRead(SEN1); //aktywnym stanem czujnika IR jest 0
//(znak '!' oznacza negację)
if(in_range) {//jeśli wykryto przeszkodę
Motor1(255,R);//jedź do tyłu
Motor2(255,R);
delay(1000); //przez sekundę
Motor1(255,R); //skręcaj
Motor2(255,F);
delay(1000);//przez sekundę
}
else {//jeśli nie widać przeszkody
Motor1(255,F); //jedź prosto
Motor2(255,F);
}
}
wystarczy zamontować inaczej czujnik i przestawić
in_range = !digitalRead(SEN1);
na
in_range = digitalRead(SEN1);
by nasz robot nie spadł z stołu
2 wersja programu
Zachowanie podobne jeśli przeszkoda jest nieruchoma. Jeśli jednak zbiliza się robot zaczyna się cofać. By było to bezpieczne potrzeba jeszcze jednej czujki z tyłu pojazdu, której na razie nie posiadam ;/
//określamy, które piny sterują silnikami
//piny sterujące prędkością silników
int EN1 = 6;
int EN2 = 5;
//piny sterujące kierunkiem jazdy
int IN1 = 7;
int IN2 = 4;
int R = 1; //jazda do przodu
int F = 0; //jazda do tyłu
//pin pod który jest podłączony czujnik
int SEN1 = 8;
//funkcje sterujące silnikami – pwm określa prędkość, reverse kierunek
void Motor1(int pwm, boolean reverse) {
analogWrite(EN1,pwm); //ustawia wypełnienie PWM: 0 - silnik zatrzymany, 255 - pełna prędkość
if(reverse) {
digitalWrite(IN1,HIGH);
}else{
digitalWrite(IN1,LOW);
}
}
void Motor2(int pwm, boolean reverse) {
analogWrite(EN2,pwm); //ustawia wypełnienie PWM: 0 - silnik zatrzymany, 255 - pełna prędkość
if(reverse) {
digitalWrite(IN2,HIGH);
}else{
digitalWrite(IN2,LOW);
}
}
//dla drugiego silnika identycznie, tylko IN1 i EN1 zamienione są na IN2 i EN2
void setup(){
int i;
for(i=4;i pinMode(i, OUTPUT); //ustaw piny 4,5,6,7 jako wyjścia
}
pinMode(SEN1,INPUT); //pin pod który podłączono czujnik jako wejście
}
int stan = 1;
void loop() {
boolean in_range;
in_range = !digitalRead(SEN1); //aktywnym stanem czujnika IR jest 0
//(znak '!' oznacza negację)
if(in_range) {//jeśli wykryto przeszkodę
Motor1(255,R);//jedź do tyłu
Motor2(255,R);
stan = 0;
}else {//jeśli nie widać przeszkody
if(stan == 0){
Motor1(255,R); //skręcaj
Motor2(255,F);
delay(500);//przez sekundę
stan = 1;
}
Motor1(255,F); //jedź prosto
Motor2(255,F);
}
}