Skocz do zawartości

Sterowanie silnikami joystickiem z modułem nrf24l01


TurBan

Pomocna odpowiedź

Witam

Otóż rzecz polega na tym, że (prawdopodobnie) w programie odbiornika, w void loop, mam błędnie sformułowane instrukcje do komendy stopp. Problem jaki mam, to gdy pchnę joystick np. do przodu to gdy go puszczę, żeby powrócił do pozycji zero, to silniki kręcą się dalej w tym kierunku , którym był ostatnio wysyłany sygnał, tylko, że wolniej (tak jakby Arduino nie wiedziało co ma zrobić dla pozycji zerowej joysticka).Problem na pewno leży w programie, bo w ramach testu ustawiłem w "void forward" wszystkie silniki na LOW i kiedy pchnąłem joystick do przodu to koła się zatrzymały. Może to chodzi o to, że w kodzie nadajnika nie ma val pod stop stworzonego?   

Ps.

Jazda w przód, tył lewo, prawo działa bez zarzutu, tylko zatrzymanie kół nie działa.

 

Nadajnik

#include <SPI.h>  
#include "RF24.h"  
RF24 radio(9,10); 
const uint64_t pipe = 0xE8E8F0F0E1LL;  
int msg[1];  
int potpin_1 = A0;  // VRy z modułu joysticka
int val_1;  
int potpin_2 = A1;  // VRx z modułu joysticka
int val_2; 
 

 
 
void setup(void){ 
 
radio.begin(); 
radio.openWritingPipe(pipe);  
} 
 
void loop() { 
//przypisanie wysyłanej informacji odpowiednim wychyleniom potencjometrów 
 
val_1 = analogRead(potpin_1); val_1 = map(val_1, 0, 1023, 71, 170); msg[0] = val_1; radio.write(msg, 1);  
val_2 = analogRead(potpin_2); val_2 = map(val_2, 0, 1023, 1, 70); msg[0] = val_2; radio.write(msg, 1); 

}

Odbiornik

#include <SPI.h> 
#include "RF24.h"   
RF24 radio(9,10); 
const uint64_t pipe = 0xE8E8F0F0E1LL;  
int msg[1];  
int data;   
int pos;
 

 
int sspeed;           // prędkość
 

const int ena = 5;    // PWM pin do zmiany prędkości
 
//silnik-lewy tył
const int in1t = 4;     
const int in2t = 2;    
 
  
 
//silnik-prawy tył
const int in12t = 8;     
const int in22t = 7;    
 
void setup()  
{ 

  
        
  pinMode(ena, OUTPUT);      
 
  pinMode(in1t, OUTPUT);       
  pinMode(in2t, OUTPUT);     
 
     
 
  pinMode(in12t, OUTPUT);       
  pinMode(in22t, OUTPUT);      
  
delay(50); 
radio.begin(); 
radio.openReadingPipe(1,pipe);  
radio.startListening();  
} 
 
void loop()  //przypisanie odbieranym sygnałom odpowiednich czynności
{  
if (radio.available())radio.read(msg, 1); 
 
if (msg[0] >0 && msg[0] <30){data = msg[0]; sspeed = map(data, 0, 30, 255, 50); right(sspeed);} 
 
if (msg[0] >40 && msg[0] <70){data = msg[0]; sspeed = map(data, 700, 40, 255, 50); left(sspeed);} 
 
if (msg[0] >70 && msg[0] <115){data = msg[0]; sspeed = map(data, 71, 115, 255, 50); backward(sspeed);} 
 
if (msg[0] >125 && msg[0] <170){data = msg[0]; sspeed = map(data, 170, 124, 255, 50); forward(sspeed);} 
 
if ((msg[0] >=115 && msg[0] <=125)&&(msg[0] >=30 && msg[0] <=40)){data = msg[0]; stopp(); }
 
  } 
 
  void stopp() 
 
{  
  analogWrite(ena, 0);  
  
  
  
  digitalWrite(in1t, LOW); 
  digitalWrite(in2t, LOW); 
  digitalWrite(in12t, LOW); 
  digitalWrite(in22t, LOW); 
} 
 
void forward(int sspeed) //jazda w przód
 
{  
  
  digitalWrite(in1t, HIGH);
  digitalWrite(in12t, HIGH);  
  digitalWrite(in2t, LOW); 
  digitalWrite(in22t, LOW);
  analogWrite(ena, sspeed);
  
} 
 
void backward(int sspeed) //jazda w tył
 
{  
  
 
  digitalWrite(in1t, LOW);  
  digitalWrite(in12t, LOW); 
  digitalWrite(in2t, HIGH); 
  digitalWrite(in22t, HIGH);
  analogWrite(ena, sspeed); 
 
} 
 
void left(int sspeed) // prawe silniki do przodu, a lewe do tyłu
 
{  
  
 
  digitalWrite(in1t, LOW);  
  digitalWrite(in12t, HIGH); 
  digitalWrite(in2t, HIGH); 
  digitalWrite(in22t, LOW);
  analogWrite(ena, sspeed); 
 
} 
 
void right(int sspeed) // lewe silniki do przodu, a prawe do tyłu
 
{  
  
 
  digitalWrite(in1t, HIGH);  
  digitalWrite(in12t, LOW); 
  digitalWrite(in2t, LOW); 
  digitalWrite(in22t, HIGH);
  analogWrite(ena, sspeed); 
 
}

Z góry dzięki 😄

Edytowano przez TurBan
Link do komentarza
Share on other sites

@TurBan, nie będę ukrywał - dość ciężko przeanalizować Twój program. Warto popracować nad formatowanie, ale coś tam chyba z niego zrozumiałem.

Jeśli dobrze widzę, to w pozycji neutralnej joysticka wysyłasz na zmianę sygnały ~50 dla osi X i ~35 dla osi Y. Zgadza się?

Ten warunek jest raczej zły:

if ((msg[0] >=115 && msg[0] <=125)&&(msg[0] >=30 && msg[0] <=40)){data = msg[0]; stopp(); }

Po pierwsze, sformatujmy go jakoś sensownie:

  if ((msg[0] >= 115 && msg[0] <= 125) && (msg[0] >= 30 && msg[0] <= 40)) {
    data = msg[0];
    stopp();
  }

I teraz powiedz mi jak jakaś liczba może mieścić się w zakresie od 115 do 125 oraz jednocześnie w zakresie od 30 do 40? Nie pomyliłeś się w tym warunku, nie miało tu być przypadkiem LUB zamiast I?

  • Pomogłeś! 1
Link do komentarza
Share on other sites

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

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.