Проблемная работа сервопривода с NRF24L01

Тема в разделе "Проводная и беспроводная связь", создана пользователем JulVern, 23 мар 2018.

  1. JulVern

    JulVern Нуб

    Добрый день, уважаемые ардуинщики. Осваиваю передачу данных по радиомодулю между двумя ардуино. Столкнулся с проблемой, над решением которой бьюсь уже не одну неделю.

    Коротко по железу. Радиомодули подключены к адаптерам. Передающим устройством является NANO, принимающее UNO. К UNO подключен Мотор Шилд, к которому подключен один сервопривод. Управлени серво от джойстика(хотя и пробовал и потенциометр и кнопку). Питание на серво отдельное от 9v через понижающий модуль до 5 V (пробовал и через конденсаторы) Задача просто управлять сервой.

    Суть проблемы в следующем. После загрузки скетчей, происходит вибрация сервопривода в такт пульсации светодиода на принимающей плате (RX). На команды джойстика сервопривод отвечает, если только есть delay в loop приемника. Причем заметил, что если ставить delay ниже 500, то серва виснет и не работает,В serial все ок показывает, данные по работе джойстика идут.



    При подключении моторчиков к мотор шилд такой проблемы нет, все работает.

    Тестировал и кнопку,и джойстик,и потенциометр на одной только UNOбез модуля NRL24L01. Все работает идеально. Серво не пульсирует, не дергается. Сломал голову над догадками, подскажите пожалуйста где копать.

    Код прилагаю. ( реакция серво одна и та же при любых вариациях кода, привожу этот в качестве примера того что он рабочий по сути) Помогите советом пожалуйста. Где искать проблему?

    Код (C++):
    #include <Servo.h>

    #include <SPI.h>

    #include "RF24.h"
    #include <AFMotor.h>
    Servo myservo; //даём имена servo
    RF24 radio(9,10);

    const uint64_t pipe = 0xE8E8F0F0E1LL; // адрес канала

    int msg[1]; //переменная для приёма радио сигнала

    int data; //переменная для servo

    int pos;
    void setup()

    {
    Serial.begin(9600);

    myservo.attach(10);



    radio.begin();

    radio.openReadingPipe(1,pipe); // Открываем один из 6-ти каналов приема

    radio.startListening(); // Начинаем слушать эфир
    }
    void loop() {

    if (radio.available())radio.read(msg, 1);

    if (msg[0] <128 && msg[0] >-1)data = msg[0], pos = map(data, 0, 127, 7, 177),myservo.write(pos);


    if (msg[0] >127 && msg[0] <255)data = msg[0], pos = map(data, 128, 254, 9, 177),myservo.write(pos);


    Serial.println(pos);
    delay (500);
    }

    #include <SPI.h>
    #include "RF24.h" // Подключаем скачанную библиотеку RF24.
    RF24 radio(9,10);
    const uint64_t pipe = 0xE8E8F0F0E1LL; // адрес канала передачи
    int msg[1]; //переменная для отправки радио сигнала
    int potpin_1 = A1; // potentiometer

    int val_1;

    int potpin_2 = A2; // potentiometer 2


    int val_2;
    void setup(void){
    pinMode(potpin_1, INPUT);
    pinMode(potpin_2, INPUT);
    radio.begin();

    radio.openWritingPipe(pipe); // Открываем канал передачи

    }

    void loop() {

    val_1 = analogRead(potpin_1),val_1 = map(val_1, 0, 1023, 0, 127),msg[0] = val_1,radio.write(msg, 1);

    val_2 = analogRead(potpin_2),val_2 = map(val_2, 0, 1023, 128, 255),msg[0] = val_2,radio.write(msg, 1);
    delay (500);
    }
     
    Последнее редактирование: 23 мар 2018
  2. ВАлерий99

    ВАлерий99 Нерд

    делаю управление к беспилотнику
    Вашу проблему решить не могу.Но делюсь опытом интуитивно где-то по теме.
    У меня возникала проблема синхронизации двух программ -передатчика и приёмника.
    Я в общем то сразу представлял такую проблему и отказался от класса "SERVO" ибо никто не знает что там внутри по времени и что там делает таймер. Сделал специально простенькую программу на 2 мсек за это время она управляет четырмя сервами
    Второе. delay тоже не простая штучка, там она вообще стопорит программу.
    Короч, принцип у меня такой.
    Исходим из того, что по сервам длинна проги управляемого обьекта должна быть гдет 20 мсек.
    Поэтому длина программы передатчика команд(земли) сделана короче.И при этом впереди второй программы стоит циклическое ожидание с периодом 1 мсек(милисек) длинной 30мсек.
    Получается передатчик -типа ведомый.
    Общая картина- борт(управляемый объект) передаёт телеметрию на землю.
    До этого цикл программы "земли состоит из 30 мс ожидания и 15 мс собствено проги После нескольких циклов отправки сигнала с борта он обязательно попадёт в период ожидания земли. А выход из этого ожидания происходит по инеблу NRF(вышел и пошёл в основную прогу в которой собственнно формируются и передаются команды).
    В конце концов проги синхронизируются и становятся одинаковой длинны. Только прога земли начинается с нескольких циклов милисекунд ожидания.
     
  3. Arduino_man

    Arduino_man Гик

    Код должен выглядеть вот так:
    Код (C++):
    #include <Servo.h>

    #include <SPI.h>

    #include "RF24.h"
    #include <AFMotor.h>
    Servo myservo; //даём имена servo
    RF24 radio(9,10);

    const uint64_t pipe = 0xE8E8F0F0E1LL; // адрес канала

    int msg[1]; //переменная для приёма радио сигнала

    int data; //переменная для servo

    int pos;
    void setup()

    {
    Serial.begin(9600);

    myservo.attach(10);



    radio.begin();

    radio.openReadingPipe(1,pipe); // Открываем один из 6-ти каналов приема

    radio.startListening(); // Начинаем слушать эфир
    }
    void loop() {

    if (radio.available())radio.read(msg, 1);

    if (msg[0] <128 && msg[0] >-1)data = msg[0], pos = map(data, 0, 127, 7, 177),myservo.write(pos);


    if (msg[0] >127 && msg[0] <255)data = msg[0], pos = map(data, 128, 254, 9, 177),myservo.write(pos);


    Serial.println(pos);
    delay (500);
    }

    #include <SPI.h>
    #include "RF24.h" // Подключаем скачанную библиотеку RF24.
    RF24 radio(9,10);
    const uint64_t pipe = 0xE8E8F0F0E1LL; // адрес канала передачи
    int msg[1]; //переменная для отправки радио сигнала
    int potpin_1 = A1; // potentiometer

    int val_1;

    int potpin_2 = A2; // potentiometer 2

    int val_2;

    void setup(void){
    pinMode(potpin_1, INPUT);
    pinMode(potpin_2, INPUT);
    radio.begin();

    radio.openWritingPipe(pipe); // Открываем канал передачи

    }

    void loop() {

    val_1 = analogRead(potpin_1),val_1 = map(val_1, 0, 1023, 0, 127),msg[0] = val_1,radio.write(msg, 1);

    val_2 = analogRead(potpin_2),val_2 = map(val_2, 0, 1023, 128, 255),msg[0] = val_2,radio.write(msg, 1);

    }
     
  4. b707

    b707 Гуру

    Arduino_man, Julvem - ребята. вы в своем коде ничего не замечаете? В обоих ваших скетчах радио RF24 и серва подключены к одному и тому же пину! Конечно, они работать не будут...