Skocz do zawarto┼Ťci
Komentator

Kurs Arduino - #5 - PWM, serwomechanizmy, biblioteki

Pomocna odpowied┼║

@Patita, witam na forum ­čśë Widz─Ö, ┼╝e to Twoje pierwsze kroki na Forbocie, oto najwa┼╝niejsze informacje na start:

  • Chcesz przywita─ç si─Ö z innymi cz┼éonkami naszej spo┼éeczno┼Ťci? Skorzystaj z tematu powitania u┼╝ytkownik├│w.
  • Opis najciekawszych funkcji, kt├│re u┼éatwiaj─ů korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzie─ç?
  • Poszczeg├│lne posty mo┼╝esz ocenia─ç (pozytywnie i negatywnie) za pomoc─ů reakcji - ikona serca w prawym dolnym rogu ka┼╝dej wiadomo┼Ťci.

22 minuty temu, Patita napisał:

Czy mo┼╝liwe jest by pod┼é─ůczy─ç dwa serwa kt├│re jednocze┼Ťnie b─Öd─ů wykonywa┼éy dwa r├│┼╝ne ruchy?

Tak, oczywi┼Ťcie - bez ┼╝adnego problemu.┬á

Udost─Öpnij ten post


Link to post
Share on other sites

Witam, 

Jako ca┼ékowity amator mam problem, mianowicie w lekcji 3 by┼éo pokazane pobieranie tekstu. Natomiast w zadaniu domowym z lekcji o serwomechanizmach i PWM jest zadanie domowe 5.4. Nie mam totalnie poj─Öcia jak pobra─ç zmienn─ů, pr├│bowa┼éem konwersji, zagl─ůdn─ů┼éem na strone arduino do manuali, i ka┼╝da pr├│ba pobrania zmiennej ko┼äczy si─Ö fiaskiem.

Niby pobiera warto┼Ť─ç liczbow─ů, i wy┼Ťwietla j─ů, ale zaraz potem niezaleznie od metody jest jaka┼Ť nag┼éa odpowied┼║ mikro-kontrolera. (zaznaczam i┼╝ ta 5 nie ma nic wspolnego z odpowiedzi─ů, niezale┼╝nie od tej linijki i tak wy┼Ťwietlane s─ů warto┼Ťci wpisane, i zaraz potem ca┼ékowicie niespodziewana liczba.

Dlaczego? ­čś×

Przechwytywanie2.JPG

Udost─Öpnij ten post


Link to post
Share on other sites

@krzych90, witam na forum ­čśë Widz─Ö, ┼╝e to Twoje pierwsze kroki na Forbocie, oto najwa┼╝niejsze informacje na start:

  • Chcesz przywita─ç si─Ö z innymi cz┼éonkami naszej spo┼éeczno┼Ťci? Skorzystaj z tematu powitania u┼╝ytkownik├│w.
  • Opis najciekawszych funkcji, kt├│re u┼éatwiaj─ů korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzie─ç?
  • Poszczeg├│lne posty mo┼╝esz ocenia─ç (pozytywnie i negatywnie) za pomoc─ů reakcji - ikona serca w prawym dolnym rogu ka┼╝dej wiadomo┼Ťci.

1 godzinę temu, krzych90 napisał:

Niby pobiera warto┼Ť─ç liczbow─ů, i wy┼Ťwietla j─ů, ale zaraz potem niezaleznie od metody jest jaka┼Ť nag┼éa odpowied┼║ mikro-kontrolera. (zaznaczam i┼╝ ta 5 nie ma nic wspolnego z odpowiedzi─ů, niezale┼╝nie od tej linijki i tak wy┼Ťwietlane s─ů warto┼Ťci wpisane, i zaraz potem ca┼ékowicie niespodziewana liczba.

Widocznie wysy┼éasz do Arduino "co┼Ť wi─Öcej" opr├│cz wpisanej przez Ciebie liczby. Zapewne wynika to z ustawie┼ä Twojego monitora portu szeregowego:

1.png 2.png

W obecnej formie program "my┼Ťli", ┼╝e przesy┼éane znaki linii te┼╝ maj─ů by─ç traktowane jak liczby st─ůd pojawia si─Ö 0+5=5. Je┼Ťli chcesz tego unikn─ů─ç to wystarczy tak zmieni─ç ustawienia nadawania, aby nie wysy┼éa─ç ┼╝adnych innych znak├│w. Mo┼╝esz te┼╝ zmodyfikowa─ç┬áprogram, aby sam filtrowa┼é takie znaki.

PS na przysz┼éo┼Ť─ç umieszczaj kody program├│w w tre┼Ťci wiadomo┼Ťci i wklejaj zrzuty ekranu ca┼éego okna monitora portu szeregowego to b─Ödzie ┼éatwiej udzieli─ç pomocy ­čśë

Udost─Öpnij ten post


Link to post
Share on other sites

Dzi─Ökuj─Ö za pomoc w pocz─ůtkach zabawy z Arduino :)

Genialne, tyle godzin nad tym spędziłem a po zmianie w monitorze portu szeregowego jest OK :)

a jak wygl─ůda┼éaby modyfikacja, aby program sam filtrowa┼é znaki?

 

Udost─Öpnij ten post


Link to post
Share on other sites

@krzych90, nie mam teraz pod r─Ök─ů Arduino, ale pewnie wystarczy┼éoby co┼Ť takiego doda─ç do Twojego programu┬á(trim usuwa bia┼ée znaki):

    String odebrane = Serial.readString();
    odebrane.trim();
    zmienna = odebrane.toInt();

 

Udost─Öpnij ten post


Link to post
Share on other sites
(edytowany)

Hej, mam pytanko. Serwo zawsze na pocz─ůtku ustawia si─Ö do pozycji oko┼éo 90 stopni, czy to mo┼╝na jako┼Ť zmieni─ç? By np zaczyna┼é od 0.

 

Edytowano przez Karliko

Udost─Öpnij ten post


Link to post
Share on other sites

@Karliko, serwomechanizm tego typu nigdy nie ustawia si─Ö sam w ┼╝adnej pozycji. Wszystko zale┼╝y od programu ­čÖé

Udost─Öpnij ten post


Link to post
Share on other sites
(edytowany)
#define diodaPIN 3

byte wypelnienie = 0;
int zmiana = 5;

void setup() {
  pinMode(diodaPIN, OUTPUT);//Konfiguracja pinu jako wyj┼Ťcia 
}

void loop() {
  analogWrite(diodaPIN, wypelnienie); //Generujemy sygnał o zadanym wypełnieniu

 wypelnienie=wypelnienie+zmiana;
 
  delay(50); //Małe opóźnienie, aby efekt był widoczny
}

zad5.1 

Jest latwe nawet dla kogos kto nie potrafi programowac┬á­čÖé

#define diodaPIN 3

byte wypelnienie = 0;
int zmiana = 5;

void setup() {
  pinMode(diodaPIN, OUTPUT);//Konfiguracja pinu jako wyj┼Ťcia 
}

void loop() 
{
  analogWrite(diodaPIN, wypelnienie); //Generujemy sygnał o zadanym wypełnieniu

  if (wypelnienie < 255) 
  { //Je┼Ťli wype┼énienie mniejsze od 100%
    wypelnienie = wypelnienie + zmiana; //Zwiększamy wypełnienie

  
  }
  else if(wypelnienie==255) // Je┼Ťli wype┼énienie osi─ůgnie 100%
  {
    while(wypelnienie>0) // Je┼Ťli wype┼énienie wi─Öksze od 0 
    {
    wypelnienie=wypelnienie-zmiana; // Zmniejsz je do 0
    analogWrite(diodaPIN, wypelnienie);
    delay(15);
    }
  } 
 
  delay(15); //Małe opóźnienie, aby efekt był widoczny
}

zad 5.2 

Wydaje mi sie ze dziala poprawnie. Prosze o podpowiedz jesli mozna cos zmienic na lepsze poniewaz sie ucze┬á­čÖé

5.4

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

Servo servoMechanizm; //Tworzymy obiekt, dzieki ktoremu mozemy odwolac sie do serwa
int pozycja=0; // Aktualna pozycja serva 0-100

void setup() 
{
  Serial.begin(9600);
  servoMechanizm.attach(9); //Servomechanizm podlaczony do pinu 9
}

void loop() 
{
  Serial.print("Poczatkowa pozycja: ");
  Serial.println(pozycja);
  for(int pozycja; pozycja<=180; pozycja++) //Zwiekszaj pozycje
  {
    Serial.print("Aktualna pozycja: ");
    Serial.println(pozycja);
    servoMechanizm.write(pozycja); //Wykonaj ruch
    if(pozycja ==180)
    {
      Serial.print("Maksymalna pozycja: ");
      Serial.println(pozycja);
      pozycja=0;
    }
    delay(50);
  }
}

Jak to poprawic? 

Chcialbym aby terminal byl bardziej czytelny + chce zeby kiedy silnik dojedzie do pozycji maks wyswieltal sie ponownie napis pozycja poczatkowa.┬á­čÖä

Edytowano przez arek2007100

Udost─Öpnij ten post


Link to post
Share on other sites
Dnia 7.03.2019 o 15:16, arek2007100 napisał:

Chcialbym aby terminal byl bardziej czytelny + chce zeby kiedy silnik dojedzie do pozycji maks wyswieltal sie ponownie napis pozycja poczatkowa´╗┐.

