Bezprzewodowy pad do pegasusa RF433 opóźnienie

Masz problem, z którym nie możesz sobie poradzić? Pisz śmiało!
ODPOWIEDZ
ogur
Młodszy majsterkowicz
Posty: 4
Rejestracja: 30 cze 2013, 15:42

Bezprzewodowy pad do pegasusa RF433 opóźnienie

Post autor: ogur » 30 cze 2013, 17:23

cześć,
Niedawno odkopałem pegasusa i pewnej niedzieli z nudów wpadłem na pomysł zrobienia bezprzewodowych padów. Chciałem to zrobić w tą jedną niedziele ze znalezionych po kątach podzespołach a skończyło się na tym że po 3 tygodniach miałem pierwszy działający prototyp.
Z początku pad miał się komunikować przez IR bo to miałem pod ręką ale ostatecznie chciałem żeby to działało drogą radiową.

Więc do rzeczy, chodzi o to że występuje pewne opóźnienie na "oko" 0.25-0.5 s po naciśnięciu przycisku na padzie do tego co się dzieje na monitorze.

Komunikacja odbywa przez tani moduł nadajnik >> odbiornik RF 433mhz
rf433k.jpg
pad (nadajnik) to atmega8a 8mhz programowana w arduino ide
pad.jpg
a odbiornik arduino mega 2560 na razie tylko wpięta w płytkę od pada pegasusa podaje stan niski na pin od danego przycisku, docelowo ma być rejestr przesuwny taki jak jest w padzie albo mógłbym to zrobić z pominięciem tego rejestru ale jestem jeszcze za słaby żeby rozgryźć przesyłanie bitów do pegasusa ( podałbym tu linki ale jest głupia zasada dla nowych użytkowników)

do przesyłu danych przez RF musi być użyta biblioteka virtualwire (tu też byłby link) która moim zdaniem odpowiada za te opóźnienia.

Program wysyła dane bez przerwy. wysyła "wiadomość" która wygląda tak: a00000000 w przypadku kiedy nie naciskam żadnego przycisku, wciśnięcie przycisku powoduje zmianę tej wiadomości i np wciskając przycisk strzałka w górę i w bok wysyłane jest takie coś a10100000 . Odbiornik analizuje, które cyfry są "1" i kiedy warunek jest spełniony podaje stan niski na odpowiedni pin podpięty do rejestru w oryginalnym padzie.
Z optymalizacją jest u mnie trochę słabo bo to w sumie mój pierwszy projekt z arduino który dotarł do fazy prototypowej. Może to właśnie przez to nie działa to tak jak bym chciał.

Kod nadajnika

Kod: Zaznacz cały

#include <VirtualWire.h>
const int  up = 11;
const int  down = 13;
const int  lewo = 12;
const int  prawo = 9;
const int  sel = 6;
const int  start = 3;
const int  a = A5;
const int  b = A4;
byte pad[8];


void setup()
{
  pinMode(up, INPUT);
  pinMode(down, INPUT);
  pinMode(start, INPUT);
  pinMode(prawo, INPUT);
  pinMode(lewo, INPUT);
  pinMode(sel, INPUT);  
  pinMode(a, INPUT);
  pinMode(b, INPUT);
   // Initialise the IO and ISR
    vw_set_ptt_inverted(true); // Required for DR3100
    vw_setup(2000);	 // Bits per sec
    vw_set_tx_pin(4);   
}

void loop()
{
int upState = digitalRead(up);
  if (upState == HIGH) {
    pad[0] = 1;
    } else { pad[0] = 0;}
 
 int downState = digitalRead(down);
  if (downState == HIGH) {
    pad[1] = 1;
    }else { pad[1] = 0;}
 
int lewoState = digitalRead(lewo);
  if (lewoState == HIGH) {
    pad[2] = 1;
    }else { pad[2] = 0;}
 
int prawoState = digitalRead(prawo);
  if (prawoState == HIGH) {
    pad[3] = 1;
    }else { pad[3] = 0;}

int selState = digitalRead(sel);
  if (selState == HIGH) {
    pad[4] = 1;
    }else { pad[4] = 0;} 

int startState = digitalRead(start);
  if (startState == HIGH) {
    pad[5] = 1;
    }else { pad[5] = 0;}
 
int aState = digitalRead(a);
  if (aState == HIGH) {
    pad[6] = 1;
    }else { pad[6] = 0;}
 
int bState = digitalRead(b);
  if (bState == HIGH) {
    pad[7] = 1;
    }else { pad[7] = 0;}      
    
    
String x = ("a"+String(pad[0])+String(pad[1])+String(pad[2])+String(pad[3])+String(pad[4])
+String(pad[5])+String(pad[6])+String(pad[7])); // fora nie ma bo mi się nie chciało
   
  char y[10];
  x.toCharArray(y, 10);
  
    const char *msg = y;
    

    vw_send((uint8_t *)msg, strlen(msg));
    //vw_wait_tx(); // Wait until the whole message is gone
     x="";
     //delay(2);
}
i kod odbiornika

