Skocz do zawartości

Kurs Arduino - #5 - PWM, serwomechanizmy, biblioteki


Pomocna odpowiedź

MateuszW, zgadza się, brak, ale z premedytacją. Po ostatniej części kursu Arduino dotyczącej praktycznego wykorzystania serwomechanizmów oraz dodatkowych informacji o UART nie pojawiły się jeszcze żadne rozwiązania zadań domowych. Daje wszystkim czas na nadrobienie lekcji, widocznie niektórych dopadło wakacyjne lenistwo 🙂 W międzyczasie polecam najnowszą, ostatni a już część kursu podstaw elektroniki - omawiającą przekaźniki oraz inne elementy stykowe.

Ja obecnie staram się "wrzucić" mojego omijacza przeszkód z arduino na płytkę uniwersalną (ATmega8A 16Mhz + L293DNE), ale ponieważ elektronika u mnie na dość średnim poziomie to i średnio mi idzie 😃 Dlatego też nie zajmowałem się zadaniami domowymi jeszcze.

Treker,

w tej chwili zdaje się że z zakłóceniami w układzie z L293D. A raczej napewno bo uC "dziwnie" się zachowuje, jak serwa zaczynają działać i dość spore spadki napięcia zaobserwowałem. Chyba za prosty układ zrobiłem 🙂

Treker, właśnie nie chcę dwóch źródeł ciągnąć 🙂 ale pogrzebałem trochę na forum, znalazłem kompendium mostków H, sekcja o zakłóceniach pomogła, użyłem diody, dodałem kondensator i dzielnik napięcia, wpiąłem się przed stabilizator i podłączyłem do VCC silników w L293D i już widać poprawę. Trzeba przyznać, że znajduję tu bardzo dużo przydatnych informacji 🙂

Pozdrawiam.

MateuszW, dzielnik napięcia? To raczej nie brzmi dobrze... Opisz dokładnie, co teraz z robiłeś. Zamiast dwóch źródeł zasilania możesz zastosować dwa osobny regulator napięcia dla silników i kondensatory.

Treker, no właśnie dzielnik nie zdał egzaminu 😃 Zasadniczo chciałem zasilić wszystko z 6xAA czyli +/- 9V przy czym przez stabilizator układy logiczne a bez stabilizacji napęd, ale obawiam się że dla przerobionych SG90 na dłuższą metę nie wyjdzie to na dobre 😃 więc chciałem obniżyć napięcie rezystorami ale wydaje mi się, że wydajność prądowa "padła". Przy okazji zaobserwowałem ciekawe zjawisko:D a mianowicie rezystory dawały ponad 6V ale jak wpiąłem L293 to napięcie spadło do 2,5V. Dlatego zrobię chyba jak mówisz, po prostu dam 2 stabilizatory 5V. 🙂

L293D to proste, ale stare układy. Jedną z głównych Wad tej konstrukcji jest właśnie wysoki spadek napięcia 🙁

Zadanie domowe 5.1

Wystarczy zamienić typ zmiennej wypełnienie na byte i usunąć warunek 🙂

Zadanie domowe 5.2

Pewnie da się prościej, ale proszę :

#define LED 9

int wypelnienie = 0;
int zmiana = 5;

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

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

}

Liczę, że pojawi się kolejna część kursu o wyświetlaczu LCD 🙂

[ Dodano: 16-07-2015, 12:58 ]

Zadanie domowe 5.3 🙂

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

Servo serwo;  //Tworzymy obiekt, dzięki któremu możemy odwołać się do serwa 
int pozycja = 0; //Aktualna pozycja serwa 0-180
int zmiana = 6; //Co ile ma się zmieniać pozycja serwa?
int przerwa = 200;

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

void loop() 
{  
 if (pozycja < 180) { //Jeśli pozycja mieści się w zakresie
   delay(przerwa);
   serwo.write(pozycja); //Wykonaj ruch

 } else { //Jeśli nie, to powrót na początek
   pozycja = 0;
   przerwa = 0;
 }    

 pozycja += zmiana; //Zwiększenie aktualnej pozycji serwa
 przerwa += 50;

} 

[size=9][ [i][b]Dodano[/b]: 16-07-2015, 16:37[/i] ][/size]
Zadanie domowe 5.4

#include <Servo.h>

String katS;
byte kat;
Servo servo;

void setup() 
{
 servo.attach(9);
 Serial.begin(9600);
 Serial.println("Podaj kat jaki chcesz ustawic :)");

}

void loop() 
{
   if(Serial.available()>0)
   {
   katS = Serial.readStringUntil('\n');
   kat = katS.toInt();
     if(kat<=180 && kat>=0)
     {
     servo.write(kat);
     Serial.println("Gotowe! Ustawiony kat to: "+ katS);
     }
     else Serial.println("Kat powinien miec wartosc <0:180> !");  
   }

delay(50);
}
  • Lubię! 1

Zadanie domowe 5.5

#include <Servo.h>
#define SERVO_PIN A5


int odczytADC;
int kat;
Servo servo;

void setup() 
{
servo.attach(9);
Serial.begin(9600);
Serial.println("Zmien kat za pomoca potencjometru");
}

void loop() 
{
  odczytADC = analogRead(SERVO_PIN);
  kat = map(odczytADC,0,1023,0,180);
  //Serial.println(kat);
  servo.write(kat);
  delay(50);
}

damian11, gratuluje rozwiązań. Rozumiem, że programy działają poprawnie? Na przyszłość umieszczaj kody programów w tagach , tym razem poprawiłem je za Ciebie 🙂 Nie zapominaj o komentarzach, brakuje ich przy 1 i 3 programie. Warto mieć taki nawyk.

Oczywiście kolejna część kursu się pojawi, tylko tak jak pisałem ciągle czekam, aż chociaż kilka osób pokaże rozwiązania do ostatniej części kursu (czyli 6). Chyba wszystkich kursantów ogarnęło wakacyjne lenistwo 😉

Co do zadania 5.2 - program działa dla zmiennej "zmiana" = 5. Ale czy będzie działał dla innej wartości? Np. zmiana = 4? Co zrobić, żeby nadal działał poprawnie?

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