Skocz do zawartości

Kurs budowy robotów - #4 - pierwsze programowanie


Pomocna odpowiedź

Totalnie nie rozumiem, czemu w poniższym kodzie mój robot płynnie się rozpędza, płynnie hamuje po czym ponownie się nie rozpędza 🙁. Raz się rozpędzi, raz przyhamuje po czym cały czas działa na najniższych ustawionych obrotach

/*Płynny rozruch i hamowanie jednego z silników robota poprzez PWM

Oznaczenia:
 L (left) – lewy,
 R (right) – prawy,
 DIR (direction) – kierunek,
 PWM – pin, na który podajemy sygnał PWM ustawiający prędkość danego silnika

 1. Obrót w prawo - płynne rozpędzanie
 2. Obrót w lewo - płynne rozpędzanie*/

#define PWM_MAX 165 //ustalenie maksymalnego wypełnienia sygnału podawanego na silniki
#define PWM_MIN 110 //ustalenie minimalnego wypełnienia sygnąłu podawanego na silniki

// przypisanie pinów dla lewego silnika
#define L_PWM 5
#define L_DIR 4 
//przypisanie pinów dla prawego silnika
#define R_PWM 6
#define R_DIR 9

void setup()  {

//zdefiniowanie pinów

 //konfiguracja pinów mostka H
 pinMode(L_PWM, OUTPUT);
 pinMode(L_DIR, OUTPUT); //lewy silnik

 pinMode(R_PWM, OUTPUT);
 pinMode(R_DIR, OUTPUT); //prawy silnik
}

void loop() {
 RightMotorAcceleration(PWM_MIN, PWM_MAX);
 delay(8500);

 stopMotors();
 delay(1000);

}

//FUNKCJA STERUJĄCA ROZPĘDZANIEM PRAWEGO SILNIKA
void RightMotorAcceleration (int przyspieszanie, int zwalnianie)  { //tworzę funkcję do obsługi silnika prawego
 for (przyspieszanie = PWM_MIN; przyspieszanie < PWM_MAX; przyspieszanie++)  {  //przyspieszanie silnika
   digitalWrite(L_DIR, 0); //ustaw kierunek jazdy na "do przodu", 0 - do przodu, 1 - do tyłu, zgodnie z tabelą prawdy mostka H
   analogWrite(L_PWM, przyspieszanie); //ustaw wypełnienie sygnału na wartość przyspieszenie
   delay(100);
 }

 for (zwalnianie = PWM_MAX; zwalnianie > PWM_MIN; zwalnianie--)  { //zwalnianie silnika
   digitalWrite(L_DIR, 0); //ustaw kierunek jazdy na "do przodu", 0 - do przodu, 1 - do tyłu, zgodnie z tabelą prawdy mostka H
   analogWrite(L_PWM, zwalnianie); //ustaw wypełnienie sygnału na wartość przyspieszenie
   delay(100);
 }
}
//FUNKCJA ZATRZYMUJĄCA ROBOTA
void stopMotors() {
 analogWrite(L_PWM, 0);  //ustaw wypełnienie sygnału na 0 - czyli stop lewego silnika
 analogWrite(R_PWM, 0);  //ustaw wypełnienie sygnału na 0 - czyli stop prawego silnika
}

Kozi, proponowałbym zacząć szukanie problemu od dodania jakiegoś prostego "debugowania".

Dodaj np. na początku funkcji RightMotorAcceleration komendę włączającą diodę świecącą/buzzer, a w funkcji stopMotors wyłączaj diodę. Dzięki temu będziesz widział, czy program po drodze nigdzie nie utyka. Sprawdź, co się dzieje z diodą 🙂

  • Lubię! 1
Kozi, proponowałbym zacząć szukanie problemu od dodania jakiegoś prostego "debugowania".

Dodaj np. na początku funkcji RightMotorAcceleration komendę włączającą diodę świecącą/buzzer, a w funkcji stopMotors wyłączaj diodę. Dzięki temu będziesz widział, czy program po drodze nigdzie nie utyka. Sprawdź, co się dzieje z diodą 🙂

Dzień dobry Treker, dziękuje za pomoc.

Jestem gapa i ustawiłem za krótki czas (dałem tylko 8.5 sekundy) żeby robot się rozpędził, przyhamował i znowu się rozpędził. Po usunięciu funkcji StopMotors (czyli robot cały czas działał w funkcji RightMotorAcceleration) wszystko działa poprawnie.

