NRF24L01

Tarantul_acc
Tarantul_acc аватар
Offline
Зарегистрирован: 09.03.2013

Здравствуйте!

Имеется акселерометр и 2 NRF24L01, передаю значение x и в ответ получаю действие, а как сразу передовать x и y, так чтобы потом можно было выполнять сравнение пришедшего числа и выполнять действие (мигать светодиодом)?

MaksMS
Offline
Зарегистрирован: 11.03.2013

1.Ну наверно передать одновременно оба значения... через typedef  например..

2.сохранить значение в переменной и сравнить его с при следущем чтении данных 

Tarantul_acc
Tarantul_acc аватар
Offline
Зарегистрирован: 09.03.2013

1. Вот я и не знаю как это сделать =(

2.Работает нормально.

Tarantul_acc
Tarantul_acc аватар
Offline
Зарегистрирован: 09.03.2013

Передатчик:

#include <SPI.h>
#include "RF24.h"
#include <Wire.h>
#define DEVICE (0x53) // Device address as specified in data sheet 

RF24 radio(9, 10);

const uint64_t pipes[2] = {
  0xF0F0F0F000LL, 0xF0F0F0F0FFLL};// адреса каналов приема и передачи

byte _buff[6];

char POWER_CTL = 0x2D;        //Power Control Register
char DATA_FORMAT = 0x31;
char DATAX0 = 0x32;        //X-Axis Data 0
char DATAX1 = 0x33;        //X-Axis Data 1
char DATAY0 = 0x34;        //Y-Axis Data 0
char DATAY1 = 0x35;        //Y-Axis Data 1
char DATAZ0 = 0x36;        //Z-Axis Data 0
char DATAZ1 = 0x37;        //Z-Axis Data 1

void setup(){
  Serial.begin(9600);
  radio.begin();  
  radio.setDataRate(RF24_250KBPS); // Скорость передачи
  radio.setChannel(100); // Номер канала от 0 до 127
  radio.setRetries(15,15); // Кол-во попыток и время между попытками
  radio.openWritingPipe(pipes[1]);  // Открываем канал передачи
  radio.openReadingPipe(1, pipes[0]); // Открываем один из 6-ти каналов приема
  radio.startListening(); // Начинаем слушать эфир
  
  Wire.begin();        // join i2c bus (address optional for master)
  //Put the ADXL345 into +/- 4G range by writing the value 0x01 to the DATA_FORMAT register.
  writeTo(DATA_FORMAT, 0x01);
  //Put the ADXL345 into Measurement Mode by writing 0x08 to the POWER_CTL register.
  writeTo(POWER_CTL, 0x08);
}

void loop()
{
  readAccel(); // read the x/y/z tilt
  delay(250); // only read every 0,5 seconds
}


void readAccel() {
  uint8_t howManyBytesToRead = 6;
  readFrom( DATAX0, howManyBytesToRead, _buff); //read the acceleration data from the ADXL345

  // each axis reading comes in 10 bit resolution, ie 2 bytes.  Least Significat Byte first!!
  // thus we are converting both bytes in to one int
  int x = (((int)_buff[1]) << 8) | _buff[0];   
  int y = (((int)_buff[3]) << 8) | _buff[2];
  int z = (((int)_buff[5]) << 8) | _buff[4];
  Serial.print("x: ");
  Serial.print( x );
  Serial.print(" y: ");
  Serial.println( y );
  
    char data[32] = "";
    byte i = 0;
      data[i] = x; //получаем данные из сериал.
      i++;
      delay(2);
    
    data[i] = 0;
    radio.stopListening();
    radio.write(&data, 32); //и отправляем их в Arduino №2
    radio.startListening();
  }
  


void writeTo(byte address, byte val) {
  Wire.beginTransmission(DEVICE); // start transmission to device 
  Wire.write(address);             // send register address
  Wire.write(val);                 // send value to write
  Wire.endTransmission();         // end transmission
}

// Reads num bytes starting from address register on device in to _buff array
void readFrom(byte address, int num, byte _buff[]) {
  Wire.beginTransmission(DEVICE); // start transmission to device 
  Wire.write(address);             // sends address to read from
  Wire.endTransmission();         // end transmission

  Wire.beginTransmission(DEVICE); // start transmission to device
  Wire.requestFrom(DEVICE, num);    // request 6 bytes from device

  int i = 0;
  while(Wire.available())         // device may send less than requested (abnormal)
  { 
    _buff[i] = Wire.read();    // receive a byte
    i++;
  }
  Wire.endTransmission();         // end transmission
}

Приемник:

#include <SPI.h>
#include "RF24.h"
#define D2 4    
#define M2 5      
#define EN1 7 
#define D1 2    
#define M1 3   
#define EN2 6

// Set up nRF24L01 radio on SPI bus plus pins 9 & 10 
//Контакты от радиомодуля NRF24L01 подключаем к пинамнам -> Arduino

//SCK  -> 13
//MISO -> 12
//MOSI -> 11
//CSN  -> 10
//CE   -> 9


RF24 radio(9, 10);

const uint64_t pipes[2] = {
  0xF0F0F0F000LL, 0xF0F0F0F0FFLL};// адреса каналов приема и передачи


void setup(){
  radio.begin();  
  radio.setDataRate(RF24_250KBPS);  // Скорость передачи
  radio.setChannel(100); // Номер канала от 0 до 127
  radio.setRetries(15,15); // Кол-во попыток и время между попытками
  radio.openWritingPipe(pipes[0]); // Открываем канал передачи
  radio.openReadingPipe(1, pipes[1]); // Открываем один из 6-ти каналов приема
  radio.startListening(); // Начинаем слушать эфир

  pinMode(D2, OUTPUT);  
  pinMode(EN1, OUTPUT); 
  pinMode(D1, OUTPUT);  
  pinMode(EN2, OUTPUT);  
}

void loop(){
  if(radio.available()){
    char data[32] = "";
    radio.read(&data, 32); //принимает пакет с Arduino №1 
    
    //Если пришла цифра 1 включаем светодиод
    /*if (data[0] == '1') digitalWrite(led, HIGH);
    if (data[0] == '2') digitalWrite(led, LOW);
    if (data[0] == '3') digitalWrite(led1, HIGH);
    if (data[0] == '4')  digitalWrite(led1, LOW);
    if (data[0] == '5') digitalWrite(led, HIGH), delay(1000),digitalWrite(led, LOW);
*/

if (data[0] < 60 && data[0] > 40) {//Вперёд
  digitalWrite(EN1, HIGH);
  digitalWrite(D2, HIGH);
  analogWrite(M2, 0);
  digitalWrite(EN2, HIGH);
  digitalWrite(D1, LOW);
  analogWrite(M1, 255);
}

////////////////////////////////
if (data[0] < -40) && data[0] > -60) {//НАЗАД
digitalWrite(EN1, HIGH);
  digitalWrite(D2, LOW);
  analogWrite(M2, 255);
  digitalWrite(EN2, HIGH);
  digitalWrite(D1, HIGH);
  analogWrite(M1, 0);
}

else
{
  digitalWrite(EN1, LOW);
  digitalWrite(EN2, LOW);
}

    radio.stopListening();
    radio.write(&data, 32); // и отправляет обратно в Arduino №1 
    radio.startListening();
  }
}

 

 

Tarantul_acc
Tarantul_acc аватар
Offline
Зарегистрирован: 09.03.2013

Вот такой код, нужно "у" как-то получить от передатчика, у меня ничего не получилось.

MaksMS
Offline
Зарегистрирован: 11.03.2013

 

char data[32] = "";
 byte i = 0;
 data[i] = x; 
 i++;
 data[i] = y;

 i++;

data[i] = z;

-по идее должно работать ..

Можно уменьшить массив до 3 байт,вместо 32

ну хотя лишние переменные можно убрать:

 

 

char data[32] = "";

 data[0] = x; 
 
 data[1] = y;

data[2] = z;

Tarantul_acc
Tarantul_acc аватар
Offline
Зарегистрирован: 09.03.2013

Супер! Огромное спасибо! Всё как нужно.