Skocz do zawartości
Komentator

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

Pomocna odpowiedź

Ależ mostek jest elementem elektronicznym i służy właśnie do regulowania napięcia widzianego przez silnik. Nie potrzebujesz żadnych innych regulacji. Zgodnie ze współczynnikiem wypełnienia sygnału PWM, mostek H zmienia to napięcie od zera do pewnego Vmax, które jest mniejsze od zasilania mostka. Tym mniejsze im mostek jest starszy i tańszy. To może być 2-3V dla zabytkowych L293 czy L298 i dobrze poniżej 0.5V dla nowych układów.

Jeżeli stary mostek zasilisz baterią 9V (która do tego w ogóle się nie nadaje) to dostaniesz zakres wyjściowy ok. 0-7V dla wypełnień PWM 0-100%. Jeżeli boisz się o silnik, nie wysterowuj mostka na więcej niż 45% i tyle. Ale to tylko teoria. W praktyce ta bateria jest tak słaba, że żadnej krzywdy silnikowi 3V nie zrobi. Prędzej sama padnie. Znajdź inne zasilanie.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

marek1707, dzięki wielkie! Przekonałem się już co do tych baterii gdy bawiłem się serwem z zestawu.. dobrze, że miałem w zapasie dwie 🙂 Chyba najbardziej wygodnym (i w sumie z czasem ekonomicznym) wyjściem będzie jakiś zasilacz, najlepiej żeby mógł dawać napięcie od 5 do 12V 🙂

[ Dodano: 16-12-2015, 00:52 ]

Jeszcze pytanko, podłączyłem wszystko (musiałem, nie dałem rady iść spać 😃) i zauważyłem, że silnik już startuje gdy podłącze samo USB, bez baterii. Gdy podłączyłem baterię silnik pracował jeszcze szybciej.

Czy to kwestia podłączenia (sprawdzałem, jest tak samo jak na schemacie), że silnik startuje bez baterii i pobiera prąd przez samo USB? Raczej tak nie powinno być, z tego co wyczytałem to silnik zasilany z baterii (napięcia zewnętrznego), a mostek z Arduino (5V)?

Udostępnij ten post


Link to post
Share on other sites

Mostek ma dwa piny zasilania. Część współpracująca z procesorem (wejścia kierunku i PWM) jest zasilana z 5V i to pewnie jest podpięte pod zasilanie procesora pobierane z USB. Druga część - driver mocy ma pin zasilania na którym napięcie powinno być wyższe niż części logicznej i to u Ciebie jest podpięte pod jakąś baterię. Producent mostka nie przewiduje sytuacji w której zasilanie drivera jest wiszące w powietrzu. Prawdopodobnie w strukturze układu znajdują się jakieś połączenia (diody?) które przenoszą zasilanie części cyfrowej na driver. Być może nie jest to celowe a sytuacja przepływu prądu przez te połączenia nie była brana pod uwagę bo stan braku jednego z zasilań nie jest normalny (i zdrowy) dla mostka. Staraj się tego unikać bo nigdy nie wiadomo co wtedy w scalaku się dzieje i jak długo taki stan wytrzyma. Najlepiej niech program zapewnia to, że silnik nie będzie w ogóle załączany gdy brakuje napięcia zasilania sekcji wyjściowej mostka.

Podłączając baterię zwiększasz napięcie zasilania silnika, bo jest ono zależne od współczynnika wypełnienia PWM i od napięcia zasilania części "mocowej" mostka.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Żeby Trekerowi oczy już nie krwawiły więcej przypisy w kodach obecne xD

Zadanie 8.1:

void setup() {
 pinMode(5, OUTPUT); //sterowanie prędkością silnika pierwszego
 pinMode(6, OUTPUT); //sterowanie prędkością silnika drugiego
 pinMode(7, OUTPUT); //piny 7 i 8 sterują kierunkiem obrotu silnika pierwszego
 pinMode(8, OUTPUT);
 pinMode(9, OUTPUT); //piny 9 i 10 sterują kierunkiem obrotu silnika drugiego
 pinMode(10, OUTPUT);

 digitalWrite(5, HIGH); // ustawienie maksymalnej prędkości obrotowej na obu silnikach
 digitalWrite(6, HIGH);
}

void loop() {
 digitalWrite(7, HIGH); //odpalamy do przodu oba silniki
 digitalWrite(8, LOW);
 digitalWrite(9, HIGH);
 digitalWrite(10, LOW);
 delay(2000);

 digitalWrite(9, LOW); //negujemy kierunek obrotu drugiego silnika
 digitalWrite(10, HIGH); // oba obracają się w przeciwfazie
 delay(2000);

 digitalWrite(7, LOW); //negujemy kierunek obrotu drugiego silnika
 digitalWrite(8, HIGH); // oba obracają się przeciwnie do stanu początkowego
 delay(2000);


}

Zadanie 8.2 - wersja z pętlą for:

int i; // deklaracji zmiennej chyba nie trzeba opisywać :P

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

 digitalWrite(5, 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); // stopujemy silnik
   delay(1000);
 }
}

