Форум
 

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

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

Ответ
 
Опции темы Опции просмотра
Старый 29.03.2018, 12:28   #401
dreamwait Меню Пользователя
Вступил в клуб
 
Регистрация: 11.11.2015
Сообщений: 81
По умолчанию Re: Исходники под ардуину

Был у меня шилд, но сдох приемник - а те что были работали просто ужос. Вспомнил, что заказывал себе сс1101 - переделал на нем (по примеру выше). Пример работал странно - принимал типа старлайн, на кеелог вообще не реагировал. сделал чуть другой вариант -
Среда - Ардуино. Код сборный - конфиг от Пауля74, прием - от анмоторса (так как его брелки есть).
Состав - Ардуино нано, преобразователь уровней 3-5, дисплей 1.44 spi, преобразователь питания 5в-3.3в, SD кард модуль.
Прием работает, кеелог и анмоторс принимает (только байты "задом наперед" - если кому для алгоритма).
Не проверял только выброс - так что не уверен, что он работает - сс1101 несколько дней только мучаю, есть сомнения что правильно написал. Примеры видел только через буфер сс1101 - я делал по старинке, по битам. Не взлетит - перепишу.
Вложения
Тип файла: zip GrabCC1101.zip (4.1 Кб, 87 просмотров)

Последний раз редактировалось dreamwait; 29.03.2018 в 12:36.
dreamwait вне форума   Ответить с цитированием
Старый 03.04.2018, 09:44   #402
dreamwait Меню Пользователя
Вступил в клуб
 
Регистрация: 11.11.2015
Сообщений: 81
По умолчанию Re: Исходники под ардуину

В предыдущем примере выброс не работает - неверно настроено переключение режимов прием-передача. Пока разбираюсь - не все так просто с сс1101.

И второе западло - модуль брал у китайцев - похоже фейковый. Залил тестовый скетч (от библиотеки сс1101.h) - модель, версия и серийный номер - все по нулям... Так что похоже придется покупать оригинальный чип и пересаживать.
dreamwait вне форума   Ответить с цитированием
Старый 03.04.2018, 11:23   #403
popcorn Меню Пользователя
Гость клуба
 
Регистрация: 16.03.2018
Сообщений: 8
По умолчанию Re: Исходники под ардуину

а зачем нужен оригинальный ? это вообще неясно . и что там сложно в переключении приём передача ? сложно правильные настройки сделать если плохо разбираешься .
popcorn вне форума   Ответить с цитированием
Старый 15.06.2018, 21:09   #404
Ruslan1958 Меню Пользователя
Член клуба
 
Регистрация: 23.04.2015
Сообщений: 136
По умолчанию Re: Исходники под ардуину

Вот к примеру лог моего ключа без связи с машиной. Я так понял что если бы он связался с машиной то на кнопках уже был бы другой код. А что если например автомобиль среагировал но сигнал от авто не дошел до ключа? Машина синхронизируется с ключом по старой посылке или уже нет?
Вложения
Тип файла: txt Лог моего startline.txt (2.4 Кб, 34 просмотров)
Ruslan1958 вне форума   Ответить с цитированием
Старый 09.07.2018, 16:59   #405
nknk Меню Пользователя
Гость клуба
 
Регистрация: 06.07.2018
Сообщений: 1
По умолчанию Re: Исходники под ардуину

Код из поста #133 от Paul74s:

...
if (!RX_AM) came.state=1;
....

компилятор ругается RM_AM was not declared..

И еще, в коде кейсы только про CAME12 и NICE12, как с 24бит работает?
nknk вне форума   Ответить с цитированием
Старый 09.07.2018, 17:26   #406
EPA Меню Пользователя
Супер Модератор
 
Аватар для EPA
 
Регистрация: 01.11.2016
Сообщений: 1,265
По умолчанию Re: Исходники под ардуину

Он ругается на RX_AM потому что ардуино не понимает код CVAVR.
Можно через дефайн, типа так
#define RX_AM digitalRead (pinRX )
EPA вне форума   Ответить с цитированием
Старый 18.07.2018, 15:56   #407
Paul74s Меню Пользователя
Резидент клуба
 
Аватар для Paul74s
 
Регистрация: 16.11.2012
Сообщений: 585
По умолчанию Re: Исходники под ардуину

ЕРА правильно подсказал - в начале моего файла стоит дефайн на ногу МК отвечающую за прием.
#define RX_AM PORTB.0

Эта проца ловит посылки указанных форматов длиной как 12 так и 24 бита, но она "хромая", так как ловит только каждую вторую посылку.
Paul74s вне форума   Ответить с цитированием
Старый 20.09.2018, 19:38   #408
Dmitry Kireev Меню Пользователя
Гость клуба
 
Регистрация: 20.09.2018
Сообщений: 2
По умолчанию Re: Исходники под ардуину

Код:
/// v3
#define rxPin 2 // сюда у нас подключен приемник
#define txPin A3 // а сюда передатчик
#define MAX_DELTA 200 // это максимальное отклонение от длительности Pe при приеме
#define Pe 413
#define Pe2 Pe*2

//создаем массив с кодами устройств
long MyCode[]{0x35D2B004,0x6CEF98C2,0x56650000,0xA9CA7E44,0x20240000,0x1424E24,0x51310000,0x3552060,0x19830000,0xF69B9EA7};
int arrayVal;//переменная для расчета количества циклов
 
void setup() {
    arrayVal=(sizeof(MyCode)/4)-1;//расчитываем длинну массива и сразу вычитаем 1, тк нумерация элементов массива начинается с нуля
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  Serial.begin(921600);
  //while (!Serial);
  Serial.println("AN MOTORS наклонятор запущен");
  randomSeed(analogRead(0));//генерируем случайное число
  // запускаем перехват пакетов
//  attachInterrupt(1, grab, CHANGE); // обратите внимание на первый параметр - если у вас другая ардуина, он может быть не 1, а 0!
  interrupts();//разрешаем прерывание
}
 
void loop() {
for (int i=0;i<arrayVal;i+=2){//создаем цикл в котором будем перебирать коды массива
  //левая кнопка - 2 (в с1 4 символ и в с2 - последний)
  // в с1 последние 4 цифры надо сделать нулями - туда мы воткнем ранодмую составляющую
  long c1 = MyCode[i] + 0x101 * random(0xff); // AN-MOTORS хотят рандом - получит рандом, первое число кода
  long c2 = MyCode[i+1];//второе число кода
  SendANMotors(c1, c2);//вызываем функцию отправки пакетов и передаем в нее наши коды
  Serial.println("ОТПРАВЛЕНО:");
  Serial.print(c1, HEX);
  Serial.print(" ");
  Serial.println(c2, HEX);
  Serial.println();
        delay(200);//пауза между отправкой кодов
        }
  delay(5000);//ждем 5 секунд после отправки всех кодов
}
 
 
void SendANMotors(long c1, long c2)
{
  noInterrupts(); // временно отключаем перехват пакетов, чтобы не перехватывать собственные отправки
  for (int j = 0; j < 2; j++)
  {
    // отправляем 12 начальных импульсов 0-1
    for (int i = 0; i < 12; i++) {
      delayMicroseconds(Pe);
      digitalWrite(txPin, HIGH);
      delayMicroseconds(Pe);
      digitalWrite(txPin, LOW);
    }
    delayMicroseconds(Pe * 10);
    // отправляем первую половину
    for (int i = 4 * 8; i > 0; i--) {
      SendBit(bitRead(c1, i - 1));
    }
    // вторую половину
    for (int i = 4 * 8; i > 0; i--) {
      SendBit(bitRead(c2, i - 1));
    }
    // и еще пару ненужных бит, которые означают батарейку и флаг повтора
    SendBit(1);
    SendBit(1);
    delayMicroseconds(Pe * 39);
  }
  interrupts();
}
 
