Mittwoch, 19. Februar 2020

Raspberry Pi - Adafruit Mini PiTFT 135x240 Color TFT Add-on


Das Mini-PiTFT Display von Adafruit bietet ein 240x135 Pixel großes IPS-Farbdisplay und wird per SPI-Port angesteuert. Es hat zwei taktile Tasten auf GPIO-Pins und auf der Unterseite gibt es einen Qwiic/STEMMA QT-Anschluss für I2C-Sensoren.


Für das Display gibt es einen Kernel-Treiber und eine Python-Bibliothek, so kann man sich eine Konsolenausgabe einrichten oder man kann sich nach belieben Bilder, Text mit der Python-Imaging-Bibliothek anzeigen lassen.



Installation und Python-Setup

Die Installation an sich ist relativ einfach, man steckt das Display auf die Pins des Raspberry Pi und installiert die folgenden Module, damit es angesprochen werden kann.

Python Installation of RGB Display Library
  • sudo apt-get install python3-pip
  • sudo pip3 install adafruit-circuitpython-rgb-display
  • sudo pip3 install --upgrade --force-reinstall spidev
DejaVu TTF Font
  • sudo apt-get install ttf-dejavu
Pillow Library
  • sudo apt-get install python3-pil
NumPy Library
  • sudo apt-get install python3-numpy
Anschließemd kann das folgende Demo Script "rgb_display_minipitfttest.py" ausgeführt werden.
  • sudo python3 rgb_display_minipitfttest.py
Wichtig: SPI-Port muss aktiviert sein!

Mit Hilfe von  raspi-config non-interactively bekommt man den SPI-Status:
  • sudo raspi-config nonint get_spi 
  • returns 0 (enabled) or 1 (disabled)

Aktivieren von SPI mit:
  • sudo raspi-config nonint do_spi 0

import digitalio
import board

from adafruit_rgb_display.rgb import color565
import adafruit_rgb_display.st7789 as st7789

# Configuration for CS and DC pins for Raspberry Pi
cs_pin = digitalio.DigitalInOut(board.CE0)
dc_pin = digitalio.DigitalInOut(board.D25)
reset_pin = None
BAUDRATE = 64000000   # The pi can be very fast!
# Create the ST7789 display:
display = st7789.ST7789(board.SPI(), cs=cs_pin, dc=dc_pin, rst=reset_pin, baudrate=BAUDRATE,
                        width=135, height=240, x_offset=53, y_offset=40)

backlight = digitalio.DigitalInOut(board.D22)
backlight.switch_to_output()
backlight.value = True
buttonA = digitalio.DigitalInOut(board.D23)
buttonB = digitalio.DigitalInOut(board.D24)
buttonA.switch_to_input()
buttonB.switch_to_input()

# Main loop:
while True:
    if buttonA.value and buttonB.value:
        backlight.value = False              # turn off backlight
    else:
        backlight.value = True               # turn on backlight
    if buttonB.value and not buttonA.value:  # just button A pressed
        display.fill(color565(255, 0, 0))    # red
    if buttonA.value and not buttonB.value:  # just button B pressed
        display.fill(color565(0, 0, 255))    # blue
    if not buttonA.value and not buttonB.value:      # none pressed
        display.fill(color565(0, 255, 0))    # green


Quelle:

 

Pin Belegung des Displays

  • 5.0V - Connected to the display backlight
  • 3.3V - Connected to the display power and also the STEMMA QT / Qwiic connector
  • GND - Ground for everything
  • SDA & SCL - I2C data for the STEMMA QT / Qwiic connector. Not used by buttons or display
  • GPIO22 - Used to turn the backlight on and off. If you never want to turn the backlight off, cut the small jumper on the bottom of the PiTFT to free up GPIO22
  • GPIO23 & GPIO24 - Connected to the two front buttons. These pins have 10K pullups to 3.3V so when the button is pressed, you will read a LOW voltage on these pins
  • SCK, MOSI, CE0 & GPIO25 - These are the display control pins. Note that MISO is not connected even though it is a SPI pin because you cannot read back from the display.

Not used: GPIO4, GPIO17, GPIO18, GPIO27

If you are using the 240x135 1.14" (small rectangular) Mini PiTFT, you can attach other hardware to the Pi on those pins if you use a stacking header - it will go through the 2x12 connector on the Mini PiTFT.

Montag, 3. Februar 2020

Nintendo Gameboy classic - Backlight Hintergrundbeleuchtung nachrüsten (DMG-01 Bivert Chip) ; fixing vertical lines

In diesem Artikel beschreibe ich, wie man bei seinem Gameboy classic (DMG-01) eine Hintergrundbeleuchtung nachrüsten kann und "tote Linien" (fixing vertical lines) repariert.


