varik123

Members
  • Публикации

    3
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

О varik123

  • Звание
    Новенький

Электроника

  • Стаж в электронике
    Менее года
  1. Косяк был в коде инициализации. Переписал программу. #import import RPi.GPIO as GPIO import os import socket import fcntl import struct import time from time import gmtime, strftime, sleep directory = '/media/TRANSCEND' files = os.listdir(directory) images = filter(lambda x: x.endswith('.jpg'), files) # 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() i=0 GPIO.setmode(GPIO.BCM) GPIO.setup(21, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(16, GPIO.IN, pull_up_down=GPIO.PUD_UP) while True: try: if GPIO.input(21) == False: i=i+1 j=i+1 lcd = HD44780() lcd_string(images[i], LCD_LINE_1) lcd_string(images[j], LCD_LINE_2) if GPIO.input(16) == False: i=i-1 j=i+1 lcd = HD44780() lcd_string(images[i], LCD_LINE_1) lcd_string(images[j], LCD_LINE_2) sleep(0.12) except KeyboardInterrupt: exit() 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()
  2. В смысле к GND или к "пустым" дыркам на плате? Да, подключены к дыркам, как на схеме выше.
  3. Нужно с помощью Raspberry выводить на текстовый дисплей список файлов из определенной директории. И листать этот список с помощью тактовых кнопок. Дисплей Winstar WH1602A-YGH-CTK на контроллере S6B0066U (аналог HD44780). Дисплей подключил по этой схеме (в 4-х битном режиме): Тактовые кнопки подключал так: Написал пробную версию программы: при нажатии на одну кнопку на дисплей выводятся первые два файла, при нажатии на вторую - следующие два. Это должно выглядеть так: Но правильный список выводится не всегда. Почему-то иногда экран выводит чушь, типа этой В коде поигрался со значениями sleep и добился того, чтобы глюк появлялся как можно реже - примерно на каждом втором-третьем нажатии это выскакивает. Подозреваю, что проблема в том, что S6B0066U все-таки не полный аналог HD44780 вопреки документации (в интернете видел упоминания этой проблемы при подключении S6B0066U в 4-битном режиме. Код программы: #!/usr/bin/python import RPi.GPIO as GPIO import os from time import sleep directory = '/media/TRANSCEND' files = os.listdir(directory) images = filter(lambda x: x.endswith('.jpg'), files) class HD44780: def __init__(self, pin_rs=7, pin_e=8, pins_db=[25, 24, 23, 18]): self.pin_rs=pin_rs self.pin_e=pin_e self.pins_db=pins_db GPIO.setmode(GPIO.BCM) GPIO.setup(self.pin_e, GPIO.OUT) GPIO.setup(self.pin_rs, GPIO.OUT) for pin in self.pins_db: GPIO.setup(pin, GPIO.OUT) self.clear() def clear(self): """ Blank / Reset LCD """ self.cmd(0x33) # $33 8-bit mode self.cmd(0x32) # $32 8-bit mode self.cmd(0x28) # $28 8-bit mode self.cmd(0x0C) # $0C 8-bit mode self.cmd(0x06) # $06 8-bit mode self.cmd(0x01) # $01 8-bit mode def cmd(self, bits, char_mode=False): """ Send command to LCD """ sleep(0.001) bits=bin(bits)[2:].zfill(8) GPIO.output(self.pin_rs, char_mode) for pin in self.pins_db: GPIO.output(pin, False) for i in range(4): if bits[i] == "1": GPIO.output(self.pins_db[::-1][i], True) GPIO.output(self.pin_e, True) GPIO.output(self.pin_e, False) for pin in self.pins_db: GPIO.output(pin, False) for i in range(4,8): if bits[i] == "1": GPIO.output(self.pins_db[::-1][i-4], True) GPIO.output(self.pin_e, True) GPIO.output(self.pin_e, False) def message(self, text): """ Send string to LCD. Newline wraps to second line""" for char in text: if char == ' ': self.cmd(0xC0) # next line else: self.cmd(ord(char),True) if __name__ == '__main__': GPIO.setmode(GPIO.BCM) GPIO.setup(21, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(16, GPIO.IN, pull_up_down=GPIO.PUD_UP) while True: try: if GPIO.input(21) == False: lcd = HD44780() list=images[0] + " " + images[1] list=str(list) lcd.message(list) if GPIO.input(16) == False: lcd = HD44780() list=images[2] + " " + images[3] list=str(list) lcd.message(list) sleep(0.12) except KeyboardInterrupt: exit()