Форум
 

Вернуться   Форум "Фрикер Клуб" - кодграббер своими руками > Основной раздел > Песочница

Важная информация

Ответ
 
Опции темы Опции просмотра
Старый 18.05.2017, 11:22   #11
1101 Меню Пользователя
Гость клуба
 
Регистрация: 12.04.2017
Сообщений: 2
По умолчанию Re: Граббер came

Использую передатчик FS1000a и приемник RF-5V. Этот скеч у меня тоже ничего не поймал с брелка CAME TOP 432NA. Думал приемник не рабочий. Зарядил вот такой переборщик
{code}
#define txPin 8
#define Te 320
int led = B00000001;
int led2 = B1000;
void setup(){
pinMode(txPin, OUTPUT);
}

void loop()
{
// SendCame(0b100010001111);
// delay(2000);
// SendCame((B1110 * 256) + B10101010);
// delay(5000);
SendCame((led2 * 256) + led);
led = led + B1;
// delay(1000);

if (led==11111111)
{led2 = led2 + B1; }
}

void SendCameBit(byte b)
{
delayMicroseconds(Te);
if (!b) digitalWrite(txPin,HIGH);
delayMicroseconds(Te);
digitalWrite(txPin,HIGH);
delayMicroseconds(Te);
digitalWrite(txPin,LOW);
}

void SendCame(long Code)
{
for (int j=0;j<5;j++) // посылку посылаем как и брелок - 4 раза подряд.
{
digitalWrite(txPin,HIGH);
delayMicroseconds(Te);
digitalWrite(txPin,LOW);// посылаем стартовый импульс

for (byte i=12;i>0;i--){
SendCameBit(bitRead(Code, i-1)); // побитово перебираем и посылаем код
}
delay(16);
}
delay(500); // сделать паузу после посылки на 2 с
}

{code}

Приемник коды получает.
Но коды кнопок я получил на этом скече

{code}
#define txPin 8 //пин передатчика
#define swPin 5 //пин включения приемника
#define rxPin 2 //пин приемника

void setup()
{
pinMode(rxPin, INPUT);
pinMode(txPin, OUTPUT);
// всегда устанавливаем пин включения приемника в 0 и не трогаем его больше
pinMode(swPin, OUTPUT);
digitalWrite(swPin, LOW);

Serial.begin(115200); // тут поставьте свою скорость
Serial.println("Came started");

// следующие 2 строчки включают перехватчик. если планируется только отправка их можно закоментить
attachInterrupt(0, grab, CHANGE); // обратите внимание на первый параметр - если у вас другая ардуина, он может быть не 1, а 0! 0 для arduino uno.
interrupts();
}

volatile static long lastCode = 0;

void loop() {
// это раскомментить и вместо 3693 вписать свой код для шлагбаума
//SendCame4(3693);
//delay(5000);
//return;

// при получении кода выводим его в терминал
if (lastCode > 0)
{
Serial.println(lastCode & 0xfff);
lastCode = 0;
}
}


// функция отправляет код в эфир
void SendCame4(long Code) {
for (int j = 0; j < 7; j++) { // посылку посылаем 4 раза подряд.
// время стартового импульса
digitalWrite(txPin, HIGH);
delayMicroseconds(320);
digitalWrite(txPin, LOW);
for (int i = 12; i > 0; i--) {
byte b = bitRead(Code, i - 1); // побитово перебираем и посылаем код
if (b) {
digitalWrite(txPin, LOW); // 1
delayMicroseconds(640);
digitalWrite(txPin, HIGH);
delayMicroseconds(320);
}
else {
digitalWrite(txPin, LOW); // 0
delayMicroseconds(320);
digitalWrite(txPin, HIGH);
delayMicroseconds(640);
}
}
digitalWrite(txPin, LOW);
delayMicroseconds(11520);
}
}


// ВЕСЬ КОД НИЖЕ - ПРИЕМ

#define MAX_DELTA 200
// длительность импульсов может плавать в зависимости от заряда батареии - макс допуск 200 мкс
boolean CheckValue(unsigned int base, unsigned int value)
{
return ((value == base) || ((value > base) && ((value - base) < MAX_DELTA)) || ((value < base) && ((base - value) < MAX_DELTA)));
}
volatile unsigned long prevtime;
volatile unsigned int lolen, hilen, state;
volatile static byte cameCounter = 0; // count of bits stored
volatile static long cameCode = 0; // code itself

void grab() {
state = digitalRead(rxPin);
if (state == HIGH)
lolen = micros() - prevtime;
else
hilen = micros() - prevtime;
prevtime = micros();

if (state == LOW)
{
// последовательность закончилась
if (CheckValue(320, hilen) && CheckValue(640, lolen)) // valid 1
{
cameCode = (cameCode << 1) | 1;
cameCounter++;
}
else if (CheckValue(640, hilen) && CheckValue(320, lolen)) // valid 0
{
cameCode = (cameCode << 1) | 0;
cameCounter++;
}
else cameCounter = 0;
} else
if (lolen > 1000 &&
(cameCounter == 12 || cameCounter == 13) &&
((cameCode & 0xfff) != 0xfff))
{
lastCode = cameCode & 0xfff;
cameCounter = 0;
cameCode = 0;
}
}
{code}

Так как в этом деле новичок, еще не разобрался почему так. Буду рад любой помощи.
1101 вне форума   Ответить с цитированием
Старый 18.05.2017, 11:26   #12
1101 Меню Пользователя
Гость клуба
 
Регистрация: 12.04.2017
Сообщений: 2
По умолчанию Re: Граббер came

День добрый!
У меня на скече ТС тоже ничего не заработало. Коды кнопок с брелка CAME TOP 432 не приходят в монитор порта. Хотя если генератор кодов работает, то они доходят. Коды с брелка получил вот с этим скечем
{code}
#define txPin 8 //пин передатчика
#define swPin 5 //пин включения приемника
#define rxPin 2 //пин приемника

void setup()
{
pinMode(rxPin, INPUT);
pinMode(txPin, OUTPUT);
// всегда устанавливаем пин включения приемника в 0 и не трогаем его больше
pinMode(swPin, OUTPUT);
digitalWrite(swPin, LOW);

Serial.begin(115200); // тут поставьте свою скорость
Serial.println("Came started");

// следующие 2 строчки включают перехватчик. если планируется только отправка их можно закоментить
attachInterrupt(0, grab, CHANGE); // обратите внимание на первый параметр - если у вас другая ардуина, он может быть не 1, а 0! 0 для arduino uno.
interrupts();
}

volatile static long lastCode = 0;

void loop() {
// это раскомментить и вместо 3693 вписать свой код для шлагбаума
//SendCame4(3693);
//delay(5000);
//return;

// при получении кода выводим его в терминал
if (lastCode > 0)
{
Serial.println(lastCode & 0xfff);
lastCode = 0;
}
}


// функция отправляет код в эфир
void SendCame4(long Code) {
for (int j = 0; j < 7; j++) { // посылку посылаем 4 раза подряд.
// время стартового импульса
digitalWrite(txPin, HIGH);
delayMicroseconds(320);
digitalWrite(txPin, LOW);
for (int i = 12; i > 0; i--) {
byte b = bitRead(Code, i - 1); // побитово перебираем и посылаем код
if (b) {
digitalWrite(txPin, LOW); // 1
delayMicroseconds(640);
digitalWrite(txPin, HIGH);
delayMicroseconds(320);
}
else {
digitalWrite(txPin, LOW); // 0
delayMicroseconds(320);
digitalWrite(txPin, HIGH);
delayMicroseconds(640);
}
}
digitalWrite(txPin, LOW);
delayMicroseconds(11520);
}
}


// ВЕСЬ КОД НИЖЕ - ПРИЕМ

#define MAX_DELTA 200
// длительность импульсов может плавать в зависимости от заряда батареии - макс допуск 200 мкс
boolean CheckValue(unsigned int base, unsigned int value)
{
return ((value == base) || ((value > base) && ((value - base) < MAX_DELTA)) || ((value < base) && ((base - value) < MAX_DELTA)));
}
volatile unsigned long prevtime;
volatile unsigned int lolen, hilen, state;
volatile static byte cameCounter = 0; // count of bits stored
volatile static long cameCode = 0; // code itself

void grab() {
state = digitalRead(rxPin);
if (state == HIGH)
lolen = micros() - prevtime;
else
hilen = micros() - prevtime;
prevtime = micros();

if (state == LOW)
{
// последовательность закончилась
if (CheckValue(320, hilen) && CheckValue(640, lolen)) // valid 1
{
cameCode = (cameCode << 1) | 1;
cameCounter++;
}
else if (CheckValue(640, hilen) && CheckValue(320, lolen)) // valid 0
{
cameCode = (cameCode << 1) | 0;
cameCounter++;
}
else cameCounter = 0;
} else
if (lolen > 1000 &&
(cameCounter == 12 || cameCounter == 13) &&
((cameCode & 0xfff) != 0xfff))
{
lastCode = cameCode & 0xfff;
cameCounter = 0;
cameCode = 0;
}
}
{code}
1101 вне форума   Ответить с цитированием
Старый 19.05.2017, 04:13   #13
andynvkz Меню Пользователя
Резидент клуба
 
Регистрация: 03.11.2011
Сообщений: 756
По умолчанию Re: Граббер came

решил тоже такое замутить, использую DUE c CC1101, так как с ардуино не имел дело, то параллельно изучаю его
Вложения
Тип файла: rar Arduino_CC.rar (1.4 Кб, 35 просмотров)
andynvkz вне форума   Ответить с цитированием
Старый 22.05.2017, 14:47   #14
andynvkz Меню Пользователя
Резидент клуба
 
Регистрация: 03.11.2011
Сообщений: 756
По умолчанию Re: Граббер came

может кто на пальцах объяснить как это работает ?

state = digitalRead(cc_gd2);
if (state == HIGH)
lolen = micros() - prevtime;
else
hilen = micros() - prevtime;
prevtime = micros();

Добавлено через 1 минуту
считываем уровень с пина и если он высокий....???

Добавлено через 1 минуту
может кто поделится приемом статики, а то я не силен в Си
andynvkz вне форума   Ответить с цитированием
Старый 22.05.2017, 16:28   #15
shooter Меню Пользователя
Член клуба
 
Аватар для shooter
 
Регистрация: 05.04.2014
Сообщений: 110
По умолчанию Re: Граббер came

Здесь есть http://skproj.ru/otkryt-shlagbaum-came/
shooter вне форума   Ответить с цитированием
Старый 22.05.2017, 16:36   #16
russo_turisto Меню Пользователя
Модератор
 
Аватар для russo_turisto
 
Регистрация: 21.08.2011
Сообщений: 1,205
По умолчанию Re: Граббер came

Если уровень высокий, значит был низкий и пишем длительность низкого уровня, иначе пишем длительность высокого уровня

http://phreakerclub.com/forum/showth...82%D0%BE%D1%80
http://phreakerclub.com/forum/showth...82%D0%BE%D1%80
http://phreakerclub.com/forum/showth...82%D0%BE%D1%80
russo_turisto вне форума   Ответить с цитированием
Старый 22.05.2017, 18:11   #17
andynvkz Меню Пользователя
Резидент клуба
 
Регистрация: 03.11.2011
Сообщений: 756
По умолчанию Re: Граббер came

Цитата:
Сообщение от russo_turisto
Если уровень высокий, значит был низкий и пишем длительность низкого уровня, иначе пишем длительность высокого уровня

http://phreakerclub.com/forum/showth...82%D0%BE%D1%80
http://phreakerclub.com/forum/showth...82%D0%BE%D1%80
http://phreakerclub.com/forum/showth...82%D0%BE%D1%80

это я понял, не понял как он счетает

Добавлено через 6 минут
hilen = micros() - prevtime;

Добавлено через 1 минуту
hilen присваевается значения micros() от которого отнимаем prevtime

Добавлено через 1 минуту
prevtime вообще пустая переменная

Добавлено через 2 минуты
в идеале бы в отладчике глянуть как этот момент работает
andynvkz вне форума   Ответить с цитированием
Старый 22.05.2017, 19:20   #18
russo_turisto Меню Пользователя
Модератор
 
Аватар для russo_turisto
 
Регистрация: 21.08.2011
Сообщений: 1,205
По умолчанию Re: Граббер came

http://arduino.ru/Reference/Micros

PHP код:
void grab() {
state digitalRead(rxPin);
if (
state == HIGH)
lolen micros() - prevtime;
else
hilen micros() - prevtime;
prevtime micros();  //------------------------вот--------------- prevtime 
russo_turisto вне форума   Ответить с цитированием
Старый 24.05.2017, 04:47   #19
andynvkz Меню Пользователя
Резидент клуба
 
Регистрация: 03.11.2011
Сообщений: 756
По умолчанию Re: Граббер came

а не так разве должно быть ?

PHP код:
void grab() { 
prevtime micros();
state digitalRead(rxPin); 
if (
state == HIGH
lolen micros() - prevtime
else 
hilen micros() - prevtime
Добавлено через 13 минут
все вроде начинаю понимать, запоминаем время срабатывания прерывания, при следующем срабатывании вычитаем и получаем время промежутка

Последний раз редактировалось andynvkz; 24.05.2017 в 04:41.
andynvkz вне форума   Ответить с цитированием
Старый 25.05.2017, 03:15   #20
andynvkz Меню Пользователя
Резидент клуба
 
Регистрация: 03.11.2011
Сообщений: 756
По умолчанию Re: Граббер came

Попытался попробовать прием от Valeron вроде пишут что рабочий, но у меня не работает, есть подозрения на прерывание:
PHP код:
int i;

const 
unsigned int rf_settings[] = {0x360x000x0D0x020x0D0x030x470x08,
                                    
0x320x0B0x060x0D0x100x0E0xB00x0F,
                                    
0xAD0x100x870x110x320x130x200x14,
                                    
0x000x150x040x180x180x190x160x1B,
                                    
0x070x1C0x000x1D0x910x200xFB0x21,
                                    
0xB60x230xE90x240x2A0x250x000x26,
                                    
0x1F0x2C0x810x2D0x350x2E0x09 };

const 
unsigned int rf_am[] = {0x360x120x300x220x110x3E0x000x3E,
                              
0xC00x3E0x000x3E0x000x3E0x000x3E,
                              
0x000x3E0x000x3E0x00 };

#define spi_cs  51
#define spi_miso  50
#define spi_mosi  48
#define spi_sck 49
#define cc_gd2  53
#define cc_gd0  52

#define SIDLE 0x36  // ждущий режим
#define SRX 0x34 // приём
#define STX 0x35 // передача
#define SRES 0x30 // сброс
#define SNOP 0x3D // получить статус

volatile byte level=255;
volatile unsigned long lastlen;
byte p_level;
unsigned long p_lenp_len_prev;

#define SL_MIN_PRE_COUNT 4
#define SL_MAX_PRE 1150
#define SL_MIN_PRE 850
#define SL_MAX_ZERO 350
#define SL_MIN_ZERO 100
#define SL_MAX_ONE 700
#define SL_MIN_ONE 400
#define SL_MIN_BITS 16
#define SL_MAX_BITS 64

#define KL_MIN_PRE_COUNT 4
#define KL_MAX_TE 500
#define KL_MIN_TE 300
#define KL_MAX_BITS 64

struct
{
  
byte state;
  
unsigned long TE;
  
byte pre_countdata[8], dat_bit;
keeloq;

struct
{
  
byte state;
  
byte pre_countdata[8], dat_bit;
starline;

//***************************************************************
void setup() {
  
attachInterrupt(cc_gd2rx_intCHANGE);

  
Serial.begin(115200); 
  while(!
Serial);

  
Serial.println("MEGA OVERFUCK ARDUINO LOGGER BY HUY FOR NARKOMANS");
  
Serial.println("");

  
cc_init();
    
i=spi_rw(SNOP);
  
Serial.println(i);
  
cc_am();
    
i=spi_rw(SNOP);
  
Serial.println(i);
  
spi_rw(SRX);
    
i=spi_rw(SNOP);
  
Serial.println(i);
  
  
interrupts();
  

}

byte a;

void loop() {
    if(
level!=255)
  {
    
noInterrupts();
    
p_level=level;
    
p_len=len;
    
len=0;
    
level=255;
    
interrupts();
    
    
process_keeloq();
    
process_starline();
    
    
p_len_prev=p_len;
  }
  
  if(
keeloq.state==100)
  {
    
Serial.print("KEELOQ: ");
    
dump_hex(keeloq.data64);
    
keeloq.state=0;
  }
  
  if(
starline.state==100)
  {
    
Serial.print("STARLINE[");
    
Serial.print(starline.dat_bit);
    
Serial.print("]: ");
    
dump_hex(starline.datastarline.dat_bit);
    
starline.state=0;
  }

}

void setbit(byte *databyte n)
{
  
data[n/8]|=1<<(n%8);
}

void process_keeloq()
{
  switch(
keeloq.state)
  {
    case 
0:
      if(
p_level) break;
      
keeloq.state=1;
      
keeloq.pre_count=0;
      break;

    case 
1//pre+hdr
      
if(p_len>=KL_MIN_TE && p_len<=KL_MAX_TEkeeloq.pre_count++;
      else if(!
p_level && p_len>=KL_MIN_TE*10 && p_len<=KL_MAX_TE*10 && keeloq.pre_count>=KL_MIN_PRE_COUNT)
      {
        
keeloq.TE=p_len/10;
        
keeloq.state=2;
        
keeloq.dat_bit=0;
        
keeloq.data[0]=0x00;
        
keeloq.data[1]=0x00;
        
keeloq.data[2]=0x00;
        
keeloq.data[3]=0x00;
        
keeloq.data[4]=0x00;
        
keeloq.data[5]=0x00;
        
keeloq.data[6]=0x00;
        
keeloq.data[7]=0x00;
      }
        else
      {
        
keeloq.state=0;
        break;
      }
      break;

    case 
2//dat
      
if(!p_level) break;

      if(
p_len<keeloq.TE/|| p_len>keeloq.TE*3)
      {
        
keeloq.state=0;
        break;
      }

      if(
p_len<=keeloq.TE+keeloq.TE/2setbit(keeloq.datakeeloq.dat_bit);
      if(++
keeloq.dat_bit==KL_MAX_BITSkeeloq.state=100;
      break;
  }
}

void process_starline()
{
  
byte b;

  switch(
starline.state)
  {
    case 
0:
      if(
p_level) break;
      
starline.state=1;
      
starline.pre_count=0;
      break;

    case 
1//pre
      
if(p_len>=SL_MIN_PRE && p_len<=SL_MAX_PREstarline.pre_count++;
      else if(
p_len<SL_MIN_PRE && starline.pre_count>=SL_MIN_PRE_COUNT)
      {
        
starline.state=2;
        
starline.dat_bit=0;
        
starline.data[0]=0x00;
        
starline.data[1]=0x00;
        
starline.data[2]=0x00;
        
starline.data[3]=0x00;
        
starline.data[4]=0x00;
        
starline.data[5]=0x00;
        
starline.data[6]=0x00;
        
starline.data[7]=0x00;
      }
        else
      {
        
starline.state=0;
        break;
      }
      break;

    case 
2//dat
      
if(p_level) break;
      
      if(
p_len_prev>=SL_MIN_ONE && p_len_prev<=SL_MAX_ONE &&
         
p_len>=SL_MIN_ONE && p_len<=SL_MAX_ONEb=1;
       else
      if(
p_len_prev>=SL_MIN_ZERO && p_len_prev<=SL_MAX_ZERO &&
         
p_len>=SL_MIN_ZERO && p_len<=SL_MAX_ZEROb=0;
      else
      {
        if(
starline.dat_bit>=SL_MIN_BITSstarline.state=100;
          else 
starline.state=0;
        break;
      }

      if(
bsetbit(starline.datastarline.dat_bit);
      if(++
starline.dat_bit==SL_MAX_BITSstarline.state=100;
      break;
  }
}

void dump_hex(byte *bufbyte bits)
{
  
byte a;
  
  for(
a=0a<(bits+7)/8a++)
  {
    if(
buf[a]<=0x0fSerial.print('0');
    
Serial.print(buf[a], HEX);
    
Serial.print(" ");
  }
  
Serial.println("");
}

void rx_int()
{
  if(
level!=255) return;
  
  
len=micros()-last;
  
last=micros();
  
  if(
digitalRead(cc_gd2)==HIGHlevel=0;
    else 
level=1
}




//***************************************************************
void spi_init()
{
  
pinMode(spi_csOUTPUT);
  
pinMode(spi_misoINPUT);
  
pinMode(spi_mosiOUTPUT);
  
pinMode(spi_sck,  OUTPUT);
  
digitalWrite (spi_cs0);
  
digitalWrite (spi_mosi0);
  
digitalWrite (spi_sck,  0);
}
//****************************************************************
uint8_t spi_rw(uint8_t write) {
  
uint8_t read 0;
while (
digitalRead(spi_miso)==HIGH){};
  for (
int i 08i++) {
    if (
write 0x80digitalWrite (spi_mosi1);
    else              
digitalWrite (spi_mosi0);
    
write <<= 1;
    
delayMicroseconds(100);
    
digitalWrite (spi_sck1);
    
delayMicroseconds(100);
    
read <<= 1;
    if (
digitalRead(spi_miso)) read |= 1;
    
digitalWrite (spi_sck0);
    
  }
  return 
read;
}
//***************************************************************
void cc_init()
{
  
pinMode(cc_gd0OUTPUT);
  
pinMode(cc_gd2INPUT);
  
spi_init();
  
spi_rw(SRES);
  
delay(500);
  for (
0!= 55i++)
  {
    
spi_rw(rf_settings[i] >> 8);
  }
}
//****************************************************************
void cc_am()
{
  for (
0!= 21i++)
  {
    
spi_rw(rf_am[i] >> 8);
  }

andynvkz вне форума   Ответить с цитированием
Ответ

Опции темы
Опции просмотра

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.



Текущее время: 18:15. Часовой пояс GMT +3.


vBulletin 4.1.0 Перевод: zCarot
(C) www.phreakerclub.com
Яндекс.Метрика