123
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 212»
Модератор форума: nightmare, Huntswarrior, Aleks_Crow, {{TNT}} 
Форум » Проекты по робототехнике » Частные проекты » Робот- ИРПС (Сборка, планы на будущее, модернизация...)
Робот- ИРПС
Отправлено 10.08.2010 - 12:381
Администраторы
3319 сообщений
Мужчина
Всем привет !

Вот спустя пару месяцев я уже вплотную столкнулся с непосредственным программированием микроконтроллеров симейства Mega, фирмы Atmel.
Пока и по сей день пытаюсь потихоньку позновать новые хитрости программирования и отладки программы.

Платформа для робота уже готова. Корпус собран из бывших блоков ИРПС (какой-то блок последовательного согласования каналов surprised ). Это название я и оставил, придумав ему расшифровку: "Интеллектуальная Роботизированная Передвижная Система".

Тягу осуществляют два сервомотора H12K. Колеса от игрушки взял. Робот состоит из двух блоков, нижний-силовая часть, верхний-электроника. На самом верху блок с батарейками. По весу можно сказать что его будет трудновато сдвинуть на "мини-сумо", хотя это надо еще смотреть, так как по размерам он большеват. Для кегельринга, следования по линии, самое то )



Прикрепление
5576673.jpg(128Kb) · 3601106.png(38Kb)
Только дурак нуждается в порядке-гений господствует над хаосом...
Онлайн ЧАТ по робототехнике ! Заходи и общайся без регистрации =)
Профиль Личное сообщение Дом. страница icq Skype
31
Отправлено 11.08.2010 - 13:242
Администраторы
3319 сообщений
Мужчина
Dimsan,
да на первом этапе эти сойдут biggrin Они без труда всю конструкцию тянут wink
Вес: 500\+50 гр (батарейки)
В минисумо уже облом поучаствовать, зато в кегельринге, слаломе, и линии безпроблем. Но для линии и кеглей нужно будет тамия ставить, т.к. там скорость важна.

Добавлено (11.08.2010, 13:24)
---------------------------------------------
Как организовать аппаратный ШИМ ? Нужно ли подключать дополнительные библиотеки ?
Есть код, но, мой компилятор его не понимает. Использую CvAVR. Пишу на Си. smile



Только дурак нуждается в порядке-гений господствует над хаосом...
Онлайн ЧАТ по робототехнике ! Заходи и общайся без регистрации =)
Профиль Личное сообщение Дом. страница icq Skype
31
Отправлено 11.09.2010 - 13:333
Администраторы
3319 сообщений
Мужчина
- Так, ну с ШИМом вро де как разобрался, и с аппаратным, и с программным happy Так что двигаться мы уже умеем. smile
- Как раболтать с Sharpom тоже вроде как освоил.

На этого робота хочу поставить клешню клешню, и Sharp:

Добавлено (29.08.2010, 23:07)
---------------------------------------------
Ждем прихода посылочки с дальномером Sharp на 10-80 см, и блютус адаптер smile Будем управлять ботом, и "интеллектуально" обходить препятствия с sharpом biggrin

Добавлено (31.08.2010, 21:47)
---------------------------------------------
Готово новое видео:

1. Видео: Просто ездим, калибруем сервы

2. Видео: Калибруем датчик линии

Датчик линии в этой статье: http://rassionrobots.ucoz.ru/news/2009-08-15-25

3. Видео: Ездим в круге, не выезжая за пределы

Код программы на Си

Code
#include<mega16.h>   
#include<delay.h>

void servo1_position(int pos)
{
OCR1A = pos/2;   
}

void servo2_position(int pos)
{
OCR1B = pos/2;   
}
int i;
void main(void)
{    

//настраиваем Timer1
TCCR1A=0xA0;
TCCR1B=0x12;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=27; //максимальное знач-
ICR1L=10; //ение таймера
OCR1B=0x00;
OCR1A=0x00;

DDRD=0x30; //PORTD4 & PORTD5 сконфигурированы на выход

PORTC=0x00;
DDRC=0xFF;
PORTA=0x80;
DDRA=0X00;

MCUCSR |= 0x80;   
MCUCSR |= 0x80;

while(1) {   
//delay_ms(2000); //jdem 5 sec
servo1_position(1300); //edem pryamo
servo2_position(1500); //poka...

if (PINA.7==0)         //esli pC=1,
{
   //delay_ms(200);       //stop plavno
   servo1_position(1500);    //nazad
   servo2_position(1300);
   delay_ms(3500);           //stop plavno
   servo1_position(1500);     //povorot
   servo2_position(1500);
   delay_ms(2000);           //stop
}
}
}

Отдельная благодарность: nightmare что терпел мои тупые вопросы biggrin , dimsanchuk за поддержку wink

Добавлено (11.09.2010, 13:33)
---------------------------------------------
Добавлена функция видеонаблюдения, так что даже в темноте, мы узнаем где он ползает )



Только дурак нуждается в порядке-гений господствует над хаосом...
Онлайн ЧАТ по робототехнике ! Заходи и общайся без регистрации =)
Профиль Личное сообщение Дом. страница icq Skype
31
Отправлено 24.09.2010 - 01:094
Администраторы
3319 сообщений
Мужчина
Наконец-то пришла посылочка с дальномером Sharp
Буду изучать как с ним работать. Судя по примеру:

Code
#include <mega32.h>
#include <delay.h>
#define new_adc ADCSRA=0b11001110;
double adc_result;
unsigned int adc_data;
interrupt [ADC_INT] void adc_isr(void)
{
adc_data=ADCW;
}
   
double distance(void)
{
new_adc
return ((adc_data*2.56)/1024);
}
   
void forward()
{
if(PINB!=0b00000101)
PORTB = 0b00000101;
}
void backward()
{
if(PINB!=0b00001010)
  PORTB =0b00001010;
}
void right()
{
if(PINB!=0b00000110)
PORTB=0b00000110;
}
void left()
{
  if(PINB!=0b00001001)
  PORTB = 0b00001001;
}
void stop()
{
  PORTB = 0x00;
}
   
void main (void)
{
ADMUX=0b11000001;
ADCSRA=0b10001110;
while(1)
{
  forward();
  if(distance() >1.7) //если напряжение на дальномере больше 1.7 вольт (~30см)
  {
  backward(); //едем назад
  delay_ms(500);
  right(); //поворачиваем направо
  delay_ms(500);
  }
}
}

Краткие вопросы:
1. ADCSRA=0b11001110; // -это тот порт, точнее номер его ножки, к которому подключен дальномер ?
2. ADMUX=0b11000001; // -это ... ?
3. ADCSRA=0b10001110; // -это ... ?
4. Что есть запись 2.56/1024... 2.56 - макс вольтаж ?, 1024 - ... ?

Судя по моему дальномеру, а у меня Sharp GP2Y0A21YK0F:
Схема расчета замеров напряжения исходя из расстояния

Следовательно при расстоянии 5 см мы будим иметь максимальное выходное напряжение в 3,.. вольта. При 80 см это будет 0.5 вольт и меньше, все зависит от качества качества отраженного сигнала.

Добавлено (24.09.2010, 01:09)
---------------------------------------------
А, понял, 2.56-это ионистр, 1024-биты ? wacko



Прикрепление
4701597.jpg(53Kb)
Только дурак нуждается в порядке-гений господствует над хаосом...
Онлайн ЧАТ по робототехнике ! Заходи и общайся без регистрации =)
Профиль Личное сообщение Дом. страница icq Skype
31
Отправлено 24.09.2010 - 10:015
Участник +
134 сообщений
Мужчина
2,56 это максимальное напряжение, ему соответствует минимальное расстояние 10см. 1024-разрядность, 10 Бит


Профиль Личное сообщение Дом. страница icq Skype
3
Отправлено 24.09.2010 - 10:406
Администраторы
3319 сообщений
Мужчина
pashteet,
а к какой ноге там шарп подлючен ? smile


Только дурак нуждается в порядке-гений господствует над хаосом...
Онлайн ЧАТ по робототехнике ! Заходи и общайся без регистрации =)
Профиль Личное сообщение Дом. страница icq Skype
31
Отправлено 24.09.2010 - 10:467
Участник +
134 сообщений
Мужчина
Не знаю, я в С++ не силен biggrin


Профиль Личное сообщение Дом. страница icq Skype
3
Отправлено 24.09.2010 - 11:018
Администраторы
3319 сообщений
Мужчина
pashteet,
А, на бейсике пишешь ? )
P.s: это Си (не ++) wink


Только дурак нуждается в порядке-гений господствует над хаосом...
Онлайн ЧАТ по робототехнике ! Заходи и общайся без регистрации =)
Профиль Личное сообщение Дом. страница icq Skype
31
Отправлено 24.09.2010 - 11:289
Участник +
134 сообщений
Мужчина
На бэйсике - да


Профиль Личное сообщение Дом. страница icq Skype
3
Отправлено 24.09.2010 - 18:1810
Начальная группа
1798 сообщений
Мужчина
2.56 к ионистору не имеет отношения, инонистоар в мк тоже нет))
Это опорное напряжение.
Напряжение на выходе дальномера доходит до 3 с лишним вольт, подключи дальномер к АЦП через делитель напряжения на 2 (после измерения результат надо будет умножить на два), иначе минимальное расстояние, которое покажет дальномер - это 9 см примерно.
Вообще переменную adc_data можно сделать типа unsigned char, особая точность здесь не нужна, так даже стабильнее будет и быстрее.
При этом напряжение на входе ацп считается по формуле: (adc_data*2.56)/255
Quote

1. ADCSRA=0b11001110; // -это тот порт, точнее номер его ножки, к которому подключен дальномер ?

Нет, это ADC Control and Status регистр, в который записано число 11001110.
Каждый бит выполняет какую-то функцию, например 6-ой бит запускает АЦ преобразование.
Quote

2. ADMUX=0b11000001; // -это ... ?

Это мультиплексор, он выбирает какой канал АЦП использовать.
В кодевизарде к сожалению выбрать канал нельзя...
Но можно в даташите посмотреть, там есть табличка.
Quote

3. ADCSRA=0b10001110; // -это ... ?

это ADC Control and Status регистр, в который записано число 10001110.
Quote
Не знаю, я в С++ не силен

Здесь не надо СИ знать, тут надо в регистрах "рубить" smile
В бейсике это дело похоже опущено.


Профиль Личное сообщение Дом. страница icq Skype
37
Отправлено 24.09.2010 - 18:4911
Участник +
134 сообщений
Мужчина
Да, там с регистрами все просто, все описывается словами smile Этим мне Си не нравиться, пока весь даташит не перелопатишь фиг че придумаешь =)


Профиль Личное сообщение Дом. страница icq Skype
3
Администраторы
3319 сообщений
Мужчина
Quote (nightmare)
2. ADMUX=0b11000001; // -это ... ? Это мультиплексор, он выбирает какой канал АЦП использовать. В кодевизарде к сожалению выбрать канал нельзя... Но можно в даташите посмотреть, там есть табличка.

- а, то есть из 8 каналов мы подключаем нужные... Вроде понятно, надо дш еще глянуть. smile


Только дурак нуждается в порядке-гений господствует над хаосом...
Онлайн ЧАТ по робототехнике ! Заходи и общайся без регистрации =)
Профиль Личное сообщение Дом. страница icq Skype
31
Отправлено 24.09.2010 - 19:3013
Начальная группа
1798 сообщений
Мужчина
Табличка на странице 215.


Профиль Личное сообщение Дом. страница icq Skype
37
Администраторы
3319 сообщений
Мужчина
Ок

Добавлено (25.09.2010, 23:43)
---------------------------------------------
- 1 Sharp manythought

Добавлено (25.09.2010, 23:44)
---------------------------------------------
А прога такая:

Code
/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.8 Professional
Automatic Program Generator
© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
Avtor^ Melnikov Sergey

Project :  
Version :  
Date    : 25.09.2010
Author  : F4CG                             
Company : F4CG                             
Comments:  

Chip type           : ATmega32L
Program type        : Application
Clock frequency     : 7,372800 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 512
*****************************************************/

#include <mega32.h>
#include<delay.h>
#define new_adc ADCSRA=0b11001001;  
double adc_result;  
unsigned int adc_data;

   
//1 ïèøåì ôóíêöèþ äëÿ ñåðâ
void servo1_position(int pos)
{
OCR1A = pos/2;  
}

void servo2_position(int pos)
{
OCR1B = pos/2;  
}
//int i;   
//1 END

//2 ïèøåì ôóíêöèþ äëÿ ðàñ÷åòà ðàññòîÿíèÿ
interrupt [ADC_INT] void adc_isr(void)  
{  
adc_data=ADCW;  
}  
     
double distance(void)  
{  
new_adc  
return ((adc_data*3.00)/1024);  
}  
//2 END

void main(void)
{

    // MCUCSR |= 0x80;  
    // MCUCSR |= 0x80;
     //3 ïîäêëþ÷àåì âñå íåîáõîäèìîå äëÿ ØÈÌà
     TCCR1A=0xA0;
     TCCR1B=0x12;
     TCNT1H=0x00;
     TCNT1L=0x00;
     ICR1H=27; //ìàêñèìàëüíîå çíà-
     ICR1L=10; //÷åíèå òàéìåðà
     OCR1B=0x00;
     OCR1A=0x00;
     //3 END

//4 ïîäêëþ÷àåì àöï íà íîãå ADC1  
ADMUX=0b00000001;  
ADCSRA=0b10001001;
//4 END

     //5 êîíôèãóðèðóåì íàøè ïîðòû
     DDRD=0x30; //PORTD4 & PORTD5 ñêîíôèãóðèðîâàííû íà âûõîä
     PORTC=0x00;
     DDRC=0xFF;
     PORTA=0x00;
     DDRA=0X00;
     //5 END

//6 Îñíîâíûå äåéñòâèÿ íàøåé ïðîãè
while(1)  
{ servo1_position(1700); //åäåì âïåðåä
   servo2_position(1700);  
   if(distance() >0.5) //åñëè ðàññòîÿíèå áîëüøå 0.5 â âîëüòàõ (ýòî 60 ñì), òî
   {  
   servo1_position(1300); //åäåì íàçàä  
   servo1_position(1300);
   delay_ms(600);  

   servo1_position(1300); //ïîâîðîò  
   servo1_position(1700);
   delay_ms(600);  
   }  
}  
}


Только дурак нуждается в порядке-гений господствует над хаосом...
Онлайн ЧАТ по робототехнике ! Заходи и общайся без регистрации =)
Профиль Личное сообщение Дом. страница icq Skype
31
Отправлено 26.09.2010 - 16:4015
Начальная группа
1798 сообщений
Мужчина
Code
  
servo1_position(1300); //aaai iacaa   
    servo1_position(1300);  
    delay_ms(600);   

    servo1_position(1300); //iiai?io   
    servo1_position(1700);  
    delay_ms(600);  

Какой смысл так делать?
Логичнее так:
Code

    servo1_position(1300);  
    delay_ms(600);    
    servo1_position(1700);  
    delay_ms(600);  


Профиль Личное сообщение Дом. страница icq Skype
37
Форум » Проекты по робототехнике » Частные проекты » Робот- ИРПС (Сборка, планы на будущее, модернизация...)
Страница 1 из 212»
Поиск: