• 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

Object Storage Arubacloud
0 głosów
248 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 518 wizyt
0 głosów
0 odpowiedzi 1,361 wizyt
0 głosów
2 odpowiedzi 1,409 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...