roboforum.ru

Технический форум по робототехнике.
Текущее время: 30 апр 2025, 20:32

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: Управление Ардуиной с ИК-пульта Easy remote-4
СообщениеДобавлено: 22 июл 2011, 00:09 
Не в сети

Зарегистрирован: 14 окт 2009, 11:46
Сообщения: 160
Откуда: Самара
Пульт - из комплекта роботов RoboPICA и MicroCamp. Выдаёт ASCII-коды букв (больших и маленьких) A,B,C,D в формате 8N1 на скорости 1200 бит/с.
Дуня - Freeduino Nano одноимённого изготовителя (http://freeduino.ru).
Задача была вполне понятная - организовать на Arduino приём кодов с этого пульта по прерыванию (как и у выше упомянутых роботов). Было перепробовано 4 варианта:
1. Тупо переписанная с PIC-а тамошняя процедура (тоже на Си) приёма кодов:
Код:
// Это ужЕ на Wiring-е
const int TSOPpin=2;  //(Почему фсе используют #define ???)
volatile byte buf_c=0;

void Rx()
{
  noInterrupts();
  byte buf;
  byte data=0;
  delayMicroseconds(1250);  // Propusk start-bita i poloviny intervala
  for(byte i=0;i<8;++i)
  {
    buf=digitalRead(TSOPpin)<<i;
    data=data|buf;
    delayMicroseconds(833);
  }
  buf_c=data;
  interrupts();
}


2. Аналогичная процедура, но переписанная по собственному разумению:
Код:
void receiveTSOP()
{
  noInterrupts();
  boolean buf1;
  delayMicroseconds(416);  // Propusk poloviny intervala
  for(byte i=0;i<8;i++)
  {
    delayMicroseconds(833);  // Propusk intervala
    buf_c=buf_c>>1;
    buf1=digitalRead(TSOPpin);
    if(buf1==1)
      buf_c=buf_c | 0x80;
  }
  delayMicroseconds(833);
  interrupts();
}


3. Использование библиотеки SoftwareSerial (исходник не сохранился, но в-общем, он будет похож на следующий).
Все эти варианты ПРЕКРАСНО РАБОТАЛИ в ПРОТЕУСЕ!!!! И нифига не работали на живом железе!!!

4. Работающий вариант (библиотека NewSoftSerial):
Код:
#include <NewSoftSerial.h>

const int TSOPpin=2;
const int dummipin=5;  // Dummi pin

volatile byte buf_c=0;

NewSoftSerial TSOP(TSOPpin,dummipin);

void setup()
{
//...
  TSOP.begin(1200);
//...
}

void SoftserTSOP()
{
  noInterrupts();
  buf_c=TSOP.read();
  interrupts();
}


4-й вариант тоже заработал только после указания типа byte для переменной buf_c. Ни int, ни unsigned char не помогали.
В-общем, если кому-нибудь понадобится, то вот.

Да, забыл функцию setup() для 4-го варианта. Поправил.

_________________
Когда я слышу слова "Первый закон робототехники", я вспоминаю анекдот про ноусэров.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 4 часа


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO