Всем привет! Подскажите пожалуйста можно ли реализовать дистанционное управление моделью не используя блютуз и wi-fi шилдов, и что для этого потребуется. Речь идет именно о радиоуправлении т.е. управление с пульта от телевизора не подходит.За ранее спасибо
конечно можно, можно и простой пульт дистанционного управления переделать, если хочется обычной машинкой то пульт переделываешь машинка остается без изменений. Тут зависит какая машинка тебе попадется в качестве донора. иль все делаешь используя радиоканал шифруешь и дешифруешь данные ардуинами с обои сторон. можно приемник и передатчик сделать самому. Если бюджет позволяет можно купить комплекты радиоуправления, мне кажется этот вариант более предпочтительным в виду несложности его реализации и совместимости с управляемыми машинками для взрослых дядь. ардуино это конечно конструктор но его можно и как просто микропроцессор использовать.
Именно так. А модули на 433МГц в использовании чуть ли не проще всего. Есть хорошая статья про них. И вот еще.
Спасибо Вам за ваш ответ.Но так как я полный нуб (пока) в этом деле то вопросов появилось еще больше.И я буду признателен Вам если Вы ответите еще на парочку.А именно каким образом наладить связь между передатчиком и приемником с помощью ардуино и с помощью каких библеотек или комманд это сделать.Заранее спасибо.
Вот здесь есть примеры передачи данных с помощью простейших модулей 433Mhz. Сейчас тоже пытаюсь радиоуправление замутить) с помощью примера удалось сервой покрутить на расстоянии.
этот код очень сырой , серва рывками двигается. сейчас как раз ломаю голову как его улучшить) нужно решить проблему с рывками и добавить многоканальность. имейте в виду что в приемнике для управления сервой используется библиотека 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); } }
Дайте пожалуйста рабочую библиотеку...2й день мучаюсь пытаюсь заставить работать servo с радио модулем и полная засада... Пытался скомпилировать примеры из servotimer2, они не компилируются,даже после полной перестановки ардуиновской пороги..((( прям беда,нимогу проект закончить......
вот очередную поставил и выдает теперь вот такую ошибку 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; ^ Ошибка компиляции. Это сообщение будет содержать больше информации чем "Отображать вывод во время компиляции" включено в Файл > Настройки