сайт для палких паяльників

WH1602D

Одни из самых популярных дисплеев – это символьные LCD дисплеи. Они могут быть разных размеров и отличаться количеством строк и символов. Самый популярный из них 1602 – то есть по 16 символов в двух строках. Ранее я писал о символьных дисплеях в статье Использование cимвольных жидкокристаллических LCD дисплеев. Пример на GCC (WinAVR) для Atmega 8. Они очень хорошо себя зарекомендовали. Подключим дисплей WH1602 к Raspberry Pi по следующей схеме:


WH1602

1 : GND
2 : 5V
3 : Contrast (0-5V)
4 : RS (Register Select) -> GPIO25
5 : R/W (Read Write) -> GND
6 : Enable or Strobe -> GPIO24
7 : Data Bit 0 – NOT USED
8 : Data Bit 1 – NOT USED
9 : Data Bit 2 – NOT USED
10: Data Bit 3 – NOT USED
11: Data Bit 4 -> GPIO23
12: Data Bit 5 -> GPIO17
13: Data Bit 6 -> GPIO27
14: Data Bit 7 -> GPIO22

Для работы со срочным дисплеем существует библиотека в проекте Adafruit-Raspberry-Pi-Python-Code. Клонируем его:

git clone https://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code.git

После этого надо в файле Adafruit_CharLCD.py проверить какие ноги используются. Дело в том, что в Raspberry Pi B rev2.0 заменили GPIO21 на GPIO27. Поэтому надо скорректировать номер ноги в соответствии с версией вашего Raspberry Pi.

cd ./Adafruit-Raspberry-Pi-Python-Code/Adafruit_CharLCD
nano Adafruit_CharLCD.py:

Заменяем (21 на 27) (у нас rev2.0). Было:

def __init__(self, pin_rs=25, pin_e=24, pins_db=[23, 17, 21, 22], GPIO=None):

Стало:

def __init__(self, pin_rs=25, pin_e=24, pins_db=[23, 17, 27, 22], GPIO=None):

Запускаем пример:

python Adafruit_CharLCD_IPclock_example.py

Наслаждаемся. Если хотите что-то проще, можно использовать этот скрипт:

#!/usr/bin/python
import RPi.GPIO as GPIO
import time

# Define GPIO to LCD mapping
LCD_RS = 25
LCD_E  = 24
LCD_D4 = 23
LCD_D5 = 17
LCD_D6 = 27
LCD_D7 = 22

# Define some device constants
LCD_WIDTH = 16    # Maximum characters per line
LCD_CHR = True
LCD_CMD = False

LCD_LINE_1 = 0x80 # LCD RAM address for the 1st line
LCD_LINE_2 = 0xC0 # LCD RAM address for the 2nd line

# Timing constants
E_PULSE = 0.00005
E_DELAY = 0.00005

def main():
  # Main program block

  GPIO.setmode(GPIO.BCM)       # Use BCM GPIO numbers
  GPIO.setup(LCD_E, GPIO.OUT)  # E
  GPIO.setup(LCD_RS, GPIO.OUT) # RS
  GPIO.setup(LCD_D4, GPIO.OUT) # DB4
  GPIO.setup(LCD_D5, GPIO.OUT) # DB5
  GPIO.setup(LCD_D6, GPIO.OUT) # DB6
  GPIO.setup(LCD_D7, GPIO.OUT) # DB7

  # Initialise display
  lcd_init()

  # Send some test
  lcd_byte(LCD_LINE_1, LCD_CMD)
  lcd_string("Raspberry Pi")
  lcd_byte(LCD_LINE_2, LCD_CMD)
  lcd_string("Model B")

def lcd_init():
  # Initialise display
  lcd_byte(0x33,LCD_CMD)
  lcd_byte(0x32,LCD_CMD)
  lcd_byte(0x28,LCD_CMD)
  lcd_byte(0x0C,LCD_CMD)
  lcd_byte(0x06,LCD_CMD)
  lcd_byte(0x01,LCD_CMD)

