Skocz do zawartości

Kurs Arduino - #8 - Sterowanie silnikami DC, pętla for


Komentator

Pomocna odpowiedź

pędzę z pomocą jeżeli komuś pomoże :] PWM  wartości miernika nie brać pod uwagę po 10 latach uważa że w gniazdku jest niewiele ponad 200 v :]

void setup() {

   pinMode(6,OUTPUT) ;    // sygnał PWM ENABLE 1
   digitalWrite(6,HIGH) ; //
   
   pinMode(3,OUTPUT) ;    // sygnał PWM ENABLE 2
   digitalWrite(3,HIGH) ; 
   
   pinMode(7,OUTPUT) ;    // input 1
   pinMode(8,OUTPUT) ;    // input 2
   
   pinMode(4,OUTPUT) ;    // input 3
   pinMode(5,OUTPUT) ;    // input 4
}

void loop() {

  for(int a = 0 ; a < 255 ; a++) {
  
       analogWrite(6, a) ;
       analogWrite(3, a) ;
       delay(25) ;
   
          digitalWrite(7,HIGH) ;  // input 1  silnik 1
          digitalWrite(8,LOW) ;   // input 2  żółta +

          digitalWrite(4,LOW) ;   // input 3  silnik 2
          digitalWrite(5,HIGH) ;  // input 4  żółta +
      }
  
    delay(3000) ;

   for(int b = 0 ; b < 255 ; b++) {
  
          analogWrite(6,b) ;
          analogWrite(3,b) ; 
          delay(25) ;
  
          digitalWrite(7, LOW) ;  // input 1  silnik 1
          digitalWrite(8,HIGH) ;  // input 2  czerwona -

          digitalWrite(4,HIGH) ;  // input 3  silnik 2 
          digitalWrite(5,LOW) ;   // input 4  czerwona -
        }
  
    delay(3000) ;
}

 

  • Lubię! 1
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

9 minut temu, solowkidamian napisał:

mam pytanie czy zamiast tego kondensatora filtrującego o pojemności 47uF można by było dać kondensator ceramiczny o pojemności 47nF?

Z doświadczenia: zależy od zasilania, z reguły lepiej nie ryzykować. Ewentualnie możesz dać większy. 

  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Cześć,
czy przypadkiem w kursie nie jest błędnie opisany kierunek obrotów silnika?
Z tabeli prawdy wynika, że IN1 - 1 przy IN2 - 0 daje nam silnik w LEWO.
Wg rysunków Pin 7 mamy podłączony do IN1 natomiast Pin 8 do IN2.

Natomiast w kodzie:

  digitalWrite(7, LOW); //Silnik nr 1 - obroty w lewo
  digitalWrite(8, HIGH)

czyli IN1 - 0 a IN2 - 1 czyli powinno być obroty w prawo?

Będę wdzięczny za rozjaśnienie, czy coś źle rozumuje 🙂 Na diodach trudniej użyć wyobraźni.

 

  • Lubię! 1
Link do komentarza
Share on other sites

@lied tak masz rację, gratuluję spostrzegawczości. Szczerze mówiąc prawdopodobnie nawet tego nie powiązałem podczas pisania kursu, bo równie dobrze zamiast lew/prawo mogłem pisać "w jedną"/"w drugą". Szczególnie, że kierunki obrotów zależą też od podłączenia silnika oraz od... tego jak się na niego patrzy. Zapisuję do poprawy przy kolejnej aktualizacji kursu. W kursie budowy robotów temat ten na pewno był opisany lepiej, bo tam kierunki były kluczowe 🙂

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Takie tam z wczoraj. 🙂

Zad. 8.1

void setup() {
  pinMode(6, OUTPUT); //Sygal PWM la silnika 1
  analogWrite(6, 230); //Wypelnienie 90% na stale
  
  pinMode(5, OUTPUT); //Sygnal PWM dla silnika 2
  analogWrite(5, 230); //Wypelnienie 90% na stale
  
  pinMode(7, OUTPUT); //Sygnaly sterujace obrotami silnika 1
  pinMode(8, OUTPUT); //(diody zielona-niebieska)
  pinMode(12, OUTPUT); //Sygnaly sterujace obrotami silnika 2
  pinMode(13, OUTPUT); //(diody zolta-czerwona)
}

