Skocz do zawartości

Kurs Arduino - #5 - PWM, serwomechanizmy, biblioteki


Komentator

Pomocna odpowiedź

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Mam tutaj kilka (mniej lub bardziej głupich) pytań:

1. Jaki może być maksymalny prąd pobierany przez Arduino(przez USB, bo natężenia na złączu zależy chyba od napięcia)?

2. Czy można je zasilać za pomocą zwykłej ładowarki do telefonu?

3. Jak mam rozumieć zdanie: "Nie zasilamy serw bezpośrednio ze źródła, którym zasilana jest reszta układu."?- Czyli podsumowując: złącze zasilające wpinamy albo w złącze Vin albo w jakieś inne zewnętrzne źródło (np. bateria)?

4. Czy Arduino może być jednocześnie podłączone do baterii i komputera przez USB oraz czy zmniejszyłoby to prędkość zużywania się baterii?

Link do komentarza
Share on other sites

telefonciek, witam na forum 🙂 Odpowiadając na Twoje pytania:

1) Ciężko jednoznacznie określić. Wszystko zależy od tego, co do niego podłączysz. Jeśli szukasz zasilacza, to najbezpieczniej wybrać coś z większym zapasem (zacząłbym szukać w okolicy 1A). Przy prostych układach 500mA też wystarczy.

2) Jeśli ma odpowiednią wydajność, to tak.

3) Elementy, które pobierają wysoki prąd (czyli np. serwomechanizmy) najlepiej byłoby izolować od zasilania mikrokontrolera. Nie powinno się więc podłączać takich elementów bezpośrednio do wyprowadzeń 5V wbudowanych w Arduino.

4) Tak, można równocześnie mieć podłączony przewód USB i osobny zasilacz.

Więcej informacji na ten temat znajdziesz w serii artykułów o budowie Arduino:

Arduino, co w środku piszczy – #1 – schemat

Link do komentarza
Share on other sites

Moje kody z dość obszernym wyjaśnieniem, może komuś się przydadzą:

5.4

#include <Servo.h> //Biblioteka odpowiedzialna za serwa.
Servo serwomechanizm; //Tworzymy obiekt dzieki ktoremu mozemy odwolac sie do serwa.

int pozycjaStart = 0; //Pozycja poczatkowa serwa = 0.
String odebranedane = ""; //Tekst odebrany z komputera.
int odebranedane_int; //Kąt podany w liczbach w zakresie 0-180 (int).

void setup() {
 Serial.begin(9600);
 serwomechanizm.attach(9); //Przypisanie pinu do serwa.
 serwomechanizm.write(pozycjaStart); //Ustawienie serwa w pozycji startowej.

 //Tekst na poczatku programu.
 Serial.println("Welcome!");
 Serial.println("Enter the angle between 0-180 degrees.");
}

void loop() {
 if (Serial.available() >0) {
   odebranedane = Serial.readStringUntil('\n'); //Jesli dane zostaly wyslane.
   odebranedane_int=odebranedane.toInt(); //Konwenter string=int.
   if (odebranedane_int <=180 &&& odebranedane >=0) { //Jeśli odebrana liczba jest w przedziale 0-180.
     Serial.println("Current angle: " +odebranedane +" degrees."); //Wyswietl komunikat + obecny kąt.
     delay(1000);
     serwomechanizm.write(odebranedane_int); //Obroc serwo do pozycji, ktora zostala wyslana z komputera.
     delay(100);
   }
 else {
   Serial.println ("Bad number. Please enter the angle between 0-180."); //Komunikat o wprowadzonych danych w zlym przediale.
   Serial.println ("Current position is 0.");
   serwomechanizm.write(pozycjaStart); //Ustawienie serwa w pozycji startowej.
   delay(100);
 }
}
}

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 pozycja = 0; //Aktualna pozycja serwa odczytana z A5.
float ruch = 0; // Przelicznik z 8-bit na 0-180.

void setup() 
{ 
 serwomechanizm.attach(9);  //Serwomechanizm podłączony do pinu 9.
} 

void loop() {  
 pozycja = analogRead(A5); //Odczyt z A5.
 ruch = pozycja *(180.0/1023.0); //Przeliczenie 1023 -> 180.
 if (ruch < 180) { //Jeśli pozycja mieści się w zakresie.
   serwomechanizm.write(ruch); //Wykonaj ruch.
 } else { //Jeśli nie, to pozycja =0.
   ruch = 0;
 }                       
}
  • Lubię! 1
