Allgemein | Bücher | OpenStreetMap | Softwaretipps | APN-Einstellungen der wichtigsten Mobilfunkanbieter | Raspberry Pi | Unsere Partner | Warum Handbücher? | Über uns / Datenschutz

Tag Archives: Maker

LCD-Display am Raspberry Pi mit Scratch steuern

Die aktuelle Raspbian-Version „Jessie“ bietet erstmals eine integrierte GPIO-Unterstützung für Scratch. Allerdings lassen sich damit bis jetzt nur digitale Pins ein- und ausschalten oder abfragen. Eine direkte Ansteuerung der bekannten HD44780-kompatiblen LCD-Module gibt es bisher nicht. Diese lässt sich aber über ein im Hintergrund laufendes Python-Programm leicht nachrüsten.

Die Kommunikation zwischen Python und Scratch erfolgt über das Modul scratch 0.0.1a das über die Kommandozeile nachinstalliert werden muss:

sudo pip install scratch --pre

Das LCD-Modul wird im 4-Bit-Modus an den GPIO-Pins angeschlossen. Wir verwenden ein einfaches zweizeiliges Modul ohne I²C-Schnittstelle.

display01_Steckplatine

Anschlussschema für das LCD-Modul am Raspberry Pi

Ein Python-Programm übernimmt die Steuerung des LCD-Displays und fragt in einer Endlosschleife die Ausgabe von Scratch ab. Das Modul scratch 0.0.1a liefert bei jeder Änderung einer Scratch-Variable oder bei einer „Sende an alle“-Nachricht in Scratch eine Datenstruktur zurück. Das Programm überprüft, ob diese die Felder ‚lcd0‘ oder ‚lcd1‘ enthält und schreibt dann deren Inhalte in die obere bzw. untere Zeile des Displays.

#!/usr/bin/python

import RPi.GPIO as GPIO
import time, scratch
s = scratch.Scratch()

LCD_RS = 7
LCD_E  = 8
LCD_D4 = 25
LCD_D5 = 24
LCD_D6 = 23
LCD_D7 = 18

GPIO.setmode(GPIO.BCM)
GPIO.setup(LCD_E,  GPIO.OUT)
GPIO.setup(LCD_RS, GPIO.OUT)
GPIO.setup(LCD_D4, GPIO.OUT)
GPIO.setup(LCD_D5, GPIO.OUT)
GPIO.setup(LCD_D6, GPIO.OUT)
GPIO.setup(LCD_D7, GPIO.OUT)

LCD_WIDTH = 16
LCD_LINE_1 = 0x80
LCD_LINE_2 = 0xC0
LCD_CHR = True
LCD_CMD = False
E_PULSE = 0.00005
E_DELAY = 0.00005
INIT  = 0.01
pause = 0.01

def lcd_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_byte(bits, mode):
  GPIO.output(LCD_RS, mode)
  GPIO.output(LCD_D4, bits&0x10==0x10)
  GPIO.output(LCD_D5, bits&0x20==0x20)
  GPIO.output(LCD_D6, bits&0x40==0x40)
  GPIO.output(LCD_D7, bits&0x80==0x80)
  lcd_enable()
  GPIO.output(LCD_D4, bits&0x01==0x01)
  GPIO.output(LCD_D5, bits&0x02==0x02)
  GPIO.output(LCD_D6, bits&0x04==0x04)
  GPIO.output(LCD_D7, bits&0x08==0x08)
  lcd_enable()

def lcd_string(message):
  message = message.ljust(LCD_WIDTH," ")
  for i in range(LCD_WIDTH):
    lcd_byte(ord(message[i]),LCD_CHR)

LCD_INIT = [0x33, 0x32, 0x28, 0x0C, 0x06, 0x01]
for i in LCD_INIT:
  lcd_byte(i,LCD_CMD)
  time.sleep(INIT)

try:
  while True:
    z = (s.receive())['sensor-update']
    lcd_byte(LCD_LINE_1, LCD_CMD)
    if z.has_key('lcd0'):
      lcd_string(z['lcd0'])
    lcd_byte(LCD_LINE_2, LCD_CMD)
    if z.has_key('lcd1'):
      lcd_string(z['lcd1'])
    time.sleep(pause)
