Руководство по GPIO для начинающих
В этой статье вы узнаете все о контактах GPIO на Raspberry Pi. Этот пост предназначен специально для новичков в электронике.
Прежде всего, предупреждение:
Raspberry Pi может быть непоправимо поврежден при неправильном использовании контактов. Поэтому всегда проверяйте правильность схемы и используйте достаточное количество резисторов.
Что такое контакты GPIO
Штырьки GPIO - это 40 маленьких металлических штырьков на верхней части Raspberry Pi. Аббревиатура GPIO означает "ввод-вывод общего назначения". Это означает, что контакты GPIO можно использовать в качестве интерфейса практически для любого электронного устройства.
Из-за большого количества способов (неправильного) использования пинов, начало работы может быть немного запутанным. Поэтому в этом блоге приведены примеры управления пинами с помощью Bash, C и Python. Поэтому небольшой опыт в программировании будет преимуществом.
Хотя 40 контактов выглядят одинаково, они имеют разные функции. 26 выводов могут использоваться для GPIO, а некоторые имеют дополнительные функции. Еще 4 вывода используются как источник питания (POWER, два раза 3V3 и два раза 5V), а 8 - как отрицательный полюс (также земля или GROUND). Два оставшихся вывода - это интерфейс I2C для ID EEPROM.
Распиновка
На графике ниже показана самая важная информация, в том числе распиновка. Распиновка идентична для большинства моделей Raspberry Pi, но есть и различия. Всегда проверяйте точную распиновку вашей модели перед подключением устройства. Для этого достаточно открыть терминал на вашем Raspberry Pi (Ctrl+Alt+t) и выполнить следующую команду.
pinout
Вы увидите график всех соединений и точную распиновку вашего Raspberry Pi.
Возможно, вы заметили, что номера GPIO появляются случайно и не совпадают с нумерацией выводов. Чтобы избежать путаницы, я называю номера от 1 до 40 номерами BOARD, а номера от 1 до 26 - номерами BCM или GPIO.
Итак, контакт 1 платы - это разъем 3V3 POWER, а контакт 2 GPIO - это контакт рядом с ним с номером 3 платы.
Как подключить устройство к контактам
Существует несколько вариантов подключения устройства к контактам GPIO. Некоторые устройства имеют заголовок GPIO, поэтому устройство можно подключить непосредственно к контактам GPIO. Обычно, однако, это не так, поэтому используются провода-перемычки или удлинители GPIO.
Смотреть наше видео о контактах GPIO!
В следующем примере светодиод подключен к Raspberry Pi с помощью кабелей-перемычек.
Цепь
Провода-перемычки с женского на мужской соединяют вывод GPIO с заголовком или макетной платой. Затем этот вывод необходимо запрограммировать для управления устройством. Устройством может быть кнопка, светодиод, датчик, двигатель или дисплей. Важно только, чтобы устройство могло работать при напряжении 5 вольт или меньше и было совместимо с интерфейсами I2C, SPI или UART.
Для строительства нам необходимо следующее оборудование.
- Raspberry Pi с Raspberry Pi OS
- Два провода-перемычки с мужского на женский
- Один провод перемычки между мужчинами и женщинами
- Резистор 10 килоОм
- LED
- Беспаечная макетная плата
Подключите вывод GPIO 13 (номер 33 на плате) к разъему + полоса и расположенный рядом с ним контакт GROUND (номер 34) к разъему - полоса макетной платы. Затем подключите один конец резистора 10 килоОм (любого резистора) к разъему + полоса а другой конец - в одну из поперечных полос. Для светодиода ориентация имеет решающее значение. Анод - это более длинный из двух плеч и часто согнутый, катод - более короткое плечо. Анод всегда должен быть направлен в + направлении, т.е. к источнику питания, а катод в – направлении, т.е. к ЗЕМЛЕ. Поэтому поместите более длинное плечо в ту же поперечную полосу, что и резистор, так, чтобы короткое плечо находилось в соседней поперечной полосе. Наконец, с помощью кабеля-перемычки соедините поперечную полосу катода (более короткого плеча светодиода) с поперечной полосой резистора. - полоса.
На следующей схеме показана сборка, убедитесь, что все правильно и что компоненты вставлены в плату до упора, иначе будут неплотные контакты.
Следующие три примера кода на языках Bash, Python и C основаны на этой структуре. Если вы используете другие штифты, вы должны соответствующим образом изменить код.
Bash
Управлять контактами GPIO через Bash очень просто. В Linux пины GPIO управляются файлами в папке /sys/class/gpio папку. Чтобы использовать вывод GPIO, его необходимо сначала экспортировать. В качестве примера я использую вывод GPIO 13. Ниже имена файлов выделены жирным и курсивом.
Откройте терминал и перечислите содержимое папки gpio.
cd /sys/class/gpio
ls
Папка содержит файлы export и unexport, а также вложенные папки для каждого экспортируемого пина GPIO.
Мы экспортируем пин, записав номер GPIO в поле /sys/class/gpio/export файл. Выполните эту команду в терминале.
echo 13 > /sys/class/gpio/export
ls
Теперь создана папка с соответствующим номером вывода gpio13. Эта папка содержит другие папки и файлы. На данный момент для нас важны только файлы направлений и значений.
Сайт направление файл сохраняет режим работы пина:
в -> Контакт находится в режиме чтения или ввода
на -> Контакт находится в режиме записи или вывода
Сайт значение файл хранит состояние напряжения на выводе:
0 -> вывод находится в режиме НИЗКОГО уровня -> на вывод не подается напряжение
1 -> Контакт находится в режиме HIGH -> На контакт подается напряжение
Следующие команды устанавливают режим на и значение для 1.
echo out > /sys/class/gpio/gpio13/direction
echo 1 > /sys/class/gpio/gpio13/value
Теперь светодиод горит. Важно сбросить значения выводов после использования. Следующие команды должны выполняться после каждого использования.
echo 0 > /sys/class/gpio/gpio13/value
echo in > /sys/class/gpio/gpio13/direction
echo 13 > /sys/class/gpio/unexport
Программа Python
Теперь мы абстрагируемся и автоматизируем эти команды Bash в Python.
Следующий сценарий Python предоставляет простой GPIO_Pin класс. Это делает его чрезвычайно простым в использовании. Сайт os модуль позволяет нам выполнять те же команды bash, что и выше, из Python. также, используя __del__ метод, нам больше не нужно вручную сбрасывать и разворачивать контакты.
import os
from time import sleep
class GPIO_Pin:
def __init__(self, num, mode):
if 0 <= num or num <= 40:
self.num = num
else:
print('Invalid Pin Number -> Enter a number from 0 - 40')
if mode == 'out' or mode == 'write':
self.mode = 'out'
elif mode == 'in' or mode == 'read':
self.mode = 'in'
else:
print('Invalid Pin Mode -> Enter "out" or "write" for output, "in" or "read" for input')
if self.num and self.mode:
os.system(f'echo {str(self.num)} > /sys/class/gpio/export')
sleep(0.05)
os.system(f'echo {self.mode} > /sys/class/gpio/gpio{str(self.num)}/direction')
def reset(self):
os.system(f'echo 0 > /sys/class/gpio/gpio{str(self.num)}/value')
os.system(f'echo in > /sys/class/gpio/gpio{str(self.num)}/direction')
def write(self, value):
if value == 0 or value == 'LOW':
os.system(f'echo 0 > /sys/class/gpio/gpio{str(self.num)}/value')
elif value == 1 or value == 'HIGH':
os.system(f'echo 1 > /sys/class/gpio/gpio{str(self.num)}/value')
else:
print('Invalid value -> Enter 1 or "HIGH" for HIGH, 0 or "LOW" for LOW')
def __del__(self):
self.reset()
os.system(f'echo {str(self.num)} > /sys/class/gpio/unexport')
def set_mode(self, mode):
self.mode = mode
os.system(f'echo {str(self.mode)} > /sys/class/gpio/gpio{str(self.num)}/direction')
def main():
pin = GPIO_Pin(13, 'out')
number_of_blinks = 10
for i in range(number_of_blinks):
pin.write('HIGH')
sleep(0.5)
pin.write('LOW')
sleep(0.5)
if __name__ == '__main__':
main()
С помощью модуля времени мы можем даже заставить светодиод мигать без каких-либо проблем. Весь сценарий может быть расширен до модуля Python для управления GPIO.
Программа C
Также в C мы можем легко редактировать содержимое папки gpio. Используя стандартную библиотеку stdlib мы можем открывать файлы и изменять их содержимое.
Следующая программа на языке C должна быть скомпилирована, прежде чем ее можно будет выполнить. Создайте файл gpio.c и скопируйте в него программу.
Затем откройте терминал и перейдите в папку, в которой находится файл gpio.c находится файл. Используйте следующие команды для компиляции и выполнения программы.
gcc -o gpio gpio.c
./gpio
Вот программа.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define GPIO_ROOT "/sys/class/gpio"
#define EXPORT "/sys/class/gpio/export"
#define UNEXPORT "/sys/class/gpio/export"
#define LOW 0
#define HIGH 1
int export_pin(int num) {
FILE* export = fopen(EXPORT, "w");
if (export == NULL) {
printf("Failed to open the export file\n");
exit(-1);
}
fprintf(export, "%d", num);
fclose(export);
return 0;
}
int unexport_pin(int num) {
FILE* unexport = fopen(UNEXPORT, "w");
if (unexport == NULL) {
printf("Failed to open the unexport file\n");
exit(-1);
}
fprintf(unexport, "%d", num);
fclose(unexport);
return 0;
}
int set_direction(char *mode, int num) {
char direction_file_path[1024];
snprintf(direction_file_path, sizeof(direction_file_path), "/sys/class/gpio/gpio%d/direction", num);
FILE* direction = fopen(direction_file_path, "w");
if (direction == NULL) {
printf("Failed to open the direction file\n");
exit(-1);
}
fputs(mode, direction);
fclose(direction);
return 0;
}
int set_value(int val, int num) {
char value_file_path[1024];
snprintf(value_file_path, sizeof(value_file_path), "/sys/class/gpio/gpio%d/value", num);
FILE* value = fopen(value_file_path, "w");
if (value == NULL) {
printf("Failed to open the value file\n");
exit(-1);
}
fprintf(value, "%d", val);
fclose(value);
return 0;
}
int main() {
int rslt;
int num;
int num_blinks;
num = 13;
num_blinks = 10;
rslt = export_pin(num);
rslt = set_direction("out", num);
for (int i = 0; i < num_blinks; i++) {
rslt = set_value(HIGH, num);
sleep(1);
rslt = set_value(LOW, num);
sleep(1);
}
rslt = set_value(LOW, num);
rslt = set_direction("in", num);
rslt = unexport_pin(num);
return EXIT_SUCCESS;
}
PiCockpit - приложение для работы с GPIO
Самый простой способ управления контактами GPIO - с помощью приложения GPIO. На сайте Веб-интерфейс PiCockpit бесплатно для 5 Raspberry Pi. Он предлагает два больших преимущества: Вам не нужно знать программирование, чтобы управлять контактами GPIO, и вы можете делать это из любого места.
Просто установите клиент PiCockpit на свой Raspberry Pi и подключитесь к своей учетной записи PiCockpit. После этого вы сможете легко управлять пинами GPIO через веб-интерфейс.
Следующие шаги
Теперь вы знаете, как использовать контакты GPIO с помощью проводов-перемычек. Конечно, существуют также внешние модули Python и библиотеки C для управления контактами GPIO. Хорошим следующим шагом будет расширение одного из примеров кода. Например, с помощью дополнительных светодиодов или кнопки.
Удачных экспериментов!