Gpio linux командная строка

Wiring Pi

GPIO Interface library for the Raspberry Pi

The GPIO utility

WiringPi comes with a separate program to help manage the on-board GPIO interface as well as additional modules such as the PiFace and other devices like the Gertboard as well as generic GPIO expander type devices.

This program, called gpio, can also be used in scripts to manipulate the GPIO pins – set outputs and read inputs. It’s even possible to write entire programs just using the gpio command in a shell-script, although it’s not terribly efficient doing it that way… Another way to call it is using the system() function in C/C++ or it’s equivalent in other programming languages.

  • The gpio command is designed to be installed as a setuid program and called by a normal user without using the sudo command or logging in as root.

In addition to using the gpio utility to control, read and write the GPIO pins, you can:

  • Export/Unexport pins via the /sys/class/gpio interface, where they will then be available to user programs (that then do not need to be run as root or with sudo)
  • Export pins to enable edge-triggered interrupts via the /sys/class/gpio interface.
  • Load SPI and I2C modules and set /dev/ permissions to enable read/write by the user running the gpio program.
  • Run the i2cdetect program with appropriate flags for your Raspberry Pi board revision.
  • Set the SPI buffer size and I2C baud rate (when loading the modules)
  • Determine your Raspberry Pi board hardware revision.

See the man page for the gpio program to see what all the features are by typing

at the command prompt.

Usage

From the Linux command line:

This prints the version.

The optional -g flag causes pin numbers to be interpreted as BCM_GPIO pin numbers rather than standard wiringPi pin numbers.

The optional -1 flag causes pin numbers to be interpreted as hardware pin numbers – this works for the P1 connector only.

The optional -p flag causes the gpio program to assume there is a PiFace board fitted to the Rasberry Pi and subsequent commands are interpreted as pins on the PiFace. Note: Pins on the PiFace are 200 through 207 for both reading and writing, with pins 208 through 215 reading the state of the output latch register (ie. you can read the state of the output pins)

The optional -x flag causes the gpio program to initialise an additional expansion module. Expansion modules are defined with their name (e.g. mcp23s17), and a set of parameters separated by colons. The first parameter is always the base pin number for this expansion module. See the documentation for each module type to determine the additional parameter values and functions.

Standard input and output commands

This sets the mode of a pin to be input, output, pwm or clock mode, and additionally can set the internal pull-up/down resistors to pull-up, pull-down or none.

    gpio write

This sets an output pin to high (1) or low (0)

Set the pin to a PWM value (0-1023 is supported)

    gpio read

Reads and prints the logic value of the given pin. It will print 0 (low) or 1 (high).

    gpio awrite

This performs an analog read from the given pin. The Pi has no on-board analog hardware so you need to specify an external module using the -x flag.

    gpio aread

This read the analog value on the given pin. The has no on-board analog hardware so you need to specify an external module using the -x flag.

This reads all the normally accessible pins and prints a table of their numbers (wiringPi, BCM_GPIO and physical pin numbers), so makes for a handy cross-reference chart), along with their modes and current values. This command will detect the version/model of your Pi and printout the pin diagram appropriate to your Pi.

  • gpio allreadall

This reads all the pins on your Raspberry Pi. It’s essentially the same format as used on the Compute Module.

This causes GPIO to perform a non-busy wait on a single GPIO pin until it changes state to that indicated.

Kernel module Load Commands

Note that these command will not work if you have enabled the device-tree interface. A warning will be printed if-so.

  • gpio load spi [buffer size in KB]

This loads the SPI kernel modules and optionally sets the internal buffer to the given size in KB (multiples of 1024). The default is 4KB and is usually more than enough for most application which only exchange a byte or 2 at a time over the SPI bus.

The /dev/spi* entries are set to be owned by the person using the gpio program, so there is no need to run subsequent programs as root (unless they use other wiringPi functions)

  • gpio load i2c [baud rate in Kb/sec]

This loads the I2C kernel modules and optionally sets the baud rate to the given speed in Kb/sec (multiples of 1000). The default is 100Kb/sec.

The /dev/I2c* entries are set to be owned by the person using the gpio program, so there is no need to run subsequent programs as root (unless they use other wiringPi functions)

I2C Detection

This runs the i2cdetect command, but passes in the correct parameters for the I2C bus for the Pi’s hardware revision. ie. it runs i2cdetect -y 0 on a Rev. 1 Pi, and i2cdetect -y 1 on a Rev. 2 Pi. (You can shorten i2cdetect to i2cd)

/sys/class/gpio mode commands

This exports the given pin (BCM-GPIO pin number) as an input or output and makes it available for a user program running as the same user to use.

    gpio unexport

Removes the export of the given pin.

  • gpio unexportall

Removes all /sys/class/gpio exports.

This prints a list of all gpio pins which have been exported via the /sys/class/gpio interface and their modes.

    gpio edge

This enables the given pin for edge interrupt triggering on the rising, falling or both edges. (Or none which disables it)

Note: The pin numbers in the sys mode are always BCM-GPIO pin numbers.

Examples

The above uses the wiringPi pin numbers to set pin 0 as an output and then sets the pin to a logic 1.

This uses the BCM_GPIO pin numbering scheme and performs the same operation as above.

This uses the physical P1 pin numbering scheme and performs the same operation as above.

Internal pull up/down resistors

The GPIO lines have internal pull up or pull-down resistors which can be controlled via software when a pin is in input mode. There is no-way to read the status of these resistors.

These set the resistors to pull-up, pull-down and none respectively on wiringPi pin 0.

Источник

Всего наилучшего — 73!

Блог программиста и радиолюбителя

Управление GPIO через командную строку Bash на Raspberry Pi — мигаем лампочкой Ильича

В этой статье я постараюсь осветить актуальную и интересную для многих тему, а именно использование GPIO интерфейса на базе Raspberry Pi B (ее описание тут). с помощью командной строки Bash. Очень удобная штука для создания умного дома и другой автоматики.

Видео версия статьи:

Сабж является самым простым способом управления интерфейсом GPIO, так как не требует никаких дополнительных настроек и работает сразу из коробки, при условии использования официальной сборки ОС Raspbian c сайта производителя. Основная фишка в том, что интерфейсом можно управлять на уровне операционной системы без дополнительных извращений.

На плате интерфейс выглядит так:

А вот распиновка:

Управление портами производится по номерами GPIO ножек: GPIO0, GPIO1, GPIO2 и т.д. (смотрите распиновку).

Основная особенность *nix систем — это то, что ВСЕ является файлами, и GPIO не не исключения.

Для инициализации порта необходимо ввести следующую команду (под рутом):

echo «4» > /sys/class/gpio/export // Эта команда инициализует GPIO4

Теперь задаем режим работы ножки (выход/вход):

echo «out» > /sys/class/gpio/gpio4/direction // out — пин работает как выход, in — работает как вход

Теперь мы может управлять ногой из консоли:

echo «1» > /sys/class/gpio/gpio4/value // 1 — выставляем высокий уровень, 0 — низкий

А вот так мы можем сделать пин входом:

echo «in» > /sys/class/gpio/gpio4/direction
cat /sys/class/gpio/gpio4/value

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

Вот пример подключения к Raspberry Pi лампочки Ильича через реле:

Реле использовал обычное ардуиновское, малиновые логическое уровни оно без проблем скушало. Реле можно купить там.

Доступ к портам из командной строки дает очень широкие возможности в плане автоматизации. Так же интерфейсом можно управлять из таких языков программирования как С, С++, питон и многие другие. Если вы хотите увидеть еще статьи по данной теме, то пишите в комментариях.

Источник

Работа с GPIO

ВНИМАНИЕ: статья рассчитана на разработчиков или опытных пользователей и даёт общие рекомендации того, как использовать gpio в обход официального ПО WirenBoard.

Если вам нужно работать напрямую с gpio, то мы рекомендуем делать это через драйвер wb-mqtt-gpio.

Описание доступных ножек gpio для конкретной ревизии контроллера можете посмотреть в статье GPIO.

Содержание

Меры предосторожности

  • Убедитесь, что вашу задачу нельзя решить стандартными средствами программного обеспечения Wiren Board.
  • Все порты Wiren Board, в том числе и GPIO, работают с напряжением 3.3V.
  • Подключение сигнала с напряжением большим 3.3V к ножке GPIO грозит выходом из строя процессорного модуля.

В случае необходимости подключения устройств, работающих с более высоким напряжением, необходимо использовать схемы согласования или подключать (для 5V) через резистор в 20 кОм и более.

Именование gpio

К сожалению, четкого стандарта по именованию gpio не существует, но при работе с контроллерами WirenBoard стоит придерживаться следующих правил:

  • выводы gpio сгруппированы по банкам (banks; эквивалентно gpiochips)
  • каждый банк содержит 32 gpio. Нумерация банков начинается с 0.

Вычисление номера gpio

Для управления ножкой gpio нужно знать её номер. В рассматриваемых примерах будем работать с gpio A1_IN контроллера WB6.7 (номер: 109; gpiochip 3, offset 13): Вычислим банк gpio и offset, зная номер (109):

То же самое справедливо и наоборот. Зная банк и offset (3 и 13, соответственно), можно вычислить номер gpio:

Работа из userspace

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

В выводе команды видим примерно следующее:

Это значит, что gpio 0, 26 и 27 уже экспортированы в sysfs и доступны для управления. Gpio 11 и 13 заняты ядерным драйвером onewire и недоступны для использования. Остальные gpio банка 0 — свободны.

Если нужный gpio — занят, то можно остановить драйвер:

ВНИМАНИЕ: остановка драйверов может привести к неожиданному поведению контроллера. Теперь нужный gpio свободен до следующей перезагрузки.

В настоящий момент, для работы с gpio в userspace доступны 2 интерфейса: sysfs и chardev (начиная с версии ядра 4.8).

Различия между chardev и sysfs хорошо описаны в этой статье. Sysfs имеет статус deprecated, поэтому, по возможности, стоит работать через chardev.

Интерфейс sysfs

Для работы через sysfs c определённым GPIO его надо экспортировать:

Здесь и далее N — номер gpio

Экспортированные gpio появляются в каталоге /sys/class/gpio :

В директории /sys/class/gpioN теперь находятся файлы для работы с GPIO (где N — номер GPIO, как и было сказано ранее):

Установка направления GPIO (ввод/вывод) производится с помощью записи в файл direction

Чтение и установка значения GPIO производится с помощью файла value .

Чтение и запись

  1. Находим номер GPIO, соответсвующий вашей версии контролера нужному клеммнику в таблице WB2.8. Для клеммника номер 2 в версии 2.8 это GPIO 32.
  2. Экспортируем GPIO в sysfs

Работа с прерываниями

Через интерфейс sysfs можно запросить прерывания по изменению состояния процессора.

Установка прерывания производится путём записи значения в файл «edge». Значения могут быть:

  • none — отключить прерывание
  • rising — включить прерывание по нисходящему фронту
  • falling — включить прерывание по восодящему фронту
  • both — включить прерывание по обеим фронтам.

Пример работы с прерываниями:

Прерывания можно ловить из userspace с помощью системного вызова epoll() и select() на файл value. Пример работы см. [1]

Работа через chardev

Представленный в ядре 4.8 интерфейс chardev имеет C/Python библиотеку libgpiod и userspace-утилиты для работы с gpio. Исходный код библиотеки и документация доступны в репозитории libgpiod.

Утилиты распространяются в составе debian-пакетов gpiod и libgpiod-dev для debian buster и новее. К сожалению, для stretch пакетов в официальных репозиториях нет.

Если нужно установить libgpiod в debian stretch, можно воспользоваться сторонними репозиториями (например, этим). Используйте сторонние репозитории на свой страх и риск; компания WirenBoard не контролирует их содержимое.

Для работы с gpio из bash в пакете gpiod поставляются следующие утилиты:

  • gpiodetect — информация обо всех банках gpio в системе
  • gpioinfo — подробная информация обо всех линиях gpio определённого банка
  • gpioget — возвращает значение определённого gpio
  • gpioset = = — устанавиливает состояние на определенные линии gpio
  • gpiofind — возвращает номер gpio
  • gpiomon — отслеживание событий gpio

Примеры использования gpiod можно посмотреть в [2] и [3]

Python

Для управления gpio из python был написан модуль

Модуль представляет собой обёртку вокруг sysfs. Исходный код доступен на нашем github.

Модуль позволяет работать с gpio в синхронном и асинхронном (с регистрацией коллбэков) режимах.

Прямое обращение через память процессора

Этот метод настоятельно НЕ РЕКОМЕНДУЕТСЯ для использования без достаточных оснований. Для работы из С/C++ стоит использовать работу через файлы в sysfs или chardev, как описано в предыдущих разделах.

Управлять GPIO можно с помощью прямого доступа к регистрам процессора, в обход Linux, через интерфейс /dev/mem. При этом, по сравнению с работой через sysfs минимизируются накладные расходы. Этот метод можно использовать, если вам необходим очень быстрый доступ к GPIO, например bitbang протоколов или ШИМ. Стоит иметь в виду, что планировщик процессов всё ещё может вносить в работу программы значительные задержки. Рекомендуется выносить критичные ко времени задачи в ядро.

Работа в ядре Linux

Ознакомиться с ядром Linux, использующимся в контроллерах WirenBoard можно в нашем репозитории ядра.

Рекомендации по Device Tree

Device-tree, использующиеся на контроллерах WirenBoard, доступны в репозитории ядра. Разные аппаратные ревизии контроллера используют разные dts (например, dts для WB6.X можно найти здесь)

Указывать GPIO в Device Tree необходимо для настройки работы GPIO в режиме программного SPI, I2C, для использования GPIO в качестве источника прерываний и т.д. Так, например, на пин 10@UEXT1 (CS) и пины 5@UEXT2 (SCL), 6@UEXT2 (SDA), 10@UEXT2 (CS) выведены линии GPIO процессора. Их можно сконфигурировать для использования, например, в качестве chip-select для SPI или в качестве I2C.

GPIO процессора и периферийных устройств разбиты на банки (gpiochip). GPIO процессора разбиты на 3 банка по 32 GPIO: gpio0, gpio1, gpio2. Адресация GPIO в Device Tree происходит по номеру банка и номеру GPIO *внутри* банка.

Пример device-tree node

Определим сигнал 6@UEXT2 (SDA) в качестве источника прерываний для драйвера mrf24j40. Согласно таблице Список GPIO, сигнал соответствует GPIO 53 процессора. 53 принадлежит второму банку gpio (от 32 до 63). Номер GPIO внутри банка 53-32=21 :

Источник

Читайте также:  Производительность windows или linux mint
Оцените статью