Arduino Polska Forum

Pełna wersja: Projekt robota inspekcyjnego - nie poprawne działanie silników
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
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]
Zanim zaczniesz tworzyć coś jeżdżącego powinieneś umieć nie korzystać z delay. Funkcja do tego dalmierza też blokuje loop.
W przedstawionych kodach ten pierwszy to działający? To w drugim jednak zmieniłeś to, że masz dwa razy analog write.
Różne biblioteki korzystają z różnych zasobów sprzętowych, jak coś działa OK i przestaje po dodaniu kolejnego elementu to pewnie jest konflikt, oczywiście dobrze to jest wiedzieć przed podłączeniem, ale ten moment gdy nie działa to najpóźniej gdy trzeba to sprawdzić.
Niestety w swoim kodzie masz delay, to jest OK gdy TYLKO odczytujesz temperaturę, TYLKO coś wyświetlasz, TYLKO sterujesz silnikiem, ale NIE jest OK gdy chcesz połączyć wiele funkcji/bibliotek w jednym kodzie. Jak robot zacznie jeździć szybciej to się okaże, że delaye są do zmiany bo zanim sprawdzi gdzie jest będzie kolizja. Może funkcja mierząca czas impulsu tu nie zaszkodzi mocno, ale jak czujnik ma pomiar do kilku metrów i to zwiększa czas pomiaru impulsu to można założyć, że jak jest dłużysz niż taki wynikający dla 15cm to przeszkody nie ma i można jechać, pomiar przerwać (timeout).