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.
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.
Buchtipp:
Der kleine Hacker: Programmieren für Einsteiger.
Mit Scratch schnell und effektiv programmieren lernen.
Links: amazon.de – Franzis-Verlag