MX-05V + MX-FS-03V + пульт Came TOP432NA

liver
Offline
Зарегистрирован: 08.01.2016

Всем привет.

Имею следующие устройства:

MX-05V

MX-FS-03V

пульт Came TOP432NA

 

Собственно вопрос, можно ли их между собой подружить?

частоты вроде совпадают 433,92 MHz

Тестовые скетчи не работают, вернее не получаю ожидаемого результата, тычу кнопку на пульте, на стороне ардуино тишина.

На приемнике никакой индикации нет, включился он вообще или нет.

Какое значение bits per second выставлять в vw_setup?

liver
Offline
Зарегистрирован: 08.01.2016

Нашел скетч, который работает.

Прием

#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;
    }
}

Отправка

#define txPin 8
#define Te 320

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

    Serial.begin(9600);
}

void loop()
{
    SendCame(0b100010001111);
}

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(2000); // сделать паузу после посылки на 2 с
}

 

liver
Offline
Зарегистрирован: 08.01.2016

Переработал вышеуказанный код.

В loop убираем комментарий с нужного функционала - прием или передача.

#define pinRX 2
#define pinTX 8

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

volatile byte level = 255;
volatile unsigned long last;
volatile unsigned long len;
byte p_level;
unsigned long p_len;
unsigned long p_len_prev;
struct
{
    uint8_t state;
    uint8_t data[3], dat_bit;
} came;


void setup()
{
    Serial.begin(9600);
    while (!Serial);
    attachInterrupt(0, pinRX_int, CHANGE);
    pinMode(pinTX, OUTPUT);
    interrupts();
}

void loop()
{
    ////прием
    //RfReceive();

    ////передача
    //char *code = "000000000000"; // 0-0
    //char *code = "000000000000000000000000"; // 0-0-0
    //RfTransmitt(code, 4);
    //delay(2000); // сделать паузу между отправками
}

void RfReceive()
{
    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)
    {
        for (int i = 0; i < sizeof(came.data) - (came.dat_bit == CM_BITS12 ? 1 : 0); i++) {
            if (i > 0) {
                Serial.print("-");
            }
            Serial.print(stringWithPrefix(String(came.data[i], BIN), came.dat_bit == CM_BITS12 ? 6 : 8, '0'));
        }
        came.state = 0;
        Serial.println();
    }
}

void RfTransmitt(char *codeString, unsigned int numberOfShipments)
{
    int codeLength = strlen(codeString);
    if (codeLength != 12 && codeLength != 24)
    {
        Serial.println("incorrect code.");
        return;
    }

    byte code[codeLength];
    for (int i = 0; i < codeLength; i++) {
        code[i] = codeString[i] == '0' ? 0 : 1;
    }

    byte codeUpdate[codeLength];

    int number = 0;

    switch (codeLength) {
    case 12:
        //оратный порядок
        for (int i = 5; i >= 0; i--) {
            codeUpdate[number] = code[i];
            Serial.print(codeUpdate[number]);
            number++;
        }
        Serial.print(" ");
        //прямой порядок
        for (int i = 6; i < 12; i++) {
            codeUpdate[number] = code[i];
            Serial.print(codeUpdate[number]);
            number++;
        }
        break;
    case 24:
        //оратный порядок для всех символов
        for (int i = 1; i <= 3; i++) {
            for (int j = i * 8 - 1; j >= 8 * (i - 1); j--) {
                codeUpdate[number] = code[j];
                Serial.print(codeUpdate[number]);
                number++;
            }
            Serial.print("-");
        }
        break;
    }

    Serial.println();

    for (int i = 0; i < numberOfShipments; i++) // посылку посылаем как и брелок - NS раза подряд.
    {
        digitalWrite(pinTX, HIGH);
        delayMicroseconds(Te);
        digitalWrite(pinTX, LOW); // посылаем стартовый импульс
        for (int j = 0; j < codeLength; j++) {
            SendCameBit(codeUpdate[j]); // побитово перебираем и посылаем код
        }
        delay(16);
    }
}

void pinRX_int()
{
    if (level != 255) return;
    len = micros() - last;
    last = micros();
    if (digitalRead(pinRX) == HIGH) level = 0;
    else level = 1;
}

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;

            for (int i = 0; i < sizeof(came.data); i++) {
                came.data[i] = 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 SendCameBit(byte b)
{
    delayMicroseconds(Te);
    if (!b) digitalWrite(pinTX, HIGH);
    delayMicroseconds(Te);
    digitalWrite(pinTX, HIGH);
    delayMicroseconds(Te);
    digitalWrite(pinTX, LOW);
}

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

String stringWithPrefix(String line, int len, char prefix)
{
    String addon = "";
    int n = len - line.length();
    for (int i = 0; i < n; i++) {
        addon += prefix;
    }
    return addon + line;
}

 

Neverro
Offline
Зарегистрирован: 12.12.2016

Привет. Спасибо за скетч.

Подключил, запустил. Бортовой огонек TX на Arduino мигает постоянно. При нажатии кнопки на  Came TOP432NA загорается постоянно, но монитор порта молчит, кроме инициализированного MEGA ARDUINO LOGGER.

Подскажи, где почитать подробнее про это. Не хватает своего разумения.

Заранее благодарен.

 
MakPol
Offline
Зарегистрирован: 03.04.2018

Доброго времени суток!

Возможно тема уже изжевана, но ответа я так и не нашел. 

Попробовал скетч и вроде как с брелоком 432NA работает и приходит что-то типа
6D40came[12]:
и это на одной кнопке, а с другой кнопки вообще ничего не приходит

Попробовал для наглядности немного разделить
 

...
Serial.print(came.data[0],HEX);
Serial.print("-");
Serial.print(came.data[1],HEX);
Serial.print("--");
Serial.print(came.data[2],HEX);
Serial.print("---");
Serial.print(" CAME[");
//Serial.print("came[");
Serial.print(came.dat_bit);
Serial.print("]: ");
...

В итоге пришло 

6D-4--0--- CAME[12]:

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

 

b707
Offline
Зарегистрирован: 26.05.2017

Проблема то в чем?

MakPol
Offline
Зарегистрирован: 03.04.2018

Проблема в том, что 6D-4--0--- CAME[12]: полная чушь. Не такой код. Берем этот 6D40 передаем с учетом инициализации и прочего - и ничего не открывается. Мало того, передаем и сразу ловим что передаем и нифига не 6D40  приходит.
А то что со второй кнопки не ловит - это тоже баг. Т.к. на второй кнопке абсолютно точно имеется открытие второго шлакбаума, с утра проверял - с брелока все ок. Завтра проверю теорию и возможно приложу другой скетч, проверенный на практике.

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

b707
Offline
Зарегистрирован: 26.05.2017

MakPol пишет:

Проблема в том, что 6D-4--0--- CAME[12]: полная чушь. Не такой код.

Конечно не такой. Вы ж его неправильно записали. Вот посмотрите - вы приняли три шестнадцатиричных числа - "6D",  "4" и "0". Так с какой же стати вы его записываете как 6D40 ? - числа-то двузначные!

Правильная запись вашего кода - 6D 04 00

Цитата:
Предполагаю, что в коде изначаьно добавлена ошибка, чтобы исключить часть людей, поэтому и обратился.

Код вы не приводите, поэтому про ошибку ничего сказать не могу. Но вполне возможно, что lдело и не в ошибке.  Факторов много. Может у вашего приемника чуть расстроена частота. Или у брелка не вполне точные длительности сигнала - шлагбаум может открываться, а программа не принимает...