1 заметка с тегом

rotary encoder

Модуль gpio-rotary encoder на armbian

Энкодер или датчик угла поворота — это электромеханическое устройство, предназначенное для преобразования углового положения вала или оси в электрические сигналы.

тестировал на Armbian_5.75_Orangepipc_Ubuntu_bionic_next_4.19.20

uname -a


Linux orangepipc 4.19.20-sunxi #5.75 SMP Sat Feb 9 19:02:47 CET 2019 armv7l armv7l armv7l GNU/Linux

обновим нашу систему и ставим headers

wget https://apt.armbian.com/pool/main/l/linux-4.20.7-sunxi/linux-dtb-dev-sunxi_5.75_armhf.deb

wget https://apt.armbian.com/pool/main/l/linux-4.20.7-sunxi/linux-headers-dev-sunxi_5.75_armhf.deb

wget https://apt.armbian.com/pool/main/l/linux-4.20.7-sunxi/linux-image-dev-sunxi_5.75_armhf.deb

dpkg -i *.deb
reboot
apt update &&  apt list --upgradable && apt upgrade -y
uname -a


Linux orangepipc 4.20.7-sunxi #5.75 SMP Fri Feb 8 09:02:10 CET 2019 armv7l armv7l armv7l GNU/Linux

в linux-headers-4.20.7-sunxi есть ошибка, для исправления надо создать пустой файл
source «net/wireguard/Kconfig» и запустить make scripts в папке /usr/src/linux-headers-4.20.7-sunxi

mkdir -p  /usr/src/linux-headers-4.20.7-sunxi/net/wireguard
touch /usr/src/linux-headers-4.20.7-sunxi/net/wireguard/Kconfig
cd /usr/src/linux-headers-4.20.7-sunxi
make scripts
cd

Использовал драйвер ядра gpio-keys (для кнопки энкодера) и драйвер ядра rotary-encoder,
по умолчанию в armbian, модуль rotary-encoder не установлен.
компилируем и ставим модуль rotary-encoder :

git clone https://github.com/ua3nbw-cf/rotary_encoder.git
cd rotary_encoder
make all install

компилируем и ставим оверлей gpio-rotary.dts:

armbian-add-overlay gpio-rotary.dts
reboot

в файле /boot/armbianEnv.txt появится строка: user_overlays=gpio-rotary
в папке /boot/overlay-user появится файл: gpio-rotary.dtbo
в файле /etc/udev/rules.d/90-devinput-rotary.rules строки:

SUBSYSTEM=="input", MODE="666"
SUBSYSTEMS=="input", ATTRS{name}=="rotary_axis", SYMLINK+="input/rotary_axis"
SUBSYSTEMS=="input", ATTRS{name}=="rotary_button", SYMLINK+="input/rotary_button"

проверка:

dmesg | grep rotary


root@orangepipc:~# dmesg | grep rotary
[ 9.346633] input: rotary_button as /devices/platform/rotary_button/input/input0
[ 9.356333] rotary_encoder: loading out-of-tree module taints kernel.
[ 9.357242] rotary-encoder rotary_axis: gray
[ 9.377227] input: rotary_axis as /devices/platform/rotary_axis/input/input2

cat /sys/kernel/debug/gpio | grep rotary


root@orangepipc:~# cat /sys/kernel/debug/gpio | grep rotary
gpio-200 ( |rotary_axis ) in  hi IRQ ACTIVE LOW
gpio-201 ( |rotary_axis ) in  hi IRQ ACTIVE LOW

ls -la /dev/input | grep rotary


root@orangepipc:~# ls -la /dev/input | grep rotary
lrwxrwxrwx 1 root root 6 Feb 17 15:58 rotary_axis -> event2
lrwxrwxrwx 1 root root 6 Feb 17 15:58 rotary_button -> event0

Тестируем.
энкодер подключаем к контактам 32 («PG8») и 36 («PG9») гребенки, общий вывод к 34 контакту.

evtest  /dev/input/rotary_axis

вращение енкодера по часовой стрелке и против часовой:
вывод команды evtest /dev/input/rotary_axis:

root@orangepipc:~# evtest  /dev/input/rotary_axis
Input driver version is 1.0.1
Input device ID: bus 0x19 vendor 0x0 product 0x0 version 0x0
Input device name: "rotary_axis"
Supported events:
  Event type 0 (EV_SYN)
  Event type 2 (EV_REL)
    Event code 1 (REL_Y)
Properties:
Testing ... (interrupt to exit)
Event: time 1550422364.373974, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1550422364.373974, -------------- SYN_REPORT ------------
Event: time 1550422364.488588, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1550422364.488588, -------------- SYN_REPORT ------------
Event: time 1550422364.651093, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1550422364.651093, -------------- SYN_REPORT ------------
Event: time 1550422365.439925, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1550422365.439925, -------------- SYN_REPORT ------------
Event: time 1550422365.656337, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1550422365.656337, -------------- SYN_REPORT ------------
Event: time 1550422365.727505, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1550422365.727505, -------------- SYN_REPORT ------------

кнопку энкодера подключаем к контактам 7 («PA6») гребенки, и к  9 контакту гребенки.

evtest  /dev/input/rotary_button

вывод команды при нажатии кнопки энкодера:

root@orangepipc:~# evtest  /dev/input/rotary_button
Input driver version is 1.0.1
Input device ID: bus 0x19 vendor 0x1 product 0x1 version 0x100
Input device name: "rotary_button"
Supported events:
  Event type 0 (EV_SYN)
  Event type 1 (EV_KEY)
    Event code 99 (KEY_SYSRQ)
Properties:
Testing ... (interrupt to exit)
Event: time 1550424346.724098, type 1 (EV_KEY), code 99 (KEY_SYSRQ), value 1
Event: time 1550424346.724098, -------------- SYN_REPORT ------------
Event: time 1550424346.912050, type 1 (EV_KEY), code 99 (KEY_SYSRQ), value 0
Event: time 1550424346.912050, -------------- SYN_REPORT ------------

Видим, что все события энкодера генерирует ядро.

 2401   10 мес   armbian   GPIO   rotary encoder