РУ nrf24l01

Тема в разделе "Флудилка", создана пользователем shef882, 10 май 2017.

  1. shef882

    shef882 Нерд

    ребят не подскажете в чем проблема? собрал передатчик и приемник с потенциометрами и серво, 3 серво работают , а 4 не хочет, добавляю в скетч передатчика потенциометр ponent3 к нему на приемнике servo3, пишу канал для них transmit_data 3, что не так не пойму, вот скетч передатчика:

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

    RF24 radio(9,53);

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


    byte potent = 0; // потенциометр на 0 аналоговом
    byte potent1 = 1;
    byte potent2 = 2;
    byte potent3 = 3;


    byte transmit_data[4]; // массив, хранящий передаваемые данные
    byte latest_data[4]; // массив, хранящий последние переданные данные
    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(0x60); //выбираем канал (в котором нет шумов!)

    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() {


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

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

    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,53); // "создать" модуль на пинах 9 и 10 Для Уно
    //RF24 radio(9,53); // для Меги

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

    byte servo = 3; // сервопривод на 3 цифровом
    byte servo1 = 8;
    byte servo2 = 11;
    byte servo3 = 2;


    Servo myservo;
    Servo myservo1;
    Servo myservo2;
    Servo myservo3;


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

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


    myservo.attach(3);
    myservo1.attach(8);
    myservo2.attach(11);
    myservo3.attach(2);

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

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

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

    myservo.write(recieved_data[0]);
    myservo1.write(recieved_data[1]);
    myservo2.write(recieved_data[2]);
    myservo3.write(recieved_data[3]);

    }
    }

     
  2. serg_admin

    serg_admin Гик

    На мой взгляд странно, что работает. Имя массива без индекса есть указатель, а вы на него ссылку передаете и принимаете. Получается указатель на указатель. Если открыть пример из библиотеки RF24 - видим:
    Код (C++):
    uint8_t button_states[num_button_pins];
    uint8_t led_states[num_led_pins];
    Код (C++):
    bool ok = radio.write( button_states, num_button_pins );
    Как видно массив передается без &.

    То, что работает три сервы - повезло с разметкой памяти.
     
  3. serg_admin

    serg_admin Гик

    Еще вопрос. Из каких соображение вопрос задали во "флудилке"?
     
  4. NikitOS

    NikitOS Король шутов Администратор

    Что-то скетчи больно напоминают с канала AlexGyver или Заметки Ардуинщика
     
  5. shef882

    shef882 Нерд

    Так и есть , хотел добавить ещё 4 серво