Показано с 1 по 1 из 1
  1. #1
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,382
    Вес репутации
    10

    По умолчанию Робот объезжающий препядствия

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

    Робот состоит из
    Акриловой платформы
    Arduino Nano v.7
    Ultrasonic sensor
    Драйвер двигателей
    Инструкция по сборке

    Схема робота CyberBot


    Исходный код
    PHP код:
    #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_OutD14_Low//пин trig ультразвукового сонара
      
    D15_In;     //пин echo  ультразвукового сонара
      
    randomSeed(A6_Read); //Получить случайное значение
      
    for(uint8_t i=0i<12i++) beep(50random(1001000)); //звуковое оповещение готовности робота
      
    wdt_enable (WDTO_500MS);    //Сторожевая собака 0,5сек.
    }

    void loop()
    {
    Start  
      uint16_t dist
    =GetDistance(); //производим замер дистанции

        
    if( dist 10) {rotation(stat255);} else   //если 10см максимальный угол разворота
        
    if( dist 20) {rotation(stat200);} else   //если 20см  средний угол разворота
        
    if( dist 40) {rotation(stat130);} else   //если 40см  минимальный угол разворота
                       
    {robot_gostat=~stat;}       //поехали!!!      
         
    wdt_reset(); //покормить собаку
    End;}
    //***************************************************
    void rotation(uint8_t arruint8_t dur
    {
        switch (
    arr//смотрим в каком направление разворачиваться
        
    {
        case 
    0:    robot_rotation_right;
          break;
        case 
    255:    robot_rotation_left
          break;    
        } 
        
    delay_ms(dur);    //угол разворота
        
    robot_stop;      //стоп мотор!
    }
    //***************************************************
    uint16_t GetDistance() 
    {
     
    uint16_t dist;
     for (
    uint8_t i 0size_buff; ++i//производим несколько замеров
      

        
    D14_Highdelay_us(10);  D14_Low;  //запустить измерение
       
    dist pulseIn(15HIGH2400); //считываем длительность времени прохождения эха, ограничить время ожидания
       
    if(dist==0dist=2400;  
       
    sensor[i]=dist;  //сохранить в массиве
       
    delay_ms(40); //задержка между посылками
       
    wdt_reset(); //покормить собаку, что бы она не сбежала 
      
    }
      
    dist=(find_similar(sensorsize_buff58))/58// //фильтруем показания датчика и переводим в см
      
    return dist;

    //***************************************************  
    void beep(uint8_t duruint16_t frq)
    {
      
    dur=(1000/frq)*dur;  //рассчет длительности бипа
      
    for(byte i=0i<duri++)
      {
        
    D11_High
        
    delay_us(frq); 
        
    D11_Low;
        
    delay_us(frq);
      } 

    Снимал видео несколько раз, но робот почему то сразу выбирался из ловушки
    Но вот наконец то попался вариант, когда робот покрутился прежде чем выбраться


    Оригинал статьи
    Последний раз редактировалось Chip; 05.02.2016 в 00:12.

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •