Raspberry Pi 2 - GPIO

Установка ОС на Raspberry Pi и настройка описана здесь.
GPIO (general purpose input output) — интерфейс ввода/вывода.
Управление пинами разными способами и на разных языках

Подключите светодиод к пину №16 он же BCM 23, через резистор 200-1000 Ом:


Средствами ОС
sudo suВключение/отключение
Создаём файл доступа к пину:
echo 23 > /sys/class/gpio/exportНастройка пина на вывод:
echo out > /sys/class/gpio/gpio23/directionЗажигаем:
echo 1 > /sys/class/gpio/gpio23/valueГасим:
echo 0 > /sys/class/gpio/gpio23/valueУдаляем созданный пин:
echo 23 > /sys/class/gpio/unexportЧтение
Создаём файл доступа к пину:
echo 24 > /sys/class/gpio/exportНастраиваем пин на ввод:
echo in > /sys/class/gpio/gpio24/directionЧитаем:
cat /sys/class/gpio/gpio24/valueБудет 0
Соедините пин 1 (3.3v) с пином 18 (BCM 24) и прочитайте снова:
cat /sys/class/gpio/gpio24/valueБудет 1
Удаляем пин:
echo 24 > /sys/class/gpio/unexportPython
Устанавливаем Python для работы с GPIO
sudo apt install python3-rpi.gpio
sudo apt install python3-pip
Командуем:
sudo python3
Теперь последовательно вводим команды…
Импортируем библиотеку gpio:
import RPi.GPIO as GPIOУстанавливаем режим gpio:
GPIO.setmode(GPIO.BCM) GPIO.BCM — используется нумерация GPIO
GPIO.BOARD — используется нумерация пинов P1-23
Отключаем сообщения об ошибках:
GPIO.setwarnings(False)Устанавливаем пин на вывод:
GPIO.setup(23, GPIO.OUT)Зажигаем светик:
GPIO.output(23, True)Гасим:
GPIO.output(23, False)Завершаем работу с GPIO:
GPIO.cleanup()Выйти Ctrl + z

Помигаем светиком с помощью скрипта.
Создайте в домашней папке файл led.py
nano ~/led.pyСодержимое:
import RPi.GPIO as GPIO
import time
LED = 23
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(LED, GPIO.OUT)
while(1):
GPIO.output(LED,True)
time.sleep(1) # пауза 1 сек
GPIO.output(LED,False)
time.sleep(1)
Отступы делайте кнопкой

Сохраняем и запускаем:
python3 ~/led.py
Прочитать состояние пина:
sudo python3import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)Конфигурируем пин на ввод:
GPIO.setup(24, GPIO.IN)При желании ножку можно «подтянуть» (необязательно):
GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_UP) # подтяжка к питанию
GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) # подтяжка к земле
GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_OFF) # подтяжка отключенаСчитываем сигнал с пина 24 в переменную pinstate
pinstate = GPIO.input(24) Смотрим состояние:
pinstateВ переменной (pinstate) будет 0
Соедините пин 1 (3.3v) с пином 18 (BCM 24) и прочитайте снова:
pinstate = GPIO.input(24)
pinstate
GPIO.cleanup()В переменной (pinstate) будет 1
ШИМ (программный)
sudo python3Подготовка:
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(23, GPIO.OUT)Записываем в переменную gpiopwm номер пина и частоту 100Гц. Можно задать другую частоту.
gpiopwm=GPIO.PWM(23,100)Запускаем ШИМ с длительностью импульса 50% (Duty cycle — он же коэффициент заполнения):
gpiopwm.start(50)Светодиод будет гореть в пол накала.
Duty cycle можно менять вот так:
gpiopwm.ChangeDutyCycle(10)10%
gpiopwm.ChangeDutyCycle(20)20% и т.д.
Менять частоту можно так:
gpiopwm.ChangeDutyCycle(200)200Гц
Остановить ШИМ:
gpiopwm.stop()Освободить пин:
GPIO.cleanup()Сделаем плавное включение…
Создайте файл pwmled.py
nano ~/pwmled.pyСодержимое:
import RPi.GPIO as GPIO
import time
LED = 23
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(LED, GPIO.OUT)
gpiopwm=GPIO.PWM(LED,100)
gpiopwm.start(1)
herz = 0
while(1):
gpiopwm.ChangeDutyCycle(herz)
time.sleep(0.1) # пауза 0,1 сек (100мс)
herz += 1
if herz >= 100:
herz = 0
Стартуем:
python3 ~/pwmled.pyАрдуиноподобные функции
Установите библиотеку wiringpi2
sudo pip3 install wiringpi2Создайте файл ardugip.py
nano ~/ardugip.py
import wiringpi as wiringpi
from time import sleep
wiringpi.wiringPiSetupGpio()
wiringpi.pinMode(23, 1)
wiringpi.digitalWrite(23, 0)
sleep(1)
wiringpi.digitalWrite(23, 1)
sleep(1)
wiringpi.digitalWrite(23, 0)
wiringpi.digitalWrite(23, 0)
sleep(1)
wiringpi.digitalWrite(23, 1)
sleep(1)
wiringpi.digitalWrite(23, 0)
Запуск:
sudo python3 ~/ardugip.pyШИМ (аппаратный)
Переключаем светодиод на пин №12 он же BCM 18 (PWM0)

