Главная » Arduino
Призовой фонд
на ноябрь 2017 г.
1. Термометр Relsib WT51
Рэлсиб
2. 1000 руб
PCBWay
3. Тестер компонентов LCR-T4
Паяльник
4. 200 руб.
От пользователей

Использование 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А)
Печатная плата для усилителя "LM3886 + AD825" USB осциллограф DSO-2090
вверх