Skocz do zawartości

Kurs Arduino - #5 - PWM, serwomechanizmy, biblioteki


Komentator

Pomocna odpowiedź

zezwala dodawać tylko do 255

[ Dodano: 13-01-2018, 20:06 ]

zadanie 5.2 Miałem mały problem z while nie sądziłem ze arduino tak szybko zlicza i ciągle świeciła mi dioda ;d ale Serial.begin pomógł 😉

#define czerwona 3
int wypelnienie = 0;
int czas = 200;
int zmiana = 5;

void setup() {
 pinMode(czerwona, OUTPUT);
 Serial.begin(9600);// sprawdzam czy wszystko dzala 
}

void loop() {
while (wypelnienie < 255){
 Serial.println(wypelnienie);
 analogWrite(czerwona, wypelnienie);
 wypelnienie = wypelnienie + zmiana;// rozswietlamy diode
 delay(czas);
}
while(wypelnienie > 0){
 Serial.println(wypelnienie);
 analogWrite(czerwona, wypelnienie);
 wypelnienie = wypelnienie - zmiana;// gasimy diode
 delay(czas);
}
}
Link do komentarza
Share on other sites

no właśnie działało bez warunku co mnie zaskoczyło skoro źle to jeszcze pomyśle a tu rozwiązanie na zadanie 5.3

#include <Servo.h>// ustawiamy bibliotekę
Servo serwomechanizm;// tworzymy obiekt do odwołania się dla serwa 
int pozycja = 0;
int zmiana = 6;
int czas = 200;//ustawiamy wstępny czas
int minuty = 10;//wydłużamy czas
void setup() {
 serwomechanizm.attach(9);// włączamy jako wyjście 9 serwomechanizmowi
}

void loop() {
 if (pozycja < 180){// zlicza od 0 do 180 stopni
   serwomechanizm.write(pozycja);// o ile ma wykonać ruch 
 }
 else {
   pozycja = 0;// ustawia pozycje znów na początek
 }
 pozycja = pozycja + zmiana;//przesuwa serwomechanizm
 delay(czas);// wstępny czas
 czas = czas + minuty;// wydłużamy czas reakcji serwomechanizmu
}

[ Dodano: 13-01-2018, 22:10 ]

odpowiedz na zadanie 5.4

#include <Servo.h>// ustawiamy bibliotekę
Servo serwomechanizm;// tworzymy obiekt do odwołania się dla serwa 
int pozycja = 0;
String dane = "";// wpisanie z komputera dane pozycji

void setup() {
 Serial.begin(9600);// połączenie z komputerem
 serwomechanizm.attach(9);// włączamy jako wyjście 9 serwomechanizmowi
}

void loop() {
 Serial.flush();// wykasowanie danych z bufora
 if(Serial.available() > 0){// sprawdzenie czy są jakieś dane w buforze
   dane = Serial.readStringUntil('\n');// odczytanie danych i wpisanie w nową linie
   pozycja = dane.toInt();// zmiana danych na pozycje i danie zmiennej int
   if (pozycja < 181){
     serwomechanizm.write(pozycja);// przesuniecie serwa o pozycje nadana przez nas
   }
   else {
      Serial.println(" zły zakres");
   }
 }


}

[ Dodano: 14-01-2018, 10:36 ]

Nie wiedziałem o co do końca chodzi w zadaniu 5.5 wiec zrobiłem na 3 sposoby

1.

#include <Servo.h>//ustawiamy bibliotekę
#define machina 9 //nadaje pinowi 9 nazwę
Servo serwomechanizm;// tworzymy obiekt do odwołania się dla serwa
int pozycja = 0;
int dane = 0;
float napiecie = 0;
int zmiana = 6;
float dzielnik = 3.0;// nasz dzielnik napięcia
void setup() {
 serwomechanizm.attach(machina);// ustawienie machiny jako output
}

void loop() {
 dane = analogRead(A5);// odczytanie danych z potencjometru
 napiecie = dane *(5.0/1023.0);// zamieniamy na napięcie
 if (napiecie > dzielnik){
   serwomechanizm.write(pozycja);//ustawiamy wstępnie serwomechanizm
   pozycja = pozycja + zmiana;// przesuwamy w lewo
   delay(200); 
 }
 else if (napiecie < dzielnik){
   serwomechanizm.write(pozycja);//ustawienie wstępne serwomechanizmu
   pozycja = pozycja - zmiana;// przesuwamy w prawo
  delay(200);
 }
}

2.

#include <Servo.h>// ustawiamy bibliotekę 
#define machina 9// nadajemy pinowi 9 nazwę
Servo serwomechanizm;// tworzymy obiekt do odwołania się dla serwa
int dane = 0;
float napiecie = 0;
float pozycja = 0;
void setup() {
 Serial.begin(9600);// połączenie z komputerem
 serwomechanizm.attach(machina);
}

void loop() {
 dane = analogRead(A5);// odczytanie danych z potencjometru
 napiecie = dane * (5.0/1023.0);// zamieniamy na napięcie
 pozycja = napiecie;
 pozycja = map(pozycja ,0,5,1,180);// dziele napięcie na odcinki 
   Serial.println(pozycja);// sprawdzam czy wszystko hula
   serwomechanizm.write(pozycja);//przesuwanie skokowo (na odcinki)
   delay(100);
}

3. ta opcja najbardziej mi się podobała 🙂

#include <Servo.h>// ustawiamy bibliotekę
#define machina 9// nadaje pinowi 9 nazwę 
Servo serwomechanizm;// tworzymy obiekt do odwołania się dla serwa
int dane = 0;
float pozycja = 0;
void setup() {
 Serial.begin(9600);// połączenie z komputerem
 serwomechanizm.attach(machina);
}

void loop() {
 dane = analogRead(A5);// odczytanie danych z potencjometru
 pozycja = dane;
 pozycja = map(pozycja ,0,1023,1,180);// dziele pozycje by mieściły się od 0 - 180 stopni
   Serial.println(pozycja);// sprawdzam czy wszystko hula
   serwomechanizm.write(pozycja);//przesuwam w lewo lub prawo 
   delay(100);
}
Link do komentarza
Share on other sites

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

Zadanie 5.4

wiem ze to było ponad 2 lata temu na topie, ale jako że to moje pierwsze w 100% samodzielnie zrobione zadanie domowe 😉 to muszę je tutaj wrzucić. 😅

__________

Komentarz dodany przez: Treker

Kody programów należy umieszczać przez narzędzie KOD (znajdziesz je w edytorze pod ikonką "<>"). Dzięki niemu składania programów jest automatycznie kolorowana, a wtedy wszystkim znacznie łatwiej analizować wklejone programy. Proszę to poprawić - z góry dziękuję za zrozumienie i pomoc przy utrzymaniu porządku na forum.

#include <Servo.h> // dodanie biblioteki odpowiedzialnej za serwa

Servo serwomechanizm; // obiekt serwomechanizmu aby moc sie do niego
//odwoływać

String pozycja = "";
int pozycjaint = 0;



void setup() {

Serial.begin(9600);
serwomechanizm.attach(9); // deklaracja podlaczenia serwa

}

void loop() {

if(Serial.available()>0) {
pozycja = Serial.readStringUntil('n');
Serial.println(pozycja);
pozycjaint = pozycja.toInt();
if(pozycjaint>=0 && pozycjaint<=180){
serwomechanizm.write(pozycjaint); // komenda do wykonania ruchu serwa
}else{
Serial.println("zla wartosc, podaj wartosc w zakresie 0-180");
}
}}
Link do komentarza
Share on other sites

PawełD, witam na forum 🙂 Kurs jest cały czas aktualny, więc śmiało można się chwalić swoimi programami! Pamiętaj tylko, aby kody wklejać wewnątrz tagów . Dzięki temu inni będą mogli łatwiej analizować Twoje programy - popraw to proszę 😉

Link do komentarza
Share on other sites

zadanie 5.5

widzę, że if-a mogłem opuścić, ale jak już dałem to niech zostanie

#include <Servo.h> // biblioteka serwa
Servo serwo; // obiekt serwa
int potencjometr = 0;

void setup() {

serwo.attach(9); //deklaracja podlaczenia serwa do pinu 9

}

void loop() {

 potencjometr = analogRead(A5);//odczytanie wartosci potencjometru
 potencjometr = map(potencjometr, 0, 1015, 0, 180);
 //przeskalowanie zmiennej potencjometr z zakresu 0-1015 na 0-180
 if(potencjometr>=0 && potencjometr <=180){
    serwo.write(potencjometr); //komenda do wykonania ruchu
 }
 delay(100);
}
Link do komentarza
Share on other sites

Cześć. 🙂

W zestawie, który kupiłem, razem ze stabilizatorem napięcia są dwa kondensatory - jeden ceramiczny (0.1 uF), drugi elektrolityczny (10uF). Czy ma jakieś znaczenie to gdzie podłącze który?

Link do komentarza
Share on other sites

Matas, witam na forum 🙂 Na tym etapie testów nie zrobi to większej różnicy - możesz na początku podłączyć oba na wyjściu stabilizatora.

Link do komentarza
Share on other sites

Marcin9405, witam na forum 🙂 Chętnie pomogę, ale sprawdź może najpierw programy innych czytelników (znajdziesz ich wiele w tym temacie). Powinny naprowadzić Cie na rozwiązania. Jak utkniesz w jakimś konkretnym miejscu to daj wtedy znać i będziemy razem myśleć.

Link do komentarza
Share on other sites

zadanie domowe 5.4

Witam mam takie pytanie dlaczego po wpisaniu małego kąta o jaki ma się obrócić serwomechanizm (<12) wykonuje on ciągłe obroty o 360 stopni zamiast o kat ustalonej wartości?

Ponizej kod programu.

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

Servo serwo;  //Tworzymy obiekt, dzięki któremu możemy odwołać się do serwa 

int zmiana = 0; //Co ile ma się zmieniać pozycja serwa?

String odbior = "";

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

void loop() 
{  


 Serial.println(" Podaj kat przesuniecia ramienia sweromechanizmu");
 while(Serial.available()==0){}
 odbior = Serial.readStringUntil('\n');
  zmiana = odbior.toInt();

  if(zmiana > 180 || zmiana < 0){
   Serial.println(" Kąt przesuniecia ramienia sweromechanizmu musi znajdowac sie w przedziale od 0 do 180");

 } else { 


  serwo.write(zmiana); //Wykonaj ruch

 }    


}
Link do komentarza
Share on other sites

dexu, widocznie otrzymałeś serwo inne od tego, które jest opisywane w kursie (bez blokady mechanicznej). Jeśli kupiłeś zestaw w Botlandzie to poproś o wymianę - nie będzie z tym żadnego problemu 🙂

Link do komentarza
Share on other sites

Dzień dobry

Mam pewien problem odnośnie serwa. Po wpisaniu polecenia jego obrotu o kąt >175 stopni (ale mniejszy niż 180) dociera do tego punktu, przez chwilę się trzęsie a następnie zaczyna obracać się o 360 stopni. Czy to znaczy, że serwomechanizm jest uszkodzony ?

Edit: Zauważyłem również , że kąty nie przebiegają prawidłowo, tj, różnica pomiędzy pozycją 0 stopni a pozycją 174 stopnie daje obrót o ponad 180 stopni

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.