roboforum.ru

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

Гусеничный робот noname

Наше хобби — конструировать и программировать.
Демонстрация готовых роботов и устройств построенных своими руками.

Гусеничный робот noname

Сообщение Korbofos » 12 ноя 2011, 17:02

Здравствуйте!
Представляю вам гусеничного робота!
Механика здесь.http://roboforum.ru/forum44/topic10490.html
Электроника:bluetooth-адаптер or-btm111-9.6 контроллер or-m128-ds драйвер двигателей or-md2-10a-12v-x.
Радар: Sharp GP2Y0A21YK0F 10-80см + серво towerpro sg90.
Робот управляется с пк по блютусу.
Пока что робот слоняется бесполезно по комнате и отварачивает от препятствий!
В дальнейшем планирую:
-установить акселерометр и компас.
-видеокамеру.
-модульную систему т.е.(менять верхнею крышку робота, одна с манипулятором, другая например с танковой башней :))

Поездка в автоматическом режиме...

Управляю в ручном режиме...

Автоматический режим в конце пропала связь с пк...
Последний раз редактировалось Korbofos 12 ноя 2011, 19:25, всего редактировалось 2 раз(а).
РАБОТА, РАБОТА перейди на Федота, с Федота на его брата, а ко мне их зарплата.
Аватара пользователя
Korbofos
 
Сообщения: 317
Зарегистрирован: 15 янв 2011, 11:27
Откуда: Челябинск
прог. языки: C/C++
ФИО: Александр

Re: Гусеничный noname

Сообщение =DeaD= » 12 ноя 2011, 17:31

Нормально гоняет, а какие габариты, вес? Какие движки?
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Re: Гусеничный noname

Сообщение Korbofos » 12 ноя 2011, 17:44

Длинна - 52см.
Ширина - 27см.
Двигателя от стеклоподъемников ваз 2110.
Вес общий - 9 кг.
Масса аккумуляторов 3 кг.
В дальнейшем планирую использовать более лёгкие аккумуляторы.
дальномер можно было не ставить , препятствия он прекрасно отодвигает :)
РАБОТА, РАБОТА перейди на Федота, с Федота на его брата, а ко мне их зарплата.
Аватара пользователя
Korbofos
 
Сообщения: 317
Зарегистрирован: 15 янв 2011, 11:27
Откуда: Челябинск
прог. языки: C/C++
ФИО: Александр

Re: Гусеничный робот noname

Сообщение Korbofos » 23 ноя 2011, 20:07

Проверка тяги так сказать)
РАБОТА, РАБОТА перейди на Федота, с Федота на его брата, а ко мне их зарплата.
Аватара пользователя
Korbofos
 
Сообщения: 317
Зарегистрирован: 15 янв 2011, 11:27
Откуда: Челябинск
прог. языки: C/C++
ФИО: Александр

Re: Гусеничный робот noname

Сообщение KitaPro » 23 ноя 2011, 20:23

Мощный однако
KitaPro
 
Сообщения: 127
Зарегистрирован: 30 сен 2011, 20:33
Откуда: Мурманск
ФИО: Никита

Re: Гусеничный noname

Сообщение legion » 23 ноя 2011, 20:52

Korbofos писал(а):дальномер можно было не ставить , препятствия он прекрасно отодвигает

Понравилось. :D
legion
 
Сообщения: 736
Зарегистрирован: 24 апр 2010, 14:47
Откуда: Уфа
прог. языки: avr asm

Re: Гусеничный робот noname

Сообщение Gelios » 27 ноя 2011, 14:29

Хорошая конструкция , в 2008 году тоже делал гусеничного побольше правда . Но такой тяги конечно не получилось :wink: Ему бы плуг приделать и на даче пусть землю вскапывает :)
Любая высокоразвитая технология похожа на волшебство
Gelios
 
Сообщения: 219
Зарегистрирован: 16 июл 2010, 16:25
Откуда: Беларусь , Минск

Re: Гусеничный робот noname

Сообщение Korbofos » 27 ноя 2011, 19:26

Gelios писал(а):Хорошая конструкция , в 2008 году тоже делал гусеничного побольше правда.

Есть фото вашего гусеничного робота на робофоруме? Интересно стало. :)
РАБОТА, РАБОТА перейди на Федота, с Федота на его брата, а ко мне их зарплата.
Аватара пользователя
Korbofos
 
Сообщения: 317
Зарегистрирован: 15 янв 2011, 11:27
Откуда: Челябинск
прог. языки: C/C++
ФИО: Александр

Re: Гусеничный робот noname

Сообщение Skyline » 27 ноя 2011, 20:16

Я так понимаю на аватаре Gelios'а и есть этот гусеничный робот!
Аватара пользователя
Skyline
 
Сообщения: 278
Зарегистрирован: 12 май 2010, 13:30
Откуда: Уральск-Самара
Skype: sky-jap
прог. языки: Bascom AVR Basic
ФИО: Полулях Сергей Валерьевич

Re: Гусеничный робот noname

Сообщение Korbofos » 27 ноя 2011, 20:27

Я тоже это понял, но 128х128 пикселей тяжело рассмотреть детали.
РАБОТА, РАБОТА перейди на Федота, с Федота на его брата, а ко мне их зарплата.
Аватара пользователя
Korbofos
 
Сообщения: 317
Зарегистрирован: 15 янв 2011, 11:27
Откуда: Челябинск
прог. языки: C/C++
ФИО: Александр

Re: Гусеничный робот noname

Сообщение Anubis » 29 ноя 2011, 11:04

Крепкая конструкция :)
Блин, никак не могу придумать подпись!
Аватара пользователя
Anubis
 
Сообщения: 268
Зарегистрирован: 03 дек 2008, 23:24
Откуда: Тамбов
Skype: anubis_kesh
прог. языки: Delphi, С++, PHP, HTML
ФИО: Гребенников Роман

Re: Гусеничный робот noname

Сообщение Korbofos » 29 ноя 2011, 19:31

Anubis писал(а):Крепкая конструкция :)

Спс. Создавал под впечатлением советского танкостроения :pardon:
РАБОТА, РАБОТА перейди на Федота, с Федота на его брата, а ко мне их зарплата.
Аватара пользователя
Korbofos
 
Сообщения: 317
Зарегистрирован: 15 янв 2011, 11:27
Откуда: Челябинск
прог. языки: C/C++
ФИО: Александр

Re: Гусеничный робот noname

Сообщение Gre4in » 29 ноя 2011, 19:33

А не пробовали его на лестнице?
Gre4in
 
Сообщения: 157
Зарегистрирован: 13 сен 2008, 17:53
Откуда: Иваново
прог. языки: Pascal, С

Re: Гусеничный робот noname

Сообщение Korbofos » 30 ноя 2011, 10:04

Gre4in писал(а):А не пробовали его на лестнице?

Без грунтозацепов не может забраться :(
РАБОТА, РАБОТА перейди на Федота, с Федота на его брата, а ко мне их зарплата.
Аватара пользователя
Korbofos
 
Сообщения: 317
Зарегистрирован: 15 янв 2011, 11:27
Откуда: Челябинск
прог. языки: C/C++
ФИО: Александр

Re: Гусеничный робот noname

Сообщение Korbofos » 14 дек 2011, 09:51

Не могу заставить нормально работать компас на LSM303DLH: взял пример отсюда http://www.pololu.com/file/0J436/LSM303DLH-orangutan-example-code.zip

Код в мк
Код: Выделить всёРазвернуть
 void lsm303dlh_funct(void)
{
static bool start_lsm=1;
if(start_lsm)
  {
  start_lsm=0;
  i2c_initialization();
  start_lsm303dlh();
  }
read_data();
}


void start_lsm303dlh(void) 
{   
//enable accelerometer
    i2c_on();
    i2c_write_byte(0x30); // write acc
    i2c_write_byte(0x20); // CTRL_REG1_A
    i2c_write_byte(0x27); // normal power mode, 50 Hz data rate, all axes enabled
    i2c_off();

    //enable magnetometer
    i2c_on();
    i2c_write_byte(0x3C); // write mag
    i2c_write_byte(0x02); // MR_REG_M
    i2c_write_byte(0x00); // continuous conversion mode
   i2c_off();
   
}


void read_data(void)
{
    // read accelerometer values
    tx_write(6);  //compass funct
    i2c_on();
    i2c_write_byte(0x30); // write acc
    i2c_write_byte(0xA8); //i2c_write_byte(0xA8); OUT_X_L_A, MSB set to enable auto-increment
    i2c_on();          // repeated start
    i2c_write_byte(0x31); // read acc
    tx_write(i2c_read_byte());
    tx_write(i2c_read_byte());
    tx_write(i2c_read_byte());
    tx_write(i2c_read_byte());
    tx_write(i2c_read_byte());
    tx_write(i2c_read_last_byte());
    i2c_off();

    // read magnetometer values
    i2c_on();
    i2c_write_byte(0x3C); // write mag
    i2c_write_byte(0x03); // OUTXH_M
   i2c_on();        // repeated start
   i2c_write_byte(0x3D); // read mag
   tx_write(i2c_read_byte());
   tx_write(i2c_read_byte());
   tx_write(i2c_read_byte());
   tx_write(i2c_read_byte());
   tx_write(i2c_read_byte());
   tx_write(i2c_read_last_byte());
   i2c_off();
}

//Функции i2c



void i2c_initialization(void)
{
TWSR=0x00; 
TWBR=0x07; //TWBR=0x1D;
TWCR=0x04;
}

void i2c_on(void)

TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN); // send start condition 
while (!(TWCR & (1 << TWINT))); 

 
void i2c_write_byte(signed char byte)

TWDR = byte;             
TWCR = (1 << TWINT) | (1 << TWEN); // start address transmission 
while (!(TWCR & (1 << TWINT))); 

 
signed char i2c_read_byte(void)

TWCR = (1 << TWINT) | (1 << TWEA) | (1 << TWEN); // start data reception, transmit ACK 
while (!(TWCR & (1 << TWINT))); 
return TWDR; 


signed char i2c_read_last_byte(void)

TWCR = (1 << TWINT) | (1 << TWEN); // start data reception
while (!(TWCR & (1 << TWINT))); 
return TWDR; 

 
void i2c_off(void)

TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN); // send stop condition 



Обработка принятых данных на стороне PC
Код: Выделить всёРазвернуть
//---------------------------------------------------------------------------
void show_deg(void)
{
static char count=0;
read_data(&a,&m);
lsm303dlh_ack=1;
if(!count){
a_avg.x = 0;
a_avg.y = 0;
a_avg.z  = 0;
m_avg.x  = 0;
m_avg.y  = 0;
m_avg.z  = 0;}

a_avg.x += a.x;
a_avg.y += a.y;
a_avg.z += a.z;
m_avg.x += m.x;
m_avg.y += m.y;
m_avg.z += m.z;
count++;

if(count>4){
   a_avg.x /= 5;
   a_avg.y /= 5;
   a_avg.z /= 5;
   m_avg.x /= 5;
   m_avg.y /= 5;
   m_avg.z /= 5;

int heading = get_heading(&a_avg, &m_avg, &p);
int degr=atan2(m.y,m.x);
Form1->StatusBar1->Panels->Items[0]->Text= IntToStr(heading);}//+IntToStr(degr);
}
//---------------------------------------------------------------------------
void read_data_raw(vector *a, vector *m)
{

   unsigned char axl = read_rx();
        unsigned char axh = read_rx();
   unsigned char ayl = read_rx();
        unsigned char ayh = read_rx();
   unsigned char azl = read_rx();
   unsigned char azh = read_rx();

        unsigned char mxh = read_rx();
   unsigned char mxl = read_rx();
   unsigned char myh = read_rx();
   unsigned char myl = read_rx();
   unsigned char mzh = read_rx();
   unsigned char mzl = read_rx();


   int ax = (int)(axh << 8) + axl;
   int ay = (int)(ayh << 8) + ayl;
   int az = (int)(azh << 8) + azl;
   int mx = (int)(mxh << 8) + mxl;
   int my = (int)(myh << 8) + myl;
   int mz = (int)(mzh << 8) + mzl;

        a->x = ax;
   a->y = ay;
   a->z = az;
   m->x = mx;
   m->y = my;
   m->z = mz;



}
//---------------------------------------------------------------------------
void read_data(vector *a, vector *m)
{
read_data_raw(a, m);
// shift and scale
m->x = (m->x - m_min.x) / (m_max.x - m_min.x) * 2 - 1.0;
m->y = (m->y - m_min.y) / (m_max.y - m_min.y) * 2 - 1.0;
m->z = (m->z - m_min.z) / (m_max.z - m_min.z) * 2 - 1.0;
}
//---------------------------------------------------------------------------
int get_heading(const vector *a, const vector *m, const vector *p)
{
   vector E;
   vector N;

   // cross magnetic vector (magnetic north + inclination) with "down" (acceleration vector) to produce "east"
   vector_cross(m, a, &E);
   vector_normalize(&E);

   // cross "down" with "east" to produce "north" (parallel to the ground)
   vector_cross(a, &E, &N);
   vector_normalize(&N);

   // compute heading
   int heading = atan2(vector_dot(&E, p), vector_dot(&N, p) * 180 / M_PI);
   if (heading < 0) heading += 360;
   return heading;
}
//---------------------------------------------------------------------------
void vector_cross(const vector *a, const vector *b, vector *out)
{
   out->x = a->y * b->z - a->z * b->y;
   out->y = a->z * b->x - a->x * b->z;
   out->z = a->x * b->y - a->y * b->x;
}

float vector_dot(const vector *a, const vector *b)
{
  return a->x * b->x + a->y * b->y + a->z * b->z;
}

void vector_normalize(vector *a)
{
   float mag = sqrt(vector_dot(a, a));
   a->x /= mag;
   a->y /= mag;
   a->z /= mag;
}


Проблема в том что функция get_heading возвращает значения только: 357, 3 либо 0. Других значений не дождёшься как не крути...
Данные калибровки:
vector m_max = {654502,65495 , 65391}; // maximum magnetometer values, used for calibration
vector m_min = {13,11 , 65000}; // minimum magnetometer values, used for calibration
РАБОТА, РАБОТА перейди на Федота, с Федота на его брата, а ко мне их зарплата.
Аватара пользователя
Korbofos
 
Сообщения: 317
Зарегистрирован: 15 янв 2011, 11:27
Откуда: Челябинск
прог. языки: C/C++
ФИО: Александр

След.

Вернуться в Наши проекты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11