Skocz do zawartości

VirtualWire - przesyłanie 2 analogowych wartości


Pomocna odpowiedź

Napisano

Mam problem z napisaniem kodu do 2 układów ze zdjęć, chcę aby wartości z wejść A0 i A1 z płytki Arduino UNO były wysyłane do Arduino MEGA, wyświetlane na monitorze portu szeregowego i nadające się do dalszej pracy, np. aby wartość A0 na Arduino UNO, czyli oś Y joysticka, sterowała napięciem PWM jednej diody podpiętej do Arduino MEGA, a wartość z wejścia A1 (oś X) sterowała napięciem PWM drugiej diody. Korzystam z modułu radiowego RF:

https://abc-rc.pl/RF-FS100A

oraz z biblioteki VirtualWire:

http://www.airspayce.com/mikem/arduino/VirtualWire/

Korzystam z tej biblioteki od około 3-4 dni i umiem przesyłać wiadomości o konkretnej treści (z pomocą wspaniałego internetu), ale mam problem z przesyłaniem wartości analogowych z wejść i "wyciągnięcie" ich z wiadomości na drugiej płytce.

Arduino UNO jest zasilane z 9V, Arduino MEGA jest podpięte przez USB do komputera.

NADAJNIK:

ODBIORNIK:

Jeśli umiesz nadać cokolwiek i odebrać to po drugiej stronie to znaczy, że sprzęt i biblioteka działają poprawnie. Problemem jest więc chyba sam kod odczytujący wejścia analogowe i próbujący wysłać to za pomocą wywołania funkcji vw_send(). Pokaż fragment programu który to ma robić (nadawanie i odbieranie) - popatrzymy. Bez tego jak mamy coś poradzić?

  • Lubię! 1

Właśnie chodzi mi o to, aby ktoś mógł pokazać taki kod i ewentualnie wytłumaczyć jakieś komendy z którymi będę miał problem. Nie wiem nawet jak mam do tego podejść, a nie zależy mi na szybkim przekopiowaniu kodu do siebie i "odhaczenie" tego jako zrobione tylko na zrozumieniu tego.

  • 1 miesiąc później...

Trochę stary temat, ale może dalej aktualny. Zapewne korzystasz z tych dwóch funkcji:

uint8_t vw_send(uint8_t *buf, uint8_t len);
uint8_t vw_get_message(uint8_t *buf, uint8_t *len);

W przypadku vw_send: buf to wskaźnik na pierwszy bajt z Twoich danych do wysłania, a len to ilość bajtów do wysłania. Jeśli chcesz wysłać jakiegoś inta, to po prostu podajesz jego adres i ilość jego bajtów:

int joyY = analogRead(pin);
if (!vw_send((uint_8 *) &joyY, sizeof(joyY))
{
   // nie udalo sie wyslac

}

I analogicznie wtedy robisz odbieranie. "(uint8_t *)" to rzutowanie na wskaźnik innego typu, żeby kompilator nie pokazywał ostrzeżeń.

Jeśli chcesz wysłać więcej danych (a na pewno chcesz), to najłatwiej jest po prostu wykorzystać struct:

struct MyMessage
{
  int joyX;
  int joyY;
}


void loop()
{
  MyMessage msg;
  msg.joyX = analogRead(xpin);
  msg.joyY = analogRead(ypin);

  if (!vw_send((uint8_t *) &msg, sizeof(msg))
  {
     // nie udalo sie wyslac
  }
}

Odbiór analogicznie jak wysyłanie. Po wywołaniu vw_get_message możesz po prostu odczytać dane ze struktury.

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