Мини-компьютеры/периферия/GPIO: различия между версиями

Материал из ALT Linux Wiki
Нет описания правки
 
(не показаны 3 промежуточные версии этого же участника)
Строка 105: Строка 105:
Модуль можно спаять и самостоятельно, для винтажности взяв отсек для батарейки и часовой кварц
Модуль можно спаять и самостоятельно, для винтажности взяв отсек для батарейки и часовой кварц
со старой нерабочей материнки (кварцы там обычно ставили точнее, чем ширпотреб на готовых модулях).
со старой нерабочей материнки (кварцы там обычно ставили точнее, чем ширпотреб на готовых модулях).
Если нужно качество и точность, я бы рекомендовал модуль на микросхеме DS3231.
Если нужно качество и точность, я бы рекомендовал модули на микросхеме DS3231
[https://www.sigmdel.ca/michel/ha/rpi/rtc_eeprom_module_en.html обзор и подключение к Raspberry Pi].
Большой модуль ZS-042 DS3231 RTC можно [https://www.sigmdel.ca/michel/ha/rpi/rtc_eeprom_module_02_en.html#battery доработать ],
сбив паяльником резистор цепи подзарядки аккумулятора (не страшно при питании от 3.3V, при подключении к Arduino 5V со временем выводит из строя батарейку).
 
В общем случае, при выборе модуля для одноплатного компьютера желательно, чтобы  
В общем случае, при выборе модуля для одноплатного компьютера желательно, чтобы  
* модуль мог работать от питания 3.3V (выводы GPIO одноплатников, того же Raspberry Pi, не толерантны к 5V). Это микросхемы DS3231, DS1302, pcf8563, ...
* модуль мог работать от питания 3.3V (выводы GPIO одноплатников, того же Raspberry Pi, не толерантны к 5V). Это микросхемы DS3231, DS1302, pcf8563, ...
* на модуле либо не было подтягивающих резисторов к линиям SDA/SCL, либо их можно было легко отключить джамперами.
* на модуле либо не было подтягивающих резисторов к линиям SDA/SCL, либо их можно было легко отключить джамперами.
Обычно в одноплатнике на линии i2c уже есть подтягивающие резисторы к 3.3V,
Обычно в одноплатнике на линии i2c уже есть подтягивающие резисторы к 3.3V,

Текущая версия от 03:32, 11 ноября 2020

Stub.png
Данная страница находится в разработке.
Эта страница ещё не закончена. Информация, представленная здесь, может оказаться неполной или неверной.


Настройка систем ALT Linux для поддержки периферии к одноплатным и другим мини-компьютерам, которая подключается/подпаивается к разъемам/контактам на плате.


Gnome-dialog-warning.svg Внимание:

Страница предназначена для обсуждения настройки систем ALT Linux. Пожалуйста, не указывайте здесь 1) несистемную периферию (датчики и т.д.), работа с которой идет от пользователя и не требует настройки системы. 2) схематику подключения для конкретных плат.

переходник USB to Serial

UART TTL perehodnik.jpg

Позволяет работать с платой без ее подключения к монитору, что особенно удобно при включении / загрузке (пока нет сети) и в случае проблем. Подробнее см. [1]

Советы начинающему пользователю по выбору железа

Поддержка такого железа полная, подойдет практически любой переходник usb2serial (может при продаже называться по разному: USB to UART/TTL/Serial). поэтому не имеет смысла тратить на них больше 0.5-1$.

пробное подключение

Контакты на плате переходника обычно подписаны. Нам нужно только 3 контакта: TX, RX, GND (-, земля). подключаем GND к GND одноплатника, а линии данных перекрещиваем:

TX к RX,
RX к TX.

Контакты переходника 5V, 3.3V ни в коем случае не подключаем! Они используются для запитывания подключаемой платы, если у той нет своего питания. Но в нашем случае одноплатник уже со своим блоком питания 10-15W, при соединении питаний легко можно сжечь USB порт, куда втыкаем переходник!

Gnome-dialog-warning.svg
Внимание: контакты переходника 5V, 3.3V не подключаем!

На одноплатнике устройство tty на GPIO может называться, к примеру, /dev/ttyS0 /dev/ttyAMA0

Втыкаем переходник в большой компьютер. Должно появиться устройство tty, к примеру, /dev/ttyUSB0.

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

baudrate 115200.
databits 8
flow control none.

обмениваемся данными.

