/hardware/

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);
  }
}