Skocz do zawartości

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


Pomocna odpowiedź

15 minut temu, Gieneq napisał:

może też dodaj w przyszłych kodach procedury #define

@Gieneq... błagam... ja rozumiem że przyszedłeś do mikrokontrolerów ze świata Javy (no wiesz, te wszystkie "thinking in Java" i tak dalej) ale naucz się wreszcie języka którym tu się posługujemy bo piękniejszego przykładu oksymoronu dawno nie widziałem!

I znowu przy wsparciu forum  (posiliłem się rozwiązaniem kolegi bakardi92 ) zadanie 8.3 

String liczba = "";//Zmienna do wprowadzania tekstu
int ilosc = liczba.toInt();//Zmaina tekstu na liczby
void setup() {
  Serial.begin(9600);//Nawiazanie komunikacji przez UART
}
void loop() {
  if (Serial.available() > 0) {//Czy Arduino odebrało dane?
    liczba = Serial.readStringUntil('\n');//Zapisz danie do zmiennej 
    ilosc = liczba.toInt();//Przeksztalcenie ciagu znakow na liczby 
    for (int i = 0; i < ilosc; i++) {//Drukuj test gdy warunki sa spelnione  
      Serial.print("*");
    }
    Serial.print('\n');//Zacznij od nowej linii
  }

 

  • Lubię! 1
36 minut temu, Gieneq napisał:

@ethanak dyrektywa jest lepszą nazwą?

Jak najbardziej, i ta powinna być stosowana. Prawidłowe jest również użycie w stosunku do #define słowa "makro" (chociaż wielu - szczególnie początkującym - nie będzie wiedziało o co chodzi).

Słowo "procedura" sugeruje, że "coś" się wykonuje - tymczasem cały preprocesor z #define na czele służy między innymi właśnie do tego, aby nic się nie wykonywało 🙂

  • Lubię! 2
  • 2 tygodnie później...
45 minut temu, ceiem napisał:

Jakiego kondensatora trzeba użyć (chodzi mi o ten czarny)?

To jest kondensator elektrolityczny i w tym przypadku nie ma dokładnie wyznaczonego kondensatora który koniecznie musisz podłączyć żeby układ działał .

Ten "czarny" służy do filtrowania zasilania może on mieć 100µF, 200µF, 1000µF . Ważne żeby nie był za mały  (chodzi o pojemność). Za duży też nie potrzebny.

 .

  • Lubię! 1
(edytowany)

Bardzo dziękuję. Mogę więc zacząć wykonywać ćwiczenie 🙂 

[edit]

Jednak nie zacznę ćwiczenia. Dlaczego tutaj są dwa kondensatory?

1359804610_Zrzutekranu2020-05-21o15_18_33.thumb.png.31b003140941286580797d9a4656991f.png

Jest czarny i pomarańczowy. Czy sposób ich podłączania (nie wiem jak to nazwać, kolejność podłączania na płytce, rozmieszczenie?) ma jakieś znaczenie? 

Edytowano przez ceiem

 

1 godzinę temu, ceiem napisał:

Jest czarny i pomarańczowy. Czy sposób ich podłączania (nie wiem jak to nazwać, kolejność podłączania na płytce, rozmieszczenie?) ma jakieś znaczenie? 

Ten "pomarańczowy" to kondensator ceramiczny i również służy do filtrowania zasilania . Kondensatory ceramiczne dobrze radzą sobie z filtrowaniem wysokich częstotliwości a elektrolityczne dobrze filtrują niskie częstotliwości.Dlatego często stosuje się oba rodzaje.

Cytat

Jeżeli chodzi o technikę cyfrową, to kondensatory są stosowane głównie do filtracji zasilania. Układy cyfrowe (w tym mikrokontrolery) są wrażliwe na zakłócenia, które mogą powodować ich nieprawidłowe działanie (np. zawieszanie się). Stąd, zasilanie każdego układu cyfrowego powinno być filtrowane (np.: przez kondensatory ceramiczne 100 nF).

Filtrowanie polega na włączeniu kondensatorów między linię zasilającą, a masę.

Sprawdzają się one w tej roli, ponieważ nie przepuszczają prądu stałego (można je podłączyć do baterii bez obawy o jej zwarcie), za to przewodzą prąd zmienny. Dzięki temu, zakłócenia w postaci napięcia zmiennego, są zwierane do masy.

Kondensatory elektrolityczne, mimo osiągania dużych pojemności, nie są skuteczne w filtrowaniu sygnałów o naprawdę wysokich częstotliwościach. Jest to spowodowane pewną ich niepożądaną cechą, zwaną indukcyjnością szeregową (o indukcyjności w dalszej części kursu). Z kolei kondensatory ceramiczne nie potrafią skutecznie odfiltrować zakłóceń o niewielkich częstotliwościach.

Z wyżej wymienionych powodów, najskuteczniejsze jest równoległe połączenie obu rodzajów kondensatorów: elektrolitycznego i ceramicznego.

Źródło :Kurs elektroniki – #4 – kondensatory, filtrowanie zasilania

  • Lubię! 2
  • 1 miesiąc później...

@ceiem Choć mostek jest jeden to posiada 2 kanały. Oznacza, że z jednego układu scalonego możesz sterować 2 silnikami. które wyprowadzenia do tego służą? Jest to opisane w dokumentacji, która jest podlinkowana w kursie:

image.thumb.png.41f79a8f823d27eeae9d6d9ab2d69f73.png

Do nóżek output podłączasz silnik. Możesz wybrać pary po danej stronie układu np. 1 silnik to OUTPUT1 I OUTPUT2, a 2 silnik to pozostałe 3 i 4. Nie ma znaczenia, które podłączysz do którego kabelka z silnika, co najwyżej będzie kręcił się w drugą stronę w stosunku do sąsiedniego silnika.

  • Lubię! 1
  • 3 miesiące później...
(edytowany)

Cześć, mój kod do zadania 8.4. Działa ale może jakieś sugestie?

// sterowanie silnikiem (diodami)

void setup() {
  // silnik nr 1
  pinMode(6, OUTPUT); // PWM 
  pinMode(7, OUTPUT); // w lewo
  pinMode(8, OUTPUT); // w prawo
  // silnik nr 2
  pinMode(3, OUTPUT); // w lewo
  pinMode(4, OUTPUT); // w prawo
  pinMode(5, OUTPUT); // PWM 
}

int aktualnaPredkosc; // do zapisu osiagnietej predkosci - przyda sie przy hamowaniu
int maksPredkosc = 255; // do ustawienia maksymalnej predkosci

void loop() {
  startPrawo(5, 25); // start silnikow w prawo
  hamuj(5, 25); //  hamowanie do zera
  delay(2000);
  startLewo(5, 25); //start silnikow w lewo
  hamuj(5, 25); //  hamowanie do zera
  delay(2000);
}

void startPrawo(int zmianaPredkosci, int opoznienie)
{
  // ustawienie wyjsc dla silnika nr 1: obroty w prawo
  digitalWrite(7, 0); 
  digitalWrite(8, 1); 
  // ustawienie wyjsc dla silnika nr 2: obroty w prawo
  digitalWrite(3, 0); 
  digitalWrite(4, 1); 

  for (int i = 0; i <= maksPredkosc; i += zmianaPredkosci) {
    analogWrite(6, i); // stopniowe zwiekszanie obrotow silnikna nr 1
    analogWrite(5, i); // stopniowe zwiekszanie obrotow silnika nr 2
    aktualnaPredkosc = i; // zapis predkosci - zostanie uzyty przy hamowaniu
    delay(opoznienie);
  }
}

void startLewo(int zmianaPredkosci, int opoznienie)
{
  // ustawienie wyjsc dla silnika nr 1: obroty w lewo
  digitalWrite(8, 0); 
  digitalWrite(7, 1); 
  // ustawienie wyjsc dla silnika nr 2: obroty w lewo
  digitalWrite(4, 0); 
  digitalWrite(3, 1); 

  for (int i = 0; i < maksPredkosc; i += zmianaPredkosci) {
    analogWrite(6, i); // stopniowe zwiekszanie obrotow silnika nr 1
    analogWrite(5, i); // stopniowe zwiekszanie obrotow silnika nr 2
    aktualnaPredkosc = i;
    delay(opoznienie);
  }
}

void hamuj(int zmianaPredkosci, int opoznienie)
{
  for (int i = aktualnaPredkosc; i >= 0; i -= zmianaPredkosci) { // hamujemy od aktualnej predkosci do zera
    analogWrite(6, i); // stopniowe zmniejszanie obrotow do zera (silnik nr 1)
    analogWrite(5, i); // stopniowe zmniejszanie obrotow do zera (silnik nr 2)
    delay(opoznienie);
  }
}

Film (polecam wyłączyć dźwięk, bo za oknem prace):

 

 

Edytowano przez badbit
  • Lubię! 2
(edytowany)

@badbit fajnie że działasz z zadaniami dodatkowymi 🙂 

Sugestie? No to dam 2:

  1. łatwa - dodaj etykiety do tzw. magicznych liczb. Czyli żeby nie było jakiś liczb w kodzie tylko daj definy które je opisują, np. LEFT_PIN 6 itp.
  2. trudne - wyrzuć delaye 😄 to już daleko poza kursem, ale jak masz ochotę się z tym zmierzyć to próbuj. 
Edytowano przez Gieneq
  • 3 tygodnie później...

@EnderDpl witam na forum 🙂

Co dokładnie Ci nie działa, co podłączyłeś i jakie są objawy? Niestety nie masz zarejestrowanego zestawu do tego kursu, więc nie wiem jakim sprzętem dysponujesz.

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