Mathe-Spiel für Anfänger
Raspberry Pi steuert LCD-Display über I2C-Bus
Bevor man auf dem Raspberry Pi den I2C-Bus nutzen kann, muss er, da er standardgemäß deaktiviert ist, aktiviert werden.
Die Beschreibung der Vorgehensweise findet man unter diesem Link:
In der folgenden Schaltung steuert Raspberry Pi über den I2C-Bus ein 2x16 LCD-Display an. Die Aufgabe ist unkompliziert.
Mit drei Tastern, S1, S2 und S3 werden drei verschiedene Text-Anzeigen auf dem Display generiert. Das Betätigen jeden dieser Taster verursacht
auf dem Display eine andere Anzeige.
Als Display kommt ein 2x16 LCD-Display mit dem HD44780 Controller (oder kompatibel) zum Einsatz. Auf dem Display kann man zwei
Textzeilen mit jeweils 16 Zeichen darstellen.
Display Frontansicht
Das Problem bei dem Display besteht darin, dass es keine I2C-Schnittstelle hat. Deswegen ist eine Erweiterung notwendig.
An das Display wird zusätzlich ein Interface-Modul mit dem Mikrochip PCF8574T angelötet. Auf diesem Weg wird das Display I2C-fähig
gemacht.
Interface Modul FC-113
Solche Module (FC-113) von unterschiedlichen Herstellern sind im Handel problemlos erhältlich. Die kleine Zusatzplatine kann
an das Display direkt angelötet werden. Sie stellt dann vier Anschlüsse, zwei für Spannungsversorgung und zwei für den I2C-Bus, zur
Verfügung. Mit einem Jumper kann die Hintergrundbeleuchtung ein- bzw. ausgeschaltet werden. Mit einem Poti lässt sich der Kontrast des
Displays einstellen. Das Modul, genau wie das LCD-Display, arbeitet mit 5 V.
Display mit Interface-Modul
Die weitere Schwierigkeit, die überwunden werden muss, ist die Pegelanpassung. Das LCD-Display arbeitet mit 5 V,
Raspberry Pi zieht es jedoch vor, mit 3,3 V zu arbeiten. Das sind immerhin ~30% Unterschied. Schicken wir zum Raspi 5V-Signale, kann er
beschädigt werden. Wir müssen also dafür sorgen, dass die Signale von Raspi von 3,3 V auf 5 V hochtransferiert werden. Die Signale von
Display zum Raspi von 5 V auf 3,3 V gedrückt werden. Hierzu kann man selbst eine Zwischenschaltung bauen oder einfach auf fertige Module
zurückgreifen. Genauso machen wir es hier. Die Verbindungen SDA und SCL vom Display-Interface zu Raspi werden getrennt, dazwischen
wird ein Level Converter geschaltet.
Level Konverter
Die Palette der Komponenten werden neben dem Raspi selbst drei einfache Taster abschließen.
Die Testschaltung wird nach diesem Plan erstellt:
Schaltplan
Fertig aufgebaute Testschaltung könnte dann so aussehen:
Testschaltung
Das Programm
In dem Programm wird die Bibliothek RPLCD verwendet, die davor installiert werden muss. Informationen über die Bibliothek
findet man im Internet unter der Adresse https://pypi.org/project/RPLCD/. Sie wird mit
sudo pip install RPLCD
Installiert. Zusätzlich wird die Bibliothek smbus oder smbus2 benötigt.Sie wird mit
sudo apt install python-smbus
oder
sudo pip install smbus2
installiert.
Der Programmablauf wird mit drei Tasten gesteuert. Die eigentlichen einfachen mathematischen Aufgaben (Addition, Multiplikation,
Division und Subtraktion) werden mit der Taster „3“ generiert. Sobald der Taster betätigt wird, erscheint auf dem Display eine neue
mathematische Aufgabe. Jetzt hat man Zeit, um die Aufgabe zu lösen. Mit erneutem Betätigen des Tasters erscheint auf dem Display die
richtige Lösung. So kann man sein Ergebnis mit der richtigen Lösung vergleichen. Auf diese Weise kann man auf spielerische Weise prüfen,
wie gut man im
Kopfrechnen ist. So die Art der Aufgaben als auch die Schwierigkeitsstufe können bei Bedarf geändert werden. Die Aufgaben werden mit
dem Zufallsgenerator (random) erzeugt.
Das Programm:
# -----------------------------------------------
# Mathe-Spiel für Anfänger
# Display 2x16, I2C-Bus
# Raspberry Pi 3B
# Python 3
# -----------------------------------------------
from RPLCD.i2c import CharLCD
import time
import random
import RPi.GPIO as GPIO
lcd=CharLCD('PCF8574',0x27)
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
GPIO.setup(12, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(16, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP)
def Scrolltext():
Satz1 = 'Mit Taster S3 werden dir Rechenaufgaben gestellt. '
Satz2 = 'Schau, ob du sie loesen kannst!'
SatzL = ' '
Satz = SatzL + Satz1 + Satz2 + SatzL
for i in range (1, len(Satz) - 16, 1):
lcd.cursor_pos =(1,0)
lcd.write_string(Satz [i:16+i])
time.sleep(0.4)
def Aufgabe():
a = random.randint (1,99)
b = random.randint (1,9)
c = random.randint (1,9)
d = random.randint (1,4)
lcd.cursor_pos =(1,0)
if (d == 1): #Addition
Ergebnis = a + b
lcd.write_string(str(a) + ' + ' + str(b) + ' = ')
if (d == 2): #Multiplikation
Ergebnis = b * c
lcd.write_string(str(b) + ' * ' + str(c) + ' = ')
if (d == 3): #Subtraktion
Ergebnis = a - c
lcd.write_string(str(a) + ' - ' + str(c) + ' = ')
if (d == 4): #Division
Ergebnis = c
lcd.write_string(str(b*c) + ' : ' + str(b) + ' = ')
time.sleep (1)
while True:
if GPIO.input(18) == GPIO.LOW:
lcd.write_string(str(Ergebnis))
time.sleep (1)
break
while True:
if GPIO.input(12) == GPIO.LOW:
lcd.clear()
lcd.cursor_pos =(0,0)
lcd.write_string('Wilkommen')
lcd.cursor_pos =(1,0)
lcd.write_string('bei Raspberry Pi')
if GPIO.input(16) == GPIO.LOW:
lcd.clear()
lcd.cursor_pos =(0,1)
lcd.write_string('Mathe - Spiele')
Scrolltext()
lcd.cursor_pos =(1,2)
lcd.write_string('Start mit S3')
if GPIO.input(18) == GPIO.LOW:
lcd.clear()
lcd.cursor_pos =(0,0)
lcd.write_string('Wieviel ist?')
Aufgabe()
# ----------------------------------------------------------