//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
pomocne linki
Wątek na formum związany z wykorzystaniem Arduino w robotyce:
http://www.forbot.pl/forum/topics20/kurs-arduino-kurs-wykorzystania-w-robotyce-vt5354.htm
Dokumętacja podzespołów:
http://www.dfrobot.com/wiki/index.php?title=Arduino_Motor_Shield_%28L293%29_%28SKU:_DRI0001%29
inne:
http://www.shop.kristech.eu/index.php?cPath=92_79&language=EN
Przydatny program:
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); } }