Что касается непосредственно самой платы Raspberry Pi, то можно сказать, что она готова работать с физическим программированием электронных компонентов через свои контакты GPIO (ввод/вывод общего назначения).
Эти контакты ввода/вывода общего назначения — одни из тех, которые можно увидеть на плате, находящихся в двух рядах по 20 контактов.
Серия статей «Основы Raspberry Pi»
- Введение в Raspberry Pi
- Установка системы на Raspberry Pi
- Программирование на scratch и python
- Командная консоль и основы Linux
- Контакты GPIO и их программирование
- Создание нового пользователя
- Конфигурация статического IP
- Удаленное подключение к Raspberry Pi
- Установка ОС Raspberry Pi Lite и связь через UART
- Использование камеры на Raspberry Pi
- ШИМ-сигнал в Python
На следующем изображении вы можете более четко увидеть, чему соответствует каждый вывод:
Любой из контактов GPIO может быть обозначен (в программном обеспечении) как входной или выходной контакт и использоваться для самых разных целей, таких как подключение светодиода или датчика.
Нумерация контактов GPIO не соответствует порядку номеров. Контакты GPIO 0 и 1 присутствуют на плате (физические контакты 27 и 28), но зарезервированы для расширенного использования (см. ниже).
Описание
На плате присутствуют два контакта 5 В и два контакта 3,3 В, а также несколько контактов заземления (GND: 0V), которые не настраиваются. Все остальные контакты являются контактами общего назначения 3V3, что означает, что выходы настроены на 3,3 В, а входы выдерживают до 3,3 В.
Контакт GPIO, назначенный как выходной контакт, может быть установлен на высокий (3V3) или низкий (0V).
Вывод GPIO, обозначенный как входной, может быть прочитан как высокий (3V3) или низкий (0V). Это происходит за счет использования внутренних подтягивающих или подтягивающих резисторов. Контакты GPIO2 и GPIO3 имеют фиксированные подтягивающие резисторы, но для других контактов это можно настроить в программном обеспечении.
В дополнение к простым устройствам ввода и вывода контакты GPIO могут использоваться для множества альтернативных функций, некоторые из которых доступны на всех контактах, другие — на определенных контактах:
ШИМ: контакты, поддерживающие широтно-импульсную модуляцию, используемые для передачи информации по каналу связи или для управления мощностью, подаваемой на нагрузку.
- Программная ШИМ доступна на всех контактах
- Аппаратный ШИМ доступен на GPIO12, GPIO13, GPIO18, GPIO19
SPI: Шина SPI (последовательный периферийный интерфейс) представляет собой стандарт связи, используемый в основном для передачи информации между интегральными схемами в электронном оборудовании.
- или SPI0: MOSI (GPIO10); МИСО (GPIO9); СКЛК(GPIO11); CE0 (GPIO8), CE1 (GPIO7)
- или SPI1: MOSI (GPIO20); МИСО (GPIO19); СКЛК(GPIO21); CE0 (GPIO18); CE1 (GPIO17); CE2 (GPIO16)
I2C: Внутренняя интегральная схема (I²C, от англ. Inter-Integrated Circuit), используется внутри для связи между различными частями схемы, например, между контроллером и периферийными интегральными схемами.
- Данные: (GPIO2); Часы (GPIO3)
- Данные EEPROM: (GPIO0); Часы EEPROM (GPIO1)
Последовательные порты: порты для связи UART, на английском языке для универсального асинхронного приемника-передатчика, через контакт передачи TX и контакт приема RX.
- ТХ (GPIO14)
- RX (GPIO15)
Есть 2 способа нумерации контактов на Raspberry Pi: в режиме GPIO или в режиме BCM. Это только важно при программировании. Разница между этими обозначениями заметна, когда мы управляем GPIO с помощью Python или другого языка, и нам нужно указать, в каком режиме мы будем использовать GPIO в GPIO.BOARD или GPIO.BCM.
Параметр GPIO.BOARD указывает на то, что он относится к контактам по их номеру, то есть номерам, напечатанным на нашем Raspberry Pi (например, P1), на следующем изображении мы показываем вам контакт 1 и контакт 2. Один ряд будет нечетными контактами, а другой, противоположный, — четными контактами.
Параметр GPIO.BCM относится к контактам по их номеру «канала Broadcom SOC», они не коррелируют, как в режиме BOARD, на следующем изображении показаны контакты в BOARD и в BCM различных версий Raspberry Pi, BCM это те, чье имя начинается с GPIO, а центральные — контакты GPIO.BCM были бы, так сказать, как нумерация процессора и BOARD разъема.
Чтобы управлять GPIO с помощью Python, вы должны сначала импортировать библиотеку ранее написанного кода. Наиболее распространенной является Rpi.GPIO, которая использовалась для создания тысяч проектов с первых дней существования RPi.
Еще одна интересная библиотека — WiringPi , которая делает пины (контакты) более «переносимыми» из одного кода в другой и более универсальными.
Для установки последней версии нужно написать в командную строку следующие инструкции:
cd /tmp
wget https://project-downloads.drogon.net/wiringpi-latest.deb
sudo dpkg -i wiringpi-latest.deb
Чтобы увидеть эти контакты на Raspberry, мы можем открыть командную консоль и написать команду: gpio readall
Как следует из названия, прочитается все, что относится к gpio, и нам представится следующая информативная таблица, где можно увидеть каждый вывод и характеристики:
Еще одна команда, которая может вас заинтересовать: pinout. При этом информация станет еще более понятней:
Программирование GPIO
Раз вы уже знаете, что это за пины (контакты), то теперь пора объяснить, как их использовать для программирования устройств. Та же самая командная консоль может использоваться для изменения конфигурации контактов, например, для контакта 21, для вывода высокого напряжения, чтобы включить подключенный к нему светодиод.
Программирование через консоль
Включение светодиода можно запрограммировать различными способами, и проще всего просто использовать команды в консоли. Прежде всего, нужно подключить светодиод к RPi. Помните, что для этого всегда должен быть подключен резистор, в нашем случае мы будем использовать резистор 1 кОм и красный светодиод, подключенный к контакту gpio21:
Контакт (пин) 40 идет к резистору, который идет к аноду светодиода, катод светодиода идет к GND на контакте 39.
Затем загружаем RPi, открываем командный терминал и запускаем команду:
ls /sys/class/gpio/
Каталог /sys — один из многих виртуальных каталогов в этой системе. Вы не найдете его на SD-карте. Система просто «делает вид», что такой каталог существует, на самом деле все ссылки на файлы в этом каталоге обрабатываются ОС в Linux. Каталог /sys позволяет получить доступ к информации о системных драйверах Linux. В данном случае мы смотрим на контроллеры класса GPIO, то есть порты ввода и вывода.
Как видите, в этом каталоге уже есть несколько файлов:
По умолчанию доступ по пину невозможен, поэтому нужно его включить. Для этой цели будем использовать файл с именем export. Запись в этот файл заставит ОС предоставить нам соответствующую распиновку процессора. Нам нужен доступ к контакту GPIO21, поэтому записываем число 21 в файл /sys/class/gpio/export, набрав:
echo 21 > /sys/class/gpio/export
Теперь можем снова проверить содержимое каталога /sys/class/gpio , где найдем новый подкаталог с именем gpio21. Его содержимое позволит вам контролировать поведение выбранного контакта (пина).
По умолчанию для экспортируемого вывода установлено значение ввода (in). Но так как мы хотим управлять работой светодиода, нам нужен выход (out). Для этого нужно изменить его направление (с входа на выход). Поэтому просто прописываем в файл /sys/class/GPIO/gpio21/direction:
echo out > /sys/class/gpio/gpio21/direction
Теперь мы можем управлять диодом, записывая значения в файл.
Для включения светодиода вбиваем команду:
echo 1 > /sys/class/gpio/gpio21/value
А чтобы выключить его, меняем значение 1 на значение 0, пишем:
echo 0 > /sys/class/gpio/gpio21/value
Когда работа светодиода должна закончиться, то нужно отключить доступ к выводу GPIO21 . Пишем:
echo 21 > /sys/class/gpio/unexport
Как видите, в мире Linux все представляет собой файл. Каталог /sys ведет себя как обычные файлы на SD-карте. Мы можем использовать стандартные консольные инструменты или собственные программы для управления подключенными устройствами. Интересно то, что выполнение примеров не требовало от нас программирования, это были обычные операции с файлами. Конечно, это не совсем эффективный метод, но во многих случаях этого будет достаточно.
Стоит отметить, что используя доступ к каталогу /sys/class/gpio , также можно управлять пинами на других платформах. Этот функционал обеспечивается ОС Linux, но она не зависит от Raspberry Pi.
GPIO и WiringPi
Вот мы и изучили метод прямой связи с ОС Linux. Это конечно интересный вариант, но не очень эффективный и, в некоторых случаях, не всегда удобный. К счастью, Raspberry Pi поставляется с некоторыми довольно хорошими библиотеками и программами, которые позволяют более эффективно получать доступ к пинам (контактам). Одной из них является WiringPi.
В этой части статьи мы не будем писать программы (только простые скрипты), поэтому воспользуемся программой под названием gpio — с ее помощью можно легко использовать пины GPIO из консоли.
Вы можете найти больше информации о программе в обширной документации через команду:
man gpio
Мы можем видеть в разделе SYNOPSIS различные параметры команды.
Чтобы использовать команды с WiringPi, сначала проверим версию этой установленной библиотеки. Для этого запустите gpio -v . Если номер версии 2.46 или выше, то все хорошо и можно продолжать. Если она старее, то используйте эти команды для установки более новой версии:
cd /tmp
wget https://unicorn.drogon.net/wiringpi—2.46—1.deb
sudo dpkg —i wiringpi—2.46—1.deb
Теперь рассмотрим простой пример включения светодиода с тем же соединением, что и в предыдущем примере, но на этот раз на контакте 12 (режим BCM), который является нашим физическим контактом 32 в разъеме.
Как уже упоминалось, библиотека WiringPi использует другую нумерацию контактов. Однако вы можете принудительно использовать те же номера, что и для каталога /sys. Остановимся сейчас на этой нумерации.
Для начала настроим вывод 12 как выход, введя команду:
gpio -g mode 12 out
Параметр -g для gpio заставляет использовать нумерацию контактов процессора.
Теперь можем включать и выключать светодиод, написав после номера вывода его состояние, логический 0 или логическую 1 соответственно:
gpio -g write 12 0
gpio -g write 12 1
Мы получили ту же функциональность, что и раньше, но нам не нужно было напрямую обращаться к файлам, что сделало весь код намного короче.
WiringPi
Конечно, для проверки можно попробовать использовать нумерацию из библиотеки WiringPi, что мы сейчас и сделаем. Возвращаемся к таблице с пинами ( gpio readall ) и ищем наш пин номер 12. По внутренней нумерации библиотеки он будет иметь номер 26.
Затем мы можем писать команды:
gpio mode 26 out
gpio write 26 0
gpio write 26 1
Проверьте, насколько работа светодиода будет идентичной.
Скрипты, простые программы
Теперь мы можем управлять универсальными выходами. Однако метод подачи команд вручную не очень удобен. К счастью, нам не нужно вручную вводить все команды в терминале.
Мы можем писать скрипты, которые будут выполняться как «простые программы».
Сценарий — это просто текстовый файл, содержащий команды, которые мы обычно вводим с клавиатуры в окне терминала. Благодаря тому, что они помещены в файл, нам не нужно все переписывать, достаточно вызвать соответствующий файл.
Светодиод по сценарию
Мы начнем с такого же чрезвычайно простого примера, как включение светодиода. У нас будет наш первый скрипт, который установит соответствующий контакт в качестве выхода и включит его (т. е. включит светодиод). Конечно, нет особого смысла делать «программу» для чего-то столь простого, но так мы просто потренируемся в создании и запуске самого скрипта.
Во-первых, нам нужно создать новый файл с расширением «sh». Например, это может быть led.sh, для этого воспользуемся редактором nano:
nano led.sh
В его содержимом вводим команды, которые мы обычно вводим в консоли. Мы должны предварять их одной строкой: #!/Bin/sh . Таким образом, сценарий, который включает диод, подключенный к контакту 21, будет выглядеть так:
#!/bin/sh
gpio -g mode 21 out
gpio -g write 21 1
Сохраните файл (CTRL+X). Затем нужно дать нашему сценарию соответствующие разрешения, чтобы его можно было рассматривать как «программу». Для этого используем chmod:
sudo chmod +x led.sh
Для запуска скрипта вводим команду:
./led.sh
Теперь светодиод просто загорится. Чтобы отключить его, потребуется другой скрипт, который вы можете попробовать написать сами. Теперь мы собираемся поставить еще один более функциональный пример, чтобы светодиод мигал сам по себе. Создаем новый файл blink.sh:
nano blink.sh
В его содержимое вставляем простой цикл while (пока не будем заострять внимание на синтаксисе):
#!/bin/sh
gpio -g mode 21 out
while true
do
gpio -g write 21 1
sleep 1
gpio -g write 21 0
sleep 1
done
Цикл while, как показывает его перевод, состоит из повторения чего-то, пока что-то остается. В этом случае, в кратком режиме, мы можем видеть, что пока это «true», она делает работу последующих строк. Следовательно, все, что находится между «do» и «done», будет выполняться в цикле.
Приведенный выше код настраивает контакт № 21 в качестве выхода. Затем меняет состояние каждую секунду (sleep 1). Сохраните файл (CTRL + X), дайте ему соответствующие разрешения (sudo chmod + x blink.sh). Скрипт можно прервать, нажав CTRL+C.
Теперь светодиод будет мигать каждую секунду, когда запустим программу.
Основываясь на описанных здесь примерах, вы теперь обладаете знаниями, позволяющими создать, например, симуляцию простого светофора. В следующей статье мы расскажем вам, как создать нового пользователя и пароль.
С Уважением, МониторБанк