LINUX.ORG.RU

Вывод на текстовый экран с Raspberry Pi

 ,


0

1

Подключил текстовый 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[i]),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()

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

Контрастность

На 3-м выводе LCD должно быть около 1,4В иначе ничего показываться не будет. Часто заводят потенциометр и ним подкручивают, как на картинке http://2.bp.blogspot.com/-qnJrdHsKDDo/UrCD3bf1QcI/AAAAAAAAAnQ/TS4F4csSqqc/s16...

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