def lcd_string(message):
  # Send string to display

  message = message.ljust(LCD_WIDTH," ")

  for i in range(LCD_WIDTH):
    lcd_byte(ord(message[i]),LCD_CHR)

def lcd_byte(bits, mode):
  # Send byte to data pins
  # bits = data
  # mode = True  for character
  #        False for command

  GPIO.output(LCD_RS, mode) # RS

  # High bits
  GPIO.output(LCD_D4, False)
  GPIO.output(LCD_D5, False)
  GPIO.output(LCD_D6, False)
  GPIO.output(LCD_D7, False)
  if bits&0x10==0x10:
    GPIO.output(LCD_D4, True)
  if bits&0x20==0x20:
    GPIO.output(LCD_D5, True)
  if bits&0x40==0x40:
    GPIO.output(LCD_D6, True)
  if bits&0x80==0x80:
    GPIO.output(LCD_D7, True)

  # Toggle 'Enable' pin
  time.sleep(E_DELAY)
  GPIO.output(LCD_E, True)
  time.sleep(E_PULSE)
  GPIO.output(LCD_E, False)
  time.sleep(E_DELAY)

  # Low bits
  GPIO.output(LCD_D4, False)
  GPIO.output(LCD_D5, False)
  GPIO.output(LCD_D6, False)
  GPIO.output(LCD_D7, False)
  if bits&0x01==0x01:
    GPIO.output(LCD_D4, True)
  if bits&0x02==0x02:
    GPIO.output(LCD_D5, True)
  if bits&0x04==0x04:
    GPIO.output(LCD_D6, True)
  if bits&0x08==0x08:
    GPIO.output(LCD_D7, True)

  # Toggle 'Enable' pin
  time.sleep(E_DELAY)
  GPIO.output(LCD_E, True)
  time.sleep(E_PULSE)
  GPIO.output(LCD_E, False)
  time.sleep(E_DELAY)

if __name__ == '__main__':
  main()

RaspberryPi WH1602 RaspberryPi WH1602

Как видите, ничего сложного. Теперь разберемся с подсветкой дисплея. Дисплеи могут иметь подсветку разного цвета на разные вкусы, в некоторых моделях ее нет вообще. Типы подсветки тоже могут быть разные. Сейчас нас интересует ток, потребляемый элементами подсветки. Некоторые могут потреблять почти 500мА. Да! пол ампера! Поэтому, перед тем как включать подсветку дисплея, поинтересуйтесь потянет ли такой ток Ваш блок питания.

Программное управление подсветкой дисплея

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

WH1602_LIGHT

Оптопара защищает ноги Raspberry Pi от попадания на них напряжения, подаваемого на подсветку. Оно выше напряжения, которое может выдержать Raspberry Pi. Но сама оптопара не может коммутировать нужный нам ток, поэтому установлен более мощный транзистор. Конечно, транзистор должен выдерживать ток, потребляемый подсветкой, с некоторым запасом. В моем случае подсветка потребляет 420мА при напряжении 6 В, а транзистор выдерживает 1 А.

RaspberryPi WH1602 RaspberryPi WH1602

Теперь мы можем подключить вход оптопары к GPIO18 и программно включать и выключать подсветку. Можно подключить к другому выводу, но на GPIO18 выведен аппаратный ШИМ (PWM). PWM будем использовать чуть позже. Подробнее о PWM в статье Raspberry Pi – PWM и Сервопривод

Настраиваем GPIO18:

echo 18 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio18/direction

Включаем подсветку:

echo 1 > /sys/class/gpio/gpio18/value

Выключаем подсветку:

echo 0 > /sys/class/gpio/gpio18/value

Если нужно привлечь внимание к показаниям на дисплее, можно поморгать подсветкой. Например, когда какие-то значения достигают долгожданного уровня. Или наоборот опасного уровня.

