Pages: [1]   Go Down
Author Topic: Receptor de RF 433.92 para controle de portão  (Read 2066 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 44
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Olá pessoal,

Já estou a uma semana pesquisando sobre isso e já coletei bastante informações, já até montei o sistema. Comprei até um receptor para central de alarme Reptor 2 para auxiliar o meu projeto.

Pesquisando em foruns de Arduino, descobri que meu projeto já é largamente implementado para PIC, mas para Arduino só acho código conversando 2 arduinos com receptor e transmissor, mas ainda não achei um projeto para controles Code Learning (ou qualquer outro).

Eu criei o seguinte código pra teste:

Code:
#include <SoftwareSerial.h>

SoftwareSerial mySerial(2,3);

void setup() {
 
  Serial.begin(9600);
 
  mySerial.begin(1200);                      // Software Serial port initialization by 1200 bps
  mySerial.setTimeout(10000);                // Set time out 10 sec
  mySerial.flush();   
 
  /*
  D13 - 1 RF +VCC
  D12 - 2 RF GND
  NC - 3 IN Antena
  NC - 4 NC
  NC - 5 NC
  NC - 6 NC
  D7 - 7 RF GND
  NC - NC
  NC - 9 NC 38.1mm
  D5 - 10 AF +VCC
  D4 - 11 AF GND
  NC - 12 AF +VCC
  NC - 13 Test Point
  D1 - 14 OUT decoder
  NC - 15 AF +VCC
  */
  pinMode(13,OUTPUT); // D13 - 1 RF +VCC
  pinMode(12,OUTPUT); // D12 - 2 RF GND
  pinMode(7,OUTPUT); // D7 - 7 RF GND
  pinMode(5,OUTPUT); // D5 - 10 AF +VCC
  pinMode(4,OUTPUT); // D4 - 11 AF GND
 
  digitalWrite(13,1); // D13 - 1 RF +VCC
  digitalWrite(12,0); // D12 - 2 RF GND
  digitalWrite(7,0); // D7 - 7 RF GND
  digitalWrite(5,1); // D5 - 10 AF +VCC
  digitalWrite(4,0); // D4 - 11 AF GND

}

void loop()
{
  if(mySerial.available())  // If Software Serial detect any data in it's buffer
    Serial.print(mySerial.read());
}

E ao ligar o Serial Monitor, aparecem números randômicos de 0 - 9 sem eu pressionar nada. Mas percebi que quando eu pressionava aparecia um número de 13 casas que se repetiam, considerei então que esse era meu ID. Porém quando tentava repetir o teste não conseguia achar ele, repetia novamente e funcionava novamente.

Eu não posso confiar em um código que é intermitente.

Você já aplicaram essa solução, como ficou?
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3290
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quanto é que esses bichinhos de RF consomem? Algum motivo para os alimentares através dos pinos do Arduino?
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 44
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quanto é que esses bichinhos de RF consomem? Algum motivo para os alimentares através dos pinos do Arduino?

Na verdade esses outputs eram pro receptor RR3 433.9, porém agora estou usando uma central que é alimentada na tomada (não estou usando mais os pinos citados).
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3290
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Já experimentaste a NewSoftSerial?
Creio que é melhor que a SoftwareSerial.
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 44
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Já experimentaste a NewSoftSerial?
Creio que é melhor que a SoftwareSerial.

Baixei a biblioteca e substitui:

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2,3);

por:

#include <NewSoftSerial.h>
NewSoftSerial mySerial(2,3);

Porém não compilou:
error: #error NewSoftSerial has been moved into the Arduino core as of version 1.0. Use SoftwareSerial instead.
« Last Edit: July 19, 2013, 11:30:12 am by jgarcia » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 44
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Código pronto!
Recuperando o ID dos dispositivos Code Learning, créditos a Dene daqui no fórum.

Code:
/*
 ARDUINO DECODIFICADOR HT6P20B COM RESISTOR DE 2M2 NO OSC.
 ESTE CÓDIGO NÃO USA TIMER, INTERRUPÇÃO EXTERNA E NEM PINO DEFINIDO DE ENTRADA.
 ELE MEDE O TEMPO DO PILOT PERIOD E COMPARA SE ESTÁ DENTRO DA FAIXA DEFINIDA,
 SE TIVER ELE PASSA PARA CODE PERIOD E FAZ AS MEDIDÇÕES DE TEMPO EM NIVEL ALTO
 SE TIVER DENTRO DA FAIXA ACRECENTA BIT 1 OU 0 NA VARIAVEL _DATA CASO NÃO ZERA AS VARIÁVEIS E RE-INICIA
 APOS RECEBER TODOS OS BITS ELE PEGA OS 4 BITS DO ANTE CODE E TESTA PARA SABER SE O CÓDIGO FOI RECEBIDO
 CORRETAMENTE, CASO RECEBIDO CERTO ELE COLOCA A VARIAVEL ANTCODE EM 1.
 
 CRIADO POR: JACQUES DANIEL MORESCO
 DATA: 28/02/2012 USANDO ARDUINO 0022.
 FONES:54 3324 2251 54 9206 7168
 E-MAIL: ibisul@ibisul.com.br
 Permitido o uso público, mas deve-se manter o nome do autor.
 */

int x,startbit,ctr,dataok,t1,larpulso,larpulso1,larpulso2,larpulso3,larpulso4,bt1,bt2,antcode=0;
unsigned long _data=0;   // DATA é o Código recebio do HT6p20 todos os 28 BITS onde, 22 do coodigo+2 dos botões+4 do anti-codigo;
unsigned long _dur,_dur1;      // Duração do Pulso
byte          _pin;    // Pino que vai receber o sinal RF digital.

void setup(){
  _pin=2;
  Serial.begin(9600);
  pinMode(2, INPUT);
  //pinMode(13, OUTPUT);
 
  pinMode(13,OUTPUT); // D13 - 1 RF +VCC
  pinMode(12,OUTPUT); // D12 - 2 RF GND
  pinMode(7,OUTPUT); // D7 - 7 RF GND
  pinMode(5,OUTPUT); // D5 - 10 AF +VCC
  pinMode(4,OUTPUT); // D4 - 11 AF GND

  digitalWrite(13,1); // D13 - 1 RF +VCC
  digitalWrite(12,0); // D12 - 2 RF GND
  digitalWrite(7,0); // D7 - 7 RF GND
  digitalWrite(5,1); // D5 - 10 AF +VCC
  digitalWrite(4,0); // D4 - 11 AF GND
}

void loop(){

  //digitalWrite(13, digitalRead(2)); //Pisca o LED conforme o valor da entrada digital, testar interferencias.
  if (startbit==0)
  {// Testa o tempo piloto até o Bit de inicio;
    _dur = pulseIn(_pin, LOW);
    if(_dur > 8000 && _dur < 12000 && startbit==0)
    {
      larpulso=_dur/23;
      larpulso1=larpulso-50;
      larpulso2=larpulso+50;
      larpulso3=larpulso+larpulso-50;
      larpulso4=larpulso+larpulso+50;
      startbit=1;
      _dur=0;
      _data=0;
      dataok=0;
      ctr=0;
    }
  }

  // Se o Bit de inicio OK ENTÃO Inicia a medição do tempo em Nivel ALTO dos sinais, e testa se o tempo está na faixa.
  if (startbit==1 && dataok==0 && ctr < 28)
  {
    ++ctr;
    _dur1 = pulseIn(_pin, HIGH);
    if(_dur1 > larpulso1 && _dur1 < larpulso2)     // Se a largura de pulso é entre 1/4000 e 1/3000 segundos
    {
      _data = (_data << 1) + 1;      // anexar um * 1 * para a extremidade mais à direita do buffer
    }
    else if(_dur1 > larpulso3 && _dur1 < larpulso4)   // Se a largura de pulso é entre 2/4000 e 2/3000 segundos
    {
      _data = (_data << 1);       // anexar um * 0 * para a extremidade mais à direita do buffer
    }
    else
    {
      /* força finalização do laço */
      startbit=0;
    }

  }




  if (ctr==28)
  {
    if (bitRead(_data,0)==1)
    {
      if (bitRead(_data,1)==0)
      {
        if (bitRead(_data,2)==1)
        {
          if (bitRead(_data,3)==0)
          {
            antcode=1;
          }
        }
      }
    }   

    if (antcode==1)
    {// Se foram recebidos todos os 28 Bits, o valor vai para a variavel _data e pode ser usada como exemplo abaixo.
      dataok=1;
     
      Serial.print("ID: ");
      Serial.println(_data/16,BIN);
      ctr=0;
      startbit=0;
      antcode=0;
      delay(100);
    }
  }
}
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi Guys!

I developed a sketch based on the code above and many others..
For all "remote controls" that use the encoder HT6P20 I tested, it worked!

See the links below:
English:
http://acturcato.wordpress.com/2014/01/04/decoder-for-ht6p20b-encoder-on-arduino-board-english/

Portuguese:
http://acturcato.wordpress.com/2013/12/20/decodificador-para-o-encoder-ht6p20b-em-arduino/
Logged

Belo Horizonte - Brasil
Offline Offline
Newbie
*
Karma: 1
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Para quem quiser entender detalhadamente sobre controles remotos de RF,
podem dar uma olhada nesse tutorial que eu fiz:
Citei o código do Turcato - muito bom!


http://labdegaragem.com/forum/topics/desvendando-controle-remoto-rf
Logged

São Paulo
Offline Offline
Jr. Member
**
Karma: 2
Posts: 87
Open your mind .
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Só para lembrar é errado alimentar qualquer dispositivo pelas portas digitais do arduino , pois as mesma sofrem a oscilação do micro e interfere nos dispositivos
Logged

Arduino Duemilanove
Arduino Mega 2560  
Xbox 360

Pages: [1]   Go Up
Jump to: