Извращение по цифровому входу

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

ua6em пишет:

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

Совершенно необзательно что-то куда-то переносить, на мой взгляд самый правильный вариант - это просто создать свою копию библиотеки под другим именем. Естесственно, что надо переименовывать не только папку, но и все .cpp и .h файлы. и тогда исправленная библиотека не помешает ни другим проектам, ни даже работе исходного СофтСериала в этом же коде.

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

MaksVV пишет:

почитал тему по диагонали (пока некогда вникать). Спрошу у общественности, а наличие свободного аппаратного UART (взять мегу 2560) облегчит задачу? 

с учетом того, что Евгений уже дал практически готовое решение для СофтСериал - то онкретно на эту задачу не повлияет. мне кажется...

Но поскольку у ТС, как я понял. в проекте еще два СофтСериала - перекинуть их на хардовые явно будет полезно для общего здоровья проекта

Green
Offline
Зарегистрирован: 01.10.2015

+ Недавно было 2 SoftwareSerial-а и один аппаратный, не считая Tone - та ещё свистопляска.(

MaksVV
Offline
Зарегистрирован: 06.08.2015

ТС хочет прикрутить сие действо к моей городьбе в теме про webasto. Знал бы, что губа так раскатается у народа (и у меня в общем-то тоже) в плане доп функций, сразу бы мегу выбрал. Проект начинался как вебасто запускалка только. Хотя и на тот даже момент uart-ов не хватало, для отладки не было свободного. Надо переделывать на мегу, но время время. Поэтому, если перейду на мегу, софт сериал высвободится, на нем , я так понимаю, проще 16 битное слово организовать. 

Станислав Пимшин
Offline
Зарегистрирован: 18.11.2019

Хотелось бы жипиэс ещё прикрутить и датчик ускорения наклона... Такое универсальное запускала допов, охранка, местонахождение... 

sadman41
Offline
Зарегистрирован: 19.10.2016

Софтсериал необязательно тащить за собой. От него же только концепция важна. А там уж хоть на внешнее прерывание, хоть на таймер вешайся.

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

Станислав Пимшин пишет:

Хотелось бы жипиэс ещё прикрутить и датчик ускорения наклона... Такое универсальное запускала допов, охранка, местонахождение... 

хотелось бы - прикручивайте

MaksVV
Offline
Зарегистрирован: 06.08.2015

sadman41 пишет:
Софтсериал необязательно тащить за собой. От него же только концепция важна. А там уж хоть на внешнее прерывание, хоть на таймер вешайся.

щас поэкспериментирую с двумя дунями, поковыряв софт сериал. Скилла у меня пока не хватит самому на таймере такое написать. 

Станислав Пимшин
Offline
Зарегистрирован: 18.11.2019

Скидывай скеч... Цепью анализатор... Покажу картинку...

MaksVV
Offline
Зарегистрирован: 06.08.2015

поправил библиотеку софтсериал.  ХЗ правильно или нет на счет стоп бита. Но работает норм, единственное, если принято число со старшим битом "1" , после этого числа в буфер также после него число ноль записывается (ну в последней посылке, после которой шина переходит в BUS IDLE - высокий уровень). Возможно это и связано с корявым удалением из библиотеки стоп бита. Но сигнализация ноль, я так понял, никогда не шлёт, так что его можно игнорировать. 

Естественно это все поможет, если перевести в конечном итоге проект на мегу. Т.к. софт сериал не может держать нормально два потока. Чисто для теста сигнализации и расшаривания протокола SLDATA пойдет и уна/нана. 

библиотека 

Предлагаю такой скетч, соединил две дуины через 1 кОм, погонял туда сюда команды. (этот  же скетч заливаем для теста сигнализации).

если не заработает  - уменьшать резистор. Можно и без него, но есть небольшой риск подпалить выход ардуины, если начать посылать в сигнализацию команды, когда она шлёт данные. 

Для отправки команд на сигнализацию  в терминале, без символов конца строки и перевода каретки , посылаем на дуню 1 - охрана вкл, 0 - выкл и далее по списку  см. по скетчу там понятно.

#include <SL_Data.h>
#define SLDATA_PIN 7 //выбираем пин на sl-data, на меге это пины имеющие pcint 

SL_Data sl_data(SLDATA_PIN, 8, 1); // (RX, TX, 1==invert_logic)

#define BIT_TIME  200  //время одного бита в микросекундах

// команды управления сигнализацией
const uint16_t ZAPROS     = 17085;
const uint16_t START_ENG  = 8670;
const uint16_t STOP_ENG   = 8415;
const uint16_t OHRANA_ON  = 4590;
const uint16_t OHRANA_OFF = 4335;

void sl_data_run ()
{
  
  // получаем данные (слово 16 bit) от сигнализации 
 if (sl_data.available()) 
   {
    uint16_t data = (uint16_t)sl_data.read();
    if (data !=0)Serial.println(data); // data полученные от сигнализации данные 
   }
}


void sendword (uint16_t &inbyte)
{
  
  digitalWrite (SLDATA_PIN , 1);    // send start bit 
  delayMicroseconds (BIT_TIME); 

  for (int i =0; i<16; i++)
  {
  digitalWrite (SLDATA_PIN ,  !bitRead(inbyte, i)); //send  data bits
  delayMicroseconds (BIT_TIME); 
  }
}

void sendcommand (uint16_t comm)
{
 if (sl_data.available()) return;
  sl_data.end();
  pinMode (SLDATA_PIN , OUTPUT);
  
  for (int g = 0; g<5; g++)
  {
      digitalWrite (SLDATA_PIN , 0);
      delay (10);
      sendword(comm);
  } 
  digitalWrite (SLDATA_PIN , 1);
  pinMode (SLDATA_PIN, INPUT_PULLUP);
  sl_data.begin(4800);
}

void debug_readcommand()
{
if (Serial.available() && !sl_data.available())
  {
     byte inbyte = Serial.read();
     if (inbyte == 'z') sendcommand (ZAPROS);
else if (inbyte == 's') sendcommand (START_ENG);
else if (inbyte == 'p') sendcommand (STOP_ENG);
else if (inbyte == '1') sendcommand (OHRANA_ON);
else if (inbyte == '0') sendcommand (OHRANA_OFF);
  }
}

void setup() 
{
  Serial.begin(9600);
  pinMode (SLDATA_PIN, INPUT_PULLUP);
  sl_data.begin(4800);
}


void loop() 
{ 

 debug_readcommand();
 sl_data_run ();
}


 

Станислав Пимшин
Offline
Зарегистрирован: 18.11.2019

Стоп я туплю! Они не по одному проводу общаются.... а по двум... в скетче вижу один (или фигу опять вижу)
(вижу что Объявлен только один пин... и с него читаем и отправляем ?...)
На скрине ниже реальное общение... кроме того на столе лежит копия старлайн, могу непосредственно на ней поюзать скетч, и подсмотреть что и кто говорит....  

ПС Извините что ввел в заблуждение...

MaksVV
Offline
Зарегистрирован: 06.08.2015

Станислав Пимшин пишет:

Стоп я туплю! Они не по одному проводу общаются.... а по двум... в скетче вижу один (или фигу опять вижу)
(вижу что Объявлен только один пин... и с него читаем и отправляем ?...)
ПС Извините что ввел в заблуждение...

дак да, нашел старый блок сигналки нерабочий, разобрал, посмотрел . Так средний пин масса. а крайние это TX и RX т.к. по дорожкам через резюки в 1кОм идут на пины проца (МК PIC). Так что там двухпроводная шина, UART типа. а амплитуда сигналов какая?

позже поправлю скетч

MaksVV
Offline
Зарегистрирован: 06.08.2015

теперь резисторы не нужны (они есть в блоке сигнализации). Подключаем TX и RX  к сигналке.  Штатный Softserial.write() я пока не ковырял, поэтому отправка вручную по битам. Может общественность подскажет как это сделать, я бегло не смог. 

#include <SL_Data.h>
#define SLDATA_RX 7 //выбираем пин RX ардуино на sl-data, на меге это пины имеющие pcint 
                    // данные идут от сигнализации на этот пин

#define SLDATA_TX 9 //выбираем пин TX ардуино на sl-data, данные идут с этого пина на сигнализацию 
 
SL_Data sl_data(SLDATA_RX, 8, 1); // (RX, TX, 1==invert_logic)  // пины правленного софт сериал

#define BIT_DURATION  200  //время одного бита в микросекундах

// команды управления сигнализацией
const uint16_t ZAPROS     = 17085;
const uint16_t START_ENG  = 8670;
const uint16_t STOP_ENG   = 8415;
const uint16_t OHRANA_ON  = 4590;
const uint16_t OHRANA_OFF = 4335;

void sl_data_read ()
{
  static bool timer_println = 0; static uint32_t prev_timer_println = 0; 
  
  // получаем данные (слово 16 bit) от сигнализации 
 if (sl_data.available()) 
   {
    uint16_t data = (uint16_t)sl_data.read(); // слово, полученное от сигнализации
    if (data!=0){
      if (!timer_println) timer_println = 1;      
      prev_timer_println = millis();
      Serial.print (F("Receive:  "));
      for (uint32_t i = 10; i<=100000; i*=10 ){if (data<i) Serial.print (" ");}  Serial.print(data); Serial.print(F("    0x")); 
      for (uint32_t i = 16; i<=0xFFFF; i*=16 ){if (data<i) Serial.print("0");} Serial.print(data, HEX); Serial.print(F("     BIN:  "));
      for  (int i =0; i<16; i++) Serial.print(bitRead(data, i)); 
      Serial.println();
                }
   }
 if (timer_println && millis() - prev_timer_println > 500)  {timer_println = 0; Serial.println();}
}


void sendword (uint16_t &inbyte)
{
  digitalWrite (SLDATA_TX , 1);    // send start bit 
  delayMicroseconds (BIT_DURATION); 

  for (int i =0; i<16; i++)
  {
  digitalWrite (SLDATA_TX ,  !bitRead(inbyte, i)); //send data bits
  delayMicroseconds (BIT_DURATION); 
  }
}

void sendcommand (uint16_t comm)
{
   
  for (int g = 0; g<5; g++)
  {
      digitalWrite (SLDATA_TX , 0);
      delay (10);
      sendword(comm);
  } 
  digitalWrite (SLDATA_TX , 1);
  }

void debug_readcommand()
{
if (Serial.available())
  {
     byte inbyte = Serial.read();
     if (inbyte == 'z') sendcommand (ZAPROS),    Serial.println(F("Send Zapros")), Serial.println();
else if (inbyte == 's') sendcommand (START_ENG), Serial.println(F("Send Start Engine")),Serial.println();
else if (inbyte == 'p') sendcommand (STOP_ENG),  Serial.println(F("Send Stop Engine")),Serial.println();
else if (inbyte == '1') sendcommand (OHRANA_ON), Serial.println(F("Send Ohrana ON")),Serial.println();
else if (inbyte == '0') sendcommand (OHRANA_OFF),Serial.println(F("Send Ohrana OFF")),Serial.println();
  }
}

void setup() 
{
  Serial.begin(115200);
  sl_data.begin(4800);
  pinMode (SLDATA_TX , OUTPUT);
  digitalWrite (SLDATA_TX , 1);
}


void loop() 
{ 
 debug_readcommand();
 sl_data_read ();
}

 

Станислав Пимшин
Offline
Зарегистрирован: 18.11.2019

MaksVV пишет:

 а амплитуда сигналов какая?

Амплитуда зависит от года сигнализации, и года производства.... 
в среднем 5 вольт но встречается и 4.2 и 3.9... смотрел на 6 сигналках... 

MaksVV
Offline
Зарегистрирован: 06.08.2015

чуть подправил скетч #63 для лучшего реверса

Станислав Пимшин
Offline
Зарегистрирован: 18.11.2019

MaksVV пишет:

чуть подправил скетч #63


Я правильно понимаю что она на данный момент только чтение а отправка через монитор порта??
Может стоит для отладки на лампы вывести мигание в зависимости от полученной информации, и входа назначить для посылки команд... я в свою очередь смогу просмотреть что на самом деле происходит, и будет ли она принимать и отправлять сигналы...  Так как боюсь что через монитор порта буду тупить... но все равно сегодня опробую этот скетч... 

 

Станислав Пимшин
Offline
Зарегистрирован: 18.11.2019

MaksVV пишет:

Подключаем TX и RX  к сигналке.  

проверил (не смог удержаться) отправку сигналов по шине... Всё СУПЕР))

Отправка команды на запрос состояния

Отправка команды на старт ДВС

Отправка команды на СТОП ДВС

Отправка команды на включение охраны

Отправка команды на снятие охраны

 

ПС. вечером полевые испытания)

Станислав Пимшин
Offline
Зарегистрирован: 18.11.2019

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

19:39:41.356 -> Send Ohrana OFF
19:39:41.356 -> 
19:39:47.704 -> Receive:   65535    0xFFFF     BIN:  1111111111111111
19:39:47.704 -> Receive:     159    0x009F     BIN:  1111100100000000
19:39:48.210 -> 
19:39:53.267 -> Send Ohrana ON
19:39:53.267 -> 
19:40:00.751 -> Receive:   65439    0xFF9F     BIN:  1111100111111111
19:40:00.751 -> Receive:    3231    0x0C9F     BIN:  1111100100110000
19:40:01.254 -> 
19:40:07.473 -> Send Start Engine
19:40:07.473 -> 
19:40:19.897 -> Receive:   64415    0xFB9F     BIN:  1111100111011111
19:40:19.897 -> Receive:    3359    0x0D1F     BIN:  1111100010110000
19:40:20.402 -> 
19:40:25.473 -> Send Zapros
19:40:25.473 -> 
19:40:25.473 -> Receive:   65439    0xFF9F     BIN:  1111100111111111
19:40:25.506 -> Receive:    3231    0x0C9F     BIN:  1111100100110000
19:40:25.979 -> 
19:40:54.130 -> Send Stop Engine
19:40:54.130 -> 
19:41:05.066 -> Receive:   61339    0xEF9B     BIN:  1101100111110111
19:41:05.066 -> Receive:    3871    0x0F1F     BIN:  1111100011110000
19:41:05.544 -> 
19:41:08.536 -> Receive:   61339    0xEF9B     BIN:  1101100111110111
19:41:08.536 -> Receive:    3871    0x0F1F     BIN:  1111100011110000
19:41:09.045 -> 
19:41:13.440 -> Receive:   61339    0xEF9B     BIN:  1101100111110111
19:41:13.440 -> Receive:    3871    0x0F1F     BIN:  1111100011110000
19:41:13.945 -> 
19:41:18.647 -> Receive:   61339    0xEF9B     BIN:  1101100111110111
19:41:18.647 -> Receive:    3871    0x0F1F     BIN:  1111100011110000
19:41:19.151 -> 
19:41:21.015 -> Send Ohrana OFF
19:41:21.015 -> 
19:41:23.809 -> Receive:   61339    0xEF9B     BIN:  1101100111110111
19:41:23.809 -> Receive:    3871    0x0F1F     BIN:  1111100011110000
19:41:24.314 -> 
19:41:29.131 -> Receive:   61339    0xEF9B     BIN:  1101100111110111
19:41:29.166 -> Receive:    3871    0x0F1F     BIN:  1111100011110000
19:41:29.639 -> 
19:41:34.462 -> Send Ohrana OFF
19:41:34.462 -> 
19:41:40.623 -> Send Ohrana ON
19:41:40.623 -> 
19:41:41.197 -> Receive:   65535    0xFFFF     BIN:  1111111111111111
19:41:41.230 -> Receive:     159    0x009F     BIN:  1111100100000000
19:41:41.703 -> 
19:41:49.093 -> Send Ohrana ON
19:41:49.093 -> 
19:41:56.356 -> Receive:   65439    0xFF9F     BIN:  1111100111111111
19:41:56.391 -> Receive:    3231    0x0C9F     BIN:  1111100100110000
19:41:56.860 -> 
19:42:02.608 -> Receive:   61335    0xEF97     BIN:  1110100111110111
19:42:02.608 -> Receive:    3999    0x0F9F     BIN:  1111100111110000
19:42:03.114 -> 
19:42:06.323 -> Receive:   61335    0xEF97     BIN:  1110100111110111
19:42:06.323 -> Receive:    3999    0x0F9F     BIN:  1111100111110000
19:42:06.829 -> 
19:42:11.305 -> Receive:   61335    0xEF97     BIN:  1110100111110111
19:42:11.305 -> Receive:    3999    0x0F9F     BIN:  1111100111110000
19:42:11.808 -> 
19:42:16.367 -> Receive:   61335    0xEF97     BIN:  1110100111110111
19:42:16.367 -> Receive:    3999    0x0F9F     BIN:  1111100111110000
19:42:16.808 -> Send Ohrana OFF
19:42:16.808 -> 
19:42:16.875 -> 
19:42:21.386 -> Send Ohrana OFF
19:42:21.386 -> 
19:42:27.887 -> Receive:   65535    0xFFFF     BIN:  1111111111111111
19:42:27.887 -> Receive:     159    0x009F     BIN:  1111100100000000
19:42:28.397 -> 
19:42:30.731 -> Send Ohrana ON
19:42:30.731 -> 
19:42:37.728 -> Receive:   65439    0xFF9F     BIN:  1111100111111111
19:42:37.728 -> Receive:    3231    0x0C9F     BIN:  1111100100110000
19:42:38.234 -> 
19:42:39.956 -> Receive:   61374    0xEFBE     BIN:  0111110111110111
19:42:39.956 -> Receive:    2751    0x0ABF     BIN:  1111110101010000
19:42:40.466 -> 
19:42:43.739 -> Receive:   61374    0xEFBE     BIN:  0111110111110111
19:42:43.739 -> Receive:    2751    0x0ABF     BIN:  1111110101010000
19:42:44.244 -> 
19:42:48.903 -> Receive:   61374    0xEFBE     BIN:  0111110111110111
19:42:48.903 -> Receive:    2751    0x0ABF     BIN:  1111110101010000
19:42:49.404 -> 
19:42:51.450 -> Send Ohrana OFF
19:42:51.450 -> 
19:42:53.809 -> Receive:   61374    0xEFBE     BIN:  0111110111110111
19:42:53.809 -> Receive:    2751    0x0ABF     BIN:  1111110101010000
19:42:54.317 -> 
19:42:56.579 -> Send Ohrana OFF
19:42:56.579 -> 
19:42:59.009 -> Receive:   61374    0xEFBE     BIN:  0111110111110111
19:42:59.009 -> Receive:    2751    0x0ABF     BIN:  1111110101010000
19:42:59.518 -> 
19:43:00.892 -> Send Ohrana OFF
19:43:00.892 -> 
19:43:07.792 -> Receive:   65535    0xFFFF     BIN:  1111111111111111
19:43:07.792 -> Receive:     159    0x009F     BIN:  1111100100000000
19:43:08.368 -> Send Ohrana ON
19:43:08.368 -> 
19:43:08.368 -> 
19:43:15.768 -> Receive:   65439    0xFF9F     BIN:  1111100111111111
19:43:15.768 -> Receive:    3231    0x0C9F     BIN:  1111100100110000
19:43:16.270 -> 
19:43:26.567 -> Receive:   64671    0xFC9F     BIN:  1111100100111111
19:43:26.567 -> Receive:    3327    0x0CFF     BIN:  1111111100110000
19:43:27.081 -> 
19:43:30.875 -> Receive:   60575    0xEC9F     BIN:  1111100100110111
19:43:30.875 -> Receive:    3839    0x0EFF     BIN:  1111111101110000
19:43:31.381 -> 
19:43:35.944 -> Receive:   60575    0xEC9F     BIN:  1111100100110111
19:43:35.944 -> Receive:    3839    0x0EFF     BIN:  1111111101110000
19:43:36.448 -> 
19:43:38.198 -> Send Ohrana OFF
19:43:38.198 -> 
19:43:43.217 -> Send Ohrana ON
19:43:43.217 -> 
19:43:44.798 -> Receive:   64767    0xFCFF     BIN:  1111111100111111
19:43:44.798 -> Receive:     255    0x00FF     BIN:  1111111100000000
19:43:45.301 -> 
19:43:47.661 -> Send Ohrana ON
19:43:47.661 -> 
19:43:54.898 -> Receive:   65439    0xFF9F     BIN:  1111100111111111
19:43:54.898 -> Receive:    3231    0x0C9F     BIN:  1111100100110000
19:43:55.400 -> 
19:45:06.012 -> Receive:   64671    0xFC9F     BIN:  1111100100111111
19:45:06.012 -> Receive:    3327    0x0CFF     BIN:  1111111100110000
19:45:06.519 -> 
19:45:10.440 -> Receive:   60575    0xEC9F     BIN:  1111100100110111
19:45:10.440 -> Receive:    3839    0x0EFF     BIN:  1111111101110000
19:45:10.945 -> 
19:45:15.811 -> Receive:   60575    0xEC9F     BIN:  1111100100110111
19:45:15.811 -> Receive:    3839    0x0EFF     BIN:  1111111101110000
19:45:16.320 -> 
19:45:18.507 -> Send Ohrana OFF
19:45:18.507 -> 
19:45:20.928 -> Receive:   60575    0xEC9F     BIN:  1111100100110111
19:45:20.928 -> Receive:    3839    0x0EFF     BIN:  1111111101110000
19:45:21.444 -> 
19:45:23.969 -> Send Ohrana OFF
19:45:23.969 -> 
19:45:30.418 -> Receive:   64767    0xFCFF     BIN:  1111111100111111
19:45:30.418 -> Receive:     255    0x00FF     BIN:  1111111100000000
19:45:30.920 -> 
19:45:59.159 -> Receive:   65439    0xFF9F     BIN:  1111100111111111
19:45:59.159 -> Receive:    3231    0x0C9F     BIN:  1111100100110000
19:45:59.665 -> 

А тут данные от анализатора которые мы реально посылаем... такое ощущение что дуня косячит... отосланные команды немного быстрее чем должны, а в последняя команда пакета и вовсе не полная (Картинка ниже) 
 

Time [s],Value,Parity Error,Framing Error
13.243523540000000,65445,,
13.257056060000000,65445,,
13.270591520000000,65445,,
13.284127300000000,65445,,
13.297669129999999,37,,Error
25.174152500000002,65453,,
25.187694019999999,65453,,
25.201226230000000,65453,,
25.214758440000001,65453,,
25.228294210000001,45,,Error
39.376173180000002,65423,,
39.389705069999998,65423,,
39.403236960000001,65423,,
39.416772420000001,65423,,
39.430312069999999,15,,Error
57.362710819999997,65475,,
57.376242720000000,65475,,
57.389774930000002,65475,,
57.403314260000002,65475,,
57.416852230000003,67,,Error
86.022386380000000,65415,,
86.035918600000002,65415,,
86.049450500000006,65415,,
86.062989529999996,65415,,
86.076527810000002,7,,Error
112.904909270000005,65445,,
112.918441169999994,65445,,
112.931973069999998,65445,,
112.945512730000004,65445,,
112.959051000000002,37,,Error
126.340511640000003,65445,,
126.354047420000001,65445,,
126.367583199999999,65445,,
126.381125800000007,65445,,
126.394664079999998,37,,Error
132.498284930000011,65453,,
132.511816829999987,65453,,
132.525352609999999,65453,,
132.538891960000001,65453,,
132.552429929999988,45,,Error
140.996207679999998,65453,,
141.009743460000010,65453,,
141.023275680000012,65453,,
141.036815030000014,65453,,
141.050356560000012,45,,Error
168.688326359999991,65445,,
168.701865709999993,65445,,
168.715403989999999,65445,,
168.728936210000001,65445,,
168.742471999999992,37,,Error
173.281978129999999,65445,,
173.295517170000011,65445,,
173.309055459999996,65445,,
173.322587999999996,65445,,
173.336120219999998,37,,Error
182.627220080000001,65453,,
182.640761620000006,65453,,
182.654297399999990,65453,,
182.667829939999990,65453,,
182.681368980000002,45,,Error
203.348191520000000,65445,,
203.361729499999996,65445,,
203.375264969999989,65445,,
203.388800760000009,65445,,
203.402343669999993,37,,Error
208.461885630000012,65445,,
208.475424980000014,65445,,
208.488966529999999,65445,,
208.502502010000001,65445,,
208.516037790000013,37,,Error
212.771519250000011,65445,,
212.785051790000011,65445,,
212.798591140000013,65445,,
212.812129120000009,65445,,
212.825664910000000,37,,Error
220.242512729999987,65453,,
220.256054589999991,65453,,
220.269586500000003,65453,,
220.283118419999994,65453,,
220.296654520000004,45,,Error
250.088778480000002,65445,,
250.102310700000004,65445,,
250.115846800000014,65445,,
250.129385850000006,65445,,
250.142923819999993,37,,Error
255.103389859999993,65453,,
255.116925650000013,65453,,
255.130464999999987,65453,,
255.144010420000001,65453,,
255.157542330000012,45,,Error
259.549244260000023,65453,,
259.562779739999996,65453,,
259.576311659999988,65453,,
259.589843879999989,65453,,
259.603382930000009,45,,Error
350.397037200000000,65445,,
350.410579499999983,65445,,
350.424118109999995,65445,,
350.437653909999995,65445,,
350.451186140000004,37,,Error
355.857234660000017,65445,,
355.870779770000013,65445,,
355.884312000000023,65445,,
355.897847479999996,65445,,
355.911382969999977,37,,Error

А тут ниже те данные которые мы получаем от сигнализации для сравнения с "монитором"...
 

Time [s],Value,Parity Error,Framing Error
19.644759400000002,65535,,
19.648624020000000,159,,Error
32.705118440000000,65439,,
32.708981070000000,3231,,Error
51.836901050000002,64415,,
51.840762679999997,3359,,Error
57.433848789999999,65439,,
57.437711419999999,3231,,Error
97.000166039999996,61339,,
97.004026679999996,3871,,Error
100.474300549999995,61339,,
100.478161180000001,3871,,Error
105.380056300000007,61339,,
105.383916929999998,3871,,Error
110.582616990000005,61339,,
110.586477619999997,3871,,Error
115.760753870000002,61339,,
115.764614499999993,3871,,Error
121.093080790000002,61339,,
121.096941419999993,3871,,Error
133.156028959999986,65535,,
133.159893579999988,159,,Error
148.313605669999987,65439,,
148.317468289999994,3231,,Error
154.549687140000003,61335,,
154.553547769999994,3999,,Error
158.272603629999992,61335,,
158.276464250000004,3999,,Error
163.253910990000008,61335,,
163.257771609999992,3999,,Error
168.312193979999989,61335,,
168.316054610000009,3999,,Error
179.826021120000007,65535,,
179.829885730000001,159,,Error
189.669184639999997,65439,,
189.673047260000004,3231,,Error
191.895077189999995,61374,,
191.898938810000004,2751,,Error
195.692631210000002,61374,,
195.696492830000011,2751,,Error
200.850910980000009,61374,,
200.854772590000010,2751,,Error
205.755398969999987,61374,,
205.759260579999989,2751,,Error
210.962385310000002,61374,,
210.966246930000011,2751,,Error
219.725824829999993,65535,,
219.729689439999987,159,,Error
227.718463600000007,65439,,
227.722326220000014,3231,,Error
238.512015670000011,64671,,
238.515876300000002,3327,,Error
242.816492030000006,60575,,
242.820351649999992,3839,,Error
247.896527469999995,60575,,
247.900387090000009,3839,,Error
256.735989759999995,64767,,
256.739852380000002,255,,Error
266.829543119999983,65439,,
266.833405739999989,3231,,Error
337.951824719999991,64671,,
337.955685350000010,3327,,Error
342.390813120000018,60575,,
342.394672759999992,3839,,Error
347.746979590000024,60575,,
347.750839219999989,3839,,Error
352.880681429999981,60575,,
352.884541060000004,3839,,Error
362.363811010000006,64767,,
362.367673630000013,255,,Error

