roboforum.ru

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

Интерактивный мобильный робот Vanessa

Re: Интерактивный мобильный робот Vanessa

Vovan » 20 ноя 2010, 19:20

yak-40 писал(а):Ну это как раз очень даже интересно :wink:
+1

Re: Интерактивный мобильный робот Vanessa

Skyline » 20 ноя 2010, 19:30

Что-то я туплю, как контакты прикручены? Такое чувство, что все напрямую к металлической пластинки приделано!

Re: Интерактивный мобильный робот Vanessa

avr123.nm.ru » 20 ноя 2010, 21:37

Scorpio писал(а):Интерактивный мобильный робот Vanessa. И вот, что получилось...


Отлично ! :good: :Bravo: Поздравляю. Как это я проглядел такой топик. Желаю удачи.

Re: Интерактивный мобильный робот Vanessa

Scorpio » 21 ноя 2010, 07:01

Skyline писал(а):Что-то я туплю, как контакты прикручены? Такое чувство, что все напрямую к металлической пластинки приделано!

Да неее, там отверстия в люмине большие. Контактные болты их не касаются.

В ютубе неохота полуфабрикат вывешивать.

Ну помогите кто-нибудь с I2C! Задолбался уже! Пробовал и программный и аппаратный на разных частотах. Один фиг. От 2 до 10% ошибок при чтении. От датчика не зависит. Пробую тоже самое от NXT - ни одного сбоя за 10000 циклов считывания! И импульсы ровненькие без выбросов. А с Crumb-168 с приличными выбросами.Провода менял, кандеры разные вешал - не помогает. КАК ПРАВИЛЬНО ПОДКЛЮЧИТЬ линии SCL, SDA?

Re: Интерактивный мобильный робот Vanessa

Michael_K » 21 ноя 2010, 07:21

Scorpio писал(а):КАК ПРАВИЛЬНО ПОДКЛЮЧИТЬ линии SCL, SDA?


Подтянуть к плюс пяти через 4K7...

А ничего более конкретного сказать и невозможно, не видя цепи питания,
выбросы, которые вас беспокоят, что вы цепляете к I2C и т.п. :pardon:

Scorpio писал(а):Пробую тоже самое от NXT - ни одного сбоя за 10000 циклов считывания!

Выводы? Да любые. Например, NXT питается от своих батарей, а крамб?
Последний раз редактировалось Michael_K 21 ноя 2010, 09:40, всего редактировалось 1 раз.

Re: Интерактивный мобильный робот Vanessa

=DeaD= » 21 ноя 2010, 09:34

Scorpio писал(а):Ну помогите кто-нибудь с I2C!

Ну дай хоть схему - чего куда подключаешь, в т.ч. источники питания какие.

Re: Интерактивный мобильный робот Vanessa

loox » 21 ноя 2010, 11:25

Scorpio
готов помочь...
i2c аппаратный представляет собой цифровой автомат, который требует точной последовательности выполнения операций.
Напиши как принимаешь данные в терминах i2c.
ack,sla-w.....
если надо пришлю код.. все отлично работает
loox

Re: Интерактивный мобильный робот Vanessa

Scorpio » 21 ноя 2010, 19:50

Спасибо, что отозвались.
Схема подключения простецкая: «крамб» питается от усб управляющего компа (сделал так, чтобы управлять процессом зарядки 12В батареи). Все датчики питаются от 12В батареи, через 5В КРЕНы (всего их 2 по 300мА). Пульсациям на питании вроде неоткуда взяться. В эксперименте вообще подключен только компасс с потреблением 12мА. На SDA, SCL только подтягивающие резюки 4.7 (пробовал и 2 и 10 – тоже только в профиль) подключены к + крамба, но пробовал и к + датчика.
Выбросы есть только при работе программного TWI. Отрицательные на синхроимпульсах наверное ни на что не влияют, а вот какие-то пички на SDA – вполне возможно. Извините за мутноватость, штатив отдал приятелю попользоваться.
TWIsoft.JPG
Импульсы при работе программного TWI

При работе аппаратного TWI, импульсы вообще красивые. Но ошибок при этом не меньше, да еще и зависает иногда на цикле ожидания.
TWIhard.JPG
Импульсы при работе аппаратного TWI

Вот функции, которыми я пользуюсь в случае аппаратного TWI (не помню, где скачал). Там и последовательность видна. Т.к. всегда считывается только 1 байт, то в конце мастер отвечает NACK. Вроде все правильно. Если бы была ошибка в программе, то вообще бы никогда не читала, а не время от времени. Или я не прав?
Код: Выделить всёРазвернуть
#define  TWI_BAUD  60 //  BAUD=Fsys/2Ftwi -5

#define  TWINT  7
#define  TWEA   6
#define  TWSTA  5
#define  TWSTO  4
#define  TWWC   3
#define  TWEN   2
#define  TWIE   0


void fi2c_init(void)
{
      TWBR = TWI_BAUD;
      TWSR = 0x02;   
      TWCR = (1<<TWEN)|                                 // Enable TWI-interface and release TWI pins.
         (0<<TWIE)|(0<<TWINT)|                      // Disable Interupt.
         (0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|           // No Signal requests.
         (0<<TWWC); 
};

unsigned char fi2c_start(void)/*issues a START condition.
Returns 1 if bus is free or 0 if the I2C bus is busy or error.*/
{   

  TWCR = (1<<TWEN)|                             // TWI Interface enabled.
         (1<<TWIE)|(1<<TWINT)|                  // Enable TWI Interupt and clear the flag.
         (0<<TWEA)|(1<<TWSTA)|(0<<TWSTO)|       // Initiate a START condition.
         (0<<TWWC);                             //

   while (!(TWCR & (1<<TWINT)));
   
   if (((TWSR & 0xF8) ==  0x08) || ((TWSR & 0xF8) ==  0x10)) //$ 08 - start condition has been transmitted, $ 10 repeated start condition has been transmitted
   {
      return 1;
   }
   else
   {
      return 0;
   };
};


void fi2c_stop(void)//issues a STOP condition.   
{
   TWCR = (1<<TWEN)|                                 // TWI Interface enabled
               (0<<TWIE)|(1<<TWINT)|                      // Disable TWI Interrupt and clear the flag
               (0<<TWEA)|(0<<TWSTA)|(1<<TWSTO)|           // Initiate a STOP condition.
               (0<<TWWC);
       
};

unsigned char fi2c_read(unsigned char ack)
/*reads a byte from the bus.
The ack parameter specifies if an acknowledgement is to be issued after the byte was read.
Set ack to 0 for no acknowledgement or 1 for acknowledgement.*/
{
   unsigned char data;
   
   if (ack == 0)         
        TWCR = (1<<TWEN)|                                 // TWI Interface enabled
               (1<<TWIE)|(1<<TWINT)|                      // Enable TWI Interupt and clear the flag to read next byte
               (0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|           // Send NACK after reception
               (0<<TWWC);  //TWCR &= 0x40; //TWEA = 0
   else
   TWCR = (1<<TWEN)|                                 // TWI Interface enabled
               (1<<TWIE)|(1<<TWINT)|                      // Enable TWI Interupt and clear the flag to read next byte
               (1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|           // Send ACK after reception
               (0<<TWWC);                                 // //TWCR |= 0x40; //TWEA =1
   delay_ms(1); //while (!(TWCR & (1<<TWINT)));

   data = TWDR;
   return data;
};


unsigned char fi2c_write(unsigned char data)
/*writes the byte data to the bus.
Returns 1 if the slave acknowledges or 0 if not.
*/
{
   TWDR = data;
   TWCR &= 0xcf; //TWSTA, TWSTO =0
   TWCR |= 0x84; //TWNT TWEN =1
   
   while (!(TWCR & (1<<TWINT)));

   if (((TWSR & 0xF8) ==  0x18) || ((TWSR & 0xF8) ==  0x28) || ((TWSR & 0xF8) ==  0x40)) //$ 40 SLA+R transmiteed, $18 SLA+W transmitted, $ 28 DATA transmitted ACK received
   {
      return 1;
   };
   if (((TWSR & 0xF8) ==  0x20) || ((TWSR & 0xF8) ==  0x30) || ((TWSR & 0xF8) ==  0x48)) //$20 SLA+W transmited, $ 30 - DATA transmited NOT ACK received $ 48 SLA+R transmitted
   {
      return 0;
   };
   
   
};   

/* read a byte from I2C device */
unsigned char I2C_read_byte (unsigned char BUS_ADR,unsigned char address)
{
unsigned char data;
#asm("cli");
fi2c_start();
data=fi2c_write(BUS_ADR);
data &=fi2c_write(address);
fi2c_start();
data &=fi2c_write(BUS_ADR | 1);
if(data)data=fi2c_read(0);
fi2c_stop();
#asm("sei")
return data;
}

/* write a byte to the I2C device */
unsigned char I2C_write_byte(unsigned char BUS_ADR,unsigned char address, unsigned char data)
{
unsigned char wr_status=1;
#asm("cli");
fi2c_start();
wr_status=fi2c_write(BUS_ADR);
wr_status &=fi2c_write(address);
wr_status &=fi2c_write(data);
fi2c_stop();
#asm("sei");
return wr_status;
}

Re: Интерактивный мобильный робот Vanessa

Michael_K » 21 ноя 2010, 21:07

Почти уверен, что дело в питании. Проверьте землю.

Re: Интерактивный мобильный робот Vanessa

avr123.nm.ru » 21 ноя 2010, 21:14

Над буквой "В" странная диаграмма какая-то. Попробуйте временно схему с МК питать от аккума если сейчас питаете о сети. Возможно корпус пк (если не ноут) не заземлен и с него помехи идут на общий провод устройств.

Re: Интерактивный мобильный робот Vanessa

Scorpio » 22 ноя 2010, 01:56

Выдернул контроллер из робота.Пропаял ему, гаду, ответственные места. Подключил к нему только компасс коротким кабелем. Запитал все от аккума. Напряжение питания идеальное. Отбросил комп в угол. Оставил только тестовый светодиод, чтобы мигал в случае ошибки чтения и горел когда все зависло. Помолился и запустил энту хрень. И что вы думаете? Стало еще хуже - ошибок больше, зависания чаще! Все - пойду повешусь! :crazy:

Re: Интерактивный мобильный робот Vanessa

avr123.nm.ru » 22 ноя 2010, 01:59

Сделайте прожект в PROTEUS - тогда общественность сможет подключится к вашему прожекту.

Подтяжки уменьшите до 1,5 кОм.

Re: Интерактивный мобильный робот Vanessa

Michael_K » 22 ноя 2010, 02:26

земля от ноги проца до ноги компаса звонится? Если осциллом померить землю компаса относительно земли проца, то что?

Re: Интерактивный мобильный робот Vanessa

avr123.nm.ru » 22 ноя 2010, 02:56

Найди фотик и сфоткай детально творение.

Re: Интерактивный мобильный робот Vanessa

Scorpio » 22 ноя 2010, 06:13

Уже намылил было веревку, да вспомнил, что у меня валяется BUTTERFLY с MEGA-169. Решил на нем программку протестировать, чтобы пойти путем грубых исключений. Для чистоты эксперимента запитал от того-же источника и использовал тот-же кабель на компас. Работает четко! Значит крамбик... сволочь... Что-бы с ним еще сделать? Может кварц? но до него теперь не добраться, крамб мертво запаян в плату контроллера.
Michael_K писал(а):земля от ноги проца до ноги компаса звонится? Если осциллом померить землю компаса относительно земли проца, то что?

Хорошая земля, я тоже про это думал. Все 5 I2C датчика ведут себя примерно одинакого, все с разными шлейфами.


Rambler\'s Top100 Mail.ru counter