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 на плюс (
Компилируем:
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
139321
Поддержать автора
Комментарии (1)