Если у компьютера нет не только монитора, но и даже видео-выхода, а показания датчиков хотелось бы видеть, то решением может быть отправлять данные в виде строки в COM-порт, который будет слушать микроконтроллер и отображать приходящую строку на своём дисплее. Под катом простейшая реализация этого на микроконтроллере ATtiny13 и 0,96'-экране SSD1306 с разрешением 128х32.




Основная идея заключается в том, чтобы программная часть, отвечающая за сбор информации, выполнялась на ПК, напр. в bat или sh-скрипте, и потом собранные данные выводились штатными средствами ОС, напр. на COM-экранчик, примерно вот так

Получить температуру процессора
Отправить данные в COM-порт
Подохдать 5с
Получить температуру диска
Отправить данные в COM-порт
Подохдать 5с
Получить системное время
Отправить данные в COM-порт
Подохдать 5с
Вернуться в начало


Для прошивки микроконтроллера я использую китайский клон Arduino Pro mini, USB-UART-конвертер на CP2102 и Arduino IDE 1.8.19 с установленным MicroCore. Как именно прошивать, можно узнать на ютубе поискав «как прошить attiny13», из публикации на Хабре или из справки ниже.
Прошивка ATtiny13 посредством Arduino вкратце
  1. Подключаем Arduino через USB-UART-конвертер.
  2. Качаем Arduino IDE. Я использовал 1.8.16, чтобы работать в Windows 7.
  3. Идем File > Examples > 11. ArduinoISP > ArduinoISP. В Tools > Board выбираем вашу плату (у меня это Arduino Pro or Pro Mini), в качестве программатора выбираем AVRISP-mkII и загружаем скетч ISP на Arduino.
  4. Далее устанавливаем между ногами RST и GND конденсатор на 10uF и провода от ножек 10, 11, 12 и 13. Должно получиться как то так.
  5. Далее надо установить MicroCore. Для этого открываем File > Preferences и для поля Additional Board Manager URLs указываем https://mcudude.github.io/MicroCore/package_MCUdude_MicroCore_index.json. Закрываем настройки кнопкой OK, открываем Tools > Boards Manager.... В поиске вбиваем MicroCore и устанавливаем его. Если все сделано правильно, то в Boards появится пункт MicroCore, содержащий ATtiny13.
  6. Необходимо выставить Clock 9.6MHz, Bootloader: No и программатор Arduino as ISP
  7. Всё готово. Можно заливать скетчи в ATtiny13.

Прошиваемый скетч — здесь.


Схема подключения экрана и микроконтроллера. Требуется питание 3.3В, напр. от оранжевого провода блока питания, т.к. дисплей не рассчитан на 5В.

Микроконтроллер нельзя подключить к COM-порту напрямую, поскольку порт использует -/+12В,
и потому нужен переходник


За основу взята часть схемы, отвечающая за чтение данных из порта, из статьи отсюда.
Результат на макетной плате


Зеленый и синий провода подключены к COM-порту к пинам TX и GND соответственно, а белый в 24-пиновый ATX разъем на материнской плате к 3.3В.
Если COM-порта на компьютере нет или хочется избежать пайки, то можно воспользоваться USB-UART-конвертером на 3.3В. В этом случае питание и PB1-порт микроконтроллера надо соединить с питанием и TX-портом конвертера. Рекомендую заранее убедиться, что для чипа конвертера в используемой ОС есть нужный драйвер.

После подключения микроконтроллера к компьютеру, необходимо выполнить настройку COM-порта, задав скорость 115200 и для Linux добавив разрешения на запись. Это можно сделать в командной строке/терминале
Для Windows
mode COM3 BAUD=115200 PARITY=n DATA=8
echo HELLO > COM3
Для Linux
sudo chmod o+rw /dev/ttyS0
sudo stty -F /dev/ttyS0 115200

echo "HELLO" > /dev/ttyS0