Kurz vor Weihnachten kam mir die Idee einen meiner zwei Gameboy classic mit einer Hintergrundbeleuchtung auszustatten. Kits zum Umrüsten finden sich zum Beispiel hier https://www.deadpanrobot.co.uk/backlight-kits-dmg oder auch bei Ebay.

Wichtig, es sollte außerdem ein Bivert-Mod neben dem "Backlight-Kit" hinzugeführt werden, damit der Kontrast erhöht wird. Insgesamt kostet ein Kit zum Umrüsten ca. 15 - 20 EUR.

Gameboy Werkzeug

Nin­tendo wollte damals offen­sicht­lich schon nicht, dass jeder den Gameboy einfach auf­schrauben kann. Man benötigt als erstes einen Tri­wings Schrau­bendreher (mit einem Kreuz aus drei, statt vier). Bei mir hat sich das folgende Set bewehrt:
Hinweis: Man sollte bei Bit­hal­tern darauf achten, dass sie auch ins Gehäuse passen.

 

Um in einem späteren Schritt Kontakte und Display zu reinigen, benötigen wir noch Wat­te­stäb­chen und Alko­hol (am besten Isopropylalkohol aus der Apotheke). Für die Schrau­ben im inneren des Gameboy benötigt man noch einen Kreuzschlitzschraubendreher (ist im obigen Set enthalten).


Gameboy öffnen

Es müs­sen als erstes 6 Schrau­ben (mit dem Tri­wings Schrau­bendreher) gelöst wer­den.


Wurden die Schrau­ben gelöst, lässt sich der Game­boy öffnen, aber Vorsicht die bei­den Gehäusehälf­ten mit einem Flach­band­ka­bel ver­bun­den.


Die Pla­tine mit dem LCD-Display (oben) ist mit 10 Schrau­ben (Kreuzschlitz) befestigt und wird zusätzlich durch Plas­tik­ha­ken gehalten. Jetzt kann die Pla­tine inkl. dem Laut­spre­cher (unten links) abge­ho­ben wer­den.

Die B und A-Buttons und das Steu­er­kreu­zes inkl. der Gummimatte kön­nen jetzt abge­nom­men wer­den. Der Start- und Select-Button besteht nur aus einer Gummimatte.
Auf der Unter­seite der Gummimatte befin­den sich schwarze Kon­takte, diese sollten jeweils am Knopf und auf der Pla­tine selber gerei­nigt wer­den!


Die Platine mit der CPU und dem Batteriefach (unten) lässt sich ähnlich schnell lösen


Gameboy reinigen

Nach dem Zerlegen, habe ich alles gereinigt (siehe auch oben Kontakte der Buttons).
Sind früher mal die Batterien ausgelaufen, sollte man auch die Halterungen des Batteriefachs abschmirgeln oder in Essigessenz einlegen. Das restliche Gehäuse habe ich mit Seifenwasser und etwas Desinfektionsmittel gereinigt. Wichtig, alle Teile sollten vor dem Zusammenbau trocken sein!


Da ich auch eine neue Displayscheibe installieren werden, habe ich den Kleber des Displayrahmens erwärmt, damit ich es entfernen konnte.


Gameboy tote Linien reparieren / fixing vertical lines

Schon in meiner Jugend hatten einige meiner Freunde das Problem, dass der Gameboy tote Linien im Display zeigte. Dies liegt in der Regel am Flachbandkabel des LCD-Display.

Als Erstes muss der schwarze Gummistreifen (inkl. dem transparente Klebestreifen) vom Flachbandkabel entfernt werden.

Jetzt ist wirklich Gedult gefragt! Mit einem Lötkolben muss über die betroffene Seite auf dem Flachbandkabel hin und her gerieben werden, damit das Kabel wieder Kontakt zum Display bekommt. Ein gutes Video dazu gibt es hier: https://youtu.be/0qiRlVokgXk


Anschließend muss der Gummistreifen wird angebracht werden.


Hintergrundbeleuchtung installieren / backlight Bivert-Mod

Damit die Hintergrundbeleuchtung installiert werden kann, muss zuerst die alte Polarisationsfolie vom LCD-Display entfernt werden. Dies ist ziemlich aufwendig und nicht gerade einfach, da das Display fest verlötet ist und man nach dem Lösen der zwei Schrauben nur sehr wenig Platz hat, um die Folie abzuziehen.

 

Am besten fängt man jeweils in den Ecken an und versucht ganz vorsichtig die Folien zu entfernen.


Hat man erfolgreich die Folien entfernt, sind in der Regel noch Klebereste auf dem Display. Diese müssen mit Isopropylalkohol vollständig entfernt werden.


Das zuvor gekaufte Set zum Umrüsten besteht aus einem weißen dünnen Backlight-Panel mit polarisierender Folie und einem Bivert-Modul.

 

