Робот CyberBot

В данной статье хочу поделится, как можно быстро и не дорого собрать робота.
Пилить и сверлить я конечно люблю, но нет такой возможности, так как у меня нет мастерской, гаража и даже балкона, по этой причине я купил готовый комплект деталей для робота.

Комплект выглядит так же как на фото


Для создания робота использовались следующие комплектующие:

Набор для сборки платформы робота
Плата контроллера робота
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<dur; i++)
  {
    D11_High; 
    delay_us(frq); 
    D11_Low;
    delay_us(frq);
  } 
} 


На видео можно посмотреть то, что у меня получилось


Следующий этап, это подключение Wi-Fi роутера и видеокамеры

Комментарии (0)

RSS свернуть / развернуть

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.