Skocz do zawartości

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?

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.

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

  • 3 tygodnie później...
(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

@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;

 

(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

@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! 💪

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

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)

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.

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