Встраиваемый счётчик наработки или борьба с хитрыми клиентами

Один мой товарищ пожаловался при встрече на некоторых недобросовестных покупателей. Работает он в большой компании по продаже бытовых устройств. Вот что он рассказал:

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

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

Итак, счётчик должен быть малогабаритным, запитываться от устройства и иметь возможность чтения данных наработки в случае необходимости. Прототип разрабатывал на модуле MiniTiny. Если испытания пройдут успешно, можно будет заказать печатные платы для небольшой серии. Считывать информацию можно любым доступным переходником USB-Uart. Я использую адаптер UART USB-TTL CH340. Терминальная программа любая, я использовал Termite.

Связка MiniTiny и  USB-TTL

Связка MiniTiny и USB-TTL

Алгоритм работы следующий: как только прибор будет включен, питание будет подано и на счетчик. Программа начнёт отсчитывать время. При отключении устройства, у микроконтроллера будет до одной секунды, чтобы внести данные в нестираемую память. Там они хранятся до следующего включения.

c4e7bc1d7be530939fee0c82e4743bbe.jpg

По схеме. Микроконтроллера Attiny13 хватает с избытком. Диод D1 защищает от ошибочного подключения питания. Два конденсатора и диод D2 — элементы автономного питания, используются для поддержания напряжения на время записи данных в EEPROM после отключения устройства. Диод D2 служит для развязки от батареи устройства. Диод D3 служит для развязки от батареи устройства при снятии данных. На делителе R1-R2 узел сигнализации отключения внешнего питания, по этому сигналу программа вносит последние данные в EEPROM. К разъёму X3 подключается переходник USB-TTL. На схеме есть ещё светодиод, он использовался для наглядности при проектировании. В серии его не будет.

Программу писал на Bascom. Среда проектирование «Bascom — AVR IDE». Заинтересовавшимся можно немного почитать о настройке в спойлере.

Hidden text

Bascom — язык программирования микроконтроллеров на базе распространённого в свое время языке Basic. Пожалуй, это самый простой путь вхождения в программирование микроконтроллеров.

Скачиваем с официального сайта Freeware версию (бесплатная с ограничением на размер кода до 4 кБ). После установки оставляем всё по умолчанию, кроме выбора программатора. Заходим в Options/Programmer выбираем USBASP жмем ОК.

Настройка Bascom-AVR IDE

Настройка Bascom-AVR IDE

В качестве программатора используется USBASP.

USBASP

USBASP

На прототипе MiniTini установлен разъем для программатора, что облегчает его подключение.

MiniTiny и USBASP

MiniTiny и USBASP

'Программа для счетчика наработки

$regfile = "attiny13.dat"
$hwstack = 16
$swstack = 16
$framesize = 16

$crystal = 9600000

Open "comb.3:9600,8,n,1" For Output As #1 'Порт для TX микроконтроллера
Open "comb.4:9600,8,n,1" For Input As #2  'Порт для RX микроконтроллера

Config Int0 = Falling
On int0 Zapis
Enable Interrupts
Enable Int0

Config Pinb.1 = Input : Ind_pitan Alias Pinb.1      'порт для индикатора внешнего питания
Config Portb.0 = Output : Led Alias Portb.0 : Led=0 'порт для светодиода


'Объявление переменных
Dim narabotka as long        'наработка
Dim E_Narabotka As Eram long 'наработка  EEPROM
Dim Cmd As String * 9        'для считывания приходящего в контроллер слова


Narabotka = E_narabotka      'первым делом считываем значение из EEPROM
    
Prover:
Do
    wait 1
    if Ind_pitan = 1 then incr Narabotka 'при веншнем питании инкрементируем одну наработку на секунду
    Input #2, Cmd
    If Cmd = "Наработка" Then Print #1, "Наработка=" ; Narabotka 'если поступает запрос микроконтроллеру "Наработка", он возвращает актуальное значение

    toggle led
Loop 

Zapis: ' по прерыванию (отсутствию внешнего питания) экстренно вносим данные в EPROM
E_Narabotka = Narabotka

Return

При включении устройства питание приходит на ATTiny13, программа запускается. Считываются данные из EEPROM. При самом первом включении там будут нули. Затем мы попадаем в основной цикл, где первым условием проверяется, откуда приходит питание на микроконтроллер. Если от батареи бытового устройства, то счётчик наработки инкрементируется. Вторым условием проверяется наличие запроса на считывание данных. Если устройство подключено к USB-TTL, и из терминала поступает команда «наработка», микроконтроллер возвратит значение «Наработка=хххххх». Значение даётся в секундах. Можно это всё обработать в удобоваримые часы и минуты силами микроконтроллера, но товарищ отказался, сказал что его устраивает.

Запрос и ответ в терминале Termite

Запрос и ответ в терминале Termite

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

MiniTiny и блютуз модуль HC-06

MiniTiny и блютуз модуль HC-06

Было ещё одно предложение: использовать блютуз модуль типа «HC-05 / 06». В этом случае считывание данных можно проводить без разбора устройства. Достаточно предварительно прописать в блютуз модуле понятное имя и при считывании просто подключиться к нему при помощи смартфона. Очень удобно использовать приложение Serial Bluetooth Terminal, имеющее большое количество всевозможных настроек. Но этот вариант в нашем случае оказался избыточным. Хотя, в каких-то случаях вполне может быть востребован.

© Habrahabr.ru