Skocz do zawartości

Kurs Arduino - #5 - PWM, serwomechanizmy, biblioteki


Komentator

Pomocna odpowiedź

Na przypadek nr 1 nie ma co patrzeć, bo układ  nie jest prawidłowo podłączony. 

W ogóle nie ma sensu go rozpatrywać. 

Link do komentarza
Share on other sites

1 godzinę temu, crazyman napisał:

1. brak polaczenia GND miedzy zasilaniem serwa i Arduino - sa widoczne "impulsy"

Oscyloskop to czuła rzecz. Jeżeli coś działa jak "antena", to możesz widzieć zniekształcone 50 Hz przemienne z sieci.

Link do komentarza
Share on other sites

Zauważ, że te dziwne przebiegi, jake obserwujesz na oscyloskopie mają częstotliwość 50Hz. Nie jest to więc sygnał PWM.

W naszych mieszkaniach jest wszechobecne pole elektromagnetyczne pochodzące z przewodów sieciowych, które indukuje prądy w przewodach Twojego układu. Ponieważ wejście osycyloskopu ma bardzo dużą oporność, to może zobrazować nawet takie nikłe  prądy.

Podobne obrazki możesz otrzymać chwytając dwoma palcami czubek sondy osycyloskopu. Bez żadnego układu.

Link do komentarza
Share on other sites

11 godzin temu, jand napisał:

Zauważ, że te dziwne przebiegi, jake obserwujesz na oscyloskopie mają częstotliwość 50Hz. Nie jest to więc sygnał PWM.

W naszych mieszkaniach jest wszechobecne pole elektromagnetyczne pochodzące z przewodów sieciowych, które indukuje prądy w przewodach Twojego układu. Ponieważ wejście osycyloskopu ma bardzo dużą oporność, to może zobrazować nawet takie nikłe  prądy.

Podobne obrazki możesz otrzymać chwytając dwoma palcami czubek sondy osycyloskopu. Bez żadnego układu.

polaczone_GND.thumb.jpg.6789c2bd0e9e11ce8d2c0e9a1421a403.jpgbrak_GND.thumb.jpg.0ca67f4373a54ca6a43f9fb436c9ce2a.jpg

Tylko zarowno przebieg z polaczonymi GND jak i bez majate sama czestotliwosc. Czyli jest zaleznosc zachowana.

Patrzac na podzialke oscyloskopu mamy  okresy dla obu brzebiegow T=20ms f=1/20ms=50Hz.

Nie wiem dlaczego Arduino podaje taki sygnal, ale jest ok, poniewaz zgodnie z cwiczeniem Botland kiedy program wykonuje kolejne przesuniecia serwa wypelnienie/szerokosc impulsu  powieksza sie i przy powrocie do zerowej pozycji zweza sie do stanu poczatkowego.

Szukam logicznego uzasadnienia tych zaleznosci. @jand@orb777

 

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

Zarówno częstotliwość przebiegu sterowania serwem, jak i napięcie w sieci mają 50Hz, więc nie wiadomo, co tak naprawdę oglądasz sygnał, czy zakłócenia.

58 minut temu, crazyman napisał:

Nie wiem dlaczego Arduino podaje taki sygnal

Sterowanie serwem polega na podaniu sygnału o zmiennej długości impulsu w przedziale od 1ms (jedno skrajne położenie) do 2ms (drugie skrajne położenie).

Spójrz tu

Link do komentarza
Share on other sites

(edytowany)
3 godziny temu, jand napisał:

Zarówno częstotliwość przebiegu sterowania serwem, jak i napięcie w sieci mają 50Hz, więc nie wiadomo, co tak naprawdę oglądasz sygnał, czy zakłócenia.

Sterowanie serwem polega na podaniu sygnału o zmiennej długości impulsu w przedziale od 1ms (jedno skrajne położenie) do 2ms (drugie skrajne położenie).

Spójrz tu

Tak ja to rozumiem. Napisalem Dlaczego Arduino podaje taki sygnal chodzilo mi, ze generalnie arduino ma PWM 490/s a nie 50Hz. 😉

Juz wiem Czestotliwosc PWM mozna regulowac w zaleznosci od biblioteki, tak np dla servo.h znalazlem wpis:

"I have tried changing REFRESH_INTERVAL up to 400Hz(2500ms) in servo.h many times but i got the same result from an oscilloscope tha the frequency kept same as 50Hz(20000ms as default).

Today, I copied the library servo.h to desktop changed the value then recopied to where it was. (Program Files>Arduino>Libraries>Servo>src). Now, i can get any frequency i want."

 

Edytowano przez crazyman
Link do komentarza
Share on other sites

Generalnie pwm w Arduino nie ma nic wspólnego ze sterownikiem serwo z wyjątkiem tego, że używają tego samego timera.

Link do komentarza
Share on other sites

(edytowany)

Dzień dobry. Napotkałem pewien bardzo obcy oraz niezrozumiały dla mnie problem odnośnie servomechanizmów miałem układ gdzie:

Masa serva i L7805V była podłączona do masy arduino ,

wyjście L7805V do wejścia serva ,

sygnał steryjący serva pod pin 5 w arduino ,

wejście L7805V do Vin arduino ,

podłądczona pod arduino bateria ,

poiędzy wejściem L7805V a jego masą kondensator ceramiczny 104 ,

pomiędzy masą o wyjściem L7805V kondesator ceramiczny 104 ,

wyjście potencjometru na mase do arduino ,

wejście to pin 5V od arduino a środek potencjometra na A5 ,

po wgraniu poprawnego kodu wszystko dobrze działało , potem poszłem z moim orginalnym arduino uno odłanczając go od USB , nadal wszystko dobrze działało dopuki nieodłączyłem potencjometra od breadboard i wtedy servo zaczeło wariować a następnie nic nierobiło , poprostu zaczeło wydawać z siebie "cichawe puknięcia" , po ponownym podłączeniu potencjometra mimo jego przekręcania nic się niezmieniało ,

sprawdziłem czy jakiś element się przypadkiem nieuszkodził ale wszystkie kable , potencjometr , kondensatory , oraz L7805V były nieuszkodzone , sprawdzałem wiele różnych tych samych układów L7805V dla pewności czy się niepomyliłem , wszystko to niebyło uszkodzone , mało tego sprawdziłem symboliczny program odnośnie czytania potencjometru i symboliczny program działał ,

sprawdziłem również symboliczny program do sprawdzania serv i servo nadal wydawało ten dzwięk , sprawdziłem również inne serva i również ten sam dzwięk ,

sprawdziłem również symboliczny program do weryfikacji czy sygnał PWM działa(sprawdziłem na diodzie) i sygnał PWM działał ,

następnego dnia zrobiłem znowu wszystko to samo i i tak mimo zmainy wszystkich pozycji na breadboard , zachowanie tego samego schematu połączeń który napisałem na górze , a nstępnie zmienienie w programie pinu od sterowania serva i zmiany pinu od sterowania potęcjometru nieudało się naprawić problemu ,

program wyglądał tak kiedy doszło do awari po odłączeniu potencjometru :

#include <Servo.h>
#define servoDef1 9

Servo servObject1;

int potentiometer = 0;

void setup() {
  servObject1.attach(servoDef1);
}

void loop() {
  potentiometer = analogRead(A4);
  potentiometer = map(potentiometer , 0 , 1023 , 0 , 180);
  servObject1.write(potentiometer);
  delay(15);
}

}

, teraz porgram którym sprawdziłem potencjometry a właściwie to czy działa czytanie potencjometrów :

int valueP = 0;

void setup() {

Serial.begin(9600);

}

void loop() {

valueP = analogRead(A4);

Serial.println(valueP);

delay(785);

}

teraz pokarze program którym sprawdziłem PWM :

#define diode 5

int filling = 0;

int change = 5;

void setup() {

pinMode(diode, OUTPUT);

}

void loop() {

analogWrite(diode, filling);

if(filling == 255){

change = -5;

}

if(filling == 0){

change = 5;

}

filling = filling + change;

delay(50);

}

, teraz pokarze program do symbolicznego sterowania servem przez serial monitor :

#include <Servo.h>

#define servoOnePin 9

Servo servoOne;

String intForServoOne = "";

int position = 180 ;

int workingNowPositionServoOne = 0;

void setup() {

Serial.begin(9600);

Serial.println("*serial available test*");

Serial.println("enter the eangle for the servo");

servoOne.attach(servoOnePin);

servoOne.write(position);

}

void loop() {

if(Serial.available()){

intForServoOne = Serial.readStringUntil("\n");

intForServoOne.trim();

workingNowPositionServoOne = intForServoOne.toInt();

if(intForServoOne != String(workingNowPositionServoOne)){

Serial.println("error: u must give a number");

return;

}

if(workingNowPositionServoOne >= 0 && workingNowPositionServoOne <= 180){

servoOne.write(workingNowPositionServoOne);

}

if(workingNowPositionServoOne < 0){

Serial.println("error: ur value is negative");

}

if(workingNowPositionServoOne > 180){

Serial.println("error: ur value is too high");

}

if(workingNowPositionServoOne < 0 || workingNowPositionServoOne > 180){ Serial.println("error: ur value must be between 0-180");

}

}

}

, programy były tworzone własnoręcznie przemnie , wszystkie działały przed awarią ponieważ ich zapisałem jeszcze wtedy kiedy niebyłem świadomy że napotkam taki problem. Prosiłem ChatGTP o pomoc ale nieudało mi się rozwiązać problemu mimo to. Testowałem nawet polecane przez ChatGPT wartości kondesatorów ale to niepomogło. Pogodziłem się z tym że poprostu jest coś nie tak więc zamuwiłem nową płytkę , tym razem z taką różnicą że to podróbka od msalamon z allegro i kiedy wziołem się po dłuższym okresie przerwy za programowanie zadecydowałem że wezmę się za ten temat ponownie ponieważ sterowanie servem jest dla mnie ważną umiejętnością do nauczenia. Postanowiłem że przetestuję klona na waszym programie który miał za zadanie poruszać ramieniem serva, oto on :

#include <Servo.h> //Biblioteka odpowiedzialna za serwa
 
Servo serwomechanizm;  //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?
 
void setup() 
{ 
  serwomechanizm.attach(9);  //Serwomechanizm podłączony do pinu 9
} 
 
void loop() 
{  
  if (pozycja < 180) { //Jeśli pozycja mieści się w zakresie
    serwomechanizm.write(pozycja); //Wykonaj ruch
  } else { //Jeśli nie, to powrót na początek
    pozycja = 0;
  }    
  
  pozycja = pozycja + zmiana; //Zwiększenie aktualnej pozycji serwa
  delay(200); //Opóźnienie dla lepszego efektu                        
}

Niestety mimo zamuwienia nowego klona nadal słysze "ciche pukania" z servomechanizmu. produkt klona ma bardzo dobre opinie na allegro(to ta za kilkanaście złotych).Niemam pojecia co zrobić jestem całkiem świerzy jeśli chodzi o świat elektroniki oraz arduino. Szukałem pomocy u nuczyciela od przedmiotów zawodowych(jest elektronikiem), ale niestety jest zbyt zajęty aby mi pomóc. Niemam nikogo wokuł kto by się na tym znał dlatego mam nadzieje że znajdę pomoc u was , z góry dziękuje wam bardzo za udzielenie odpowiedzi na to pytanie nawet jeśli nieprzyniesie dla mnie rezultatu. Jeśli problem wydaję się zbyt skomplikowany dla was prosze o informacje odnośnie istnienia innych forów (zagranicznych również)(nieważne czy to na stronach internetowych czy na discordzie czy innych tego typu rzeczach poprostu każde forum jakie może być dla mnie zbawieniem) lub też innych zródeł informacji(jakich kolwiek, gdzie kolwiek) które pomogą mi rozwiązać problem, to moje pierwsze pytanie na jakim kolwiek forum w moim życiu, mam nadzieje że zachowałem pewne "normy", "niepisane zasady"(itd.) odnośnie kultury które mogą być mi obce ze względu na sutuację.

Czy kupienie kolejnej orginalnej płytki arduino rozwiązałoby problem? 

Bardzo przepraszam jeśli ostatni kod jest nieczytelny ale niestety zapisując go w notatniku jego większa część została ucięta, został on skopiowany oraz wklejony z napisanego przeze mnie pytania do ChatGPT, postarałem się poprawić jego czytelność i sprawdziłem czy oby napenwo jest dobry w odczytaniu , jeśli nie prosze o zwrócenie mi uwagi, mam nadzieje że umożliwi mi to większą uwagę na przyszłość

Edytowano przez Tluczus247
Link do komentarza
Share on other sites

Udało się rozwiązać problem.

Okzało się że zródło miało za mało mA więc urzyłem powerbank-a do tego zamiast wyjścia USB z komputera + nie urzyłem baterii 9V.

Pozdrawiam.

  • Lubię! 1
Link do komentarza
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ę »
×
×
  • 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.