Используйте ttyUSB0 вместо ttyS0, если подключение выполнено USB-UART-конвертером.
Поскольку экран маленький и на него помещается только 5 полноценных символов, что обычно не требуется, если надо показать напр. температуру, то в прошивку была добавлена возможность динамически изменять используемый размер шрифта, путем модификатора @N, где N: 0 — полноразмерный шрифт 20х32, используемый по умолчанию, 1 — узкий шрифт 10х32, как на КДПВ, 2, 3 и 4 — мелкий шрифт 10x16 с выравниванием по верху, центру и низу соответственно. Для отключения экрана достаточно отправить пустое сообщение.


Пример отображения строки @3CPU @066@3C

Дисплей SDD1306 и микроконтроллер ATtiny13 были выбраны для проекта поскольку нашлись в запасах. Покупать ATtiny13 сейчас, чтобы повторить проект, в виду высоких текущих цен на AVR, — особого смысла нет. За чуть больший ценник можно взять уже ESP8266 с большими ресурсами, за счет которых удастся реализовать не только поддержку нижнего регистра букв, но и даже кириллицу с выводом на несколько экранов, которые также можно заменить на 2+ дюймовые TFT для лучшей читаемости. С другой стороны, число деталей получилось минимальным, что тоже неплохо.

Страница проекта — https://github.com/little-brother/attiny13-serial-display.