void loop() {

}

Zadanie 8.2 - wersja z pętlą while:

int i = 5; // deklaracji zmiennej chyba nie trzeba opisywać :P

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

 digitalWrite(5, HIGH); // ustawienie maksymalnej prędkości obrotowej silnika
 while(i!=0){ //zainicjowanie pętli while - ma przebiec 5 razy
   digitalWrite(7, HIGH); // odpalamy silnik
   digitalWrite(8, LOW);
   delay(1000);
   digitalWrite(7, LOW); // stopujemy silnik
   delay(1000);
   i--; //dekrementujemy zmienną int do warunku while
 }
}

void loop() {

}

Zadanie 8.3 - pozwoliłem sobie je zmodyfikować tak, aby wprowadzenie każdej liczby (nie tylko od 0 do 9) dawało taką samą liczbę gwiazdek (zamiast Serial.read() skorzystałem z konwersji zmiennej string na integer):

String znak; // deklaracja zmiennej string - ciągu znaków wprowadzanych przez UART
int liczba = 0; // deklaracja zmiennej liczbowej - zamienionego stringa na integer
int i; // zmienna potrzebna do pętli for

void setup() {
 Serial.begin(9600); // zainicjowanie transmisji UART

}

void loop() {
 while(!Serial) {}; // zatrzymanie programu do otwarcia seriala
 Serial.println("Please send o number");
 while(Serial.available()<=0) {}; // zastopowanie programu do czasu wpisania danych do konsoli //UART
 znak = Serial.readStringUntil('\n'); // odczytanie z transmisji UART ciągu znaków (stringa)
 liczba = znak.toInt(); // konwersja zmiennej string w integer
 for (i=1; i<=liczba; i++) { // zainicjowanie pętli for - ma działać tak długo, jak duża liczba została //wpisana przez UART
   Serial.print("*"); // wpisanie gwiazdki
 }
 Serial.print("\n"); // przejście do następnej lini
}

No i ostatnie zadanie 8.4 :

int i; // wprowadzam zmienną sterującą PWM

void setup() {
 pinMode(5, OUTPUT); // deklaruję piny sterujące pracą silnika
 pinMode(7, OUTPUT);
 pinMode(8, OUTPUT);
 digitalWrite(7, HIGH); // ustalam kierunek pracy silnika
 digitalWrite(8, LOW);
 digitalWrite(5, LOW); // ustawiam stan początkowy prędkości silnika
}

void loop() {
 for (i=0;i<=255;i++){ // zainicjowanie pierwszego fora
   analogWrite(5, i); // silnik przyspiesza z prędkością od 0 do max
   delay(20);
 }
 delay(2000); // opóźnienie dla efektu
 for (i=255;i>=0;i--){ // zainicjowanie drugiego fora
   analogWrite(5, i); // silnik z max zwalnia do 0 
   delay(20);
 }
 delay(2000); // opóźnienie dla lepszego efektu
}

Udostępnij ten post


Link to post
Share on other sites

PrimeSoul, no i od razu znacznie lepiej - oby tak dalej 🙂

Udostępnij ten post


Link to post
Share on other sites

Cześć, mam pytanie.

Chcę zbudować pierwszego robota, będzie tylko jeździł w przód/tył i skręcał. Zależy mi po prostu na tym, żeby nauczyć się sterować arduino przez bluetooth i zbudować w końcu coś bardziej konkretnego.

Moje pytanie dotyczy sterowania silnikami z przekładnią. Czy sterowanie nimi wygląda tak samo jak silnikami bez przekładni? Chcę użyć silników 12VDC z przekładnią 70 obrotów MT-90 0,78Nm. Czy to oznacza, że przy maksymalnym wypełnieniu PWM=255 silnik będzie się obracał 70 razy na minutę? A przy mniejszych wypełnieniach z prędkością proporcjonalną do wypełnienia?

Udostępnij ten post


Link to post
Share on other sites

W zakresie programowym sterowanie większym silnikiem się praktycznie nie różni. Przekładnia służy do redukcji obrotów czyli na wyjściu przekładni będziesz mieć 70RPM a wraz ze zmniejszającym się PWM będą malały obroty.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Zadanie 8.1

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

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

 pinMode(9, OUTPUT); //Kierunki obrotów silnik 2
 pinMode(10, OUTPUT);
} 

void loop()  {
 digitalWrite(7, LOW); //Silnik nr 1 - obroty w lewo
 digitalWrite(8, HIGH); 
 digitalWrite(9, LOW);
 digitalWrite(10, HIGH);
 delay(3000);

 digitalWrite(7, HIGH); //Silnik nr 1 - obroty w prawo
 digitalWrite(8, LOW); 
 digitalWrite(9, HIGH);
 digitalWrite(10, LOW);
 delay(3000);           
}

