# Работа с GPIO
GPIO (General-Purpose Input/Output) – это тип пинов на Raspberry Pi, напряжение на которых можно программно подавать и измерять. Также на некоторых пинах реализован аппаратный ШИМ (PWM). Интерфейс GPIO может быть использован для управления различной периферией: светодиодами, электромагнитами, электромоторами, сервоприводами и т. д.
> **Info** Используйте [распиновку](https://pinout.xyz), чтобы понять, какие из пинов на Raspberry Pi поддерживают GPIO и ШИМ.
> **Info** Для того, чтобы не создавалось конфликтов при использовании портов *GPIO* в образе закрыт доступ для портов 0, 1, 2, 3, 14, 15, на которые выведены интерфейсы подключения I2C и UART.
Для работы с GPIO на [образе для RPi](image.md) предустановлена библиотека [`pigpio`](http://abyz.me.uk/rpi/pigpio/). Чтобы взаимодействовать с этой библиотекой, запустите соответствующий демон:
```bash
sudo systemctl start pigpiod.service
```
Для включение автозапуска демона `pigpiod` используйте команду:
```bash
sudo systemctl enable pigpiod.service
```
> **Warning** При одновременном использовании `pigpiod` и [LED-ленты](leds.md) возможны конфликты. Для подключения ленты используйте пин GPIO21. На версиях [образа](image.md) ниже 0.17 измените в файле `/lib/systemd/system/pigpiod.service` строку запуска сервиса на `ExecStart=/usr/bin/pigpiod -l -t 0 -x 0x0FFF3FF0`.
Пример работы с библиотекой:
```python
import time
import pigpio
# инициализируем подключение к pigpiod
pi = pigpio.pi()
# устанавливаем режим 11 пина на вывод
pi.set_mode(11, pigpio.OUTPUT)
# включаем сигнал на 11 пине
pi.write(11, 1)
time.sleep(2)
# отключаем сигнал на 11 пине
pi.write(11, 0)
# ...
# устанавливаем режим 12 пина на ввод
pi.set_mode(12, pigpio.INPUT)
# считываем состояние 12 пина
level = pi.read(12)
```
Для определения номера пина используйте [распиновку Raspberry Pi](https://pinout.xyz).
## Подключение сервоприводов
Большинство сервоприводов управляются с помощью ШИМ-сигнала, причем крайним положениям привода соответствуют сигналы шириной приблизительно 1000 и 2000 мкс. Значения для конкретного сервопривода могут быть определены экспериментально.
Подключите сигнальный провод сервопривода к одному из GPIO-пинов Raspberry. Для управления сервоприводом, подключенного к 13 пину, используйте такой код:
```python
import time
import pigpio
pi = pigpio.pi()
# устанавливаем режим 13 пина на вывод
pi.set_mode(13, pigpio.OUTPUT)
# устанавливаем на 13 пине ШИМ сигнал в 1000 мкс
pi.set_servo_pulsewidth(13, 1000)
time.sleep(2)
# устанавливаем на 13 пине ШИМ сигнал в 2000 мкс
pi.set_servo_pulsewidth(13, 2000)
```
## Подключение электромагнита

Для подключения электромагнита используйте полевой транзистор (MOSFET). Подключите транзистор к одному из GPIO-пинов Raspberry Pi. Для управления магнитом, подключенным к 18 пину, используйте такой код:
```python
import time
import pigpio
pi = pigpio.pi()
# устанавливаем режим 18 пина на вывод
pi.set_mode(18, pigpio.OUTPUT)
# включаем электромагнит
pi.write(18, 1)
time.sleep(2)
# отключаем электромагнит
pi.write(18, 0)
```