Skocz do zawartości

Kurs budowy robotów - #4 - pierwsze programowanie


Komentator

Pomocna odpowiedź

Witam,

nie mam pojęcia czy już pojawiło się to pytanie ale po wgraniu programu i sprawdzeniu czy oba silniki działają poprawnie zauważyłem ze mój program nie czyta funkcji delay, koła kręcą się bez uśpienia na przykładową sekundę lub dwie. 

Czy ktoś wie dlaczego tak się dzieje ? Pozdrawiam

Link do komentarza
Share on other sites

Cześć

Nie widzę takiego problemu na forum - prawe koło kręci się cały czas w jedną stronę pomimo tego, że zadaję wartość np. -40 lub jak zmieniam R_DIR, 1 na 0.

Po podmianie złączy tak samo się dzieje tylko na lewym silniku więc wygląda na jakiś błąd w programie. Albo coś z płytką nie tak, co mam nadzieję że nie tak nie jest. 

Kod poniżej (skopiowany z kursu):

 

#define L_PWM 5
#define L_DIR 4
#define R_PWM 6
#define R_DIR 9
#define PWM_MAX 165
 
void setup() {
  //Konfiguracja pinow od mostka H
  pinMode(L_DIR, OUTPUT);
  pinMode(R_DIR, OUTPUT);
  pinMode(L_PWM, OUTPUT);
  pinMode(R_PWM, OUTPUT);
}
 
void loop() {
   rightMotor(60); //80% predkosci do przodu
  delay(2000);
  rightMotor(-40); //40% predkosci do tyłu
  delay(2000);
}
 
void leftMotor(int V) {
  if (V > 0) { //Jesli predkosc jest wieksza od 0 (dodatnia)
    V = map(V, 0, 100, 0, PWM_MAX);
    digitalWrite(L_DIR, 0); //Kierunek: do przodu
    analogWrite(L_PWM, V); //Ustawienie predkosci 
  } else {
    V = abs(V); //Funkcja abs() zwroci wartosc V  bez znaku
    V = map(V, 0, 100, 0, PWM_MAX);
    digitalWrite(L_DIR, 1); //Kierunek: do tyłu
    analogWrite(L_PWM, V); //Ustawienie predkosci    
  }
}
 
void rightMotor(int V) {
  if (V > 0) { //Jesli predkosc jest wieksza od 0 (dodatnia)
    V = map(V, 0, 100, 0, PWM_MAX);
    digitalWrite(R_DIR, 0); //Kierunek: do przodu
    analogWrite(R_PWM, V); //Ustawienie predkosci 
  } else {
    V = abs(V); //Funkcja abs() zwroci wartosc V  bez znaku
    V = map(V, 0, 100, 0, PWM_MAX);
    digitalWrite(R_DIR, 1); //Kierunek: do tyłu
    analogWrite(R_PWM, V); //Ustawienie predkosci    
  }
}
 
void stopMotors() {
  analogWrite(L_PWM, 0); //Wylaczenie silnika lewego
  analogWrite(R_PWM, 0); //Wylaczenie silnika prawego

 

Edytowano przez RysiekUP
Link do komentarza
Share on other sites

@RysiekUP a zrób inny test, bo to wygląda podejrzanie - jakb elektronika nie działała poprawnie.

W pętli loop() tylko:

digitalWrite(R_DIR, 1); //Kierunek: do tyłu
analogWrite(R_PWM, 200); //Ustawienie predkosci  
deelay(1000);
digitalWrite(R_DIR, 1); //Kierunek: do tyłu
analogWrite(R_PWM, 0); //Ustawienie predkosci 
deelay(1000); 

i zobacz czy będzie się co chwilęzatrzymywać.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

11 godzin temu, Gieneq napisał:

@RysiekUP a zrób inny test, bo to wygląda podejrzanie - jakb elektronika nie działała poprawnie.

W pętli loop() tylko:


digitalWrite(R_DIR, 1); //Kierunek: do tyłu
analogWrite(R_PWM, 200); //Ustawienie predkosci  
deelay(1000);
digitalWrite(R_DIR, 1); //Kierunek: do tyłu
analogWrite(R_PWM, 0); //Ustawienie predkosci 
deelay(1000); 

i zobacz czy będzie się co chwilęzatrzymywać.

Tak zatrzymuje się co chwilę (co sek) ale czy dam R_DIR, 0 czy 1 to i tak kręci się do przodu.

Założyłem inny egzemplarz Shield bo miałem dostępny ale jest ta sama sytuacja. Czy to może być problem na Arduino? Ma ktoś może program diagnostyczny do niego? 😛  Lub jak inaczej mogę to sprawdzić? 

Link do komentarza
Share on other sites

Dnia 4.01.2022 o 07:39, Gieneq napisał:

@RysiekUP ok, to połącz shield na kabelki - tylko te piny które biora udział i zamień pin od dir na jakiś inny. Może być, że problem jest w płytce Arduino.

To chyba nie takie proste. Jakimś cudem podpiąłem na kablu (niestety w zestawach nie ma złączy żeńskich) piny 4 5 6 9 i nie działało. Domyślam się, że potrzebuje masy więc wpiąłem GND koło pinu 13 i dalej nic. Wypadałoby wszystkie piny podpiąć ale braknie mi cieprpliwości. 

Co ciekawe zamieniłem w programie pary 4/5 z 6/9 a i tak lewy chodził dobrze a prawy w jednym kierunku. 
 

Jutro będę miał inną płytkę arduino to spróbuję. 

Link do komentarza
Share on other sites

Podłączyłem inną płytkę i wszystko gra. Tamtą niestety będę musiał odesłać. Już z nią wcześniej miałem problemy jak zaczynałem kurs arduino ale myślałem, że ja coś w programie poknociłem. Dzięki za pomoc 🙂

Link do komentarza
Share on other sites

9 godzin temu, Klimwojt napisał:

do loop() czy jak ? 

To jest funkcja wiec dajesz ja poza loop() i wywolujesz nazwa...

void loop () {
  if (zatrzymaj) {
    stopMotors();
    }
  }

void stopMotors(){
  digitalWrite(L_PWM, 0);
  digitalWrite(R_PWM, 0);
}

 

Link do komentarza
Share on other sites

Dzień dobry,

Weszliśmy z synem lat 10 w posiadanie zestawu do samodzielnego zbudowania robota (https://www.youtube.com/watch?v=GMvXpjf2KQQ). Syn przeszedł etapy 1-3.  Problemy zaczynają się przy programowaniu Arduino. Kopiujemy kody ze strony forbota do sketcha i po zweryfikowaniu program wyrzuca błąd:
exit status 1
stray '\302' in program

Prosimy o pomoc w uporaniu się z tym problemem.
Z góry dziękujemy za wsparcie
Łączę pozdrowienia

Link do komentarza
Share on other sites

Ja zrobiłem własną wersję funkcji do sterowania silników:

#define PWM_MAX 165
#define L_PWM 5
#define L_DIR 4
#define R_PWM 6
#define R_DIR 9
 
void setup() {
  //Konfiguracja pinow od mostka H
  pinMode(L_DIR, OUTPUT);
  pinMode(R_DIR, OUTPUT);
  pinMode(L_PWM, OUTPUT);
  pinMode(R_PWM, OUTPUT);
}
 
void loop() {
  zakrecLewym(165, 0);
  zakrecPrawym(165, 0);
  delay(1000);
  zakrecLewym(0, 0);
  zakrecPrawym(0, 0);
  delay(1000);
  zakrecLewym(165, 1);
  zakrecPrawym(165, 1);
  delay(1000);
  zakrecLewym(0, 0);
  zakrecPrawym(0, 0);
  delay(1000);
}

void zakrecSilnikiem(int pwmPin, int dirPin, int Speed, int dir) {
  if(Speed <= PWM_MAX && Speed >=0) {
   digitalWrite(dirPin, dir); //Ustawienie kierunku
   analogWrite(pwmPin, Speed); //Ustawienie predkosci
  }
}

void zakrecLewym(int Speed, int dir) {
  zakrecSilnikiem(L_PWM, L_DIR, Speed, dir);
}

void zakrecPrawym(int Speed, int dir) {
  zakrecSilnikiem(R_PWM, R_DIR, Speed, dir);
}

jak ja miałem w kodzie nazwę "Speed" to mi łapał jako zmienną, a jak tu wpisałem to mi łapie za funkcję która w programie arduino była nazwana "speed"

Edytowano przez marcin_zgo
  • Lubię! 2
Link do komentarza
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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.