Skocz do zawartości
Komentator

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

Udostępnij ten post


Link to post
Share on other sites

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

Udostępnij ten post


Link to post
Share on other sites

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.

Udostępnij ten post


Link to post
Share on other sites

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

Udostępnij ten post


Link to post
Share on other sites

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.

Udostępnij ten post


Link to post
Share on other sites

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

Udostępnij ten post


Link to post
Share on other sites

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 🙂

Udostępnij ten post


Link to post
Share on other sites

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.

Udostępnij ten post


Link to post
Share on other sites

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

Udostępnij ten post


Link to post
Share on other sites

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 🙂

Udostępnij ten post


Link to post
Share on other sites

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

Udostępnij ten post


Link to post
Share on other sites
inString.toInt() = pozycja; 

Przypisanie wartości do zmiennej nie tak działa w C++.

Udostępnij ten post


Link to post
Share on other sites

domi10052, czy już udało Ci się dojść do rozwiązania tego problemu 🙂?

Udostępnij ten post


Link to post
Share on other sites

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?

Udostępnij ten post


Link to post
Share on other sites

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 🙂

Udostępnij ten post


Link to post
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!

Gość
Napisz odpowiedź...

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