marek1707 Grudzień 15, 2015 Udostępnij Grudzień 15, 2015 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. 1
NetJaro Grudzień 15, 2015 Udostępnij Grudzień 15, 2015 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)?
marek1707 Grudzień 16, 2015 Udostępnij Grudzień 16, 2015 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. 1
PrimeSoul Luty 13, 2016 Udostępnij Luty 13, 2016 Ż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 }
Treker (Damian Szymański) Luty 13, 2016 Udostępnij Luty 13, 2016 PrimeSoul, no i od razu znacznie lepiej - oby tak dalej
hawaya Luty 22, 2016 Udostępnij Luty 22, 2016 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?
Mechano Luty 22, 2016 Udostępnij Luty 22, 2016 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. 1
Wojciech Luty 22, 2016 Udostępnij Luty 22, 2016 Ale nieliniowo: zależność obrotów w funkcji wypełnienia impulsu. 1
leepa79 Sierpień 31, 2016 Udostępnij Sierpień 31, 2016 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); } }
Treker (Damian Szymański) Wrzesień 1, 2016 Udostępnij Wrzesień 1, 2016 leepa79, super, od razu się lepiej czyta jak są ładne komentarze w kodzie Powodzenia podczas dalszych ćwiczeń.
Gość Wrzesień 22, 2016 Udostępnij Wrzesień 22, 2016 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ęć.
Treker (Damian Szymański) Wrzesień 22, 2016 Udostępnij Wrzesień 22, 2016 kokodyn, prawdopodobnie Twoje źródło zasilania ma zbyt małą wydajność lub w jakiś sposób źle (?) łączysz masy i doprowadzasz do zwarcia.
MaciejBurchardt Grudzień 11, 2016 Udostępnij Grudzień 11, 2016 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!
marek1707 Grudzień 11, 2016 Udostępnij Grudzień 11, 2016 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. 1
MaciejBurchardt Grudzień 11, 2016 Udostępnij Grudzień 11, 2016 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
Pomocna odpowiedź
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ę »