02-07-2020, 09:39
Dzień dobry,
W ostatnim czasie postanowiłem zbudować robota inspekcyjnego na bazie platformy arduino. Ma on na celu wykrywanie przeszkód oraz ich omijanie. Pierwszy program jaki napisałem miał na celu wysterowanie silników. Drugi program ma na celu wysterowanie silników w następujący sposób:
a) Jesli przeszkoda oddalona jest wiecej niz 15cm robot ma jechac prosto - dwa silniki kreca sie w jednakowa strone
b) Jesli przeszkoda oddalona jest o mniej niz 15 cm robot ma zatrzymac sie i skrecic w prawo, czyli lewy silnik ma sie krecic do przodu a prawy do tyłu.
1. Ponizszy program majacy na celu sprawdzenie wysterowania silnikow tylko działa prawidłowo - sterowanie silnikami , kupiłem nowy mostek H, silniki poprawnie sie przełączaja oraz obracaja sie w zaleznosci od wpisanych predkosci do programu
(niepoprawnie działa tylko program nr 2 mimo nadania takich samych stanow logicznych oraz pinow dla silnikow)
const int IN1 = 7;
const int IN2 = 6;
const int IN3 = 4;
const int IN4 = 5;
const int ENA = 9;
const int ENB = 3;
void setup() {
pinMode (IN1, OUTPUT);
pinMode (IN2, OUTPUT);
pinMode (IN3, OUTPUT);
pinMode (IN4, OUTPUT);
pinMode (ENA, OUTPUT);
pinMode (ENB, OUTPUT);
}
void loop() {
delay(4000);
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
analogWrite(ENA, 90);
// 90/256 predkosc analogWrite(ENB, 90); // Syt. 1 - Prosto
delay(4000); digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
analogWrite(ENA, 90);
analogWrite(ENB, 90);
delay(4000); }
2. Program koncowy nie dziala poprawnie - obraca sie tylko prawy silnik w jedna strone , robot jak zauwazy przeszkode to obraca czujnik odleglosci na serwomechanizmie, ale nie skręca.
Takie same sa ustawione piny i stany na silnikach.
Kod :
#include <LiquidCrystal_I2C.h>
#include <Wire.h> // zalacz biblioteki
#include <Servo.h> Servo myservo;
const int trigPin = 12;
const int echoPin = 11;
const int IN1 = 7;
const int IN2 = 6;
const int IN3 = 4;
const int IN4 = 5;
const int ENA = 9;
const int ENB = 3;
LiquidCrystal_I2C lcd(0x27,16,2);
float duration, distance;
void setup() {
lcd.init();
lcd.backlight ();
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
myservo.attach(10);
Serial.begin(9600);
myservo.write(104);
delay(500);
myservo.write(180);
delay(500);
myservo.write(0);
delay(500);
myservo.write(104);
delay(500);
pinMode (IN1, OUTPUT);
pinMode (IN2, OUTPUT);
pinMode (IN3, OUTPUT);
pinMode (IN4, OUTPUT);
pinMode (ENA, OUTPUT);
pinMode (ENB, OUTPUT);
}
void loop() {
lcd.clear();
lcd.setCursor (0,0);
lcd.print ("Odleglosc:");
lcd.setCursor (0,1);
lcd.println (distance);
lcd.setCursor (5,1);
lcd.print ("cm");
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration*.0343)/2;
Serial.print("Distance: ");
Serial.println(distance);
delay(300);
if (distance < 15){
myservo.write(180);
delay(500);
myservo.write(0);
delay(500);
myservo.write(104);
delay(500);
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
analogWrite(ENA, 120); // skret
analogWrite(ENB, 120);
}
if (distance > 15){
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
analogWrite(ENA, 120); // jazda prosto
analogWrite(ENB, 120);
}
}
W linku
https://forbot.pl/forum/topic/18367-w-ro...ent-149899
w jednym pliku rar na samym dole zostaly spakowane 2 filmiki
A) jeden pokazuje dzialanie pierwszego programu - poprawne przelaczanie oraz obroty z zadana predkoscia w programie silnikow
B) Kiedy robot nie widzi przeszkody porusza jednym silnikiem - kiedy zauwazy takze cofa tylko jednym (Program nie działa poprawnie według zadanych komend w konsoli)
Czy mogliby Państwo wyjasnic , moze ktos miał podobna sytuacje dlaczego dla drugiego programu obraca sie tylko prawy silnik a lewy wogole sie nie rusza?
[img=148x0]https://forbot.pl/forum/uploads/monthly_2020_07/IMG_20200625_182429.thumb.jpg.264badb6f86442642f50844bf4064585.jpg[/img][img=148x0]https://forbot.pl/forum/uploads/monthly_2020_07/IMG_20200625_182429.thumb.jpg.07257a5b4680e7c1b60c67b06d878c3e.jpg[/img]
Pozdrawiam,
Mateusz[img=298x0]https://forbot.pl/forum/uploads/monthly_2020_07/1956176438_IMG_20200625_182453(1).thumb.jpg.4dfa9db24b345bb024c3e1a0788ddead.jpg[/img]
[img=298x0]https://forbot.pl/forum/uploads/monthly_2020_07/1223255192_IMG_20200625_182453(3).thumb.jpg.df3bb52ba6c65884a56b569c389446be.jpg[/img]
W ostatnim czasie postanowiłem zbudować robota inspekcyjnego na bazie platformy arduino. Ma on na celu wykrywanie przeszkód oraz ich omijanie. Pierwszy program jaki napisałem miał na celu wysterowanie silników. Drugi program ma na celu wysterowanie silników w następujący sposób:
a) Jesli przeszkoda oddalona jest wiecej niz 15cm robot ma jechac prosto - dwa silniki kreca sie w jednakowa strone
b) Jesli przeszkoda oddalona jest o mniej niz 15 cm robot ma zatrzymac sie i skrecic w prawo, czyli lewy silnik ma sie krecic do przodu a prawy do tyłu.
1. Ponizszy program majacy na celu sprawdzenie wysterowania silnikow tylko działa prawidłowo - sterowanie silnikami , kupiłem nowy mostek H, silniki poprawnie sie przełączaja oraz obracaja sie w zaleznosci od wpisanych predkosci do programu
(niepoprawnie działa tylko program nr 2 mimo nadania takich samych stanow logicznych oraz pinow dla silnikow)
const int IN1 = 7;
const int IN2 = 6;
const int IN3 = 4;
const int IN4 = 5;
const int ENA = 9;
const int ENB = 3;
void setup() {
pinMode (IN1, OUTPUT);
pinMode (IN2, OUTPUT);
pinMode (IN3, OUTPUT);
pinMode (IN4, OUTPUT);
pinMode (ENA, OUTPUT);
pinMode (ENB, OUTPUT);
}
void loop() {
delay(4000);
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
analogWrite(ENA, 90);
// 90/256 predkosc analogWrite(ENB, 90); // Syt. 1 - Prosto
delay(4000); digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
analogWrite(ENA, 90);
analogWrite(ENB, 90);
delay(4000); }
2. Program koncowy nie dziala poprawnie - obraca sie tylko prawy silnik w jedna strone , robot jak zauwazy przeszkode to obraca czujnik odleglosci na serwomechanizmie, ale nie skręca.
Takie same sa ustawione piny i stany na silnikach.
Kod :
#include <LiquidCrystal_I2C.h>
#include <Wire.h> // zalacz biblioteki
#include <Servo.h> Servo myservo;
const int trigPin = 12;
const int echoPin = 11;
const int IN1 = 7;
const int IN2 = 6;
const int IN3 = 4;
const int IN4 = 5;
const int ENA = 9;
const int ENB = 3;
LiquidCrystal_I2C lcd(0x27,16,2);
float duration, distance;
void setup() {
lcd.init();
lcd.backlight ();
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
myservo.attach(10);
Serial.begin(9600);
myservo.write(104);
delay(500);
myservo.write(180);
delay(500);
myservo.write(0);
delay(500);
myservo.write(104);
delay(500);
pinMode (IN1, OUTPUT);
pinMode (IN2, OUTPUT);
pinMode (IN3, OUTPUT);
pinMode (IN4, OUTPUT);
pinMode (ENA, OUTPUT);
pinMode (ENB, OUTPUT);
}
void loop() {
lcd.clear();
lcd.setCursor (0,0);
lcd.print ("Odleglosc:");
lcd.setCursor (0,1);
lcd.println (distance);
lcd.setCursor (5,1);
lcd.print ("cm");
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration*.0343)/2;
Serial.print("Distance: ");
Serial.println(distance);
delay(300);
if (distance < 15){
myservo.write(180);
delay(500);
myservo.write(0);
delay(500);
myservo.write(104);
delay(500);
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
analogWrite(ENA, 120); // skret
analogWrite(ENB, 120);
}
if (distance > 15){
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
analogWrite(ENA, 120); // jazda prosto
analogWrite(ENB, 120);
}
}
W linku
https://forbot.pl/forum/topic/18367-w-ro...ent-149899
w jednym pliku rar na samym dole zostaly spakowane 2 filmiki
A) jeden pokazuje dzialanie pierwszego programu - poprawne przelaczanie oraz obroty z zadana predkoscia w programie silnikow
B) Kiedy robot nie widzi przeszkody porusza jednym silnikiem - kiedy zauwazy takze cofa tylko jednym (Program nie działa poprawnie według zadanych komend w konsoli)
Czy mogliby Państwo wyjasnic , moze ktos miał podobna sytuacje dlaczego dla drugiego programu obraca sie tylko prawy silnik a lewy wogole sie nie rusza?
[img=148x0]https://forbot.pl/forum/uploads/monthly_2020_07/IMG_20200625_182429.thumb.jpg.264badb6f86442642f50844bf4064585.jpg[/img][img=148x0]https://forbot.pl/forum/uploads/monthly_2020_07/IMG_20200625_182429.thumb.jpg.07257a5b4680e7c1b60c67b06d878c3e.jpg[/img]
Pozdrawiam,
Mateusz[img=298x0]https://forbot.pl/forum/uploads/monthly_2020_07/1956176438_IMG_20200625_182453(1).thumb.jpg.4dfa9db24b345bb024c3e1a0788ddead.jpg[/img]
[img=298x0]https://forbot.pl/forum/uploads/monthly_2020_07/1223255192_IMG_20200625_182453(3).thumb.jpg.df3bb52ba6c65884a56b569c389446be.jpg[/img]