Skocz do zawartości

Kurs budowy robotów - #4 - pierwsze programowanie


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

8 minut temu, kleczynski11312 napisał:

koła kręcą się bez uśpienia na przykładową sekundę lub dwie. 

Wklej kod...ale zapewne uzywasz sygnalu pwm a ten sygnal jest nadawany bez wzgledu na delay() bo jest oparty o przerwania...

  • 3 miesiące później...
(edytowany)

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

@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ć.

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ć? 

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ę. 

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 🙂

  • 3 miesiące później...
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);
}

 

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

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

  • 5 miesiące później...
(edytowany)

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
  • 1 rok później...

Cześć,


To mój kod z ćwiczenia 4.3 🙂

 

#define L_PWM 5
#define L_DIR 4
#define R_PWM 6
#define R_DIR 9
#define PWM_MAX 165

void setup() {
  pinMode(L_DIR, OUTPUT);
  pinMode(R_DIR, OUTPUT);
  pinMode(L_PWM, OUTPUT);
  pinMode(R_PWM, OUTPUT);

}

void loop() {
  // Go foward for 2 seconds
  leftMotor(50);
  rightMotor(50);
  delay(2000);

  // Do 360
  leftMotor(50);
  rightMotor(-50);
  delay(1400);

  // Curved driving
  leftMotor(40);
  rightMotor(60);
  delay(2000);

  // Do 360
  leftMotor(50);
  rightMotor(-50);
  delay(1400);

  // Turn 90 degrees
  leftMotor(-60);
  rightMotor(60);
  delay(700);

  // Go forward for 2 seconds
  leftMotor(50);
  rightMotor(50);
  delay(2000);
}



void leftMotor(int V){
    if(V > 0) {// If a number is positive
    V = map(V, 0, 100, 0, PWM_MAX);
    digitalWrite(L_DIR, 1); // Set direction
    analogWrite(L_PWM, V); // Set velocity
  } else {
    V = abs(V); // return a positive number
    V = map(V, 0, 100, 0, PWM_MAX);
    digitalWrite(L_DIR, 0); // Set direction backward
    analogWrite(L_PWM, V); // Set velocity
  }
}

void rightMotor(int V){
  if (V > 0){
    V = map(V, 0, 100, 0, PWM_MAX);
    digitalWrite(R_DIR, 0);
    analogWrite(R_PWM, V);
  } else{
    V = abs(V);
    V = map(V, 0, 100, 0, PWM_MAX);
    digitalWrite(R_DIR, 1);
    analogWrite(R_PWM, V);
  }
}

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

 

  • Lubię! 2

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...