Skocz do zawartości
Komentator

Kurs Arduino - #5 - PWM, serwomechanizmy, biblioteki

Pomocna odpowiedź

Dobrze, dziękuję za rady. Mam jeszcze jedno pytanie:

Chcę użyć 5 serwomechanizmów - czterech SG90 i MG90S + czujnik odległości + LCD z I2C. Z tego co znalazłem jedno serwo zużywa przy oporze ok.360 mA, LCD 50mA, czujnik 15mA. Wszystko ma mieć napięcie 5V. Myślę, że najlepiej było by użyć zasilacza sieciowego. Arduino w tym czasie będzie zasilane z baterii 9V. (Oczywiście wiem, masy mają być połączone)

No i teraz jakie parametry ma mieć ten zasilacz? Czy 2 A wystarczy? I jeszcze będzie potrzebny stabilizator a nawet kilka, jeśli się przegrzeje, tak?

Udostępnij ten post


Link to post
Share on other sites

Jeżeli dasz zasilacz 5V to nie potrzeba w nim stabilizatorów. Podłączasz bezpośrednio serwa itp do wyjścia zasilacza. Muszą mieć jedynie wspólną masę z Arduino jeżeli chcesz stosować 2 osobne źródła zasilania.

Udostępnij ten post


Link to post
Share on other sites

A czy natężenie prądu ma jakieś większe znaczenie? Chyba nie widzę znaczącej różnicy między 500 a 1000mA.

Udostępnij ten post


Link to post
Share on other sites

Jeżeli masz na myśli jaki rodzaj ładowarki potrzebujesz to jeżeli chcesz zasilać 5 serw i mają pobór 350 mA, do tego jakaś drobnica to zasilacz 2A będzie akurat.

Przy czym uwaga: to że na zasilaczu napisane jest np 2.1A oznacza że jest to maksymalny prąd jaki może oddać.

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

@Treker 5.2 

#define diodaPIN 3

int wypelnienie = 0;
int zmiana = 5;
boolean maksimum = false; // osiagniecie wartosci szczytowej


void setup() {
 pinMode(diodaPIN, OUTPUT); //konfig pinu jako wyjscia 
}

void loop() {

 if (wypelnienie < 255 && maksimum == false){
 analogWrite(diodaPIN, wypelnienie);//Generujemy sygnał o zadanym wypelnieniu
 wypelnienie = wypelnienie + zmiana; // zwiekszamy o 5
 delay(50); //male opoznienie dla widocznosci efektu
 } else if (wypelnienie == 255) {
   maksimum = true;
   }
 if (wypelnienie > 0 && maksimum == true){
    analogWrite(diodaPIN, wypelnienie);//Generujemy sygnał o zadanym wypelnieniu
     wypelnienie = wypelnienie - zmiana; // zmniejszamy o 5
     delay(50); //male opoznienie dla widocznosci efektu
 } else if (wypelnienie == 0){
    maksimum = false;
   }
}

 

Edytowano przez Gieneq
Zachęcam do używania bloku kodu

Udostępnij ten post


Link to post
Share on other sites

@LuigiSu fajnie że robisz zadania dodatkowe 🙂 

A spróbuj zrobić te zadanie prościej. Ten efekt można zrealizować przy pomocy 2 zmiennych: int wypełnienie, int kierunek. Jest to dość analogiczne do przykładu z kursu który jest nad tym zadaniem, tylko że musisz zmieniać kierunek 🙂 

Tu podpowiedź zmiana kierunku na przeciwny może odbyć się w ten sposób:

kierunek = -kierunek;

 

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

@Gieneq czy masz na myśli tutaj zastąpienie zmiennej "zmiana" zmienną "kierunek" która określałaby tą samą 5tke tylko na + albo -?

Edit: sprawdziłem kod innego użytkownika i kombinowałem w tą stronę jednak kod nie chciał działać więc poszedłęm naokoło 😄 teraz wszystko śmiga

5.2

#define diodaPIN 3

int wypelnienie = 0;
int kierunek = 5;

void setup() {
 pinMode(diodaPIN, OUTPUT); //konfig pinu jako wyjscia 
 Serial.begin(9600);
}

void loop() {

 
 analogWrite(diodaPIN, wypelnienie);//Generujemy sygnał o zadanym wypelnieniu
 
 if (wypelnienie < 255){
 wypelnienie = wypelnienie + kierunek; // zwiekszamy o 5
 Serial.println(wypelnienie);
 delay(10); //male opoznienie dla widocznosci efektu
 } else if (wypelnienie == 255){
    while(wypelnienie > 0){
    wypelnienie = wypelnienie - kierunek; // zwiekszamy o 5
    analogWrite(diodaPIN, wypelnienie);//Generujemy sygnał o zadanym wypelnieniu
    Serial.println(wypelnienie);
    delay(10); 
    } 
   }
}

5.3

Dodanie parametru zamiast wartości liczbowej delay i zmiana o dany "krok"

5.4 

#include <Servo.h> // Biblioteka odpowiedzialna za serwa
Servo serwomechanizm; // Tworzymy obiekt, dizeki któremu możemy odwołać się do serwa

String pozycja = ""; // aktualna pozycja serwa 0-180
int pozycjaint;

void setup() {
 serwomechanizm.attach(9); //serwo w pinie 9
 Serial.begin(9600);
}
 
void loop() {
 Serial.println("Podaj pozycje serwa od 0 do 180 stopni");
 while (Serial.available() == 0); // czekamy na podanie liczby
 pozycja = Serial.readStringUntil('\n'); //odczytaj do końca linii
 pozycjaint = pozycja.toInt();
 Serial.println(pozycjaint); // podaj wprowadzoną wartość TEST
 
 if (pozycjaint >= 0 && pozycjaint <= 180){
  serwomechanizm.write(pozycjaint);//wykonaj ruch
   } else {
     Serial.println("Podaj prawidłową wartosć");
     } 
}

5.5

#include <Servo.h> // Biblioteka odpowiedzialna za serwa
Servo serwomechanizm; //Tworzymy obiekt, dizeki któremu możemy odwołać się do serwa

int odczytR = 0; //odczyt napięcia na dzielniku
float ruchservo = 0; // o ile ma ruszyć się serwo

void setup() {
 serwomechanizm.attach(9); //serwo w pinie 9

 Serial.begin(9600);
}
void loop() {
 odczytR = analogRead(A5); // wartość wskazania rezystora
 Serial.println(odczytR);
 ruchservo = odczytR / (1024.0/180.0);
 serwomechanizm.write(ruchservo);//wykonaj ruch
 Serial.println(ruchservo);
 delay(50); //przy tak małym opóźnieniu ruch serwa wydaje się najbardziej płynny
}

 

Edytowano przez LuigiSu

Udostępnij ten post


Link to post
Share on other sites

@LuigiSu

23 godziny temu, LuigiSu napisał:

więc poszedłęm naokoło

Faktycznie na około 😄 Kod z Arduino IDE, przykład fade - sama pętla loop():

void loop() {
  // set the brightness of pin 9:
  analogWrite(led, brightness);

  // change the brightness for next time through the loop:
  brightness = brightness + fadeAmount;

  // reverse the direction of the fading at the ends of the fade:
  if (brightness <= 0 || brightness >= 255) {
    fadeAmount = -fadeAmount;
  }
  // wait for 30 milliseconds to see the dimming effect
  delay(30);
}

Logika ściemniania LED jest rozbudowana co nie? 😄 możesz podstawić zamiast leda serwo i będzie 🙂 powodzenia, walcz dalej! 💪

Udostępnij ten post


Link to post
Share on other sites

@Gieneq czy ten frament poniżej to zdefiniowanie przedziału? dokładnie chodzi mi o wyrażenie "||"

(brightness <= 0 || brightness >= 255)

 

Udostępnij ten post


Link to post
Share on other sites

"||" oznacza tyle co lub/albo

 if (brightness <= 0 || brightness >= 255){
 //jeśli jasność jest mniejsza lub równa 0 ALBO jasność jest większa lub równa 255 to:

 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@jas123 Dokładnie lub i tylko wyłącznie lub 😉 "albo" to logiczny XOR - albo wyjdę z domu albo zostanę w domu - nie ma części wspólnej.

Udostępnij ten post


Link to post
Share on other sites
50 minut temu, Gieneq napisał:

Dokładnie lub i tylko wyłącznie lub 😉 "albo" to logiczny XOR

Uściślijmy: Operator || to inaczej "or else" (nazwa bodajże od propozycji Dijkstry, ale się nie założę). Jeśli pierwszy warunek jest prawdziwy, drugi nie jest sprawdzany bo niezależnie od niego wyjdzie prawda; jeśli pierwszy zwraca false (0, pusty wskaźnik albo jakikolwiek odpowiednik) brany jest pod uwagę wynik drugiego. Historycznie w pierwszych wersjach języków programowania (np. Algol60) obliczane były obie strony (klasyczny operator "or"), dopiero potem ktoś zauważył, że nie jest to potrzebne.

Podobnie jest z operatorem && - czyli "and then". Jeśli lewa strona zwraca false, prawa nie jest w ogóle obliczana bo po co?

W C/C++ nie ma odpowiednika XOR jako operatora logicznego, jest tylko dla bitowych.

W przeciwieństwie do języków programowania - w językach naturalnych słowo "lub" jest bliższe znaczeniowo właśnie XOR. Słowo "albo" występuje chyba wyłącznie w języku polskim i jest uznawane jako synonim słowa "lub".

 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Zadanie 5.5

#include <Servo.h>
#define adc A5
Servo serwomechanizm;
int pozycja;
int odczyt;



void setup(){
  serwomechanizm.attach(9);
  Serial.begin(9600);
  
}

void loop() 

{ 
odczyt = analogRead(adc);
pozycja = ((odczyt)/ 8);
  
 serwomechanizm.write(pozycja);
 Serial.println(odczyt);

 

}

Działa, potencjometr porusza, ale nie jest tak  że skrajne polozenie serwa jest przy skrajnym polozeniu potencjometra. Przez jaka wartosc podzielic odczyt zeby bylo dobrze?

Odczyt wpisałem w monitor poniewaz na poczatku program nie działał, chcialem wiedziec czy to nie wina potencjometru (odczyty byly 0)

Udostępnij ten post


Link to post
Share on other sites
3 minuty temu, pawelmackowski napisał:

Przez jaka wartosc podzielic odczyt zeby bylo dobrze?

 

Przez 5.683333333333333 🙂

Ale lepiej skorzystaj z funkcji map.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Witam,

to mój pierwszy post.

Mam pytanie, korzystam z zestawu Botland-u, Arduino Plus. Mój problem polega na tym, iż moje serwo przy 1-wszym zadaniu z kursu #5 Serwomechanizm w praktyce nie osiąga pełnego zakresu od 0 do 180st. Porusza się w zakresie 140-150st. Program jest identyczny z tym zamieszczonym w kursie, kompilator jest aktualny, biblioteka w tej samej wersji co na stronie arduino.cc, a bateria nowa także z zestawu. Nie zauważałem też różnicy w tym czy płytka jest podłączona tylko do 9V czy również do portu USB.

 

Pozdrawiam i dzięki za odp.

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ść
Dołącz do dyskusji! Kliknij i zacznij pisać...

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