Итог, буду юзать другую дуню...  (днем была 328P, а вечером 168РА... может  в этом дело с прападающими пакетами и неявными импульсами) в остальном код вполне рабочий от срабатывания сигнализации данные поступают в "монитор" без косяков... 

Картика

MaksVV
Offline
Зарегистрирован: 06.08.2015

Я половину не понял из сказанного. для начала поиграться с временем бита BIT_DURATION. По расчётам Евгения должно быть 206 мкс. попробуй.  модель атмеги здесь не при чем, имхо,  а вот кварц теоретически может влиять и/или загрузчик/фьюзы под данный кварц.  По хорошему если замена ардуины ничего не даст, нужны осциллограммы реального обмена мессенджера и сигналки, и сравнивать с осциллограммой связки нашей городьбы на дуине и сигналки . 

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

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

#include <SL_Data.h>
#define SLDATA_RX 7 //выбираем пин RX ардуино на sl-data, на меге это пины имеющие pcint 
                    // данные идут от сигнализации на этот пин

#define SLDATA_TX 9 //выбираем пин TX ардуино на sl-data, данные идут с этого пина на сигнализацию 
 
SL_Data sl_data(SLDATA_RX, 8, 1); // (RX, TX, 1==invert_logic)  // пины правленного софт сериал

#define BIT_DURATION  200  //время одного бита в микросекундах

// команды управления сигнализацией
const uint16_t ZAPROS     = 17085;
const uint16_t START_ENG  = 8670;
const uint16_t STOP_ENG   = 8415;
const uint16_t OHRANA_ON  = 4590;
const uint16_t OHRANA_OFF = 4335;


void printdata (const uint16_t &data) 
{
 for (uint32_t i = 10; i<=100000; i*=10 ){if (data<i) Serial.print (" ");}  Serial.print(data); Serial.print(F("    0x")); 
 for (uint32_t i = 16; i<=0xFFFF; i*=16 ){if (data<i) Serial.print("0");} Serial.print(data, HEX); Serial.print(F("     BIN:  "));
 for  (int i =0; i<16; i++) Serial.print(bitRead(data, 15-i)); 
      Serial.println(); 
  
}

void sl_data_read ()
{
  static bool timer_println = 0; static uint32_t prev_timer_println = 0; 
  
  // получаем данные (слово 16 bit) от сигнализации 
 if (sl_data.available()) 
   {
    uint16_t data = (uint16_t)sl_data.read(); // слово, полученное от сигнализации
    if (data!=0){
      if (!timer_println) timer_println = 1;      
      prev_timer_println = millis();
      Serial.print (F("Receive:  "));
      printdata(data);
                }
   }
 if (timer_println && millis() - prev_timer_println > 500)  {timer_println = 0; Serial.println();}
}


void sendword (uint16_t &inbyte)
{
  digitalWrite (SLDATA_TX , 1);    // send start bit 
  delayMicroseconds (BIT_DURATION); 

  for (int i =0; i<16; i++)
  {
  digitalWrite (SLDATA_TX ,  !bitRead(inbyte, i)); //send data bits
  delayMicroseconds (BIT_DURATION); 
  }
}

void sendcommand (uint16_t comm)
{
   
  for (int g = 0; g<5; g++)
  {
      digitalWrite (SLDATA_TX , 0);
      delay (10);
      sendword(comm);
  } 
  digitalWrite (SLDATA_TX , 1);
  }

void debug_readcommand()
{
if (Serial.available())
  {
     byte inbyte = Serial.read();
     if (inbyte == 'z') sendcommand (ZAPROS),    Serial.print(F(" Send Zapros: ")),       printdata(ZAPROS), Serial.println(); 
else if (inbyte == 's') sendcommand (START_ENG), Serial.print(F(" Send Start Engine: ")), printdata(START_ENG), Serial.println();
else if (inbyte == 'p') sendcommand (STOP_ENG),  Serial.print(F(" Send Stop Engine: ")),  printdata(STOP_ENG), Serial.println();
else if (inbyte == '1') sendcommand (OHRANA_ON), Serial.print(F(" Send Ohrana ON: ")),    printdata(OHRANA_ON), Serial.println();
else if (inbyte == '0') sendcommand (OHRANA_OFF),Serial.print(F(" Send Ohrana OFF: ")),   printdata(OHRANA_OFF), Serial.println();
  }
}

void setup() 
{
  Serial.begin(115200);
  sl_data.begin(4800);
  pinMode (SLDATA_TX , OUTPUT);
  digitalWrite (SLDATA_TX , 1);
}


void loop() 
{ 
 debug_readcommand();
 sl_data_read ();
}

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

Станислав Пимшин пишет:
А тут данные от анализатора которые мы реально посылаем... такое ощущение что дуня косячит... отосланные команды немного быстрее чем должны, а в последняя команда пакета и вовсе не полная (Картинка ниже) 

 

Time [s],Value,Parity Error,Framing Error
13.243523540000000,65445,,
13.257056060000000,65445,,
13.270591520000000,65445,,
13.284127300000000,65445,,
13.297669129999999,37,,Error

дак может это не ардуина косячит, а анализатор? сигналка такие отосланные данные нормально воспринимает?

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

UPDATE

хотя судя по твоим картинкам тут явно с длительностью битов косяк, либо чтото с bitrate на анализаторе 

команды, как говоришь, не "немного быстрее", а в ДВА! раза длительность отличается, видимо косяк все таки в ардуине:  8Мгц,  например , вместо 16 или наоборот (неохота соображать).

Станислав Пимшин
Offline
Зарегистрирован: 18.11.2019

Косяка было два, плохой контакт и ардуинка...
П.С, Буду в ближайшее время серфить все сигналы (которые можно)... 

MaksVV
Offline
Зарегистрирован: 06.08.2015

ну как там реверс инжениринг ? Старлайн сдалсо? 

Mna
Offline
Зарегистрирован: 04.02.2022

Доброго всем здравия.

Станислав, мне тоже интересна данная тема. Расскажи, год спустя, получилось что-то сделать с шиной SL-Data? Есть какое-то рабочее решение?

