LINUX.ORG.RU

Не выводит текст на дисплей

 ,


0

1

Возвращаюсь сюда со своим многострадальным экраном. Покурил мануалы, попробовал несколько вариантов схем подключения, причесал программу и все-таки заставил экран нормально инициализироваться: после запуска программы черные квадраты во второй строке исчезают. Но текст он по прежнему не выводит. Перед тем, как идти на форум, решил попробовать аналогичные программы, но написанные другими людьми. Результат тот же: черные сегменты исчезают, а текста нет. Одну из программ выкладываю ниже. Хотя раньше все эти программы вылетали с ошибками, а квадраты оставались: инициализации не было из-за неправильного подключения.

Экран: Winstar WH1602A-YGH-CTK на контроллере S6B0066U (это аналог HD44780, по идее проблем быть не должно).

Код программы:

#import
import RPi.GPIO as GPIO
import time
 
# Define GPIO to LCD mapping
LCD_RS = 7
LCD_E  = 8
LCD_D4 = 25
LCD_D5 = 24
LCD_D6 = 23
LCD_D7 = 18
 
# 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.0005
E_DELAY = 0.0005
 
def main():
  # Main program block
  GPIO.setwarnings(False)
  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()
 
  while True:
 
    # Send some test
    lcd_string("Rasbperry Pi",LCD_LINE_1)
    lcd_string("16x2 LCD Test",LCD_LINE_2)
 
    time.sleep(3) # 3 second delay
 
    # Send some text
    lcd_string("1234567890123456",LCD_LINE_1)
    lcd_string("abcdefghijklmnop",LCD_LINE_2)
 
    time.sleep(3) # 3 second delay
 
    # Send some text
    lcd_string("Raspberry",LCD_LINE_1)
    lcd_string("Pi",LCD_LINE_2)
 
    time.sleep(3)
 
  
def lcd_init():
  # Initialise display
  lcd_byte(0x33,LCD_CMD) # 110011 Initialise
  lcd_byte(0x32,LCD_CMD) # 110010 Initialise
  lcd_byte(0x06,LCD_CMD) # 000110 Cursor move direction
  lcd_byte(0x0C,LCD_CMD) # 001100 Display On,Cursor Off, Blink Off
  lcd_byte(0x28,LCD_CMD) # 101000 Data length, number of lines, font size
  lcd_byte(0x01,LCD_CMD) # 000001 Clear display
  time.sleep(E_DELAY)
 
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
  lcd_toggle_enable()
 
  # 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
  lcd_toggle_enable()
 
def lcd_toggle_enable():
  # Toggle enable
  time.sleep(E_DELAY)
  GPIO.output(LCD_E, True)
  time.sleep(E_PULSE)
  GPIO.output(LCD_E, False)
  time.sleep(E_DELAY)
 
def lcd_string(message,line):
  # Send string to display
 
  message = message.ljust(LCD_WIDTH," ")
 
  lcd_byte(line, LCD_CMD)
 
  for i in range(LCD_WIDTH):
    lcd_byte(ord(message[i]),LCD_CHR)
 
if __name__ == '__main__':
 
  try:
    main()
  except KeyboardInterrupt:
    pass
  finally:
    lcd_byte(0x01, LCD_CMD)
    lcd_string("Goodbye!",LCD_LINE_1)
    GPIO.cleanup()

Схема. Схема.

Ответ на: комментарий от Saunk

Подобрал постоянный резистор так, чтобы квадраты во второй строке были отчетливо видны, но в то же время дисплей не грелся. Пришлось поставить резистор меньше 470Ом, который рекомендует автор схемы. С резистором на 470Ом даже квадраты не показывает. Думаю, если квадраты видны, то и текст должен быть виден, разве нет? После запуска программы квадраты просто исчезают. Никаких ошибок не выдает.

CrazyNickname
() автор топика
Ответ на: комментарий от CrazyNickname

Там должен быть делитель, одним резистором получается хз что - напряжение зависит от сопротивления входа. На подобном LCD я могу так потенциометром накрутить контрастность, что все символы будут квадратами либо темными, либо еле заметными. А нормальный контраст где-то в промежутке - у меня получалось 1,4В на 3-м пине.

Saunk
()
Ответ на: комментарий от Saunk

Попробую собрать схему с переменным резистором.

p.s. Нашел сегодня на ютубе видео, где чувак собирает схему с одним постоянным резистором, похожую на мою. И у него все работает( https://www.youtube.com/watch?v=wUaQxLfZ2KA

Буду экспериментировать.

CrazyNickname
() автор топика
Ответ на: комментарий от CrazyNickname

Собрал вот эту схему. Настроил контрастность, при запуске квадраты не исчезают. Похоже что-то не так с инициализацией. Наверное все-таки из-за контроллера S6B0066U.

CrazyNickname
() автор топика
Ответ на: комментарий от CrazyNickname

Этот же скрипт у меня работал с HD44780, запускал от sudo. Если контроллер точно 44780-совместимый - проверить монтаж, перекачать начисто скрипт https://bitbucket.org/MattHawkinsUK/rpispy-misc/raw/master/python/lcd_16x2.py поправить под себя. Не работает - менять дисплей. Если все исправно, но не работает, проблема 100% в монтаже.

Saunk
()
Ответ на: комментарий от Saunk

Еще раз покурю даташит на дисплей и пересоберу схему. Скорее всего дело в контроллере S6B0066U. В даташит написано, что S6B0066U - близнец HD44780, но некоторые люди говорят, что порядок инициализации для них идентичен только в 8-битном режиме, а я работаю в 4-битном для экономии пинов и упрощения схемы.

CrazyNickname
() автор топика
Ответ на: комментарий от Saunk

Проблема была в том, что я долблюсь в шары и не заметил в даташите, что пины на дисплеях Winstar идут в порядке [15, 16, 1, 2, 3 ... 12, 13, 14], а я подключал как [1, 2, 3 ... 14, 15, 16], как на других. Почти месяц мучился из-за такой ерунды.

И да, контроллер S6B0066U все равно не является полным аналогом HD44780, ибо при каждом запуске программы он кроме моего нецензурного сообщения выводит еще пару-тройку других символов в рандомных частях дисплея. Об этой проблеме сообщают и другие люди, когда запускают экраны на этом контроллере в 4-битном режиме. В 8-битном все ок.

CrazyNickname
() автор топика
Ответ на: комментарий от CrazyNickname

Не факт, что проблема в программной совместимости. Если символы выводятся рандомно - проблемой может быть длинный шлейф, отсутствие подтягивающих резисторов. Вообще, я бы убрал GPIO.cleanup() в конце скрипта для начала, если на этих выводах ничего кроме LCD не сидит.

Saunk
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.