Co dok┼éadnie chcia┼éby┼Ť poprawi─ç? Wy┼Ťwietlanie napisu o pozycji pocz─ůtkowej najpro┼Ťciej b─Ödzie uzale┼╝ni─ç od warto┼Ťci zmiennej pozycja - b─Ödziesz m├│g┼é wy┼Ťwietla─ç wtedy odpowiednie komunikaty dla praktycznie dowolnej pozycji ­čÖé

Udost─Öpnij ten post


Link to post
Share on other sites
(edytowany)

Witam,

Do tej pory przerobi┼éem wszystkie zadania, ale mam pytanie dotycz─ůce┬áserwo z kursu. Doczyta┼éem ju┼╝ z poprzednich post├│w, ┼╝e mo┼╝e by─ç to inny model, bez blokady mechanicznej. Na pewno takiej nie posiada, bo wykonuj─ůc poni┼╝szy program zachowuje si─Ö inaczej ni┼╝ za┼éo┼╝enia w kursie.


#include <Servo.h> // Biblioteka

Servo serwomechanizm; // tworzenie obiektu
int pozycja = 0; // aktualna pozycja
int zmiana = 6; // zmiana pozycji serwa

void setup() {
  serwomechanizm.attach(5); // pod┼é─ůczenie do pinu 5
  Serial.begin(9600); // pr─Ödko┼Ť─ç transmisji
}

void loop() {
  if (pozycja < 180) { // je┼╝eli pozycja jest <180
    serwomechanizm.write(pozycja); // wykonanie ruchu
  } else { // w przeciwnym wypadku
    pozycja = 0;
  }
  Serial.println(pozycja); // wy┼Ťwietl pozycj─Ö
  pozycja += zmiana; // zwi─Ökszenie pozycji
  delay(200); // op├│┼║nienie
}

Najpierw wykonuje kilka obrot├│w. Nast─Öpnie zwalnia, wykonuje powolny obr├│t o kilkadziesi─ůt stopni i wraca do po┼éo┼╝enia innego, ni┼╝ pocz─ůtkowe. Wg monitora portu szeregowego zmiana kierunku obrot├│w nast─Öpuje przy warto┼Ťci 90. Przy nastawieniu pozycji na kilkana┼Ťcie "stopni" kr─Öci si─Ö w jedn─ů stron─Ö. Nie jestem pewien jak d┼éugo, bo wol─Ö go w ten spos├│b nie eksploatowa─ç. Wygl─ůda, jakby serwo jednak nie interpretowa┼é┬ázadanej pozycji, jako stopnie wychylenia┬áz pozycji zerowej.

Moje pytania brzmi─ů. Po pierwsze, czy nie pope┼éni┼éem jakiej┼Ť g┼éupoty w programie (s─ůdz─Ö, ┼╝e pod┼é─ůczy┼éem wszystko w┼éa┼Ťciwie). Je┼╝eli wszystko jest napisane poprawnie,┬áczy mog─Ö to serwo zmusi─ç do wsp├│┼épracy? Wiem ju┼╝, ┼╝e mog─Ö pr├│bowa─ç pisa─ç do botlandu o serwo dok┼éadnie taki┬ájak w kursie, ale s─ůdz─Ö, ┼╝e m├│g┼ébym spr├│bowa─ç pracowa─ç z tym co mam.┬áZw┼éaszcza, ┼╝e nie jest najwidoczniej┬áuszkodzony.

Edytowano przez Kage

Udost─Öpnij ten post


Link to post
Share on other sites

@Kage, witam na forum ­čśë Widz─Ö, ┼╝e to Twoje pierwsze kroki na Forbocie, oto najwa┼╝niejsze informacje na start:

  • Chcesz przywita─ç si─Ö z innymi cz┼éonkami naszej spo┼éeczno┼Ťci? Skorzystaj z tematu powitania u┼╝ytkownik├│w.
  • Opis najciekawszych funkcji, kt├│re u┼éatwiaj─ů korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzie─ç?
  • Poszczeg├│lne posty mo┼╝esz ocenia─ç (pozytywnie i negatywnie) za pomoc─ů reakcji - ikona serca w prawym dolnym rogu ka┼╝dej wiadomo┼Ťci.

Dnia 11.03.2019 o 18:27, Kage napisał:

Nast─Öpnie zwalnia, wykonuje powolny obr├│t o kilkadziesi─ůt stopni i wraca do po┼éo┼╝enia innego, ni┼╝ pocz─ůtkowe. Wg monitora portu szeregowego zmiana kierunku obrot├│w nast─Öpuje przy warto┼Ťci 90.