Комментарии (37)


  1. Soorin
    28.06.2024 07:32
    +4

    Кажется, изобретён мини-терминал...


  1. Zara6502
    28.06.2024 07:32

    году в 2002, так как я в этом вообще ничего не понимаю, обратился к паре знающих человек чтобы сделать из светодиодов (например советских АЛ) матрицу и выводить на неё информацию например с COM порта, на что они покрутили пальцем у виска, типа "зачем тебе это". Как показало время - крутили они правильно что у себя.


    1. CitizenOfDreams
      28.06.2024 07:32
      +3

      В 2002 году это делалось точно так же, как в этом проекте. Только вместо оледов были ЖК-экраны на HD44780, вместо ATtiny13 - ATtiny12, а вместо Ардвины - суровый атмеловский ассемблер.

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


      1. Zara6502
        28.06.2024 07:32

        ну сейчас я это уже знаю и сам, но тогда обращался к выпускниками новосибирского НЭТИ, которые электроникой занимались.


      1. vladkorotnev
        28.06.2024 07:32

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


      1. nextbystander
        28.06.2024 07:32
        +3

        Нужно отметить, что не смотря на популярность и десятилетия использования, такую схему стоит применять только для любительских конструкций. В ней переход база-эмиттер пробивается обратным напряжением при напряжении на базе ниже минус 6 вольт.

        В линии TX по стандарту RS-232 может быть +-25 вольт, хотя в PC было раньше не больше +-12 В, а сейчас чаще всего +- 6 В.

        Бывают конструкции, где транзистор в таком режиме используется как маломощный стабилитрон, но это не рекомендованный производителем режим работы.

        Для соответствия стандарту стоит добавить диод параллельно R2, анодом к земле.


  1. BReal
    28.06.2024 07:32
    +1

    я бы с удовольствием почитал такую же статью про ESP8266. а еще, про какое-нибудь прикручивание вебхука с отправкой инфы на дисплей...


  1. Mizar91
    28.06.2024 07:32

    Ну да, монитора нет, а COM-порт есть! Все так и будет!


    1. little-brother Автор
      28.06.2024 07:32
      +2

      А почему нет? NAS, сервера, базовые одноплатники как Orange Pi Zero и возможно некоторые Wi-Fi роутеры с OpenWRT. Сценарии не самые распространенные, но бывают. Себе я для NAS, построенном на mini-ITX плате, это сделал.


      1. Mizar91
        28.06.2024 07:32
        +1

        У всего этого есть USB, COM теперь днем с огнем не найти, логичнее было бы построить систему для USB


        1. little-brother Автор
          28.06.2024 07:32
          +2

          Лично я не знаю как отправить данные из консоли в USB без написания своего драйвера, что порождает написание кучи кода под разные ОС. Зачем усложнять задачу?

          Если COM нет, то его не проблема добавить через USB-UART. Кроме того, даже если на материнке нет COM-порта на задней панели, то это не значит что его вовсе нет - иногда на плате есть его 10-пиновая колодка.


        1. dlinyj
          28.06.2024 07:32
          +1

          А что мешает взять USB-COM шнурок, ещё и от него и питать?


      1. VT100
        28.06.2024 07:32

        КМК, COM- порт до сих пор есть на desktop ПК. Просто выводят его теперь не на панель, а на "гребёнку".


      1. aamonster
        28.06.2024 07:32

        Одноплатники и роутеры ладно (у них, опять же, порт будет на 3.3V, переходник не нужен – правда, велик шанс, что можно дисплей прямо на GPIO подключить, без вашей схемы), а на PC сейчас скорей будет только USB, так что ваш девайс имеет смысл сразу клепать на atmega32u4 или любом другом мк с поддержкой USB. Или вообще не париться и связать по bluetooth/wifi со смартфоном.


        1. little-brother Автор
          28.06.2024 07:32
          +1

          Идея не в том, чтобы как то отправить данные наружу, а так, чтобы это можно было сделать без дополнительного ПО на хосте (за исключением драйвера для USB-UART, если COM-порта нет). Нет никакой команды (во всяком случае я не знаю), чтобы отправить строку на конкретный USB-порт и он передался как строка. Аналогично с GPIO. А вот COM-порт именно для этого и разрабатывался и поэтому, получив значение той же температуры в shell-скрипте - в Windows через WMI, а в Linux через что угодно, надо просто его прокинуть дальше вызовом echo. То есть вся программная часть хоста - это скрипт, не требующий особых навыков программирования. В шутке " Кажется, изобретён мини-терминал... " только доля шутки :)

          Насчет того, что COM-портов - нет, как я уже писал ранее, это скорее заблуждение. Их нет только на самых бюджетных материнках, где в погоне за дешевизной выкинуто всё лишнее и оставлено два слота памяти (специально проверил у Gigabyte и MSI).


          1. aamonster
            28.06.2024 07:32
            +2

            Я вам специально назвал девайс, который не требует дополнительного ПО.

            Прямо в Arduino IDE есть скетч VCP (virtual com port) – т.е. получаем то же, что у вас сделано, только без лишних переходников.

            Для поиграться – можете купить себе Arduino Micro, это просто atmega32u4 с обвязкой. Ровно то, что надо для таких дисплейчиков, как у вас.


            1. little-brother Автор
              28.06.2024 07:32

              Да есть у меня и такая Arduino и Digispark на ATtiny85. Понятно, что можно сделать и на них, чтобы избежать использования USB-UART переходника, но в таком случае делать обычный вывод строки слишком просто - тогда надо и поддержку нескольких дисплеев, внешних термометров (в этом случае хост отправляет плейсхолдер) и еще чего-нибудь.

              P.S. Про Virtual com port не знал, да и как то не задумывался о таком ибо сразу ориентировался на физический порт. Спасибо за наводку.


              1. aamonster
                28.06.2024 07:32

                Да пожалуйста.

                Digispark прекрасен своим минимализмом, но чисто софтовая реализация USB, которая в нём применена, imho менее стабильна (если я правильно помню, там даже кварца нет?) и более геморройна, чем аппаратная в atmega32u4, так что micro imho оптимальный вариант, если не готовы переходить на более современные контроллеры (тот же blue pill на простом stm32 куда круче при той же цене, но порог вхождения выше).


                1. sansar
                  28.06.2024 07:32
                  +1

                  раз 20 пытался attiny в usb работать(естественно главная цель - чтоб от xp до ubuntu без танцев с дровами) и ниразу оно на 3х тачках не работало. mega32 решала проблему, но не вписывалась в бюджет. Последний раз bluepill тупо не лез по размеру и подвернулась ch5xx. так и работает hid клавой для ввода пар логин/пароль. последние 6 копий - микруха и 4 кнопки и type-c, даже на конденсаторы забил. кроссплатформенность - как хотел и даже nvr/dvr почти все принимают.


                  1. aamonster
                    28.06.2024 07:32

                    VUSB (или как там теперь – LUFA?) – это для смелых и сильных, кто умеет и любит такты считать. Кроме как для доказательства собственной крутизны не имеет смысла.


  1. sami777
    28.06.2024 07:32
    +2

    Подохдать 5с...

    Все-таки копипаст уничтожит этот мир!


  1. svosin
    28.06.2024 07:32
    +1

    Если есть свободный VGA-порт, то можно вообще пропустить пляски с микроконтроллером и приткнуться к i2c в нём, если ОС позволяет. Плюс i2c может быть доступен сам по себе, но это от системы зависит.


  1. chapt
    28.06.2024 07:32

    А почему вы pullup-ы на i2c шину не ставите?


    1. little-brother Автор
      28.06.2024 07:32

      У SSD1306 они уже есть.


      1. chapt
        28.06.2024 07:32

        https://www.olimex.com/Products/Modules/LCD/MOD-OLED-128x64/resources/SSD1306.pdf

        8.1.5 MCU I 2 C Interface
        The I 2 C communication interface consists of slave address bit SA0, I2 C-bus data signal SDA (SDA OUT/D2 for output and SDAIN/D1 for input) and I 2 C-bus clock signal SCL (D0 ). Both the data and clock signals must be connected to pull-up resistors.


        1. little-brother Автор
          28.06.2024 07:32

          Я документацию не смотрел, а просто поверил информации от разработчика библиотеки для ATttiny13. Проверять резона не было, т.к. вроде всё нормально и так работает.

          Насколько могу судить Olimex - это другой модуль на SSD1306, и ему да, нужна подтяжка.


  1. Jury_78
    28.06.2024 07:32

    Если у компьютера нет не только монитора, но и даже видео-выхода

    Может есть Wifi или по проводу связь и роутер, то проще организовать простой web сервер.


  1. dlinyj
    28.06.2024 07:32

    Прикольный проект, мне понравился. Программу на си называть сетчем такое себе. Вообще я бы makefile написал и собирал бы avr-gcc. Но тут дело ваше. Прикольно получилось


    1. dlinyj
      28.06.2024 07:32
      +1

      Из моих рекомендаций, сделать как в Дисплеях покупателя - управление ESC-последовательностями. Тогда можно прям из консоли пулять данные и они будут выводиться. Пример у меня в двух статьях:

      Создание собственных драйверов под Linux

      Wifi-радио с тёплым ламповым дисплеем. Часть 1. Дисплей




      1. TheyLive
        28.06.2024 07:32

        В вашем ролике видно, что экран мерцает. Существуют ли немерцающие "Дисплеи покупателя"?

        (Я думал, что все VFD не мерцают).


        1. VT100
          28.06.2024 07:32
          +1

          Дело в динамической индикации. IRL мерцание можно заметить только грызя сушки.


        1. dlinyj
          28.06.2024 07:32

          Дисплей не мерцает. Это динамическая индикация. В статье подробно разобрано почему она такая.


    1. little-brother Автор
      28.06.2024 07:32

      makefile и avr-gcc не использовал, т.к. сам любитель и переходить на Atmel Studio смысла пока не вижу. Если была бы нужда реализовать поддержку нескольких дисплеев на одном микроконтроллере, то да, пришлось бы перейти, т.к. с Arduino IDE уже уперся по памяти в потолок.

      ESC-последовательности, как мне кажется, для данного проекта избыточны, т.к. дисплей однострочный. Если бы требовалось выводить несколько строк и/или графику, то да, имело смысл. А так старался сделать палку-веревку: для переключения режима была выбрана собачка, т.к. проблем с её выводом в консоли - нет, в отличии от ^ или |.


      1. dlinyj
        28.06.2024 07:32

        Вы автор и сделали как вам было удобно. Извините, что я со своим уставом :)

        avr Studio Видел в последний раз ещё в институте в 2000-х. Не, я всё по классике, в консоли, как учили :))).


      1. aamonster
        28.06.2024 07:32
        +1

        Советую всё же перейти при случае, если не привязаны совсем жёстко к инфраструктуре ардуино :-)

        Arduino IDE – это боль. Что-то из начала 90-х, в ней много лет даже подсветки синтаксиса не было...


        1. dlinyj
          28.06.2024 07:32
          +1

          Тем более, что можно gcc ,с мейкфайлами прямо в среде найти.


  1. sansar
    28.06.2024 07:32
    +1

    ch522 лучше подходит. всё в один корпус влезает и не требует танцев с бубном с драйверами и настройкам и всё за шапку сухарей