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

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

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

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

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.