Głupio mi teraz 😋

Jestem gapa i ustawiłem za krótki czas (dałem tylko 8.5 sekundy) żeby robot się rozpędził, przyhamował i znowu się rozpędził.

Czy na pewno 🙂? Opóźnienie 8.5 sekundy nie miało nic wspólnego z czasem trwania tego "rozpędu i hamowania". W wersji programu, którą wkleiłeś robot rozpędzał się i hamował. Następnie przez 8.5 sekundy jechał z prędkością Vmin, a później wyłączał silniki na 1 sekundę. Reasumując to dłuższe opóźnienie nie powinno mieć wpływu na samo rozpędzanie i hamowanie robota.

Jestem gapa i ustawiłem za krótki czas (dałem tylko 8.5 sekundy) żeby robot się rozpędził, przyhamował i znowu się rozpędził.

Czy na pewno 🙂? Opóźnienie 8.5 sekundy nie miało nic wspólnego z czasem trwania tego "rozpędu i hamowania". W wersji programu, którą wkleiłeś robot rozpędzał się i hamował. Następnie przez 8.5 sekundy jechał z prędkością Vmin, a później wyłączał silniki na 1 sekundę. Reasumując to dłuższe opóźnienie nie powinno mieć wpływu na samo rozpędzanie i hamowanie robota.

Ojej!! Ależ oczywiście!! Z godzinę się zastanawiałem o co Ci chodzi. Dopiero teraz załapałem, że ten wycinek kodu (cały wkleiłem we wcześniejszym poście):

void loop() { 
  RightMotorAcceleration(PWM_MIN, PWM_MAX); 
  delay(8500); 
} 

to oznacza:

1. Rozpędź się do PWM_MAX

2. Wyhamuj do PWM_MIN

3. Trwaj w tym stanie (minimalnej prędkości) przez 8,5 sekundy.

Wcześniej to rozumiałem:

Rozpędzaj się i hamuj PRZEZ 8.5 sekundy

Dzięki za pomoc.

Kozi, super, cieszę się, że teraz wszystko jest jasne 🙂 Jeśli chciałbyś, aby robot rozpędzał się przez 8,5 sekundy należałoby podawać tę wartość do funkcji rozpędzającej jako osobny argument i wykorzystać ją do obliczenia czasu, który należy odczekać po każdej zmianie prędkości w pętli for.

  • 2 miesiące później...

Hej mam problem ze swoją shieldem do zestawu. Być może to wynika z mojej nieuwagi i nie ostrożnego obchodzenia się z nią, ale nie zasila ona mojej płytki Arduino. Jak mogę sprawdzić czy czegoś przypadkiem nie przypaliłem. Wcześniej podczas włączonego zasilania podłączyłem kabel USB no i pojawił się dym. Problem pojawia się na styku zasialania zewnętrznego przez shield i płytki Arduino. Po którym pinie z shieldu idzie zasilanie do płytki? Dziś raz udało mi się uruchomić silniki tylko na zewnętrznym zasilaniu. Poproszę o informację jak dokładnie mogę zdiagnozować konkretną przyczynę.

PS. Odnośnie kodu do pracy silnika. Nie zabezpieczyłeś się w żaden sposób przed podaniem wartości prędkości większej od 100. Gdy wpisujesz z palca wszystko jest OK, ale gdybyś np. chciał przyspieszać pilotem to w pewnym momencie ta wartość może przekroczyć 100.

Moja propozycja:

void rightMotor(int velocity) {
 correctVelocity( velocity);
 if (velocity > 0) { //Jesli predkosc jest wieksza od 0 (dodatnia)
   velocity = map(velocity, 0, 100, 0, PWM_MAX);
   digitalWrite(R_DIR, 0); //Kierunek: do przodu
   analogWrite(R_PWM, velocity); //Ustawienie predkosci 
 } else {
   velocity = abs(velocity); //Funkcja abs() zwroci wartosc velocity  bez znaku
   velocity = map(velocity, 0, 100, 0, PWM_MAX);
   digitalWrite(R_DIR, 1); //Kierunek: do tyłu
   analogWrite(R_PWM, velocity); //Ustawienie predkosci    
 }
}
void correctVelocity(int &velocity){
 if (velocity > 100){
   velocity = 100;
 }
 if (velocity < -100){
   velocity = -100;
 }
}

