ArduWir
Вы хотите отреагировать на этот пост ? Создайте аккаунт всего в несколько кликов или войдите на форум.

Робот номер уно

Перейти вниз

Робот номер уно Empty Робот номер уно

Сообщение  Admin Ср 23 Мар 2016 - 14:28

Схема самодельного робота на микроконтроллере ATMega 328 (Arduino pro mini 5V). ИК сенсоры для робота выполненная из фотоэлементов старой шариковой мышки. Дальность обнаружения препятствия до 25см. H мосты можно применить любые подходящие по мощности Вашим приводам.
[Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]
Код:


        //СБОР СРЕДСТВ НА КОМПЛЕКТУЮЩИЕ http://yasobe.ru/na/robot_detkam
        //На нормальную платформу
        #define sens_LF 0 // левый передний фотосенсор
        #define sens_RF 1 //правый передний фотосенсор
        #define BL_on digitalWrite(12, HIGH)//vcc BL on
        #define BL_off digitalWrite(12, LOW)//vcc BL off
        #define min_dist 20 //минимальная дистанция
        #define max_dist 10 //максимальная дистанция
        #define beeper 11//выход Спикера
        //#define l_motor 8,9 //пины правого мотора
        //#define r_motor 7,6 //пины левого мотора
        #define stp mov(0,0,0,0,250)//stop
        #define forvard mov(1,20+20,1,20,0)//forvard
        #define reverse mov(0,255,0,255,0)//revers
        #define right_low mov(0,0,1,20,0)//right low
        #define right mov(0,255,0,100,0)//right
        //#define right mov(0,255,1,255,0)//right
        #define left_low mov(1,0,0,0,0)//left low
        #define left mov(0,100,0,255,0)//left
        //#define left mov(1,0,0,255,0)//left
        long PreGetDist = 0;//врямя последнего замера дистанции
        //long PreFree = 0;//время последнего ожидания ухода от препятствия
        byte interval_PGD=200;//интервал замера дистанции в мс
        byte spd=0;
        byte front_dist = 0;//дистанция спереди
        byte dist_LF=0;//дистанция слева
        byte dist_RF=0;//дистанция справа
        int light_LF=0;//освещенность слева
        int light_RF=0;//освещенность справа
        int pre_light_LF=0;//освещенность слева предыдущий замер
        int pre_light_RF=0;//освещенность справа предыдущий замер
        void setup()
        {
        Serial.begin(9600);
        pinMode(12,OUTPUT);//ИК подсветка
        pinMode(13,OUTPUT);//индикатор
        pinMode(8,OUTPUT);//мотор Л направление
        pinMode(7,OUTPUT);//мотор П направление
        }
        void loop()
        {
        get_dist();//замер растояний до препятствий
        if (front_dist < 8){
        interval_PGD=150;
        forvard;
        }
        if (dist_LF > 5){
        interval_PGD=100;
        right_low;//правее
        }
        if (dist_LF > 8){
        beep();
        interval_PGD=80;
        // stp;//стоп
        right;//вправо
        }
        if (dist_RF > 5){
        interval_PGD=100;
        left_low;//левее
        }
        if (dist_RF > 8){
        beep();
        interval_PGD=80;
        // stp;
        left;//влево
        }
        /* if (front_dist >= 15){
        interval_PGD=250;
        reverse;
        }*/
        // spd=0;
        }
        void beep(){
        analogWrite(beeper,125);
        delay (25);
        analogWrite(beeper,0);
        }
        void get_dist(){
        if (millis() - PreGetDist >= interval_PGD){//опрос датчиков препятствий
        PreGetDist = millis();
        dist_LF = ((dist_LF*2)+IR_sens(sens_LF))/3;//отфильтрованная дистанция
        dist_RF = ((dist_RF*2)+IR_sens(sens_RF))/3;//отфильтрованная дистанция
        }
        Serial.print(" Light_L=");//освещенность
        Serial.print(light_LF);
        Serial.print(" L_dist=");
        Serial.print(dist_LF);
        Serial.print(" Light_R=");//освещенность
        Serial.print(light_RF);
        Serial.print(" R_dist=");
        Serial.println(dist_RF);
        }
        byte IR_sens(byte sens){
        int val=0;
        int val2=0;
        for (int i=0; i < 1; i++){//замер с ИК подсветкой
        BL_on; // вкл ИК подсветка
        delay(1);
        val = val + analogRead(sens);// считываем значение с фототранзистора
        BL_off;// выкл ИК подсветка
        delay(1);
        val2 = val2 + analogRead(sens); // считываем значение с фототранзистора
        }
        val = val/2;//среднее с ИК подсветкой
        val2 = val2/2;//средняя освещенность
        if (sens == sens_LF){//если опрашивали левый сенсор
        light_LF=val2;//то освещенность сохраняем в light_LF
        }
        if (sens == sens_RF){
        light_RF = val2;//то освещенность сохраняем в light_RF
        }
        val = val - val2; //вычесление дистанции
        return abs(val);
        }
        void mov(boolean R_r, byte R_sp, boolean L_r, byte L_sp, int pause){
        digitalWrite(13,1);
        //правый
        digitalWrite( 8, R_r );
        analogWrite( 9, R_sp );//22 поправка
        //левый
        digitalWrite( 7, L_r );
        analogWrite( 6, L_sp );
        delay(pause);
        digitalWrite(13,0);
        }


Admin
Admin

Сообщения : 21
Дата регистрации : 2012-12-11

https://allduino.forum2x2.ru

Вернуться к началу Перейти вниз

Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения