+7-960-0655211 (Билайн)
+7-987-4207734 (МТС)
интернет-магазин
доставка по России и СНГ
работаем с 2010 года

Форум

ГлавнаяОбщениеФорумПользователиShurick
Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Робот-Габобот, робот с ИК-сенсором на arduino для начинающих
 
Используемые материалы:
Контроллер DFRduio Arduino Duemilanove (Atmega 32 8)
Драйвер моторов двухканальный DFRobot для Arduino на L298P
Плата расширения ввода/вывода DFRobot для Arduino
Платформа универсальная Tamiya 70098 2 шт.
Гусеницы Tamiya 70100 (пара)
Мотор-редуктор сдвоенный конструктор Tamiya 70097 (2-скорости)
Сервопривод TowerPro SG5010
Датчик дальности Sharp GP2Y0A21YK0F 10-80см (аналоговый)
Держатель батареи 6-AA двухсторонний
Провода, изолента, болтики-гаечки, лом и какая-то матерь немного терпения.
По затратам вышло около 4 тыс. рублей.
Немало, можно было сэкономить, купив, например, контролер Pololu, Romeo или взять робота 3pi. На эти затраты пошел сознательно, мне нужна была модульность.
По фотографиям можно понять принцип конструкции, свободное место оставил специально, в дальнейшем планирую поставить видеокамеру.









Крепление датчика - запчасть от платформы Tamiya








Сразу признаюсь, программа не моя, нашел на просторах Интернета. Убрал лишнее, добавил немного своего. Привожу полностью, думаю, это очень поможет таким же новичкам как и я.
Код
#include <Servo.h>
Servo sensServo; 
int servoPin = 12; // определяем цифровой выход 12 для серво
int motor1 = 6; // определяем выходы для моторчиков
int motor1rev = 7;
int motor2 = 5;
int motor2rev = 4;
int sensor = 0; // сюда подключаем аналоговый ик сенсор
int led = 13; // 13 вывод для светодиода
int Sensval;
int turnDelay = 600;
const int stopDist = 300;
int servoDelay = 700;
void setup()
{
  pinMode(motor1, OUTPUT);
  pinMode(motor1rev, OUTPUT);
  pinMode(motor2, OUTPUT);
  pinMode(motor2rev, OUTPUT);
  pinMode(led, OUTPUT);
  pinMode(sensor, INPUT);
  sensServo.attach(servoPin);
  sensServo.write(95);
}
void loop()
{
  Sensval = analogRead(sensor);
  if(Sensval > stopDist)
  {
    look();
  }
    else if(Sensval > 500)
  {
    backup(700);
  }
    else
  {
    drive();
  }
}
void stay()
{
  digitalWrite(led, HIGH);
  digitalWrite(motor1, LOW);
  digitalWrite(motor1rev, LOW);
  digitalWrite(motor2, LOW);
  digitalWrite(motor2rev, LOW);
  delay(500);
  return;
}
void drive()
{
  digitalWrite(led, LOW);
  digitalWrite(motor1, HIGH);
  digitalWrite(motor1rev, LOW);
  digitalWrite(motor2, HIGH);
  digitalWrite(motor2rev, LOW);
  Serial.println(Sensval);
  return;
}
void backup(int time)
{
  digitalWrite(led, LOW);
  digitalWrite(motor1, LOW);
  digitalWrite(motor1rev, HIGH);
  digitalWrite(motor2, LOW);
  digitalWrite(motor2rev, HIGH);
  delay(time);
}
void turnL()
{
  digitalWrite(led, LOW);
  digitalWrite(motor1, LOW);
  digitalWrite(motor1rev, HIGH);
  digitalWrite(motor2, HIGH);
  digitalWrite(motor2rev, LOW);
  delay(turnDelay);
  sensServo.write(95);
}
void turnR()
{
  digitalWrite(led, LOW);
  digitalWrite(motor1, HIGH);
  digitalWrite(motor1rev, LOW);
  digitalWrite(motor2, LOW);
  digitalWrite(motor2rev, HIGH);
  delay(turnDelay);
  sensServo.write(95);
}
void servoL() {
  for(int pos = 95; pos>=30; pos-=1)
  {
    sensServo.write(pos);
    delay(5);
  }
}
void servoR() {
  for(int pos = 95; pos < 160; pos += 1)  
  {
    sensServo.write(pos);
    delay(5);
  }
}   
void look()
{
  stay();
  servoL();
  delay(servoDelay);
  int leftDist = analogRead(sensor);
  sensServo.write(95);
  servoR();
  delay(servoDelay);
  int rightDist = analogRead(sensor);
    sensServo.write(95);
  stay();
  if(leftDist < rightDist)
  {
    turnL();
  }
  else 
  {
    turnR();
    }
  return;
}


P.S. Когда уже были сделаны фотографии вместо ИК датчика GP2Y0A21YK0F (10-80см) поставил GP2Y0A02YK0F (20-150см) результаты меня порадовали, в моей захламленной комнате робот начал раньше реагировать на препятствие и как следствие получше ориентироваться и находить оптимальный путь, если можно так сказать. Не бойтесь экспериментировать :)
Изменено: Shurick - 11.11.2012 21:49:37
Страницы: 1