roboforum.ru

Технический форум по робототехнике.

 

Помогите с ик-датчиком

Обсуждение и примеры готовых и самосборных компонент для построения роботов.

Помогите с ик-датчиком

Сообщение gambit6 » 28 июн 2007, 16:06

Здравствуйте, есть у меня датчик GP2D120, есть готовая трехколесная платформа, есть программа. Но никак не могу
подключить датчик к роботу. Помогите пожалуйста подключить датчик и дописать программу. Программа написана на AVREdit если у вас есть подобная программа на другом компиляторе буду очень признателен.
Ниже привожу исходник программы.

Код: Выделить всёРазвернуть
//------------------------------------------------------------------------
// Окончательный вариант программы для простого мобильного робота
// http://projects.roboclub.ru/index.shtml?attempt
// (с) RodoClub.ru 2003
//------------------------------------------------------------------------

#include <inttypes.h>
#include <io.h>
#include <sig-avr.h>
#include <interrupt.h>
#include <stdlib.h>

// назначение определений для удобства работы с периферией
#define OUT PORTB
#define MOTOR_F  PB7
#define MOTOR_B  PB6
#define TURN_R   PB5
#define TURN_L   PB4

#define IN PIND
#define LIGHT_R  PD0
#define LIGHT_L  PD1
#define BUMPER_F PD2
#define BUMPER_B PD3

// Возможные режимы движения
enum {STOP, F, FR, FL, B, BR, BL};

//------------------------------------------------------------------------------
// Задержка t х 10ms
//------------------------------------------------------------------------------
#define F_CPU 4000000
#define K_DELAY_10ms   F_CPU/600
void Delay_10ms(unsigned char t) {
 unsigned int i;
 if (t==0) return;
 while (t--) for(i=0;i<K_DELAY_10ms; i++);
}

// таблица вероятностей для выбора направления движения
// исходя из текущего направления движения
unsigned char p[7][7] = {
{14,   43,   57,   71,   86,   93,   100},
{7,   43,   71,   100,   100,   100,   100},
{7,   50,   93,   100,   100,   100,   100},
{7,   50,   57,   100,   100,   100,   100},
{29,   29,   29,   29,   57,   79,   100},
{36,   36,   36,   36,   71,   93,   100},
{36,   36,   36,   36,   71,   79,   100},
};

// текущее направление движения
unsigned char this_move;

//------------------------------------------------------------------------------
// Включение комбинации моторов для движения в заданном направлении
//------------------------------------------------------------------------------
void go(unsigned char direction){

 switch (direction) {
 case STOP:
   cbi(OUT, MOTOR_F);
   cbi(OUT, MOTOR_B);
   cbi(OUT, TURN_R);
   cbi(OUT, TURN_L);
   break;

 case F:
   sbi(OUT, MOTOR_F);
   cbi(OUT, MOTOR_B);
   cbi(OUT, TURN_R);
   cbi(OUT, TURN_L);
   break;

 case FR:
   sbi(OUT, MOTOR_F);
   cbi(OUT, MOTOR_B);
   sbi(OUT, TURN_R);
   cbi(OUT, TURN_L);
   break;

 case FL:
   sbi(OUT, MOTOR_F);
   cbi(OUT, MOTOR_B);
   cbi(OUT, TURN_R);
   sbi(OUT, TURN_L);
   break;

 case B:
   cbi(OUT, MOTOR_F);
   sbi(OUT, MOTOR_B);
   cbi(OUT, TURN_R);
   cbi(OUT, TURN_L);
   break;

 case BR:
   cbi(OUT, MOTOR_F);
   sbi(OUT, MOTOR_B);
   sbi(OUT, TURN_R);
   cbi(OUT, TURN_L);
   break;

 case BL:
   cbi(OUT, MOTOR_F);
   sbi(OUT, MOTOR_B);
   cbi(OUT, TURN_R);
   sbi(OUT, TURN_L);
   break;
 }
}

//------------------------------------------------------------------------------
// Выбор направления движения в следующем шаге по таблице вероятностей
//------------------------------------------------------------------------------
unsigned char next_move(void){
  unsigned char pp, i;

  pp = rand()/327;     // получаем случайное число 0..99
  for (i=0;i<7;i++){   // ищем соответствие в таблице вероятностей
     if (p[this_move][i] > pp) break;
  }
  this_move = i;       // записываем новое полученное направление как текущее
  return(i);
}

//------------------------------------------------------------------------------
// Обработка прерывания от переднего бампера (INT0 = PD2)
//------------------------------------------------------------------------------
SIGNAL(SIG_INTERRUPT0)
{
  if(this_move==FR) go(BL);
  if(this_move==FL) go(BR);
  else go(B);
  Delay_10ms(250);    // отъезд в течение 2.5 х 2 сек
  Delay_10ms(250);
  this_move=B;
}

//------------------------------------------------------------------------------
// Обработка прерывания от заднего бампера (INT1 = PD3)
//------------------------------------------------------------------------------
SIGNAL(SIG_INTERRUPT1)
{
  if(this_move==BR) go(FL);
  if(this_move==BL) go(FR);
  else go(F);
  Delay_10ms(250);    // отъезд в течение 2.5 х 2 сек
  Delay_10ms(250);
  this_move=F;
}

//------------------------------------------------------------------------------
// "Случайное блуждание"
//------------------------------------------------------------------------------
unsigned char walk(void){
  // этот цикл организует "свободное блуждание" пока
  // нет сигнала ни от одного из датчиков освещенности
  while((bit_is_set(IN, LIGHT_R)) && (bit_is_set(IN, LIGHT_L))){
      go(next_move());   // получаем следующее направление движения и
      Delay_10ms(250);   // движемся в этом направлении 2.5 сек
  }
  // этот цикл организует движение на свет, пока
  // есть сигнал хотя бы от одного из датчиков освещенности
  while((bit_is_clear(IN, LIGHT_R)) || (bit_is_clear(IN, LIGHT_L))){
      if((bit_is_clear(IN, LIGHT_R)) && (bit_is_clear(IN, LIGHT_L))) go(F);
      else if(bit_is_clear(IN, LIGHT_R)) go(FR);
      else if(bit_is_clear(IN, LIGHT_L)) go(FL);
  }

  return(0);
}

//------------------------------------------------------------------------------
// Главная программа
//------------------------------------------------------------------------------
int main(void)
{
 DDRB  = 0xff;  // назначаем все линии порта B на выход
 PORTB = 0x00;  // и устанавливаем на них низкий уровень

 DDRD  = 0x00;  // назначаем все линии порта D на вход
 PORTD = 0xff;  // подключаем внутренние нагрузочные резисторы

 // разрешаем прерывания int0 и int1
 outb(GIMSK, (1<<INT0)|(1<<INT1));

 // запрос на прерывание - по спадающим фронтам на int0 и int1
 outb(MCUCR, (1<<ISC01)|(1<<ISC11));

 // разрешаем прерывания
 sei();          

 // запускаем главный цикл
 while(1) walk();

}

please use CODE bb-code! <V>
Аватара пользователя
gambit6
 
Сообщения: 189
Зарегистрирован: 10 янв 2005, 12:18
Откуда: Санкт-Петербург

Сообщение Виталий » 01 июл 2007, 23:53

Где датчик взял?
Аватара пользователя
Виталий
 
Сообщения: 2114
Зарегистрирован: 08 окт 2004, 16:43
Откуда: St. Petersburg
Skype: quark-bot
ФИО: Клебан Виталий

Сообщение Сергей » 02 июл 2007, 00:06

[off]Хе, я тоже хотел спросить)[/off]
Сергей
 
Сообщения: 3741
Зарегистрирован: 29 дек 2004, 23:15
Откуда: Санкт-Петербург
прог. языки: C, C++, C#, Asm
ФИО: Кашликов Сергей

Сообщение gambit6 » 03 июл 2007, 18:49

Давно купил на робоклубе. Кстати у меня их 2 если кто поможет с подключением отдам второй бесплатно.
Аватара пользователя
gambit6
 
Сообщения: 189
Зарегистрирован: 10 янв 2005, 12:18
Откуда: Санкт-Петербург

Сообщение Виталий » 03 июл 2007, 19:03

Поможем чем сможем =)
Для начала скажите, какой вы используете контроллер на роботе?
Аватара пользователя
Виталий
 
