В данной статье хочу поделится, как можно быстро и не дорого собрать робота.
Пилить и сверлить я конечно люблю, но нет такой возможности, так как у меня нет мастерской, гаража и даже балкона, по этой причине я купил готовый комплект деталей для робота.
Комплект выглядит так же как на фото
Для создания робота использовались следующие комплектующие:
Набор для сборки платформы робота
Плата контроллера робота
Arduino Nano v.7
Драйвер двигателей
Сборка робота занимает 10-15мин.
Код программы робота получился тоже достаточно простым, но он выполняет то что от него требуется на все 100%
Робот обходит препятствия, даже с неподвижно установленным на него дальномером. Мне так и не удалось создать такую ситуацию из которой бы он не смог выбраться
Для управления роботом и для стабильной работы дальномера, я использовал библиотеку CyberLib
Вращение колес можно выравнять при помощи оптических энкодеров, но это уже тема для другой статьи.
Планировал выравнивать вращение колес при помощи ШИМ, но мне не пришлось этого делать, так как у меня они примерно одинаково вращаются
Схеиа робота CyberBot
Исходник для Arduino Nano v.7
#include <CyberLib.h> #include <avr/wdt.h> #define motors_init D4_Out; D5_Out; D6_Out; D7_Out #define robot_go D4_Low; D5_High; D6_High; D7_Low #define robot_stop D4_Low; D5_Low; D6_Low; D7_Low #define robot_rotation_left D4_Low; D5_High; D6_Low; D7_High #define robot_rotation_right D4_High; D5_Low; D6_High; D7_Low #define size_buff 5 //размер массива sensor uint16_t sensor[size_buff]; //массив для хранения замеров дальномера uint8_t stat=0; void setup() { motors_init; //инициализация выходов моторов D11_Out; //динамик D14_Out; D14_Low; //пин trig ультразвукового сонара D15_In; //пин echo ультразвукового сонара for(uint8_t i=0; i<12; i++) beep(50, random(100, 1000)); //звуковое оповещение готовности робота wdt_enable (WDTO_500MS); //Сторожевая собака 1сек. robot_go; } void loop() {Start uint16_t dist=GetDistance(); //производим замер if( dist < 40 && stat==255) //если дистанция меньше 40см { robot_rotation_left; delay_ms(140); robot_stop; } else if( dist < 40 && stat==0) //если дистанция меньше 40см { robot_rotation_right; delay_ms(140); robot_stop; } else if( dist > 39) {robot_go; stat=~stat;} //поехали!!! wdt_reset(); //покормить собаку, что бы она не сбежала End;} //*************************************************** uint16_t GetDistance() { uint16_t dist; for (uint8_t i = 0; i < size_buff; ++i) //производим несколько замеров { D14_High; delay_us(10); D14_Low; //запустить измерение dist = pulseIn(15, HIGH, 2400); //считываем длительность времени прохождения эха, ограничить время ожидания if(dist==0) dist=2400; sensor[i]=dist; delay_ms(40); //задержка между посылками wdt_reset(); //покормить собаку, что бы она не сбежала } dist=(find_similar(sensor, size_buff, 58))/58; // //фильтруем показания датчика и переводим в см return dist; } //*************************************************** void beep(byte dur, word frq) { dur=(1000/frq)*dur; //расчет длительности бипа for(byte i=0; iНа видео можно посмотреть то, что у меня получилось
Следующий этап, это подключение Wi-Fi роутера и видеокамеры