Для тех, кому будет интересно: скейч из #69 рабочий. Проверил на реальной сигнализации. Спасибо MaksVV и Станиславу!

MaksVV
Offline
Зарегистрирован: 06.08.2015

это не может не радовать . Какая была модель сигналки?  и как должно выглядеть по вашему "рабочее решение" 

Mna
Offline
Зарегистрирован: 04.02.2022

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

Сигналка A92CAN v1.06. Ну, рабочее - это то, что уже работает на машине ;) Просто судя по этой ветке, дальше экспериментов дело не ушло.

Я озадачился на свою Honda Stream со старой A9 сигнализацией, поставить Вебасту... Но просто тупо ставить - это не про меня :) Изначально думал, что буду просто по звонку запускать вебасту, но... так не интересно, да и аккум можно посадить. Поэтому, надо чтобы вебаста запускалась по звонку, при прогреве, заводила двигатель и грела салон... А9 не умеет заводить двигатель по внешней команде, поэтому приобрел старенькую А92, которая 1в1 подходит к моей, но имеет SL-Data, так же приобрел GSM реле - для реализации первичной задачи... И... нашел эту статью, расстроился, что не взял просто GMS модуль для ардуинки, но делать нечего, уже взял:) Вот сейчас собираю весь этот компот воедино. летом все поставлю на машину, а пока балуюсь с изготовлением платы и программированием атмеги. Поковырялся с протоколом SL-Data, из данных были только те, которые нашел на этих 2х страницах. Как мне показалось, я понял как строятся команды:

Например, что за число такое: 4590? по моему видению - это первый байт=17, а второй - это инверсия=238. как это в двоичной системе: 00010001 11101110 - первый байт и инверсия. И так все команды. Соответственно, существует только 256 команд. Я перебрал их все, что-то не понял, что-то нашел. Плюсом к уже ранее указанным командам:

48 - Открыть без звука (если стоит беззвучный режим)

49 - режим Паника

80 - Выход из Валет

81 - Валет

97 - Отключить 2й уровень датчика удара

99 - Отключить 1й уровень датчика удара

Для моей задачи эти команды не нужны, но вдруг кто еще решится на старую сигналку :)

Stanislav Pimshin
Offline
Зарегистрирован: 07.11.2021

Mna пишет:

 Ну, рабочее - это то, что уже работает на машине ;) Просто судя по этой ветке, дальше экспериментов дело не ушло.

Да просто меня забанили нежные создания, ответить по факту нечем было... пока закинул в долгий ящик.. но с укороченной версией (ардуино и кнопки) все работало штатно на А91 и на А61... Но опять же сняты данные были при использовании старой телематики... новая телематика еще дает температуру и напряжение.. 

Mna
Offline
Зарегистрирован: 04.02.2022

Stanislav Pimshin пишет:

 новая телематика еще дает температуру и напряжение.. 

А вот это уже очень интересно. Можешь поделиться информацией?

Stanislav Pimshin
Offline
Зарегистрирован: 07.11.2021

К сожалению нет... сейчас занят работой... да и под рукой нет А93 с джиэсэм... 

Кстати возможно что напряжение берет с самого блока джиэсэм..

MaksVV
Offline
Зарегистрирован: 06.08.2015

На а93 вроде нет sl data, только на её предшесивеннице а94. У меня даже до экспериментов с сигналкой руки не дошли, эксперименты были только с двумя ардуинами, чтобы softserial помучить. Поэтому и удивляюсь даже, что скетч заработал.

Mna
Offline
Зарегистрирован: 04.02.2022

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

Да, скетч работает. данные как передает, так и читает. Сейчас мне пока нечем поделиться, но, когда закончу, постараюсь не забыть сюда выложить схему, описание и итоговый скетч. Но,  похоже что, этим вопросом никто не интересуется, кроме нас троих :)

MaksVV
Offline
Зарегистрирован: 06.08.2015

Ну иногда и для себя полезно выложить, вдруг опять понадобицца. А забывается это все быстро.

MaksVV
Offline
Зарегистрирован: 06.08.2015

Mna пишет:

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

Да, скетч работает. данные как передает, так и читает. Сейчас мне пока нечем поделиться, но, когда закончу, постараюсь не забыть сюда выложить схему, описание и итоговый скетч. Но,  похоже что, этим вопросом никто не интересуется, кроме нас троих :)

Приветствую, может довели дело до конца ? есть ещё результаты?

Stanislav Pimshin
Offline
Зарегистрирован: 07.11.2021

MaksVV пишет:

Приветствую, может довели дело до конца ? есть ещё результаты?

Я забросил эту тему временно, в будущем планирую сделать библиотеку SL-data для старлайнообразных... так как по сути та же А91 еще успешно продается, да и по факту довольно не плоха... 

MaksVV
Offline
Зарегистрирован: 06.08.2015

Я проверил на А94. На одной из первых А94, где процессор 527, скетч работает хорошо (время бита ставил 190) , но на большинстве других А94, где проц К22, никак - не хочет сигналка команды воспринимать. Отвечает при этом пачкой противоположных бит ну как байте 55h (примерно 80штук) типа как будто ей битрейд запроса не нравится. Пробовал время бита от 70 до 270 - нифига. Печалька.
Выяснил, что трехпиновый разъем sl data запараллелен с tx rx для gsm модуля, который предназначен внутрь вставляться. Там протокол другой. Скорость вроде как 9600. Но просто так сигналка команды не примет. Там процедура привязки модуля. Пытаюсь разобраться. Если протокол хакнуть. По идее и к свежей а93 можно будет подключить

MaksVV
Offline
Зарегистрирован: 06.08.2015

Mna пишет:
Как мне показалось, я понял как строятся команды:

Например, что за число такое: 4590? по моему видению - это первый байт 0x11, а второй - это его инверсия 0xEE. как это в двоичной системе: 00010001 11101110 - первый байт и инверсия. И так все команды. Соответственно, существует только 256 команд. Я перебрал их все, что-то не понял, что-то нашел. Плюсом к уже ранее указанным командам:

48 - Открыть без звука (если стоит беззвучный режим)

49 - режим Паника

80 - Выход из Валет

81 - Валет

97 - Отключить 2й уровень датчика удара

9 - Отключить 1й уровень датчика удара

Для моей задачи эти команды не нужны, но вдруг кто еще решится на старую сигналку :)

Mna был совершенно прав команда поставить на охрану 4590 это 0x11EE в хексе т.е. два байта инверсия друг друга. т.е. все как в смс командах :

11h это поставить на охрану, 10h - снять с охраны, 42h - запрос состояния, 21h - запуск ДВС, 20h - стоп ДВС

посылается эти две инверсные пары байт 5 раз , все как описывал Станислав. Ну и шина инверсная, старт бит и стоп биты в т.ч. тоже инверсные. причем старт и стоп биты посылаются не на каждый байт а на 16 бит (те на 2 байта один старт и стоп бит) Это все тоже уже исследовал Станислав. Но вот ответ от сигналки не такого плана.

Ответ также 4800 бод,  все биты инвертированы. Сигналка отвечает на любые команды просто - ответом состояния.  Но в кадре похоже не 16 бит , а 32. Т.к. старт бит вижу только один на всю посылку. отвечает сигналка одним словом 32 бита. Поэтому не получалось нормально расшифровать ответы от сигналки. Биты все время съезжали при исследовании . Поэтому  опять поправил библиотеку на прием 32битного слова и тогда все получилось . В ответе от сигналки самый старший байт (старшие 8 бит из 32) это контрольная сумма. Нашел в ответе сигналки где лежат двери, капот, багажник, тормоз, зажигание, состояние охраны, замков, состояние работы двс, состояние тревоги, состояние датчика удара.   Внизу этого поста тестовый скетч , пробуйте кому интересно. Вверху скетча есть два #define для настройки скорости шины sl-data. Если не реагирует на  команды - пробовать играться с длительностью бита BIT_DURATION. Если коряво принимает данные играться со SL_BAUDRATE. У меня было три сигналки на которых всё это проверял.

На старой  twage B6 стабильной была такая пара BIT_DURATION 195 и SL_BAUDRATE 4900.

На сигналке по свежее А64 стабильная пара у меня такая: BIT_DURATION 190 и SL_BAUDRATE 4790. 

На сигналке А94 (одна из первых этой серии)  BIT_DURATION 200  и SL_BAUDRATE 4850.

 

#include <SL_Data32.h>

#define SLDATA_RX 7 // выбираем пин RX ардуино на sl-data, на меге это пины, имеющие pcint 
                    // данные идут от сигнализации на этот пин (подключить к правому пину разъема SLdata)
                    // средний пин разъема SL-Data сигналки это GND

#define SLDATA_TX 6 //выбираем пин TX ардуино на sl-data, данные идут с этого пина на сигнализацию (на левый пин разъема SLdata)

#define BIT_DURATION  200  //время одного бита в микросекундах (для отправки данных на сигналку)
#define SL_BAUDRATE   4800 //скорость soft uart (для получения данных от сигналки)

//#define STOP_BIT  // закоментировать, для отсутствия стоп бита в отправке команды на старлайн
#define DEBUG     // раскоменнтировать если нужна отладка. закоментировать в итоговом скетче проекта 


SL_Data sl_data(SLDATA_RX, 22, 1); // (RX, TX, 1==invert_logic)  // пины правленного софт сериал

// команды управления сигнализацией
const uint8_t ZAPROS     = 0x42;
const uint8_t START_ENG  = 0x21;
const uint8_t STOP_ENG   = 0x20;
const uint8_t OHRANA_ON  = 0x11;
const uint8_t OHRANA_OFF = 0x10;

// переменные работы сигнализации 
bool Doors    = 0 ; 
bool Locks    = 0 ;
bool Ohrana   = 0 ;
bool Trunk    = 0 ; 
bool Hood     = 0 ; 
bool Ignition = 0 ; 
bool Brake    = 0 ; 
bool Engine   = 0 ; 
bool Trevoga  = 0 ; 
bool Tiltsensor   = 0 ; 
bool Shocksensor  = 0 ; 

#ifdef DEBUG
void printdata (const uint32_t &data, const bool &CSgood) 
{
 Serial.print (F("Receive:  "));
 Serial.print(F("    0x")); Serial.print(data, HEX); Serial.print(F("     BIN:  ")); 
 for  (int i =0; i<32; i++) {Serial.print(bitRead(data, 31-i)); if (i==7||i==15||i==23)Serial.print(" ");}
      Serial.println(); 
 Serial.print (" Door: "); Serial.print (Doors);  Serial.print ("  Ign: "); Serial.print (Ignition);
 Serial.print ("  Brake: "); Serial.print (Brake); Serial.print ("  Trunk: "); Serial.print (Trunk);
 Serial.print ("  Hood: "); Serial.print (Hood); Serial.print ("  Locks: "); Serial.print (Locks);
 Serial.print ("  Ohrana: "); Serial.print (Ohrana); Serial.print ("  Engine: "); Serial.print (Engine);
 Serial.print ("  Trevoga: "); Serial.print (Trevoga);
 Serial.print ("  Shock: "); Serial.print (Shocksensor); Serial.print ("  Tilt: "); Serial.println (Tiltsensor);
 if (CSgood) Serial.println ("Checksumm is good!!!"); else  Serial.println ("Checksumm is Error!!!");
Serial.println(); 
}
#endif


void sl_data_read ()
{
   // получаем данные (слово 32 bit) от сигнализации 
 if (sl_data.available()) 
   {
    uint32_t data = (uint32_t)sl_data.reaD(); // слово, полученное от сигнализации
    if (data!=0){
    byte answer[3] = {0} ; 
answer[0] = data;
answer[1] = (data & 0x0000FF00)>>8;
answer[2] = (data & 0x00FF0000)>>16;
answer[3] = (data & 0xFF000000)>>24;
byte CS = 0 ; 
CS= ~(answer[0]+answer[1]+answer[2]+2);
bool CSgood = (CS==answer[3]);
if (CSgood) {GoodResponse_received_from_starline(data);}   ;
 #ifdef DEBUG  
      printdata(data, CSgood);
 #endif     
                }
   }

}

void sendword (uint8_t &inbyte)
{
  
  digitalWrite (SLDATA_TX , 1);    // send start bit 
  delayMicroseconds (BIT_DURATION); 
  for (byte g=0; g<2; g++){
  for (int i =0; i<8; i++)
  {
  if (!g) digitalWrite (SLDATA_TX ,  bitRead(inbyte, i));  else digitalWrite (SLDATA_TX ,  !bitRead(inbyte, i)); //send data bits
  delayMicroseconds (BIT_DURATION); 
  }
  
  }
#ifdef STOP_BIT
digitalWrite (SLDATA_TX , 0); // send stop bit
delayMicroseconds (BIT_DURATION);
#endif
}

void sendcommand (uint8_t comm)
{
   
  for (int g = 0; g<5; g++)
  {
      digitalWrite (SLDATA_TX , 0);
      delay (10);
      sendword(comm);
//   sl_data.wriTe(comm);  
  } 
  digitalWrite (SLDATA_TX , 1);
  }

#ifdef DEBUG
void debug_readcommand()
{
if (Serial.available())
  {
     byte inbyte = Serial.read();
     if (inbyte == 'z') {sendcommand (ZAPROS),    Serial.print(F(" Send Zapros Sostoyanya: ")); Serial.print (ZAPROS,HEX);}
else if (inbyte == 's') {sendcommand (START_ENG), Serial.print(F(" Send Start Engine: ")); Serial.print (START_ENG,HEX);}
else if (inbyte == 'p') {sendcommand (STOP_ENG),  Serial.print(F(" Send Stop Engine: ")); Serial.print (STOP_ENG,HEX);}
else if (inbyte == '1') {sendcommand (OHRANA_ON), Serial.print(F(" Send Ohrana ON: "));  Serial.print (OHRANA_ON,HEX);} 
else if (inbyte == '0') {sendcommand (OHRANA_OFF),Serial.print(F(" Send Ohrana OFF: ")); Serial.print (OHRANA_OFF,HEX);}
Serial.println();
  }
}