void SendBit(byte b) {
  if (b == 0) {
    digitalWrite(txPin, HIGH); // 0
    delayMicroseconds(Pe2);
    digitalWrite(txPin, LOW);
    delayMicroseconds(Pe);
  }
  else {
    digitalWrite(txPin, HIGH); // 1
    delayMicroseconds(Pe);
    digitalWrite(txPin, LOW);
    delayMicroseconds(Pe2);
  }
}
 
// все что ниже касается приема
 /*прием нам не нужен
volatile unsigned long prevtime;
volatile unsigned int lolen, hilen, state;
volatile static byte bcounter = 0;    // количество принятых битов
volatile static long code1 = 0;       // зашифрованная часть
volatile static long code2 = 0;       // фиксированная часть
boolean CheckValue(unsigned int base, unsigned int value)
{
  return ((value == base) || ((value > base) && ((value - base) < MAX_DELTA)) || ((value < base) && ((base - value) < MAX_DELTA)));
}
 
void grab() {
  state = digitalRead(rxPin);
  if (state == HIGH)
    lolen = micros() - prevtime;
  else
    hilen = micros() - prevtime;
  prevtime = micros();
 
  if (state == HIGH)
  {
    // последовательность закончилась
    if (CheckValue(Pe, hilen) && CheckValue(Pe2, lolen)) // valid 1
    {
      if (bcounter < 32)
        code1 = (code1 << 1) | 1;
      else if (bcounter < 64)
        code2 = (code2 << 1) | 1;
      bcounter++;
    }
    else if (CheckValue(Pe2, hilen) && CheckValue(Pe, lolen)) // valid 0
    {
      if (bcounter < 32)
        code1 = (code1 << 1) | 0;
      else if (bcounter < 64)
        code2 = (code2 << 1) | 0; bcounter++;
    }
    else
      bcounter = 0;
  }
  if (bcounter >= 65)
  {
    Serial.print("Перехвачено: ");
    Serial.print(code1, HEX);
    Serial.print(" ");
    Serial.println(code2, HEX);
 
    bcounter = 0;
    code1 = 0;
    code2 = 0;
  }
}*/
Скетч открывает AN_MOTORS но только со статикой, может есть умельцы которые смогут добавить в скет что б открывал динамические коды? Пульт AT-4N он шлет вот такие значения
AN MOTORS:281B4DD5 502EB6F4
AN MOTORS: 281B4DD5 502EB6F4
AN MOTORS: 281B4DD5 502EB6F4
AN MOTORS: 281B4DD5 502EB6F4
AN MOTORS: 281B4DD5 502EB6F4
AN MOTORS: 281B4DD5 502EB6F4
это приходило с одного пульта во время открытия, видимо долго держали кнопку на пульте
а это другие принятые коды с этого же шлагбаума
180550DB A2CED9C5

BDA4AF12 47FDE59F
A1443D98 4D7BE004
35D2B004 6CEF98C2

Последний раз редактировалось DIVER_SANT; 20.09.2018 в 20:04.
Dmitry Kireev вне форума   Ответить с цитированием
Старый 05.02.2019, 18:15   #409
kostas Меню Пользователя
Гость клуба
 
Регистрация: 15.01.2019
Сообщений: 6
По умолчанию Re: Исходники под ардуину

Цитата:
Сообщение от Valeron
Я за слова отвечаю - такион может рассчитывать на конструктор из кубиков.

Ну а далее собственно следущая часть кодеса.. работа с cc1101. извините, описание позже, я приболел чуть.

Код:
#include <SPI.h>

#define CC_CS  9
#define CC_RX  2 //GDO2
#define CC_TX  3 //GDO0

#define SRES  0x30
#define SCAL  0x33
#define SRX   0x34
#define STX   0x35
#define SIDLE 0x36
#define SPWD  0x39

#define IOCFG2     0x00
#define IOCFG1     0x01
#define IOCFG0     0x02
#define FIFOTHR    0x03
#define SYNC1      0x04
#define SYNC0      0x05
#define PKTLEN     0x06
#define PKTCTRL1   0x07
#define PKTCTRL0   0x08
#define ADDR       0x09
#define CHANNR     0x0A
#define FSCTRL1    0x0B
#define FSCTRL0    0x0C
#define FREQ2      0x0D
#define FREQ1      0x0E
#define FREQ0      0x0F
#define MDMCFG4    0x10
#define MDMCFG3    0x11
#define MDMCFG2    0x12
#define MDMCFG1    0x13
#define MDMCFG0    0x14
#define DEVIATN    0x15
#define MCSM2 	   0x16
#define MCSM1 	   0x17
#define MCSM0 	   0x18
#define FOCCFG 	   0x19
#define BSCFG 	   0x1A
#define AGCTRL2    0x1B
#define AGCTRL1    0x1C
#define AGCTRL0    0x1D
#define WOREVT1    0x1E
#define WOREVT0    0x1F
#define WORCTRL    0x20
#define FREND1 	   0x21
#define FREND0 	   0x22
#define FSCAL3 	   0x23
#define FSCAL2 	   0x24
#define FSCAL1 	   0x25
#define FSCAL0 	   0x26
#define RCCTRL1    0x27
#define RCCTRL0    0x28
#define FSTEST 	   0x29
#define PTEST 	   0x2A
#define AGCTEST    0x2B
#define TEST2 	   0x2C
#define TEST1 	   0x2D
#define TEST0      0x2E
#define PATABLE    0x3E

const byte cc_config[] PROGMEM=
{
  IOCFG0,  0b00000000,
  IOCFG2,  0b00001101,
  FIFOTHR, 0b01000111,
  PKTCTRL0,0b00110010,
  FSCTRL1, 0x06,
  FSCTRL0, 0x00,
  FREQ2,   0x10,
  FREQ1,   0xB0,
  FREQ0,   0x71,
  MDMCFG4, 0x16,
  MDMCFG3, 0xe4,
  MDMCFG2, 0b00110000,
  MDMCFG1, 0x22,
  MDMCFG0, 0xF8,
  MCSM2,   0x07,
  MCSM1,   0x30,
  MCSM0,   0x18,
  AGCTRL2, 0b00000100,
  AGCTRL1, 0x00,
  AGCTRL0, 0b00010000,
  FREND1,  0xB6,
  FREND0,  0b00010001,
  FSCAL3,  0xE9,
  FSCAL2,  0x2A,
  FSCAL1,  0x00,
  FSCAL0,  0x1F,
  TEST2,   0x81,
  TEST1,   0x35,
  TEST0,   0x09,
  PATABLE, 0x00,
  PATABLE, 0xc0,
  PATABLE, 0x00,
  PATABLE, 0x00,
  PATABLE, 0x00,
  PATABLE, 0x00,
  PATABLE, 0x00,
  PATABLE, 0x00
};

volatile byte level=255;
volatile unsigned long last, len;
byte p_level;
unsigned long p_len, p_len_prev;

struct
{
  byte state;
  unsigned long TE;
  byte pre_count, data[8], dat_bit;
} keeloq;

struct
{
  byte state;
  byte pre_count, data[8], dat_bit;
} starline;

void cc1101_strobe(byte s)
{
  digitalWrite(CC_CS, LOW);
  delay(1);
  SPI.transfer(s);
  digitalWrite(CC_CS, HIGH);
}

void cc1101_init()
{
  byte a;

  cc1101_strobe(SRES);
  delay(10);

  digitalWrite(CC_CS, LOW);
  for(a=0; a<sizeof(cc_config); a++)
    SPI.transfer(pgm_read_byte(cc_config+a));
  digitalWrite(CC_CS, HIGH);
}

void rtx_rx()
{
  cc1101_strobe(SIDLE);
  cc1101_strobe(SRX);
}

void rtx_tx()
{
  cc1101_strobe(SIDLE);
  cc1101_strobe(STX);
}

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

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

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_TE) keeloq.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/2 || p_len>keeloq.TE*3)
      {
        keeloq.state=0;
        break;
      }

      if(p_len<=keeloq.TE+keeloq.TE/2) setbit(keeloq.data, keeloq.dat_bit);
      if(++keeloq.dat_bit==KL_MAX_BITS) keeloq.state=100;
      break;
  }
}

