Skocz do zawartości

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


Pomocna odpowiedź

Poprawiłem o tym co piszesz i teraz działa jak powinno.  Za pierwszym razem źle wpinałem rezystor tzn. był wpięty na tej samej linii co krótsza nóżka czerwonej diody. 

2076445431_Arduino_mostekH.thumb.PNG.128f5c2717aec28c0c57c93701d760d8.PNG

Chociaż zastanawia mnie jeszcze jedna rzecz. W kursie było takie zdanie "Diody świecą na przemian, ponieważ raz prąd płynie od wyjścia 1 do 2, a raz odwrotnie. Miganie jest możliwe, ponieważ diody wstawione są odwrotnie". Czy dobrze rozumiem, że prąd przepływa z wyjścia mostka, przechodzi przez diodę, a następnie wraca do innego wyjścia mostka?

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

Zadanie domowe 8.1

Cytat

Dodaj do układu kolejne dwie diody i symuluj nimi drugi silnik. Napisz program, który będzie wykonywał sekwencję: oba do przodu, oba w przeciwne strony, oba w tył i tak w koło. Oczywiście między zmianą kierunku zachowaj odstęp np.: 2 sekundy.

void setup() { 
  pinMode(6, OUTPUT); //Sygnał PWM silnika nr 1
  digitalWrite(6, HIGH); //Ustawiamy (na stałe) stan wysoki na pinie 6
  pinMode(4, OUTPUT); //Sygnał PWM silnika nr 2
  digitalWrite(4, HIGH); //Ustawiamy (na stałe) stan wysoki na pinie 4

  pinMode(9, OUTPUT); //Sygnały sterujące kierunkiem obrotów silnika nr 2
  pinMode(5, OUTPUT);
  pinMode(7, OUTPUT); //Sygnały sterujące kierunkiem obrotów silnika nr 1
  pinMode(8, OUTPUT);
} 
void loop()  {   
  digitalWrite(7, HIGH); //Silnik nr 1 - obroty w prawo
  digitalWrite(9, HIGH); //Silnik nr 2 - obroty w prawo
  digitalWrite(8, LOW); 
  digitalWrite(5, LOW); 
  delay(2000);
  
  digitalWrite(7, LOW); //Silnik nr 1 - obroty w lewo
  digitalWrite(9, LOW); //Silnik nr 2 - obroty w lewo
  digitalWrite(5, HIGH); 
  digitalWrite(8, HIGH);              
  delay(2000);   
  
  digitalWrite(7, HIGH); //Silnik nr 1 - obroty w prawo
  digitalWrite(9, LOW); //Silnik nr 2 - obroty w lewo
  digitalWrite(5, HIGH); 
  digitalWrite(8, LOW); 
  delay(2000);  

  digitalWrite(7, LOW); //Silnik nr 1 - obroty w lewo
  digitalWrite(9, HIGH); //Silnik nr 2 - obroty w prawo
  digitalWrite(5, LOW);  
  digitalWrite(8, HIGH);     
  delay(2000);    
}

Proszę o sprawdzenie czy o to chodziło.

Dzięki ! 🙂

  • Lubię! 1

Praca Domowa 8.2

Za pomocą pętli for będzie migał diodą 5 razy. Spróbuj napisać również to samo z wykorzystaniem pętli while.
 

int licznikdiody = 0;

void setup() { 
Serial.begin(9600); //Start komunikacji
pinMode(2, OUTPUT); // pin 3 jako wyjscie
}

void loop() {
for (int licznikdiody =0; licznikdiody <= 4; licznikdiody++) { //Wykonaj 5 razy
  digitalWrite(2, HIGH);
    Serial.print("Wartosc zmiennej Licznik Diody: ");
    Serial.print(licznikdiody); //Wyświetl wartość licznika
    Serial.println(""); //Przejdź do nowej linii 
    delay(200); //Odczekaj chwilkę
    digitalWrite(2, LOW);
    delay(200); //Odczekaj chwilkę
  }
 digitalWrite(2, HIGH);
}

Mam tu problem. Napisałem program miał migać 5 razy i przestać. A działa w kółko jak dojdzie do 5 razu to znów idzie od zera i tak w kółko. Na końcu powinno być jakieś break czy coś w tym stylu?

37 minut temu, jand napisał:

Masz dwukrotnie zadeklarowaną zmienną licznikdiody - na początku programu i w pętli for.

Trzeba na coś zdecydować.

Dzięki teraz działa 🙂 !

 

 

int licznikdiody = 0;
void setup() { 
Serial.begin(9600); //Start komunikacji
pinMode(2, OUTPUT); // pin 3 jako wyjscie
}

void loop() {
for (licznikdiody; licznikdiody <= 4; licznikdiody++) { //Wykonaj 5 razy
  digitalWrite(2, HIGH);
    Serial.print("Wartosc zmiennej Licznik Diody: ");
    Serial.print(licznikdiody); //Wyświetl wartość licznika
    Serial.println(""); //Przejdź do nowej linii 
    delay(200); //Odczekaj chwilkę
    digitalWrite(2, LOW);
    delay(200); //Odczekaj chwilkę
  }
 digitalWrite(2, HIGH);
}

 

  • Lubię! 1
9 minut temu, PanMajster napisał:

Dzięki teraz działa 🙂 !

