Virtual Wire - randomowe odczyty

Problemy z realizacją projektów prezentowanych na blogu.
ODPOWIEDZ
Awatar użytkownika
pd1987
Majsterkowicz
Posty: 181
Rejestracja: 20 kwie 2013, 23:26
Kontakt:

Virtual Wire - randomowe odczyty

Post autor: pd1987 » 23 lip 2015, 20:08

Koledzy i Koleżanki,
zrobiłem projekt (na podstawie artykułu szefa szefów) z nadajnikiem i odbiornikiem RF. Mój problem polega na tym, że odczyty są bardzo niestabilne. Raz trafia, raz nie i nie potrafię tego przefiltrować.
Są momenty, że działa stabilnie i sygnał jest wysyłany i odczytywany równo. Ale pojawiają się anomalie:
a) sygnał nie dochodzi do odbiornika (z nadajnika na 100% wychodzi, sprawdzone po serialu)
b) odbiornik nie odbiera sygnału "pusto" i jeden po drugim wysyła "snap" do processingu po serialu

Processing i cała reszta działa wzorowo. Wygląda na to, że tylko transmisja po RF się wysypuje.

NADAJNIK
Nadajnik ma wysyłać kod "snap" do odbiornika, kiedy napięcie na fotorezystorze spadnie poniżej wartości 400.

Kod: Zaznacz cały

#include <VirtualWire.h>

#define kontaktronPin 9    // 15 nóżka µC
#define txPin 13           // pin nadajnika VW
#define photoPin 6

int val = 0;

const char *wiadomosc;

void setup() {
  vw_set_ptt_inverted(true);
  vw_set_tx_pin(txPin);
  vw_setup(2000);
  //pinMode(kontaktronPin, INPUT_PULLUP);
  pinMode(photoPin, INPUT);
  Serial.begin(57600);
  
  // wysyłanie wiadomości, że pusto
  wiadomosc = "pusto";
  vw_send((uint8_t *)wiadomosc, strlen(wiadomosc));
  vw_wait_tx();
}

void loop() {
  // odczytaj napięcie na pinie analogowym
  val = analogRead(photoPin);
  Serial.println(val);
  delay(500);
  
  if (val < 400) {
    Serial.println("Sprawdzanie 1.");
    delay(1000);
    val = analogRead(photoPin);
    if (val < 400) {
      Serial.println("Sprawdzanie 2.");
      delay(2000);
      val = analogRead(photoPin);
      if (val < 400) {
        Serial.println("Sprawdzanie potwierdzone. Wysylam!.");
        wiadomosc = "listy";
        vw_send((uint8_t *)wiadomosc, strlen(wiadomosc));
        vw_wait_tx();
        delay(100);
        Serial.println("Foto zrobione. WYSYLAM PUSTE 1");
        wiadomosc = "pusto";
        vw_send((uint8_t *)wiadomosc, strlen(wiadomosc));
        vw_wait_tx();
        delay(200);
        // zdublowanie wiadomości "pusto", bo się wykrzaczało
        Serial.println("Foto zrobione. WYSYLAM PUSTE 2");
        wiadomosc = "pusto";
        vw_send((uint8_t *)wiadomosc, strlen(wiadomosc));
        vw_wait_tx();
        delay(300);
        // zdublowanie wiadomości "pusto", bo się wykrzaczało
        Serial.println("Foto zrobione. WYSYLAM PUSTE 3");
        wiadomosc = "pusto";
        vw_send((uint8_t *)wiadomosc, strlen(wiadomosc));
        vw_wait_tx();
        delay(6000);
      } else {
        Serial.println("Brak akcji. PUSTO!.");
        wiadomosc = "pusto";
        vw_send((uint8_t *)wiadomosc, strlen(wiadomosc));
        vw_wait_tx();
    }
  }
}
  
  /**
  if(digitalRead(kontaktronPin)==HIGH) {wiadomosc = "listy";}
  else                                 {wiadomosc = "pusto";}


  **/
}
ODBIORNIK
Odbiornik odczytuje podany przez nadajnik kod "snap" i processing rusza dalej. Problem w tym, że nie zawsze ten kod dochodzi, a czasami wręcz się blokuje i processing robi zdjęcie jedno po drugim z delayem, jak zadano:

Kod: Zaznacz cały

#include <VirtualWire.h>

#define rxPin 13          // pin odbiornika VW

boolean noweListy = false;
boolean czekaj = true;

void setup() {
  vw_set_ptt_inverted(true);
  vw_set_rx_pin(rxPin);
  vw_setup(2000);
  vw_rx_start();
  Serial.begin(9600);
}

void loop() {

  uint8_t odebrano[VW_MAX_MESSAGE_LEN];
  uint8_t dlugosc = VW_MAX_MESSAGE_LEN;

  // odczytywanie wiadomości
  if (vw_get_message(odebrano, &dlugosc)) {
    String wiadomosc;
    int i;

    for (i = 0; i < dlugosc; i++) {wiadomosc += char(odebrano[i]);}
    
    
    if (wiadomosc == "listy") {noweListy = true;}
    if (wiadomosc == "pusto") {noweListy = false;}
  }

  if (noweListy == true) {
    
    Serial.println("snap"); // tę wiadomość odczytuje Processing i wykonuje dalsze polecenia

    
    delay(1000);
  }
}
Co może być przyczyną błędnego działania?
Próbuję różnych wariantów, ale nic nie pomaga. Cały czas dostaję dziwne i błędne odczyty albo nie dochodzą w ogóle. Dystans, na jakim to działa to 2-3 metry, więc bardzo mało. Anteny ok. 15 cm. Płytka Arduino Nano.
Proszę o pomoc, bo wypstrykałem się z pomysłów.

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


stiven
Złota rączka
Posty: 1583
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Virtual Wire - randomowe odczyty

Post autor: stiven » 24 lip 2015, 16:12

Spróbuj zrobić tak jak jest w oryginalnym programie, czyli w if else ustawisz tylko treść wiadomości a potem poza if else zrób wysyłkę.
Awatar użytkownika
pd1987
Majsterkowicz
Posty: 181
Rejestracja: 20 kwie 2013, 23:26
Kontakt:

Re: Virtual Wire - randomowe odczyty

Post autor: pd1987 » 8 sie 2015, 13:28

Miało mnie Majsterkowo poinformować o odpowiedzi na mój post, a tu zonk. Nie zauważyłem Twojej odpowiedzi... ale dzięki!

Ostatecznie problem sam rozwiązałem. Zamieniłem którąś pętlę na "while...do" i wszysko zagrało. Teraz wysyła i odbiera idealnie, zero pominięć, zero randomowych odczytów. Czysta perfekcja :)
ODPOWIEDZ

Strony partnerskie: