roboforum.ru

Технический форум по робототехнике.
Текущее время: 02 май 2025, 00:58

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: Помогите с ик-датчиком
СообщениеДобавлено: 28 июн 2007, 16:06 
Не в сети
Аватара пользователя

Зарегистрирован: 10 янв 2005, 12:18
Сообщения: 189
Откуда: Санкт-Петербург
Здравствуйте, есть у меня датчик 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>


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 01 июл 2007, 23:53 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 02 июл 2007, 00:06 
Не в сети

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 03 июл 2007, 18:49 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 03 июл 2007, 19:03 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 03 июл 2007, 22:07 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 03 июл 2007, 22:39 
Не в сети
Site Admin
Аватара пользователя

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


Вложения:
Комментарий к файлу: скрин из ДШ
Безымянное.png
Безымянное.png [ 23.15 КиБ | Просмотров: 3298 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 03 июл 2007, 23:36 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 03 июл 2007, 23:45 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 04 июл 2007, 00:15 
Не в сети
Site Admin
Аватара пользователя

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


Последний раз редактировалось Vooon 11 июл 2007, 00:25, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 10 июл 2007, 23:42 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Часовой пояс: UTC + 4 часа


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO