Тема: ИК управление

Народ , помогите с модуляцией ИК сигнала.
Проблема в следующем.
Имею два МК (один на фридуино другой на самодельной плате)
на одном установлен TSOP1736 , на другом ИК светодиод (на частоте 36 Кгц).
Прием сигнала на TSOP нормальный , но мне нужно передавать по ИК определенные сигналы.
На приемнике программа примерно такая :

int pin = 7;
unsigned long duration;

void setup()
{
  pinMode(pin, INPUT);
Serial.begin(9600);
}

void loop()
{
  duration = pulseIn(pin, HIGH);
Serial.print (duration);
delay(1000);
}


На передатчике




void setup()
{
 

}

void loop()
{
tone(9,36000);
delay(1000);
noTone(9);
delay(1000);

}


Т.е. на мониторе приемника должны быть импульсы 1000мс , а там какая то чушь
, почему ?

2

Re: ИК управление

На TSOP1736 и других им подобных - HIGH это отсутствие сигнала, LOW - наличие.

3

Re: ИК управление

Это не важно , сигнал можно и инвертировать .
HIGH или LOW  - результат один , функция pulsin  работает не коректно.

4

Re: ИК управление

Или это я делаю что то не так ?

5

Re: ИК управление

Возможно мешает delay, ведь пока он выполняется микроконтроллер не принимает сигналов. Вообще логичнее было бы соорудить приемную часть на прерывании, но можно попробовать и так (точно не уверен, pulseIn никогда не использовал, сам в ик приемнике использовал таймер):

int pin = 7; 
unsigned long duration;

void setup()
{
  pinMode(pin, INPUT);
Serial.begin(9600);
}

void loop()
{
duration = 0;
duration = pulseIn(pin, HIGH);
if (duration>0) {Serial.print (duration);}
}

6

Re: ИК управление

mogalkov , а можете привести пример таймера.
Я думал об этом , но что то не получилось.
В моем понимании таймер делает первый замер когда изменяется лог уровень на входе МК ,
а второй замер когда лог изменяется обратно , второй замер - первый = длинна импульса ,
но как прописать всю эту конструкцию в условии оператора, например ,if я не знаю.
Может у кого есть мысли ?

7

Re: ИК управление

А если вот так ?
Просто сейчас нет возможности проверить.

unsigned long time;
unsigned long time2;
int time3=0;

void setup  ()
{
 
  pinMode(7,INPUT);
  Serial.begin(9600);
}
void loop()

{
if( digitalRead(7)==!digitalRead(7))
{
  time=millis();
}
  if( digitalRead(7)==!digitalRead(7))
{
  time2=millis();
}
time3=time2-time;
Serial.print(time3);
 
}

8

Re: ИК управление

Для таймера в твоем случае лучше использовать for, и удобнее отдельной функцией:

long previousMillis;
unsigned long currentMillis;
long vivod;

long timerschet ()
{
for (int i;i!=1;)
{
unsigned long currentMillis = millis();
previousMillis = currentMillis - previousMillis;
i=digitalRead(7);
}
return (previousMillis);
}

void setup  ()
{
 
  pinMode(7,INPUT);
  Serial.begin(9600);
}

void loop()
{
if (digitalRead(7)!=1)
{
vivod=timerschet ();
Serial.print(vivod);
}
}

9

Re: ИК управление

А можно откоментировать программу ?
Не совсем понятно.

10 (2011-06-04 01:28:35 отредактировано mogalkov)

Re: ИК управление

Не очень люблю каменты писать в прогах, но попробую:

long previousMillis;/*переменная конечного времени*/
unsigned long currentMillis;/*Переменная начального времени*/
long vivod;/*результирующая переменная времени*/

long timerschet ()/* создаем функцию отсчета времени типа лонг*/
{
for (int i;i!=1;)/*для отчета нужен цыкл. цыкл до тех пор пока значение переменной i не равно 1 (HIGH)*/
{
unsigned long currentMillis = millis();/*присваиваем начальной переменной текущее
значение системного таймера*/
previousMillis = currentMillis - previousMillis;/*вычитаем из текущего таймера предыдущее значение
чтобы получить абсолбтное время с начала запуска таймера*/
i=digitalRead(7);/*gприсвоить переменной значение снятое с кнопки*/
}
return (previousMillis);/*завершить функцию и выдать в качестве результата переменную*/
}

void setup  ()/*стандартный сетуп*/
{
 
  pinMode(7,INPUT);
  Serial.begin(9600);
}

void loop()/*обычная петля*/
{
if (digitalRead(7)!=1)/*если на входе не 1(HIGH)*/
{
vivod=timerschet();/*присвоить переменной результирующее значение из функции*/
Serial.print(vivod);/*выдать значение на порт*/
}
}

Подобное решение я использовал в ик выключателе света: http://freeduino.ru/forum/viewtopic.php?id=130