Skocz do zawartości

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


Komentator

Pomocna odpowiedź

@Treker nie bardzo rozumiem, jeżeli chodzi o wersję to mam 2.0.3

Dodam, że wcześniej nie miałem takiego problemu z komunikacją UART, dzisiaj przed pierwszym komunikatem pojawiają się te kwadraciki, im dłuższy komunikat tym więcej jest tych kwadracików.

Link do komentarza
Share on other sites

@lukasz957 nie mam teraz dostępu do płytki, aby to sprawdzić (może to być kwestia jakiegoś błędu w najnowszej wersji środowiska), sprawdź dla formalności, czy któreś z tych rozwiązań pomoże:

  • dodaj delay(1000); na samym początku setup
    lub
  • pod serial.begin dodaj:
  while (!Serial) {
    ;
  }

Daj znać, czy coś z tego pomogło 🙂 

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

@lukasz957 to może zależeć od wielu czynników, jeśli koniecznie chcesz pozbyć się tych znaków to spróbuj jeszcze zmniejszać to opóźnienie - bo na pewno wystarczy znacznie mniejsze. Możesz też wymienić monitor portu szeregowego na inny, bo w niektórych nawet nie zobaczysz tych znaków. Inne programy tego typu opisałem w tym artykule: https://forbot.pl/blog/4-alternatywy-dla-monitora-portu-szeregowego-arduino-id27736

Link do komentarza
Share on other sites

Sterowanie silnikiem oraz pętla for opanowana 👍

Gdyby ktoś potrzebował pomocy, poniżej podrzucam własne spostrzeżenia oraz działające kody programów do zadań domowych 😉

1️⃣ Zadanie domowe 8.1

Wykonując to zadanie należy pamiętać, aby wejście ENABLE określające prędkość drugiego silnika połączyć z pinem PWM (~):

void setup () {
  pinMode(6, OUTPUT);      //Sygnał PWM silnika nr 1
  digitalWrite(6, HIGH);   //Stan wysoki 

  pinMode(7, OUTPUT);      //Kierunek obrotów silnika nr 1
  pinMode(8, OUTPUT);

  pinMode(11, OUTPUT);     //Sygnał PWM silnika nr 2
  digitalWrite(11, HIGH);  //Stan wysoki

  pinMode(12, OUTPUT);     //Kierunek obrotów silnika nr 2
  pinMode(13, OUTPUT);
}

void loop() {
  digitalWrite(7, LOW);    //Silnik nr 1 - obroty w prawo
  digitalWrite(8, HIGH);
  digitalWrite(12, LOW);   //Silnik nr 2 - obroty w prawo
  digitalWrite(13, HIGH);
  delay(3000);

  digitalWrite(7, LOW);    //Silnik nr 1 - obroty w prawo
  digitalWrite(8, HIGH);
  digitalWrite(12, HIGH);  //Silnik nr 2 - obroty w lewo
  digitalWrite(13, LOW);
  delay(3000);

  digitalWrite(7, HIGH);   //Silnik nr 1 - obroty w lewo
  digitalWrite(8, LOW);
  digitalWrite(12, LOW);   //Silnik nr 2 - obroty w prawo
  digitalWrite(13, HIGH);
  delay(3000);

  digitalWrite(7, HIGH);   //Silnik nr 1 - obroty w lewo
  digitalWrite(8, LOW);
  digitalWrite(12, HIGH);  //Silnik nr 2 - obroty w lewo
  digitalWrite(13, LOW);
  delay(3000);
}

2️⃣ Zadanie domowe 8.2

🔶 Pętla for:

#define DIODA 6

void setup () {
  pinMode(DIODA, OUTPUT);
}

void loop () {

  for (int i = 0; i <= 4; i = i + 1) {
    digitalWrite(DIODA, HIGH);
    delay(500);
    
    digitalWrite(DIODA, LOW);
    delay(500);
  }

  digitalWrite(DIODA, LOW);
  delay(2000);
}

🔶 Pętla while:

#define DIODA 6

void setup () {
  pinMode(DIODA, OUTPUT);
}

void loop () {

  int i = 0;

  while (i <= 4) {
    digitalWrite(DIODA, HIGH);
    delay(500);
    
    digitalWrite(DIODA, LOW);
    delay(500);

    i = i + 1;
  }

  digitalWrite(DIODA, LOW);
  delay(2000);
}

3️⃣ Zadanie domowe 8.3

String liczbaPodana = "";

void setup () {
  Serial.begin(9600);
}

void loop () {
  Serial.println("Podaj liczbe od 0 do 9");
  Serial.println();

  int i = 0;
  int liczba = 0;

  while (Serial.available() == 0) {}              //Czekaj do momentu podania liczby
  delay(50);

  if (Serial.available() > 0) {
    liczbaPodana = Serial.readStringUntil('\n');
    liczba = liczbaPodana.toInt();                //Zmiana znaków na wartość (int)
  }

  if ((liczba >= 0) && (liczba <= 9)) {
    
    for (i = 0; i < liczba; i++) {
      Serial.print("*");
      delay(50);
    }
  } else {
      Serial.print("Niewlasciwa liczba!");
      delay(50);
    }
  Serial.println("\n");
}

4️⃣ Zadanie domowe 8.4

Do rozwiązania tego zadania wykorzystałem zapis "i--". Więcej informacji na ten temat możecie znaleźć na oficjalnej stronie Arduino [link]:

void setup() {
  pinMode(6, OUTPUT);

  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);

  digitalWrite(7, LOW);
  digitalWrite(8, HIGH);
}

void loop() {
  for (int i = 0; i <= 255; i++) {
    analogWrite(6, i);               //Spokojne rozpędzanie silnika
    delay(25);
  }

  for (int i = 255; i >= 0; i--){    //Spokojne hamowanie silnika
    analogWrite(6, i);
    delay(25);
  }
}
  • Lubię! 2
Link do komentarza
Share on other sites

8.2 dla for

void setup() {
 pinMode(8, OUTPUT);

 for(int i=1;i<=5;i++){ //zainicjowanie pętli for - ma przebiec 5 razy
   digitalWrite(8, HIGH); // odpalamy silnik
   delay(1000);
   digitalWrite(8, LOW); // stopujemy silnik
   delay(1000);
 }
}

void loop() {

}

8.2 dla while

void setup() {
  pinMode(8, OUTPUT);
  int i = 0;
  while(i <5){
    digitalWrite(8, HIGH);
    delay(1000);
    digitalWrite(8,LOW);
    delay(1000);
    i++ ;
  }
 }


void loop() {

}

8.3

String tekst = "";

void setup(){
 Serial.begin(9600);
 Serial.println("Wpisz cyfre z zakresu 0 - 9"); //Informacje dla użytkownika
}

void loop() {
if(Serial.available() > 0){ //Czy Arduino odebrano dane
     tekst = Serial.readStringUntil('\n'); //Jeśli tak, to odczytaj je do znaku końca linii i zapisz w tekst
     int liczba = tekst.toInt(); //Zmiana String na int

     if (liczba > 9)                               //Jesli odczytana wieksza niz 9
     {Serial.println("Zbyt duzo - zakres 0-9"); //Określ jako błąd
     }
     else
     {
       Serial.print("Ilosc gwaizdek: "); 
       for (int i = 0; i < liczba; i++)     //Wyswietl tyle ile było "liczba"
       {
         Serial.print("* ");
       }
       Serial.print("\n"); //Przeskoczenie do nowej linii
     }
   }
   delay(100); //Opóznienie
}

 

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

wydałem na zestaw mistrz arduino 500 złotych polskich... i co dostaję? część 6 niezrobiona bo NIE MAM INFORMACJI. Dokładniej ujmując: co to jest obok tranzystora? kto potrzebuje tej informacji. Część 9: czy autorze jest to tak trudne aby wpisać co będzie potrzebne jako listę? bo to że potrzebuję kondensatora dużo nie mówi a wystarczy napisać pod obrazkiem z potrzebnymi rzeczami: kondensator 110µF, rezystor 10 Ω, . 144p to nie jest to czego bym oczekiwał po wydaniu 500 zł.