Je┼Ťli Twoje serwo zmienia kierunek obrot├│w o 360*, to wygl─ůda na to, ┼╝e posiadasz z┼ée serwo. Konkretnie masz serwo 360*, kt├│re u┼╝ywa si─Ö np. do nap─Ödzania┬áma┼éych robot├│w. W przypadku tych serw nie ma mo┼╝liwo┼Ťci, aby kontrolowa─ç ich po┼éo┼╝enie. Zmiana wype┼énienia sygna┼éu PWM wp┼éywa tylko na kierunek i pr─Ödko┼Ť─ç obrot├│w. pozostaje wi─Öc wymiana na w┼éa┼Ťciwe serwo lub po prostu mo┼╝esz zostawi─ç sobie takie, bo te┼╝ jest przydatne ­čśë

Udost─Öpnij ten post


Link to post
Share on other sites

Witam,

Od jakiego┼Ť czasu┬ázmaga┼éem si─Ö z lekcj─ů #5 kursu arduino i sterowaniem serwem SG90.┬áProblem polega┼é na tym, ┼╝e nie da┼éo si─Ö nim kompletnie sterowa─ç, tak jak to jest opisane w kursie. Jego ramie porusza┼éo sie chaotycznie w zakresie ok 15 stopni, a samo serwo mocno drga┼éo (co widac na zalaczonym gifie).

Jezeli chodzi o zasilanie, to pr├│bowa┼éem r├│┼╝nych konfiguracji: bezpo┼Ťrednie pod┼é─ůczenie serwa do zasilacza LW-K3010D, zasialnie z zasilacza┬ápoprzez LM7805┬álub z wykorzystaniem baterii. W ka┼╝dej wersji zasilanie prowadzone by┼éo niezale┼╝nie od p┼éytki, kt├│r─ů zasila┼éem z USB z kompa. W skr├│cie sygnal PWM z pin 9 by┼é podawany z arduino, a zasialnie silnika sz┼éo oddzielnie poza kontrolerem. Za kazdym razem objawy by┼éy identyczne.

Program do sterowania zosta┼é skopiowany ze strony, jak nale┼╝y. Doda┼éem dwie linie kodu, aby odczyta─ç warto┼Ťci 'pozycja' przez serial monitor i PWM dzia┼éa┼éo┬ábez zarzutu. Niby wszystko┬á by┼éo ok, ale serwo trz─ůs┼éo si─Ö jak przy ataku ┼╝├│┼étej febry. Ogarnia┼éa mnie ju┼╝ desperacja i mia┼éem ochot─Ö si─Ö podda─ç, gdy wpad┼éem na pomys┼é p┼é─ůczenie masy p┼éytki z mas─ů zasilania silnika w serwie. I to by┼éo bingo. Drgawki usta┼éy, a ramie zacz─Ö┼éo sie rytmicznie porusza─ç. Wprawdzie, nie wszystko jeszcze dzia┼éa dobrze, bo ramie kr─ů┼╝y w zakrasie┬á 0-165 stopni, ale mam nadziej─Ö, ┼╝e dojd─Ö do tego, jak uzyska─ç obr├│t 0-180. Mo┼╝e macie jakie┼Ť sugestie?

Mam nadziej─Ö, ze ten wpis zaoszcz─Ödzi komu┼Ť troch─Ö czasu.

 

Serwo SG90 fail.gif

Udost─Öpnij ten post


Link to post
Share on other sites

@walfer2000┬áczy to serwo pochodzi z naszego zestawu? Pytam, bo nie widz─Ö, aby┼Ť mia┼é przypisany jaki┼Ť zestaw do swojego konta na forum, a warto by┼éoby zacz─ů─ç od tego czy wina nie le┼╝y w zakupie z┼éego nap─Ödu. Akurat w przypadku tego typu serwa symbol SG90 nie m├│wi zbyt wiele, bo producenci pod t─ů sam─ů nazw─ů┬áwypuszczaj─ů na rynek zupe┼énie r├│┼╝ne nap─Ödy.

Udost─Öpnij ten post


Link to post
Share on other sites

Problem zosta┼é ju┼╝ pozytywnie rozwi─ůzany. Mea culpa. Wielkie dzi─Öki za pomoc.

 

Udost─Öpnij ten post


Link to post
Share on other sites

Zadanie 5.3

#include <Servo.h>

Servo serwo;
int pozycja = 0;
int zmienna = 6;
int opoznienie = 200;
int zmiana = 50;
void setup() {
  
  serwo.attach(9);
}

void loop() {
  if (pozycja < 180){
    serwo.write(pozycja);
  } else {
    pozycja = 0;
  }

  pozycja = pozycja + zmienna;
  delay(opoznienie);

  opoznienie = opoznienie + zmiana;
}

 

Udost─Öpnij ten post


Link to post
Share on other sites

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─Ö ┬╗

×