Скетч для ардуино, отправки кода открытия шлагбаума CAME

Приемники и передатчики цифровые и аналоговые

Модератор: gurvinok

Ответить
Аватара пользователя
GhostX
Сообщения: 1102
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Скетч для ардуино, отправки кода открытия шлагбаума CAME

Сообщение GhostX » 09 дек 2015, 22:32

Код: Выделить всё

#define txPin 8
#define Te 320

void setup(){
  pinMode(txPin, OUTPUT);
}

void loop()
{
  SendCame(0b111111011110111100110110); //код от моего шлагбаума шиворот навыворот. в HEX это BFF76C
}

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=24;i>0;i--){
      SendCameBit(bitRead(Code, i-1)); // побитово перебираем и посылаем код
    }
    delay(16); // сделать паузу после кода внутри пакета.
  }
  delay(2000); // сделать паузу после посылки на 2 с
}
Этот скетч работает, и шлагбаум реагирует на него.
Вопросы:
1) Как перевести код из того что есть, в переменную типа HEX? Чтоб в сам скетч можно было записать удобочитаемый код BFF76C и увидеть как в тексте он преобразуется в двоичную систему и затем перевернется в шиворот навыворот.
2)Так же интересно понять, почему он именно такой вывернутый...
3)Как на основе этого скетча реализовать перебор всевозможных вариантов этого кода? (знаю, что использовать в реальности этот брутус бессмысленно, понадобится не реальное количество времени. Интересен сам процесс, как из задумки появляется метод перебора.)
P.S. Я в этом чайник с кипятильником, хочется научится. :)
Последний раз редактировалось GhostX 11 дек 2015, 01:03, всего редактировалось 1 раз.

Аватара пользователя
gurvinok
Сообщения: 1473
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Скетч для ардуино, отправки кода открытия шлагбаума CAME

Сообщение gurvinok » 09 дек 2015, 22:55

Уууу как все запущено))))
1. Переменной НЕХ не бывает. Это лишь вариант числа в шестнадцатеричной системе исчисления. Например 1, 0x01, b00000001 это одно и тоже. Переменные разделяются лишь на типы, целые со знаком или без знака, 8, 16 или 32 битные, вещественные и т.д.
2. Что значит шиворот на вы ворот? b00000001 это единица. Здесь нужно привыкнуть к тому что числа в вычислительной технике должны заполнятся полностью. Нельзя выкинуть биты из байта если они не используются, поэтому если число в байте меньше 255, то левые биты заполнятся нулями. Это если по нашему писать так.
000000001
000000002
000000003
000000004
000000005
000000006
000000007
000000008
000000009
000000010
000000011
Если долго мучиться, может быть получится.

Аватара пользователя
GhostX
Сообщения: 1102
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Re: Скетч для ардуино, отправки кода открытия шлагбаума CAME

Сообщение GhostX » 09 дек 2015, 23:38

