На что обратить внимание?
Пытаясь собрать дрон своими руками на Arduino возникает мысль полностью написать программное обеспечение. От этой мысли нужно избавиться, во всяком случае, на первых этапах.
Например, для управления полетным контроллером сейчас достаточно готовых решений. Если же вы сразу решите писать что-то свое, то высок риск повреждения квадрокоптера. Причина в том, что математика полета составляет минимальную часть всего кода программы, а для управления квадрокоптером без барометра и системы GPS требуется хорошая практика (особенно она понадобится при некорректной реакции дрона Arduino на управляющие команды, что происходит почти всегда).
Значительно удобней сначала попрактиковаться и разобраться в существующих программах, что позволит четко понять принципы работы.
https://www.youtube.com/watch?v=8MjlFve7Pjs
Если вы решите писать программу для контроллера своими руками, то готовьтесь к большим временным затратам, которые неразумны при отсутствии соответствующего академического интереса. Во всяком случае, имеющиеся программы и решения для квадрокоптеров на базе Arduino вполне могут выполнять все стандартные действия (снимать видео, фотографировать, летать свободно и по заданию).
Решая заняться созданием квадрокоптера на Arduino, обратите внимание на следующие советы:
- Не усложняйте первую конструкцию, устанавливая экшен-камеру. Вашей задачей остается создание дрона, который сможет взлететь и уверенно держаться в воздухе, а не упасть на землю, сломавшись при первом полете. Если же последнее произойдет, то легко можно разбить экшен-камеру, а это большие расходы.
- Не гонитесь за большими масштабами, так как на первый раз достаточно создать небольшой рабочий Arduino дрон, над конструкцией которого можно будет дальше работать, совершенствуя и усложняя.
- Сократите до минимума количество дополнительных элементов и соединений, так как большое число датчиков и всевозможных контролеров не всегда повышает надежность дрона в полете. Значительно лучше создать базовую конструкцию и постепенно ее усложнять, добавляя новые функции и возможности. Это будет значительно разумней и позволит в будущем проектировать «специализированные» дроны.
- Если вы хотите изготовить квадрокоптер Arduino с камерой, то вам потребуется основание достаточно больших размеров, что снижает устойчивость всей конструкции.
В завершение обратим внимание, что программирование и создание квадрокоптера на базе Arduino – увлекательное, но достаточно сложное дело для новичков, поэтому не опускайте руки, если у вас не получается. Сделать на Arduino дрон вполне реально каждому и поможет в этом масса дополнительной информации и видео, которое вы легко найдете в интернете.
Квадрокоптер на Ардуино своими руками
Здравствуйте, хаброжители!
В этой серии статей мы с вами приоткроем крышку квадрокоптера чуть больше, чем этого требует хобби, а также напишем, настроим и запустим в воздух собственную программу для полетного контроллера, которым будет являться обычная плата Arduino Mega 2560.
У нас впереди:
- Базовые понятия (для начинающих коптероводов).
- PID-регуляторы с интерактивной web-демонстрацией работы на виртуальном квадрокоптере.
- Собственно программа для Arduino и настроечная программа на Qt.
- Опасные тесты квадрокоптера на веревке. Первые полёты.
- Крушение и потеря в поле. Автоматический поиск с воздуха средствами Qt и OpenCV.
- Окончательные успешные тесты. Подведение итогов. Куда дальше?
Материал объемный, но постараюсь уложиться в 2-3 статьи.
Сегодня нас ожидает: спойлер с видео, как наш квадрокоптер полетел; базовые понятия; PID-регуляторы и практика подбора их коэффициентов.
Код прошивки
Для работы ниже приведённого скетча скачайте и установите библиотеки:
- flight-recorder.ino
-
// библиотеки для работы с датчиком 18B20#include <OneWire.h>#include <DallasTemperature.h>// библиотека для работы с SPI#include <SPI.h>// библиотека для работы с SD-картами#include <SD.h>// библиотека для работы I²C#include <Wire.h>// библиотека для работы с модулями IMU#include <TroykaIMU.h>// библиотека для работы с GPS устройством#include <TroykaGPS.h>// библиотека для работы с GPRS устройством#include <AmperkaGPRS.h> // serial-порт к которому подключён GPS-модуль#define GPS_SERIAL Serial1// serial-порт к которому подключён GPRS-модуль#define GPRS_SERIAL Serial3// пин подключения CS microSD-карты#define SD_CS_PIN 10// пин подключения датчика 18B20#define TEMP_18B20_PIN A1// задаём размер массива для времени#define MAX_SIZE_MASS 16// интервал времени записи данных на SD-карту#define INTERVAL_SD 1000// интервал времени передачи данных через СМС#define INTERVAL_SMS 600000// номер на который будем отправлять сообщение#define PHONE_NUMBER " 74959379992" // создадаём объект для работы с библиотекой OneWire OneWire oneWire(TEMP_18B20_PIN);// создадаём объект для работы с библиотекой DallasTemperature DallasTemperature sensor18B20(&oneWire); // создаём объект для работы с барометром Barometer barometer; // создаём объект класса GPS и передаём в него объект Serial1 GPS gps(GPS_SERIAL);// создаём объект класса GPRS и передаём в него объект Serial1 GPRS gprs(GPRS_SERIAL);// можно указать дополнительные параметры — пины PK и ST// по умолчанию: PK = 2, ST = 3// GPRS gprs(GPRS_SERIAL, 2, 3); // массив для хранения текущего времениchar strTime[MAX_SIZE_MASS];// массив для хранения текущей датыchar strDate[MAX_SIZE_MASS];// массив для хранения широты в градусах, минутах и секундахchar latitudeBase60[MAX_SIZE_MASS];// массив для хранения долготы в градусах, минутах и секундахchar longitudeBase60[MAX_SIZE_MASS]; // запоминаем текущее времяlong startMillisSD = millis();// запоминаем текущее времяlong startMillisSMS = millis(); // данные модулей для записи на карту SD String dataStringSD ="";// данные модулей для отправки СМС String dataStringSMS =""; // переменные для хранения данных с датчиков и модулейfloat temperature18B20;float temperatureBarometer;float pressureBarometer;float altitudeBarometer; String timeGPS; String dateGPS; String altitudeGPS; String latitudeBase60GPS; String longitudeBase60GPS; void setup(){// открываем последовательный порт для мониторинга действий в программе Serial.begin(115200);// выводим сообщение в Serial-порт о поиске карты памяти Serial.println("Initializing SD card...");// если microSD-карта не была обнаруженаif(!SD.begin(SD_CS_PIN)){// выводим сообщение об ошибке Serial.println("Card failed, or not present");}else{ Serial.println("Card initialized");} // начало работы с датчиком DS18B20 sensor18B20.begin();// установим разрешение датчика sensor18B20.setResolution(12);// выводим сообщение об удачной инициализации Serial.println("18B20 is OK"); // инициализация барометра barometer.begin();// выводим сообщение об удачной инициализации Serial.println("LPS331 is OK"); // открываем Serial-соединение с GPS-модулем GPS_SERIAL.begin(115200);// выводим сообщение об удачной инициализации Serial.println("GPS is OK");// открываем Serial-соединение с GPRS Shield GPRS_SERIAL.begin(115200);// включаем GPRS-шилд gprs.powerOn(); delay(1000);if(!gprs.begin()){// если связи нет, ждём 1 секунду// и выводим сообщение об ошибке; Serial.print("GPRS Begin errorrn");}// вывод об удачной инициализации GPRS Shield Serial.println("GPRS is OK");} void loop(){// считываем данные с модулей и датчиков getTemperature18B20(); getDataBarometer(); getDataGPS(); // собираем пакет данных для записи на SD-карту dataStringSD = dateGPS; dataStringSD ="t"; dataStringSD = timeGPS; dataStringSD ="t"; dataStringSD = latitudeBase60GPS; dataStringSD ="t"; dataStringSD = longitudeBase60GPS; dataStringSD ="t"; dataStringSD = temperature18B20; dataStringSD ="t"; dataStringSD = temperatureBarometer; dataStringSD ="t"; dataStringSD = pressureBarometer; dataStringSD ="t"; dataStringSD = altitudeBarometer; dataStringSD ="t"; dataStringSD = altitudeGPS; dataStringSD ="t"; // собираем пакет данных для СМС dataStringSMS = dateGPS; dataStringSMS =" "; dataStringSMS = timeGPS; dataStringSMS =" "; dataStringSMS = latitudeBase60GPS; dataStringSMS =" "; dataStringSMS = longitudeBase60GPS; dataStringSMS =" "; dataStringSMS = temperature18B20; dataStringSMS =" "; dataStringSMS = temperatureBarometer; dataStringSMS =" "; dataStringSMS = pressureBarometer; dataStringSMS =" "; dataStringSMS = altitudeBarometer; dataStringSMS =" "; dataStringSMS = altitudeGPS; dataStringSMS =" "; if(millis()- startMillisSD > INTERVAL_SD){// сохраняем данные с модулей на карту памяти saveSD();// запоминаем текущее время startMillisSD = millis();} if(millis()- startMillisSMS > INTERVAL_SMS){// отправляем данные СМС сообщениям sendSMS();// запоминаем текущее время startMillisSMS = millis();}} // функция считывания данных с GPS-модуля в глобальные переменныеvoid getDataGPS(){// если пришли данные с GPS-модуляif(gps.available()){// считываем данные и парсим gps.readParsing();// проверяем состояние GPS-модуляswitch(gps.getState()){// всё OKcase GPS_OK: gps.getTime(strTime, MAX_SIZE_MASS); gps.getDate(strDate, MAX_SIZE_MASS); gps.getLatitudeBase60(latitudeBase60, MAX_SIZE_MASS); gps.getLongitudeBase60(longitudeBase60, MAX_SIZE_MASS); timeGPS =(String)strDate; dateGPS =(String)strDate; latitudeBase60GPS =(String)latitudeBase60; longitudeBase60GPS =(String)longitudeBase60; altitudeGPS = gps.getAltitude();break;// ошибка данныхcase GPS_ERROR_DATA: dateGPS ="Error"; timeGPS ="Error"; latitudeBase60GPS ="Error"; longitudeBase60GPS ="Error"; altitudeGPS ="Error";break;// нет соединение со спутникамиcase GPS_ERROR_SAT: dateGPS ="No Sat"; timeGPS ="No Sat"; latitudeBase60GPS ="No Sat"; longitudeBase60GPS ="No Sat"; altitudeGPS ="No Sat";break;}}} // функция считывания данных с барометра в глобальные переменныеvoid getDataBarometer(){ temperatureBarometer = barometer.readTemperatureC(); pressureBarometer = barometer.readPressureMillibars(); altitudeBarometer = barometer.pressureToAltitudeMeters(pressureBarometer);} // функция считывания данных с датчика 18B20 в глобальную переменнуюvoid getTemperature18B20(){// считываем данные с цифрового термометра 18B20 sensor18B20.requestTemperatures(); temperature18B20 = sensor18B20.getTempCByIndex(0);} // функция записи данных с модулей на SD-картуvoid saveSD(){// создаём файл для записи File dataFile = SD.open("datalog.txt", FILE_WRITE);// если файл доступен для записиif(dataFile){// сохраняем данные dataFile.println(dataStringSD); Serial.println(dataStringSD);// закрываем файл dataFile.close();// выводим сообщение об удачной записи Serial.println("Save OK");}else{// если файл не доступен// выводим сообщение об ошибке Serial.println("Error opening file");}} // функция отправки данные с модулей СМС сообщениемvoid sendSMS(){char dataSMS[128]=""; dataStringSMS.toCharArray(dataSMS, 128); gprs.sendSMS(PHONE_NUMBER, dataSMS); Serial.println("SMS sent OK");}
Относительно дешевый quadcopter на arduino с управлением от телефона, планшета, пк
Что вам понадобится для того, чтобы собрать и запустить в воздух свой квадрокоптер:
Ноутбук или компьютер с Processing[/b], скачать можно от сюда. Что такое “Processing”? Вот, что пишет об этом википедия :
Processing — открытый язык программирования, основанный на Java. Представляет собой лёгкий и быстрый инструментарий для людей, которые хотят программировать изображения, анимацию и интерфейсы.Используется студентами, художниками, дизайнерами, исследователями и любителями, для изучения, прототипирования и производства. Он создан для изучения основ компьютерного программирования в визуальном контексте и служит альбомным программным обеспечением (имеется в виду то, что каждый *.pde файл визуальной оболочки Processing’а представляет собой отдельное изображение или анимацию, и т. д.) и профессиональным производственным инструментом.
Arduino Software (IDE)[/b]
Андроид-устройство[/b], которое поддерживает режимUSB-хоста[/b](проверено на MotorolaXoom.
А так же паяльник, прямые руки, ножницы.
Что надо для изготовления рамы
Рама квадрокоптер делается из бамбуковых шашлычных палочек
Крепления двигателей к раме делаются из палочек для коктейля.
Изолента- используется для крепления платы приемника, электродвигателей к раме. Нитки нужны для скрепления деталей перед склейкой. Цианакриловый клей. Резинка для крепления аккумулятора к раме.
Список электроники для квадрокоптера.
Все эти детали могут быть повреждены во время пробных запусков или во время полетов, поэтому заказывайте с запасом. Ссылки даны для примера. Есть много поставщиков.
Лопасти для вертолета
Двигатели. Я не нашел двигатели с размерами 4х7 мм на Алиэкспресс нашел вот такие. Моторы должны быть без щеточные.
Плата приемника эта плата содержит все компоненты- гироскоп, акселометр, ESC (система курсовой устойчивости), CPU который все эти компоненты объединяет. Литий полимерный аккумулятор:1 x 240mah 1S ‘LiPo. Можно использовать разные аккумуляторы с меньшей или большей емкости. Если вы решите построить октакоптер, то вам понадобиться более емкая батарея.
Список аппаратного контроля квадрокоптера.
Это те части вашего будущего вертолета, которые позволят ему принимать ваши команды.
Приемопередатчик Учтите что в комплекте должны быть два модуля. И это не тоже самое что NRF24L01, что бы ни утверждал продаван.
Arduino DUE[/b]или аналогичный, он будет использоваться для связи вашего Андроид-устройства и A7105. Автор использовал именно эту плату Arduino потому, что она имеет USB подключенный к последовательному порту и может работать с 3.3в логикой, хотя можно применить преобразователь уровней 5-3.3в.
Макетная плата-на ней вы будете монтировать радио модуль и подключать его к Arduino. Резистор 22кОм- значение его не особо критично. Провода для соединения радио модуля. OTG переходник для вашего андроид устройства.
OTG
Hubsan-пульт дистанционного управления-это не обязательно, но удобно.
Создание каркаса.
Каркас изготавливается из бамбуковых палочек, скрепленных крест на крест с трубочками от коктейлей. Все это склеивается вместе супер клеем.
1: Распечатайте шаблон SVG в прикрепленном файле. Он сложнее, чем должен быть, но также используется для строительства октокоптера. Шаблон нужен, чтобы сделать правильный квадрат.
2. Отрежьте нитку по длине вашего предплечья.
3 Возьмите две палочки для коктейлей и держите их так, чтобы шашлычная палочка делила их пополам и они находились друг на против друга .
4 Начните оборачивать нитку сначала по одной диагонали , потом по другой, наматывайте равномерно ,пока нитка не кончится. Не беспокойтесь о том, что палочки смещаются, вы их позже приклеите клеем. Нитку возьмите длиной с ваше предплечье. Не волнуйтесь по поводу того, что палочки слишком длинные, позже они будут использоваться как крепления мотора и ноги квадрокоптера.
5. Возьмите еще две палочки для канапе и закрепите их как в предыдущем шаге , только на расстоянии 4 пальцев от ранее прикрепленных. Точное расстояние не важно, вы исправите его далее.
6. Положите шаблон на ровную поверхность, лучше использовать стекло.
7. Разместите ваши связанные вместе палочки, как показано на фото.
На данном этапе важно все сделать как можно точно. Квадрокоптеры не очень чувствительны к распределению веса, но если ваши моторы не будут направлены вертикально, вертолет будет не очень хорошо летать, так что проверьте все два раза. Чтобы крепления моторов были строго вертикальными, а все диагонали одинаковыми.
8 Пропитайте все ваши нити, связывающие палочки, супер клеем. Надо пропитать нити насквозь, стремитесь не сдвигать при этом ваш каркас. Подождите 2 минуты и переверните ваш шаблон, чтобы пропитать нитки клеем с обратной стороны. Еще через две минуты первая квадратный кронштейн будет готов готова.
9. Повторите все тоже самое для второго кронштейна.
10. Далее надо скрепить вместе два кронштейна, как было уже описано. Еще раз убедитесь, что все крепления моторов выставлены вертикально и кронштейны скрепляются строго по середине.
11. Обрежьте палочки примерно на длину 2 см с обеих сторон.
12. Отрежьте 4 палочки по 1.5 см , склейте их вместе квадратом, особо прочная склейка не нужна, это будет кронштейн для платы и батареи питания.
Следующий этап состоит из пайки ваших 4 моторов к плате 4Х приемника. Первое, что надо — это припаять провода питания на нижнюю часть платы. Далее мы будем ссылаться на эту ориентацию (плата лежит на “спине”)
Как подключать моторы.
На Hubsan х 4 платах есть контактные площадки для подключения светодиодов и моторов. Те, что для светодиодов имеют обозначение LED, туда НЕНАДО подключать моторы. Контакты для моторов помечены ve[/b]и–ve.[/b]
Возьмите один из ваших 4 моторов с черным и белым проводами и припаяйте их кЛЕВЫМ НИЖНИМ[/b]контактам платы, белым проводом к левому контакту пары. Возьмите мотор с красным и синим проводами и припаяйте его кЛЕВЫМ ВЕРХНИМ[/b]контактам, красным проводом к левому контакту пары.. Возьмите мотор с черными и белыми проводами и припаяйте их кПРАВЫМ ВЕРХНИМ[/b]контактам, черным проводом к левому контакту. Возьмите мотор с красным и синим проводами и припаяйте его кПРАВЫМ НИЖНИМ[/b]контактам, красным проводом к левому контакту пары.
В схеме подключения белый провод это черная пунктирная линия. Провода надо закрепить каплей горячего клея. Закрепите моторы двумя полосками изоленты шириной 5мм. Не стоит особо волноваться по поводу одинакового расположения моторов по высоте. После того,как моторы закреплены, надо надеть на оси пропеллеры. Используйте белый пропеллер для «переда»с противоположной стороны от проводов батареи) и чёрный пропеллер для»зада». Это не так просто, как кажется, так. как одни лопасти сделаны для вращения по часовой стрелке, а другие , для вращения против часовой стрелки. На лопастях есть обозначения. Используйте лопасти с буквой «А[/b]» для левого верхнего и правого нижнего моторов. С буквой «В[/b]«, соответственно, для правого верхнего и левого нижнего моторов. Теперь вы можете прикрепить батарею к нижней части платы, автор использует для этой части резинку. Если у вас есть оригинальный hubsan контроллер, вы сможете поднять квадро в воздух. Если вертолёт трясёт в воздухе, значит, моторы стоят не строго вертикально. Подкладывая кусочки свернутой бумаги, можно выравнять моторы.
Сборка радиоуправления на arduino.
Этот пункт проекта расскажет как управлять вертолетом с помощью Андроид устройства,через последовательный порт Arduino.
Вам нужны 6 контактов на плате А7105. Слева GND. Справа-SDIO, SCK, SCS, GND, VCC.
Припаяйте жесткий одножильный провод, длиной 2 см, к каждому указанному выводу. Вставьте А7105 в макетную плату, так как показано на фото. Соедините выводы GND на плате arduino и два на А7105. Соедините вывод 3.3V на Arduino c выводом VCC на плате А7105. На разъеме SPI Arduino, соедините вывод MOSI с одним из выводов резистора , другой конец резистора соедините с пином SIDO на А7501.
По этой ссылке можно посмотреть где находится вывод MOSI
Вывод SCK Arduino c выводом SCK А7105 , SCS с платы А7105 на пин 10 Arduino . Синий резистор на фото не является частью проекта.
Arduino софт
Нижеследующий скетч использует хакнутую версию PhracturedBlue’s hubsan X4 и A7105 оригинал кода можно посмотреть здесь.
Подключить Ваш DUO к компьютеру через ‘Programming Port’. Скачайте зип фаил, загрузите скетч в Arduino и выгрузите его в DUO. Этот скетч обрабатывает команды с последовательного порта и преобразует их в команды платы управления вашего квадрокоптера. Этот скетч связывается с платой Hubsan по радио без последовательного порта, так что, если включите ваш коптер, а затем Arduino, и огни на коптере перестанут моргать, значит все в порядке.
Программное обеспечение для Андроид
Это программноеобеспечениедает вам простой контролер полета на базе андроид устройства. Для управления используется акселерометр и сенсорный экран вашего устройства. Планшет или телефон будет обмениваться данными с Arduino через порт USB.
Установка софта:
1 Надо разрешить отладку по USB и разрешить установку приложений не google play. Скачать приложение можно здесь
2Подключитесвое устройство через переходник OTG к Arduino, он будетзапитыватьсяот вашего телефона или планшета, поэтому проверьте, чтобы аккумулятор был полностью заряжен.
3 Подключите аккумулятор к коптеру и положите его на плоскую поверхность. Если огни перестали моргать, значит все в порядке.
4 Большой палец левой руки медленно сдвиньте по экрану, пропеллеры должны начать вращаться. Уберите палец и пропеллеры остановятся.
5 Проделайте все тоже самое, только разместите большой палец правой руки тоже на экране. Это позволит вам управлять вертолетом с помощью акселерометра, наклоняя ваше устройство вперед/назад, влево/вправо. Перемещая большой палец правой руки влево или вправо, вы будете закручивать вертолет влево или вправо вокруг оси. Если убрать правую руку с экрана, вертолет должен выровняться, не зависимо от положения акселерометра. Попробуйте. Перемещайте палец левой руки до тех пор, пока вертолет не взлетит. Помните — если убрать оба пальца- моторы остановятся.
Программное обеспечение для ПК
В архиве программа, которая управляет коптером через последовательный порт. Управляется коптер с помощью курсорных кнопок, и кнопок “A”/”Z”- дроссель. Автор сделал попытку заставить следовать коптер за объектом определенного цвета, но это пока не работает. Обещал выкладывать обновления.