treedy
Posts: 12
Joined: Thu Oct 15, 2015 2:47 pm

Текстовый экран 16x2

Fri Feb 19, 2016 3:35 pm

Подключил текстовый LCD по схеме представленной ниже. Как положено загораются нижние сегменты в виде закрашенных квадратов и на этом все. На запуск программы из терминала по рутом никак не реагирует. Если запускать через Python, то пишет ошибку
Traceback (most recent call last):
File "/home/pi/Desktop/lcd.py", line 107, in <module>
main()
File "/home/pi/Desktop/lcd.py", line 36, in main
GPIO.setup(DISPLAY_E, GPIO.OUT)
RuntimeError: No access to /dev/mem. Try running as root!

Экспериментировал с доской, резисторами и с пинами (в том числе и в коде). Вот уже почти месяц бьюсь над таким пустяком. Нужно выводить на экран частоту ЦП и температуру.

Код программы:
import time
import RPi.GPIO as GPIO
import os

DISPLAY_RS = 7
DISPLAY_E = 8
DISPLAY_DATA4 = 25
DISPLAY_DATA5 = 24
DISPLAY_DATA6 = 23
DISPLAY_DATA7 = 18

DISPLAY_WIDTH = 16
DISPLAY_LINE_1 = 0x80
DISPLAY_LINE_2 = 0xC0
DISPLAY_CHR = True
DISPLAY_CMD = False
E_PULSE = 0.00005
E_DELAY = 0.00005

def get_cpu_temp():
tempFile = open("/sys/class/thermal/thermal_zone0/temp")
cpu_temp = tempFile.read()
tempFile.close()
return float(cpu_temp)/1000

def get_cpu_speed():
tempFile = open("/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq")
cpu_speed = tempFile.read()
tempFile.close()
return float(cpu_speed)/1000


def main():
GPIO.setmode(GPIO.BCM)
GPIO.setup(DISPLAY_E, GPIO.OUT)
GPIO.setup(DISPLAY_RS, GPIO.OUT)
GPIO.setup(DISPLAY_DATA4, GPIO.OUT)
GPIO.setup(DISPLAY_DATA5, GPIO.OUT)
GPIO.setup(DISPLAY_DATA6, GPIO.OUT)
GPIO.setup(DISPLAY_DATA7, GPIO.OUT)

display_init()


lcd_byte(DISPLAY_LINE_1, DISPLAY_CMD)
lcd_string("CPU Temp: " + str(round(get_cpu_temp(), 2)))
lcd_byte(DISPLAY_LINE_2, DISPLAY_CMD)
lcd_string("CPU Speed: " + str(round(get_cpu_speed(), 2)))

GPIO.cleanup()




def display_init():
lcd_byte(0x33,DISPLAY_CMD)
lcd_byte(0x32,DISPLAY_CMD)
lcd_byte(0x28,DISPLAY_CMD)
lcd_byte(0x0C,DISPLAY_CMD)
lcd_byte(0x06,DISPLAY_CMD)
lcd_byte(0x01,DISPLAY_CMD)

def lcd_string(message):
message = message.ljust(DISPLAY_WIDTH," ")
for i in range(DISPLAY_WIDTH):
lcd_byte(ord(message),DISPLAY_CHR)

def lcd_byte(bits, mode):
GPIO.output(DISPLAY_RS, mode)
GPIO.output(DISPLAY_DATA4, False)
GPIO.output(DISPLAY_DATA5, False)
GPIO.output(DISPLAY_DATA6, False)
GPIO.output(DISPLAY_DATA7, False)
if bits&0x10==0x10:
GPIO.output(DISPLAY_DATA4, True)
if bits&0x20==0x20:
GPIO.output(DISPLAY_DATA5, True)
if bits&0x40==0x40:
GPIO.output(DISPLAY_DATA6, True)
if bits&0x80==0x80:
GPIO.output(DISPLAY_DATA7, True)
time.sleep(E_DELAY)
GPIO.output(DISPLAY_E, True)
time.sleep(E_PULSE)
GPIO.output(DISPLAY_E, False)
time.sleep(E_DELAY)
GPIO.output(DISPLAY_DATA4, False)
GPIO.output(DISPLAY_DATA5, False)
GPIO.output(DISPLAY_DATA6, False)
GPIO.output(DISPLAY_DATA7, False)
if bits&0x01==0x01:
GPIO.output(DISPLAY_DATA4, True)
if bits&0x02==0x02:
GPIO.output(DISPLAY_DATA5, True)
if bits&0x04==0x04:
GPIO.output(DISPLAY_DATA6, True)
if bits&0x08==0x08:
GPIO.output(DISPLAY_DATA7, True)
time.sleep(E_DELAY)
GPIO.output(DISPLAY_E, True)
time.sleep(E_PULSE)
GPIO.output(DISPLAY_E, False)
time.sleep(E_DELAY)

if __name__ == '__main__':
main()
Attachments
Raspberry Pi 16x2 LCD HD44780.png
Raspberry Pi 16x2 LCD HD44780.png (42.63 KiB) Viewed 2476 times
IMG_20160218_204829 — копия.jpg
IMG_20160218_204829 — копия.jpg (60.06 KiB) Viewed 2476 times
IMG_20160218_204746 — копия.jpg
IMG_20160218_204746 — копия.jpg (60.72 KiB) Viewed 2476 times

vladnt
Posts: 78
Joined: Sun Feb 21, 2016 10:16 am

Re: Текстовый экран 16x2

Sun Feb 21, 2016 10:19 am

Квадраты остаются черные на экране ?

treedy
Posts: 12
Joined: Thu Oct 15, 2015 2:47 pm

Re: Текстовый экран 16x2

Wed Feb 24, 2016 7:06 pm

vladnt wrote:Квадраты остаются черные на экране ?
Да. В нижней строке.

vladnt
Posts: 78
Joined: Sun Feb 21, 2016 10:16 am

Re: Текстовый экран 16x2

Thu Feb 25, 2016 6:19 pm

Если квадраты остаются, возможно инициализация экрана не проходит.
Еще желательно резистор переменный поставить (делитель). Может это контрастность высокая, такая засветка получается.
parlcd00.png
Пример подключения.
parlcd00.png (1.97 KiB) Viewed 2332 times
Под рутом нет ошибок ? Я правильно понял.
Надо точную модель дисплея, что на нем написано ? Распиновка может отличатся у разных дисплеев.
Лучше фотку дисплея покрупнее.

vladnt
Posts: 78
Joined: Sun Feb 21, 2016 10:16 am

Re: Текстовый экран 16x2

Thu Feb 25, 2016 8:10 pm

Код сам писал ?
"Покурил" код проги вроде инициализация похожа, но E_DELAY = 0.00005 мне кажется маловат, да и смысл было разносить с E_PULSE = 0.00005 они равны. Думаю надо увеличивать E_DELAY = 0.00010 экспериментально.
Квадраты должны исчезать после инициализации.
E_DELAY - это задержка между командами
E_PULSE - это какое время идет считывание с шины данных DISPLAY_DATA4 ...DATA7, в это время "1" на DISPLAY_E
З.Ы. Питон вообще не знаю ))) первый код смотрел ). А с дисплеем работал но с микроконтроллером, код писал на ASM.
в поисковик "hd44780 инициализация 4 бит", есть примеры на русском порядок инициализации.

Return to “Русский”