Skocz do zawartości

Kurs Arduino - #5 - PWM, serwomechanizmy, biblioteki


Pomocna odpowiedź

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ć? 🙁

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ć 😉

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 😋

  • 2 tygodnie później...
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?

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

  • 1 miesiąc później...
  • 3 tygodnie później...

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);
}

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.

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:)

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;

  • 2 tygodnie później...

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?

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.

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ę »
×
×
  • Utwórz nowe...