Skocz do zawartości

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


Pomocna odpowiedź

@Treker zrobiłem już jakiś czas temu szybki przegląd tego kursu. Na pewno go nie ominę, jednak na tą chwilę chciałbym wykorzystać czujnik zbliżeniowy HC-SR04 do tego SHIELD z L293D lub wykorzystać sterownik z L298N. Do tego dwa proste silniki i jedno serwo. Taki naprawdę najprostszy. Ma mieć po prostu korpus wykonany z tektury (pracuję w firmie produkującej tekturę) oraz nadruk z logiem firmy. Zastanawiam się jeszcze nad źródłem zasilania, czy wykorzystać LiPO czy może jakiś zestaw baterii AA. Mam też możliwość bezkosztowo spróbować wykorzystać ogniwa 18650, ponieważ mam w szafce koszyk na dwa takie akumulatory oraz kilka wysokoprądowych akumulatorów. Czy ich wysoki maksymalny amperaż (30A) nie będzie problemem? Układ i tak powinien pobrać sobie tylko taki prąd jak potrzebuje. 

Dlaczego L298 a nie coś, co powstało już po wyginięciu dinozaurów?

Co do zasilania: 2x18650 to bardzo fajny wybór. Problem może być z serwem (nie każde wytrzyma ponad 8V przy w pełni naładowanych akumulatorach). Jakaś tania przetwornica?

A co proponujesz w zamian za L298? Większość poradników i tutoriali w internecie wspomina właśnie taki sterownik. Jakaś przetwornica stepdown może być też dobrym pomysłem. Polecasz jakąś konkretną czy to w zasadzie wszystko będzie to samo? 

Teraz siedzę z telefonem i nie bardzo mogę pomóc, ale zobacz sobie w Botlandzie jakie są sterowniki (DRV cośtam).

Co do przetwornicy - jakaś najtańsza jednoamperowa, na Allegro chodzą poniżej 5PLN za sztukę.

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

@MisterPablo uproszczając - tak. Jeden z pinów wyjściowych mostka będzie równy napięciu zasilania, a drugi będzie masą. Po odwróceniu sterowania będzie odwrotnie. Dzięki temu silnik może kręcić się w dwie strony (a tutaj mogą się świecić dwa diody).

  • 2 tygodnie później...

Cześć wszystkim, mam takie małe pytanko. Niestety nie mam możliwości podłączenia baterii do Arduino. Czy będę w stanie bezpiecznie wykonać symulację silnika (na diodach) opisaną w tej części kursu podłączając Arduino przez kabel USB do komputera tak jak w poprzednich częściach?

Z góry dziękuję za każdą pomoc! :)

@MateuszB witam na forum 🙂 Możesz próbować, raczej nic nie uszkodzisz. Pamiętaj tylko, że na mostku jest spadek napięcia, więc do diod dotrze mniej niż 5V - nie dawaj tam więc zbyt dużych rezystorów.

Zadanie 8.1

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

pinMode(7, OUTPUT);//Sygnały sterujące kierunkiem obrotów silnika nr 1
pinMode(8,OUTPUT);

pinMode(2,OUTPUT);//Sygnały sterujące kierunkiem obrotów silnika nr 2
pinMode(3,OUTPUT);
}

void loop() {
digitalWrite(7,LOW);//Silniki nr 1 i 2 - obroty w lewo
digitalWrite(8,HIGH);
digitalWrite(2,LOW);
digitalWrite(3,HIGH);
delay(2000);

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

digitalWrite(7,HIGH);//Silniki nr 1 i 2 - obroty w prawo
digitalWrite(8,LOW);
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
delay(2000);
}

 

@Vova Fajnie że dzielisz się kodem do kolejnego zadania 🙂 sterowanie silnikami wygląda dobrze, acz zastanawiam się co tu robi ten pin 6 i czemu ma napisane coś o PWM 😉 

  • Lubię! 2
(edytowany)

@Gieneq Z  tym 6 pinem jest tak że ten fragment kodu skopiowałem i nie usunąłem tego a tylko dopisałem część do sterowania drugim silnikiem🙃 Wiem że tak nie można...

A tym czasem zadanie 8.4 (tak może trochę z drugiej strony zacznę) Dale popracuje nad 8.2 i 8.3...

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);
}

void loop()  {
  for (int i = 0; i <= 255; i++) {
    analogWrite(6, i);// Spokojne rozpedzanie silnika
    delay(25);
  }
  for (int i = 255; i >= 0; i--) {
    analogWrite(6, i); // Spokojne zatrzymywanie silnika
    delay(25);
  }
}

Jest i 8.2

void setup() {
  pinMode(7, OUTPUT);//Pin 7 jako wyjscie
  digitalWrite(7, LOW);//Nisk początkowy stan pinu 7
}
void loop() {
  for (int d = 0; d <= 4; d++) {
    digitalWrite(7, HIGH);//Zaswiec diode 5 razy na 20 ms
    delay(200);
    digitalWrite(7, LOW);
    delay(200);
  }
  delay(3000);//Odczekaj 3 sek
}

 

Edytowano przez Vova
(edytowany)

@Vova Kody wyglądają na poprawne, mam tylko uwagę co do komentarza z 2 kodu //Zaswiec diode 5 razy na 20 ms. Chyba komentarz ten nie pomaga w czytaniu kodu, a bardziej wprowadza w błąd 😞 A tak to super! Także śmiało działaj z innymi zadaniami.

A może też dodaj w przyszłych kodach procedury #define przy etykietowaniu pinów i jakiś stałych jak np. liczba obiegów pętli. Umieszczone na górze kodu powodują że czyta się o wiele lepiej i łatwiej coś poprawić. Gdybyś teraz miał zmienić pin silnika to musiałbyś poprawić to w kilku miejscach, a z prostą instrukcją dla preprocesora wartość takiej etykiety definiujesz raz, a kod wstawi się sam we wszystkich miejscach, gdzie użyjesz etykietę, przed kompilacją 🙂 

Edytowano przez Gieneq
  • 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...