Форум myROBOT.ru » Шаг за шагом » Делаем роботов » Простой робот :)

Страниц (13): « 1 [2] 3 4 5 6 7 8 9 ... » В конец
 

16. mihail - 22 Мая, 2011 - 20:35:08 - перейти к сообщению
Раздельное питание Улыбка
17. mihail - 23 Мая, 2011 - 02:03:39 - перейти к сообщению
Проверочная программа и схема.
/*******************************************
Program : test robot
Compiler : WinAVR
Chip type : ATtiny2313
System Clock : 1 MHz
*******************************************/

#include <avr/io.h>
#include <util/delay.h>

int main (void)
{
PORTA = 0b00000000;
PORTB = 0b00000000;
PORTD = 0b00000000;

DDRA = 0b00000000;
DDRB = 0b00000000;
DDRD = 0b00111100;

unsigned char i = 0;

while (1)
{
/* поворачиваем в одну сторону */
for(i=0; i<200; i++)
{
PORTD |= 0b00000100; /* установка 1 на PD2 */
_delay_us(1000); /* задержка */
PORTD &= 0b11111011; /* установка 0 на PD2 */

PORTD |= 0b00001000; /* установка 1 на PD3 */
_delay_us(1000); /* задержка */
PORTD &= 0b11110111; /* установка 0 на PD3 */

PORTD |= 0b00010000; /* установка 1 на PD4 */
_delay_us(1000); /* задержка */
PORTD &= 0b11101111; /* установка 0 на PD4 */

PORTD |= 0b00100000; /* установка 1 на PD5 */
_delay_us(1000); /* задержка */
PORTD &= 0b11011111; /* установка 0 на PD5 */

_delay_ms(16); /* задержка */
}

_delay_ms(1000); /* стоим на месте */

/* поворачиваем в другую сторону */
for(i=0; i<200; i++)
{
PORTD |= 0b00000100; /* установка 1 на PD2 */
_delay_us(2000); /* задержка */
PORTD &= 0b11111011; /* установка 0 на PD2 */

PORTD |= 0b00001000; /* установка 1 на PD3 */
_delay_us(2000); /* задержка */
PORTD &= 0b11110111; /* установка 0 на PD3 */

PORTD |= 0b00010000; /* установка 1 на PD4 */
_delay_us(2000); /* задержка */
PORTD &= 0b11101111; /* установка 0 на PD4 */

PORTD |= 0b00100000; /* установка 1 на PD5 */
_delay_us(2000); /* задержка */
PORTD &= 0b11011111; /* установка 0 на PD5 */

_delay_ms(12); /* задержка */
}

_delay_ms(1000); /* стоим на месте */
}

return 0;
}
18. cjA - 23 Мая, 2011 - 03:38:56 - перейти к сообщению
mihail пишет:
робот соответствует требованиям регламента простого кегельринга

mihail пишет:
Есть кое какие мыслишки


неужели лазание по канату? Жуть
19. mihail - 23 Мая, 2011 - 15:20:13 - перейти к сообщению
Схема иллюстрирующая раздельное питание.
20. mihail - 31 Мая, 2011 - 11:21:13 - перейти к сообщению
Почти сделал пульт дистанционного управления для робота.
21. mihail - 31 Мая, 2011 - 11:23:06 - перейти к сообщению
Подключение TSOP 2136 к контроллеру. Надо сказать, что подключение не совсем правильное. Правильное подключение TSOPиков смотрите http://myrobot.ru/wiki/index.php...rojects.MyLINKER
22. mihail - 31 Мая, 2011 - 23:08:12 - перейти к сообщению
Тестовая программа и схема ПДУ.
/*******************************************
Program : simple transmitter
Compiler : WinAVR
Chip type : ATtiny2313
System Clock : 8 MHz
*******************************************/


#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>


volatile unsigned char count = 0;


// Timer 0 overflow interrupt service routine
ISR(TIMER0_OVF_vect)
{
TCNT0 = 160;

PORTD ^= 0b00000010;

count += 1;

if( count == 80 )
{
TCCR0B = 0b00000000;
}
}


int main(void)
{
// System Clock Prescaler initialization

// Clock Prescale Register
// Bits: CLKPCE - - - CLKPS3 CLKPS2 CLKPS1 CLKPS0
CLKPR = 0b10000000;
CLKPR = 0b00000000;


// Input/Output Ports initialization

// Port A initialization
DDRA = 0b00000000;
PORTA = 0b00000000;

// Port B initialization
DDRB = 0b00000000;
PORTB = 0b11111111;

// Port D initialization
DDRD = 0b00000010;
PORTD = 0b00000000;


// Timer/Counter 0 initialization

// Timer/Counter 0 Control Register A
// Bits: COM0A1 COM0A0 COM0B1 COM0B0 Reserved Reserved WGM01 WGM00
TCCR0A = 0b00000000;

// Timer/Counter 0 Control Register B
// Bits: FOC0A FOC0B Reserved Reserved WGM02 CS02 CS01 CS00
TCCR0B = 0b00000000;

// Timer/Counter 0
TCNT0 = 160;


// Timer(s)/Counter(s) Interrupt(s) initialization

// Timer/Counter Interrapt Mask Register
// Bits: TOIE1 OCIE1A OCIE1B Reserved ICIE1 OCIE0B TOIE0 OCIE0A
TIMSK = 0b00000010;


// Global enable interrupts
sei();


while(1)
{
while( PINB == 0b11111111 );

_delay_ms(100);

count = 0;
TCCR0B = 0b00000001;
while( count != 80 );

if( (PINB & (1<<3)) == 0 )
{
_delay_us(500);
}

if( (PINB & (1<<4)) == 0 )
{
_delay_us(2500);
}

count = 0;
TCCR0B = 0b00000001;
while( count != 80 );

while( PINB != 0b11111111 );

_delay_ms(100);
}

return 0;
}
23. mihail - 31 Мая, 2011 - 23:10:36 - перейти к сообщению
Тестовая программа робота и схема подключения TSOP.
/*******************************************
Program : simple receiver
Compiler : WinAVR
Chip type : ATtiny2313
System Clock : 1 MHz
*******************************************/

#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
// Input/Output Ports initialization

// Port A initialization
DDRA = 0b00000000;
PORTA = 0b00000000;

// Port B initialization
DDRB = 0b00000000;
PORTB = 0b10000000;

// Port D initialization
DDRD = 0b00111100;
PORTD = 0b00000000;

unsigned char i;
unsigned char flag;

while(1)
{
flag = 0;
while( (PINB & (1<<7)) != 0 );
_delay_us(2000);
if( (PINB & (1<<7)) != 0 ) flag = 1;
else flag = 2;

if( flag == 1 )
{
/* поворачиваем */
for(i=0; i<50; i++)
{
PORTD |= 0b00000100; /* установить 1 на PD2 */
_delay_us(1000); /* задержка */
PORTD &= 0b11111011; /* установить 0 на PD2 */

PORTD |= 0b00001000; /* установить 1 на PD3 */
_delay_us(1000); /* задержка */
PORTD &= 0b11110111; /* установить 0 на PD3 */

PORTD |= 0b00010000; /* установить 1 на PD4 */
_delay_us(1000); /* задержка */
PORTD &= 0b11101111; /* установить 0 на PD4 */

PORTD |= 0b00100000; /* установить 1 на PD5 */
_delay_us(1000); /* задержка */
PORTD &= 0b11011111; /* установить 0 на PD5 */

_delay_ms(16); /* задержка */
}
}

if( flag == 2 )
{
/* едем прямо */
for(i=0; i<50; i++)
{
PORTD |= 0b00000100; /* установить 1 на PD2 */
_delay_us(2000); /* задержка */
PORTD &= 0b11111011; /* установить 0 на PD2 */

PORTD |= 0b00001000; /* установить 1 на PD3 */
_delay_us(2000); /* задержка */
PORTD &= 0b11110111; /* установить 0 на PD3 */

PORTD |= 0b00010000; /* установитьа 1 на PD4 */
_delay_us(1000); /* задержка */
PORTD &= 0b11101111; /* установить 0 на PD4 */

PORTD |= 0b00100000; /* установить 1 на PD5 */
_delay_us(1000); /* задержка */
PORTD &= 0b11011111; /* установить 0 на PD5 */

_delay_ms(14); /* задержка */
}
}
}

