Робот номер уно
Робот номер уно
Схема самодельного робота на микроконтроллере 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);
}
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|