Новичек о дистанционном управлении

Тема в разделе "Arduino & Shields", создана пользователем Evgen87, 6 авг 2013.

  1. Evgen87

    Evgen87 Нуб

    Всем привет! Подскажите пожалуйста можно ли реализовать дистанционное управление моделью не используя блютуз и wi-fi шилдов, и что для этого потребуется. Речь идет именно о радиоуправлении т.е. управление с пульта от телевизора не подходит.За ранее спасибо
     
  2. id90

    id90 Нерд

    конечно можно, можно и простой пульт дистанционного управления переделать, если хочется обычной машинкой то пульт переделываешь машинка остается без изменений. Тут зависит какая машинка тебе попадется в качестве донора.
    иль все делаешь используя радиоканал шифруешь и дешифруешь данные ардуинами с обои сторон.
    можно приемник и передатчик сделать самому.
    Если бюджет позволяет можно купить комплекты радиоуправления, мне кажется этот вариант более предпочтительным в виду несложности его реализации и совместимости с управляемыми машинками для взрослых дядь:D.

    ардуино это конечно конструктор но его можно и как просто микропроцессор использовать.
     
  3. Evgen87

    Evgen87 Нуб

    Т.е. я могу использовать комплект радиомодулей 433МГц ,но для этого мне нужно 2 ардуины??
     
  4. id90

    id90 Нерд

    можно ссылку на модули? я думаю да можно и клоны ардуины они дешевле
     
    Evgen87 нравится это.
  5. Megakoteyka

    Megakoteyka Оракул Модератор

    Именно так. А модули на 433МГц в использовании чуть ли не проще всего. Есть хорошая статья про них.
    И вот еще.
     
    zsm, id90 и Evgen87 нравится это.
  6. Evgen87

    Evgen87 Нуб

    Спасибо Вам за ваш ответ.Но так как я полный нуб (пока) в этом деле то вопросов появилось еще больше.И я буду признателен Вам если Вы ответите еще на парочку.А именно каким образом наладить связь между передатчиком и приемником с помощью ардуино и с помощью каких библеотек или комманд это сделать.Заранее спасибо.
     
  7. zsm

    zsm Гик

    Вот здесь есть примеры передачи данных с помощью простейших модулей 433Mhz. Сейчас тоже пытаюсь радиоуправление замутить) с помощью примера удалось сервой покрутить на расстоянии.
     
    Evgen87 нравится это.
  8. Evgen87

    Evgen87 Нуб

    Спасибо за ответ.Если можно выложите свой скетч для сервы.
     
  9. zsm

    zsm Гик

    этот код очень сырой , серва рывками двигается.
    сейчас как раз ломаю голову как его улучшить)
    нужно решить проблему с рывками и добавить многоканальность.
    имейте в виду что в приемнике для управления сервой используется библиотека ServoTimer2 т.к.
    библиотека VirtualWire имеет конфликт со стандартной серво библиотекой т.к. они используют один и тот же таймер.
    модули такие использовались



    передатчик
    Код (C):
    #include <VirtualWire.h>
    #include <EasyTransferVirtualWire.h>
    #include <EEPROM.h> // эта библиотека нужна для работы с энерго-независимой памятью
    #define PIN_POT 0 // Potentiometer (Analog)

    int potIn=0 ;
    int servo=0 ;
    const int led_pin = 13;
    const int transmit_pin = 2;
    unsigned int unique_device_id = 0;
    unsigned int count = 1;

    //create object
    EasyTransferVirtualWire ET;

    struct SEND_DATA_STRUCTURE{
      //наша структура данны. она должна быть определена одинаково на приёмнике и передатчике
      //кроме того, размер структуры не должен превышать 26 байт (ограничение VirtualWire)
      unsigned int device_id;
      unsigned int destination_id; 
      unsigned int packet_id;
      byte command;
      int data;
    };

    //переменная с данными нашей структуры
    SEND_DATA_STRUCTURE mydata;

    //ниже пару функций для записи данных типа unsigned int в EEPROM
    void EEPROMWriteInt(int p_address, unsigned int p_value)
          {
          byte lowByte = ((p_value >> 0) & 0xFF);
          byte highByte = ((p_value >> 8) & 0xFF);

          EEPROM.write(p_address, lowByte);
          EEPROM.write(p_address + 1, highByte);
          }

    unsigned int EEPROMReadInt(int p_address)
          {
          byte lowByte = EEPROM.read(p_address);
          byte highByte = EEPROM.read(p_address + 1);

          return ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00);
          }

    void setup()
    {
      // блок инициализации
      pinMode(led_pin, OUTPUT);

      ET.begin(details(mydata));
      vw_set_tx_pin(transmit_pin); //установка пина, к которому подключен data-вход передатчика
      vw_setup(3000);       //скорость передачи
      Serial.begin(9600);
      randomSeed(analogRead(0));


      // Читаем/записываем Device ID
      Serial.print("Getting Device ID... ");
      unique_device_id=EEPROMReadInt(0);
      if (unique_device_id<10000 || unique_device_id>60000) {
       Serial.print("N/A, updating... ");
       unique_device_id=random(10000, 60000);
       EEPROMWriteInt(0, unique_device_id);
      }
      Serial.println(unique_device_id);
     
     

    }

    void loop()
    {
     
     
      potIn = analogRead(PIN_POT);
      servo = map(potIn, 200, 800, 890, 1900);
     
     
      mydata.device_id = unique_device_id;
      mydata.destination_id = 0;
      mydata.packet_id = random(65535);
      mydata.command = 0;
      mydata.data = servo;

      digitalWrite(led_pin, HIGH); // включаем светодиод для отображения процесса передачи
      Serial.print("Transmitting packet ");  
      Serial.print(mydata.packet_id);
      Serial.print(" device id ");  
      Serial.print(mydata.device_id);  
      Serial.print(" data: ");
      Serial.print(mydata.data);
      Serial.print(" ... ");
      ET.sendData(); // отправка данных

      digitalWrite(led_pin, LOW);
      Serial.println("DONE");
      delay(10);
     
    }



    приемник


    Код (C):
    #include <ServoTimer2.h>
    #include <VirtualWire.h>
    #include <EasyTransferVirtualWire.h>
    #include <EEPROM.h>
    ServoTimer2 motor;
    #define PIN_MOTOR 8 // Motor ESC (Digital)

    const int led_pin = 13;
    const int receive_pin = 2;
    unsigned int unique_device_id = 0;

    //create object
    EasyTransferVirtualWire ET;
    char buf[120];

    struct SEND_DATA_STRUCTURE{
      //наша структура данны. она должна быть определена одинаково на приёмнике и передатчике
      //кроме того, размер структуры не должен превышать 26 байт (ограничение VirtualWire)
      unsigned int device_id;
      unsigned int destination_id;  
      unsigned int packet_id;
      byte command;
      int data;
    };

    //переменная с данными нашей структуры
    SEND_DATA_STRUCTURE mydata;

    //ниже пару функций для записи данных типа unsigned int в EEPROM
    void EEPROMWriteInt(int p_address, unsigned int p_value)
          {
          byte lowByte = ((p_value >> 0) & 0xFF);
          byte highByte = ((p_value >> 8) & 0xFF);

          EEPROM.write(p_address, lowByte);
          EEPROM.write(p_address + 1, highByte);
          }

    unsigned int EEPROMReadInt(int p_address)
          {
          byte lowByte = EEPROM.read(p_address);
          byte highByte = EEPROM.read(p_address + 1);

          return ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00);
          }

    void setup()
    {
        motor.attach(PIN_MOTOR);
        motor.write(0);
        pinMode(led_pin, OUTPUT);
        Serial.begin(9600); // Debugging only

        ET.begin(details(mydata));
        // Initialise the IO and ISR
        vw_set_rx_pin(receive_pin);
        vw_setup(3000);   // Скорость приёма
        vw_rx_start();     // Запуск режима приёма
       
      // Device ID
      Serial.print("Getting Device ID... ");
      unique_device_id=EEPROMReadInt(0);
      if (unique_device_id<10000 || unique_device_id>60000) {
       Serial.print("N/A, updating... ");
       unique_device_id=random(10000, 60000);
       EEPROMWriteInt(0, unique_device_id);
      }
      Serial.println(unique_device_id);
     
    }

    void loop()
    {
        if(ET.receiveData()) // получили пакет данных, обрабатываем
        {
            digitalWrite(led_pin, HIGH);
            Serial.print("Got: ");
            Serial.print("Device ID: ");
            Serial.print(mydata.device_id);
            Serial.print(" Destination ID: ");
            Serial.print(mydata.destination_id);       
            Serial.print(" Packet ID: ");
            Serial.print(mydata.packet_id);
            Serial.print(" Command: ");
            Serial.print(mydata.command);
            Serial.print(" Data: ");
            Serial.print(mydata.data);
            Serial.println();
            digitalWrite(led_pin, LOW);
            motor.write(mydata.data);
        }
    }
     
    Evgen87 нравится это.
  10. ToxaRU

    ToxaRU Гик

    Дайте пожалуйста рабочую библиотеку...2й день мучаюсь пытаюсь заставить работать servo с радио модулем и полная засада... Пытался скомпилировать примеры из servotimer2, они не компилируются,даже после полной перестановки ардуиновской пороги..((( прям беда,нимогу проект закончить......
     
  11. vvr

    vvr Инженерище

    сделайте на nrf24
     
  12. ToxaRU

    ToxaRU Гик

    немогу частота не подходит.... будет фонить на антену wi-fi.......
     
  13. ToxaRU

    ToxaRU Гик

    вот очередную поставил и выдает теперь вот такую ошибку

    Arduino: 1.6.4 (Windows 7), Плата"Arduino Nano, ATmega328"

    In file included from ServoTimer2.pde:10:0:
    C:\Users\Антон\Desktop\arduino\arduino-1.6.4\hardware\arduino\avr\cores\arduino/Arduino.h:117:14: error: conflicting declaration 'typedef bool boolean'
    typedef bool boolean;
    ^
    In file included from ServoTimer2.pde:3:0:
    C:\Users\Антон\Desktop\arduino\arduino-1.6.4\libraries\ServoTimer2/ServoTimer2.h:41:17: error: 'boolean' has a previous declaration as 'typedef uint8_t boolean'
    typedef uint8_t boolean;
    ^
    Ошибка компиляции.

    Это сообщение будет содержать больше информации чем
    "Отображать вывод во время компиляции"
    включено в Файл > Настройки