bezprzewodowe sterowanie joystickiem 2 silników

Zrobiłeś coś fajnego z wykorzystaniem Arduino? Pochwal się tym!
ODPOWIEDZ
Awatar użytkownika
wojtekizk
Starszy majsterkowicz
Posty: 311
Rejestracja: 19 lis 2013, 10:54
Lokalizacja: Bydgoszcz

bezprzewodowe sterowanie joystickiem 2 silników

Post autor: wojtekizk » 21 mar 2014, 13:56

Witam...
Może komuś jest potrzebny programik do sterowania radiowego 2 silników ( osie XY ) za pomocą popularnego joysticka?
Potrzebne elementy:
1) joystick
2) sterownik silników np. L293D
3) 2 silniki (mechanizmy)
4) moduł nadajnika FS100A (XY-FST)
5) moduł odbiornika (XY-MK-5V)
6) przykładowy kod dla nadajnika i odbiornika
Punkt 6 poniżej:
nadajnik:
#include <VirtualWire.h>
const int transmit_pin = 3; // do tego pinu pin TX nadajnika XY-FST
int joystickPion = A0; // pin joysticka dla pionu
int joystickPoziom=A1; // pin joysticka dla poziomu
int a,b; // zmienne pomocnicze do obliczeń
long X = 0; // zmienna wynikowa, do przetworzenia w wiadomości
char wiadomosc[10]; // wiadomość tekstowa
// ------------------------------------------------------------------------------
void setup()
{
  Serial.begin(9600);
  // konfiguracja nadajnika i protokołu transmisji
  vw_set_tx_pin(transmit_pin); 
  vw_set_ptt_inverted(true);
  vw_setup(2000); 
}
// -----------------------------------------------------------------------------
void loop() {
 // czytamy stan manetek joysticka
  a=analogRead(joystickPion);Serial.println(a);
  b=analogRead(joystickPoziom);Serial.println(b);Serial.println("------");
  X = a+b*1024L; // przetwarzamy stany na liczbę
  ltoa(X, wiadomosc,10);  // zamiana liczby na text do wysłania
  vw_send((uint8_t *)wiadomosc, strlen(wiadomosc));  // wysłanie wiadomości
  vw_wait_tx();                                      // konieczne dla skomunikowania modułów Nad.-Odb.
}
odbiornik:
#include <VirtualWire.h>
// --- piny dla układu L293D ( nie możesz używać pinu nr 3 !!! )------
#define IN1 2   // dla silnika 1 (przód-tył)
#define IN2 4   // dla silnika 1 (przód-tył)
#define EN1 10  // koniecznie pin PWM (~)
#define IN3 6   // dla serwa (lewo-prawo)
#define IN4 7   // dla serwa (lewo-prawo)
#define EN2 11  // koniecznie pin PWM (~)
// --- moce silników -------------------------------------------------
int PWM1;
int PWM2;
// --- zmienne -------------------------------------------------------
char *kierunek; // kierunek ruchu, potrzebne tylko dla Seriala :-)
long X; // stan joysticka XY (przetworzona wiadomość)
// --- dla modułu XY-MK ----------------------------------------------
const int receive_pin = 3; // koniecznie ten pin
char wiadomosc[10]; // odebrana wiadomość
// -------------------------------------------------------------------
void setup()
{
  Serial.begin(9600);
  vw_set_rx_pin(receive_pin); // konfiguracja odbiornika
  vw_set_ptt_inverted(true); // konfiguracja protokołu
  vw_setup(2000);             // konfiguracja protokołu
  vw_rx_start();              // start odbiornika
  
  // --- konfiguracja pinów ------------------------------------------
  pinMode(IN1,OUTPUT);digitalWrite(IN1,LOW);
  pinMode(IN2,OUTPUT);digitalWrite(IN2,LOW);
  pinMode(IN3,OUTPUT);digitalWrite(IN3,LOW);
  pinMode(IN4,OUTPUT);digitalWrite(IN4,LOW);
  pinMode(EN1,OUTPUT);
  pinMode(EN2,OUTPUT);
}
// -------------------------------------------------------------------
void loop()
{
   uint8_t buf[VW_MAX_MESSAGE_LEN]; // definiujemy bufor do odbioru inf.
   uint8_t buflen = VW_MAX_MESSAGE_LEN; // rozmiar bufora
   if (vw_get_message(buf, &buflen)) // pobieramy wiadomość
   {
     int i;
     for (i = 0; i < buflen; i++) // kopiujemy ją do zmiennej wiadomosc
       {
       wiadomosc = char(buf);
       }
    wiadomosc[buflen] = '\0'; // znak końca tekstu
    X = atol(wiadomosc);              // przetwarzamy tekst na liczbę
    PWM1 = (int)(X%1024L); // obliczamy wychylenie w osi Y
    if(PWM1>535){kierunek="do przodu";digitalWrite(IN1,HIGH);digitalWrite(IN2,LOW);PWM1 = map(PWM1,535,1023,0,255);analogWrite(EN1,PWM1);}
    else if(PWM1<505){kierunek="do tylu";digitalWrite(IN1,LOW);digitalWrite(IN2,HIGH);PWM1 = map(PWM1,505,0,0,255);analogWrite(EN1,PWM1);}
    if(PWM1>=505 && PWM1<=535){kierunek=" stop ";PWM1=0;analogWrite(EN1,0);}
    Serial.print("Silnik 1: kierunek: ");Serial.print(kierunek);Serial.print(" moc: ");Serial.println(PWM1);
    PWM2 = int(X/1024L); // obliczamy wychylenie w osi X
    if(PWM2>535){kierunek="w prawo ";digitalWrite(IN3,HIGH);digitalWrite(IN4,LOW);PWM2 = map(PWM2,535,1023,0,255);analogWrite(EN2,PWM2);}
    else if(PWM2<505){kierunek="w lewo";digitalWrite(IN3,LOW);digitalWrite(IN4,HIGH);PWM2 = map(PWM2,505,0,0,255);analogWrite(EN2,PWM2);}
    if(PWM2>=505 && PWM2<=535){kierunek=" stop ";PWM2=0;analogWrite(EN2,0);}
    Serial.print("Silnik 2: kierunek: ");Serial.print(kierunek);Serial.print(" moc: ");Serial.println(PWM2);
    
    Serial.println("--------------------------------------");
   }
}


.. wszystkie Seriale można sobie darować :=-)
Pozdrawiam

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


Lothien
Młodszy majsterkowicz
Posty: 26
Rejestracja: 11 cze 2014, 20:36

Re: bezprzewodowe sterowanie joystickiem 2 silników

Post autor: Lothien » 13 cze 2014, 22:42

wojtekizk czy sprawdzałeś te skecze na gotowych układach?

Ja próbuję zrobić coś podobnego, trochę inaczej ale efekt chcę otrzymać taki sam.

Problem w tym, że jak ustawiam wartości różne niż 0 i 255 do portów PWM w odbiorniku to mój skecz mi się zawiesza (czasami się odblokowuje po paru sekundach, czasem po dłuższej chwili)

Myślałem, że to jakiś flak w kodzie (może błąd rzutowania albo coś) więc wgrałem do swojego Leonardo Twoje skecze, zmontowałem układy i co?

Efekt ten sam, po kilku wpisach wartości do PWM skecz odbiornika mi się wiesza (po jakimś czasie się odblokowuje ale potem znowu się wiesza) i odbiornik nie reaguje na ruchy joysticka:/
Skecze (mój i te Twoje) wieszają mi się zarówno na płytce Arduino Leonardo jak i na Pro Mini :/

Spotkałeś się z takim problemem?
Lothien
Młodszy majsterkowicz
Posty: 26
Rejestracja: 11 cze 2014, 20:36

Re: bezprzewodowe sterowanie joystickiem 2 silników

Post autor: Lothien » 16 cze 2014, 11:36

To chyba problem z biblioteką do obsługi odbiornika RF. Chyba coś nie tak z przerwaniami.
Wnioskuję tak bo przeniosłem swojego sketcha na obsługę odbiornika BT i działa jak marzenie.
Awatar użytkownika
v-cu
Starszy majsterkowicz
Posty: 290
Rejestracja: 30 gru 2012, 23:00
Lokalizacja: Woźniki

Re: Odp: bezprzewodowe sterowanie joystickiem 2 silników

Post autor: v-cu » 16 cze 2014, 14:22

Hmmm a może by szło zrobić sterowanie 433mhz na jakiejś innej bibliotece? Np. rc-switch?
svalmont
Majsterkowicz
Posty: 119
Rejestracja: 20 paź 2013, 21:22

Re: bezprzewodowe sterowanie joystickiem 2 silników

Post autor: svalmont » 22 cze 2014, 02:32

Ja będę niebawem tworzył podobny układ sterowania. Myślę że jak macie problem z wieszaniem to warto pokombinować z prędkością transmisji czym wolniejsza tym dokładniejsza :)
Lothien
Młodszy majsterkowicz
Posty: 26
Rejestracja: 11 cze 2014, 20:36

Re: bezprzewodowe sterowanie joystickiem 2 silników

Post autor: Lothien » 14 lip 2014, 21:03

svalmont pisze:Ja będę niebawem tworzył podobny układ sterowania. Myślę że jak macie problem z wieszaniem to warto pokombinować z prędkością transmisji czym wolniejsza tym dokładniejsza :)
Zamiana prędkości transmisji nic nie daje.
Kombinuje z różnymi wariantami na swoim skeczu i na skeczu Wojtka ale zawsze mam ten sam problem.
Po paru sekundach przesyłania danych skecz się wiesza.
Jak zamiast sterownika silników do wyjść PWM podłącze diody to w momencie zawieszenie się programu jedna z tych diod zawsze świeci.
Tak jakby w momencie ustawiania wartości na piny PWM coś się wieszało.
Dodam, że same (kiedy nie mam podłączone odbiornika RF) porty PWM działą prawiodłowo.
Sam odbiornik także (oczywiście tylko wtedy kiedy w skeczu nie używam funkcji analogWrite).

Mam po dwa komplety odbiornika i nadajnika i na obu skecze wieszają mi się w momencie ustawiania wartości na PWM.
Więc to chyba nie jest wina sprzętowa.

Ktoś z Was już "walczył" z takim problemem?
ODPOWIEDZ

Strony partnerskie: