Технический форум по робототехнике.
Korbofos » 09 май 2011, 18:17
Выношу на суд своего первенца
Пока для гусеничного робота изготавливаются детали,я решил потренироваться и вот мой уродец
Из датчиков использовал tsopЫ, собираюсь ещё повесить назад tsop. Т.к закладка учебника по C находится на 63 странице, робот пока умеет только отворачивать от препятствий.
Прога
Код: Выделить всё • Развернуть #include <tiny2313.h> #include <delay.h> #define IR1_ON TCCR0A=0b01000010; #define IR2_ON TCCR0A=0b00010010; #define IR12_ON TCCR0A=0b01010010; #define IR12_OFF TCCR0A=0b00000010; #define START_M1 PORTB.0 = 1 #define START_M2 PORTB.1 = 1 #define STOP_M1 PORTB.0 = 0 #define STOP_M2 PORTB.1 = 0 #define FOWARD_M1 PORTA.0 = 0 #define FOWARD_M2 PORTA.1 = 0 #define BACK_M1 PORTA.0 = 1 #define BACK_M2 PORTA.1 = 1 #define IR3_ON TCCR1A=0b01000000; #define IR4_ON TCCR1A=0b00010000; #define IR34_OFF TCCR1A=0b00000000; char tsop1 = 0; // Счётчик импульсов char tsop2 = 0; // Счётчик импульсов void main(void) { // Crystal Oscillator division factor: 1 #pragma optsize- CLKPR=0x80; CLKPR=0x00; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif PORTA=0x00; DDRA=0b00000011; PORTB=0x00; DDRB=0b00011111; PORTD=0x00; DDRD=0b00100000; TCCR0A=0b00000010; TCCR0B=0b11000001; OCR0A=0x37; OCR0B=0x37; TCCR1A=0b00000000; TCCR1B=0b00001001; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x37; OCR1BH=0x00; OCR1BL=0x37; DIDR=0x00; STOP_M1; STOP_M2; FOWARD_M1; FOWARD_M2; // Global enable interrupts while (1) { delay_ms(100); IR1_ON; // 1 Пачка импульсов на Tsop1 delay_us(600); IR12_OFF; if (PIND.6 == 0) {tsop1++;} // TSOP1 if (PIND.6 == 1) {START_M2;} // Если нет препятствия GO delay_ms(10); IR2_ON; // 1 Пачка импульсов на Tsop2 delay_us(600); IR12_OFF; if (PIND.4 == 0) {tsop2++;} // TSOP2 if (PIND.4 == 1) {START_M1;} // Если нет препятствия GO delay_ms(10); { unsigned int i; // 9 пачек импульсов на Tsop1 for(i=0; i<9; i++ { delay_us(700); IR1_ON; delay_us(600); IR12_OFF; if (PIND.6 == 0) {tsop1++;} } } delay_ms(5); { unsigned int j; // 9 пачек импульсов на Tsop2 for(j=0; j<9; j++) { delay_us(700); IR2_ON; delay_us(600); IR12_OFF; if (PIND.4 == 0) {tsop2++;} } } delay_ms(5); if ((tsop1 < 7)&&(tsop2 < 7)) { START_M1; START_M2; } if ((tsop1 > 7)&&(tsop2 < 7)) { START_M1; STOP_M2; } if ((tsop1 < 7)&&(tsop2 > 7)) { STOP_M1; START_M2; } if ((tsop1 > 7)&&(tsop2 > 7)) { START_M1; // Тормозим контрвключением START_M2; BACK_M1; BACK_M2; delay_ms(250); STOP_M1; STOP_M2; delay_ms(2500); START_M1; START_M2; BACK_M1; // Задний ход BACK_M2; delay_ms(900); STOP_M1; FOWARD_M1; START_M1; delay_ms(50); STOP_M1; delay_ms(900); STOP_M2; FOWARD_M1; FOWARD_M2; delay_ms(2000); } tsop1 = 0; // Сброс счётчиков в 0 tsop2 = 0; } }
RootAdmin » 09 май 2011, 21:42
Во что ж он разовьется к середине книжки? Хотя - главное чтоб к концу не поработил мир.
mattheus » 18 май 2011, 22:10
Отличный робот! И быстрый такой, только успевай за ним (глаз да глаз, а то уедет). А чего же он все время на месте крутиться (часто крутиться и ровно не ездит)? Или так задумано?
Korbofos » 19 май 2011, 07:56
mattheus писал(а): А чего же он все время на месте крутиться (часто крутиться и ровно не ездит)? Или так задумано?
Неа так не задуманно) Сейчас как раз над этим работаю! Надо шим добавить! А то при постоянной работе первого колеса и старт стопе второго колеса, второе колесо срывается в букс, в следствии начинаются кружения. Едет он реально быстро на полном ходу табуретки разлетаются)))
Korbofos » 24 май 2011, 09:11
Подскажите кто юзает CVAVR ?
Надо сравнить X c диапозом чисел от 5 до 7 как это лучше сделать?
Tак не прокатывает
Код: Выделить всё • Развернуть x==(5||6||7)
И так тоже
Код: Выделить всё • Развернуть ((x=>5)||(x<=7))
=DeaD= » 24 май 2011, 09:33
Korbofos писал(а): Надо сравнить X c диапозом чисел от 5 до 7 как это лучше сделать?
Что, блин, значит сравнить Х с диапазоном чисел???
Может быть проверить принадлежить ли Х этому диапазону? Или что нужно?
boez » 24 май 2011, 10:23
Программа всегда делает ровно то, что в ней написано
В первом случае ты написал: сравнить x с логическим или от трех истинных (ненулевых) значений. "истина или истина или истина" равно истина, т.е. не ноль. Т.е. ты просто сравниваешь x с неким ненулевым значением. Это некорректно по сути.
Во втором ты уже ближе к результату. Твое условие в целом истинно, если x больше пяти
или меньше семи. Проблема в том, что это истинно всегда
Просто разберись, в чем разница между "и" и "или".
Всегда старайся понять,
почему у тебя не работает то, что ты написал.
Korbofos » 24 май 2011, 12:14
=DeaD= писал(а): Может быть проверить принадлежить ли Х этому диапазону? Или что нужно?
Да именно принадлежит ли!
Добавлено спустя 1 минуту 47 секунд: if(((x>4)&&(x<8)) Вот так пошло!
Добавлено спустя 59 минут 5 секунд: Сделал с шимом! Покритикуйте код)
Код: Выделить всё • Развернуть #include <mega32a.h> #include <delay.h> // Declare your global variables here #define IR1_ON TCCR1A |=(1<<COM1A0); #define IR2_ON TCCR1A |=(1<<COM1B0); #define IR1_OFF TCCR1A &=~(1<<COM1A0); #define IR2_OFF TCCR1A &=~(1<<COM1B0); #define IR3_ON PORTA.2 = 1; #define IR4_ON PORTA.3 = 1; #define IR3_OFF PORTA.2 = 0; #define IR4_OFF PORTA.3 = 0; #define PWM_M1_ON TCCR0 = 0b01101001; #define PWM_M2_ON TCCR2 = 0b01101001; #define PWM_M1_OFF TCCR0 = 0x00; OCR0=0x00; #define PWM_M2_OFF TCCR2 = 0x00; OCR2=0x00; #define PWM_M1 OCR0 #define PWM_M2 OCR2 #define FOWARD_M1 PORTA.0 = 0 #define FOWARD_M2 PORTA.1 = 0 #define BACK_M1 PORTA.0 = 1 #define BACK_M2 PORTA.1 = 1 unsigned int tsop1, tsop2, speed_m1 = 0, speed_m2 = 0; void tsop(void); void calculation_speed(void); void speed(void); void main(void) while (1) { tsop(); calculation_speed(); speed(); } void tsop(void) { unsigned char a, b; tsop1=0; tsop2=0; delay_ms(5); for(a=0; a<10; a++) // 10 пачек умпульсов на Tsop1 { delay_us(700); IR1_ON; delay_us(600); IR1_OFF; if (PINB.0 == 0) {tsop1++;} } delay_ms(5); for(b=0; b<10; b++) // 10 пачек умпульсов на Tsop2 { delay_us(700); IR2_ON; delay_us(600); IR2_OFF; if (PINB.1 == 0) {tsop2++;} } } id calculation_speed(void) //Считаем вернувшиеся импульсы и задаём скорость! { if((tsop1<5)&&(tsop2<5)) //speed m1_100- m2_100 { speed_m1=0; speed_m2=0; } if(((tsop1>4)&&(tsop1<8))&&((tsop2>4)&&(tsop2<8))) // есть препятствие { //Speed m1_40- m2_40 speed_m1=1; speed_m2=1; } if((tsop1>7)&&(tsop2>7)) //препятствие близко { speed_m1=2; //Speed 0-0 speed_m2=2; } if((tsop1<5)&&((tsop2>4)&&(tsop2<8))) //100-40 { speed_m1=1; speed_m2=0; } if((tsop1<5)&&(tsop2>7)) //100-0 { speed_m1=2; speed_m2=0; } if(((tsop1>4)&&(tsop1<8))&&(tsop2<5)) //40-100 { speed_m1=0; speed_m2=1; } if((tsop1>7)&&(tsop2<5)) //0-100 { speed_m1=0; speed_m2=2; } if((tsop1>7)&&((tsop2>4)&&(tsop2<8))) //40-0 { speed_m1=1; speed_m2=3; } if(((tsop1>4)&&(tsop1<8))&&(tsop2>7)) //0-40 { speed_m1=1; speed_m2=3; } } void speed(void) { switch (speed_m1) /100% { case 0: { FOWARD_M1; PWM_M1_ON; if ((PWM_M1==0x00)||(PWM_M1<0xFF)) // если меньше 100% { PWM_M1++; //Увиличить заполнение шим на 1 за цикл } if (PWM_M1==0xFF) { PWM_M1=0xFF; } //M1 break; } case 1: // 40% { FOWARD_M1; PWM_M1_ON; if ((PWM_M1==0x00)||(PWM_M1<0x64)) //если меньше 40% { PWM_M1++; //+1 за цикл } if(PWM_M1==0x64) { PWM_M1=0x64; } break; } case 2: { FOWARD_M1; PWM_M1_OFF; break; } case 3: { BACK_M1; PWM_M1_OFF; break; //доделать } } switch (speed_m2) { case 0: { FOWARD_M2; PWM_M2_ON; if ((PWM_M2==0x00)||(PWM_M2<0xFF)) // если меньше 100% { PWM_M2++; //Увиличить заполнение шим на 1 за цикл } if (PWM_M2==0xFF) { PWM_M2=0xFF; } break; } case 1: { FOWARD_M2; PWM_M2_ON; if ((PWM_M2==0x00)||(PWM_M2<0x64)) // 40% { PWM_M2++; //Увиличить заполнение шим на 1 за цикл } if(PWM_M2==0x64) { PWM_M2=0x64; } break; } case 2: { //M2 FOWARD_M2; PWM_M2_OFF; break; } case 3: { BACK_M2; PWM_M2_OFF; break; } } }
Korbofos » 21 июн 2011, 20:25
Собираю гусеничную платформу Весь процесс встал на изготовлении ведущих осей... Обращался к токарям не могут выдолбить в центре оси квадрат. Посоветуйте как обойти эту проблему?
Вложения
Последний раз редактировалось
Korbofos 28 июн 2011, 16:31, всего редактировалось 1 раз.
Michael_K » 21 июн 2011, 20:36
что за материал? Сделайте круглую дырку внатяг и винтиком сбоку
Strijar » 22 июн 2011, 08:24
Korbofos писал(а): Обращался к токарям не могут выдолбить в центре оси квадрат. Посоветуйте как обойти эту проблему?
Я восстанавливал шестигранник сорваный "в ноль". Залил эпоксидки с наполнителем "серебрянка" и вставил ключ смазанный маслом. Когда застыло - аккуратно раскачивая ключ вытащил.
Korbofos » 22 июн 2011, 10:16
Michael_K писал(а): что за материал?
Сталь ст 40
Michael_K писал(а): Сделайте круглую дырку внатяг и винтиком сбоку
Да думаю так лучше будет.
Добавлено спустя 13 минут 16 секунд: Strijar писал(а): Я восстанавливал шестигранник сорваный "в ноль". Залил эпоксидки с наполнителем "серебрянка" и вставил ключ смазанный маслом. Когда застыло - аккуратно раскачивая ключ вытащил.
Прикольно, а как по прочности?
setar » 22 июн 2011, 22:37
перезалейте картинки на форум во первых вся верстка едет, во вторых на бесплатных обменниках скоро картинки не будет...
Korbofos » 23 июн 2011, 06:05
setar писал(а): перезалейте картинки на форум во первых вся верстка едет, во вторых на бесплатных обменниках скоро картинки не будет...
Куда например?
Radist » 23 июн 2011, 07:14
Прямо сюда. Ниже окна для ввода текста есть вкладка "Добавить вложение". А там разберетесь.