Skocz do zawartości

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


Komentator

Pomocna odpowiedź

@Emerid witam na forum 🙂

4 godziny temu, Emerid napisał:

Dlaczego zwieramy masy 4 i 5 z 12 i 13 na L293D? Nie sterują one dwoma różnymi silnikami?

Masa to masa, wszystkie punkty GND w całym układzie powinny być połączone. Nie ma to nic wspólnego ze sterowaniem dwóch różnych silników 🙂 Zasilanie dla silników doprowadzane jest za pomocą jednego pinu (+ masa). Odpowiednie sterowanie silnikami jest realizowane wewnątrz mostka.

Link do komentarza
Share on other sites

Zadanie 8.1


void setup() { 
  pinMode(6, OUTPUT); 
  digitalWrite(6, HIGH); 
  
  pinMode(9, OUTPUT);
  digitalWrite(9, HIGH);
 
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
} 
 
void loop()  {   
  digitalWrite(8, LOW); 
  digitalWrite(7, HIGH); 
  digitalWrite(11, HIGH);
  digitalWrite(10, LOW); 
  delay(3000);  

  digitalWrite(8, HIGH); 
  digitalWrite(7, LOW);   
  digitalWrite(10, HIGH);
  digitalWrite(11, LOW); 
  delay(3000);                   
}

Bardzo fajny kurs 😉😀

Link do komentarza
Share on other sites

Mam pytanie do zadania 8.4

Dokładniej problem w tym że dioda zapala się gwałtownie i powoli przygasa i tak w kółko

Wydaje mi się że w kodzie coś jest nie tak ale nie wiem co

bool par = true;
int i = 0;

void setup() { 
  pinMode(6, OUTPUT); //Sygnał PWM silnika nr 1
  
  pinMode(7, OUTPUT); //Sygnały sterujące kierunkiem obrotów silnika nr 1
  pinMode(8, OUTPUT);
  
  digitalWrite(7, LOW); //Silnik nr 1 - obroty w lewo
  digitalWrite(8, HIGH);
  analogWrite(6, 0);
} 
 
void loop()  { 

 for (i; par = false; i++) {
      analogWrite(6, i); //Spokojne rozpędzanie silnika
      delay(25);
  }
 
  for (i; par = true; i--) {
      analogWrite(6, i); //Spokojne chamowanie silnika
      delay(25);
  }
  if(i = 1) {  //jeżeli i to 0 rozjaśnij
    par = false;
  }
  if(i = 254) { //jeżeli i to 254 przygaśnij
    par = true;
  }
}

 

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

Coś dokładnie pokręciłeś.

for (i; par = false; i++) {
      analogWrite(6, i); //Spokojne rozpędzanie silnika
      delay(25);
  }
 
  

Ta pętla nigdy nie zostanie wykonana, bo w warunku masz par = false (czyli kończ pętlę)

for (i; par = true; i--) {
      analogWrite(6, i); //Spokojne chamowanie silnika
      delay(25);
  }
  

Ta pętla nigdy się nie skończy, bo w warunku masz par = true (co oznacza "kręć się w kółko"). W efekcie na pinie 6 masz bardzo ładny przebieg piłokształtny i taki właśnie widzisz na diodzie.

Kompilator Ci tego nie wykryje, bo sprawdza tylko poprawność składni, a nie sens. Podobnie zdanie "ciotkę parowozu przetaczaj na sznyclach" jest z punktu widzenia gramatyki całkowicie poprawne - i całkowicie pozbawione sensu 🙂

Wyobraź sobie że jesteś mikrokontrolerem - spróbuj ręcznie "wykonać" ten program, a sam zobaczysz o co chodzi.

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

Cześć, mam taki problem:

Chciałem napisać prosty program. Miał on działać w ten sposób:

Są 4 Diody każda w innym kolorze (zdjęcie 1) po wciśnięciu przycisku zapala się pierwsza dioda (zielona) po wciśnięciu go drugi raz zapala się dioda druga dioda (żółta) i tak dalej. (WSZYSTKO W TEJ CZĘŚCI DZIAŁA) Następnie chciałem aby liczba kliknięć przycisku wyświetlała się na wyświetlaczu LCD więc dopisałem kilka linijek kodu ale zamiast liczby kliknięć wyświetlały mi się takie znaki . Potem szukałem błędu w kodzie parę rzeczy pozmieniałem, wgrałem program i na LCD wyświetlił się ten kwadracik (zdjęcie 2, zaznaczony niebieską strzałką ). Cofnąłem wszystko co pozmieniałem, w grałem program i zamiast zniknąć pojawił się kolejny taki sam kwadracik. Odłączyłem zasilanie od Arduino ( kabel łączący Arduino z komputerem) i podłączyłem jeszcze raz. Nie pomogło. Teraz nie wyświetla się nic oprócz prostokątów (zdjęcie 3). Próbowałem wgrać program jeszcze raz ale to też nie pomogło.

KOD : 

#include<LiquidCrystal.h>

#define zielona 2
#define czerwona 4
#define zolta 3
#define niebieska 5
#define przycisk 6

int klik = 0;

String klik2 = "";

void setup() {
 pinMode(zielona, OUTPUT);  //KONFIGURACJA WEJŚĆ I WYJŚĆ
 pinMode(czerwona, OUTPUT);
 pinMode(niebieska, OUTPUT);
 pinMode(zolta, OUTPUT);
 
 pinMode(przycisk, INPUT_PULLUP);
 
 digitalWrite(zielona, LOW);  //USTAWIENIE WSZYSTKICH LEDÓW NA STAN NISKI
 digitalWrite(czerwona, LOW);
 digitalWrite(niebieska, LOW);
 digitalWrite(zolta, LOW);

 LiquidCrystal lcd(12,11,10,9,8,7); //USTAWIENIE LCD
 lcd.begin(16, 2);
 lcd.println("Liczba :"); // WYŚWIETLENIE NA LCD LICZBA :
 
lcd.println(klik2);  //WYŚWIETLENIE NA LCD ILOŚCI KLIKNIĘĆ PRZYCISKU
}

void loop() {
  klik2 = String(klik);  //ZAMIANA Z INT NA STRING
  
  if(digitalRead(przycisk) == LOW) {  //JEŻELI PRZYCISK WCIŚNIĘTY KLIK +1
    klik++;
  }
  while(digitalRead(przycisk) == LOW) {} // PUSTA PĘTLA DLA ZATRZYMANIA
  
  switch (klik) {   //JEŻELI PRZYCISK WCIŚNIĘTY 0 RAZY ZGAŚ WSZYSTKIE DIODY
    case 0 :
 digitalWrite(zielona, LOW);
 digitalWrite(czerwona, LOW);
 digitalWrite(niebieska, LOW);
 digitalWrite(zolta, LOW);
 break;
delay(50);             
     
 case 1 :                         //JEŻELI PRZYCISK WCIŚNIĘTY 1 RAZ ZAPAL TYLKO ZIELONĄ DIODE
 digitalWrite(zielona, HIGH);
 digitalWrite(czerwona, LOW);
 digitalWrite(niebieska, LOW);
 digitalWrite(zolta, LOW);
 break;
delay(50);

 case 2 :                         //JEŻELI PRZYCISK WCIŚNIĘTY 2 RAZ ZAPAL TYLKO ZOLTĄ DIODE
 digitalWrite(zielona, LOW);
 digitalWrite(czerwona, LOW);
 digitalWrite(niebieska, LOW);
 digitalWrite(zolta, HIGH);
 break;
delay(50);

  case 3 :                        //JEŻELI PRZYCISK WCIŚNIĘTY 3 RAZ ZAPAL TYLKO CZERWONĄ DIODE
 digitalWrite(zielona, LOW);
 digitalWrite(czerwona, HIGH);
 digitalWrite(niebieska, LOW);
 digitalWrite(zolta, LOW);
 break;
delay(50);

  case 4 :                      //JEŻELI PRZYCISK WCIŚNIĘTY 4 RAZ ZAPAL TYLKO NIEBIESKĄ DIODE
 digitalWrite(zielona, LOW);
 digitalWrite(czerwona, LOW);
 digitalWrite(niebieska, HIGH);
 digitalWrite(zolta, LOW);
 break;
 delay(50);
 
 case 5 :                         // JEŻELI PRZYCISK WCIŚNIĘTY 5 RAZ USTAW KLIK NA 0
 klik = 0;
 break;
 delay(50);
  }
  delay(50);
}

Zdjęcia:

73482664_523414055175541_2140682197919596544_n.thumb.jpg.1f897dfbccfaf16fe8b5a7c83d9a2652.jpg1583977561_75246706_782648075524077_3906404946215436288_n(1).thumb.jpg.c758e37d89a7ea301dfa29760edc273e.jpg76609868_3375776129162801_4502295331702046720_n.thumb.jpg.e794c1bf35e136c139ca98ad7a4eca6b.jpg

Link do komentarza
Share on other sites

@Dami12250 wyświetlanie samych prostokątów to najczęściej efekt błędnego podłączenia. Sprawdź czy przypadkiem nic Ci się nie poluzowało podczas tych wszystkich eksperymentów 😉 Wgraj też dla testu jakiś prosty program z kursu, który tylko wyświetla tekst, będziesz miał mniej miejsc, które mogę generować błąd.

Link do komentarza
Share on other sites

Witam,

Można prosić o wyjaśnienie, w jakim celu w kodzie znajdują się linijki zaznaczone na czerwono?

pytanienaforumforbot.thumb.PNG.8b3c14d6eb15f1238310218f394419ee.PNG

Wydaje mi się, że jeśli nie zmieniamy stanu wyjść cyfrowych to można je usunąć.... Ale już kilka razy coś mi się wydawało a niekoniecznie miałem rację - stąd prośba o wyjaśnienie.

Pozdrawiam, Łukasz.

Link do komentarza
Share on other sites

Hej

Chciałbym sterować kierunkiem obrotu silnika. Silnik ma się zakręcić 5 razy w prawo i w lewo na zmianę i się zatrzymać. Złożyłem układ na mostku L293DNE tak jak w kursie.

Pytanie: Jak można przenieść tą funkcję do pętli loop żeby tak samo działała jak jest w void setup. Jak przeniosę fragmenty kodu do void loop pętla się nie zatrzymuje tylko cały czas kręci silnikiem w lewo i prawo.

Wgrałem kod:

int i; // deklaracji zmiennej chyba nie trzeba opisywać :P

void setup() {
 pinMode(6, OUTPUT); //sterowanie prędkością silnika
 pinMode(7, OUTPUT); //piny 7 i 8 sterują kierunkiem obrotu silnika
 pinMode(8, OUTPUT);

 digitalWrite(6, HIGH); // ustawienie maksymalnej prędkości obrotowej silnika
 for(i=1;i<=5;i++){ //zainicjowanie pętli for - ma przebiec 5 razy
   digitalWrite(7, HIGH); // odpalamy silnik
   digitalWrite(8, LOW);
   delay(1000);
   digitalWrite(7, LOW); // odpalamy silnik
   digitalWrite(8, HIGH);
   delay(1000);
 digitalWrite(8, LOW); // stopujemy silnik
   delay(1000);
 }
 }

void loop() {

 }

 

Link do komentarza
Share on other sites

@Krzysiek_Zam witam na forum 🙂

34 minuty temu, Krzysiek_Zam napisał:

Pytanie: Jak można przenieść tą funkcję do pętli loop żeby tak samo działała jak jest w void setup. Jak przeniosę fragmenty kodu do void loop pętla się nie zatrzymuje tylko cały czas kręci silnikiem w lewo i prawo.

Tak właśnie działa pętla loop 🙂 Po co w takim razie chcesz tam przenieść ten kod, jeśli nie chcesz, aby działał on cały czas? Jakiego efektu oczekujesz?

Link do komentarza
Share on other sites

zadanie domowe 8.3

String dane="";
int ile=0;

void setup()
{
  pinMode(13, OUTPUT);
  Serial.begin(9600);
}

void loop()
{  
  if(Serial.available()<=0) {
    dane=Serial.readStringUntil('\n');
    ile=dane.toInt();    
    
  if(ile>9){
    Serial.println("wpisz cyfre z zakresu 0-9");
  }else{
  for(int i=0; i<ile; i++){
    Serial.print("*");
  }
  Serial.print('\n');
  }
 }
}

 

Zadanie 8.4

void setup(){

  pinMode(10,OUTPUT);//regulacja PWM
  pinMode(9,OUTPUT); // sterowanie lewo prawo
  pinMode(8,OUTPUT); // sterowanie lewo prawo
  
 Serial.begin(9600);

}

void loop(){
  
  Serial.println("petla");
  
  for (int i=0; i<255; i++){
    
    analogWrite(10,i);
    digitalWrite(9,HIGH);
    delay(25);
    Serial.println(i);
  }
  
  for (int i=254; i>-1; i--){
    
    analogWrite(10,i);
    delay(25);
    Serial.println(i);
  }
}

 

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

Bardzo przydatna część kursu, szczególnie, że w niedalekiej przyszłości szykuje mi się budowa prostego robota omijającego przeszkody jako gadżet firmowy. 

zadania domowe: 

8.1

#define PWM1 6
#define PWM2 9
#define input1Silnika1 7
#define input2Silnika1 8
#define input1Silnika2 10
#define input2Silnika2 11

void setup()
{
    pinMode(PWM1, OUTPUT); //Sygnał PWM silnika nr 1
    pinMode(PWM2, OUTPUT); //Sygnał PWM silnika nr 2

    digitalWrite(PWM1, HIGH); //UStawienie na stałe stanów wysokich na PWM silników
    digitalWrite(PWM2, HIGH);
    
    pinMode(input1Silnika1, OUTPUT); //Sygnały sterujące kierunkiem obrotów silników
    pinMode(input2Silnika1, OUTPUT);
    pinMode(input1Silnika2, OUTPUT);
    pinMode(input2Silnika2, OUTPUT);
}

void loop()
{
    digitalWrite(input1Silnika1, HIGH); //obrot silnika 1 w lewo
    digitalWrite(input2Silnika1, LOW);
    digitalWrite(input1Silnika2, HIGH); //obrot silnika 2 w lewo - razem z pierwszy daje jazde do przodu
    digitalWrite(input2Silnika2, LOW);
    delay(3000);

    digitalWrite(input1Silnika1, HIGH); //obrot silnika 1 w lewo
    digitalWrite(input2Silnika1, LOW);
    digitalWrite(input1Silnika2, LOW); //obrot silnika 2 w prawo -  silniki kręcą się przewinie
    digitalWrite(input2Silnika2, HIGH);
    delay(3000);

    digitalWrite(input1Silnika1, LOW); //obrot silnika 1 w prawo
    digitalWrite(input2Silnika1, HIGH);
    digitalWrite(input1Silnika2, LOW); //obrot silnika 2 w prawo -  razem z pierwszym daje jazdę do tyłu
    digitalWrite(input2Silnika2, HIGH);
    delay(3000);

}

8.4 połączone z 8.2. 

Wykorzystałem ledy, które symulują silnik. Mamy tutaj stopniowe i asynchroniczne rozpędzanie, stopniowe i synchroniczne hamowanie. Powtarzanie całej sekwencji zadaną ilość razy i przycisk do restartowania całego programu, aby wykonywał się od nowa. 

#define PWM1 6
#define PWM2 9
#define input1Silnika1 7
#define input2Silnika1 8
#define input1Silnika2 10
#define input2Silnika2 11
#define przycisk 2

void setup()
{
    pinMode(PWM1, OUTPUT); //Sygnał PWM silnika nr 1
    pinMode(PWM2, OUTPUT); //Sygnał PWM silnika nr 2
    pinMode(przycisk, INPUT_PULLUP); //ustawienie pinu na przycisku

    
    pinMode(input1Silnika1, OUTPUT); //Sygnały sterujące kierunkiem obrotów silników
    pinMode(input2Silnika1, OUTPUT);
    pinMode(input1Silnika2, OUTPUT);
    pinMode(input2Silnika2, OUTPUT);
}

void loop()
{

    for (int i = 0; i < 2; i++)
    { // okreslenie ilosci powtórzeń sekwnecji do wykonania
        for (int a = 0; a < 255; a++)
        {
            double b = a * 1.4;
            b = constrain(b, 0, 255);
            analogWrite(PWM1, a); //stopniowe rozpedzanie silnika
            analogWrite(PWM2, b); //asynchroniczne rozpędanie drugiego silnika
            digitalWrite(input1Silnika1, HIGH); //silnik 1 w lewo
            digitalWrite(input2Silnika1, LOW);
            digitalWrite(input1Silnika2, HIGH); //silnk 2 w lewo
            digitalWrite(input2Silnika2, LOW);
            delay(25);
        }

        for (int a = 255; a >= 0; a--)
        {
            analogWrite(PWM1, a); //stopniowe wyhamowywanie silników
            analogWrite(PWM2, a);
            digitalWrite(input1Silnika1, HIGH); //zachowanie kierunków oborotu w stosunku do poprzedniej pętli
            digitalWrite(input2Silnika1, LOW);
            digitalWrite(input1Silnika2, HIGH);
            digitalWrite(input2Silnika2, LOW);
            delay(25);

        }
    }

    while (digitalRead(przycisk) == HIGH)
    { //oczekiwanie na wcsinięcie przycisku w celu restartu sekwencji
        delay(50);
    }


}

8.3. 

Cały program zintegrowałem z wyświetlaczem, który pokazuje jaką liczbę wpisaliśmy do portu oraz wypisuje w drugiej linijce odpowiednią ilość gwiazdek. Pokazuje też odpowiednią informację jeśli podana przez nas liczba jest za duża w stosunku do ilości pól wyświetlacza. 

#include <LiquidCrystal.h> //dolaczenie biblioteki wyswietlacza
String pobraneDane = ""; //zmienna do odczytu danych podanych przez użytkownika
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //informacja o pinach wyswietlacza
int pobranaCyfraINT = 0; //zmienna mowiaca o ilosci gwiazdek do wydruku
int pozycja = 0; //zmienna dla pozycji kursora wyswietlacza

void setup()
{
    Serial.begin(9600);
    lcd.begin(16, 2); // deklaracja typu wyswietlacza
    Serial.println("Podaj liczbę z zakresu 0-16."); //info dla uzytkownika

}

void loop()
{
     
    lcd.setCursor(0, 0); //ustawienie kursora
    lcd.print("Wpisales: "); //wyswietlenie tekstu

    while (Serial.available() == 0)
    { //oczewikawnie na wpisanie danych
        delay(50);
    }

    if (Serial.available() > 0)
    { //jesli uzytkownik podal dane

        pobraneDane = Serial.readString(); //pobranie info od uzytkownika
        pobranaCyfraINT = pobraneDane.toInt(); //zamiana string na int
        pozycja = 0;

        if (pobranaCyfraINT >= 0 && pobranaCyfraINT <= 16)
        { //jesli miescimy sie w polach wyswietlacza
            lcd.print(pobranaCyfraINT); // wypisanie na wywietlaczu info wpisanego przez uzytkownika
            for (int i = 0; i < pobranaCyfraINT; i++)
            {//petla do wypisywania gwiazdek
                lcd.setCursor(pozycja, 1); //ustawienie kursora w odpowiedniej pozycji
                lcd.print("*"); //wydruk gwiazdki na lcd
                pozycja++; //zmiana pozycji
                Serial.print("*"); //wydruk gwiazdki do portu 
            }
            Serial.println(""); //przejscie do nowej linijki
        }
        else
        { //jeśli jesteśmy poza zakresem
            lcd.print(pobranaCyfraINT); // wypisanie na wywietlaczu info wpisanego przez uzytkownika
            lcd.setCursor(0, 1);
            lcd.print("Poza zakresem!");
            Serial.println("Podałeś liczbę z poza zakresu!");
        }

    }

    Serial.println("Podaj liczbę z zakresu 0-16."); //info dla uzytkownika

    while (Serial.available() == 0)
    { //ponowne oczekiwanie na podanie danych
        delay(50);
    }
  
    lcd.clear(); //wyczyszczenie lcd
  
}

I krótki film z działania całego zestawu. 

 

Edytowano przez BHBmacieg
  • Lubię! 1
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.