Skocz do zawartości

Kurs Arduino - #5 - PWM, serwomechanizmy, biblioteki


Pomocna odpowiedź

Nic się nie dzieje, bo jak 'val' będzie miało wartość 0 to żaden z warunków z if-ów nie będzie spełniony 🙂 masz wszędzie warunki val>0 lub val<0, nigdzie 0 się nie łapie.

Dzięki. Właściwie to już mi się przypomniało (po Twojej odpowiedzi), dlaczego nie przypisałem zera dla val 🙂 (miałem tygodniową przerwę).

Zadanie 5.2

Próbowałem sterować częstotliwością pulsowania diody poprzez zmianę danej "zmiana". Niestety program działa tylko dla dzielników liczby 255, ponieważ z wiadomych przyczyn np. dla 19 :

wypełnienie = 247 + 19 nie równa się 255, ale przeskakuje na 11, więc się rozświetla i gaśnie i tak w kółko. Jak rozwiązać ten problem. Z góry dziękuję za odpowiedź 🙂

#define LED 5

short wypelnienie = 0;
int zmiana = 5;
int opoznienie = 30;

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

void loop() {

   while (wypelnienie != 255) {        //Rozjaśnianie
     analogWrite(LED, wypelnienie);
     wypelnienie += zmiana;

     delay(opoznienie);
   }

   while (wypelnienie != 0) {          //Przyciemnianie
     analogWrite(LED, wypelnienie);
     wypelnienie -= zmiana;

     delay(opoznienie);
   }
}

Zamiast jako warunek sprawdzać równość:

while (wypelnienie != 255)

znacznie bezpieczniej jest używać porównywać operatorem większe/mniejsze, np.:

while (wypelnienie <= 255)

Program będzie wymagał kilku mniejszych zmian, ale ogólnie lepiej jest używać < niż !=. Dzięki temu jeśli licznik z jakiegoś powodu "przeskoczy", program ma szansę wrócić do poprawnego stanu.

Witam,
pozwolę sobie zacytować jedno zdanie: "Oczywiście konieczne są również kondensatory filtrujące. ". Czy rzeczywiście konieczny jest kondensator skoro stosujemy stabilizator? Czy on sam w sobie nie działa trochę jak kondensator? Jeżeli kondensator jest konieczny to podłączamy go równolegle między IN i GND stabilizatora czy jak? Z góry dziękuję za odpowiedź.

Informacje gdzie i jakie kondensatory podłączać do stabilizatora najlepiej poszukać w dokumentach "data sheet", czyli kartach katalogowych danego producenta. Dobór odpowiednich kondensatorów jest szczególnie ważny przy stabilizatorach LDO, gdzie są one niezbędne do poprawnej pracy.

Wojciech_M, kondensatory są konieczne - tak jak napisał grg0 potwierdzenie znajdziesz w nocie katalogowej LM7805. Producent podaje jakie minimalnie kondensatory należy podłączyć, aby zapewnić jego poprawną pracę.

Cześć,

Moje serwo dziwnie się zachowuje, mianowicie :

Przy bezpośrednim podłączeniu do arduino ( zastosowany program z kursu ) wszystko jest OK. Natomiast przy podłączeniu przez stabilizator serwo zaczyna wariować tzn. : samo z siebie przechodzi z jednej skrajnej pozycji do drugiej ( niezgodnie z programem ) przy czym dotarcie do skrajnej pozycji powoduje spadek napięcia z ~11V do ~5.5V. Przy poruszaniu się ramienia serwa napięcie jest w porządku. Proszę o jakieś sugestie.

Pozdrawiam 🙂

Moje pytanie może być trochę trywialne, ale w jaki sposób wczytać liczbę przez UART do arduino. kompilator nie przyjmuje podania tego jako string, a jest to niezbędne do wykonania zadania domowego 5.4.

RybaSG, jeśli masz możliwość sprawdzenia układu z nową baterią 9V, to powtórz eksperyment 😉 Jeśli zasilałeś układ z niej wcześniej, to mogła się już trochę rozładować i nie daje rady zasilić teraz serwa. Baterie 9V nie są idealne do zasilania takich układów - tutaj są używane demonstracyjnie, jeśli chciałoby się zasilać takie serwo dłużej, to trzeba pomyśleć np. o akumulatorach.

damianmyszko, UART w Arduino operuje na ciągach tekstowych dlatego liczbę należy wczytać jako string. Aby było możliwe wykorzystanie jej później w programie można skorzystać np. z funkcji, która dokona za nas takiej zamiany: https://www.arduino.cc/en/Tutorial/StringToIntExample

Używałem zasilacza 12V, 500mA. Spróbuje z innym źródłem, może on był winowajcą skoro bezpośrednio z arduino wszystko było dobrze.

@EDIT : Zmieniłem zasilacz, wszystko gra 🙂

  • 4 tygodnie później...

witam chodzi o zadanie domowe 5.4 to jest kod i on nie działa co jest tu nie tak?

#include <Servo.h> 

Servo serwomechanizm;  
String inString = ""; 
int pozycja;

void setup() 
{ 
 serwomechanizm.attach(9);  
 Serial.begin(9600);
 Serial.println("Podaj liczbe od 0 do 180:");
} 

void loop() 
{  
 if(Serial.available() > 0)
 {
   inString = Serial.readStringUntil('\n'); 
 }

 inString.toInt() = pozycja;

 if(pozycja >= 0 && pozycja <= 180);
 {
   serwomechanizm.write(pozycja);
 }

 delay(200);
}
  • 1 miesiąc później...

Na początek dzień dobry wszystkim, to mój pierwszy post na forum 🙂

Mam pytanie odnośnie mojego rozwiązania zadania domowego 5.4

#include <Servo.h>
#include <stdlib.h>

#define servoPin 9

Servo servo;
int newPosition = 0;

void setup() 
{
 Serial.begin(9600);
 Serial.println("Communication started");
 servo.attach(servoPin);
}

void loop() 
{
 SetupNewPosition();
 ChangePhysicalPosition();
 delay(2000);
}

void SetupNewPosition()
{
 if(Serial.available() > 0) SetupPositionFromConsole();
}

void SetupPositionFromConsole()
{
 newPosition = SerialReadStringAsInt();
 ValidatePosition();
}

int SerialReadStringAsInt()
{
 return atoi(Serial.readStringUntil('\n').c_str());
}

void ValidatePosition()
{
 if(newPosition > 180 || newPosition < 0) newPosition = 0;
}

void ChangePhysicalPosition()
{
 servo.write(newPosition);
}

Na niektórych pozycjach serwo cały czas "bzyczy", na innych zaś jest spokojne (ciche). Ktoś wie dlaczego?

MaciejBurchardt, "buczenie" serwa na niektórych pozycjach to raczej normalna sprawa. W kursach korzystamy z małego i taniego serwa (w sam raz do pierwszy eksperymentów) i mogą zdarzać się takie drobne "wahania" jego orczyka 🙂

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