NRF24L01
- Войдите на сайт для отправки комментариев
Пт, 15/11/2013 - 21:43
Здравствуйте!
Имеется акселерометр и 2 NRF24L01, передаю значение x и в ответ получаю действие, а как сразу передовать x и y, так чтобы потом можно было выполнять сравнение пришедшего числа и выполнять действие (мигать светодиодом)?
1.Ну наверно передать одновременно оба значения... через typedef например..
2.сохранить значение в переменной и сравнить его с при следущем чтении данных
1. Вот я и не знаю как это сделать =(
2.Работает нормально.
Передатчик:
#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(); } }Вот такой код, нужно "у" как-то получить от передатчика, у меня ничего не получилось.
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;
Супер! Огромное спасибо! Всё как нужно.