#define SL_MIN_PRE_COUNT 4
#define SL_MAX_PRE 1200
#define SL_MIN_PRE 800
#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

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_PRE) starline.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_ONE*/) b=1;
       else
      if(p_len_prev>=SL_MIN_ZERO && p_len_prev<=SL_MAX_ZERO/* &&
         p_len>=SL_MIN_ZERO && p_len<=SL_MAX_ZERO*/) b=0;
      else
      {
        if(starline.dat_bit>=SL_MIN_BITS) starline.state=100;
          else starline.state=0;
        break;
      }

      if(b) setbit(starline.data, starline.dat_bit);
      if(++starline.dat_bit==SL_MAX_BITS) starline.state=100;
      break;
  }
}

void dump_hex(byte *buf, byte bits)
{
  byte a;
  
  for(a=0; a<(bits+7)/8; a++)
  {
    if(buf[a]<=0x0f) Serial.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_RX)==HIGH) level=0;
    else level=1; 
}

void setup()
{
  pinMode(CC_RX, INPUT);
  pinMode(CC_CS, OUTPUT);
  digitalWrite(CC_CS, HIGH);
  attachInterrupt(0, rx_int, CHANGE);
  
  Serial.begin(115200); 
  while(!Serial);

  Serial.println("MEGA OVERFUCK ARDUINO LOGGER BY HUY FOR NARKOMANS");
  Serial.println("");
  
  SPI.begin();
  cc1101_init();
  rtx_rx();  
  interrupts();
} 

void loop()
{ 
  if(level!=255)
  {
    p_level=level;
    p_len=len;
    len=0;
    level=255;
    
    process_keeloq();
    process_starline();
    
    p_len_prev=p_len;
  }
  
  if(keeloq.state==100)
  {
    Serial.print("KEELOQ: ");
    dump_hex(keeloq.data, 64);
    keeloq.state=0;
  }
  
  if(starline.state==100)
  {
    Serial.print("STARLINE[");
    Serial.print(starline.dat_bit);
    Serial.print("]: ");
    dump_hex(starline.data, starline.dat_bit);
    starline.state=0;
  }
}
Добавлено через 59 секунд
да, конфиг для AM OOK. далее будет ФМ под хана


Привет, товарищи!
Сейчас и три дня я пытаюсь и пытаюсь скомпилировать шейч Valeron для keeloq и starline с cc1101 tranceiver.
Я не знаю, что не так, потому что я копирую и вставляю исходный код в arduino IDE без ошибок. При компиляции я получил следующие ошибки:
1. https://ibb.co/Xztfj2c

поэтому я пытаюсь понять, что может быть не так. Я исправил некоторые пропущенные запятые в объявлении массива cc_config []

2.https://ibb.co/tBQ87GR
3.https://ibb.co/m5C5hL7

и попробуйте снова скомпилировать


и я попал сюда, где я определенно застрял "ожидаемое первичное выражение перед '=' токен"
https://ibb.co/CmFLn6n

что это может быть не так? Я пробовал разные arduino IDE, 1.0.4, 1.0.5, 1.5.0 1.8.7 на Windows 8 и 1.0.4 в Linux Ubuntu

спасибо, братья, за то время, которое вы потратили на чтение моего сообщения. любая помощь приветствуется. Мои наилучшие пожелания !
kostas вне форума   Ответить с цитированием
Старый 05.02.2019, 19:09   #410
heat Меню Пользователя
Член клуба
 
Регистрация: 12.10.2017
Сообщений: 141
По умолчанию Re: Исходники под ардуину

неправильно написано само тело программы . где то забыто окончание процедуры . ну или начало . что касается загрузки конфига так там все в HEX надо указывать . половина в хексе половина в байтах . 0x и 0b - так в чем нить одном указывать надо . . дело не в интерпретаторе а в неправильном синтаксисе программы .
heat вне форума   Ответить с цитированием
Ответ
Опции темы
Опции просмотра

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

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



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


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