Замечание.
старые древние программы вроде minicom имеют исторически сложившиеся настройки по умолчанию вроде baudrate 9600. Это имело смысл для RS-232 COM соединений длинными кабелями, чтобы бороться с наводками и помехами, кроме того, 50 лет назад и типичная частота работы процессора была не та, что сегодня. При подключении через GPIO гребенку собственно протокол UART используется только до микросхемы usb2serial, т. е., практически, 10-20 см. соединительных проводов, далее данные идут по USB. Поэтому любой, самый дешевый переходник справляется со скоростью 115200 бод. а большинство поддерживают скорости до 0,5-1 Mbod. При этом для комфортной работы с ncurses-приложениями (mc) желательна скорость не менее 115200 бод.

Поэтому я лично использую tio, так как у него удобное умолчание baudrate 115200/ databits 8/ flow control none, что упрощает запуск - сразу пишу без опций

$ tio /dev/ttyUSB0

Настройка системы

Основная страница: SerialLogin.

Часы реального времени.

Pcf8563-rtc.jpg

Много одноплатных компьютеров не имеет встроенных часов (rtc clock). Но можно подключить готовый модуль с отсеком для батарейки и микросхемой rtc clock, как правило, подключаемой по шине I2C.


Советы начинающему пользователю по выбору rtc clock

В продаже есть множество готовых модулей rtc clock для Arduino, Raspberry Pi и т.д. от 50р и выше. Модуль можно спаять и самостоятельно, для винтажности взяв отсек для батарейки и часовой кварц со старой нерабочей материнки (кварцы там обычно ставили точнее, чем ширпотреб на готовых модулях). Если нужно качество и точность, я бы рекомендовал модули на микросхеме DS3231 обзор и подключение к Raspberry Pi. Большой модуль ZS-042 DS3231 RTC можно доработать , сбив паяльником резистор цепи подзарядки аккумулятора (не страшно при питании от 3.3V, при подключении к Arduino 5V со временем выводит из строя батарейку).

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

  • модуль мог работать от питания 3.3V (выводы GPIO одноплатников, того же Raspberry Pi, не толерантны к 5V). Это микросхемы DS3231, DS1302, pcf8563, ...
  • на модуле либо не было подтягивающих резисторов к линиям SDA/SCL, либо их можно было легко отключить джамперами.

Обычно в одноплатнике на линии i2c уже есть подтягивающие резисторы к 3.3V, поэтому в модуле часов подтягивающие резисторы не нужны.

Gnome-dialog-warning.svg
Внимание: при подключении 5V модуля rtc clock для Arduino отключите подтягивающие резисторы с SDA/SCL на 5V!

Нужно быть осторожными с готовыми модулями для Arduino на микросхеме DS1307. Они могут соблазнять дешевизной и изобилием предложений. Сама по себе микросхема DS1307 питается от 5 вольт, но общается с одноплатником по шине I2C сигналами с уровнем 30%VDD (Low) и 70%VDD (High), т.е. не больше 3.5V. (В общем случае 5 вольтовые микросхемы c i2c могут требовать и 80%VDD (High), т.е. 4V., т.е. не работать при прямом подключении, только через logic level converter [2]). Таким образом, ее можно безболезненно подключать к выводам, не толерантным к 5V. Но! на плате модуля для Arduino могут быть распаяны подтягивающие резисторы (4K7) к 5V. Через них 5V придет на входы SoC одноплатника. Обычно это не смертельно. Резисторы 4K7 ограничивают ток до 10мА, плюс в SoC на входах может быть встроенная защита от перенапряжения. Но это нештатный режим, ведущий со временем к деградации чипа. [3] Это как в дешевых светодиодных лампочках недобросовестные производители делают из 7W 10W, повышая напряжение на светодиодах, что резко сокращает срок их службы. Поэтому для постоянного подключения к одноплатнику такой модуль нужно доработать, выпаяв из него подтягивающие резисторы.

Пример доработки модуля TinyRTC для Arduino: TinyRTCArduinoShield.jpg


Статус поддержки i2c rtc clock

В ядре поддерживаются практически все популярные микросхемы i2c rtc clock. Однако их настройка требует некоторых телодвижений.

тестовое подключение i2c rtc clock

К примеру, рассмотрим пробное подключение модуля с микросхемой часов pcf8563 к шине i2c №1 (/dev/i2c-1).

# i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- 51 -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --

Видим, что устройство доступно на шине №1 (опция -y 1) с адресом 0x51. Выполняем команду

# echo pcf8563 0x51 > /sys/class/i2c-adapter/i2c-1/new_device

после чего появится устройство /dev/rtc0.

  1. dmesg | grep rtc
[   18.259456] rtc-pcf8563 1-0051: registered as rtc0
# i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --

теперь i2cdetect по адресу 0x51 показывет UU, что означает, что данное устройство открыто ядром и недоступно пользователю.

Для практически любого модуля часов указания по тестовому подключению можно легко найти в интернет.

Настройка системы для i2c rtc clock

Тонкость настройки системы для i2c rtc clock в том, чтобы при загрузке подключить часы и выставить время как можно раньше, чтобы получить правильное время в логах и отсутствие странного в /etc/adjtime.

В идеале, ядро должно увидеть часы прямо при старте ядра. Этот идеал достижим с помощью механизма Device Tree и Device Tree Overlay.

В отсутствие BIOS/UEFI механизм Device_Tree позволяет использовать одно и то же универсальное ядро, подгружая ему загрузчиком файл .dtb (Device Tree Binary) с описанием устройств конкретной платы. Более того, в Device_Tree есть возможность менять конфигурацию платы с помощью механизма Device Tree Overlay. Варианты конфигурации можно скомпилировать в файлы .dtbo и загрузчик u-boot при загрузке объединит файл .dtb с файлами .dtbo и получит текущую конфигурацию платы, которую передаст ядру. Device Tree можно условно сравнить с BIOS, а Overlays - с меню настроек BIOS.

В Raspbian имеется огромный набор оверлеев под различную GPIO периферию. для указанного выше модуля rtc в Raspbian достаточно добавить в /boot/config.txt

dtoverlay=i2c-rtc,pcf8563

и система загрузится как на машине со встроенными часами. кроме как в загрузчик, собственно в систему никаких настроек вносить не надо. К сожалению, это все богатство пока не входит в vanilla kernel, и сам механизм Device_Tree еще в разработке[4].

Таким образом, в ALT файл оверлея придется откуда-то взять, адаптировать при необходимости, оттранслировать в .dtbo. Далее, в ALT конфигурации загрузчика не предусмотрена поддержка оверлеев, надо смотреть, как сделано, например, в armbian[5].

Поэтому сейчас в ALT, к сожалению, проще править настройки. достаточно написать обработчики событий появления устройств i2c и rtc. казалось бы, для модуля из примера выше достаточно

KERNEL=="i2c-1", SUBSYSTEM=="i2c-dev", ACTION=="add", RUN+="/bin/sh -c 'echo pcf8563 0x51 > /sys/class/i2c-adapter/i2c-1/new_device'"
KERNEL=="rtc0", SUBSYSTEM=="rtc", ACTION=="add", RUN+="/sbin/hwclock -s --utc -f /dev/rtc0"

но udev запускает скрипты без CAP_SYS_TIME, пришлось hwclock выносить в systemd service:

$ cat /etc/udev/rules.d/10-i2c-rtc.rules
KERNEL=="i2c-1", SUBSYSTEM=="i2c-dev", ACTION=="add", RUN+="/bin/sh -c 'echo pcf8563 0x51 > /sys/class/i2c-adapter/i2c-1/new_device'"
KERNEL=="rtc0", SUBSYSTEM=="rtc", SUBSYSTEMS=="i2c", TAG+="systemd", ENV{SYSTEMD_WANTS}="i2c-rtc-hwclock.service"
$ cat /etc/systemd/system/i2c-rtc-hwclock.service
[Install]
RequiresMountsFor=/usr/share/zoneinfo

[Unit]
Description=Set system time from i2c hardware real time clock
CapabilityBoundingSet=CAP_SYS_TIME
Before=time-set.target getty.target chrony.service ntpd.service systemd-timedated.service
WantedBy=time-set.target getty.target chrony.service ntpd.service systemd-timedated.service

[Service]
Type=oneshot
ExecStart=/sbin/hwclock -s --utc

С такими настройками время выставляется на раннем этапе загрузки.

модуль дисплея (TFT/IPS LCD, опционально с тачскрином)

Представляет собой плату, на которой распаян TFT/IPS экран, опционально с тачскрином (тогда на плате также распаян контроллер тачскрина) и, возможно, другой периферией: кнопками, слотом для SD карты и т.д. Для подключения к микроконтроллеру на плате есть одинарная/двойная гребенка (PLS/PLD) либо PBD (для подключения к гребенке). Популярные разьемы подключения рассчитаны на Arduino Uno, Arduino Mega, Raspberry Pi, отладочные платы для микроконтроллеров STM32.

Естественно, если одноплатник с GPIO гребенкой формата Raspberry PI: raspberry pi, banana pi, orange pi,... то готовые модули для Raspberry Pi предпочтительнее. Это модули от Waveshare и их многочисленные китайские клоны.

TFT экран, подключаемый к GPIO, не является альтернативой нормальному монитору, подключаемому через HDMI. Как монитор, он имеет такие недостатки, как

  • (обычно) низкое разрешение (320x240, 480x320)
  • в отсутствие eeprom цветовой профиль взять негде,

