roboforum.ru

Технический форум по робототехнике.

Zombain

Zombain

Korbofos » 09 май 2011, 18:17

Выношу на суд своего первенца
Пока для гусеничного робота изготавливаются детали,я решил потренироваться и вот мой уродец :D
Из датчиков использовал 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;
     }
}

Re: Zombain

RootAdmin » 09 май 2011, 21:42

Во что ж он разовьется к середине книжки? Хотя - главное чтоб к концу не поработил мир.

Re: Zombain

mattheus » 18 май 2011, 22:10

Отличный робот! И быстрый такой, только успевай за ним (глаз да глаз, а то уедет). А чего же он все время на месте крутиться (часто крутиться и ровно не ездит)? Или так задумано?

Re: Zombain

Korbofos » 19 май 2011, 07:56

mattheus писал(а): А чего же он все время на месте крутиться (часто крутиться и ровно не ездит)? Или так задумано?

Неа так не задуманно) Сейчас как раз над этим работаю! Надо шим добавить! А то при постоянной работе первого колеса и старт стопе второго колеса, второе колесо срывается в букс, в следствии начинаются кружения. Едет он реально быстро на полном ходу табуретки разлетаются)))

Re: Zombain

Korbofos » 24 май 2011, 09:11

Подскажите кто юзает CVAVR ?
Надо сравнить X c диапозом чисел от 5 до 7 как это лучше сделать?
Tак не прокатывает
Код: Выделить всёРазвернуть
x==(5||6||7)

И так тоже
Код: Выделить всёРазвернуть
((x=>5)||(x<=7))

Re: Zombain

=DeaD= » 24 май 2011, 09:33

Korbofos писал(а):Надо сравнить X c диапозом чисел от 5 до 7 как это лучше сделать?

Что, блин, значит сравнить Х с диапазоном чисел???

Может быть проверить принадлежить ли Х этому диапазону? Или что нужно?

Re: Zombain

boez » 24 май 2011, 10:23

Korbofos писал(а):Tак не прокатывает
Код: Выделить всёРазвернуть
x==(5||6||7)

И так тоже
Код: Выделить всёРазвернуть
((x=>5)||(x<=7))

Программа всегда делает ровно то, что в ней написано :)

В первом случае ты написал: сравнить x с логическим или от трех истинных (ненулевых) значений. "истина или истина или истина" равно истина, т.е. не ноль. Т.е. ты просто сравниваешь x с неким ненулевым значением. Это некорректно по сути.

Во втором ты уже ближе к результату. Твое условие в целом истинно, если x больше пяти или меньше семи. Проблема в том, что это истинно всегда :) Просто разберись, в чем разница между "и" и "или".

Всегда старайся понять, почему у тебя не работает то, что ты написал.

Re: Zombain

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;
  }
}

}

Re: Zombain

Korbofos » 21 июн 2011, 20:25

Собираю гусеничную платформу

Весь процесс встал на изготовлении ведущих осей...
Обращался к токарям не могут выдолбить в центре оси квадрат. Посоветуйте как обойти эту проблему?
Вложения
6491a6f301b87565f2b31530da6ab7fc.jpg
0b2411c5e0dd105d72752d73271de481.jpg
Последний раз редактировалось Korbofos 28 июн 2011, 16:31, всего редактировалось 1 раз.

Re: Zombain

Michael_K » 21 июн 2011, 20:36

что за материал?

Сделайте круглую дырку внатяг и винтиком сбоку

Re: Zombain

Strijar » 22 июн 2011, 08:24

Korbofos писал(а):Обращался к токарям не могут выдолбить в центре оси квадрат. Посоветуйте как обойти эту проблему?


Я восстанавливал шестигранник сорваный "в ноль". Залил эпоксидки с наполнителем "серебрянка" и вставил ключ смазанный маслом. Когда застыло - аккуратно раскачивая ключ вытащил.

Re: Zombain

Korbofos » 22 июн 2011, 10:16

Michael_K писал(а):что за материал?

Сталь ст 40

Michael_K писал(а):Сделайте круглую дырку внатяг и винтиком сбоку

Да думаю так лучше будет.

Добавлено спустя 13 минут 16 секунд:
Strijar писал(а):Я восстанавливал шестигранник сорваный "в ноль". Залил эпоксидки с наполнителем "серебрянка" и вставил ключ смазанный маслом. Когда застыло - аккуратно раскачивая ключ вытащил.

Прикольно, а как по прочности?

Re: Zombain

setar » 22 июн 2011, 22:37

перезалейте картинки на форум
во первых вся верстка едет, во вторых на бесплатных обменниках скоро картинки не будет...

Re: Zombain

Korbofos » 23 июн 2011, 06:05

setar писал(а):перезалейте картинки на форум
во первых вся верстка едет, во вторых на бесплатных обменниках скоро картинки не будет...

Куда например?

Re: Zombain

Radist » 23 июн 2011, 07:14

Прямо сюда. Ниже окна для ввода текста есть вкладка "Добавить вложение". А там разберетесь.


Rambler\'s Top100 Mail.ru counter