Главная » Arduino
Призовой фонд
на сентябрь 2017 г.
1. 1000 руб
PCBWay
2. Осциллограф DSO138
Паяльник
3. Тестер компонентов MG328
Паяльник
4. 100 руб.
От пользователей

Использование 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:
 *      Simple test program to blink an LED on pin 7
 */

#include 
#include 

int main (void)
{
  int pin = 7;
  printf("Raspberry Pi wiringPi blink test\n");

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

  pinMode(pin, OUTPUT);

  for (;;){
    printf("LED On\n");
    digitalWrite(pin, 1);
    delay(250);
    printf("LED Off\n");
    digitalWrite(pin, 0);
    delay(250);
  }

  return 0;
}

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

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

И запускаем:

sudo ./blink

У вас должен получиться мигающий светодиод. Теперь можно сделать что-то более интересное:

/*
 * buttonLED.c:
 *      Simple test program to change the blinking rate of an LED when a button is pressed
 */

#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 button LED test\n") ;

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

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

  for (;;){
    if (digitalRead (8) == 0){ // button pressed
      del = 100;
    } else {
      del = 250;
    }

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

  return 0 ;
}

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

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

Теги:

Касьянов А. Опубликована: 2012 г. 0 0
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (18) | Я собрал (0) | Подписаться

0
Арем #
Статья хорошая написана доступным языком, хотелось бы больше узнать о GPIO, в частности о Raspberry PI. Ну и побольше схемок для развития.
Ответить
0
Andrey_O #
Просто и доступно. Спасибо за статью!
Ответить
0
жан #
Хочу использовать Raspberry Pi для измерения температуры, и сохранения данных об температуре в виде графика. Возможно ли это, и что для для этого надо?
Ответить
0
talibanich #
Возможно. Нужен датчик, к примеру подойдет самый популярный DS18B20. А вообще можете написать в эту тему: http://forum.cxem.net/index.php?showtopic=114312 (регистрация не требуется) о том, чтобы вы хотели бы видеть, т.е. более подробно вашу задачу. Самые интересные задачи я постараюсь повторить и подробно описать и выложить в виде статьи, либо на форуме в существующий FAQ по Raspberry Pi.
Ответить
0
Солнцеворот #
fatal error: wiringpi.h: No such file or directory
compilation terminated.

Почему так происходит?
Ответить
0
Anonymous #
Очевидно, что отсутствует wiringpi.h в системном пути. Установите пакет wiringPi. В вышеуказанном примере по Си приводится пошаговая инструкция.
Ответить
0
salik #
Учитывайте регистр. в примере ошибка. должно быть wiringPi.h
Ответить
0
unbeliever #
В СИ можно сделать все без сторонних библиотек (хотя с ними все и красиво). Просто создаем для файлов из примера для bash файловые дескрипторы, и пишем в них все, что нужно.
Ответить
0
Александр #
А как в питоне управлять временем работы светодиода во включенном состоянии? С учетом того, что вы уже написали.
Ответить
0
Илья #
import time
time.sleep(1)
Ответить
0
Роман #
А что Вы делаете этим кодом?
import RPi.GPIO as GPIO
GPIO.setup(7, GPIO.OUT)
GPIO.output(7, True)
GPIO.output(7,False)
Ответить
0
Roman #
import RPi.GPIO as GPIO # импортирует библиотеку GPIO
GPIO.setup(7, GPIO.OUT) # определяет с каким портом будем работать
GPIO.output(7, True) # включает порт, светодиод горит
GPIO.output(7,False) # выключает, светодиод гаснет
Написан на питоне. Могу ошибаться
Ответить
0
navu #
У меня вопрос по поводу резистора. Везде пишут про 330Ом, у вас 220. Почитав статьи у меня получается что, например, для светодиода 2в 20мА (который хотим ограничить 10мА для страховки) по формуле получается (3.3 - 2) / 0.01 = 130 Ом. Как я понимаю, ставить резистор для потенциального светодиода, потребляющего 0В смысла нет, так как в выключенном или перегоревшем состоянии состоянии цепь все равно прервана?
Ответить
0
poleg #
Зачем для Bash управления повторяется 2 раза строка?
echo "4" > /sys/class/gpio/export
echo "4" > /sys/class/gpio/export
Ответить
0
Сергей #
Да? Хотел задать тот же вопрос?
И почему 4, если во всех примерах используется 7й пин. Просто это сбивает с толку.
Да, кстати и что вернет cat /sys/class/gpio/gpio0/value
0/1 или true/false?
И статью можно было бы подправить с учетом комментариев и ответов на них.
Ответить
0
Slawa Gorobets #
Подскажите, я все установил вроде правильно, но Питон при компиляции выдает ошибку:
тестового файла на import RPi.GPIO as GPIO выдает ImportError: No module names RPi.GPIO - в чем может быть проблема?
Ответить
0
Kirill #
Очень полезная статья, всё понятно. Спасибо!
Ответить
0
Илья #
Блин,пытаюсь ставить библиотеку, на этапе make вываливается ошибка:

[CC] wiringPi.c
wiringPi.c: In function ‘wiringPiSetup’:
wiringPi.c:305:28: error: ‘caddr_t’ undeclared (first use in this function)
gpio = (uint32_t *)mmap((caddr_t)gpioMem, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_FIXED, fd, GPIO_BASE) ;
^
wiringPi.c:305:28: note: each undeclared identifier is reported only once for each function it appears in
wiringPi.c:305:36: error: expected ‘)’ before ‘gpioMem’
gpio = (uint32_t *)mmap((caddr_t)gpioMem, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_FIXED, fd, GPIO_BASE) ;
^
wiringPi.c:305:22: error: too few arguments to function ‘mmap’
gpio = (uint32_t *)mmap((caddr_t)gpioMem, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_FIXED, fd, GPIO_BASE) ;
^
In file included from wiringPi.c:50:0:
/usr/include/arm-linux-gnueabihf/sys/mman.h:57:14: note: declared here
extern void *mmap (void *__addr, size_t __len, int __prot,
^
Makefile:50: recipe for target 'wiringPi.o' failed
make: *** [wiringPi.o] Error 1

Что это такое?
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется сила тока?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Модуль измерения тока на ACS712 (30А)
Модуль измерения тока на ACS712 (30А)
Сатфайндер Набор для сборки - LED лампа
вверх