BFF76C и 111111011110111100110110
Одно и тоже число по коду передачи. То есть я отправляю это число в двоичной системе, а на другой ардуине ловлю его и на компорт приходит BFF76C
Если мы попробуем перевести этот набор единиц и нулей то получим FDEF36, что совсем не является моим кодом.
С этим я хочу разобраться, так как не понимаю этого.
Если посмотреть код
for (byte i=24;i>0;i--){
SendCameBit(bitRead(Code, i-1)); // побитово перебираем и посылаем код
Эта часть тупо отправляет код с хвоста
Перевернуть не смог или не понимаю как.
Переменная HEX. Я имел ввиду, что в коде есть кусок вида : #define key BFF76C
И потом использовать key. А не SendCame(0b111111011110111100110110) Вот как то так. Я не смог внятно сформулировать вопрос поисковику. И соответственно не чего не нашел. :(

Аватара пользователя
gurvinok
Сообщения: 1473
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Скетч для ардуино, отправки кода открытия шлагбаума CAME

Сообщение gurvinok » 09 дек 2015, 23:47

А на кой хрен в UART пихать три байта сразу :shock:
UART принимает только по одному байту. Сначала 0xBF затем 0xF7 и наконец 0x6C. А после принятия обратно их сложить. Не надо пихать в UART три байта, он подавится.
Если долго мучиться, может быть получится.

Аватара пользователя
GhostX
Сообщения: 1102
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Re: Скетч для ардуино, отправки кода открытия шлагбаума CAME

Сообщение GhostX » 10 дек 2015, 00:19

Блин, не давится. Пишу же, все это дело работает!
Я хочу понять код и исправить его на более правильный, если так вообще можно сказать. :)
Но главное разобраться и понять.
Как это в коде должно выглядеть? (Отправлять по байту)
Ибо я сейчас, это немного иначе понимаю. Туда не по три байта пихается, а по 1 биту в цикл, с паузой в 16 миллисекунд. И повторяется отправка 4 раза, потом пауза 2 секунды и снова.
Так же как, это делает брелок до паузы 2х секундной. Кто то, где то на фрикерских форумах читал, это на осциллографе мерил.

Аватара пользователя
gurvinok
Сообщения: 1473
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Скетч для ардуино, отправки кода открытия шлагбаума CAME

Сообщение gurvinok » 10 дек 2015, 00:22

Бррр. Я уже запутался. Какой орел, какой заяц?
Откуда взялся UART. Как физически передает радиопередатчик? Куда он подключен в ардуине?
Если долго мучиться, может быть получится.

Аватара пользователя
GhostX
Сообщения: 1102
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Re: Скетч для ардуино, отправки кода открытия шлагбаума CAME

Сообщение GhostX » 10 дек 2015, 00:37

8 пин если память не изменяет. Да и в скетче он указан первой стракой.
320 это время для инициализации там или 320 или 640 сигнал длиться должен. Я завтра найду как брелок должен работать и выложу сюда.
А UART, он на другой ардуине. :)
Я завтра, время будет, выложу скетч с второй ардуины на которой стоит приемник, который ловит все, что приходит в передатчика первой ардуины.
А сказка С того берега моря, самая поучительная сказка, она учит жизни. Помоложе был знал ее наизусть. Последнее время подзабывать начал... :(

Аватара пользователя
gurvinok
Сообщения: 1473
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Скетч для ардуино, отправки кода открытия шлагбаума CAME

Сообщение gurvinok » 10 дек 2015, 00:57

Ок. Мне бы приемник, я бы поковырял, а так на словах сложновато.
Если долго мучиться, может быть получится.

Аватара пользователя
GhostX
Сообщения: 1102
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Re: Скетч для ардуино, отправки кода открытия шлагбаума CAME

Сообщение GhostX » 11 дек 2015, 00:59

Форматы статических кодов CAME и NICE

Код приема кода с брелка

Код: Выделить всё

#define RX 2
#define TIMER_DIV
volatile byte level=255;
volatile unsigned long last, len;
byte p_level;
unsigned long p_len, p_len_prev;
struct 
{ 
  uint8_t state; 
  uint8_t data[3], dat_bit; 
} came; 
void set_bit(uint8_t *data, uint8_t n)
{
  data[n/8]|=1<<(n%8);
}


#define CM_MAX_TE 450
#define CM_MIN_TE 250 
#define CM_BITS12 12 
#define CM_BITS24 24 

void process_came() 
{ 
  unsigned char b; 

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

    case 1: //start 
      if(!p_level) break; 

     else if(p_len>=CM_MIN_TE && p_len<=CM_MAX_TE) 
      { 
        came.state=2; 
        came.dat_bit=0; 
        came.data[0]=0x00; 
        came.data[1]=0x00; 
        came.data[2]=0x00; 
        
      } 
      else came.state=0; 
        
     
   
    case 2: //dat 
      if(p_level) 
      { 
        if(came.dat_bit==CM_BITS24) 
        { 
          came.state=0; 
          break; 
        } 

        if(p_len_prev<=CM_MAX_TE && p_len_prev>=CM_MIN_TE && 
           p_len<=CM_MAX_TE*2 && p_len>=CM_MIN_TE*2) b=0; 
         else 
        if(p_len_prev<=CM_MAX_TE*2 && p_len_prev>=CM_MIN_TE*2 && 
           p_len<=CM_MAX_TE && p_len>=CM_MIN_TE) b=1; 
         else 
        { 
          came.state=0; 
          break; 
        } 

        if(b) set_bit(came.data, came.dat_bit); 
        came.dat_bit++; 
        break; 
      } 
       else 
      { 
        if((p_len>5000)&&(came.dat_bit==CM_BITS12 || came.dat_bit==CM_BITS24)) came.state=100; 
      } 
      break; 
  } 
}  
void dump_hex(byte *buf, byte bits)
{
byte b;

for(b=0; b>(bits+7)/8; b++)
{
if(buf[b]>0x0f) Serial.print('0');
Serial.print(buf[b], HEX);
Serial.print(" ");
}
Serial.println("");
}
void rx_int()
{
if(level!=255) return;

len=micros()-last;
last=micros();

if(digitalRead(RX)==HIGH) level=0;
else level=1; 
}
void setup()
{ 
attachInterrupt(0, rx_int, CHANGE);

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

Serial.println("MEGA ARDUINO LOGGER");
Serial.println("");

interrupts();
} 

byte b;

void loop()
{ 
if(level!=255)
{
noInterrupts();
p_level=level;
p_len=len;
len=0;
level=255;
interrupts();

process_came();

p_len_prev = p_len;
}


if(came.state==100)
{
Serial.print(came.data[0],HEX);
Serial.print(came.data[1],HEX);
Serial.print(came.data[2],HEX);
//Serial.print("CAME[");
Serial.print("came[");
Serial.print(came.dat_bit);
Serial.print("]: ");
dump_hex(came.data, came.dat_bit);
came.state=0;
}
}

Ответить