Zadanie 8.2

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

 pinMode(7, OUTPUT); //Kierunki obrotów silnik 1
 pinMode(8, OUTPUT);

 pinMode(9, OUTPUT); //Kierunki obrotów silnik 2
 pinMode(10, OUTPUT);

 for (int i = 1; i <= 5; i++){ //petla for - wykonać 5 razy
 digitalWrite(7, LOW); //Silnik nr 1 - obroty w lewo
 digitalWrite(8, HIGH); 
 digitalWrite(9, LOW); //Silnik nr 2 - obroty w lewo
 digitalWrite(10, HIGH);
 delay(3000);

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

 digitalWrite(7, LOW); //Wylączenie po pętli for
 digitalWrite(9, LOW);
 } 
} 

void loop()  {}

Zadanie 8.3 - pisane w garażu 🙂

String ilosc = "";

void setup(){
 Serial.begin(9600);
 Serial.println("Wpisz cyfre z zakresu 0 - 9"); //Legenda
}

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

     if (ile > 9)                               //Jesli odczytana wieksza niz 9
     {Serial.println("Zbyt duzo - zakres 0-9"); //Okresl jako bŁąd
     }
     else
     {
       Serial.print("Ilosc gwaizdek: "); //Jakis tekst
       for (int i = 0; i < ile; i++)     //Wyswietl tyle ile było "ile", ech...
       {
         Serial.print("* ");
       }
       Serial.print("\n"); //Do następnej linii
     }
   }
   delay(50); //Opóznienie, bo tak ładnie (Windows 10 nie lubi "ź")
}

Zadanie 8.4 - czas wymienić baterię, bo silnik nie chce ruszać i trzeba palcem pomagać 😉

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 = 120; i < 255; i++) {
     analogWrite(6, i); //Spokojne rozpędzanie silnika
     delay(50);
 }

   for(int i = 255; i >= 120; i--){
   analogWrite(6, i); //Spokojne hamowanie silnika
   delay(50);
   }
}

Udostępnij ten post


Link to post
Share on other sites

leepa79, super, od razu się lepiej czyta jak są ładne komentarze w kodzie 😉 Powodzenia podczas dalszych ćwiczeń.

Udostępnij ten post


Link to post
Share on other sites

Cześć

Podłączyłem sterowanie logiczne i zasilanie silników do jednego źródła zasilania czyli zasilacza. Otrzymałem bardzo duży spadek napięcia, np. dla 7,5V na zasilaczu mam 3,3V na silnikach, dla 6V na zasilaczu jest 3V na silnikach. Zwiększając napięcie na zasilaczu na silnikach mam ciągle ok 3V. Co może być tego przyczyną?

Gdy mam rozdzielone źródła zasilania wszystko jest ok i nie ma takich spadków napięć.

Udostępnij ten post


Link to post
Share on other sites

kokodyn, prawdopodobnie Twoje źródło zasilania ma zbyt małą wydajność lub w jakiś sposób źle (?) łączysz masy i doprowadzasz do zwarcia.

Udostępnij ten post


Link to post
Share on other sites

Cześć wszystkim, mam mały silnik 3-6V i chciałbym zmierzyć ile pobiera prądu.

Sęk w tym że część druga artykułu o elektronice nie rozwiewa moich wątpliwości co do sposobu podłączenia układu do pomiaru. Układy które znalazłem w internecie są w większości dość złożone i często wykorzystują zasilacze, zaś w moim przypadku bateria 9V to aż nadto. Czy ktoś mógłby podpowiedzieć jak w możliwie najprostszy sposób zmierzyć prąd na tym niewielkim silniku?

P.S. - pytanie wydaje mi się ściśle związane z tematem tej części kursu więc wyszedłem z założenia że to odpowiedni wątek.

P.S.2 - napięcia pobierane przez silniki są dosyć imponujące, zatem czy zabawa małymi silnikami może być niebezpieczna nie tylko dla arduino, ale także dla człowieka?

z góry dziękuję za odpowiedzi!

Udostępnij ten post


Link to post
Share on other sites

Przede wszystkim prąd płynie przez silnik więc mierzysz prąd w silniku. Napięcie panuje na jego zaciskach więc mierzysz napięcie na silniku.

Silniki i inne odbiorniki nie pobierają napięcia. Ono na nich jest takie, jakie dostarcza źródło tego napięcia. Prąd płynie wtedy taki, jaki silnik sobie pobiera.

Jeśli umiesz zmierzyć prąd płynący przez rezystor, to tak samo mierzysz prąd płynący przez silnik. Do silnika 3-6V potrzebujesz źródła napięcia 3-6V, a do eksperymentów z elektroniką zasilacz regulowany jest jednym z pierwszych (może po multimetrze) i najpotrzebniejszych przyrządów laboratoryjnych więc poważnie pomyśl o jego zakupie. Bateria 9V nie nadaje się do zasilania żadnych silników.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Dzięki wielkie za odpowiedź! Jednakże, odnośnie zasilania silników - w jaki sposób zasilane są roboty jeżdżące jeśli nie bateriami? Jakiekolwiek projekty dotychczas oglądałem to zazwyczaj dwa silniczki były napędzane czterema bateriami AA.

Edit - chyba że miałeś na myśli konkretnie baterię 9V

Udostępnij ten post


Link to post
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!

Gość
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...