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/unexport





Python



Устанавливаем 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 python3


import 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.py


import 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 на плюс (3.3v), тогда загорится диод.


Компилируем:

gcc -o gpioin gpioin.c -lrt -lbcm2835


Стартуем:

sudo ./gpioin


Теперь можно позамыкать пин BCM24 на плюс (3.3v).
схема






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


Суть этой процедуры заключается в отключении консоли от уарта.



Пример подключения ардуины.

BCM14 — TX > RX — ардуина.
BCM15 — RX < TX — ардуина.





На этом всё.


  • +153
  • 125791
Поддержать автора


Telegram-чат istarik

Задать вопрос по статье
Telegram-канал istarik

Известит Вас о новых публикациях






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

0
А при подключении ардуины уровни можно не согласовывать, как и на mr3020?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.