Сообщения: 2114
Зарегистрирован: 08 окт 2004, 16:43
Откуда: St. Petersburg
Skype: quark-bot
ФИО: Клебан Виталий

Сообщение gambit6 » 03 июл 2007, 22:07

Контроллер ATMega16. Там встроенный генератор частоты, который можно перепрограмить...
CSEL ячейки, по-моему называется. Я его перенастроил на на 4 мегагерца. Для драйвера двигателя использована
микросхема L293D. Ходовая часть трехколесная. Программа робота была взята со старого сайта
робоклуба, она написана AVREdit 3.5  (Хотелось бы на более современном компиляторе)
Никак не могу подключить датчик для обнаружения препятствия, чтобы при возникновении на пути робота
чего-либо он отъезжал назад.
Датчик GP2D120, что с ним делать (как подключать) и как дописывать или переписывать
программу вообще не могу разобраться! ПОМОГИТЕ!
Аватара пользователя
gambit6
 
Сообщения: 189
Зарегистрирован: 10 янв 2005, 12:18
Откуда: Санкт-Петербург

Сообщение Vooon » 03 июл 2007, 22:39

gambit6 писал(а):Контроллер ATMega16. Там встроенный генератор частоты, который можно перепрограмить...
CSEL ячейки, по-моему называется. Я его перенастроил на на 4 мегагерца. Для драйвера двигателя использована
микросхема L293D. Ходовая часть трехколесная. Программа робота была взята со старого сайта
робоклуба, она написана AVREdit 3.5  (Хотелось бы на более современном компиляторе)  это лишь оболочка для gcc (WinAVR) так что мона работать и на более новых :)
Никак не могу подключить датчик для обнаружения препятствия, чтобы при возникновении на пути робота
чего-либо он отъезжал назад.
Датчик GP2D120, что с ним делать (как подключать) и как дописывать или переписывать   а ДШ посмотреть??? а потом понять что нуно к АЦП подрубить
программу вообще не могу разобраться! ПОМОГИТЕ!
Вложения
Безымянное.png
скрин из ДШ
Аватара пользователя
Vooon
Site Admin
 
Сообщения: 3324
Зарегистрирован: 09 фев 2006, 15:36
Откуда: Москва
Skype: vooon341
прог. языки: Python, C, Bash, JavaScript, C++, PHP
ФИО: Владимир Ермаков

Сообщение gambit6 » 03 июл 2007, 23:36

Спасибо за схемку, а что с программой делать?
Аватара пользователя
gambit6
 
Сообщения: 189
Зарегистрирован: 10 янв 2005, 12:18
Откуда: Санкт-Петербург

Сообщение gambit6 » 03 июл 2007, 23:45

Есле можно то на пальцах по поводу АЦП, желательно с примерами, а лучше прям по этой проге как можно реализовать?
Аватара пользователя
gambit6
 
Сообщения: 189
Зарегистрирован: 10 янв 2005, 12:18
Откуда: Санкт-Петербург

Сообщение Vooon » 04 июл 2007, 00:15

почитай чтоль http://www.123avr.com/index.html
пс: авр твое? это мне уже боле-менее нравится хотя помойки все равно много
псс: попробуй перенести несколько статей на вику - может получится лучше и развитие курса пойдет в лучшую сторону.
пссс: проект nix-06.nm.ru к сожалению похоже мертв, но там есть материал которому стоит поучиться
Последний раз редактировалось Vooon 11 июл 2007, 00:25, всего редактировалось 1 раз.
Аватара пользователя
Vooon
Site Admin
 
Сообщения: 3324
Зарегистрирован: 09 фев 2006, 15:36
Откуда: Москва
Skype: vooon341
прог. языки: Python, C, Bash, JavaScript, C++, PHP
ФИО: Владимир Ермаков

Сообщение gambit6 » 10 июл 2007, 23:42

А ни у кого случаем нет готовой проги для подобного робота? Очень хотелось бы посмотреть на живом примере.
А то я запутался окончательно.
Аватара пользователя
gambit6
 
Сообщения: 189
Зарегистрирован: 10 янв 2005, 12:18
Откуда: Санкт-Петербург


Вернуться в Готовые модули

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Mail.ru counter