except KeyboardInterrupt:
  GPIO.cleanup()

Das abgebildete Scratch-Programm zeigt eine einfache Digitaluhr auf dem LCD-Display.

Digitaluhr in Scratch mit LCD-Display

Digitaluhr in Scratch mit LCD-Display

Buchtipp:


Der kleine Hacker: Programmieren für Einsteiger.
Mit Scratch schnell und effektiv programmieren lernen.
Links: amazon.deFranzis-Verlag

Merken

Merken

Merken


Pollin LCD-I2C Modul am Raspberry Pi

Pinbelegung des Portexpanders PCF8574

Pinbelegung des Portexpanders PCF8574

Der Elektronikversand Pollin bietet ein preisgünstiges LCD-Modul mit I²C-Steuerung an. In Internetforen findet man diverse Fragen, dieses Modul mit dem Raspberry Pi zu betreiben. Die Antworten sind spärlich oder sehr umständlich.

Mein Artikel auf PCWelt.de zeigt eine einfache Lösung, dieses Modul mit Python am Raspberry Pi anzusteuern. Leider fehlt dort zum Verständnis das Anschlusschema des verwendeten Portexpanders PCF8574.

Der Quelltext des Programms ist bei PCWelt ebenfalls nur schwach zu erkennen und – da als Grafik dargestellt – auch nicht kopierbar.

Python-Script zur Steuerung des Pollin LCD-I2C Modul am Raspberry Pi:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import time, smbus, subprocess
bus = smbus.SMBus(1)

DEVICE     = 0x27 
LCD_WIDTH  = 16
LCD_LINE_1 = 0x80
LCD_LINE_2 = 0xC0
LCD_CHR = 1
LCD_CMD = 0
LCD_RS  = 0x10
LCD_E   = 0x40
E_PULSE = 0.00005
E_DELAY = 0.00005
pause = 2

def lcd_byte(bits, mode):
  bus.write_byte(DEVICE,LCD_RS*mode+(bits>>4)+LCD_E)
  time.sleep(E_PULSE)
  bus.write_byte(DEVICE,LCD_RS*mode)
  time.sleep(E_DELAY)
  bus.write_byte(DEVICE,LCD_RS*mode+(bits&0x0F)+LCD_E)
  time.sleep(E_PULSE)
  bus.write_byte(DEVICE,LCD_RS*mode)
  time.sleep(E_DELAY)

def lcd_string(message):
  message = message.ljust(LCD_WIDTH," ")
  for i in range(LCD_WIDTH):
    lcd_byte(ord(message[i]),LCD_CHR)

def lcd_anzeige(z1, z2):
  lcd_byte(LCD_LINE_1, LCD_CMD)
  lcd_string(z1)
  lcd_byte(LCD_LINE_2, LCD_CMD)
  lcd_string(z2)

LCD_INIT = [0x33, 0x32, 0x28, 0x0C, 0x06, 0x01]
for i in LCD_INIT:
  lcd_byte(i,LCD_CMD)

while True:
  zeile1 = time.asctime()
  zeile2 = "IP:" + subprocess.check_output(["hostname","-I"])
  lcd_anzeige(zeile1, zeile2)
  time.sleep(pause)

 

Allgemein | Bücher | OpenStreetMap | Softwaretipps | APN-Einstellungen der wichtigsten Mobilfunkanbieter | Raspberry Pi | Unsere Partner | Warum Handbücher? | Über uns / Datenschutz

Durch die weitere Nutzung der Seite stimmst du der Verwendung von Cookies zu. Weitere Informationen

Die Cookie-Einstellungen auf dieser Website sind auf "Cookies zulassen" eingestellt, um das beste Surferlebnis zu ermöglichen. Wenn du diese Website ohne Änderung der Cookie-Einstellungen verwendest oder auf "Akzeptieren" klickst, erklärst du sich damit einverstanden.

Schließen