return 0;
}
24. nest - 31 Мая, 2011 - 23:11:16 - перейти к сообщению
mihail пишет:
и схема ПДУ
а чем кодируем?
25. mihail - 31 Мая, 2011 - 23:25:20 - перейти к сообщению
Хороший вопрос. Может картинку надо нарисовать?
При нажатии кнопки пульт генерирует две пачки по 40 импульсов. Продолжительность задержки между пачками определяет нажатую кнопку. Проще можно, но дальше некуда Улыбка
26. nest - 01 Июня, 2011 - 00:26:52 - перейти к сообщению
mihail пишет:
При нажатии кнопки пульт генерирует две пачки по 40 импульсов. Продолжительность задержки между пачками определяет нажатую кнопку.
хм, ну... гуд Улыбка дёшево-сердито Улыбка
27. mihail - 11 Июня, 2011 - 13:02:30 - перейти к сообщению
Сделал приемлемое управление роботом.
Программа пульта:
/*******************************************
Program : transmitter
Compiler : WinAVR
Chip type : ATtiny2313
System Clock : 8 MHz
*******************************************/


#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>


volatile unsigned char count = 0;


// Timer 0 overflow interrupt service routine
ISR(TIMER0_OVF_vect)
{
TCNT0 = 160;

PORTD ^= 0b01000000;

count += 1;

if( count == 80 )
{
TCCR0B = 0b00000000;
}
}


int main(void)
{
// System Clock Prescaler initialization

// Clock Prescale Register
// Bits: CLKPCE - - - CLKPS3 CLKPS2 CLKPS1 CLKPS0
CLKPR = 0b10000000;
CLKPR = 0b00000000;


// Input/Output Ports initialization

// Port A initialization
DDRA = 0b00000000;
PORTA = 0b00000000;

// Port B initialization
DDRB = 0b00000000; // PB4, PB3, PB2, PB1, PB0 - button
PORTB = 0b11111111;

// Port D initialization
DDRD = 0b01000000; // PD6 - LED
PORTD = 0b00000000;


// Timer/Counter 0 initialization

// Timer/Counter 0 Control Register A
// Bits: COM0A1 COM0A0 COM0B1 COM0B0 Reserved Reserved WGM01 WGM00
TCCR0A = 0b00000000;

// Timer/Counter 0 Control Register B
// Bits: FOC0A FOC0B Reserved Reserved WGM02 CS02 CS01 CS00
TCCR0B = 0b00000000;

// Timer/Counter 0
TCNT0 = 160;


// Timer(s)/Counter(s) Interrupt(s) initialization

// Timer/Counter Interrapt Mask Register
// Bits: TOIE1 OCIE1A OCIE1B Reserved ICIE1 OCIE0B TOIE0 OCIE0A
TIMSK = 0b00000010;


// Global enable interrupts
sei();


while(1)
{
while( PINB != 0b11111111 );
_delay_ms(100);

while( PINB == 0b11111111 );
_delay_ms(100);

count = 0;
TCCR0B = 0b00000001;
while( count != 80 );

if( PINB == 0b11111110 )
{
_delay_us(500);
}

if( PINB == 0b11111101 )
{
_delay_us(2500);
}

if( PINB == 0b11111011 )
{
continue;
}

if( PINB == 0b11110111 )
{
_delay_us(4500);
}

if( PINB == 0b11101111 )
{
_delay_us(6500);
}

count = 0;
TCCR0B = 0b00000001;
while( count != 80 );
}

return 0;
}

(Добавление)
Программа робота:
/*******************************************
Program : receiver
Compiler : WinAVR
Chip type : ATtiny2313
System Clock : 2 MHz
*******************************************/


#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>


volatile unsigned char count = 0;
volatile unsigned char var_1000 = 0b11111111;


// Timer 0 overflow interrupt service routine
ISR(TIMER0_OVF_vect)
{
if( count == 0 )
{
PORTD |= 0b00111100;
}

if( count == 7 )
{
PORTD &= var_1000;
}

if( count == 15 )
{
PORTD &= 0b11000011;
}

count += 1;

if( count == 156 )
{
count = 0;
}
}


volatile unsigned char flag = 0;


int main(void)
{
// System Clock Prescaler initialization

// Clock Prescale Register
// Bits: CLKPCE - - - CLKPS3 CLKPS2 CLKPS1 CLKPS0
CLKPR = 0b10000000;
CLKPR = 0b00000010;


// Input/Output Ports initialization

// Port A initialization
DDRA = 0b00000000;
PORTA = 0b00000000;

// Port B initialization
DDRB = 0b00000000;
PORTB = 0b10000000;

// Port D initialization
DDRD = 0b00111100;
PORTD = 0b00000000;


// Timer/Counter 0 initialization

// Timer/Counter 0 Control Register A
// Bits: COM0A1 COM0A0 COM0B1 COM0B0 Reserved Reserved WGM01 WGM00
TCCR0A = 0b00000000;

// Timer/Counter 0 Control Register B
// Bits: FOC0A FOC0B Reserved Reserved WGM02 CS02 CS01 CS00
TCCR0B = 0b00000000;

// Timer/Counter 0
TCNT0 = 0;


// Timer(s)/Counter(s) Interrupt(s) initialization

// Timer/Counter Interrapt Mask Register
// Bits: TOIE1 OCIE1A OCIE1B Reserved ICIE1 OCIE0B TOIE0 OCIE0A
TIMSK = 0b00000010;


// Global enable interrupts
sei();


while(1)
{
flag = 0;
while( (PINB & (1<<7)) != 0 );
_delay_us(2000);
if( (PINB & (1<<7)) == 0 ) flag = 1;
_delay_us(2000);
if( (PINB & (1<<7)) == 0 ) flag = 2;
_delay_us(2000);
if( (PINB & (1<<7)) == 0 ) flag = 3;
_delay_us(2000);
if( (PINB & (1<<7)) == 0 ) flag = 4;

if( flag == 1 )
{
/* едем прямо */
var_1000 = 0b11001111;
TCCR0B = 0b00000001;
}

if( flag == 2 )
{
/* поворачиваем */
var_1000 = 0b11000011;
TCCR0B = 0b00000001;
}

if( flag == 3 )
{
/* поворачиваем */
var_1000 = 0b11111111;
TCCR0B = 0b00000001;
}

if( flag == 4 )
{
/* едем назад */
var_1000 = 0b11110011;
TCCR0B = 0b00000001;
}

_delay_ms(50);
while( (PINB & (1<<7)) != 0 );

/* стоим на месте */
while( count < 150 );
TCCR0B = 0b00000000;
_delay_ms(50);
}

return 0;
}

(Добавление)
Небольшое пояснение по функциям возложенным на кнопочки пульта:
РВ0 – вперед,
РВ1 – поворот в одну сторону,
РВ2 – стоп,
РВ3 – поворот в другую сторону,
РВ4 – назад.
28. robot2000 - 11 Июня, 2011 - 15:49:35 - перейти к сообщению
а мне нравиться.лично я сейча делаю своего робота на колёсах и не получается.,.. Грустный
29. mihail - 16 Июня, 2011 - 13:26:06 - перейти к сообщению
Сделал замечательную вещь. С ее помощью можно соединить микроконтроллер и компьютер.
30. mihail - 16 Июня, 2011 - 14:34:25 - перейти к сообщению
Схема. Все конденсаторы керамические по 0.1 микрофарад.