Управление Ардуиной с ИК-пульта Easy remote-4

Как собрать и запрограммировать робота на Arduino(Freeduino, Roboduino, Seeduino ...). Используем Wiring и Processing.

Управление Ардуиной с ИК-пульта Easy remote-4

Сообщение GlassEagle » 22 июл 2011, 00:09

Пульт - из комплекта роботов 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-го варианта. Поправил.
Когда я слышу слова "Первый закон робототехники", я вспоминаю анекдот про ноусэров.
GlassEagle
 
Сообщения: 160
Зарегистрирован: 14 окт 2009, 11:46
Откуда: Самара

Вернуться в Arduino и другие Xduino

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

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