Link do komentarza
Share on other sites

@MMJ5XD staram się, aby materiały były pomocne. Wiem, że kursy nie są idealne i na pewno wiele można tu poprawić. Dla formalności przypominam jednak, że treść kursów jest udostępniana całkowicie za darmo i można się z nimi zapoznać przed zamówieniem zestawów. Jeśli coś nie jest dla Ciebie zrozumiałe to wystarczy zapytać pod konkretnym artykułem - chętnie pomogę.

Jeśli Twoje problemy dotyczą głównie elektroniki to zachęcam do przeczytania kursu podstaw elektroniki - to na pewno sporo wyjaśni w kontekście tranzystorów i kondensatorów (nawet, jeśli tylko przeczytasz ten kurs bez wykonywania ćwiczeń). Większość osób decyduje się właśnie na naukę w tej kolejności: kursy elektroniki > kursy Arduino. Treść kursu podstaw elektroniki również dostępna jest za darmo: https://forbot.pl/blog/kurs-elektroniki-napiecie-prad-opor-zasilanie-id3947

17 godzin temu, MMJ5XD napisał:

to nie jest to czego bym oczekiwał po wydaniu 500 zł.

Jeśli nie jesteś zadowolony ze sprzętu, który zamówiłeś to bez problemu możesz go zwrócić. Jeśli zestawy były kupione w Botlandzie to masz 30 dni na zwrot.

Link do komentarza
Share on other sites

Cześć. Mostek l293d ma możliwość podpięcia zasilania do 36 V.

Czysto teoretycznie w jakiś sposób to zrobić? Podłączyć po prostu zasiadanie pod Vs? Gdzie wtedy przyłączyć masę tejże baterii, do jednego z czterech wyjść mostka? 
Od kilku dni się nad tym zastanawiam.

Link do komentarza
Share on other sites

@Noob witam na forum 🙂 Jeśli w projekcie używa się kilka źródeł zasilania to łączy się ich masy. Także w tym przypadku masy po prostu należy połączyć - gdzie fizycznie, to już nie ma większego znaczenia. Grunt, aby zasilanie 36 V doprowadzić wtedy tylko do tego wyjścia, którym zasila się silniki.

Link do komentarza
Share on other sites

Zadanie 8.3

int licznik = 0; //zmienna licząca odebraną liczbę od użytkownika
int i = 0; //zmienna dla pętli for
String odebrane; // treść odebrana od użytkownika


void setup() {
  Serial.begin(9600); //nawiązanie połącznenia przez UART
}

void loop() {
  if (Serial.available() > 0) { //jeżeli użytkownik wpisał dane, to
    odebrane = Serial.readStringUntil('ln'); //czytaj dane aż do nowej linii
    licznik = odebrane.toInt(); //zamień treść tych danych na liczbę całkowitą
    if (licznik >= 0 and licznik <= 9) { //jeżeli ta liczba całkowita jest w przedziale 0-9, to
      for (i = 1; i <= licznik; i++) { //powtarzaj poniższe czynności tyle razy ile wynosi ta liczba całkowita
      Serial.print("*"); //zapisz gwiazdkę
      }
    }
    Serial.println(); //po zakończeniu pętli zacznij od nowego wiersza
  }
}

 

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

Zadanie domowe 8.4

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

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

  digitalWrite(8, LOW); 
  digitalWrite(7, HIGH); // obrót w danym kierunku
}

void loop() {
  for (int i = 0; i < 255; i++) { //płynne rozpędzanie silnika
    analogWrite(6, i);
    delay(10);
  }

  for (int i = 255; i > 0; i--) { // płynne zwalnianie
    analogWrite(6, i);
    delay(20);
  }
}

Opóźnienia w pętlach for  są dobrane tak, żeby świecenie diody dawało ładny efekt.

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