Skocz do zawartości
Komentator

Kurs Arduino - #5 - PWM, serwomechanizmy, biblioteki

Pomocna odpowiedź

Ciekawi mnie jeszcze jak później wygląda tworzenie projektów w oparciu o arduino. Teraz na etapie nauki wszystko jest fajnie, ale później jeśli będzie się chciało stworzyć kilka projektów to co? Koszt klona arudino to około 40 zł, a oryginalne 90 zł, więc sporo jeśli chciałoby się zrobić jakieś małe projekty. Więc jak to zazwyczaj wygląda? Czy po prostu używa się arduino jako platformy prototypowej i po skończonej pracy kompiluje się ino do hex i wgrywa na osobny mikrokontroler?

Udostępnij ten post


Link to post
Share on other sites

Arduino to zestaw sprzetowo-programowy przeznaczony moim zdaniem raczej do (samo)edukacji. W podstawowej formie (UNO) masz bardzo ubogo wyposażoną płytkę z portem szeregowym UART/USB i stabilizatorem napięcia. Jej jedyną zaletą jest to, że pasuje do wielu shieldów i ma wgrany bootloader umożliwiający ładowanie kodu jednym przyciskiem z IDE. To samo jednak możesz sobie zrobić samemu za ułamek tej ceny albo kupić płytkę mniejszą, np. Mini lub nawet MiniPRO. Ceny tego w Polsce zaczynają się od 10zł a z daleka to pewnie możesz w tej cenie kupić dwie lub trzy. Musisz wtedy wlutować sobie załącza lub dospawać trochę kabelków, ale układ jest o wiele mniejszy no i tańszy. W wielu projektach wielkość "szkolnego" UNO wręcz przeszkadza - dałoby się je zrobić o wiele mniejszymi i zgrabniejszymi.

Możesz też po prostu kupować gołe procesory po kilka złotych, wgrywać im bootloader (potrzebny programator, ale to jednorazowy wydatek z 25zł) i montować na swoich własnych płytkach.

System Arduino ma jednak swoje ograniczenia (choć coraz mniejsze z uwagi na rozrastające się biblioteki i coraz nowsze platformy) i może też nie ma sensu w nim utykać na dłużej. Na początku można budować mosty z makaronu i plasteliny, ale przecież prawdziwe konstrukcje robi się z czegoś innego. Z biegiem czasu Twoje projekty będą się w naturalny sposób rozrastać bo będziesz wiedział coraz więcej i coraz szersze programy będziesz ogarniał. Prawdopodobnie sam w pewnym momencie zauważysz, że w Arduino robi się chwilami ciasnawo (tak w sprzęcie jak i w IDE) i zaczniesz szukać większych maszynek i bardziej rozbudowanych środowisk. Na razie rozejrzyj się za tańszymi płytkami:

http://allegro.pl/promocja-na-modul-arduino-pro-mini-z-atmega328-avr-i5574675358.html

Kupujesz takich kilka za cenę jednego UNO, podłączasz to przez dodatkowy konwerter USB/UART (musisz mieć jeden do wszystkich płytek, <5zł) do PC, ustawiasz w IDE płytkę Mini PRO i jedziesz.

Udostępnij ten post


Link to post
Share on other sites
Możesz też po prostu kupować gołe procesory po kilka złotych, wgrywać im bootloader (potrzebny programator, ale to jednorazowy wydatek z 25zł) i montować na swoich własnych płytkach.

Właśnie posiadam USBasp bo używałem go do programowania "czystego avr". I chyba to będzie najlepsze rozwiązanie, czyli wgrywać im bootloadera, pracować na arduino a później przenieść na kontroler avr. Rozumiem, że najlepsze będą do tego kontrolery Atmega328 ponieważ takie same znajdują się w Arduino UNO. Aktualnie posiadam Atmega8, ale te chyba niezbyt się nadają. A tak na marginesie to jaki obecnie na rynku jest najmocniejszy model atmegi?

System Arduino ma jednak swoje ograniczenia (choć coraz mniejsze z uwagi na rozrastające się biblioteki i coraz nowsze platformy) i może też nie ma sensu w nim utykać na dłużej. Na początku można budować mosty z makaronu i plasteliny, ale przecież prawdziwe konstrukcje robi się z czegoś innego. Z biegiem czasu Twoje projekty będą się w naturalny sposób rozrastać bo będziesz wiedział coraz więcej i coraz szersze programy będziesz ogarniał.

A możesz proszę Cię rozwinąć bardziej temat? Czyli rozumiem, że z biegiem czasu zazwyczaj trzeba się przesiąść na czysty AVR bez arduino, czy masz namyśli jakąś inną platformę.

Udostępnij ten post


Link to post
Share on other sites

Drążenie tego tematu może doprowadzić do długiej dyskusji a wątek o serwach chyba nie jest dobrym na to miejscem. W każdym razie wgrywanie bootloadera jest oczywiście fajnym rozwiązaniem bo tanio robisz sobie kolejne, własne Arduina które jedyne co, to muszą być wyposażone w jakieś połączenie UARTa do PC. Czy to przez konwerter z USB czy to (w przypadku starszych komputerów) przez konwerter z portu COM/RS232. Zauważ jednak, że skoro masz już gniazdko ISP do podłączenia programatora, to przecież możesz tą drogą wprost wgrywać kod wygenerowany przez kompilator. Przecież właśnie ten kod jest wysyłany przez program AVRdude z PC po łączu szeregowym do bootloadera. Wystarczy przekonfigurować AVRdude na korzystanie z USBasp (a obecna wersja obsługuje dziesiątki typów programatorów i bootloaderów) i zamiast portu COM z zawieszonym na końcu bootloaderem Arduino będzie poszukiwał i działał z programatorem.

W sprawie procesorów - może zajrzyj po prostu na stronę producenta i wybierz sobie co wg Ciebie jest największe i pod jakim względem:

http://www.atmel.com/

Masz tam wprost link do "Atmel MCU Selector" as tam kolumnę "CPU". Odznacz wszystkie oprócz 8-bit AVR a i tak zostanie ponad 200 układów. Przejrzyj pod kątem wielkości pamięci, liczby i rodzaju peryferiów, obudowy itd..

Jest oczywiste, że małe procesory mogą raczej mniej więc ich otoczenie nie będzie rozbudowywane tak jak dużych, bo one tak dużej liczby skomplikowanych bloków nie uciągną. Dlatego np. nie ma małych AVRów z interfejsem ethernet (LAN), nie ma interfejsów do wyświetlaczy/ekranów LCD itp. Za to mają dużo timerów/PWM, UARTów, SPI, I2C itp. Z powodu ograniczeń wewnętrznego RAMu nie zrobisz wielkich aplikacji obrabiających na bieżąco duże ilości danych. Dospawanie karty SD czy zewnętrznych FLASHów to raczej sposoby na dłuższe przechowywanie zebranych danych/logów itp. AVR są raczej procesorkami do sterowania, obsługi czujników, prostych napędów i zarządzania raczej niewielkimi urządzeniami. Odpadają raczej bardziej wyrafinowane algorytmy (synteza czy rozpoznawanie mowy, analiza obrazów) a z powodu słabego arytmometru (8-bitów) także algorytmy wymagające dużo szybkiej matematyki. Możesz oczywiście na tym zrobić kalkulator naukowy liczący regersje, całki i rysujący wykresy na prostym LCD, ale już ciężko będzie zrobić sterownik silnika BLDC liczący na bieżąco wektory pola magnetycznego w stojanie i wirniku. Za to sterownik wielu serw, odczyt mnóstwa czujników, stacje pogodowe itp układy pomiarowe, sterowanie diodkami LED itp oświetleniem, akwariami, wiatraczkami, zasilaczami, małymi robotami itp mechanizmami, kodowanie/dekodowanie sygnałów (np. zdalne sterowanie) zrobisz bez problemów.

Z tych większych układów bardzo popularnym jest mega128 (na tym jest Arduino Mega), ale masz jeszcze mega1280 w obudowie 100-pinowej i jej nowsza siostra mega1284 z 16K RAMu.

Jakby naturalnym przedłużeniem linii mega jest (a przynajmniej miała być w założeniach Atmela) xmega. Nowsza technologia umożliwiła podkręcenie zegara do 32MHz i znaczną rozbudowę peryferiów przy nawet niższych niż mega cenach jednostkowych, ale seria ta jakoś nie zdobyła wielkiej popularności. Mi się podoba, zrobiłem na tym parę rzeczy i działają 🙂

http://www.atmel.com/products/microcontrollers/avr/avr_xmega.aspx

No a dalej to już 32-bitowe ARMy produkowane w setkach typów, wciskające się siłą do płytek Arduino i obsługiwane natywnie przez to IDE: Arduino Teensy, DUE, Zero...

Udostępnij ten post


Link to post
Share on other sites

Witam!

Mam problem potrzebuje zamienić zmienną typu String na int jednak instrukcja znaleziona w internecie { zmienna_int=int(zmienna_string); } nie działa

Alternatywnym rozwiązaniem byłoby przesłanie zmiennej typu int z komputera przez UART

Udostępnij ten post


Link to post
Share on other sites

Witam!

zad.5.2

2 pytanka:

-Dlaczego występuje mignięcie diodą?

-Dlaczego dioda nie gaśnie całkowicie?

int wyp= 0;  //wypełnienie 
int zmiana = 2;

void setup() {
pinMode(3, OUTPUT);
Serial.begin(9600);
}

void loop() {


while (wyp < 255) {     //pętla rozświecająca diodę 
  analogWrite(3, wyp); 
  wyp = wyp + zmiana; 
  delay(25);
  Serial.println(wyp);
 }

                                                                       //występuje szybkie mignięcie diodą


while(wyp>0){             //pętla gasząca diodę
  analogWrite(3, wyp);   
   wyp=wyp-zmiana;
   delay(25);
   Serial.println(wyp);
 }
 Serial.println(wyp);                          // pokazuje 0, lecz dioda nadal minimalnie się świeci 
 delay(3000);  
 Serial.println(wyp);                         // pokazuje 0, lecz dioda nadal minimalnie się świeci 
}

Udostępnij ten post


Link to post
Share on other sites

MrSnowman24688, mignięcie diodą występuje, ponieważ w Twoim programie przekraczasz na chwilę zakres PWM.

W monitorze portu szeregowego powinieneś znaleźć fragment:

250
252
254
256
254
252
250

Jak widzisz, przez chwile podajesz na wejście funkcji wartość 256, co przekracza zakres PWM (do 255). Zmienna się przepełnia i w efekcie ustawiasz wypełnienie równe 0. Powoduje to przygaszenie diody.

Jeśli chodzi o "Dlaczego dioda nie gaśnie całkowicie?", to dioda gaśnie. Jednak na bardzo krótko, dlatego tego nie zauważasz. Zwróć uwagę, że Twój program wyłącza diodę tylko na kilkanaście milisekund. Uruchom program, w którym będzie tylko analogWrite(3, 0); dioda na pewno będzie wyłączona 😉

Udostępnij ten post


Link to post
Share on other sites

Nie posiadam przejściówki jack do arduino, natomiast mam pytanie, czy posiadając koszyczek z bateriami których napięcie wynosi około 5,2V i podpiąłbym je bez stabilizatora by zasilić serwo, nie uszkodzi to mikrokontrolera ( pin z zakresu 0-5V)?

Udostępnij ten post


Link to post
Share on other sites

5.2V nie uszkodzi procesora, ale to dość nietypowe napięcie. Jeśli zmierzyłeś "na pusto" komplet jakichś rozładowanych baterii (np. 4x1.5V), to w takim stanie raczej nie zasilą ani serwa ani nawet procesora. Po prostu po podłączeniu napięcie spadnie jeszcze bardziej i wszystko zdechnie.

Poza tym nie zrozumiałem: czy chcesz z tego samego koszyczka zasilać i Arduino (przez pin Vcc) i serwo? To nigdy nie jest dobry pomysł, nawet gdy dysponujesz mocnym zasilaniem stabilizowanym 5V. Zakłócenia od silnika przeszkadzają procesorowi w wykonywaniu programu i rzadko kiedy udaje się uzyskać działający stabilnie system. No, chyba że serwo jest małe, nieobciążone a zasilanie jest poprowadzone z głową - to i tak tylko do eksperymentów na stole, nigdy w docelowym urządzeniu.

Napisz co to za baterie, jak je zmierzyłeś i jakie jest napięcie po podłączeniu np. samego serwa.

BTW: Wtyczka zasilania Arduino to nie jest jack:

https://pl.wikipedia.org/wiki/Jack_(wtyczka)

https://en.wikipedia.org/wiki/Coaxial_power_connector

Udostępnij ten post


Link to post
Share on other sites

Baterie to Panasonic BK-3MCCE ( akumulatorki ). Właśnie dziwnie bo nominalnie mają one 1,2V, a zmierzyłem je po prostu przykładając napięcie na multimetr. Ogólnie trochę pomieszałem, miałem na myśli, że serwo tylko zasilam z baterii, a płytkę z komputera. Rozumiem, że nie jest to efektywne przy takim zasilaniu, ale chodzi tymczasowo tylko o testy i naukę działania.

Edit:

Podpiąłem silniczek i wszystko działa, napięcie wynosi około 5,15V przy dużym przyspieszeniu spada do około 5V.

P.S dzięki za odzew.

Udostępnij ten post


Link to post
Share on other sites

Grafika "Podłączenie serwomechanizmu do Arduino." pokazuje dwa identyczne kondensatory podłączone przed stabilizatorem, jednak zestaw do nauki Arduino zawiera jeden kondensator okrągły, brązowy 104 oraz drugi "zwykły" Chong CD11X... Ktoś się tutaj pomylił? Czy te dwa różne kondensatory mogę podłączyć do płytki stykowej tak jak na grafice pomimo tego, że są to inne podzespoły?

Udostępnij ten post


Link to post
Share on other sites

tribolonutus, witam na forum 🙂 W zestawie jest jeden kondensator elektrolityczny i jeden ceramiczny (poprawimy schemat w kursie). Najlepiej wepnij oba na wejściu stabilizatora. Pamiętaj tylko o odpowiedniej biegunowości! Więcej informacji o kondensatorach i stabilizatorze znajdziesz w odpowiednich częściach kursu podstaw elektroniki:

Kurs elektroniki – #4 – kondensatory

Kurs elektroniki – #8 – stabilizatory napięcia

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Zadanie 5.4

#include <Servo.h> //Biblioteka odpowiedzialna za serwa

Servo serwomechanizm;   //Tworzymy obiekt, dzięki któremu możemy odwołać się do serwa 
int wychylenie = 0;     //Wychylenie ramienia serwa 
String odebrane = "";   //Odbierane dane z konsoli

void setup() 
{ 
 serwomechanizm.attach(9);   //Serwomechanizm podłączony do pinu 9
 serwomechanizm.write(0);    //Ustawienie serwomechanizmu do pozycji 0
 Serial.begin(9600);         // Inicjacja konsoli
 Serial.println("Witaj \nProszę podać do jakiej pozycji ma się obrócić serwomechanizm \nDostępny zakres 0-180");
} 

void loop() 
{  
 if(Serial.available() > 0){                   //Spawdza czy sa przesylane dane z konsoli
   odebrane = Serial.readStringUntil('\n');    //Wczytywanie danych z konsoli
   wychylenie = odebrane.toInt();              //Zamiana tekstu na cyfre
   if((odebrane == "0" && wychylenie == 0) || (wychylenie > 0 && wychylenie <= 180)){ //Warunek sprawdzajacy czy jest podane "0" lub zakres 1-180. Eliminuje to błąd zamiany tekstu na zero prze funnkcję toInt().
     serwomechanizm.write(wychylenie); //Wykonanie ruchu serwomechanizmu
   }
   else{
     Serial.println("Podałeś złą wartość. \nDostępny zakres 0-180");
   }
 }
 delay(50); //Opóźnienie dla lepszego efektu             
}

Miałem małe problemy z int ale w końcu udało mi się opanować.

Zauważyłem coś dziwnego w moim serwomechanizmie jak podaję wartość z przedziału 0-3 to "buczy" i stabilizator się zaczyna grzać. Nie wiem czy mam rację ale mam wrażenie jak by serwo chciało się wychylić poza blokadę.

Nie wiem jak dokładnie działa funkcja toInt() ale w moim przypadku przy podaniu tekstu zamienia go na "0". Przeglądnąłem cały ten temat i nie zauważyłem, żeby ktoś w warunku wykluczał ten przypadek.

Jest gdzieś dostępna dokumentacja arduino w języku polskim?

Przeglądając temat zauważyłem że kolega użył funkcji, co nie znałem i nie mogłem odnaleźć.

Zadanie 5.4 robiłem na bazie przykładu 'Knob'. I tak rozpisywałem dalej.

......

void loop() 
{  
 val = Serial.parseInt();                                 // zczytanie val

.......

Zadanie 5.5

#include <Servo.h> //Biblioteka odpowiedzialna za serwa

Servo serwomechanizm;    //Tworzymy obiekt, dzięki któremu możemy odwołać się do serwa 
int wychylenie = 10;     //Wychylenie ramienia serwa dla bezpieczenstwa ustaw 10+
int bylo = 0;            // Zmienia do sprawdzania czy bayla wczesniej taka wartość

void setup() 
{ 
 serwomechanizm.attach(9);            //Serwomechanizm podłączony do pinu 9
 serwomechanizm.write(wychylenie);    //Ustawienie serwomechanizmu do pozycji "wychylenie"
 Serial.begin(9600);                  // Inicjacja konsoli
 Serial.println("Witaj \nMożesz tu monitorować w jakiej pozycji powinno znajdować się serwomechanizm");
} 

void loop() 
{  
 wychylenie = map(analogRead(A5), 0, 1023,0, 181);            //Przypisanie przeskanowanej wartosci z pinu A5
 if(wychylenie >= 0 && wychylenie <= 180) {                   //Warunek blokujący maxymalna liczbę z funkcji map()
   if(wychylenie != bylo) {                                  // Warunek sprawdzający czy była wcześniej taka wartość
     serwomechanizm.write(wychylenie);                        //Ustawienie serwomechanizmu do pozycji "wychylenie"
     Serial.print(wychylenie);
     Serial.println(" stopni");
     bylo = wychylenie;                                      //Przypisanie nowej zmiennej do ponownego sprawdzenia
   }
 }
 delay(50); //Opóźnienie dla lepszego efektu             
}

Udostępnij ten post


Link to post
Share on other sites

Krigare, tak, słusznie dedukujesz - w skrajnych pozycjach serwo może czasami próbować wyjść poza blokadę. To jedna z niedoskonałości serwomechanizmów. Warto zawsze dla bezpieczeństwa unikać skrajnych pozycji, jeśli nie są bezwzględnie nam potrzebne 🙂

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