Skocz do zawartości

Kurs Arduino - #5 - PWM, serwomechanizmy, biblioteki


Komentator

Pomocna odpowiedź

@huku kondensatory nie będą miały tutaj widocznego wpływu na działanie układu. Sprawdź miernikiem, czy na wyjściu stabilizatora faktycznie jest cały czas 5 V, jeśli nie to znaczy, że bateria jest już zbyt mocno rozładowana.

Link do komentarza
Share on other sites

2 godziny temu, Treker napisał:

@huku kondensatory nie będą miały tutaj widocznego wpływu na działanie układu. Sprawdź miernikiem, czy na wyjściu stabilizatora faktycznie jest cały czas 5 V, jeśli nie to znaczy, że bateria jest już zbyt mocno rozładowana.

Jest w okolicach 5,03V-5,05V.

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

@huku czy masz zestaw do tego kursu, czy na własną rękę coś tam działasz? Pytam, aby wiedzieć jakie konkretne elementy masz u siebie. Widzę, że używasz Arduino, które nie jest polecane do tego kursu. Nie sądzę, aby tutaj był problem, ale wszystko jest możliwe.

Link do komentarza
Share on other sites

Hej Treker, wyczytałem (albo tak przynajmniej zrozumiałem) w twoich komentarzach, że po przekroczeniu wartości 255 są dalej ujemne. Wyświetlałem przez UART te wartości i ujemnych nie było (było od 0 do 255 i potem następnie przechodziło na 0 do 255 i tak dalej). Zmieniałem kod tak (np. usuwałem część z else) żeby te wartości ujemne się pojawiły, ale nic z tego. Zresztą na stronie botlandu wyczytałem, że byte jest unsigned, czyli że nie przyjmuje ujemnych wartości.  

Link do komentarza
Share on other sites

@ARDIP witam na forum 🙂 Nie wiem, do którego fragmentu konkretnie się odnosisz. Jednak masz rację, zmienna typu byte będzie w tym przypadku trzymała wartości od 0 do 255, aby uzyskać wartości ujemne konieczna jest zmiana typu zmiennej.

Link do komentarza
Share on other sites

Chodziło mi o te ćwiczenia 5.1 - przeróbka programu na taki, żeby nie było warunku i 5.2 - rozjaśnianie i przygaszanie diody. Zauważyłem też, że gdy jest int., a w programie usunie się warunek w którym jeśli "any value" < 255 to wartość int rośnie jeszcze wyżej.

Link do komentarza
Share on other sites

#include <Servo.h> //Library responsible on Servo 

Servo servomechanism; //We create an object, that we can refer to servo
int position = 0; //Current servo position 0-180
int change = 5; //How often should the servo position change?
int time = 200;

void setup() {
  Serial.begin(9600); //Setting speed transmission
  servomechanism.attach(9); //Servo is connected into 9 pin
}

void loop() {
  
  if(position <= 180) { //If the position is within the range
    delay(time); //Delay for better effect
    servomechanism.write(position); //Make a move
    Serial.print("Position: ");
    Serial.println(position);
    Serial.print("Time: ");
    Serial.println(time);
  } else { //If not, back to the beginning
    position = 0;
    time = 200;
    }

  position = position + change; //Increase of the current servo position
  time = time + 50; //Time is rise with servo pisition

Zadanie 5.3

  • Lubię! 1
Link do komentarza
Share on other sites

#include <Servo.h> //Library responsible on Servo 

Servo servomechanism; //We create an object, that we can refer to servo
String user_position = ""; //Position of user
int position = 0; //Current servo position

void setup() {
  Serial.begin(9600); //Setting transmission speed
  servomechanism.attach(9); //Servo is connected into 9 pin
}

void loop() {

  while (Serial.available() > 0) { //Whether arduino received data
    user_position = Serial.readStringUntil('\n');
    position = user_position.toInt(); //Convert String to Int
  if(position <= 180 && position >= 0) { //If the position is within the range
    servomechanism.write(position); //Make a move
    Serial.print("Position is: "); 
    Serial.println(position);
    delay(200);
  } else { //If position is not within range
    Serial.println("Wrong position");
    delay(200);
    }
}
}

Zadanie 5.4

  • Lubię! 1
Link do komentarza
Share on other sites

(edytowany)

Hej,

Moje solucje na ten moment:

Zadanie 5.3:
 

#include <Servo.h>

Servo microservo; // utworzenie obiektu typu servo
int position = 0; // Aktualna pozycja serva 0-180
int step = 6; // Co ile zmiana pozycji serwa
int incrementDelay = 0;

void setup() {
  microservo.attach(9); // Serwomechanizm podłączony do pinu 9
  Serial.begin(9600);
}

void loop() {
  if (position < 180){ // Jeśli pozycja mieści się w zakresie
    microservo.write(position); // Wykonaj ruch
    incrementDelay = incrementDelay + 50;
    Serial.println("Increment Delay: " + String(incrementDelay));
    delay(incrementDelay);
  }else{ // Jeżli nie to powrót na początek
    position = 0;
    incrementDelay = 0;
  }

  position = position + step; // zwiększenie aktualnej pozycji serwa
  Serial.println(position);
  delay(200);

}

 

Zadanie 5.4:

#include <Servo.h>

Servo microservo; // utworzenie obiektu typu servo
int position = 0; // Aktualna pozycja serva 0-180
String userInput = "";

void setup() {
  microservo.attach(9); // Serwomechanizm podłączony do pinu 9
  Serial.begin(9600);
}

void loop() {

  if(Serial.available() > 0){
      userInput = Serial.readStringUntil('\n');
      if(userInput.toInt() >= 0 && userInput.toInt() <= 180){
        microservo.write(userInput.toInt()); // Wykonaj ruch
      }else{
        Serial.println("Zakres musi być między 0, a 180");
      } // userInput EOIF
   } // main EOIF
  delay(200);

}

Zadanie 5.5

#include <Servo.h>

Servo microservo; // utworzenie obiektu typu servo
int mapAnalogRead = 0;
int readAnalogValue = 0;

void setup() {
  microservo.attach(9); // Serwomechanizm podłączony do pinu 9
  Serial.begin(9600);
}

void loop() {
  readAnalogValue = analogRead(A5);
  mapAnalogRead = map(readAnalogValue, 0, 1023, 180, 0);
  microservo.write(mapAnalogRead);
}

Tylko mam jedną taką zagwozdkę.
Przy zadaniu 5.5 mapowałem odczyty z ADC na wartości PWM w serwomechanizmie.

Jednakże sytuacja jest taka, ze jak przekręce potencjometr maksymalnie np. w prawo to faktycznie wartości są dobre i maksymalne przekręcenie potencjometru w taką stronę jest równe maksymalnemu przekręceniu się serwomechanizmu w drugą stronę.

Problem pojawia się, gdy przekręcam potencjometr w przeciwną stronę to już przy około 3/4 obrotu potencjometru serwomechanizm przekręca się maksymalnie w drugą stronę.

Nie wiem czy to prawidłowe zachowanie czy gdzieś jest problem u mnie.

Edytowano przez FTNewbie
Link do komentarza
Share on other sites

5 godzin temu, AntekBezak napisał:

@FTNewbie nie jestem pewien co może być nie tak, ale tam gdzie używasz map chyba 0 i 180 powinieneś zamienić miejscami.

Dziękuję za porade, ale tutaj raczej nie szukałbym problemu. Jeżeli zamienie te wartości miejscami to po prostu w przeciwną stronę będzie obracał się serwomechanizm i potencjomentr.
W obecnej konfiguracji obraca się w przeciwnym kierunku do kierunku potencjometru, a gdy zamienię miejscami to będzie się obracał zgodnie z kierunkiem obracania potencjometru.

Problemem tutaj jest to, że mapowanie nie jest takie jak być powinno tzn. serowmechanizm osiąga wartość 180 w momencie, gdy potencjometr jest na 3/4 obrotu.
Możliwe, że to prawdidłowe zachowanie, ale muszę być pewien 😛

Link do komentarza
Share on other sites

Nie wymagaj za dużo od serwa które kosztuje tyle co małe piwo 🙂 Trzeba się cieszyć że w ogóle się kręci, a w rzeczywistych projektach po prostu ustala się współczynniki doświadczalnie.

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

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

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.