#endif

// в этой функции обновляем переменные, если получен ответ от старлайн с правильной контрольной суммой

void GoodResponse_received_from_starline(const uint32_t &data)
{
Doors    = !(bool(((uint32_t)1 << 0)  &  data));
Trunk    = !(bool(((uint32_t)1 << 2)  &  data));
Hood     = !(bool(((uint32_t)1 << 3)  &  data));
Ignition = !(bool(((uint32_t)1 << 19) &  data));
Brake    = !(bool(((uint32_t)1 << 18) &  data));
Engine   = !(bool(((uint32_t)1 << 7) &  data));     
Locks    = !(bool(((uint32_t)1 << 5)  &  data));
Ohrana   = !(bool(((uint32_t)1 << 6)  &  data));
Trevoga  = !(bool(((uint32_t)1 << 12)  &  data));
Shocksensor  =  !(bool(((uint32_t)1 << 14)  &  data));    // 
//Tiltsensor =  !(bool(((uint32_t)1 << ????)  &  data));  // тут нужно выяснить какой бит отвечает за сработку датчика наклона
// 23й бит это тип КПП, 1 - АКПП, 0 - МКПП. 
 
  }

void setup() 
{
  #ifdef DEBUG
  Serial.begin(115200);
  #endif
  sl_data.begin(SL_BAUDRATE);
  pinMode (SLDATA_TX , OUTPUT);
  digitalWrite (SLDATA_TX , 1);
}


void loop() 
{ 
  #ifdef DEBUG
 debug_readcommand();
  #endif
  
 sl_data_read (); // в скетче проекта в лупе оставляем только эту функцию
}

 

Stanislav Pimshin
Offline
Зарегистрирован: 07.11.2021

MaksVV пишет:
Там процедура привязки модуля. Пытаюсь разобраться. Если протокол хакнуть. По идее и к свежей а93 можно будет подключить

Нужно будет анализатор подкинуть... снять все команды и ответы с А93 

MaksVV
Offline
Зарегистрирован: 06.08.2015

У меня осцилл, анализатор с али только заказал. По осциллке там похоже не uart.
Как только передающий рот открывает. Оппонент ему меандр (пачку чередующихся 80 бит). И передающий начинает в это время передавать. Возможно по этой пачке бит от опонента скорость передачи и задается.
Потом роли меняются. Время одного бита 100мкс. Может там скорость 9600. И пачка передачи скорее всего также 80 бит без всяких старт или стоп битов.

Stanislav Pimshin
Offline
Зарегистрирован: 07.11.2021

Со слов похож на i2c в принципе это логично... адресация прописывается в МК, но если идет вопрос про подключение разных модулей то скорее всего инициализация в мастере формируется поиском и записью в еепром обнаруженного устройства, скорее всего это происходит при подаче питания на мастер.

Следовательно нужно брать 93ю и собирать схему на столе со всеми концевиками датчиками и так далее и слушать что и как!

MaksVV
Offline
Зарегистрирован: 06.08.2015

Я в протоколах не силен, но, насколько знаю, в i2c один провод всегда линия тактирования. А по второму данные в обе стороны бегают. Поэтому есть мастер даже когда общающихся только двое. Здесь же все таки тх и rx, но, по всей видимости, передача происходит по синхре от опонента. потому как тактирование то на одном проводе , то на другом. видимо принимающий задает тактирование по линии TX.   Картинки выложу позже

MaksVV
Offline
Зарегистрирован: 06.08.2015

проверил скетч #85. на старой сигналке starline B6. Всё работает. Только скорость sl_data.begin(4800); пришлось подрегулировать,  чтоб правильно биты в ответе сигналки  отображались . на этой B6 у меня скорость 4900 нормально  заработала и  время бита  195 (для команд) в моем случае стабильно. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

я, похоже, выяснил,  как вычисляется контролька в ответе от сигналки (речь про старый протокол 4800 бод, скетч для которого в #85 посте).

ответ 32 бита, т.е. 4 байта . байты считаем с нулевого (младшего т.е. правого).

Самый левый байт (старший, т.е 3й байт)  это  контрольная сумма = инверсия выражения (0й байт + 2байт + 1). это при условии что в ответе 1-й байт(второй справа)  всегда FF. У меня при любых состояниях он был FF. Если он в каких то случаях, всё же отличен от FF, наверное более правильная формула будет, чтоб этот 1-й байт тоже участвовал в подсчете контрольки, тогда, по всей видимости, формула будет такая и она работает естественно в т.ч. когда 1й байт равен FF. Все правильно: 

контрольная сумма (старший байт ответа) = инверсия выражения (сумма младших 3х байт + 2)

добавил в скетч #85 проверку контрольки

Играйтесь значениями дефайнов вверху скетча BIT_DURATION 200, пока сигналка не будет стабильно выполнять команды , и также SL_BAUDRATE 4800, пока стабильно в ответах не будете получать правильную контрольку. 

Кстати, когда в скетч своего проекта всю эту городьбу вставляете, тоже может потребоваться подрегулировка скорости и времени бита . т.к. время выполнение лупа в разных скетчах разное и видимо от этого зависит. Хотя не должно, по идее , но вот оно так.  ну и естественно обновляйте переменные только по условию, что контролька правильная (в скетче #85 это так и сделано в отдельной функции).

думаю , этот старый протокол SL-data можно считать хакнутым. 

ну и напоследок скажу , что уровни на линиях  всегда 0...5В по осциллографу. Просто до этого выше ходили разговоры, что напряжения бывают выше 5В, это не так. Это от того что тестером  мерили, а он может так показывать .  В сигналке на линиях tx  и rx стоят по 1кОм резисторы. Так что можно не бояться напрямую к пинам МК ардуино подключать. Если смотреть на разъем сигналки. на левый пин подключаем TX ардуино, на средний GND. на правый - RX ардуино. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

MaksVV пишет:
  Картинки выложу позже

Новый протокол под привязку модуля GSM для сигнализаций starline  А94, А93 и им подобных успешно хакнут. На новом форуме обсуждаем этот протокол. Там же скрины осциллограмм и как происходило расшаривание протокола. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

обновил скетч #85. Добавил определение тревоги и срабатывания датчика удара из ответа от сигналки.

MaksVV
Offline
Зарегистрирован: 06.08.2015

кому интересна эта тема, нашел в ответе от сигналки информацию, работает двс или нет. Поправил скетч #85. Теперь там есть вся информация. Можно переезжать в проекты.