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.