Використання GPIO виводів Raspberry Pi

Мікрокомп'ютер Raspberry Pi

В цій статті описані експерименти з GPIO (General Purpose Input/Output, Входи/Виходи загального призначення) контактами Raspberry Pi. Я спробував працювати з ними трьома способами: Python, Bash і C. У цій статті будуть описані всі три способи. Але для початку трохи інформації про налаштування та підготовку.

Підключення до GPIO контактам RPi: Я використав старий IDE шлейф від флоппі дисковода. Він має 34 контакти, а RPi має тільки 26 контактів, тому частина роз'єму не використовується. На іншому кінці шлейфа припаяні BLS штифти, які вставлені в макетну плату і до сих пір дуже добре працюють.

Підключення до GPIO контактам Raspberry Pi

Підключення виводів: По посиланнях є таблиця з значенням виводів і схема їх розташування. Виводи рахуються зліва направо, зверху вниз, починаючи з виводу 3.3В. Ось як використані контакти у мене:
Вивід 2: 5В
Вивід 3: "GPIO0". До нього підключений один з виводів вимикача, інший його вивід підключений до GND. Цей вивід GPIO має внутрішній підтягуючий pull-up резистор. Це означає, що коли вимикач не замкнутий, на виході високий рівень, а коли замкнутий – низький.
Вивід 6: GND (цей вивід підключений до GND макетної плати)
Вивід 7: "GPIO4". До нього підключається анод світлодіода через резистор 220 Ом.

У всіх наступних прикладах буде використано таке підключення. Різні бібліотеки використовують різні виводи, створюючи плутанину,  тому я намагатимусь позбутися від неї. Також зазначимо, що все це робиться в режимі SSH, тому монітор не підключений.

Важливе зауваження: В RPi Wiki написано, що GPIO виводи небуферизовані і незащищені, тому коротке замикання становить небезпеку для всього RPi, тому будьте обережні! Розробляється нова версія плати з захистом.

Важливе зауваження: Всі програми, які звертаються до GPIO контактів, повинні бути запущені з правами адміністратора, інакше ви отримаєте повідомлення про помилку.

Python

Це одна з моїх улюблених мов, тому я вирішив спробувати її. По-перше, встановіть pip (Python package installer, пакет установки Python):

sudo curl https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python

Потім встановіть модуль RPi.GPIO для Python:

sudo pip install rpi.gpio

Тепер ви можете увійти до інтерпретатора Python (sudo python), і робити такі речі:

import RPi.GPIO as GPIO
GPIO.setup(7, GPIO.OUT)
GPIO.output(7, True)
GPIO.output(7,False)

Bash

Я завжди любив Unix за те, що основною його ідеєю є те, що все є файлом. GPIO контакти Raspberry Pi також є файлами! З використанням нашої макетної плати ми можемо запалювати і гасити світлодіод.

sudo su -
echo "4" > /sys/class/gpio/export
echo "4" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio4/direction
echo "1" > /sys/class/gpio/gpio4/value
echo "0" > /sys/class/gpio/gpio4/value

Для читання входів використовуйте команду "cat" і шлях файлу.

echo "0" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio0/direction
cat /sys/class/gpio/gpio0/value

C

Старий добрий C. Базовий приклад для C дійсно складний, але, на щастя, Гордон написав Arduino подібну бібліотеку, але для Raspberry Pi! Отже, ось що потрібно зробити:

Завантажте і встановіть бібліотеку:

cd /tmp
wget http://project-downloads.drogon.net/files/wiringPi-1.tgz
tar xfz wiringPi-1.tgz
cd wiringPi/wiringPi
make
sudo make install

У системі вашого Raspberry Pi тепер встановлена бібліотека wiringPi, тому ми можемо написати невелику програму з використанням її.

cd ~
nano blink.c

Скопіюйте код даної програми:

/*
 * blink.c:
 *      Простий тестовий програму для миготіння світлодіода на піні 7
 */

#include 
#include 

int main (void)
{
  int pin = 7;
  printf("Тест миготіння світлодіода Raspberry Pi wiringPi\n");

  if (wiringPiSetup() == -1)
    exit (1);

  pinMode(pin, OUTPUT);

  for (;;){
    printf("Світлодіод увімкнено\n");
    digitalWrite(pin, 1);
    delay(250);
    printf("Світлодіод вимкнено\n");
    digitalWrite(pin, 0);
    delay(250);
  }

  return 0;
}

Компіліруємо код:

gcc -o blink blink.c -L/usr/local/lib -lwiringPi

І запускаємо:

sudo ./blink

У вас повинен вийти миготючий світлодіод. Тепер можна зробити щось більш цікаве:

/*
 * buttonLED.c:
 *      Простий тестовий програму для зміни швидкості миготіння світлодіода, коли кнопка натиснута
 */

#include 
#include 

int main (void)
{
  int pin_LED = 7;    // GPIO7 / header pin 7
  int pin_switch = 8; // SDA0 / header pin 3
  int del = 250;

  printf ("Тест кнопки світлодіода Raspberry Pi wiringPi\n") ;

  if (wiringPiSetup() == -1)
    exit (1);

  pinMode(pin_LED, OUTPUT);
  pinMode(pin_switch, INPUT);

  for (;;){
    if (digitalRead (8) == 0){ // кнопка натиснута
      del = 100;
    } else {
      del = 250;
    }

    digitalWrite(pin_LED, 1);
    delay(del);
    digitalWrite(pin_LED, 0);
    delay(del);
  }

  return 0 ;
}

А як же функція analogRead? На жаль, на відміну від Arduino, RPi не має вбудованого АЦП (аналогово-цифрового перетворювача). Але деякі з розроблюваних плат будуть включати в себе АЦП, наприклад Gertboard

Оригінал статті

Top