nRF24L01, ардуино и проблемы

Freimor
Offline
Зарегистрирован: 18.11.2018

Добрый день Решил собрать робота с передачей данных по nRF24L01.

 

Трансмиттер данные шлёт, шумов на канале быть не должно, конденсаторы по питанию припаял

При включении самого робота сразу начинает двигать сервами, хотя передатчик ещё не включён.

Не программист а олух несчастный, помогите(

Вот код трансмиттера

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

RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно
byte address[][6] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
byte data[3]; // массив, хранящий передаваемые данные
byte last_data[3]; // массив, хранящий последние переданные данные
boolean flag; // флажок отправки данных

int button = 8;  // кнопка на 3 цифровом
int y = A0; // потенциометр на 0 аналоговом
int x = A1; // движковый потенциометр на 1 аналоговом пине

void setup() {
  Serial.begin(9600); //открываем порт для связи с ПК

  pinMode(button, INPUT);
  pinMode(x, INPUT);
  pinMode(y, INPUT);

  radio.begin(); //активировать модуль
  
  delay(2000);
  
  radio.setAutoAck(1);         //режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(0, 15);    //(время между попыткой достучаться, число попыток)
  radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигнал
  radio.setPayloadSize(32);     //размер пакета, в байтах

  radio.openWritingPipe(address[0]);   //мы - труба 0, открываем канал для передачи данных
  radio.setChannel(0x7f);  //выбираем канал (в котором нет шумов!)

  radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  //должна быть одинакова на приёмнике и передатчике!
  //при самой низкой скорости имеем самую высокую чувствительность и дальность!!

  radio.powerUp(); //начать работу
  radio.stopListening();  //не слушаем радиоэфир, мы передатчик
}

void loop() {
  
  data[0] = !digitalRead(button); // инвертированный (!) сигнал с кнопки
  data[1] = map(analogRead(x), 0, 1023, 0, 180);
  data[2] = map(analogRead(y), 0, 1023, 0, 180);

  for (int i = 0; i < 3; i++) { // в цикле от 0 до числа каналов
    if (data[i] != last_data[i]) { // если есть изменения в transmit_data
      flag = 1; // поднять флаг отправки по радио
      last_data[i] = data[i]; // запомнить последнее изменение
    }
  }

  if (flag == 1) {
    radio.powerUp(); // включить передатчик
    radio.write(&data, sizeof(data)); // отправить по радио
    flag = 0; //опустить флаг
    radio.powerDown(); // выключить передатчик
  }
}

Вот ресивера

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <Servo.h>

RF24 radio(9, 10);
byte address[][6] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
byte data[3];

//Servo's
Servo LeftServo;
Servo RightServo;
int leftServoPin = 8;
int rightServoPin = 7;

// LED's
int ledRedBack = 4; // LED Red (back)
int ledGabLeft = 5;  // LED gabarity (left)
int ledGabRight = 6;  // LED gabatity (right)

//for blynk
const long interval = 1000;
unsigned long previousMillis = 0;
int ledState = LOW;

void setup() {

  pinMode(ledRedBack, OUTPUT); 
  pinMode(ledGabLeft, OUTPUT);
  pinMode(ledGabRight, OUTPUT);

  LeftServo.attach(leftServoPin); 
  RightServo.attach(rightServoPin);
  
  Serial.begin(9600);

  radio.begin(); //активировать модуль
  
  delay(2000);
  
  radio.setAutoAck(1);         //режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(0, 15);    //(время между попыткой достучаться, число попыток)
  radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигнал
  radio.setPayloadSize(32);//размер пакета, в байтах
  
  radio.openReadingPipe(1, address[0]);     //хотим слушать трубу 0
  radio.setChannel(0x7f);  //выбираем канал (в котором нет шумов!)
  
  radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  radio.powerUp(); //начать работу
  radio.startListening();
 }

void blinkLed(int ledPin)
{
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }

    // set the LED with the ledState of the variable:
    digitalWrite(ledPin, ledState);
  }
}

int getData(int slot)
{
  byte pipeNo;
  int elem;
  
  radio.available(&pipeNo);  // слушаем эфир со всех труб
  radio.read( &data, sizeof(data) );         // чиатем входящий сигнал
  elem = data[slot];
  return ( elem );
}

void movement(int x, int y)
{
  if(x < 90){
    RightServo.write(y - (90 - x));
    LeftServo.write(180 - y);
    blinkLed(ledGabRight);
  }
  if(x > 90){
    RightServo.write(y);
    LeftServo.write(180 - (y - (x - 90)));
    blinkLed(ledGabLeft);
  } 
  else 
  {
    if (y < 90){
      RightServo.write(y);
      LeftServo.write(180 - y);
      digitalWrite(ledRedBack, HIGH);
    }
    if (y > 90){
      RightServo.write(y);
      LeftServo.write(180 - y);
      digitalWrite(ledRedBack, LOW);
    }
  }
}

void loop() {
  movement(getData(1), getData(2));
}

 

Freimor
Offline
Зарегистрирован: 18.11.2018
IVAN222
Offline
Зарегистрирован: 19.04.2017

 nRF24L01 здесь не причем. При включении приемника у Вас начинают двигатся сервы, При включении приемника, первоночально чему равны Х и У ? Посмотрите внимательно со строки 86