Skocz do zawartości

Arduino Serwomechanizm Port UART


n1k0

Pomocna odpowiedź

Cześć!

Mam problem z sterowaniem serwomechanizmem... Mianowicie gdy podaję mu pozycję przez port szeregowy wygląda to tak jakby miał tylko jedną wartość, wpisywanie jakichkolwiek wartości do portu nic nie zmienia, zawsze obraca się w tą samą stronę... Mógłby ktoś mądrzejszy ode mnie się temu przyjrzeć? Z góry dzięki za pomoc!

#include <Servo.h>
Servo serwo;
char pozycja=0;
int zmiana = 0;


void setup() 
{
Serial.begin(9600);
serwo.attach(9);
Serial.println("Podaj pozycje");
serwo.write(0);
}

void loop() 
{
    if(Serial.available()>0)
    {
    pozycja = Serial.read();
    if(pozycja<180)
    serwo.write(pozycja);
    }

  delay(200);
}

Obstawiam że może to być problem z rodzajem zmiennej...

Zmiana pozycji na zmienną INT nic nie zmienia :///

Pozdrawiam i z góry dziękuję za pomoc!

Link do komentarza
Share on other sites

Aaa, jeszcze zanim otrzymam odpowiedź byłbym wdzięczny gdybym dostał bardziej wskazówki niż prosto z mostu rozwiązanie 😉 Nauka to potęga!!

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

8 minut temu, n1k0 napisał:

Aaa, jeszcze zanim otrzymam odpowiedź byłbym wdzięczny gdybym dostał bardziej wskazówki niż prosto z mostu rozwiązanie 😉 Nauka to potęga!!

Ehh...a ja już posta z rozwiązaniem nabazgralem...😜 Wpisując coś w serial wpisujesz znaki, a nie liczbę...więc jeśli napiszesz '123' to nie otrzymasz liczby 123 tylko trzy znaki 1/2/3...musisz odebrać dnę jako String i przekonwertować go na liczbę typu int...poczytaj o "atoi()" powinno zadziałać 

Edit...druga sprawa to to że 

serwo.write();

jako parametr przyjmuje liczbę typu bajt, a Ty tam zmienną typu char chcesz upychać 😉

 

Edytowano przez farmaceuta
  • Pomogłeś! 1
Link do komentarza
Share on other sites

15 minut temu, farmaceuta napisał:

Ehh...a ja już posta z rozwiązaniem nabazgralem...😜 Wpisując coś w serial wpisujesz znaki, a nie liczbę...więc jeśli napiszesz '123' to nie otrzymasz liczby 123 tylko trzy znaki 1/2/3...musisz odebrać dnę jako String i przekonwertować go na liczbę typu int...poczytaj o "atoi()" powinno zadziałać 

Edit...druga sprawa to to że 

serwo.write();

jako parametr przyjmuje liczbę typu bajt, a Ty tam zmienną typu char chcesz upychać 😉

 

Czyli wiedziałem w którym kościele dzwoni ale nie znałem nit haha. Serdecznie dziękuję za pomoc ❤️

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

16 minut temu, farmaceuta napisał:

Ehh...a ja już posta z rozwiązaniem nabazgralem...😜 Wpisując coś w serial wpisujesz znaki, a nie liczbę...więc jeśli napiszesz '123' to nie otrzymasz liczby 123 tylko trzy znaki 1/2/3...musisz odebrać dnę jako String i przekonwertować go na liczbę typu int...poczytaj o "atoi()" powinno zadziałać 

Edit...druga sprawa to to że 

serwo.write();

jako parametr przyjmuje liczbę typu bajt, a Ty tam zmienną typu char chcesz upychać 😉

 

Nie mniej jeśli mnie to przerośnie to obejrzę posta i zaplusuję ;))

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

1 minutę temu, jand napisał:

Zmienna char to też bajt - kompilator sobie poradzi.

Ważna jest wartość tego bajtu.

Tak tak wiem o tym...chodziło mi w kontekście tego że po nie jawnym rzutowaniu będą tam "przypadkowe" wartości...😉

Link do komentarza
Share on other sites

 

2 minuty temu, jand napisał:

Dlaczego?

Chodzi o to że 123 nie przekonwertuje jako sto dwadzieścia trzy tylko jako jakieś liczby które by odpowiadały temu wyrazowi (CHYBA XD)

Link do komentarza
Share on other sites

 

#include <Servo.h>
Servo serwo;
byte pozycja = 0;
int zmiana = 0;
char wyraz = ""; 

void setup() 
{
Serial.begin(9600);
serwo.attach(9);
Serial.println("Podaj pozycje");
serwo.write(0);
}

void loop() 
{
    while(Serial.available()>0)
    {
    wyraz = readStringUntil('\n');
    pozycja = atoi(wyraz);
    if(pozycja<180)
    serwo.write(pozycja);
    }

  delay(200);
}

Nabazgrałem coś takiego ale wyskakuje komunikat 'readStringUntil' was not declared in this scope1657831600_ssdofrobota.thumb.png.6955b9741bae4bb6b7feb2422cd45123.png

Link do komentarza
Share on other sites

Dla mnie przypadkowe, to za każdym razem inne (i przy tym nie bardzo wiadomo dlaczego).

A tu wszystko wiadomo - wprowadzając kolejno znaki '1' , '2', '3' otrzymamy wartości 49, 50, 51  (bez strzelania 😁)

 

Edytowano przez jand
Link do komentarza
Share on other sites

#include <Servo.h>
Servo serwo;
int pozycja = 0;
String wyraz = ""; 

void setup() 
{
Serial.begin(9600);
serwo.attach(9);
Serial.println("Podaj pozycje");
serwo.write(0);
}

void loop() 
{
    while(Serial.available()>0)
    {
    wyraz =Serial.readStringUntil('\n');
    Serial.println(wyraz);
    pozycja = atoi(&wyraz[0]);
    serwo.write(pozycja);
    }

  delay(200);
}

@jand jak prościej przekazać Stringa jako parametr do atoi ()?? Teraz jest tak...

pozycja = atoi(&wyraz[0]);

Ale mi się nie podoba...szukałem ale znalezdz przykładu nie mogę 😕

Edytowano przez farmaceuta
  • Pomogłeś! 1
Link do komentarza
Share on other sites

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

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.