Как стать автором
Обновить

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

Время на прочтение5 мин
Количество просмотров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:
Как обещал процесс сборки в зеркало:


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


Зеркало в сборе!
Теги:
Хабы:
Всего голосов 49: ↑49 и ↓0+49
Комментарии55

Публикации