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

Форум

ГлавнаяОбщениеФорумМастерскаяРобот-Габобот
Страницы: 1 2 3 4 След.
Робот-Габобот, робот с ИК-сенсором на 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
 
Посмотрите тему Робот на гусеничном ходу, проект похожий на ваш, может что пригодится.
 
а можете показать фотографии с тем как все подключать?
 
Извиняюсь за молчание, работа и семья не оставляют время на хобби :). Что конкретно Вас интересует? Платы вставляются друг в друга и неправильно их нельзя вставить, выводы на моторчики с драйвера прописаны в программе, и если неправильно подключить моторчики то поедет не в ту сторону, только и всего. вывод с сенсора 0. еще два провода это питание (смотрите описание сенсора), с сервы 12 и тоже два провода питание. Верхняя плата - для удобства подключения, если ее нет - то можно в соответствующие выводы повтыкать прямо в плату драйвера или использовать монтажную плату. Если все равно не понятно давайте я схему на листочке накидаю с нумерацией и.т.д. А вообще смотрите внимательно программку - там все написано, когда будете понимать програмки - будете понимать как сделать робота и все его функции
 
Да, еще, на 13 вывод не обязательно подключать светодиод. На этой плате он впаян как тестовый (сигнальный) как раз на 13 вывод
 
а через какую программу вы программировали?
 
Цитата
Дмитрий Тимошенко пишет:
а через какую программу вы программировали?
На этом сайте есть статья "Знакомство с Arduino" на главной странице. А именно про программу здесь: http://www.robototehnika.ru/content/articles/1029/#ch33
 
подскажите как это сделать. Дело в том что компьютер не может найти плату и как скачать драйверы с сайта?
Подключите плату Arduino к компьютеру; когда появится окно помощника "Найдено новое оборудование", Windows попробует найти драйвер на сайте Windows Update.

Windows XP спросит вас, проверять-ли сайт Windows Update - если вы не хотите этого делать, выберите "Нет, не в этот раз" и нажмите "Далее".

На следующем экране выберите "Установить из указанного места" и нажмите "Далее".

Отметьте галочкой опцию "Искать в следующих местах", нажмите "Обзор", выберите папку, в которую вы установил Arduino, и выберите папку Drivers\FTDI USB Drivers. Нажмите "ОК" и "Далее".

Windows Vista сначала попробует найти драйвер на сервере Windows Update; и если не получится, вы сможете указать папку Drivers\FTDI USB Drivers.

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

После того, как драйверы установлены, вы можете запускать Arduino IDE и начинать использовать Arduino.

Далее, вы должны узнать, какой порт назначен плате Arduino - эта информация понадобится вам в дальнейшем. Инструкции по получению этой информации следуют ниже.
 
все получилось
 
скажите, а где можно найти программу для управления например таким роботом с компьютера при помощью APC220?
 
и можно ли использовать за место вашего сервопривода какой нибудь микро серво?
 
Цитата
Дмитрий Тимошенко пишет:
скажите, а где можно найти программу для управления например таким роботом с компьютера при помощью APC220? Микросерву конечно можно использовать, просто тем, что у меня были я голову пооткрутил еще до этого робота, а по поводу APC220 - если только для управления, то наверное проще использовать Xbee или блютуз, У меня есть этот модуль но я к нему помимо управления собираюсь присобачить модуль камеры uCAM- TTL, Хотя тоже есть готовые решения с видеокамерами - здесь просто спортивный интерес. Видеокамера уже давно имеется, но сейчас висят два проекта, думаю что после нового года доделаю и этот проект. Поищите в интернете "UART-TTL трансивер" или "FSK-трансиверы с UART-интерфейсом" Вам многое станет понятно. А когда у меня появятся готовые рабочие решения, я их непременно здесь выложу
 
Поторопился, ну думаю понятно где цитата, а где я написал )))
 
Добрый вечер,пожалуйста помогите ваш код подправить под ультразвуковой датчик дальности HC-SR04.очень надо но не могу разобраться.пожалуйста:cry:
 
Цитата
Алексей Захаренков пишет:
Добрый вечер,пожалуйста помогите ваш код подправить под ультразвуковой датчик дальности HC-SR04.очень надо но не могу разобраться.пожалуйста:cry:
Где analogRead(sensor) - правите на код получения данных с сенсора( как я понял ultrasonic.Ranging(CM)).

Ну и pinMode(sensor, INPUT); убрать.

ultrasonic.Ranging(CM) возвращает расстояние в сантиметрах, а ultrasonic.Ranging(INC) - в дюймах.
 
всеравно не понял:?:
Изменено: Алексей Захаренков - 26.12.2011 21:29:34
 
Цитата
Алексей Захаренков пишет:
всеравно не понял:?:
Вам код приведённый автором темы понятен(как он работает)?
 
можно ли разжевать подробнее:(
Изменено: Алексей Захаренков - 26.12.2011 21:37:04
 
да,но я не могу понять,как мне с моим сенсором быть!
#include
Servo echoServo;
int servoPin = 12; // цифровой выход 12 для сервомашики
int motor1 = 6; // скорость, левый
int motor1rev = 7; // направление, левый

int motor2 = 5; // скорость, правый
int motor2rev = 4; // направление, правый
int echo_on = 0; //Пин для включения эхо локатора
int echo_in = 3; //ШИМ выход, выдает импульс длительностью с шагом 147 мкс
unsigned long distance_con, distance; // хранения положительных целых чисел ,управлене растоянием,расстояние
int led = 13; // 13 вывод для светодиода

int echoval; // определение
int turnDelay = 600; // вычесление миллисекунд
const int stopDist = 300; // переменная до остановки на указанной дистанции
int servoDelay = 700; // пауза сервомашинки

void setup() // обновление функции старта скетча
 
Цитата
Алексей Захаренков пишет:
можно ли разжевать подробнее:(
Основы программирования объяснить я не могу - это очень сложно(объяснить). Из литературы даже не знаю что вам посоветовать... Почитайте что-нибудь типа "С для чайников".
ps если нужно просто запустить этот пример, то просто убираете pinMode(sensor, INPUT); и заменяете везде analogRead(sensor) на ultrasonic.Ranging(CM). И подключаете библиотеку сенсора.
 
этот датчик подключается на 2 pin а один echo_on а второй echo_in и как я понял int echo_on = 0; //Пин для включения эхо локатора
int echo_in = 3; //ШИМ выход, выдает импульс длительностью с шагом 147 мк
unsigned long distance_con, distance; // хранения положительных целых чисел ,управлене растоянием,расстояние
int echoval; // определение
const int stopDist = 300; // переменная до остановки на указанной дистанции
 
Цитата
Алексей Захаренков пишет:
этот датчик подключается на 2 pin а один echo_on а второй echo_in и как я понял int echo_on = 0; //Пин для включения эхо локатора
int echo_in = 3; //ШИМ выход, выдает импульс длительностью с шагом 147 мк
unsigned long distance_con, distance; // хранения положительных целых чисел ,управлене растоянием,расстояние
int echoval; // определение
const int stopDist = 300; // переменная до остановки на указанной дистанции
Где вы этот код нашли?

Упс, извиняюсь, про инициализацию забыл: тогда в начало программы(до setup()), добавляете
Ultrasonic ultrasonic(12,13); где 12 - пин echo_on. Где 13 - пин echo_in.
Остальное вам не нужно. Смотрите пример отсюда: http://www.robototehnika.ru/e-store/catalog/202/987/ Принцип работы датчика даже знать не нужно - просто читаете расстояние из программы и всё. Библиотека и длину импульса сама померяет.
 
можно вам на мыло скинуть мой код посмотреть?
 
Цитата
Алексей Захаренков пишет:
можно вам на мыло скинуть мой код посмотреть?
да,[мыло]
Изменено: parus - 26.12.2011 22:13:52
 
Цитата
Алексей Захаренков пишет:
можно вам на мыло скинуть мой код посмотреть?
А он не работает?
Страницы: 1 2 3 4 След.