Super! 😄 Ogólnie lepiej zmienną zadeklarować w pętli for (jeśli później jej nie będziesz używał). Będzie czytelniej, a w większych projektach można na tym trochę pamięci oszczędzić.

  • Pomogłeś! 1
2 godziny temu, PanMajster napisał:

Mam tu problem. Napisałem program miał migać 5 razy i przestać.

W takim razie mogłeś umieścić for(;;) w setup() lub wstawić jednorazową funkcję z for(;;), tak jak wspomniano w opisie. W twoim kodzie for(;;) w loop() sprawdza warunek w nieskończoność, czy taki był twój zamiar?

  • Lubię! 2
53 minuty temu, ethanak napisał:

Co to znaczy:

for (licznikdiody; ...

I czym się różni od:

for (; ...

 

Niczym sie nie rożni? W sumie myślałem ze trzeba coś tam wpisać. Dlatego tak wpisałem

 

53 minuty temu, orb777 napisał:

W takim razie mogłeś umieścić for(;;) w setup() lub wstawić jednorazową funkcję z for(;;), tak jak wspomniano w opisie. W twoim kodzie for(;;) w loop() sprawdza warunek w nieskończoność, czy taki był twój zamiar?

int licznikdiody = 0;
void setup() { 
Serial.begin(9600); //Start komunikacji
pinMode(2, OUTPUT); // pin 3 jako wyjscie

for (; licznikdiody <= 4; licznikdiody++) { //Wykonaj 5 razy
  digitalWrite(2, HIGH);
    Serial.print("Wartosc zmiennej Licznik Diody: ");
    Serial.print(licznikdiody); //Wyświetl wartość licznika
    Serial.println(""); //Przejdź do nowej linii 
    delay(200); //Odczekaj chwilkę
    digitalWrite(2, LOW);
    delay(200); //Odczekaj chwilkę
    digitalWrite(2, HIGH); //wylacz diode po cyklu
  }
}
void loop() {
}


Czyli że tak jest lepiej?

  • Lubię! 1
4 minuty temu, PanMajster napisał:

Czyli że tak jest lepiej?

Zależy wszystko od potrzeb, jeśli nie potrzebujesz, aby ta pętla była sprawdzana ciągle, to lepiej umieścić w void setup(). W Twoim przypadku (chcesz żeby dioda mrugała tylko 5 razy) wychodzi to na lepiej. 🙂 

  • Pomogłeś! 1
1 godzinę temu, PanMajster napisał:

Czyli że tak jest lepiej?

Niii lepiej, niii gorzej, dokładnie jak opisał @BeeKeyPro. Jako amator wspomnę tylko: przyjrzałbym się miejscom wywoływania funkcji "digitalWrite(2, HIGH)", czy w for(;;) faktycznie musi być odpalana 2x, tj. na początku i końcu pętli?

  • Lubię! 1

Praca domowa 8.3
Napisz program, który odczyta liczbę z zakresu 0-9 wysłaną prze UART, a następnie wyświetli na ekranie tyle samo znaków gwiazdki *.

String liczba = ""; // Bufor do przechowywania całej liczby

void setup() {
  Serial.begin(9600); 
  Serial.println("Witaj w SYSTEMIE"); //wprowadzenie
  Serial.println("Wprowadź liczbe od 1-9"); //wprowadzenie
}

void loop() {
  if (Serial.available() > 0) { //jezeli odebrane dane sa powyzej 1 znaku
    char znak = Serial.read(); // char znak = odczyt z klawiatury

if (isdigit(znak)) { //sprawdzamy czy wpisany "znak" to liczba
liczba += znak; // Dodaj cyfrę do bufora
 } else if (znak == '\n') { // Zakładamy, że koniec liczby oznacza znak nowej linii
 int liczbaInt = liczba.toInt();
      switch (liczbaInt) {
case 1: 
    Serial.println("*");
    break;
case 2: 
    Serial.println("**");
    break;
case 3: 
    Serial.println("***");
    break;
case 4: 
    Serial.println("****");
    break;
case 5: 
    Serial.println("*****");
    break;
case 6: 
    Serial.println("******");
    break;
case 7: 
    Serial.println("*******");
    break;
case 8: 
    Serial.println("********");
    break;
case 9: 
    Serial.println("*********");
break;
    default:
Serial.println("Nieznany KOD");
}
liczba = ""; // Wyczyść bufor
}}
delay(200);
}

Takie coś wyskrobałem . Dodałem nowa funkcje której jeszcze się nie uczyłem "is digit" wiec nie jestem pewien czy dobrze zrobione. W każdym razie działa.

Zadanie domowe 8.4

Napisz program, który za pomocą 2 pętli for będzie płynnie rozpędzał oraz hamował silnik.

int i = 0; //predkosc cilnika
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);

  Serial.begin(9600); //Start komunikacji
} 
void loop()  { 
for (i; i <= 255; i++) {
analogWrite(6, i); //Spokojne rozpędzanie silnika
Serial.println(i); //wyswietlanie predkosci (wypełnienia)
delay(30);
}
for (i; i >= 0; i= i-1) {
analogWrite(6, i); //Spokojne zwalnianie silnika
Serial.println(i); //wyswietlanie predkosci (wypełnienia)
delay(30);
}}

 

  • Lubię! 1

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