Создайте файл pwmgip.py
nano ~/pwmgip.pyimport wiringpi as wiringpi
import time
def main():
wiringpi.wiringPiSetupGpio() # номера gpio как BCM
# активировать PWM0, PWM1 - пин 13
wiringpi.pinMode(18,2)
wiringpi.pwmSetMode(0)
wiringpi.pwmSetClock(400)
wiringpi.pwmSetRange(1024)
wiringpi.pwmWrite(18, 0)
dtMin, dtMax = 0, 255
dt = 0
while (1):
try:
print(dt)
wiringpi.pwmWrite(18, dt)
dt += 1
if dt > dtMax:
dt = dtMin
time.sleep(0.1)
except:
wiringpi.pwmWrite(18, 0)
break
# call main
if __name__ == '__main__':
main()
Старт:
sudo python3 ~/pwmgip.pyСИ
Устанавливаем библиотеку bcm2835
Скачиваем:
wget www.open.com.au/mikem/bcm2835/bcm2835-1.50.tar.gz Распаковываем:
tar zxvf bcm2835-1.50.tar.gzПереходим в папку:
cd bcm2835-1.50Устанавливаем:
./configure make
sudo make check
sudo make installВозвращаемся в домашнюю папку:
cd ..Запись
Создаём файл:
nano gpio.cСодержимое:
#include <bcm2835.h>
#define PIN RPI_GPIO_P1_16
int main()
{
if (!bcm2835_init()) return 1;
bcm2835_gpio_fsel(PIN, BCM2835_GPIO_FSEL_OUTP); // пин на вывод
while (1)
{
bcm2835_gpio_write(PIN, HIGH);
delay(500);
bcm2835_gpio_write(PIN, LOW);
delay(500);
}
return 0;
}
Компилируем:
gcc -o gpio gpio.c -lrt -lbcm2835Стартуем:
sudo ./gpio
Остановите программу (Ctrl + c), диод не отключайте.
Чтение
Создайте файл:
nano gpioin.c#include <bcm2835.h>
#define PIN_IN RPI_V2_GPIO_P1_18 // пин для чтения (BCM24)
#define PIN RPI_V2_GPIO_P1_16
int main()
{
if (!bcm2835_init()) return 1;
bcm2835_gpio_fsel(PIN, BCM2835_GPIO_FSEL_OUTP); // PIN на вывод
bcm2835_gpio_fsel(PIN_IN, BCM2835_GPIO_FSEL_INPT); // PIN_IN на ввод
while(1)
{
if(bcm2835_gpio_lev(PIN_IN)) bcm2835_gpio_write(PIN, HIGH);
else bcm2835_gpio_write(PIN, LOW);
}
return (bcm2835_close ());
}
Если замкнуть BCM24 на плюс (
Компилируем:
gcc -o gpioin gpioin.c -lrt -lbcm2835Стартуем:
sudo ./gpioinТеперь можно позамыкать пин BCM24 на плюс (
схема

UART
Уарт в Raspberry представляется как устройство /dev/ttyAMA0

Если планируется его использование, тогда нужно в файле /boot/cmdline.txt удалить пару слов:
sudo nano /boot/cmdline.txtУдалите вот это:
console=serial0,115200То есть должно стать так:
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwaitСуть этой процедуры заключается в отключении консоли от уарта.
На этом всё.
- +153
- stD

155029
Поддержать автора


Комментарии (1)