Link do komentarza
Share on other sites

Witam,
Co prawda nie jestem pewna czy piszę w dobrym dziale, ale zdarzenie miało miejsce podczas robienia akurat tego ćwiczenia. Jak człowiek jest roztrzepany to o błędy (błahsze i poważniejsze) nietrudno. 😃

Do rzeczy.

Podczas tworzenia układu do komunikacji serwa z użytkownikiem przez UART, na początku zapomniałam o dodaniu kondensatorów. Zorientowałam się gdy moje serwo cały czas buczało przy kątach 1-4. Podczas zmieniania układu niechcący źle podpięłam stabilizator - pomyliłam wyjście z pinem od sygnału sterującego. Efekt - bardzo mocne nagrzanie stabilizatora. Przez przypadek dotknęłam ręką, więc szybko poczułam, że coś jest nie tak.

Czy w ten sposób mój stabilizator mógł zostać uszkodzony? (Tzn. wiem że mógł, tylko nie wiem czy na pewno doszło do uszkodzenia). Jeszcze nie wybuchnął, ale co się tam w środku zadziało to nie mam pojęcia.

Czy mogę dalej z niego korzystać, czy na wszelki wypadek powinnam go wymienić?

Link do komentarza
Share on other sites

Również witamy na Forum kolejną pasjonatkę dłubania w drucikach 🙂

Hm, chyba zadałaś pytanie o ty czy weźmiemy na siebie odpowiedzialność za to, co się stanie gdy podłączysz taki stabilizator "po przejściach" do czegoś cennego. Otóż ja nie wezmę a dobra praktyka inżynierska mówi, że raczej nie powinnaś czegoś takiego używać. Element 7805 kosztuje w okolicach 2zł i nie jest to wygórowana cena za spokojny sen. Jak wiadomo jednak życie jest bardziej skomplikowane a odrobina ryzyka jest w nie wpisana jak.. śliwka w kompot, więc jeśli oczekiwanie na nową sztukę bardzo będzie Ci się dłużyć, albo jego zakup wiąże się np. z wycieczką do innego miasta, proponuję eksperyment. Podłącz go tak jak ustawa nakazuje np. do baterii 9V, zmierz jej napięcie - czy rzeczywiście ma te swoje 9, a min. 8V a potem zmierz napięcie wyjściowe stabilizatora. Jeśli dostaniesz 5V ±0.2V a dodatkowo test organoleptyczny - temperatura i zapach, nie wykażą żadnych niepokojących objawów, możesz go warunkowo (muszę się asekurować, rozumiesz) używać. Podłącz jakąś diodkę świecącą z opornikiem, serwo lub silniczek itp ciągle mierząc napięcie. Takie odbiorniki są dużo bardziej odporne niż np. procesor, który przy 5V pracuje żwawo a przy 6V często już nie żyje więc zapewnienie mu dobrego i stabilnego zasilania to sprawa kluczowa.

7805 montowany jest w dużej obudowie (tzw. TO220) specjalnie przygotowanej do odprowadzania dużych ilości ciepła. W końcu na tym opiera się zasada działania stabilizatora liniowego. Ta cecha (wielkość) w porównaniu z zabawkową, słabiutką baterią 9V sprawia, że istnieje duża szansa przeżycia stabilizatora. W końcu jego zabezpieczenie termiczne (działające jednak tylko przy prawidłowym podłączeniu) aktywuje się dopiero gdzieś przy 130-150°C - twardy jest. Nawet gdy parzy a pośliniony syczy, to wciąż są warunki w jakich może normalnie funkcjonować. Na 95% przeżył także i Twój eksperyment.

  • Lubię! 1
Link do komentarza
Share on other sites

Dzięki za odpowiedź. Jednak najlepiej to się uczy na własnych błędach 😃

Z racji chwilowego braku dostępu do miernika i nie posiadania możliwości kupienia nowego stabilizatora, zaryzykowałam (oczywiście na własną odpowiedzialność) podłączyć i uruchomić serwo jeszcze raz. Tym razem serwo działa a stabilizator się nie grzeję. Jak tylko będę miała możliwość to sprawdzę napięcie, do tego czasu zwiększę swoją czujność i dalej będę bazować na refleksie.

