Выбрать главу

- В завершении работы программы, функция GPIO.cleanup() освобождает ресурсы GPIO, и программа закрывается.

Важно

В отличие от Arduino, наша программа не будет стартовать сама при старте Raspberry Pi. Если нужно, можно добавить это самостоятельно, отредактировав файл автозапуска rc.local. Введем команду: sudo nano /etc/rc.local

Внутрь файла rc.local нужно будет добавить команду запуска:

sudo python /home/pi/led_blink.py &

Команду sudo мы уже знаем, знак & говорит о том, что программа будет запущена в фоновом режиме. /home/pi/led_blink.py - это путь к программе, он может быть и другим. Кстати, узнать путь к текущему каталогу можно, введя команду pwd.

Сохранив файл, перезагрузим Paspberry Pi - мы увидим мигающий светодиод.

4.5. Используем I2C

Достаточно большое количество разнообразных устройств (экраны, датчики, АЦП) можно подключить к шине I2C. Но перед ее первым использованием, необходимо настроить Raspberry Pi.

Шаг-1. Запустить sudo raspi-config и активировать I2C, как показано на рисунке (это достаточно сделать только один раз):

После изменения настроек следует перезагрузить Raspberry Pi.

Шаг-2. Поставить программу i2c-tools, введя команду: sudo apt-get install i2c-tools

Теперь можно ввести команду и посмотреть доступные i2c-устройства:

sudo i2cdetect -y 1

Отобразится окно примерно такого вида:

Если ничего не было подключено, список будет пуст, иначе мы увидим номера подключенных устройств.

Шаг-3. Подключение устройства

Шина I2C использует 2 провода для передачи данных (пины “3” и “5” на Raspberry Pi), еще 2 будут нужны для “0” и питания. Пример для подключения I2C-дисплея показан на рисунке. Обратим внимание, что для питания устройства используется вывод “3.3В”.

После того как устройство подключено, следует еще раз набрать команду i2cdetect -y 1 и убедиться, что его адрес виден в списке. Без этого пытаться запустить какой-либо код бессмысленно.

4.6. Подключаем OLED-дисплей

Наличие дисплея безусловно актуально для многих устройств, так что и Raspberry Pi мы также не оставим без внимания. Тем более, что дисплей подойдет тот же самый, который мы уже рассматривали.

Подключим дисплей, как показано на предыдущей странице. Убедимся, что дисплей “виден” в системе, должен отображаться код 3С:

Теперь установим библиотеки, необходимые для работы дисплея. Введем следующие команды:

sudo apt-get install python-imaging python-smbus pillow

sudo apt-get install git

git clone https://github.com/adafruit/Adafruit_Python_SSD1306.git

На этом шаге будет создан каталог Adafruit_Python_SSD1306. Зайдем в него и запустим установку библиотек для Python:

cd Adafruit_Python_SSD1306

sudo python setup.py install

Все готово. Проверить работу дисплея можно, запустив программу stats.py, находящуюся в папке examples:

sudo python examples/stats.py

Если все было сделано правильно, дисплей покажет информацию о системе:

Рассмотрим пример использования такого дисплея:

from PIL import Image, ImageDraw, ImageFont

import Adafruit_SSD1306

import time

disp = Adafruit_SSD1306.SSD1306_128_64(rst=None, i2c_address=0x3C)

# disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST, i2c_address=0x3C)

disp.begin()

# Load default font.

font = ImageFont.load_default()

# Create blank image for drawing. '1' - monochrome 1-bit color

image = Image.new('1', (disp.width, disp.height))

draw = ImageDraw.Draw(image)

value = 0

while True:

# Clear screen

draw.rectangle((0,0,width,height), outline=0, fill=0)

draw.text((x, top), "Hello world", font=font, fill=255)

draw.text((x, top+8), "Value "+ str(value), font=font, fill=255)

disp.image(image)

disp.display()

time.sleep(0.5)

Разберем код подробнее. Директивы import подключают необходимые библиотеки. Затем мы создаем в памяти объект disp класса Adafruit_SSD1306.SSD1306_128_64 (либо 128_32, если мы имеем такой дисплей). i2c_address - это адрес дисплея. Функция ImageFont.load_default, как нетрудно догадаться из названия, загружает в память шрифт. Затем, с помощью функции Image.new мы создаем в памяти монохромное изображение-буфер, в которое будем рисовать данные. Подготовленное изображение выводится с помощью метода disp.image(), метод disp.display() обновляет картинку на экране. Такая технология называется “двойной буфер” (double buffer), изображение сначала формируется в памяти, и только затем обновляется, это позволяет избежать мерцания.