Damit das Backlight-Panel installiert werden kann, habe ich unten rechts in den Rahmen eine kleine Führung für die Kabel eingeschnitten. Anschließend wurden die Kabel inkl. dem Kondensator auf der Platine verlötet. Wo genau man das machen muss, sieht man auf dem 2. Bild!

 

Damit die polarisierende Folie korrekt installiert wird, hält man sie am besten gegen einen weißen Bildschirm und dreht sie. Ist dunkel, dann muss man sie genauso vor das Backlight-Panel und hinter dem LCD-Display schieben.


Das Ergebnis kann man jetzt auf dem folgenden Bild sehen.


Damit noch einen besseren Kontrast erreicht, sollte man noch das Bivert-Modul auf der anderen Platine installieren. Hierdurch findet eine Farbumkehr statt. Aber Achtung, das lösen der Pins vom Connectorkabel Anschlusses ist nicht gerade einfach. Im 2. Bild sieht man, welche Lötpunkte man setzen muss.

 

Zum Schluss muss alles wie­der zusam­men­ge­baut wer­den :-) .

Samstag, 4. Januar 2020

Unit-Tets - Was ist automatisches Testen?

Der Zusatzaufwand für automatische Tests lohnt sich in der Regel schon nach wenigen Releases. Die Tests helfen den Entwicklern dabei Fehler im Voraus zu vermeiden und den Quellcode gut zu strukturieren.


Manuelles Testing

Das Testing von umgesetzten Anforderungen nimmt immer eine gewisse Menge Zeit in Anspruch. Oft werden hierbei Fehler übersehen um z.B. Zeit zu sparen oder es werden nicht alle Testfälle "durchgespielt".

Dieses "manuelle" Testing hat in der Regel weitere Releases zur Folge und der gesamte Test-Zyklus muss wiederholt werden. Dies kann dann für alle Beteiligten (Anforderer, Product Owner, Entwickler usw.) eine sehr stupide Tätigkeit werden. Hieraus ergibt sich die Empfehlung für die Einführung von automatischen Tests (Unit-Test).

Unit-Tests

Unit-Tests sind kleine Programme, welche die umgesetzten Anforderungen testen und prüfen, ob sie die Erwartungen der Anforderer erfüllen. Wichtig, jeder automatische Test sollte immer nur eine Eigenschaft einer Methode überprüfen (ein zu erwartender Output). Nichts desto trotz muss natürlich die jeweilige Methode vollständig (Verzweigungen, Sonderfälle usw.) getestet werden und so werden viele kleine Tests benötigt. Man spricht hierbei auch von vielen kleinen Einheiten (Units).
Die Tests müssen zusätzlich zu den Anforderungen programmiert werden, so fallen bei einer "testgetrieben Entwicklung / Test Driven Development" höhere Aufwände an. Das Verständnis dafür sollte vorher beim Auftraggeber eingeholt werden.

Idealerweise stehen die Testfälle vorab für die Entwickler zusätzlich zu den Anforderungen (in der Regel als User Story beschrieben) bereit. So besteht die Möglichkeit zuerst die Unit-Tests zu entwickeln und im Nachgang erfolgt die Umsetzung des eigentlichen Quellcodes für die Anforderungen. Dies hilft den Entwicklern den Quellcode besser zu strukturieren und intuitive Ideen für die Umsetzung zu entwickeln. Ein weiterer Vorteil ist, dass jede Implementierung (Eincheken/Commit) bereits auf Basis der Unit-Tests überprüft wird. So können einzelne Funktionen (Features) gezielt umgesetzt werden, ohne die komplette Umsetzung der Anforderungen in Gänze in einem Schritt entwickeln zu müssen.

Werden im Anschluss die umgesetzten Funktionen in ihrer gesamten Komplexität getestet, spricht man von Integrationstests.
Siehe hierzu auch meinen Beitrag vom März 2018 "Softwaretest bei agiler Entwicklung durch Testautomatisierung".

Fazit

Wurde das Projekt mit automatischen Tests ausgestattet, ist das Entwickeln effizienter und macht mehr Spaß!

So kann man zum Beispiel beim Refactoring schon sagen, welche Anpassungen am Quellcode notwendig sind, damit dieser korrekt funktioniert. Beim Einchecken einer Codeänderung in das Versionsverwaltungssystem werden die Tests gestartet und können den Commit z.B. automatisch zurückweisen (erstellen eines Issue), wenn diese fehlschlagen.

Gerade bei größeren Softwareentwicklungsprojekten zahlt sich der anfangs zusätzliche Aufwand im Nachgang wieder aus. Entwickler und Tester sparen mit jedem weiteren Release Zeit, das Refactoring wird optimiert und es treten zwangläufig weniger Fehler auf (im Vergleich zum manuellen Testing).