Skocz do zawartości

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


Pomocna odpowiedź

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

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
  • 2 miesiące później...
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
  • 5 tygodnie później...

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

@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
  • 4 tygodnie później...

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

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
(edytowany)

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

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. 

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

  • 2 tygodnie później...

@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 [email protected], na pewno szybko uda się wymienić element na nowy. Mam nadzieję, że dalej obejdzie się już bez takich niespodzianek!

 

 

  • 2 tygodnie później...

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