Управление двумя сервами через nRF24L01+

Женя7777777
Offline
Зарегистрирован: 22.01.2017
Всем привет! 
Задача - управлять двумя сервами, через nRF24L01+ посредствам двух потенциометров.
Спаял всё правельно, протестировал проверочным скетчем, передатчик цифры отправляет, приёмник принемает без ошибок, всё хорошо. А с сервами работать не хочет( Подскажите пожалуйста, где ошибка..

Передатчик:
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

RF24 radio(9, 10); // 


byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб


byte potent0 = 0; // потенциометр на 0 аналоговом
byte potent1 = 1; // 

byte transmit_data[2]; // массив, хранящий передаваемые данные
byte latest_data[2]; // массив, хранящий последние переданные данные
boolean flag; // флажок отправки данных

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


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

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

  radio.setPALevel (RF24_PA_LOW); //уровень мощности передатчика. На выбор 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() {

    transmit_data[1] = map(analogRead(potent1), 0, 1023, 0, 180); // получить значение
  // в диапазоне 0..1023, перевести в 0..180, и записать на 1 место в массиве
    transmit_data[0] = map(analogRead(potent0), 0, 1023, 0, 180);

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

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

}

Приёмник:



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

RF24 radio(9, 10); // 


byte recieved_data[2]; // массив принятых данных

byte servo = 3; // сервопривод на 3 цифровом
byte servo2 = 5; // 

Servo myservo;

byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб

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

  
  

  myservo.attach(servo);
  myservo.attach(servo2);

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

  radio.openReadingPipe(1, address[0]);     //хотим слушать трубу 0
  radio.setChannel(0x5f);  //выбираем канал (в котором нет шумов!)

  radio.setPALevel (RF24_PA_LOW); //уровень мощности передатчика. На выбор 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 loop() {
  byte pipeNo;
  while ( radio.available(&pipeNo)) {  // слушаем эфир со всех труб
    radio.read( &recieved_data, sizeof(recieved_data) );         // чиатем входящий сигнал

    //то бишь 0 или 1
    myservo.write(recieved_data[1]); // повернуть серво на угол 0..180
    // значение получено с 1 элемента массива
    myservo.write(recieved_data[2]); // подать на мосфет ШИМ сигнал
    // в соответствии с принятыми данными со 2 места массива, диапазон 0...180
  }
}

 

 

CheBuraw
Offline
Зарегистрирован: 10.02.2015

Женя7777777, решили проблему? Я предполагаю что у вас не передаются данные потому что в коде передатчика 12 и 13 строки ардуина понимает как цифровые входы.

byte potent0 = 0; // потенциометр на 0 аналоговом
byte potent1 = 1; //

Замените их на следующие:

#define potent0 A0 // потенциометр на 0 аналоговом
#define potent1 A1 // потенциометр на 1 аналоговом

Думаю что должно заработать.  Я не спец в програмировании может там еще что в коде не так, но это первое что бросилось мне в глаза.