Pull to refresh

«Патчим» зеркало в автомобиле

Reading time 5 min
Views 66K
Коллега на работе купил себе новый автомобиль Chery Tiggo FL, куда китайцы напихали много различных функций за невысокую стоимость автомобиля. Одной из самых необычных штуковин в авто оказалось «волшебное» зеркало, которая наделено функциями барометра, альтиметра и компаса.

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



Итак, приступим к созданию «патча» на зеркало.

Постановка задачи. Необходимо в автомобиле получать информацию о внешней температуре окружающей среды и температуре внутри салона. В качестве ограничения принимаем, что дополнительные «колхозные» устройства ставить не будем. В качестве допущения принимаем возможность отказаться от показаний альтиметра и барометра. В качестве исходных данных выступает зеркало заднего вида, изображенное на рисунке.

Анализ исходных данных. Любое дело начинается с анализа исходных данных, поэтому начнем с демонтажа зеркала и его разбора. Судя по внешнему виду в зеркале имеется два индикатора светодиодных семисегментных по 4 знака, значит либо до них можно добраться, либо придумать что-то свое.

Вообще стоит отметить, что реализация функций альтиметра, барометра и компаса довольная отвратительная в зеркале, потому что показания плавают сильно, значения кратны 100, а компас не калибруем по известным методикам. Поэтому данные функции можно выкинуть при случае. Тем более, известно, что одновременное измерение высоты и давления одним барометрическим датчиком с допустимой точностью невозможно. Если изменяется высота, то датчик должен измерять только высоту, а если стоим на месте, то измеряем только атмосферное давление. Судя по показанием приборов, складывается ощущение, что в зеркале имеется один компас и один барометрический датчик.

Внутри зеркала находится такая плата:



Итак вскрытие показало, что у нас внутри зеркала находится плата, на которой для управления индикаторами LED стоят драйверы TM1638, а логика зашита в контроллер MPC82E54AS2. В качестве датчика используется MEMSIC C2122M. Заниматься перезашивкой текущего контроллера и модификацией платы пока желания нет, поэтому решено сделать свою плату для зеркала, которая будет реализовать нашу логику и выводить нужную нам информацию от датчиков.

Решение задачи. Итак, решено сделать свою плату, повторяющую габариты штатной платы и индикаторы, только не будет использовать индикатор компаса, он нам не нужен. Логика работы устройства следующая:
1) Имеется три кнопки: "+", «PWR», "-": прибавить яркость, вкл или выкл подсветки, убавить яркость;
2) При нажатии на кнопки, включается подсветка и информация отображается 20 секунд;
3) Если экран включен, то PWR выключает его;
4) Данные температур обновляются раз в 1 секунду.

Соответственно функциональная схема устройства имеет вид:



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

В качестве микроконтроллера будем использовать STM8S003, как самый дешевый из линейки STM8S, периферии у него достаточно, а в частности нам необходимы только GPIO, RCC, SPI. В качестве датчиков температуры использованы DS18B20, которые не составляют дефицита и есть на руках. Для управления LED индикаторам используется MAX7221.

МК STM8S003 имеет следующие характеристики:



Выбор данного МК обусловлен его простотой, дешевизной в условиях кризиса, а также наличием простых средств разработки (STM8S-Discovery). Для тех кто не хочет разводить печатку, можно сделать все тоже самое на макетной плате с использованием следующей просто отладочной платки:



Цена на ebay всего 120 рублей.

Исходя из функциональной схемы получается следующая принципиальная схема устройства:



Плату с двухсторонним монтажом изготовили с помощью фоторезиста, также им сделан слой маски фиолетового цвета, в результате чего получилось следующее изделие, вид «штатной» платы и «патч» платы со своей логикой:



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

Внутри исходного кода три простых библиотеки на языке Си:
  • работы с бипером
  • работы с драйвером LED
  • работы с DS18b20


С точки зрения программирования ключевым моментом является факт, что у STM8 плавают такты, поэтому задержки для DS18b20 реализованы на базовом таймере номер 4, для примера функция задержки на 15 мкс для контроллера на частоте 16МГц имеет вид:

void _delay_15us(u16 n_15us)
{
   /* Init TIMER 4 */
  CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER4, ENABLE);
   /* Предделитель: / (2^3) = 8   /3 */
   TIM4->PSCR = 3;
   /* SYS_CLK_HSI_DIV1 Auto-Reload: 16M / 8 = 2M, тогда 15мкс это 30 тактов */
  TIM4->ARR = 29; // 30 - 1
  /* Компенсация времени инициализации таймера в МК*/
  TIM4->CNTR = 29;
  /* Сбросить флаг обновления */
  TIM4->SR1 &= ~TIM4_SR1_UIF;
  /* Включить счет */
  TIM4->CR1 |= TIM4_CR1_CEN;

  while(n_15us--)
  {
    while((TIM4->SR1 & TIM4_SR1_UIF) == 0) ;
    TIM4->SR1 &= ~TIM4_SR1_UIF;
  }

  /* Отключить таймер */
  TIM4->CR1 &= ~TIM4_CR1_CEN;
  CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER4, DISABLE);
}


Пример обмена с датчиком DS18b20 средствами UART1 подсказал artko:
void ds1820_uartinit(uint32_t baud)
{
  USART_DeInit(USART1);
  USART_Init(USART1, baud, USART_WordLength_8b, USART_StopBits_1, USART_Parity_No,
  USART_Mode_Rx | USART_Mode_Tx);
}
void ds1820_write(uint8_t byte)
{
  UART1->DR = byte;
  while (!(UART1->SR & (uint8_t)UART1_FLAG_TC)); // ждем завершения передачи
}

uint8_t ds1820_read() 
{
   return ((uint8_t)UART1->DR);
}

void ds_write(uint8_t byte) {
    int i;
    for(i = 0; i < 8; i ++) {
        if(byte & 1) {
            ds1820_write(0xff);
        } else {
            ds1820_write(0x00);
        }
        ds1820_read();
        byte >>= 1;
    }
   
}

uint8_t ds_read() {
    int i;
    uint8_t res = 0;
    for(i = 0; i < 8; i ++) {
       ds1820_write(0xff);
       uint8_t c = ds1820_read();
       if(c == 0xff) {
          res |= (1 << i);
       }
    }
    return res;
}

void ds1820_startconversion()
{
  ds1820_uartinit(9600);
  ds1820_write(0xf0);
  ds1820_uartinit(115200);
  ds_write(0xcc);
  ds_write(0x44);
}

int16_t ds1820_readtemp()
{
  ds1820_uartinit(9600);
  ds1820_write(0xf0);
  ds1820_uartinit(115200);
  ds_write(0xcc);
  ds_write(0xBE);
  uint8_t temp1 = ds_read();
  uint8_t temp2 = ds_read();
 
  int16_t temp3 = (uint16) temp2 * (uint16)0x0100L + (uint16) temp1;
  return temp3;
}

ну и сам сброс
ds1820_uartinit(9600);
ds1820_write(0xf0);


Уровень яркости индикаторов сохраняется в энергонезависимой памяти по принципу «карты памяти» описанной с помощью структуры. Для каждого поля структуры имеется функция взятия значения и функция записи нового значения.

Выводы. Итак, разработано устройство для автомобиля, которое решает задачу измерения температуры внутри салона и вне его. Казалось простая функция, но почему то в Китайских авто её нет, либо она очень спрятана от обывателя.

Демонстрация функционала новой платы:



Даташиты на компоненты «штатной платы»:
www.moly-tech.com/uppdf/MEMSIC/MMC2122MG%20RevC.pdf
kazus.ru/datasheets/pdf-data/3675111/MEGAWIN/MPC82E54AS2.html
cholla.mmto.org/computers/avr/cool_parts/tm1638.pdf

Исходный код прошивки платы:
Исходный код для IAR

UPD:
Как обещал процесс сборки в зеркало:


Испытания на отрицательные температуры:


Зеркало в сборе!
Tags:
Hubs:
+49
Comments 55
Comments Comments 55

Articles