Автор Тема: Доступ к GPIO Raspberry Pi под обычным пользователем  (Прочитано 977 раз)

Оффлайн alex_beginner

  • Начинающий
  • *
  • Сообщений: 6
Вопрос такой: есть у меня одна простенькая поделка, которая работает под Raspberry Pi OS. Пытаюсь "пересесть" на Alt Linux. В процессе появился ряд вопросов, начну с самого простого.
Под Raspberry Pi OS доступ к GPIO делается под обычным пользователем. А в Alt Linux получается только либо с sudo, либо от имени пользователя Root и т.д. Подскажите, что и где настроить, чтобы доступ был и под обычным пользователем?  Или будет правильнее просто запускать службу, в виде которой эта поделка работает, от пользователя Root?  Как правильно поступить?

Оффлайн Антон Мидюков

  • alt linux team
  • ***
  • Сообщений: 5 183
  • antohami@
udev правило нужно, которое предоставит права на запись на устройство пользователям в определённой группе.

Оффлайн alex_beginner

  • Начинающий
  • *
  • Сообщений: 6
Куда копать, примерно понял, но что-то с наскока не получается. Загуглил про этот udev (поскольку в этом я пока нулевой), нашёл вот такой пример (правда, для Репки, ну вроде же должен подойти?): https://habr.com/ru/articles/757522/
Сделал, как они там пишут, группу, проверил - в списке появилась. Добавил туда своего пользователя, тоже нормально. Потом добавил вот этот /etc/udev/rules.d/99-gpio.rules, про который они там пишут. Перезапустил систему, но ничего не поменялось. С sudo работает, а без него нет.
Сам текст теста вот такой (C#):

using System;
using System.Device.Gpio;
using System.Threading;

int pin = 18;
using GpioController controller = new ();
controller.OpenPin(pin, PinMode.Output);
bool ledOn = true;
while (true)
{
    controller.Write(pin, ((ledOn) ? PinValue.High : PinValue.Low));
    Thread.Sleep(1000);
    ledOn = !ledOn;
    Console.WriteLine($"ledOn = {ledOn}");
}

Ошибку пишет вот такую:
Unhandled exception. System.IO.IOException: Error 13 initializing the Gpio driver.
   at System.Device.Gpio.Drivers.RaspberryPi3LinuxDriver.Initialize()
   at System.Device.Gpio.Drivers.RaspberryPi3LinuxDriver.OpenPin(Int32 pinNumber)
   at System.Device.Gpio.Drivers.RaspberryPi3Driver.OpenPin(Int32 pinNumber)
   at System.Device.Gpio.GpioController.OpenPinCore(Int32 pinNumber)
   at System.Device.Gpio.GpioController.OpenPin(Int32 pinNumber)
   at System.Device.Gpio.GpioController.OpenPin(Int32 pinNumber, PinMode mode)
   at Program.<Main>$(String[] args) in /home/alex/DotNetProgs/GpioTest/Program.cs:line 8
Аварийный останов

т.е. каких-то прав ему не хватает на эти "файлы"...

где что посмотреть?

Оффлайн Антон Мидюков

  • alt linux team
  • ***
  • Сообщений: 5 183
  • antohami@
Куда копать, примерно понял, но что-то с наскока не получается. Загуглил про этот udev (поскольку в этом я пока нулевой), нашёл вот такой пример (правда, для Репки, ну вроде же должен подойти?): https://habr.com/ru/articles/757522/

Посмотрите правило в Raspberry Pi OS

Оффлайн alex_beginner

  • Начинающий
  • *
  • Сообщений: 6
А ещё вопрос. Есть ли какой-нибудь аналог raspi-config?  Ну или как вручную сделать то, что делается, когда выбираешь "Enable automatic loading of SPI kernel module" и "Enable automatic loading of I2C kernel module"?  Я где-то нагуглил, что надо в файл config.txt прописать dtparam=i2c_arm=on и dtparam=spi=on. Нашёл в подкаталоге boot какой-то config.txt (но не в корне, в корне ничего такого нет), прописал туда это, не помогло.  Как правильно нужно сделать?

Оффлайн Антон Мидюков

  • alt linux team
  • ***
  • Сообщений: 5 183
  • antohami@
Нашёл в подкаталоге boot какой-то config.txt (но не в корне, в корне ничего такого нет), прописал туда это, не помогло.

/boot/efi/config.txt

Оффлайн Антон Мидюков

  • alt linux team
  • ***
  • Сообщений: 5 183
  • antohami@
Как правильно нужно сделать?

А какое ядро загружено?

Оффлайн alex_beginner

  • Начинающий
  • *
  • Сообщений: 6
uname -r показывает 5.10.81-rpi-def-alt1. Ну а так, ставил я его самым обычным образом, через Alt Media Writer, и ничего там самостоятельно не менял (поскольку ещё не умею :-) )

Оффлайн Антон Мидюков

  • alt linux team
  • ***
  • Сообщений: 5 183
  • antohami@
uname -r показывает 5.10.81-rpi-def-alt1. Ну а так, ставил я его самым обычным образом, через Alt Media Writer, и ничего там самостоятельно не менял (поскольку ещё не умею :-) )

Через /boot/efi/config.txt обычным для малины образом тогда.

Оффлайн alex_beginner

  • Начинающий
  • *
  • Сообщений: 6
Не помогает. Вот содержимое моего /boot/efi/config.txt:

arm_64bit=1
enable_uart=1
disable_overscan=1
dtparam=audio=on

# Добавил эти строчки
dtparam=i2c_arm=on
dtparam=spi=on

[pi3]
# kernel=uboot-rpi_3.bin
dtoverlay=vc4-fkms-v3d

[pi4]
# kernel=uboot-rpi_4.bin
dtoverlay=vc4-fkms-v3d

[all]
kernel=vmlinuz
initramfs initrd.img followkernel
cmdline=cmdline.txt

Вот программа пишет ошибку:

System.IO.IOException: Error 2. Can not open I2C device file '/dev/i2c-1'

А "глазами" файл /dev/i2c-1 тоже не виден, его просто нет...

Что такое этот "обычный способ", о котором вы говорите?  (для меня обычным было поставить 2 "галки" в raspi-config, после чего оно там работало)

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 251
  • Учиться .... Телепатами не рождаются, ими ....
    • Email
Настройте демнон  libsensors с помощью команды
# sensors-detect
и запустите его, может и поможет.

Оффлайн Антон Мидюков

  • alt linux team
  • ***
  • Сообщений: 5 183
  • antohami@
Что такое этот "обычный способ", о котором вы говорите?  (для меня обычным было поставить 2 "галки" в raspi-config, после чего оно там работало)

Используйте Raspbian.

Оффлайн alex_beginner

  • Начинающий
  • *
  • Сообщений: 6
и запустите его, может и поможет.

Похоже, что помогло, спасибо.

Используйте Raspbian.

Это да, но туда я вернуться всегда успею. Но, если всё получится сделать в Alt, то не вернусь, т.к. в общем и целом мне здесь нравится определённо больше, чем там. Надо только преодолеть кое-какие мелочи. Спасибо.