Przekazywanie wyników funkcji do kolejnych funkcji

Masz problem z Arduino? Tutaj możesz szukać pomocy.
ODPOWIEDZ
kaper93
Młodszy majsterkowicz
Posty: 6
Rejestracja: 2 lis 2012, 13:22

Przekazywanie wyników funkcji do kolejnych funkcji

Post autor: kaper93 » 4 sty 2014, 17:15

Witajcie!

Mam problem z którym nie mogę sobie poradzić. Chcę sterować położeniem dwóch serw i osi X/Y, podając wartości -200/200 przez kabel. Otóż mam dwie funkcje: setX() i setY(), każda z nich odbiera dane z PC dzięki bibliotece Messenger. Chciałbym aby każda z funkcji zwracała wartość int X i int Y, tak abym mógł użyć tych zmiennych w innej funkcji ustawienie(int X, int Y)

Jeżeli chodzi o sterowanie jedna osią to nie ma problemu i poniższy kod to wykonuje. Jak jednak przenieść kod na dwa argumenty X/Y wchodzace do funkcji ? Próbowałem wskaźników, ale chyba błędnie rozumiem ich działanie/sposób użycia.

int setX()
{
int FX = message.readInt();
if (FX <= 200 || FX >= -200)
{
SilaX(FX);
}
}

void SilaX(int X)
{
int mapX=map(X,-200,200,30,150);
serwoX.write(mapX);
}
Ostatnio zmieniony 4 sty 2014, 19:02 przez kaper93, łącznie zmieniany 1 raz.

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


Awatar użytkownika
Marhef
Złota rączka
Posty: 1163
Rejestracja: 18 lis 2011, 02:18

Re: Przekazywanie wyników funkcji do koljnych funkcji

Post autor: Marhef » 4 sty 2014, 17:45

Po pierwsze: dlaczego Twoja funkcja setX() nie zwraca żadnej wartości?

Jeżeli chcesz wywoływać funkcję ustawienie(int X, int Y) w taki sposób, jak napisałeś, funkcja setX() może być zdeklarowana jako void setX().

Mój pomysł:

Kod: Zaznacz cały

int setX()
{
 int FX = message.readInt();
 if (FX <= 200 || FX >= -200)
{
 return FX;
}
else return 0; //albo inną wartość, którą możesz użyć do kontroli poprawności programu
}

int setY()
{
 int FY = message.readInt();
 if (FY <= 200 || FY >= -200)
{
 return FY;
}
else return 0; //albo inną wartość, którą możesz użyć do kontroli poprawności programu
}
A w funkcji loop():

Kod: Zaznacz cały

void loop() {
  int X Y;
  X = setX();
  Y = setY();
  ustawienie(X,Y);
}
Oczywiście, musisz również napisać funkcję ustawienie(), deklarowaną tak, jak napisałeś
kaper93
Młodszy majsterkowicz
Posty: 6
Rejestracja: 2 lis 2012, 13:22

Re: Przekazywanie wyników funkcji do koljnych funkcji

Post autor: kaper93 » 4 sty 2014, 18:00

void po prostu mi się nie skopiował :)

Testowałem już taki kod wcześniej jednak nie działał... Myślę że problemem jest widoczność zmiennych/argumentów pomiędzy funkcjami i z tym nie mogę sobie poradzić... A potrzebuję informacji o dwóch położeniach w ramach jednej funkcji Axis.


#include <Messenger.h>
#include <Servo.h>

Servo serwoX;
Servo serwoY;

Messenger message;

int setX()
{
int FX = message.readInt();
if (FX <= 200 || FX >= -200)
{
return FX;
}
else
return 0;
}

int setY()
{
int FY = message.readInt();
if (FY <= 200 || FY >= -200)
{
return FY;
}
else
return 0;
}

void Axis(int X, int Y)
{
int mapX=map(X,-200,200,30,150);
int mapY=map(Y,-200,200,30,150);
serwoX.write(mapX);
serwoY.write(mapY);
}

void onMessage()
{
switch (message.readChar())
{
case 'X':
setX();
break;

case 'Y':
setY();
break;
}
}

void serialEvent()
{
message.process(Serial.read());
}

void setup()
{
Serial.begin(38400);
message.attach(onMessage);

serwoX.attach(2);
serwoY.attach(3);

pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
}

void loop()
{
int X = setX();
int Y = setY();
Axis(X,Y);
}
Awatar użytkownika
Marhef
Złota rączka
Posty: 1163
Rejestracja: 18 lis 2011, 02:18

Re: Przekazywanie wyników funkcji do kolejnych funkcji

Post autor: Marhef » 5 sty 2014, 17:02

Spróbuj zadeklarować na początku (tam, gdzie

Kod: Zaznacz cały

Servo serwoX;
Servo serwoY;
dodatkowo int X i int Y. A w loop wywołujesz jako

Kod: Zaznacz cały

X = setX();
Y = setY();
kaper93
Młodszy majsterkowicz
Posty: 6
Rejestracja: 2 lis 2012, 13:22

Re: Przekazywanie wyników funkcji do kolejnych funkcji

Post autor: kaper93 » 5 sty 2014, 17:10

Niestety to też nie pomogło...
Malen
Młodszy majsterkowicz
Posty: 27
Rejestracja: 2 sty 2014, 22:47

Re: Przekazywanie wyników funkcji do kolejnych funkcji

Post autor: Malen » 6 sty 2014, 00:37

A zbadaj w funkcji Axis przed zmianą pozycji Serva wartość zmiennych X i Y za pomocą Serial.println zoabcz czy wartości są pożądane, bo kod wygląda na prawidłowy. Może spróbuj też podłączyć Servo do innego pinu.
Awatar użytkownika
Marhef
Złota rączka
Posty: 1163
Rejestracja: 18 lis 2011, 02:18

Re: Przekazywanie wyników funkcji do kolejnych funkcji

Post autor: Marhef » 6 sty 2014, 09:41

Nie wiem, jak Messenger działa. Może z tym fragmentem jest problem
skl
Majsterkowicz
Posty: 60
Rejestracja: 3 gru 2013, 17:37

Re: Przekazywanie wyników funkcji do koljnych funkcji

Post autor: skl » 6 sty 2014, 14:15

Po pierwsze to po co w każdym obrocie pętli inicjujesz zmienne ? (int X = setX()) ? Nie można tego zrobić raz jako zmienne globalne? :

Kod: Zaznacz cały

 int X, Y;
void loop()
{
  X = setX();
  Y = setY();
  Axis(X,Y);
}
Po pierwsze to sprawdź w loop wartości zmiennych X i Y zanim je przekażesz do Axis. Następnie sprawdź jak wyglądają wartości zmiennych po wykonaniu mapowania na nich, a przed wysłaniem do serwa.

Problemem wydaje się tutaj właśnie inicjowanie zmiennych co obrót pętli loop. Jeżeli nie podajesz danych to funkcja nie ma wartości i jeżeli jest to wejście blokujące (nie znam biblioteki messanger) to "zawiesza program" lub otrzymuje wyniki nieokreślone.
Ja bym najpierw sprawdził jak działa obsługa tych serw na sztywno zdefiniowanych wartościach, np tworzysz tablice i odczytujesz z niej wartości X i Y. Jeżeli wszystko będzie ok to dopiero próbowałbym odczytywać te wartości z klawiatury ;)


//EDIT:
A tak w ogóle to co rozumiesz przez to że nie działa ? Oba serwa poruszają się w sposób nieokreślony czy w ogóle się nie poruszają się ? Kod wykonuje się raz czy w wcale ? A może po prostu się nie kompiluje ?

pozdrawiam,
skl
kaper93
Młodszy majsterkowicz
Posty: 6
Rejestracja: 2 lis 2012, 13:22

Re: Przekazywanie wyników funkcji do kolejnych funkcji

Post autor: kaper93 » 8 sty 2014, 23:33

Dzięki, skl :) Niepotrzebnie od razu porwałem się na wskaźniki :) Dałem zmienne globalne i działa jak trzeba :)
Awatar użytkownika
Marhef
Złota rączka
Posty: 1163
Rejestracja: 18 lis 2011, 02:18

Re: Przekazywanie wyników funkcji do kolejnych funkcji

Post autor: Marhef » 9 sty 2014, 00:28

A nie to samo proponowałem? Tylko bez nazwy "zmienna globalna"?
kaper93
Młodszy majsterkowicz
Posty: 6
Rejestracja: 2 lis 2012, 13:22

Re: Przekazywanie wyników funkcji do kolejnych funkcji

Post autor: kaper93 » 9 sty 2014, 00:30

Faktycznie, musiałem jakąś literówkę zrobić :) Tak więc również dla Ciebie podziękowania :)
ODPOWIEDZ

Strony partnerskie: