Дисплеи
Дисплеи
Мало того, что к Raspberry Pi можно подключить монитор,- - имеется еще множе ство различных устройств вывода, способных отображать текст, цифры или графи- ку, можно даже управлять целыми светодиодными панелями. Чтобы рассказать о каждом типе существующих дисплеев, пришлось бы уделить этому слишком много времени, так что в этой главе нам придется остановиться лишь на наиболее практичных и интересных дисплеях и некоторых согласующих устройствах.
Светодиодные ленты
RGB-светодиоды состоят из трех светоизлучающих диодов, объединенных в одном корпусе. Другой тип светодиодов, известный как адресуемый светодиод, также включает в свой корпус управляющую микросхему. Эта микросхема осуществляет управление интенсивностью свечения трех цветов светодиода с помощью ШИМ-модуляции, аналогично тому, как это делается с Arduino или Raspberry Pi. Следует отметить, что управляющая микросхема встроена непосредственно в сам светодиод.
Адресуемые светодиоды разработаны для управления большим количеством из них с использованием одного микроконтроллера или компьютера, таких как Arduino или Raspberry Pi. В магазине Adafruit можно приобрести адресуемые светодиоды, которые они называют NeoPixels (обратите внимание, что название NeoPixels используется довольно часто, особенно на сайтах и в описаниях других адресуемых светодиодов, не имеющих отношения к Adafruit). Самыми популярными из них являются адресуемые светодиоды типа WS2812. Они поддерживают стандарт последовательной передачи данных, что позволяет создавать длинные цепи из этих светодиодов для создания больших дисплеев. Кроме использования в качестве RGB-адресуемых светодиодов, светодиоды WS2812 также могут быть использованы как одноцветные светоизлучатели.
Иногда адресуемые светодиоды компонуются в форме матрицы, но их также можно приобрести в виде свернутой в рулон ленты, с которой можно отрезать светодиодную полоску нужной длины для вашего проекта (см. рисунок).
На рисунке 14.1 видно, что лента разделена на сегменты, подобно ленточному червю. По трем проводам с каждой стороны светодиода подводится заземление (GND) и напряжение 5 В (5V) для питания, а также последовательные данные D0, которые передаются от одного светодиода к другому по всей гирлянде. Иными словами, выход одного светодиода соединен с входом другого. Посередине сегментов проведена вертикальная черта, обозначающая место для отрезания светодиодной ленты, если необходимо укоротить ее.
Обратите внимание на стрелки на ленте, указывающие направление потока последовательных данных. В соответствии с этим направлением для управления светодиодами всегда следует подключаться к левой стороне ленты.
Адресуемые светодиоды разработаны для управления большим количеством из них с использованием одного микроконтроллера или компьютера, таких как Arduino или Raspberry Pi. В магазине Adafruit можно приобрести адресуемые светодиоды, которые они называют NeoPixels (обратите внимание, что название NeoPixels используется довольно часто, особенно на сайтах и в описаниях других адресуемых светодиодов, не имеющих отношения к Adafruit). Самыми популярными из них являются адресуемые светодиоды типа WS2812. Они поддерживают стандарт последовательной передачи данных, что позволяет создавать длинные цепи из этих светодиодов для создания больших дисплеев. Кроме использования в качестве RGB-адресуемых светодиодов, светодиоды WS2812 также могут быть использованы как одноцветные светоизлучатели.
Иногда адресуемые светодиоды компонуются в форме матрицы, но их также можно приобрести в виде свернутой в рулон ленты, с которой можно отрезать светодиодную полоску нужной длины для вашего проекта (см. рисунок).
На рисунке 14.1 видно, что лента разделена на сегменты, подобно ленточному червю. По трем проводам с каждой стороны светодиода подводится заземление (GND) и напряжение 5 В (5V) для питания, а также последовательные данные D0, которые передаются от одного светодиода к другому по всей гирлянде. Иными словами, выход одного светодиода соединен с входом другого. Посередине сегментов проведена вертикальная черта, обозначающая место для отрезания светодиодной ленты, если необходимо укоротить ее.
Обратите внимание на стрелки на ленте, указывающие направление потока последовательных данных. В соответствии с этим направлением для управления светодиодами всегда следует подключаться к левой стороне ленты.
Эксперимент: управление дисплеем из ленты RGB-светодиодов
Приобретая один-два метра светодиодной ленты, вы, вероятно, захотите попробовать ее на практике. Подключить ее к Arduino довольно просто (см. рисунок), но для подключения ленты к Raspberry Pi потребуется немного усилий.
Комплектующие
Для проведения этого эксперимента с Arduino потребуются следующие компоненты:
Адресуемая светодиодная лента WS2812
Три перемычки "папа-папа"
Поскольку логический вход светодиодов NeoPixels не совместим с логическими сигналами уровня 3 В, для эксперимента с Raspberry Pi потребуются дополнительные компоненты. Однако перед тем как предпринимать дополнительные усилия, стоит попробовать обойтись без преобразователя логического уровня, так как ваша светодиодная лента может работать нормально с логическими сигналами 3 В.
Тем не менее, для эксперимента с Raspberry Pi могут потребоваться следующие дополнительные компоненты:
400-точечная беспаечная макетная плата
R1, R2 Два резистора 470 Ом 0,25 Вт
Q1 МОП-транзистор 27000
01 Перемычки "мама-папа"
Обратите внимание, что для данного эксперимента использован маломощный МОП-транзистор 27000, так как он лучше справляется с высокочастотными последовательными данными по сравнению с 2N3904. Вы также можете использовать транзистор типа FQP30N06L, но его мощность будет избыточной для данного эксперимента.
Подключение Arduino
С одной стороны светодиодной ленты обычно имеется кабель с трехконтактным разъемом, подсоединенным к контактам GND, 5V и D0. Если такой разъем сохраняется, то для подключения его к макетной плате или Arduino можно использовать перемычки "мама-папа". Если разъема нет, вы можете аккуратно припаять провода к контактам GND, 5V и D0 на левом краю ленты.
Я использовал три перемычки "папа-папа", отрезав контакты с одной стороны и припаяв их к пяти светодиодам NeoPixel на ленте. Затем эти три контакта можно подключить непосредственно к Arduino, как показано на рисунке, причем контакт D0 светодиодной ленты должен быть подключен к контакту 19 на Arduino.
Потребление энергии адресуемых светодиодов
При увеличении яркости светодиодов NeoPixels до максимальной мощности они потребляют значительный ток (приблизительно 60 мА на каждый светодиод). Если у вас подключено пять светодиодов NeoPixels, это может привести к потреблению 300 мА, что может быть слишком большой нагрузкой для Arduino или Raspberry Pi. В таком случае вам, возможно, потребуется подключить внешний источник питания с напряжением 5 В к светодиодной ленте.
Программа для Arduino
Уважаемые сотрудники Adafruit разработали библиотеку для Arduino, которая значительно упрощает управление длинными цепочками адресуемых светодиодов. Вы можете загрузить эту библиотеку по следующей ссылке: [https://github.com/adafruit/Adafruit_NeoPixel](https://github.com/adafruit/Adafruit_NeoPixel) и установить ее в вашу среду Arduino.
Для проведения эксперимента с Arduino вам потребуется использовать скетч.
Давайте рассмотрим этот скетч подробнее, разбив его на пункты, которые описаны в комментариях:
1. Импортируйте библиотеку Adafruit NeoPixel.
2. Если вам нужно использовать другой контакт для управления светодиодами NeoPixel, отредактируйте эту часть кода.
3. Если у вас больше или меньше светодиодов в вашей цепочке NeoPixel, внесите изменения здесь. Обратите внимание, что вы должны учитывать энергопотребление, как описано ранее.
4. Инициализируйте библиотеку NeoPixel в соответствии с вашими настройками.
5. Начните отправку данных на дисплей.
6. Установите произвольный цвет для каждого пикселя, обновите дисплей и добавьте задержку в 1/10 секунды перед сменой цвета всех светодиодов. Теперь время для танцев в стиле диско!
7. Функция `setPixelColor` принимает два параметра: индекс пикселя, который нужно установить, и цвет, который представлен тремя значениями в диапазоне от 0 до 255 для каждого из трех цветовых каналов.
Эксперимент с Raspberry Pi:
Для подключения вашего Raspberry Pi к светодиодной ленте NeoPixel сначала попробуйте выполнить подключение без преобразователя уровня. Вот как это можно сделать:
1. С помощью перемычек "мама-мама" создайте следующие соединения:
- GND (светодиодной ленты NeoPixel) -> GND (Raspberry Pi)
- 5V (светодиодной ленты NeoPixel) -> 5V (Raspberry Pi)
- D0 (светодиодной ленты NeoPixel) -> GPIO 18 (Raspberry Pi)
На рисунке ниже показано подключение светодиодной ленты непосредственно к Raspberry Pi.
Перейдите к следующему разделу "Программа для Raspberry Pi" и попробуйте выполнить программу. Если светодиодная лента не светится и не отображает красочный многоцветный дисплей, вам, возможно, потребуется добавить преобразователь уровня, чтобы увеличить уровень сигнала с 3 В до 5 В.
Поднятие уровня сигнала с 3 В до 5 В:
Уровень сигнала 3 В на Raspberry Pi ниже ожидаемого уровня (high) для адресуемых светодиодов WS2812, который составляет 4 В. Схема, показанная на рисунке ниже, демонстрирует, как можно использовать МОП-транзистор для поднятия уровня сигнала до 5 В.
Побочным эффектом от такого смещения уровня является инвертирование выходного сигнала. То есть, когда на GPIO-контакте Raspberry Pi выставлен логически низкий уровень (low, 0 В), то на выходе для светодиодной ленты появится сигнал напряжением 5 В, а когда на GPIO-контакте Raspberry Pi выставлен высокий уровень (high, 3,3 В), то на выходе для светодиодной ленты появится сигнал напряжением 0 В.
К счастью, эта особенность может быть легко скорректирована в управляющей программе.
На рисунке показано преобразование уровня с 3 до 5 В.
На рисунке ниже показано подключение светодиодной ленты к Raspberry Pi с использованием преобразователя уровня.
Программа для Raspberry Pi
Программа для Raspberry Pi основана на предоставленном компанией Adafruit руководстве (см. https://learn.adafruit.com/neopixels-on-raspberry-pi). Однако библиотека языка С, на которую опирается руководство Adafruit, на момент подготовки книги была несовместима с Raspberry Pi 2.
К счастью для владельцев Raspberry Pi 2, Ричард Херст (Richard Hurst) создал версию программы, работающую с Raspberry Pi 2. Эта версия также совместима и с более ранними версиями Raspberry Pi. Для установки указанной библиотеки и необходимых программных пакетов воспользуйтесь командой:
$ sudo apt-get install build-essential python-dev git scons swig
Следующий этап нашей работы расходится с направлением, заданным в руководстве Adafruit, потому что вам нужно получить версию программы, исправленную для работы с Raspberry Pi 2. Извлеките измененный код NeoPixel из GitHub, используя следующую команду:
$ git clone https://github.com/richardghirst/rpi_ws281x.git
Измените в извлеченной из GitHub программе каталог, а затем произведите сборку кода на языке С, воспользовавшись следующей командой:
$ scons
По завершении компиляции кода на языке С вам нужно установить библиотеку Python, взаимодействующую с быстрым кодом на языке С, воспользовавшись следующей командой:
$ cd python
$ sudo python setup.py install
Загружаем и выполняем программу
Далее представлена версия программы, предназначенная для использования с инвертирующим преобразователем уровня. Давайте разберем некоторые ключевые моменты программы, обозначенные комментариями:
1. Импорт библиотеки NeoPixel.
2. Эти параметры установки не требуют изменений, если только вам необходимо использовать другой контакт для LED_PIN.
3. Основной цикл программы выполняет практически те же действия, что и его аналог для Arduino. Он генерирует произвольный цвет и применяет его к пикселю.
Комплектующие
Для проведения этого эксперимента с Arduino потребуются следующие компоненты:
Адресуемая светодиодная лента WS2812
Три перемычки "папа-папа"
Поскольку логический вход светодиодов NeoPixels не совместим с логическими сигналами уровня 3 В, для эксперимента с Raspberry Pi потребуются дополнительные компоненты. Однако перед тем как предпринимать дополнительные усилия, стоит попробовать обойтись без преобразователя логического уровня, так как ваша светодиодная лента может работать нормально с логическими сигналами 3 В.
Тем не менее, для эксперимента с Raspberry Pi могут потребоваться следующие дополнительные компоненты:
400-точечная беспаечная макетная плата
R1, R2 Два резистора 470 Ом 0,25 Вт
Q1 МОП-транзистор 27000
01 Перемычки "мама-папа"
Обратите внимание, что для данного эксперимента использован маломощный МОП-транзистор 27000, так как он лучше справляется с высокочастотными последовательными данными по сравнению с 2N3904. Вы также можете использовать транзистор типа FQP30N06L, но его мощность будет избыточной для данного эксперимента.
Подключение Arduino
С одной стороны светодиодной ленты обычно имеется кабель с трехконтактным разъемом, подсоединенным к контактам GND, 5V и D0. Если такой разъем сохраняется, то для подключения его к макетной плате или Arduino можно использовать перемычки "мама-папа". Если разъема нет, вы можете аккуратно припаять провода к контактам GND, 5V и D0 на левом краю ленты.
Я использовал три перемычки "папа-папа", отрезав контакты с одной стороны и припаяв их к пяти светодиодам NeoPixel на ленте. Затем эти три контакта можно подключить непосредственно к Arduino, как показано на рисунке, причем контакт D0 светодиодной ленты должен быть подключен к контакту 19 на Arduino.
Потребление энергии адресуемых светодиодов
При увеличении яркости светодиодов NeoPixels до максимальной мощности они потребляют значительный ток (приблизительно 60 мА на каждый светодиод). Если у вас подключено пять светодиодов NeoPixels, это может привести к потреблению 300 мА, что может быть слишком большой нагрузкой для Arduino или Raspberry Pi. В таком случае вам, возможно, потребуется подключить внешний источник питания с напряжением 5 В к светодиодной ленте.
Программа для Arduino
Уважаемые сотрудники Adafruit разработали библиотеку для Arduino, которая значительно упрощает управление длинными цепочками адресуемых светодиодов. Вы можете загрузить эту библиотеку по следующей ссылке: [https://github.com/adafruit/Adafruit_NeoPixel](https://github.com/adafruit/Adafruit_NeoPixel) и установить ее в вашу среду Arduino.
Для проведения эксперимента с Arduino вам потребуется использовать скетч.
Код: Выделить всё
#include <Adafruit_NeoPixel.h> // 1
const int pixelPin = 9; // 2
const int numPixels = 5; // 3
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(numPixels, pixelPin, NEO_GRB + NEO_KHZ800); // 4
void setup() {
pixels.begin(); // 5
}
void loop() {
for (int i = 0; i < numPixels; i++) { // 6
int red = random(255);
int green = random(255);
int blue = random(255);
pixels.setPixelColor(i, pixels.Color(red, green, blue)); // 7
pixels.show(); // 8
}
delay(100L);
}
1. Импортируйте библиотеку Adafruit NeoPixel.
2. Если вам нужно использовать другой контакт для управления светодиодами NeoPixel, отредактируйте эту часть кода.
3. Если у вас больше или меньше светодиодов в вашей цепочке NeoPixel, внесите изменения здесь. Обратите внимание, что вы должны учитывать энергопотребление, как описано ранее.
4. Инициализируйте библиотеку NeoPixel в соответствии с вашими настройками.
5. Начните отправку данных на дисплей.
6. Установите произвольный цвет для каждого пикселя, обновите дисплей и добавьте задержку в 1/10 секунды перед сменой цвета всех светодиодов. Теперь время для танцев в стиле диско!
7. Функция `setPixelColor` принимает два параметра: индекс пикселя, который нужно установить, и цвет, который представлен тремя значениями в диапазоне от 0 до 255 для каждого из трех цветовых каналов.
Эксперимент с Raspberry Pi:
Для подключения вашего Raspberry Pi к светодиодной ленте NeoPixel сначала попробуйте выполнить подключение без преобразователя уровня. Вот как это можно сделать:
1. С помощью перемычек "мама-мама" создайте следующие соединения:
- GND (светодиодной ленты NeoPixel) -> GND (Raspberry Pi)
- 5V (светодиодной ленты NeoPixel) -> 5V (Raspberry Pi)
- D0 (светодиодной ленты NeoPixel) -> GPIO 18 (Raspberry Pi)
На рисунке ниже показано подключение светодиодной ленты непосредственно к Raspberry Pi.
Перейдите к следующему разделу "Программа для Raspberry Pi" и попробуйте выполнить программу. Если светодиодная лента не светится и не отображает красочный многоцветный дисплей, вам, возможно, потребуется добавить преобразователь уровня, чтобы увеличить уровень сигнала с 3 В до 5 В.
Поднятие уровня сигнала с 3 В до 5 В:
Уровень сигнала 3 В на Raspberry Pi ниже ожидаемого уровня (high) для адресуемых светодиодов WS2812, который составляет 4 В. Схема, показанная на рисунке ниже, демонстрирует, как можно использовать МОП-транзистор для поднятия уровня сигнала до 5 В.
Побочным эффектом от такого смещения уровня является инвертирование выходного сигнала. То есть, когда на GPIO-контакте Raspberry Pi выставлен логически низкий уровень (low, 0 В), то на выходе для светодиодной ленты появится сигнал напряжением 5 В, а когда на GPIO-контакте Raspberry Pi выставлен высокий уровень (high, 3,3 В), то на выходе для светодиодной ленты появится сигнал напряжением 0 В.
К счастью, эта особенность может быть легко скорректирована в управляющей программе.
На рисунке показано преобразование уровня с 3 до 5 В.
На рисунке ниже показано подключение светодиодной ленты к Raspberry Pi с использованием преобразователя уровня.
Программа для Raspberry Pi
Программа для Raspberry Pi основана на предоставленном компанией Adafruit руководстве (см. https://learn.adafruit.com/neopixels-on-raspberry-pi). Однако библиотека языка С, на которую опирается руководство Adafruit, на момент подготовки книги была несовместима с Raspberry Pi 2.
К счастью для владельцев Raspberry Pi 2, Ричард Херст (Richard Hurst) создал версию программы, работающую с Raspberry Pi 2. Эта версия также совместима и с более ранними версиями Raspberry Pi. Для установки указанной библиотеки и необходимых программных пакетов воспользуйтесь командой:
$ sudo apt-get install build-essential python-dev git scons swig
Следующий этап нашей работы расходится с направлением, заданным в руководстве Adafruit, потому что вам нужно получить версию программы, исправленную для работы с Raspberry Pi 2. Извлеките измененный код NeoPixel из GitHub, используя следующую команду:
$ git clone https://github.com/richardghirst/rpi_ws281x.git
Измените в извлеченной из GitHub программе каталог, а затем произведите сборку кода на языке С, воспользовавшись следующей командой:
$ scons
По завершении компиляции кода на языке С вам нужно установить библиотеку Python, взаимодействующую с быстрым кодом на языке С, воспользовавшись следующей командой:
$ cd python
$ sudo python setup.py install
Загружаем и выполняем программу
Далее представлена версия программы, предназначенная для использования с инвертирующим преобразователем уровня. Давайте разберем некоторые ключевые моменты программы, обозначенные комментариями:
Код: Выделить всё
#!/usr/bin/env python
import time, random
from neopixel import * //1
# LED strip
LED_COUNT = 30 # Number of LED pixels. //2
LED_PIN = 18 # GPIO pin connected to the pixels (must support PWM!).
LED_FREQ_HZ = 800000 # LED signal frequency in hertz (usually 800khz)
LED_DMA = 5 # DMA channel to use for generating signal (try 5)
LED_BRIGHTNESS = 255 # Set to 0 for darkest and 255 for brightest
LED_INVERT = False # True to invert the signal (when using NPN transistor level shift)
# Initialize the display
strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS)
strip.begin()
while True: //3
for i in range(strip.numPixels()):
red = random.randint(0, 255)
green = random.randint(0, 255)
blue = random.randint(0, 255)
strip.setPixelColor(i, Color(red, green, blue))
strip.show()
time.sleep(0.1)
2. Эти параметры установки не требуют изменений, если только вам необходимо использовать другой контакт для LED_PIN.
3. Основной цикл программы выполняет практически те же действия, что и его аналог для Arduino. Он генерирует произвольный цвет и применяет его к пикселю.
Дисплеи I²C на органических светодиодах
Raspberry Pi можно подключить к любому монитору, будь то большой или маленький, при наличии разъемов HDMI или AV. Однако иногда требуется выводить всего несколько строк на экран. У Arduino Uno нет видеовыхода вообще, и в таких случаях может пригодиться небольшой дисплей, способный отображать графические изображения или несколько строк текста.
Небольшие дисплеи на основе органических светодиодов (OLED) имеют доступные цены, низкое энергопотребление и предоставляют четкое и хорошо читаемое изображение (см. рисунок ниже). Во многих потребительских товарах они заменяют жидкокристаллические дисплеи. OLED-дисплеи доступны как в монохромном, так и в цветном исполнении.
Наиболее распространенным типом OLED-дисплея является модуль, включающий в себя сам дисплей и управляющую микросхему на печатной плате. Обычно для управления используется микросхема SSD1306, которая имеет интерфейс I2C (произносится как "ай-ту-си") и требует всего два контакта для передачи данных и два контакта для питания.
Экраны таких дисплеев имеют небольшой размер и высокое разрешение, поэтому при использовании Arduino иногда может возникать дефицит памяти, если не предпринять соответствующие меры предосторожности.
Небольшие дисплеи на основе органических светодиодов (OLED) имеют доступные цены, низкое энергопотребление и предоставляют четкое и хорошо читаемое изображение (см. рисунок ниже). Во многих потребительских товарах они заменяют жидкокристаллические дисплеи. OLED-дисплеи доступны как в монохромном, так и в цветном исполнении.
Наиболее распространенным типом OLED-дисплея является модуль, включающий в себя сам дисплей и управляющую микросхему на печатной плате. Обычно для управления используется микросхема SSD1306, которая имеет интерфейс I2C (произносится как "ай-ту-си") и требует всего два контакта для передачи данных и два контакта для питания.
Экраны таких дисплеев имеют небольшой размер и высокое разрешение, поэтому при использовании Arduino иногда может возникать дефицит памяти, если не предпринять соответствующие меры предосторожности.
Эксперимент: Использование I²C-дисплея с Raspberry Pi
OLED-дисплеи с интерфейсом I²C могут использоваться как с Arduino, так и с Raspberry Pi. В этой главе рассмотрим эксперимент, в котором мы заменим светодиодный индикатор температуры на OLED-дисплей, отображающий текущую и заданную температуру.
Этот эксперимент в первую очередь предназначен для демонстрации того, как можно использовать дисплей с Raspberry Pi. Программа эксперимента выводит на экран текущее время и небольшую анимацию (см. рисунок ниже).
Компоненты
OLED-дисплей имеет четыре контакта, которые должны быть подключены напрямую к Raspberry Pi с использованием четырех проводов "мама-мама".
Убедитесь, что ваш OLED-дисплей имеет разрешение 128x64 пикселей и использует микросхему управления SSD1306. Некоторые дисплеи могут иметь дополнительные контакты на SSD1306, которые не используются, поэтому для упрощения задачи выбирайте дисплей с четырьмя контактами: GND (заземление), VCC (+5V), SDA (данные) и SCL (тактовый сигнал). Эксперимент можно провести как с монохромным, так и с цветным OLED-дисплеем.
Подключение к Raspberry Pi
Микросхема SSD1306 может работать при напряжении 3V или 5V. Поскольку ранние модели Raspberry Pi могли обеспечивать недостаточно тока при напряжении 3V, рекомендуется подключать микросхему к 5V.
Подключите провода следующим образом:
- Провод GND на OLED-дисплее соедините с GND на Raspberry Pi.
- Провод VCC на OLED-дисплее соедините с 5V на Raspberry Pi.
- Провод SCL (тактовые сигналы) на OLED-дисплее соедините с GPIO 3 на Raspberry Pi.
- Провод SDA (данные) на OLED-дисплее соедините с GPIO 2 на Raspberry Pi.
Программа для Raspberry Pi
Если ваша Raspberry Pi еще не настроена для работы с интерфейсом I²C, обратитесь к разделам ранее и выполните настройку, как описано в разделе "Настройка I²C на Raspberry Pi".
Для работы с OLED-дисплеем вы можете воспользоваться библиотекой Python, разработанной Adafruit. Она хорошо работает с OLED-дисплеями, управляемыми микросхемой SSD1306, независимо от их производителя. Для установки этой библиотеки выполните следующие команды:
$ git clone https://github.com/adafruit/Adafruit-SS ... rduino.git
$ cd Adafruit_Python_SSD1306
$ sudo python setup.py install
Система координат дисплея
OLED-дисплеи представляют собой графические дисплеи, на которых можно рисовать фигуры и выводить текст. Для работы с ними необходимо указывать координаты элементов на экране. В библиотеке Adafruit используется система координат, где верхний левый угол экрана имеет координаты (0, 0), а нижний правый угол - (127, 63).
Программа для этого эксперимента:
Давайте рассмотрим ее по пунктам:
1. Импортируются два модуля из библиотеки OLED: `SSD1306`, который предназначен для работы с устройством, и `Image`, который используется для создания холста, на котором будут рисоваться фигуры и выводиться текст.
2. Также импортируется библиотека `PIL` (Python Imaging Library).
3. Создается переменная `device`, которая предоставляет доступ к OLED-дисплею. Значение `0x3C` - это адрес I²C-устройства OLED-дисплея. Этот адрес может различаться в зависимости от производителя дисплея, поэтому важно уточнить его в документации к вашему дисплею.
4. Указывается используемый шрифт высотой 24 пикселя, который будет использоваться для вывода времени на дисплей.
5. С помощью конструкции `with ... as` создается блок кода для вывода текста на экран.
6. В этом блоке рисуется фигура, представляющая собой анимацию игры "Pac-Man". Фигура имеет размер 30x30 пикселей и угол открытой челюсти меняется от -45° до 45°, что создает впечатление движения. Цвет фигуры устанавливается как 255, что соответствует белому цвету.
7. Переменной `x` прибавляется 10 на каждой итерации, что позволяет перемещать анимацию вправо.
8. Получается текущее время, преобразуется в строку и выводится на дисплей.
Запуск программы
Для запуска программы выполните следующую команду:
$ sudo python oled.py
Если на экране ничего не отображается, вероятно, проблема связана с неправильно указанным адресом I²C-устройства. Убедитесь в правильности адреса.
В данном примере используется функция `pieslice`, которая рисует круг с вырезанным куском. Вы также можете использовать другие функции для рисования различных графических элементов. Дополнительные примеры и функции можно найти на сайте http://effbot.org/imagingbook/imagedraw.htm. Попробуйте разные варианты, чтобы оживить свой OLED-дисплей!
Этот эксперимент в первую очередь предназначен для демонстрации того, как можно использовать дисплей с Raspberry Pi. Программа эксперимента выводит на экран текущее время и небольшую анимацию (см. рисунок ниже).
Компоненты
OLED-дисплей имеет четыре контакта, которые должны быть подключены напрямую к Raspberry Pi с использованием четырех проводов "мама-мама".
Убедитесь, что ваш OLED-дисплей имеет разрешение 128x64 пикселей и использует микросхему управления SSD1306. Некоторые дисплеи могут иметь дополнительные контакты на SSD1306, которые не используются, поэтому для упрощения задачи выбирайте дисплей с четырьмя контактами: GND (заземление), VCC (+5V), SDA (данные) и SCL (тактовый сигнал). Эксперимент можно провести как с монохромным, так и с цветным OLED-дисплеем.
Подключение к Raspberry Pi
Микросхема SSD1306 может работать при напряжении 3V или 5V. Поскольку ранние модели Raspberry Pi могли обеспечивать недостаточно тока при напряжении 3V, рекомендуется подключать микросхему к 5V.
Подключите провода следующим образом:
- Провод GND на OLED-дисплее соедините с GND на Raspberry Pi.
- Провод VCC на OLED-дисплее соедините с 5V на Raspberry Pi.
- Провод SCL (тактовые сигналы) на OLED-дисплее соедините с GPIO 3 на Raspberry Pi.
- Провод SDA (данные) на OLED-дисплее соедините с GPIO 2 на Raspberry Pi.
Программа для Raspberry Pi
Если ваша Raspberry Pi еще не настроена для работы с интерфейсом I²C, обратитесь к разделам ранее и выполните настройку, как описано в разделе "Настройка I²C на Raspberry Pi".
Для работы с OLED-дисплеем вы можете воспользоваться библиотекой Python, разработанной Adafruit. Она хорошо работает с OLED-дисплеями, управляемыми микросхемой SSD1306, независимо от их производителя. Для установки этой библиотеки выполните следующие команды:
$ git clone https://github.com/adafruit/Adafruit-SS ... rduino.git
$ cd Adafruit_Python_SSD1306
$ sudo python setup.py install
Система координат дисплея
OLED-дисплеи представляют собой графические дисплеи, на которых можно рисовать фигуры и выводить текст. Для работы с ними необходимо указывать координаты элементов на экране. В библиотеке Adafruit используется система координат, где верхний левый угол экрана имеет координаты (0, 0), а нижний правый угол - (127, 63).
Программа для этого эксперимента:
Код: Выделить всё
#!/usr/bin/env python
from oled.device import ssd1306 # 1
from oled.render import canvas
from PIL import ImageFont # 2
import time
device = ssd1306(port=1, address=0x3C) # 3
large_font = ImageFont.truetype('FreeMono.ttf', 24) # 4
x = 0
while True:
with canvas(device) as draw: # 5
draw.pieslice((x, 30, x+30, 60), 45, -45, fill=255) # 6
x += 10 # 7
if x > 128:
x = 0
now = time.localtime() # 8
draw.text((0, 0), time.strftime('%H:%M:%S', now), font=large_font, fill=255)
time.sleep(0.1)
1. Импортируются два модуля из библиотеки OLED: `SSD1306`, который предназначен для работы с устройством, и `Image`, который используется для создания холста, на котором будут рисоваться фигуры и выводиться текст.
2. Также импортируется библиотека `PIL` (Python Imaging Library).
3. Создается переменная `device`, которая предоставляет доступ к OLED-дисплею. Значение `0x3C` - это адрес I²C-устройства OLED-дисплея. Этот адрес может различаться в зависимости от производителя дисплея, поэтому важно уточнить его в документации к вашему дисплею.
4. Указывается используемый шрифт высотой 24 пикселя, который будет использоваться для вывода времени на дисплей.
5. С помощью конструкции `with ... as` создается блок кода для вывода текста на экран.
6. В этом блоке рисуется фигура, представляющая собой анимацию игры "Pac-Man". Фигура имеет размер 30x30 пикселей и угол открытой челюсти меняется от -45° до 45°, что создает впечатление движения. Цвет фигуры устанавливается как 255, что соответствует белому цвету.
7. Переменной `x` прибавляется 10 на каждой итерации, что позволяет перемещать анимацию вправо.
8. Получается текущее время, преобразуется в строку и выводится на дисплей.
Запуск программы
Для запуска программы выполните следующую команду:
$ sudo python oled.py
Если на экране ничего не отображается, вероятно, проблема связана с неправильно указанным адресом I²C-устройства. Убедитесь в правильности адреса.
В данном примере используется функция `pieslice`, которая рисует круг с вырезанным куском. Вы также можете использовать другие функции для рисования различных графических элементов. Дополнительные примеры и функции можно найти на сайте http://effbot.org/imagingbook/imagedraw.htm. Попробуйте разные варианты, чтобы оживить свой OLED-дисплей!
Проект: добавления дисплея к проекту охладителя напитков
Проект: Добавление дисплея к охладителю напитков
Для понимания того, как работает OLED-дисплей в сочетании с Arduino, давайте возьмем за основу материал из раздела "Проект: термостатический охладитель напитков" и заменим зеленый светодиод, который используется для фиксации температурного режима охладителя, на OLED-дисплей. Этот дисплей будет отображать как текущую, так и заданную температуру (см. рисунок ниже).
Компоненты
Для этого проекта, помимо компонентов, использованных в разделе "Проект: термостатический охладитель напитков" (за исключением зеленого светодиода и резистора R3), вам понадобится OLED-дисплей, аналогичный тому, который использовался ранее в разделе "Эксперимент: использование модуля OLED-дисплея с Raspberry Pi" в этой главе, а также четыре проводника типа "мама-папа".
Подключение Arduino
Если вы еще не выполнили это ранее, соберите схему, описанную в разделе "Проект: термостатический охладитель напитков". В этом проекте вам не нужно добавлять зеленый светодиод и резистор R3.
OLED-дисплей можно подключить напрямую к Arduino, избегая использования макетной платы и уменьшая мешающие помехи. На рисунке ниже показана только новая часть проекта с OLED-дисплеем, подключенным к Arduino. При подключении проводов к выводам OLED-модуля, обратите внимание, чтобы не перепутать контакты 5V и GND.
Программа для Arduino
Как вы могли ожидать, для работы с OLED-дисплеем существует библиотека Arduino (https://github.com/adafruit/Adafruit_SSD1306). Поэтому вам нужно загрузить и установить эту библиотеку в вашей среде разработки Arduino.
Для этой версии охладителя используется почти та же программа, что и для варианта без дисплея. Изменения включают добавление следующих библиотек: `Adafruit_GFX.h` и `Adafruit_SSD1306.h`.
Переменная `display` определяется для обращения к библиотеке. Параметр `4` является фактическим номером контакта, используемого для подключения к контакту Enable дисплея (если он существует). В наших дисплеях контакта Enable нет, поэтому номер 4 не используется ни для чего другого в Arduino.
Adafruit_SSD1306 display(4);
Функция `setup()` включает следующую строку, которая инициализирует дисплей:
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
Функция `loop()` теперь вызывает новую функцию `updateDisplay()`, чтобы обновлять содержимое дисплея текущей температурой каждую секунду:
void loop() {
updateDisplay();
// Другие операции вашей программы
}
Функция `updateDisplay()` очищает экран, устанавливает размер текста и цвет, а затем выводит текущую и заданную температуры на дисплей:
Функция `readSetTempFromPot()` была чуть-чуть изменена, чтобы обновлять установленную температуру сразу же при изменении, без ожидания следующей секунды:
double readSetTempFromPot() {
static double oldTemp = 0;
int raw = analogRead(potPin);
double temp = map(raw, 0, 1023, minTemp, maxTemp);
if (oldTemp != temp) {
updateDisplay();
oldTemp = temp;
}
return temp;
}
Ключевое слово `static` перед определением `oldTemp` означает, что переменная будет сохранять свое значение между вызовами функции `readSetTempFromPot()`. Обе переменные, `temp` и `oldTemp`, имеют тип `double` (число с плавающей запятой двойной точности), так как этот тип используется в библиотеке DS18B20.
Теперь у вас есть программа, которая позволяет использовать OLED-дисплей в проекте охладителя напитков. При необходимости вы можете дополнить ее дополнительными функциями или улучшить интерфейс для отображения информации на дисплее.
Для понимания того, как работает OLED-дисплей в сочетании с Arduino, давайте возьмем за основу материал из раздела "Проект: термостатический охладитель напитков" и заменим зеленый светодиод, который используется для фиксации температурного режима охладителя, на OLED-дисплей. Этот дисплей будет отображать как текущую, так и заданную температуру (см. рисунок ниже).
Компоненты
Для этого проекта, помимо компонентов, использованных в разделе "Проект: термостатический охладитель напитков" (за исключением зеленого светодиода и резистора R3), вам понадобится OLED-дисплей, аналогичный тому, который использовался ранее в разделе "Эксперимент: использование модуля OLED-дисплея с Raspberry Pi" в этой главе, а также четыре проводника типа "мама-папа".
Подключение Arduino
Если вы еще не выполнили это ранее, соберите схему, описанную в разделе "Проект: термостатический охладитель напитков". В этом проекте вам не нужно добавлять зеленый светодиод и резистор R3.
OLED-дисплей можно подключить напрямую к Arduino, избегая использования макетной платы и уменьшая мешающие помехи. На рисунке ниже показана только новая часть проекта с OLED-дисплеем, подключенным к Arduino. При подключении проводов к выводам OLED-модуля, обратите внимание, чтобы не перепутать контакты 5V и GND.
Программа для Arduino
Как вы могли ожидать, для работы с OLED-дисплеем существует библиотека Arduino (https://github.com/adafruit/Adafruit_SSD1306). Поэтому вам нужно загрузить и установить эту библиотеку в вашей среде разработки Arduino.
Для этой версии охладителя используется почти та же программа, что и для варианта без дисплея. Изменения включают добавление следующих библиотек: `Adafruit_GFX.h` и `Adafruit_SSD1306.h`.
Код: Выделить всё
#include <OneWire.h>
#include <DallasTemperature.h>
#include <PID_v1.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
const double minTemp = 0.0;
const double maxTemp = 20.0;
double kp = 1500;
double ki = 50.0;
double kd = 0.0;
const int tempPin = 2;
const int coolPin = 9;
const int potPin = A0;
const long period = 1000; // >750
OneWire oneWire(tempPin);
DallasTemperature sensors(&oneWire);
Adafruit_SSD1306 display(4);
double setTemp = 0.0;
double measuredTemp = 0.0;
double outputPower = 0.0;
long lastSampleTime = 0;
PID myPID(&measuredTemp, &outputPower, &setTemp, kp, ki, kd, REVERSE);
void setup() {
pinMode(coolPin, OUTPUT);
Serial.begin(9600);
sensors.begin();
myPID.SetSampleTime(1000); // (4)
myPID.SetMode(AUTOMATIC);
display.begin(SSD1306_SWITCHCAPVCC, 0x3c);
}
void loop() {
long now = millis();
if (now > lastSampleTime + period) {
checkTemperature();
lastSampleTime = now;
}
setTemp = readSetTempFromPot();
}
void checkTemperature() {
measuredTemp = readTemp();
Serial.print(measuredTemp);
Serial.print(", ");
Serial.print(setTemp);
Serial.print(", ");
Serial.println(outputPower);
myPID.Compute();
analogWrite(coolPin, outputPower);
updateDisplay();
}
double readSetTempFromPot() {
static double oldTemp = 0;
int raw = analogRead(potPin);
double temp = map(raw, 0, 1023, minTemp, maxTemp);
if (oldTemp != temp) {
updateDisplay();
oldTemp = temp;
}
return temp;
}
double readTemp() {
sensors.requestTemperatures();
return sensors.getTempCByIndex(0);
}
void updateDisplay() {
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.print("Temp:");
display.println(measuredTemp);
display.print("Set: ");
display.println(setTemp);
display.display();
}
Adafruit_SSD1306 display(4);
Функция `setup()` включает следующую строку, которая инициализирует дисплей:
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
Функция `loop()` теперь вызывает новую функцию `updateDisplay()`, чтобы обновлять содержимое дисплея текущей температурой каждую секунду:
void loop() {
updateDisplay();
// Другие операции вашей программы
}
Функция `updateDisplay()` очищает экран, устанавливает размер текста и цвет, а затем выводит текущую и заданную температуры на дисплей:
Код: Выделить всё
void updateDisplay() {
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.print("Температура:");
display.println(measuredTemp);
display.print("Установка: ");
display.println(setTemp);
display.display();
}
double readSetTempFromPot() {
static double oldTemp = 0;
int raw = analogRead(potPin);
double temp = map(raw, 0, 1023, minTemp, maxTemp);
if (oldTemp != temp) {
updateDisplay();
oldTemp = temp;
}
return temp;
}
Ключевое слово `static` перед определением `oldTemp` означает, что переменная будет сохранять свое значение между вызовами функции `readSetTempFromPot()`. Обе переменные, `temp` и `oldTemp`, имеют тип `double` (число с плавающей запятой двойной точности), так как этот тип используется в библиотеке DS18B20.
Теперь у вас есть программа, которая позволяет использовать OLED-дисплей в проекте охладителя напитков. При необходимости вы можете дополнить ее дополнительными функциями или улучшить интерфейс для отображения информации на дисплее.