Руководство по GPIO для начинающих

Руководство по 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.

Разводка выводов 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 килоОм (любого резистора) к разъему + полоса а другой конец - в одну из поперечных полос. Для светодиода ориентация имеет решающее значение. Анод - это более длинный из двух плеч и часто согнутый, катод - более короткое плечо. Анод всегда должен быть направлен в + направлении, т.е. к источнику питания, а катод в направлении, т.е. к ЗЕМЛЕ. Поэтому поместите более длинное плечо в ту же поперечную полосу, что и резистор, так, чтобы короткое плечо находилось в соседней поперечной полосе. Наконец, с помощью кабеля-перемычки соедините поперечную полосу катода (более короткого плеча светодиода) с поперечной полосой резистора. - полоса.

На следующей схеме показана сборка, убедитесь, что все правильно и что компоненты вставлены в плату до упора, иначе будут неплотные контакты.

Aufbau des Schaltkreises

Следующие три примера кода на языках 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. Хорошим следующим шагом будет расширение одного из примеров кода. Например, с помощью дополнительных светодиодов или кнопки.


Удачных экспериментов!

Комментировать