void loop() {
  //Do przodu
  digitalWrite(7, HIGH); //Silnik 1 do przodu
  digitalWrite(8, LOW); 
  digitalWrite(12, HIGH); //Silnik 2 do przodu
  digitalWrite(13, LOW);
  delay(2000);
  //Skret w prawo
  digitalWrite(7, HIGH); //Silnik 1 do przodu
  digitalWrite(8, LOW);
  digitalWrite(12, LOW); //Silnik 2 do tyłu
  digitalWrite(13, HIGH);//
  delay(2000);
  //Skret w lewo
  digitalWrite(7, LOW); //Silnik 1 do tylu
  digitalWrite(8, HIGH);
  digitalWrite(12, HIGH); //Silnik 2 do przodu
  digitalWrite(13, LOW);
  delay(2000);
  //Jazda do tylu
  digitalWrite(7, LOW); //Silnik 1 do tylu
  digitalWrite(8, HIGH);
  digitalWrite(12, LOW); //Silnik 2 do tylu
  digitalWrite(13, HIGH);
  delay(2000);
}

 

Zad. 8.2 - for
Mając 2 diody na płytce stwierdziłem, że zamigam obiema po kolei. 😉

void setup() {
  pinMode(6, OUTPUT); //Sygal PWM la silnika 1
  analogWrite(6, 255); //Wypelnienie 100% na stale
  pinMode(7, OUTPUT); //Sygnaly sterujace obrotami
  pinMode(8, OUTPUT);

  for (int i = 0; i < 5; i++) { //Wykonaj 5 razy
    digitalWrite(7, HIGH); //Obroty silnika w prawo (dioda niebieska on)
    digitalWrite(8, LOW);
    delay(500);
    digitalWrite(7, LOW); //Silnik zatrzymany (diody off)
    digitalWrite(8, LOW);
    delay(500);
  }

  for (int i = 5; i < 10; i++) { //Wykonaj 5 razy
    digitalWrite(7, LOW); //Obroty silnika w prawo (dioda zielona on)
    digitalWrite(8, HIGH);
    delay(500);
    digitalWrite(7, LOW); //Silnik zatrzymany (diody off)
    digitalWrite(8, LOW);
    delay(500);
  }
}

void loop() {}

 

Zad. 8.2 - while

void setup() {
  int i = 5; //Zmienna pomocnicza

  pinMode(6, OUTPUT); //Sygal PWM la silnika 1
  analogWrite(6, 230); //90% wypelnienia na stale
  analogWrite(5, 230); //90% wypelnienia na stale
  pinMode(7, OUTPUT); //Sygnaly sterujace obrotami/diodami
  pinMode(8, OUTPUT); 
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);

    while(i > 0) { //Wykonuj poki zmienna wieksza od 0
      digitalWrite(7, HIGH); //Wlacz niebieska diode
      digitalWrite(8, LOW); //Nie wlaczaj zielonej diody - uniknij zwarcia
      digitalWrite(12, HIGH); //Wlacz zolta diode
      digitalWrite(13, LOW); //Nie wlaczaj czerwonej diody - unikaj zwarcia
      delay(500);
      
      digitalWrite(7, LOW); //Wylacz wszystkie diody
      digitalWrite(8, LOW);
      digitalWrite(12, LOW);
      digitalWrite(13, LOW);
      delay(500);
      i--; //Zmniejsz (dekrementacja) wartosc zmiennej i
    }  
}

void loop() {}

 

Przy okazji mam zagwozdkę, bo nie wiem, czy mi w międzyczasie coś umknęło.
Jak widać powyżej, na pinach PWM ustawiam konkretne wartości.
Kiedy ustawiam HIGH diody zachowują się, jakby dostawały niższe wypełnienie (na oko zdecydowanie bliżej 100 niż 255).
O czymś zapomniałem w kwestii PWM i musze wrócić do poprzednich lekcji?
Czy to normalne?
Czy też nienormalne, ale o niczym nie zapomniałem i tak jest, bo tak? 🙂

  • Lubię! 1
Link do komentarza
Share on other sites

17 godzin temu, Danyeru napisał:

Kiedy ustawiam HIGH diody zachowują się, jakby dostawały niższe wypełnienie (na oko zdecydowanie bliżej 100 niż 255).

Nic takiego nie powinno mieć miejsca, ale dla pewności zacznijmy od początku - którego dokładnie programu dotyczą te pytania i jak masz podłączoną diodę?

Link do komentarza
Share on other sites

2 godziny temu, Treker napisał:

Nic takiego nie powinno mieć miejsca, ale dla pewności zacznijmy od początku - którego dokładnie programu dotyczą te pytania i jak masz podłączoną diodę?

