• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zdalny robot Arduino nRF24 - komunikacja dwustronna problem

Cloud VPS
0 głosów
315 wizyt
pytanie zadane 20 marca 2020 w Mikrokontrolery przez Piotr Patek Nowicjusz (170 p.)

Witam,

Przychodzę z następującym problemem. Jakiś czas temu postanowiłem zbudować małego zdalnego robota na bazie Arduino Mega - robot i Arduino Uno - nadajnik/odbiornik. Napisałem kod do robota i nadajnika i wszystko działało ok do czasu, gdy postanowiłem wprowadzić komunikację dwustronną pomiędzy nadajnikiem/odbiornikiem, a robotem. Dodając do kodu 3 linijki całość jakby się zawiesza i nie działa. Proszę o przeanalizowanie kodu i pomoc. Z góry wielkie dzięki

Nadajnik/Odbiornik - działający



#include <SPI.h>
#include "nRF24L01.h"
#include <printf.h>
#include "RF24.h"
#include <RF24_config.h>

byte addresses[][6] = {"1Node","2Node"};
String incoming;
RF24 radio(9,10);
int dane[2];
int msg[2];

void setup() {
  
  Serial.begin(115200);
  radio.begin();
  
  
 radio.openWritingPipe(addresses[0]);
 radio.openReadingPipe(1,addresses[1]);


   
  
  
}

void loop() 
{
    radio.startListening();

    dane[0] = analogRead(5) + 1;
    dane[1] = analogRead(4) + 1;
  

  
  Serial.print("Odbiór: ");
  Serial.println(msg[0]);

  

    
    Serial.print(dane[0]);
   Serial.print('\t');
    Serial.println(dane[1]);

    radio.stopListening();
    radio.write(&dane,sizeof(dane));
    delay(100);
    radio.startListening();
    
 
     
  
}

Robot - działający


#include <SPI.h>
#include <nRF24L01.h>
#include <printf.h>
#include <RF24.h>
#include <RF24_config.h>
//#include <afstandssensor.h>


byte addresses[][6] = {"1Node","2Node"};
//AfstandsSensor afstandssensor(32, 34);

RF24 radio(40,42);
int msg[3];
int b;
int dane[2] = {20,198};
unsigned long aktualnyCzas = 0;
unsigned long zapamietanyCzas = 0;
int M_DP[4] = {4,12,8,7};
int M_DP_V[4];
const int M_SP[4] = {3,11,5,6};

int mis[2];
float x, y; // Oś X
float M_S, M_SY;
float odleglosc;

class Vehicle{



  public: void trakcja()
  {
    if(b == 3 )
    {     
      
      M_DP_V[0] = 0;
      M_DP_V[1] = 0;
      M_DP_V[2] = 0;
      M_DP_V[3] = 0; 
      
    }
    
    else if(b == 1 )
    {     
     M_DP_V[0] = 1;
      M_DP_V[1] = 1;
      M_DP_V[2] = 1;
      M_DP_V[3] = 1;
      
    }
    else
    {
      M_S = 0;
      
    }  
      if(y < 450 && 300 < x && x < 700 )
    {
      M_DP_V[0] = 1;
      M_DP_V[1] = 0;
      M_DP_V[2] = 1;
      M_DP_V[3] = 0;
      M_S = 200; 
    }
    else if(y > 550 && 300 < x && x < 700)
    {
      M_DP_V[0] = 0;
      M_DP_V[1] = 1;
      M_DP_V[2] = 0;
      M_DP_V[3] = 1;
      M_S = 200;
    }    
     for(int i = 0; i <= 3; i++)
    {
      digitalWrite(M_DP[i],M_DP_V[i]);
      analogWrite(M_SP[i],M_S);
    }    
}

public: void receiver()
{

  aktualnyCzas = millis();
  if(radio.available() > 0)
  {

  radio.read(&msg, sizeof(msg));
  
  if (aktualnyCzas - zapamietanyCzas >= 100UL) { 
    zapamietanyCzas = aktualnyCzas;
    if(msg[0] > 550 || b == 3 && msg[0] == 0 && M_S > 200)
    {
      b = 3;
      msg[0] = msg[0] - 1;
      msg[1] = msg[1] - 1;
    }
    else if ( 550 > msg[0] && msg[0] > 450)
    {
      b = 2;
      msg[0] = msg[0] - 1;
      msg[1] = msg[1] - 1;
    }
    else if ( msg[0] < 450 && msg[0] != 0)
    {
      b = 1;
      msg[0] = msg[0] - 1;
      msg[1] = msg[1] - 1;
    }
    else if( msg[0] == 0)
    {
      b = 0;
    }
    
  } 
   x = msg[0];
   y = msg[1];

  M_SY = map(abs(505 - y),0,520,0,255);
  M_S = map(abs(505 - x),0,520,0,255);

 /* if( )
  {
    x = map(M_S,0,255,0,1023);
  }
  */
  Serial.print("X: ");
  Serial.print(msg[0]);
  Serial.print('\t');
  Serial.print("B: ");
  Serial.print(b);
  Serial.print('\t');
  Serial.print("M_S: ");
  Serial.println(M_S);
  } 

} 

public: void receiver_1()
{
  if(radio.available() > 0)
  {

  radio.read(&mis, sizeof(mis));
  

  
  Serial.print("Odbiór: ");
  Serial.print(mis[0]);

  } 
}

public: void transmitter()
{
  
}


public: float distance()
{
  aktualnyCzas = millis();
  
  if (aktualnyCzas - zapamietanyCzas >= 5UL) { 
    zapamietanyCzas = aktualnyCzas;
//  odleglosc = afstandssensor.afstandCM();
  return odleglosc;
   }
  
}

public: void commands()
{
  char* incoming;

  incoming = Serial.read();
  if(incoming =='d')
  {
    Serial.println(distance());
  }
}

};


void setup() {
  
  for(int i = 0; i < 5; i++)
  {
    pinMode(M_DP[i], OUTPUT);
    pinMode(M_SP[i], OUTPUT);
  }
  pinMode(M_DP[4],OUTPUT);
  digitalWrite(M_DP[0],LOW);

  
  Serial.begin(115200);
  radio.begin(); 
  radio.openReadingPipe(1,addresses[0]);
  radio.openWritingPipe(addresses[1]);
  radio.startListening();
  

}

void loop() 
{
  Vehicle vehicle;
  vehicle.receiver();
  vehicle.trakcja();
 // vehicle.commands();
  
  
  
  
  
 
   
  


}

Nadajnik/Odbiornik - nie działający



#include <SPI.h>
#include "nRF24L01.h"
#include <printf.h>
#include "RF24.h"
#include <RF24_config.h>

byte addresses[][6] = {"1Node","2Node"};
String incoming;
RF24 radio(9,10);
int dane[2];
int msg[2];

void setup() {
  
  Serial.begin(115200);
  radio.begin();
  
  
 radio.openWritingPipe(addresses[0]);
 radio.openReadingPipe(1,addresses[1]);


   
  
  
}

void loop() 
{
    radio.startListening();

    dane[0] = analogRead(5) + 1;
    dane[1] = analogRead(4) + 1;
    if(radio.available() > 0)
  {

  radio.read(&msg, sizeof(msg));
  

  
  Serial.print("Odbiór: ");
  Serial.print(msg[0]);

  } 

    //Serial.print(dane[0]);
  // Serial.print('\t');
   // Serial.println(dane[1]);

    radio.stopListening();
    radio.write(&dane,sizeof(dane));
    delay(100);
    radio.startListening();
    
 
     
  
}

Robot - nie działający


#include <SPI.h>
#include <nRF24L01.h>
#include <printf.h>
#include <RF24.h>
#include <RF24_config.h>
//#include <afstandssensor.h>


byte addresses[][6] = {"1Node","2Node"};
//AfstandsSensor afstandssensor(32, 34);

RF24 radio(40,42);
int msg[3];
int b;
int dane[2] = {20,198};
unsigned long aktualnyCzas = 0;
unsigned long zapamietanyCzas = 0;
int M_DP[4] = {4,12,8,7};
int M_DP_V[4];
const int M_SP[4] = {3,11,5,6};

int mis[2];
float x, y; // Oś X
float M_S, M_SY;
float odleglosc;

class Vehicle{



  public: void trakcja()
  {
    if(b == 3 )
    {     
      
      M_DP_V[0] = 0;
      M_DP_V[1] = 0;
      M_DP_V[2] = 0;
      M_DP_V[3] = 0; 
      
    }
    
    else if(b == 1 )
    {     
     M_DP_V[0] = 1;
      M_DP_V[1] = 1;
      M_DP_V[2] = 1;
      M_DP_V[3] = 1;
      
    }
    else
    {
      M_S = 0;
      
    }  
      if(y < 450 && 300 < x && x < 700 )
    {
      M_DP_V[0] = 1;
      M_DP_V[1] = 0;
      M_DP_V[2] = 1;
      M_DP_V[3] = 0;
      M_S = 200; 
    }
    else if(y > 550 && 300 < x && x < 700)
    {
      M_DP_V[0] = 0;
      M_DP_V[1] = 1;
      M_DP_V[2] = 0;
      M_DP_V[3] = 1;
      M_S = 200;
    }    
     for(int i = 0; i <= 3; i++)
    {
      digitalWrite(M_DP[i],M_DP_V[i]);
      analogWrite(M_SP[i],M_S);
    }    
}

public: void receiver()
{

  aktualnyCzas = millis();
  if(radio.available() > 0)
  {

  radio.read(&msg, sizeof(msg));
  
  if (aktualnyCzas - zapamietanyCzas >= 100UL) { 
    zapamietanyCzas = aktualnyCzas;
    if(msg[0] > 550 || b == 3 && msg[0] == 0 && M_S > 200)
    {
      b = 3;
      msg[0] = msg[0] - 1;
      msg[1] = msg[1] - 1;
    }
    else if ( 550 > msg[0] && msg[0] > 450)
    {
      b = 2;
      msg[0] = msg[0] - 1;
      msg[1] = msg[1] - 1;
    }
    else if ( msg[0] < 450 && msg[0] != 0)
    {
      b = 1;
      msg[0] = msg[0] - 1;
      msg[1] = msg[1] - 1;
    }
    else if( msg[0] == 0)
    {
      b = 0;
    }
    
  } 
   x = msg[0];
   y = msg[1];

  M_SY = map(abs(505 - y),0,520,0,255);
  M_S = map(abs(505 - x),0,520,0,255);

 /* if( )
  {
    x = map(M_S,0,255,0,1023);
  }
  */
  Serial.print("X: ");
  Serial.print(msg[0]);
  Serial.print('\t');
  Serial.print("B: ");
  Serial.print(b);
  Serial.print('\t');
  Serial.print("M_S: ");
  Serial.println(M_S);
  } 

} 

public: void receiver_1()
{
  if(radio.available() > 0)
  {

  radio.read(&mis, sizeof(mis));
  

  
  Serial.print("Odbiór: ");
  Serial.print(mis[0]);

  } 
}

public: void transmitter()
{
  
}


public: float distance()
{
  aktualnyCzas = millis();
  
  if (aktualnyCzas - zapamietanyCzas >= 5UL) { 
    zapamietanyCzas = aktualnyCzas;
//  odleglosc = afstandssensor.afstandCM();
  return odleglosc;
   }
  
}

public: void commands()
{
  char* incoming;

  incoming = Serial.read();
  if(incoming =='d')
  {
    Serial.println(distance());
  }
}

};


void setup() {
  
  for(int i = 0; i < 5; i++)
  {
    pinMode(M_DP[i], OUTPUT);
    pinMode(M_SP[i], OUTPUT);
  }
  pinMode(M_DP[4],OUTPUT);
  digitalWrite(M_DP[0],LOW);

  
  Serial.begin(115200);
  radio.begin(); 
  radio.openReadingPipe(1,addresses[0]);
  radio.openWritingPipe(addresses[1]);
  radio.startListening();
  

}

void loop() 
{
  Vehicle vehicle;
  vehicle.receiver();
  vehicle.trakcja();
  vehicle.commands();
  
  radio.stopListening();
  delay(10);
  radio.write(&dane,sizeof(dane));
  radio.startListening();
   
  


}

Ponadto, dziwną rzeczą jest, że nawet przy dobrym programie robot ma skłonności do mulenia się, mimo tego, że arduino IDE pokazuje zużywanie jedynie 2%  pamięci programu.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
0 odpowiedzi 728 wizyt
0 głosów
0 odpowiedzi 1,678 wizyt
0 głosów
2 odpowiedzi 2,096 wizyt

93,454 zapytań

142,449 odpowiedzi

322,718 komentarzy

62,836 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...