Kod: Zaznacz cały

#include <VirtualWire.h>
const int  up = A0;
const int  down = A1;
const int  lewo = A2;
const int  prawo = A3;
const int  sel = A4;
const int  start = A5;
const int  a = 5;
const int  b = 6;

void setup()
{

    
  pinMode(up, OUTPUT);
  pinMode(down, OUTPUT);
  pinMode(start, OUTPUT);
  pinMode(prawo, OUTPUT);
  pinMode(lewo, OUTPUT);
  pinMode(sel, OUTPUT);  
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);

    // Initialise the IO and ISR
   // vw_set_ptt_inverted(true); // Required for DR3100
    vw_setup(2000);	 // Bits per sec
    vw_set_rx_pin(3);
    vw_rx_start();       // Start the receiver PLL running
}

void loop()
{
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;

    if (vw_get_message(buf, &buflen)) // Non-blocking
    {
	int i;
        String p;

        //digitalWrite(13, true); // Flash a light to show received good message
	// Message with a good checksum received, dump it.
	
	
	for (i = 0; i < buflen; i++)
	{ //Serial.print(char(buf[i]));
	   p = p+char(buf[i]);
	   }



    if (p.charAt(1) == '1'){
       digitalWrite(up, LOW);}
    else{
      digitalWrite(up, HIGH);}
    
    if (p.charAt(2) == '1'){
      digitalWrite(down, LOW);}
    else{
      digitalWrite(down, HIGH);}
          
    if (p.charAt(3) == '1'){
      digitalWrite(lewo, LOW);}
    else{
      digitalWrite(lewo, HIGH);}
          
    if (p.charAt(4) == '1'){
      digitalWrite(prawo, LOW);}
    else{
      digitalWrite(prawo, HIGH);}
          
    if (p.charAt(5) == '1'){
      digitalWrite(sel, LOW);}
    else{
      digitalWrite(sel, HIGH);}
          
    if (p.charAt(6) == '1'){
      digitalWrite(start, LOW);}
    else{
      digitalWrite(start, HIGH);}
          
    if (p.charAt(7) == '1'){
      digitalWrite(a, LOW);}
    else{
      digitalWrite(a, HIGH);}
          
    if (p.charAt(8) == '1'){
      digitalWrite(b, LOW);}
    else{
      digitalWrite(b, HIGH);}
    
    
    //digitalWrite(13, false);
    }
}
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

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


logos2000
Młodszy majsterkowicz
Posty: 1
Rejestracja: 8 lis 2014, 22:34

Re: Bezprzewodowy pad do pegasusa RF433 opóźnienie

Post autor: logos2000 » 8 lis 2014, 22:45

Czesc,
Jestem wlasnie w trakcie testowania biblioteki Virtualwire w celu stworzenia bezprzewodowego pada do pegasusa, pierwsze testy sa nadwyraz dobre ( test na rs232). Szybkosc transmisji 2000 bodow w czasie wrecz rzeczywistym, w zalozeniu chcem zrobic box na 2 pady ktory przesle sygnal do konsoli, uzyje do tego celu dwie atmegi8. Znalazlem biblioteke do obslugi oryginalnych padow, teraz zostaje problem czy piszemy biblioteke do kodowania danych czy wykorzystamy oryginalny pad do przeslania danych na poziomie odbioru.

Jak tak patrze na twoj kod to opoznienie moze powodowac wymuszanie stanow wysokich przy braku wcisciecia klawisza, nie ma sensu co chwile zmieniac stanu kazdego z portow jezeli go nie uzywamy. Wiem to absurdalne ale ustawienie stanu wysokiego na stan wysoki danego pinu zajmuje czas procesora, zmieniamy jak potrzebujemy, jak nie potrzeba to nie ruszamy.

Micro switche ktore wykorzystales to slaby pomysl, nie nadaja sie do padow i maja mala zywotnosc.
Awatar użytkownika
foxskav
Majsterkowicz
Posty: 54
Rejestracja: 14 sie 2014, 10:31

Re: Bezprzewodowy pad do pegasusa RF433 opóźnienie

Post autor: foxskav » 25 maja 2015, 14:29

Czy któryś z eksperymentów powiódł się? też chcę przerobić te pady.
Uzytkownik
Młodszy majsterkowicz
Posty: 2
Rejestracja: 11 lut 2017, 21:24

Re: Bezprzewodowy pad do pegasusa RF433 opóźnienie

Post autor: Uzytkownik » 11 lut 2017, 21:27

Widzę że temat był dawno założony, ale Twoim problemem w opóźnieniach jest to że wysyłasz za dużo i bez przerwy.
ODPOWIEDZ

Strony partnerskie: