Пожалуйста, помогите переделать скетч.

Тема в разделе "Arduino & Shields", создана пользователем Женя., 9 июл 2017.

  1. vvr

    vvr Инженерище

    это называется джиттер сервы, можете в гугле почитать)))
    в сетапе серву не подключаете
    в лупе когда приходит команда на движение
    myservo.attach(servo);
    myservo.write(recieved_data[1]);

    после окончания движения когда серва примет нужное положение
    myservo.detach();
     
    Женя. нравится это.
  2. Женя.

    Женя. Нуб

    Пробовал по разному, Как Вы говорите :
    myservo.attach(servo);
    myservo.write(recieved_data[1]);
    Так не получается, сигнал уходит раньше, когда серва ещё не подключена. А если в самом начале луп подключить, то серва работает, но дергается ещё больше.
    Код (C++):
    #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 myservo1;
    Servo myservo2;
    byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб
    void setup() {
    Serial.begin(9600); //открываем порт для связи с ПК
    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_1MBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
      //должна быть одинакова на приёмнике и передатчике!
      //при самой низкой скорости имеем самую высокую чувствительность и дальность!!
    radio.powerUp(); //начать работу
    radio.startListening();  //начинаем слушать эфир, мы приёмный модуль
    }
    void loop() {
      myservo1.attach(servo);
    myservo2.attach(servo2);
    byte pipeNo;
    while ( radio.available(&pipeNo)) {  // слушаем эфир со всех труб
    radio.read( &recieved_data, sizeof(recieved_data) );         // чиатем входящий сигнал
      //то бишь 0 или 1
    myservo1.write(recieved_data[1]); // повернуть серво на угол 0..180
      // значение получено с 1 элемента массива
    myservo2.write(recieved_data[0]); // подать на мосфет ШИМ сигнал
    // в соответствии с принятыми данными со 2 места массива, диапазон 0...180
    myservo1.detach();
    myservo2.detach();
      }
    }
     
  3. vvr

    vvr Инженерище

    приёмник слушает эфир.
    когда приходит новое значение recieved_data[1] вы подключаете серву
    myservo.attach(servo);
    и даёте команду на движение
    myservo.write(recieved_data[1]);
    когда серва закончит движение отключаете её

    нужно ещё завести отдельную переменную, например position, для отслеживания положения сервы
     
    Женя. нравится это.
  4. Женя.

    Женя. Нуб

    А как это прописать?
     
  5. vvr

    vvr Инженерище

    загрузите в приёмник
    Код (C++):
    #include <EEPROM.h>
    byte a = 90;
    byte b = 90;

    void setup()
    {
      EEPROM.write(0, a);
      EEPROM.write(1, b);
    }

    void loop()
    {
    }
     
    потом

    Код (C++):
    #include <SPI.h>
    #include "nRF24L01.h"
    #include "RF24.h"
    #include <Servo.h>
    #include <EEPROM.h>

    RF24 radio(9, 10); //
    byte recieved_data[2]; // массив принятых данных
    byte servo1 = 3; // сервопривод на 3 цифровом
    byte servo2 = 5; //
    Servo myservo1;
    Servo myservo2;
    byte address[][6] = {
      "1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб

    byte pos_1;
    byte pos_2;

    unsigned long Time_1 = 0;
    unsigned long Time_2 = 0;

    void setup() {
      Serial.begin(9600); //открываем порт для связи с ПК
      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_1MBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
      //должна быть одинакова на приёмнике и передатчике!
      //при самой низкой скорости имеем самую высокую чувствительность и дальность!!
      radio.powerUp(); //начать работу
      radio.startListening();  //начинаем слушать эфир, мы приёмный модуль

      myservo1.detach();
      myservo2.detach();

      pos_1 = EEPROM.read(0);
      pos_2 = EEPROM.read(0);
    }

    void loop()
    {
      byte pipeNo;
      if( radio.available(&pipeNo))
      {
        radio.read( &recieved_data, sizeof(recieved_data) );
       
        ////////////// 1 серва ////////////

        if(pos_1 < recieved_data[1])
        {
          myservo1.attach(servo1);
          if (millis() - Time_1 > 70)    ////  скорость перевода сервы. чем больше - тем медленнее
          {
            pos_1 ++;
            Time_1 = millis();
            myservo1.write(pos_1);
          }
          if(pos_1 >= recieved_data[1])
          {
            myservo1.detach();
            EEPROM.write(0, recieved_data[1]);
          }
        }

        if(pos_1 > recieved_data[1])
        {
          myservo1.attach(servo1);
          if (millis() - Time_1 > 70)    ////  скорость перевода сервы. чем больше - тем медленнее
          {
            pos_1 --;
            Time_1 = millis();
            myservo1.write(pos_1);
          }
          if(pos_1 <= recieved_data[1])
          {
            myservo1.detach();
            EEPROM.write(0, recieved_data[1]);
          }
        }

        ////////////// 2 серва ////////////

        if(pos_2 < recieved_data[0])
        {
          myservo2.attach(servo2);
          if (millis() - Time_2 > 70)    ////  скорость перевода сервы. чем больше - тем медленнее
          {
            pos_2 ++;
            Time_2 = millis();
            myservo2.write(pos_2);
          }
          if(pos_2 >= recieved_data[0])
          {
            myservo2.detach();
            EEPROM.write(1, recieved_data[0]);
          }
        }

        if(pos_2 > recieved_data[0])
        {
          myservo2.attach(servo2);
          if (millis() - Time_2 > 70)    ////  скорость перевода сервы. чем больше - тем медленнее
          {
            pos_2 --;
            Time_2 = millis();
            myservo2.write(pos_2);
          }
          if(pos_2 <= recieved_data[0])
          {
            myservo2.detach();
            EEPROM.write(1, recieved_data[0]);
          }
        }
      }
    }



     
     
    Женя. нравится это.
  6. Женя.

    Женя. Нуб

    А Разве первый скетч не затрётся вторым?
    Сделал как вы написали, но всё равно гудят, и ход более дёрганый стал..
     
  7. vvr

    vvr Инженерище

    В сетапе не прописал установку серв
    Код (C++):
    #include <SPI.h>
    #include "nRF24L01.h"
    #include "RF24.h"
    #include <Servo.h>
    #include <EEPROM.h>

    RF24 radio(9, 10); //
    byte recieved_data[2]; // массив принятых данных
    byte servo1 = 3; // сервопривод на 3 цифровом
    byte servo2 = 5; //
    Servo myservo1;
    Servo myservo2;
    byte address[][6] = {
      "1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб

    byte pos_1;
    byte pos_2;

    unsigned long Time_1 = 0;
    unsigned long Time_2 = 0;

    void setup() {
      Serial.begin(9600); //открываем порт для связи с ПК
      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_1MBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
      //должна быть одинакова на приёмнике и передатчике!
      //при самой низкой скорости имеем самую высокую чувствительность и дальность!!
      radio.powerUp(); //начать работу
      radio.startListening();  //начинаем слушать эфир, мы приёмный модуль
     
      pos_1 = EEPROM.read(0);
      pos_2 = EEPROM.read(0);
     
      myservo1.attach(servo1);
      myservo2.attach(servo2);
     
      myservo1.write(pos_1);
      myservo2.write(pos_2);
     
      delay(1000);

      myservo1.detach();
      myservo2.detach();
    }

    void loop()
    {
      byte pipeNo;
      if( radio.available(&pipeNo))
      {
        radio.read( &recieved_data, sizeof(recieved_data) );
     
        ////////////// 1 серва ////////////

        if(pos_1 < recieved_data[1])
        {
          myservo1.attach(servo1);
          if (millis() - Time_1 > 70)    ////  скорость перевода сервы. чем больше - тем медленнее
          {
            pos_1 ++;
            Time_1 = millis();
            myservo1.write(pos_1);
          }
          if(pos_1 >= recieved_data[1])
          {
            myservo1.detach();
            EEPROM.write(0, recieved_data[1]);
          }
        }

        if(pos_1 > recieved_data[1])
        {
          myservo1.attach(servo1);
          if (millis() - Time_1 > 70)    ////  скорость перевода сервы. чем больше - тем медленнее
          {
            pos_1 --;
            Time_1 = millis();
            myservo1.write(pos_1);
          }
          if(pos_1 <= recieved_data[1])
          {
            myservo1.detach();
            EEPROM.write(0, recieved_data[1]);
          }
        }

        ////////////// 2 серва ////////////

        if(pos_2 < recieved_data[0])
        {
          myservo2.attach(servo2);
          if (millis() - Time_2 > 70)    ////  скорость перевода сервы. чем больше - тем медленнее
          {
            pos_2 ++;
            Time_2 = millis();
            myservo2.write(pos_2);
          }
          if(pos_2 >= recieved_data[0])
          {
            myservo2.detach();
            EEPROM.write(1, recieved_data[0]);
          }
        }

        if(pos_2 > recieved_data[0])
        {
          myservo2.attach(servo2);
          if (millis() - Time_2 > 70)    ////  скорость перевода сервы. чем больше - тем медленнее
          {
            pos_2 --;
            Time_2 = millis();
            myservo2.write(pos_2);
          }
          if(pos_2 <= recieved_data[0])
          {
            myservo2.detach();
            EEPROM.write(1, recieved_data[0]);
          }
        }
      }
    }
     
     
  8. Женя.

    Женя. Нуб

    Чёт разницы нет, так же гудит и дёргается..
     
  9. vvr

    vvr Инженерище

    ну тогда больше ничем помочь не смогу.
    я по такому принципу объективы кручу
     
    Женя. нравится это.
  10. Женя.

    Женя. Нуб

    Ясно, спасибо.
     
  11. vvr

    vvr Инженерище

    для сервы обязательно нужно обеспечить правильное отдельное питание (по току)
     
  12. Женя.

    Женя. Нуб

    Я сервы с вывода ардуино 5 вольт запитал. Но дело в том, что они жужат когда уже перестают крутится, значит ток тут не причём, скорее это сами сервы дешёвые, поэтому не очень качественные. Я всё таки думаю делать на шаговых двигателях с редуктором, потому что поворот в один градус на дальнем расстоянии (зум камеры) это очень не точно. Но тут другая проблема, все такие моторы с алиэкспресс идут без шкива на который можно было бы надёжно прикрепить мотор + на него ещё камеру. Может купить готовый:
    https://ru.aliexpress.com/item/YT-5...a9d1b87c02bc701-1500115357298-09651-uR7uBY3Rz
    Как Вы думаете?
     
  13. vvr

    vvr Инженерище

    если не накладно купите и не парьтесь
     
    Женя. нравится это.
  14. qwone

    qwone Гик

    Ну разумеется. Вы можете подключить серву, подать команду поставить на определеный угол и ...(внимание) рукой повернуть из этого угла. И о чудо, серва начинает жужать. Так что если серва жужит, то мощность моторчика и редукторов (особенно если они пластмассовые) маловато будет.
     
    Женя. нравится это.