Skocz do zawartości

Problemy z NRF24I01


solowkidamian

Pomocna odpowiedź

Witam, mam problem z sterowaniem servo motora za pomocą modułu NRF24I01. Servo znajduje się w moim projekcie auta RC mam kontroler który myślałem że działa ale teraz sam już nie wiem(kontroler samemu robiłem). Dobrze wracając do rzeczy program do kontrolera na razie uprościłem do maksimum aby sprawdzić czy przesyłanie większej ilości danych może powodować problemy z ich odbiorem. Silniki w aucie działają prawidłowo, steruje nimi jedna zmienna w aucie "x1". Problemem jest już wyżej wspomniany servo motor którym steruje zmienna "x". Mimo teoretycznego braku sygnału drga, nie da się nim płynnie sterować, ponieważ gdy dostaje sygnał drga jeszcze bardziej i gdy poruszałem samymi silnikami potrafił skręcić. Jeszcze raz wspomnę że silniki działają prawidłowo. Wysyłam program nadajnika tutaj :

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

bool wyswietlanie = false;

const byte pipeOut[6] = "0001";
RF24 radio(7, 8);

struct Data_Package {
  byte x;
  byte x1;
  byte y;
  byte y1;
  byte s;
  byte s1;
 };

 Data_Package data;

 void ResetData() 
 {
   data.x = 127;
   data.x1 = 127;
   data.y = 127;
   data.y1 = 127;
   data.s = 1;
   data.s1 = 1;
 }
 
void setup() {
  
  if( wyswietlanie == true) {
  Serial.begin(9600);
  }

  radio.begin();
  radio.openWritingPipe(pipeOut);
  radio.setAutoAck(false);
  radio.setDataRate(RF24_250KBPS);
  radio.setPALevel(RF24_PA_HIGH); //do zmienienia na dalszy zasieg
  radio.stopListening();

  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);

  ResetData();
}

void loop(){
  
  data.x = map(analogRead(A1), 0, 1023, 0, 255); //80, 14
  data.x1 = map(analogRead(A3), 0, 1023, 0, 255);
  data.y = map(analogRead(A0), 0, 1023, 0, 255);
  data.y1 = map(analogRead(A2), 0, 1023, 0, 255);
  data.s = digitalRead(2);
  data.s1 = digitalRead(3);
  
  radio.write(&data, sizeof(Data_Package));
  
  if( wyswietlanie == true) {
    
  Serial.print("X1: ");
  Serial.print(data.x);
  Serial.print(" X2: ");
  Serial.print(data.x1);
  Serial.println(".");
 
  Serial.print("Y1: ");
  Serial.print(data.y);
  Serial.print(" Y2: ");
  Serial.print(data.y1);
  Serial.println(".");
      
  Serial.print("SW1: ");
  Serial.print(data.s);
  Serial.print(" SW2: ");
  Serial.print(data.s1);
  Serial.println(".");
  
  //delay(1000);
  }
}

A tutaj wstawiam kod autka: 

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>

Servo servo;


int xKierunek = 0;
int yTyl = 0;
int yPrzod = 0;

bool napisy = false;

const byte pipeOut[6] = "0001";
RF24 radio(7, 8);

struct Data_Package {
  byte x;
  byte x1;
  byte y;
  byte y1;
  byte s;
  byte s1;
 };

 Data_Package data;

 unsigned long currentTime = 0;
 unsigned long lastReceiveTime = 0;

void setup() {

  servo.attach(3);

  if (napisy == true){
    Serial.begin(9600);
  }

  radio.begin();
  radio.openReadingPipe(0,pipeOut);
  radio.setAutoAck(false);
  radio.setDataRate(RF24_250KBPS);
  radio.setPALevel(RF24_PA_HIGH);
  radio.startListening();
  resetData();
  
  pinMode(5, OUTPUT); //Sygnały sterujące kierunkiem obrotów silnika nr 1
  pinMode(6, OUTPUT);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
}

void loop() {

  currentTime = millis();

  if (radio.available()) {
    radio.read(&data, sizeof(Data_Package));
    lastReceiveTime = millis();
  }

  if ( currentTime - lastReceiveTime > 1000 ) { 
     resetData();
  }
  if ( napisy == true){
      
      Serial.print("X1: ");
      Serial.print(data.x);
      Serial.print(" X2: ");
      Serial.print(data.x1);
      Serial.println(".");
 
      Serial.print("Y1: ");
      Serial.print(data.y);
      Serial.print(" Y2: ");
      Serial.print(data.y1);
      Serial.println(".");
      
      Serial.print("SW1: ");
      Serial.print(data.s);
      Serial.print(" SW2: ");
      Serial.print(data.s1);
      Serial.println(".");

      Serial.print("K: ");
      Serial.println(xKierunek);
      
      //delay(1000);
  }
  yPrzod = map(data.y1, 127, 255, 0, 255);
  yTyl = map(data.y1, 127, 0, 0, 255);
  
  servo.write(data.x);
  
  if(data.y1 < 127){
      digitalWrite(5, LOW); //Silnik nr 1 - obroty w tył
      digitalWrite(6, HIGH); 
      analogWrite(6, yTyl);
  }
  else if(data.y1 > 127){
      digitalWrite(5, HIGH); //Silnik nr 1 - obroty w przód
      digitalWrite(6, LOW); 
      analogWrite(5, yPrzod);
  }    
  else{
     digitalWrite(6, LOW); //Silnik nr 1 - wylanczamy
     digitalWrite(5, LOW); 
    }
}

 void resetData(){
  data.x = 127;// srdoek 47 //prawo 80//lewo 14???
  data.x1 = 127;
  data.y = 127;
  data.y1 = 127;
  data.s = 1;
  data.s1 = 1;
  }

Będę wdzięczny za pomoc i sam wracam do dalszego szukania problemu 😉

  • Lubię! 1
Link do komentarza
Share on other sites

W szczegółach nie pomogę raczej, ale mam pytanie pomocnicze: 😉
 

1 godzinę temu, solowkidamian napisał:

program do kontrolera na razie uprościłem do maksimum

 Tak trzymać 🙂 to jedna z podstawowych technik zawężania możliwych przyczyn problemu.
 

1 godzinę temu, solowkidamian napisał:

aby sprawdzić czy przesyłanie większej ilości danych może powodować problemy z ich odbiorem.

Czy to znaczy, że obecnie badasz czy tu może być problem (czy zawsze odbierasz dokładnie dane, które nadałeś)? Bo to nie wynika jasno z treści.

  • Lubię! 1
Link do komentarza
Share on other sites

1 godzinę temu, solowkidamian napisał:

Jeszcze raz wspomnę że silniki działają prawidłowo.

Jeszcz pytanie, co masz tutaj na myśli. Czy to że silniki są mechanicznie/elektrycznie w porządku? Czy to, że działa cała ścieżka: przygotowanie/wysłanie danych z kontrolera, odbiór danych, wysterowanie i reakcja silnika (a coś dziwnego dzieje się w przypadku serwo)?

  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

1 godzinę temu, ReniferRudolf napisał:

Czy to znaczy, że obecnie badasz czy tu może być problem (czy zawsze odbierasz dokładnie dane, które nadałeś)? Bo to nie wynika jasno z treści.

To sprecyzuje to. Servo motor według mnie nie odbiera prawidłowo danych ponieważ gdy poruszam osią która odpowiada za jego ruch, drży i ma problemy z zmianą pozycji. Na chwilę obecną wpadłem na pomysł aby servo po prostu znajdowało się w 3 pozycjach(prawo, prosto i lewo), wystarcza do skręcania ale i tak małe drgania są zauważalne ale jest o wiele lepiej.   

Link do komentarza
Share on other sites

1 godzinę temu, ReniferRudolf napisał:

Jeszcz pytanie, co masz tutaj na myśli. Czy to że silniki są mechanicznie/elektrycznie w porządku? Czy to, że działa cała ścieżka: przygotowanie/wysłanie danych z kontrolera, odbiór danych, wysterowanie i reakcja silnika (a coś dziwnego dzieje się w przypadku servo)?

Oznacza to że moja silnik DC od auta, które są sterowane takim samym sygnałem PWM, wydaje mi się że działają bez zarzutu. Mianowicie płynnie się rozpędzają i czuje że mogę je dobrze kontrolować. Dlatego tez mi się trochę wydaje ze to może być winna servo, ale tak tylko trochę.

Link do komentarza
Share on other sites

1 godzinę temu, ethanak napisał:

Znajdź sobie mój temat "Jawajka na cztery ręce" (sorki na telefonie mam problem z linkiem) - tam masz kod sterowania serwami bez żadnych drygań i podskoków.

Wiem, wiem raz jak miałem problem z tym modułem to też zostałem przekierowany do tamtego projektu i bardzo mi pomógł zacząć prace z tym modułem może przejrzę go jeszcze raz. Bo ogólnie dla mnie problem w tym ze ten projekt jest strasznie skomplikowany przynajmniej dla mnie.

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.