Skocz do zawartości
mateusz797

W robocie inspekcyjnym obraca sie tylko jeden silnik - nie poprawne działanie

Pomocna odpowiedź

Napisano (edytowany)

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 pliku rar zostaly spakowane 3 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)

C) Kiedy nie ma w instrukcjach programu czujnika odleglosci lcd oraz serwa robot na zadane komendy : jazda do przodu przez x sek potem skret w prawo, jazda do tyłu oraz w lewo radzi sobie świetnie. Pozostaje tylko do rozwiazania problem w punkcie B.

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_20200625_182429.jpgIMG_20200625_182429.jpg

IMG_20200625_182453 (1).jpg

IMG_20200625_182453 (3).jpg

Downloads.rar

C.rar

Edytowano przez mateusz797
Zachęcam do używania bloku kodu

Udostępnij ten post


Link to post
Share on other sites

A warto przed zabraniem się do roboty poczytać trochę o tym, jak to działa... poza tym temat wałkowany na forum fafnaździesiąt razy co najmniej 😞

Cytuję za https://www.arduino.cc/en/reference/servo :

Cytat

On boards other than the Mega, use of the library disables analogWrite() (PWM) functionality on pins 9 and 10, whether or not there is a Servo on those pins.

A do jakiego pinu masz podłączony ENA?

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Serwomechanizm bardzo dobrze działa. Podlaczylem go pod PIN 10. W tym artykule są komendy serwomechanizmu. A tutaj chodzi o to że jeden silnik się nie obraca. Ena jest do 9 pinu podłączony. 

Edytowano przez mateusz797

Udostępnij ten post


Link to post
Share on other sites

Czego nie zrozumiałeś w moim poprzednim poście? Rozumiem, że problemy z angielskim a translator googla pewnie Ci ukradli... pozwolę sobie skorzystać z owego translatora i przetłumaczyć zdanie które przytoczyłem:

Cytat

Na płytach innych niż Mega użycie biblioteki wyłącza funkcję analogWrite () (PWM) na pinach 9 i 10, niezależnie od tego, czy na tych pinach znajduje się serwomechanizm.

Tłumaczenie z googla...

Dalej nie rozumiesz?

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Jak podlaczylem ENA pod pin 2 to dalej nie działa. Czemu? Mam arduino UNO.

Szczegółowe podłaczenie mostka L298N

ENA - 2,

IN 1 - 7,

IN 2- 6,

IN 3 - 4

IN 4 - 5

ENB - 3

Piny : 3,5,6 - PWM, 7,4 nie maja tego znaczka PWM.

 

Edytowano przez mateusz797

Udostępnij ten post


Link to post
Share on other sites

Cześć, 

Po licznych testach robot zaczal poprawnie działac. Wykrywa przeszkody wykonane z różnych materialow pod każdym kątem. 

Miłego ogladania 🙂

 

Udostępnij ten post


Link to post
Share on other sites

@mateusz797 faktycznie, teraz robot radzi sobie całkiem dobrze 🙂

Już wiesz co poprzednio było źle zrobione? Rozwiązanie Twojego problemu może przydać się komuś w przyszłości.

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Wczesniej zakres odległości byl na 40 i 50cm. Jak robot podjezdzal pod kątem wskazywal odleglosc 2300cm od przeszkody i uderzal w nia z impetem. Teraz zmienilem parametry losowo. Zadziałalo 

Zakres odległości jest nast. :

A. Jesli robot widzi przeszkode w odl mniejsze niz 50cm i większe od 500cm- skreca w prawo, 

B. Jesli 45cm w lewo. 

 

U mnie jest ustawione tak ze w zaleznosci co odczyta skreca w lewo lub w prawi i analizuje kazde pole wolna skrecajac. Tez jest dobre rozwiazanie. 

Jest mozliwosc zeby robot moj w przyszlosci skanowal dystans i tam gdzie jest miejsce skręcał? Trzeba by zastosowac instrukcje z for dla okreslonego kata serwa. 

Edytowano przez mateusz797

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...