Skocz do zawartości

Kurs Arduino - #5 - PWM, serwomechanizmy, biblioteki


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);
}
}
zezwala dodawać tylko do 255

Oj to chyba coś Ci ucięło przy wklejaniu programu. Czy nie powinno tam być żadnego warunku 😉?

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

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

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

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);
}
  • 3 tygodnie później...

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?

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.

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

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

 }    


}

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 🙂

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

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