Но, просто включать и выключать – это не интересно. Попробуем регулировать яркость подсветки. Это позволит настроить яркость подсветки по желанию или изменять автоматически, например, в зависимости от уровня освещенности. Регулировать яркость будем с помощью PWM. Для генерации PWM используем аппаратные возможности Raspberry Pi. Это уменьшит нагрузку на процессор. Подключим вход оптопары к ноге GPIO18 и настроим PWM. Мы будем использовать WiringPi. Установите WiringPi, если он у Вас еще не установлен:

sudo apt-get install git-core
git clone git://git.drogon.net/wiringPi
cd wiringPi
./build
cd ..

Настраиваем PWM:

gpio mode 1 pwm

Изменяя значение от 0 до 1023 устанавливаем яркость подсветки. На практике, наиболее заметные изменения яркости отмечены при значениях pwm от 0 до 80.

gpio pwm 1 10

Я снял небольшое демонстрационное видео, на котором отрабатывает скрипт плавного включения подсветки lcd_light_smooth_on.bash:

#!/bin/bash

#PWM
gpio mode 1 pwm

for (( c=1; c<=50; c++ ))
do
  gpio pwm 1 $c
  sleep 0.01
done

Скрипт плавного выключения подсветки: lcd_light_smooth_off.bash:

#!/bin/bash

#PWM
gpio mode 1 pwm

for (( c=50; c>0; c-- ))
do
  gpio pwm 1 $c
  sleep 0.01
done

gpio pwm 1 0

И общий тестовый скрипт lcd_light.bash:

#!/bin/bash

echo 18 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio18/direction
#ON
echo 1 > /sys/class/gpio/gpio18/value
sleep 3
#OFF
echo 0 > /sys/class/gpio/gpio18/value
sleep 2

for (( c=1; c<=5; c++ ))
do
  #BLINK
  echo 1 > /sys/class/gpio/gpio18/value
  sleep 0.1
  #OFF
  echo 0 > /sys/class/gpio/gpio18/value
  sleep 0.1
done

echo 18 > /sys/class/gpio/unexport

#PWM
gpio mode 1 pwm

gpio pwm 1 1000
sleep 1
gpio pwm 1 100
sleep 1
gpio pwm 1 50
sleep 1
gpio pwm 1 10
sleep 1
gpio pwm 1 5

sleep 2

for (( i=1; i<=5; i++ ))
do
  for (( c=1; c<=50; c++ ))
  do
    gpio pwm 1 $c
    sleep 0.01
  done

  for (( c=50; c>0; c-- ))
  do
    gpio pwm 1 $c
    sleep 0.01
  done
done

gpio unexportall

Команды настройки подсветки дисплея можно поместить в стартовые скрипты или прописать скрипт в crontab, чтобы вечером включать подсветку, а днем – выключать,  корректировать яркость по часам или в зависимости от освещения.

Успехов!

P.S. Если вы используете WH1602D. Я имею в виду именно букву D, и у Вас ничего не работает, не волнуйтесь. Загляните в документацию. У дисплеев с буквой D питание подается наоборот: PIN1-> 5V, PIN2-> GND.

Смотри также:

2 комментария: Raspberry Pi – LCD дисплей 1602

  • Nick говорить:

    Здравствуйте
    Использую Raspberry Pi в качестве NTP сервера.
    Вот ссылка на проект http://ntpi.openchaos.org/pps_pi/
    Возможно ли добавить в этот проект LCD индикатор для вывода на него информации о состоянии сервера?
    Спасибо

    • andre говорить:

      Добрый день. Думаю, возможно. Как добавить в сам проект не скажу, я не автор. Но если есть возможность получить состояние сервера с командной строки, результат можно обработать скриптом и вывести на дисплей. Скрипт запускать периодически или запустить как демон.

Translate
Архіви

© 2011-2017 Андрій Корягін, Кременчук - Київ, Україна