Skocz do zawartości
Komentator

Kurs Arduino - #5 - PWM, serwomechanizmy, biblioteki

Pomocna odpowiedź

Tak, pisalem do autora zadania domowego 🙂 Bo mam wrazenie, ze program dziala tylko dla niektorych wartosci zmiennej "zmiana".

Udostępnij ten post


Link to post
Share on other sites

Cześć wszystkim,
mam mały problem ze swoim serwomechanizmem. Wszystko podłączone jak na schemacie, program w desperacji, skopiowałem ze strony, a serwo działa "zacinająco", tzn. rusza na chwilę, potem zwalnia i się zatrzymuje i stoi przez kilka sekund, potem znowu rusz i znowu staje. Jakieś porady i pomysły o co może chodzić? 🙁

Udostępnij ten post


Link to post
Share on other sites

komorov, czy podłączyłeś kondensatory przy stabilizatorze? Zerknij jeszcze na schematy z kolejnej części kursu. Jak masz pod ręką, to możesz też sprawdzić jak zachowuje się układ na innej baterii. Jak sposoby nie pomogą, to będziemy dalej radzić 😉

Udostępnij ten post


Link to post
Share on other sites

Jeżeli poprawnie zrozumiałem polecenia, programy powinny być OK. Co do zadania 5.2 powiem szczerze, że przerobiłem tylko trochę przykładowy kod znajdujący się na stronie, więc zadanie było rozwiązane dla konkretnego przypadku. Zaznaczam, że nie jestem mistrzem programowania, ale wydaje mi się, że tak jest dobrze :

#define LED 9 

int wypelnienie = 0; 
int zmiana = 4; 

void setup() 
{ 
pinMode(LED,OUTPUT); 
} 

void loop() 
{ 
analogWrite(LED,wypelnienie); 
 if(wypelnienie<255) 
 { 
   wypelnienie+= zmiana; 
 } 
 if( wypelnienie>=255) 
   { 
     while(wypelnienie!=0 && wypelnienie>0) 
         { 
         wypelnienie-=zmiana; 
         analogWrite(LED,wypelnienie); 
         delay(50); 
         } 
   } 
delay(50); 

} 

A i dzięki Treker za uwagę co do tagów 😋

Udostępnij ten post


Link to post
Share on other sites

damian11, a gdzie komentarze!? 🙂

Udostępnij ten post


Link to post
Share on other sites
komorov, czy podłączyłeś kondensatory przy stabilizatorze? Zerknij jeszcze na schematy z kolejnej części kursu. Jak masz pod ręką, to możesz też sprawdzić jak zachowuje się układ na innej baterii. Jak sposoby nie pomogą, to będziemy dalej radzić 😉

a o jakiej pojemności te kondensatory?

Udostępnij ten post


Link to post
Share on other sites

komorov, zależy jakie masz pod ręką 100nF ceramiczne będą ok, jakieś elektrolity 100uF też się nadadzą 🙂

Udostępnij ten post


Link to post
Share on other sites

Tu by się przydała jeszcze informacja że

serwomechanizm.attach(9);

blokuje możliwość używania PWM na pinach 9, 10 i 11.

Udostępnij ten post


Link to post
Share on other sites

MateuszW, dzięki za sugestię 🙂

Udostępnij ten post


Link to post
Share on other sites

Zadanie 5.4

Zastanawiam się tylko, czy można w jakiś lepszy łatwiejszy sposób spowodować, aby na początku komunikat z prośbą o podanie kąta pojawił się tylko raz, srednio podoba mi się korzystanie z false i true, a informatykiem nie jestem, raczej mechanikiem 😃

#include <Servo.h> //Biblioteka serwa 

Servo serwomechanizm;  //Obiekt odwołania do serwa 
int pozycja1 = 0; //pozycja wstępna 
String odebraneDane=""; //dane wprowadzone przez UART
int odebraneDane_int;
boolean pauza=false;

void setup() 
{ 
 serwomechanizm.attach(9);  //Serwomechanizm podłączony do pinu 9 
 Serial.begin(9600);
 serwomechanizm.write(pozycja1);
} 

void loop() 
{  
 if (pauza==false){
   Serial.println("Podaj kat od 0-180");
   pauza=true;
 }

 if(Serial.available() > 0) { 
   odebraneDane = Serial.readStringUntil('\n');
   odebraneDane_int=odebraneDane.toInt();
   if (odebraneDane_int<=180 && odebraneDane_int>=0){
     Serial.println("Podano kat:" + odebraneDane);
     delay(1000);
     serwomechanizm.write(odebraneDane_int);
     Serial.println("Obecny kat to:");
     Serial.println(odebraneDane_int);
     delay(100);
   } else {
     Serial.println("Podano zla wartosc. Podaj kat 0-180");
     delay(100);
   }
 }
}  

ZADANIE 5.5

Tutaj wyszło mi to jakoś bardzo prosto mam nadzieje, że wszystko poprawnie, martwi mnie tylko, że przy kręceniu potencjometrem, w jednym skrajnym położeniu, zanim silnik zacznie reagować, muszę najpierw obrócić pokrętłem potencjometru o jakieś 100-120 stopni, natomiast w 2 skrajnym położeniu reaguje on natychmiastowo... :/

#include <Servo.h> //Biblioteka serwa 

Servo serwomechanizm;  //Obiekt odwołania do serwa 
int pozycja1 = 0; //pozycja wstępna 
float odebraneDane=0; //wartosc ustawiona na potencjometrze


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

void loop() 
{  
 odebraneDane=analogRead(A5); //odczytanie wartosci z A5 potencjometru
 odebraneDane=map(odebraneDane, 0, 1024, 0, 180);//Przeskalowanie wartości

   serwomechanizm.write(odebraneDane);
   delay(5);
}

Udostępnij ten post


Link to post
Share on other sites

PukiSlu, aby komunikat był wyświetlany tylko raz możesz przenieść go do sekcji setup(). Jednak Twoje rozwiązanie ze zmienną jest również dobre.

Udostępnij ten post


Link to post
Share on other sites

damian11,

Nie rozumiem niestety co oznaczają Twoje elementu kodu:

a) wypelnienie+= zmiana;

b) while(wypelnienie!=0 && wypelnienie>0)

c) wypelnienie-=zmiana;

Wiem, że zapis coś++ jest to inkrementacja, wiem, że wykrzyknij przed zmienną zmienia jej wartość na przeciwną, ale nie mam pojęcia ( nie było chyba tego w kursie ) co oznacza wykrzyknik po zmiennej oraz te zapisy z punktu a) i c)

Bardzo proszę o pomoc / wskazówki

Pozdrawiam MrShadow:)

Udostępnij ten post


Link to post
Share on other sites

MrShadow, racja informacji tych nie było w kursie, bo na początek nie są konieczne. Wytłumaczę Ci jednak zapisy, zanim zrobi to autor kodu 😉

wypelnienie+= zmiana;

To jest zapis skrócony od:

wypelnienie = wypelnienie + zmiana;

while(wypelnienie!=0 && wypelnienie>0)

To nie jest wykrzyknik po zmiennej, tylko operator !=, czyli "różne". Warunek ten sprawdza więc, czy wypełnienie jest różne od 0 i jednocześnie większe od zera. Ogólnie można było zapis ograniczyć tylko do drugiego warunku. Jeśli coś jest większe od zera, to na pewno nie jest mu równe.

wypelnienie-=zmiana;

analogicznie, jest to:

wypelnienie = wypelnienie - zmiana;

Udostępnij ten post


Link to post
Share on other sites

Witam.

Serwo chodzi pięknie.

Mam Jeszcze pytanie. Czy możemy zmniejszyć równocześnie szybkość obracania się serwo z pozycji 0 do 180 i z powrotem?

Udostępnij ten post


Link to post
Share on other sites

Marnyx, niestety nie możemy wpływać na prędkość serwomechanizmu. Należałoby zrobić to ręcznie, czyli dzielić zadany obrót na mniejsze i wprowadzać pomiędzy każdy etap opóźnienia. Uzyskanie płynności będzie jednak bardzo trudne.

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