Mattiz, witam na forum 🙂 Dziwna sprawa, ponieważ podłączenie przewodu USB nie ma prawa powodować takich przypadłości... Czy przypadkiem niczego gdzieś nie zwarłeś? Aktualnie nie mam płytki pod ręką - sprawdzę temat rano, co dokładnie mogło się stać. Co dokładnie dzieje się teraz, gdy podłączysz zasilanie do shielda i włączysz przełącznik?

Wgrałem program by świeciła dioda podłączona do pinu 13. Po włączeniu przełącznika na shieldzie, dioda PWR świeci, natomiast dioda D13 niestety nie. Starałem się podłączyć kable do wtyk jak najlepiej, ale z braku odpowiedniego śrubokręta przykręciłem je nożem. Silniki startują wtedy, gdy jest podłączone zasilanie do shielda i do Arduino, gdy shield jest włączony.

Raczej niczego nie zwarłem poza włączeniem w pewnym momencie zasialnia zewnętrznego, zasilania USB i ustawienia przełącznika w trybie ON. Wczoraj byłem bardzo zmęczony, a silniki odmawiały posłuszeństwa. W tej chwili nie mam nic podłaczonego do robota prócz silników i zewnętrznego zasilania.

Mattiz, jeśli przewody są zamocowane poprawnie i nie wystają ze złącz, to powinno być dobrze (jeśli wystają mogło dojść do zwarcia). Czyli dym pojawił się podczas podłączania przewodu USB przy włączonym zasilaniu, tak? Czy płytka wcześniej działała, czy to było pierwsze podłączenie?

Wybacz, że aż tyle pytań, ale to pierwsza taka sytuacja i muszę mieć więcej informacji, aby znaleźć przyczynę tego problemu 🙂

Dym pojawił się po tym, gdy przy tak podłączonym zasilaniu ustawiłem włącznik w pozycji ON. Płytka wcześniej działała, ale miałem problemy z uruchomieniem silników. Teraz też działa tylko nie przekazuje zasilania do Arduino. Problem może dotyczyć gniazda bądź złącza zasilania. Ale jak już mówiłem wcześniej dziś raz udało mi się zmusić silniki do pracy tylko na zasilaniu zewnętrznym. Wyłączyłem robota, po chwili go włączyłem bez zmian kodu czy też połączeń i już nie chciał ze mną współpracować. Pytaj to ja potrzebuję pomocy. Nie mówię, że czegoś nie przypaliłem.

Mattiz, po konsultacji z producentem płytki niestety nie wiemy, co mogło się stać (prawdopodobnie nastąpiło gdzieś zwarcia). Sprawa jest o tyle dziwna, że tak jak mówisz na początku wszystko działało + nigdy wcześniej nie było takiego przypadku. Będziemy musieli przyjrzeć się Twojej płytce z bliska. Odezwę się do Ciebie na PW w kwestii odebrania shielda.

  • 2 miesiące później...

Witam serdecznie,
właśnie skończyliśmy z synem prace związane z mechaniką robota i wgraliśmy skopiowany z kursu kod źródłowy do arduino.

Niestety brak oznak życia robota.

Nasze spostrzeżenia to migająca dioda LED 13 i robot działa tylko gdy jest podłączony do komputera.

Prosimy o pomoc.

Pozdrawiamy

Niestety brak oznak życia robota.

Nasze spostrzeżenia to migająca dioda LED 13 i robot działa tylko gdy jest podłączony do komputera.

goszek29, witam na forum 🙂 Jeśli dioda LED13 miga, to znaczy, że w Arduino jest wgrany domyślny program Arduino i nowy nie został wgrany (każde Arduino wyciągnięte z prosto z pudełka właśnie tak miga). Dodatkowo: Czy diody od zasilania na shieldzie się świecą? Czy przełącznik jest w odpowiedniej pozycji? Czy zasilanie jest podłączone tak jak na zdjęciach 🙂? Im więcej szczegółów, tym łatwiej będzie znaleźć wspólnie rozwiazanie 😉

Dziękujemy bardzo za odpowiedź.

Jeżeli chodzi o diody sygnalizujące zasilanie na shieldzie zachowują się tak jak na zdjęciach.

Program wgrany poprawnie.

Robot działa,ale tylko jak jest podłączony do komputera kablem USB.

Po odłączeniu od komputera przestaje działać.

Gdy robot podłączony do komputera działa zgodnie z kodem źródłowym a dioda LED 13 przestaje migać. Po odłączeniu robot przestaje działać a dioda zaczyna migać.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...