Co prawda serwo dalej wibruje i brzęczy przy pozycji 1-4, ale w programach poustawiałam od wyższego progu by mnie to zbytnio nie denerwowało 😃

Link do komentarza
Share on other sites

Fajnie, że się udało. Każda taka historia niby czegoś uczy, choć licho nie śpi i nawet najlepszym to się zdarza. No, może coraz rzadziej 🙂

Jeśli zabawa Ci się podoba, jak najszybciej wyposażaj się w podstawowe narzędzia. Elektronik bez miernika/multimetru to jak ślepy w ZOO - można coś usłyszeć a nawet poczuć, ale równie dobrze może to być psia kupa na chodniku (czyt: nie zawsze będziesz mieć tyle szczęścia).

I jeszcze zasilanie: bateria 9V jest droga i słabiutka. Nadaje się jedynie do zasilania gadżetów pobierających bardzo mało prądu. Wszelkie serwa, silniki a nawet co mocniejsze LEDy załatwiają ją na śniadanie. Zastanów się nad tym co chcesz robić/budować i zaplanuj korzystanie z jakiegoś bardziej sensownego źródła zasilania. Na pewno tu na Forbocie coś o zasilaniu znajdziesz a w razie wątpliwości pytaj. Ja wiem, że to wszystko kosztuje - to nie jest tanie hobby (a które jest?), ale właśnie dlatego baterie 9V są na dłuższą metę jednym z najgorszych pomysłów.

Link do komentarza
Share on other sites

Wykonując ćwiczenia z serwem mam następujący objaw. Od czasu do czasu mimo braku transmisji orczyk zaczyna „skakać” między dwoma dość odległymi pozycjami. Przykładowy scenariusz testów z zadania 5.4

1. Na początku w funkcji setup testuję zakres ruchu serwa od 0 do 180 – działa ok.

2. Podając ręcznie pozycję o wartości ok. 10 większej od aktualnej wszystko działa ok. Różnica wartości nie może być duża.

3. Podając nowa pozycję o skoku np. +100, -80, zdarza się że orczyk zaczyna „skakać”.

4. Zmienając pozycję w kierunku 0, czasem zdarza się, że zanim orczyk przesunie się do zadanej wartości, przechodzi do pozycji 0 i dopiero przesuwa się do zadanej. Np. jest w pozycji 30, podaję 20. Orczyk wraca do 0 i dopiero później idzie do 20.

5. W momencie „skoków” wysłanie kolejnej wartości pomaga ustabilizować całość i orczyk idzie do zadanej pozycji.

Kondensatory filtrujące są dodane.

Zmieniałem baterię na nową.

Co może być przyczyną takiego zachowania?

Kod programu

/*odczytuje oczekiwana pozycje serwo przez USB i ustawia serwo w podanej pozycji*/
#include <Servo.h>

#define SerwoPort 9                 //serwo podlaczone do pinu 9

Servo SerwoMechanizm;               //utworzenie serwomechanizmu

String SerwoEntry="";               //pozycja serwo odczytana przez serial     
int SerwoPozycja = 0;               //pozycja sewomechanizmu skonwertowana na int

void setup() {
 Serial.begin(9600);
 Serial.println("Start pracy");

 SerwoMechanizm.attach(SerwoPort); //dolaczenie serwomechanizmu
 SerwoMechanizm.write(0);          //test zakresu pracy serwomechanizmu

 while (SerwoPozycja < 180) {
   SerwoMechanizm.write(SerwoPozycja);
   SerwoPozycja += 10;
   delay(300);
 }
 SerwoMechanizm.write(90);         //koniec testu
 delay(2000);
}

void loop() {
 Serial.println("Podaj pozycje: ");         
 while (Serial.available ()==0){
   delay(50);
 }
 SerwoEntry = Serial.readStringUntil('\n');     //odczyt pozycji 
 SerwoPozycja=SerwoEntry.toInt();               //konwersja pozycji na int

 Serial.print("Poddales: ");
 Serial.println(SerwoPozycja);
 if (SerwoPozycja>180||SerwoPozycja<0) {                        //sprawdzenie czy pozycja podana w ramach zakresu
   Serial.println("Zla  wartosc! ");
 } else {
     SerwoMechanizm.write(SerwoPozycja);       //przesuniecie serwa do zadanej pozycji
 }
 delay(2000);
}

