- В завершении работы программы, функция 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), изображение сначала формируется в памяти, и только затем обновляется, это позволяет избежать мерцания.