Nie działało w moich programach.
Dzisiaj, świeżym okiem i umysłem widzę, co popełniłem, a co kompilator łyknął. 😄😅
Ustalałem stany LOW/HIGH poprzez analogWrite, przy digitalWrite działa jak ta lala. 🙂

  • Lubię! 1
Link do komentarza
Share on other sites

I pozostałe zadanka.

Zad. 8.3

String liczba = ""; //Zmienna odbierajace dane z UART

void setup() {
  Serial.begin(9600); //Uruchomienie komunikacji UART
  Serial.println("Wpisz cyfrę z zakresu 1-9");
}

void loop () {
  if(Serial.available() > 0) { //Sprawdzenie czy odebrano dane
    liczba = Serial.readStringUntil('\n'); //Odczytaj odebrane dane do konca linii i przypisz do "liczba"
    int gwiazdki = liczba.toInt(); //Zmien typ zmiennej String na int (przepisz "liczba" na "gwiazdki")

     if (gwiazdki > 0 && gwiazdki <= 9) { //Jezeli "gwiazdki" jest w zakresie 1-9
      for (int i = 0; i < gwiazdki; i++) { //Wykonaj tyle razy ile "gwiazdki"
        Serial.print("* "); //wyswietl gwiazdki
        delay(100); //Male opoznienie dla efektu
      }
      Serial.println(); //Nowa linia
      gwiazdki = 0; //Wyzerowanie zmiennej
      Serial.println("Wpisz cyfrę z zakresu 1-9");
     }
     else {
      Serial.print("Błędna cyfra! \nPodaj cyfrę z zakresu 1-9 \n"); //Komunikat bledu
      gwiazdki = 0; //Wyzerowanie zmiennej
     }
  }
}

 

Zad. 8.4

void setup() {
  pinMode(6, OUTPUT); //Sygnal PWM dla silnika 1
  pinMode(5, OUTPUT); //Sygnal PWM dla silnika 2

  pinMode(7, OUTPUT); //Sygnal sterujacy silnikiem 1
  pinMode(8, OUTPUT);
  pinMode(12, OUTPUT); //Sygnal sterujacy silnikem 2
  pinMode(13, OUTPUT);

  digitalWrite(7, HIGH); //Silnik 1 do przodu
  digitalWrite(8, LOW);
  digitalWrite(12, HIGH); //Silnik 2 do przodu
  digitalWrite(13, LOW);
}

void loop() {
  for (int i = 0; i <= 255; i++) { //Powtarzaj do osiagniecia PWM 255
    analogWrite(6, i); //Stopniowo zwiekszaj PWM silnika 1
    analogWrite(5, i); //Stopniowo zwiekszaj PWM silnika 2
    delay(25);
  }

    delay(2000); //Podzialaj przez 2 s
  
  for (int i = 255; i >= 0; i--) { //Powtarzaj do osiagniecia PWM 0
    analogWrite(6, i); //Stopniowo zmniejszaj PWM silnika 1
    analogWrite(5, i); //Stopniowo zmniejszaj PWM silnika 2
    delay(25);
  }

  delay(2000); //Odczekaj 2s miedzy sekwencjami
}

 

Edytowano przez Danyeru
  • Lubię! 1
Link do komentarza
Share on other sites

Mój układ nie reaguje w ogóle, podłączyłem wszysyko zgodnie z instrukcja, program też dokładnie taki sam i diody się nie zapalają. W czym moze byc problem? 

Przesyłem zdjęcia podłączenia

IMG_20230126_190412.thumb.jpg.027cc5380b36009ec64e3eab10f9395a.jpg

 

Napięcie z baterii dochodzi do układu i z arduino 5v też dochodzi. 

Link do komentarza
Share on other sites

@lukasz957 nie wiem czy to kwestia perspektywy zdjęcia, ale wydaje mi się, że powinieneś docisnąć mocniej układ scalony do płytki. Jeśli to nie pomoże to dodaj jeszcze zdjęcia zrobione pod innym kątem i spróbuje przeanalizować cały układ.

Link do komentarza
Share on other sites

@lukasz957 jeśli układ nie działa mimo kilku prób to pozostaje reklamacja, bo chyba niestety faktycznie trafiłeś na uszkodzony element - chociaż przyznam, że to pierwsza sytuacja z niedziałającym tym konkretnym układem 😞 Napisz proszę na adres reklamacje@botland.com.pl, na pewno szybko uda się wymienić element na nowy. Mam nadzieję, że dalej obejdzie się już bez takich niespodzianek!

 

 

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.