Poniżej wstawiam jeszcze kod programu będącego połączeniem zadania 4.6 z serwo. Czyli serwo obracjące się w kierunku latarki. Objawy są takie same jak w przypadku zadania powyżej.

/* Dwa fotorezystory, serwo podaza za zrodlem swiatla*/
#include <Servo.h>

#define FRLeft A4
#define FRRight A5
#define SerwoPort 9

Servo SerwoMechanizm;               //utworzenie serwomechanizmu

int Left = 0;                     //wartosc z lewego fr
int Right = 0;                    //wartosc z prawego fr
int FRDiff = 0;                     //Roznica pomiedzy fr
int SerwoPozycja = 0;               //pozycja sewomechanizmu
int SerwoPozycjaOld = 0;            //poprzednia pozycja serwo

void setup() {
 Serial.begin(9600);
 Serial.println("Start pracy");

 SerwoMechanizm.attach(SerwoPort); //dolaczenie serwomechanizmu
 SerwoMechanizm.write(0);          //test zakresu pracy serwomechanizmu

 while (SerwoPozycja < 180) {
   SerwoMechanizm.write(SerwoPozycja);
   SerwoPozycja += 10;
   delay(300);
 }
 SerwoMechanizm.write(90);
 delay(2000);
}

void loop() {
 Left = analogRead(FRLeft);      //odczytanie lewego fotorezystora
 Right = analogRead(FRRight);    //odczytanie prawego fotorezystora
 FRDiff = Left - Right;

 Serial.print("Lewy: ");         //wartosci testowe wysylane na terminal
 Serial.print(Left);
 Serial.print(" Prawy: ");
 Serial.print(Right);
 Serial.print(" Roznica: ");
 Serial.print(FRDiff);
 if (FRDiff > 200) {
   FRDiff = 200;
 }
 if (FRDiff < -200) {
   FRDiff = -200;
 }

 SerwoPozycja = map(FRDiff, -200, 200, 20, 160); //Przemapowanie roznicy miedzy dwoma fr na pozycje serwo. Wartodc -200 i 200 zostaly wyznaczone empirycznie podczas oswietlania latarka.
 Serial.print(" Pozycja serwo: ");
 Serial.println(SerwoPozycja);                   //Koniec wysylania wartosci testowyhc do terminala.
 if (SerwoPozycja != SerwoPozycjaOld) {          //Weryfikacja, czy potrzebna zmiana pozycji serwa
   SerwoMechanizm.write(SerwoPozycja);            //jesli tak to przsun serwo
   SerwoPozycjaOld = SerwoPozycja;
 }
 delay(2000);
}
Link do komentarza
Share on other sites

Robur, przyznam, że do tej pory nie spotkałem się z takim problemem. Możesz pokazać na filmie jak to wygląda? Sprawdź dla pewności, czy przewody nie wiszą luźno (może coś łapie zakłócenia lub czasami nie styka poprawnie). Miałeś możliwość sprawdzenia układu z innym serwem?

Link do komentarza
Share on other sites

Robur, przyznam, że do tej pory nie spotkałem się z takim problemem. Możesz pokazać na filmie jak to wygląda? Sprawdź dla pewności, czy przewody nie wiszą luźno (może coś łapie zakłócenia lub czasami nie styka poprawnie). Miałeś możliwość sprawdzenia układu z innym serwem?

Treker Powodem najprawdopodobniej był niewystarczający prąd z baterii. Po dołączeniu zewnętrznego zasilania problem ustąpił. Teraz płytka stykowa jest zajęta wyświetlaczem z lekcji 7. 🤣 Jak ją skończę, spróbuję odtworzyć problem i nagrać film.

Link do komentarza
Share on other sites

Ja natomiast mam problem, przepisuję program i wyskakuje mi błąd:

Arduino:1.8.2 (Linux), Płytka:"Arduino/Genuino Uno"

Arduino/kurs_4/kurs_4.ino:2:19: fatal error: Servo.h: No such file or directory

#include

^

compilation terminated.

exit status 1

Błąd kompilacji dla płytki Arduino/Genuino Uno.

Pracuję na linuksie, awersja IDE to 1:1.8.2-1

Link do komentarza
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!

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

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.