Skocz do zawartości

Kurs Arduino - #5 - PWM, serwomechanizmy, biblioteki


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.

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.

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

  • 3 tygodnie później...

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.  

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

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.

#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
#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
  • 1 miesiąc później...
(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
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 😛

  • Lubię! 1

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

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