
Не удержался и решил показать свой шедевр. Только ещё не доделал не хватает переднего бампера и нескольких датчиков. Но уже ездит снял на видео как через порожек переезжает

Технический форум по робототехнике.
Master писал(а):Ну вообще-то для разворота танкового типа нужно колеса боковые ставить как можно ближе.
// Программа следования по линии для Проекта мобильного робота "R1-B1"
// Автор Space:
// -мк ATmega16
// -используется кварц на 8мГц
// -компилятор WinAVR V2.0.5
// Программа 2008 для робота R1-B1 - www.robptsspace.ucoz.ru
//------------------------------------------------------------------------
#include <avr/io.h>
#define bit_is_clear(sfr, bit) \
(!(sfr & _BV(bit)))
#define bit_is_set(sfr, bit) (sfr & _BV(bit))
// назначение определений для танкового привода
#define OUT PORTA
#define MOTOR_FR PA0 // вперед-вправо
#define MOTOR_BR PA1 // назад-вправо
#define MOTOR_BL PA2 // назад-влево
#define MOTOR_FL PA3 // вперед-влево
#define IN PIND
#define LIGHT_R PD0 // правый фотодиод
#define LIGHT_L PD1 // левый фотодиод
#define LED PD4 // светодиод
// Возможные режимы движения для танкового привода
enum {STOP, F, FR, FL};
//------------------------------------------------------------------------------
// Задержка t х 10ms
//------------------------------------------------------------------------------
//#define F_CPU 8000000
#define K_DELAY_10ms F_CPU/600
void Delay_10ms(unsigned char t) {
if (t==0) return;
unsigned int i;
while (t--) for(i=0;i<K_DELAY_10ms; i++);
}
//------------------------------------------------------------------------------
// Включение комбинации моторов для движения в заданном направлении
//------------------------------------------------------------------------------
void go(unsigned char direction){
switch (direction) {
case STOP:
cbi(OUT, MOTOR_FR);
cbi(OUT, MOTOR_BR);
cbi(OUT, MOTOR_BL);
cbi(OUT, MOTOR_FL);
break;
case F:
sbi(OUT, MOTOR_FR);
cbi(OUT, MOTOR_BR);
cbi(OUT, MOTOR_BL);
sbi(OUT, MOTOR_FL);
break;
case FR:
cbi(OUT, MOTOR_FR);
cbi(OUT, MOTOR_BR);
cbi(OUT, MOTOR_BL);
sbi(OUT, MOTOR_FL);
break;
case FL:
sbi(OUT, MOTOR_FR);
cbi(OUT, MOTOR_BR);
cbi(OUT, MOTOR_BL);
cbi(OUT, MOTOR_FL);
break;
}
}
//------------------------------------------------------------------------------
// "STOP", ЕСЛИ НЕТ СИГНАЛА
//------------------------------------------------------------------------------
unsigned char walk(void){
// этот цикл организует STOP пока
// нет сигнала ни от одного из датчиков освещенности
while((bit_is_clear(IN, LIGHT_R)) && (bit_is_clear(IN, LIGHT_L))){
go(STOP);
cbi(PORTD, LED); // зажигаем светодиод на PD4
Delay_10ms(125); // движемся в этом направлении 2.5 сек
sbi(PORTD, LED); // гасим светодиод на PD4
Delay_10ms(125); // движемся в этом направлении 2.5 сек
}
// этот цикл организует движение на свет, пока
// есть сигнал хотя бы от одного из датчиков освещенности
while((bit_is_set(IN, LIGHT_R)) || (bit_is_set(IN, LIGHT_L))){
if((bit_is_set(IN, LIGHT_R)) && (bit_is_set(IN, LIGHT_L))) go(F);
else if(bit_is_set(IN, LIGHT_R)) go(FR);
else if(bit_is_set(IN, LIGHT_L)) go(FL);
}
return(0);
}
//------------------------------------------------------------------------------
// Главная программа
//------------------------------------------------------------------------------
int main(void)
{
DDRA = 0xff; // назначаем все линии порта A на выход
PORTA = 0x00; // и устанавливаем на них низкий уровень
DDRD = 0x10; // назначаем все линии порта D на вход, кроме PD4
PORTD = 0xef; // подключаем внутренние нагрузочные резисторы, кроме PD4
// для подсчета числа миганий в цикле
unsigned char i;
for (i=0;i<5;i++){ // Подмигиваем пять раз
cbi(PORTD, LED); // Зажигаем LED
Delay_10ms(250); // пауза
sbi(PORTD, LED); // гасим LED
Delay_10ms(250); // пауза
}
// запускаем главный цикл
while(1) walk();
}