поэтому скорее всего по умолчанию будут искаженные цвета, и гамма-коррекцию нужно будет подбирать вручную;

  • (обычно) невысокий fps.
  • (обычно) драйвер фреймбуфера более кривой и глючный, чем для VideoCore.

Это нишевое решение для панели отображения состояния/управления. Достоинства:

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

не нужно явно программировать вывод состояния на экран. драйвер ядра дает фреймбуфер /dev/fb1, на нем запускаются обычный X (или Wayland), с драйвером fbturbo, под которыми запускается обычное linux приложение.

Также есть модули для Raspberry Pi, которые подключают экран через HDMI, а через GPIO разьем получают питание и подключают по шине SPI ресзистивный тачскрин.

Еще более дорогие модули GPIO разьем не используют: подключают экран через HDMI и имеют емкостный тачскрин с мультитач, который подключают под USB, здесь не рассматриваются, так как это уже не GPIO.

Советы начинающему пользователю по выбору железа

Готовый модуль с в виде платы с прикрепленным экраном и разведенной гребенкой контактов.

Если одноплатник с GPIO гребенкой формата Raspberry PI: raspberry pi, banana pi, orange pi,...

  • интерфейс подключения - SPI.

дешевое решение:

  • если рабочий стол на экран не нужен, достаточно выводить окошко со статусом (темрературой, загрузкой, ...) то модуль низкого разрешения без тачскрина (1.8' ' 240X160 - $3).
  • если это панель управления, то нужны размеры от 2.4' ', разрешение от 320X240, и тачскрин.
  • если нужна возможность открыть рабочий стол, то нужны размеры от 2.8' ' и разрешение от 320X240. Готовое решение - 10$ c явной поддержкой Raspberry Pi (продавец предоставляет настройки для fbtft, либо клон waveshare модуля)

Модули с подключением по hdmi на порядок дороже. Их не стоит покупать, если вы не планируете использовать одноплатник как планшет-кирпич. За половину их цены можно купить качественный PVA монитор б/у и переходник HDMI->DVI, либо, альтернативно, если под рукой есть нерабочий ноутбук или монитор с целой матрицей, ее можно демонтировать и подключить отдельно к одноплатнику через подходящий универсальный HDMI-> LVDS конвертер (12-25$) (кроме матриц от старых телефонов и большинства планшетов - там обычно портретное разрешение).

Статус поддержки

экран

Поддержка оборудования. Драйвер fbtft входит в ядро еще с версии 3.35. При правильной настройке позволяет подключать достаточно большое число tft панелей с Display Bus Interface (DBI), подключаемый по интерфейсам

  • SPI (четыре управляющих сигнала)
  • Motorola 6800 (четыре управляющих сигнала и параллельная шина данных шириной 8/16 бит)
  • Intel 8080 (четыре управляющих сигнала и параллельная шина данных шириной 8/16 бит)

контроллер tft панели может поддерживать несколько интерфейсов, но на плате tft модуля будет выведен обычно только 1 из них.

На платах форм-фактора RaspberryPi для последних двух интерфейсов не получится задействовать DMA (требуется 2 полных 8-битных порта ввода-вывода, разведенных на разъемы). Плату tft модуля с параллельной шиной данных придется подключать в режиме GPIO (bitbang, программно выставлять биты на каждый пин gpio по отдельности, что не добавляет скорости работы). соответствие пинов и битов задается опцией fbtft, к примеру

gpios=reset:17,dc:2,wr:3,cs:27,db00:21,db01:20,db02:16,db03:12,db04:1,db05:7,db06:8,db07:25,db08:26,db09:19,db10:13,db11:6,db12:5,db13:0,db14:11,db15:9

Поэтому для форм-фактора RaspberryPi оптимальным является подключение по шине SPI (для небольших разрешений, 320x240 и меньше). Большие разрешения упираются в пропускную способность SPI (на 480x320 на стандартной частоте работы SPI было 4fps, разгон SPI дал 7+fps).

тачскрин

резистивный тачскрин (касание стилусом) на контроллере xpt2046/ads7846 с подключением по шине SPI поддерживается модулем ядра ads7846

подробнее о поддержке см. https://github.com/notro/fbtft/wiki/Touchpanel

тестовое подключение модуля дисплея

экран

Для тестирования

modprobe fbtft <options>

создаст устройство /dev/fb1.

... продолжение следует ...

Для настройки в ALT прописываем опции fbtft в /etc/modprobe.d/

тачскрин

...

1-wire

/etc/modules

w1-gpio gpiopin=27