Search:
Menu Raspi / C-Berry
Information

Ansteuerung des C-Berry TFT Displays mit PYTHON

Beschreibung des TFT Displays

Dieses sehr schöne Grafik Farb Display wird mit einer C-Library ausgeliefert.
Die Frage war nun, ob es sich nicht auch mit PYTHON ansteuern läßt.
Um es vorweg zu nehmen, ja es geht ganz hervorragend auch mit PYTHON.

Herunterladen des Treibers auf den Pi

cd
wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.36.tar.gz
tar zxvf bcm2835-1.36.tar.gz

Anpassung des Treibers für den Raspberry Pi2

cd
sudo nano bcm2835-1.36/src/bcm2835.h

#define BCM2835_PERI_BASE               0x20000000
ändern in:
#define BCM2835_PERI_BASE               0x3F000000

Compilieren des Treibers

cd
cd bcm2835-1.36
./configure
make
sudo make check
sudo make install

Erster Test mit den C-Librarys des Displayherstellers

cd
wget http://admatec.de/sites/default/files/downloads/C-Berry.tar.gz
tar zxvf C-Berry.tar.gz
cd C-Berry/SW/tft_test
make
sudo ./tft_test

Eigener C-Code für die Ansteuerung aus PYTHON

Wir benötigen nun 4 kleine Programme um das Display aus PYTHON anzusteuern.

  • tft_init (Initialisierung des Displays)
  • tft_clear (Löschen des Displayinhalts)
  • tft_pwm (Einstellen der Hintergrund Helligkeit)
  • tft_bmp (Anzeigen einer BMP Grafikdatei)

tft_init C-Routine

/*##############################################################*/
/*   Reimar Barnstorf 7soft                                     */
/*##############################################################*/

#include <bcm2835.h>
#include <stdio.h>
#include <stdint.h>
#include <time.h>
#include "tft.h"
#include "RAIO8870.h"
#include "bmp.h"

int main( int argc, char *argv[] )
{
   if (!bcm2835_init())
   return 1;

   TFT_init_board();
   TFT_hard_reset();
   RAIO_init();
   return 0;
}

tft_clear C-Routine

/*##############################################################*/
/*   Reimar Barnstorf                                           */
/*##############################################################*/

#include <bcm2835.h>
#include <stdio.h>
#include <stdint.h>
#include <time.h>
#include "tft.h"
#include "RAIO8870.h"
#include "bmp.h"

int main( int argc, char *argv[] )
{
   if (!bcm2835_init())
   return 1;

   // rectangle
   Draw_Square(0, 0, 319, 239);
   Text_Foreground_Color( COLOR_BLACK );
   RAIO_StartDrawing( SQUARE_FILL );

   return 0;
}

tft_pwm C-Routine

/*##############################################################*/
/*   Reimar Barnstorf                                           */
/*##############################################################*/

#include <bcm2835.h>
#include <stdio.h>
#include <stdint.h>
#include <time.h>
#include "tft.h"
#include "RAIO8870.h"
#include "bmp.h"

int main( int argc, char* argv[] )
{
   uint8_t pwm = atoi(argv[1]);
   if (!bcm2835_init())
   return 1;

   RAIO_SetBacklightPWMValue(pwm);
   return 0;
}

tft_bmp C-Routine

/*##############################################################*/
/*   Reimar Barnstorf                                           */
/*##############################################################*/

#include <bcm2835.h>
#include <stdio.h>
#include <stdint.h>
#include <time.h>
#include "tft.h"
#include "RAIO8870.h"
#include "bmp.h"

int main( int argc, char *argv[] )
{
   uint16_t picture[1][ PICTURE_PIXELS ];

   if (!bcm2835_init())
   return 1;

   // depict a BMP file
   // ---------------------------------------------
   Read_bmp2memory ( argv[1], &picture[0][ PICTURE_PIXELS-1 ] );
   RAIO_Write_Picture( &picture[0][0], PICTURE_PIXELS );
   return 0;
}

Ansteuerungs Programme installieren

Die 4 C-Programme müssen mit mit dem GCC Compiler und dem Befehl make compiliert werden.
Damit diese systemweit aufgerufen werden können, sollten diese in /usr/bin/ abgelegt sein.

PYTHON und die Library 'pygame'

Die Library 'pygame' ist eigentlich eine umfangreiche Sammlung von Grafikbefehlen, um Spiele mit PYTHON zu entwickeln.
Wir machen uns 'pygame' zu nutze, um die Gafiken für das Display zu rendern.

RAM-DISK für die Grafik Übergabe

Damit wir die SD-Karte bei der Übergabe der BMP-Grafiken nicht nutzen müssen, richten wir uns eine RAM-Disk ein.
Das geht zum einen schneller und schont die SD Karte.
Hierzu muss die Datei /etc/fstab mit folgendem Eintarg ergänzt werden:

tmpfs           /ram            tmpfs   size=500k         0       0

Danach ein Verzeichnis ram im Root erstellen.

mkdir /ram

Jetzt noch ein Automount, damit der Raspi nicht neu gestartet werden muss.

mount -a

Ein kleines PYTHON Demo Programm stellt eine digitale Uhr da.

Dieses Demo Programm veranschaulicht einen kleinen Teil der Möglichkeiten,
wobei 'pygame' eine Vielzahl von Grafik Operationen unterstützt,
so das man hiermit fast alles realisieren kann.
Die Tests haben gezeigt, das die Übertagung der Grafik etwa 0,1 Sekunde dauert.
#!/usr/bin/python
# -*- coding: utf-8 -*-

#****************************************************
#   Reimar Barnstorf www.7soft.de                   *
#****************************************************

# Python Imports
import os
import pygame
import sys
import time

pygame.init()
window = pygame.display.set_mode((320,240))
font0 = pygame.font.SysFont("droidsans", 21)
font1 = pygame.font.SysFont("droidsans", 83)
font2 = pygame.font.SysFont("freemono", 33)
font3 = pygame.font.SysFont("freemono", 26)
font2.set_italic(1)
font2.set_bold(1)
label0 = font0.render("www.7soft.de PYTHON-Uhr-Demo", 1, (255,0,0))
label3 = font3.render("C Reimar Barnstorf ", 1, (255,0,0))
rect1 = pygame.Rect(0, 62, 319, 70)
rect2 = pygame.Rect(0, 150, 319, 35)
os.system("tft_init")
os.system("tft_clear")
os.system("tft_pwm 80")
while True:
        try:
                window.fill(pygame.Color(0,0,0))
                pygame.draw.rect(window, pygame.Color(60,0,0), rect1)
                pygame.draw.rect(window, pygame.Color(0,200,200), rect2)
                pygame.draw.line(window, pygame.Color(0,0,255), (0,210), (319,210))
                pygame.draw.line(window, pygame.Color(0,0,255), (0,239), (319,239))
                lt = time.localtime()
                label1 = font1.render(time.strftime("%H:%M:%S ", lt), 1, (255,255,0))
                window.blit(label1, (0,50))
                label2 = font2.render(time.strftime("%a %d.%m.%Y ", lt), 1, (0,0,0))
                window.blit(label2, (0,150))
                window.blit(label0, (0,0))
                window.blit(label3, (10,210))
                pygame.image.save(window, "/ram/temp.bmp")
                os.system("tft_bmp /ram/temp.bmp")
                time.sleep(1)

        except:
                sys.exit()

Download aller Quellen

cd
wget http://www.7soft.de/uploads/Software/C-Berry-python.tgz
tar zxvf C-Berry-python.tgz

Start des Python Programms uhr.py

zunächst in das Verzeichnis C-Berry/SW/uhr wechseln um das Programm zu starten.

cd
cd C-Berry/SW/uhr
sudo python uhr.py

Andere Displays mit Framebuffer Unterstützung

Da es ja auch eine Vielzahl von anderen Displays gibt, welche direkt aus dem Kernel angesteuert werden können (Framebuffer Unterstützung), möchte ich auch diese Ansteuerung beschreiben.
In diesem Fall ist der Umweg über ein BMP Bild und den C-Hilfsroutinen nicht erforderlich.
Es reicht aus, den Framebuffer direkt aus Phyton zu beschreiben.
Der Phyton Quellcode muss dann folgendermaßen aussehen:
#!/usr/bin/python
import pygame
import sys
import os
import time

os.putenv('SDL_FBDEV', '/dev/fb1')
pygame.init()
window = pygame.display.set_mode((320,240))
font0 = pygame.font.SysFont("droidsans", 21)
font1 = pygame.font.SysFont("droidsans", 83)
font2 = pygame.font.SysFont("freemono", 33)
font3 = pygame.font.SysFont("freemono", 26)
font2.set_italic(1)
font2.set_bold(1)
label0 = font0.render("www.7soft.de PYTHON-Uhr-Demo", 1, (255,0,0))
label3 = font3.render("C Reimar Barnstorf ", 1, (255,0,0))
rect1 = pygame.Rect(0, 62, 319, 70)
rect2 = pygame.Rect(0, 150, 319, 35)
while True:
        try:
                window.fill(pygame.Color(0,0,0))
                pygame.draw.rect(window, pygame.Color(60,0,0), rect1)
                pygame.draw.rect(window, pygame.Color(0,200,200), rect2)
                pygame.draw.line(window, pygame.Color(0,0,255), (0,210), (319,210))
                pygame.draw.line(window, pygame.Color(0,0,255), (0,239), (319,239))
                lt = time.localtime()
                label1 = font1.render(time.strftime("%H:%M:%S ", lt), 1, (255,255,0))
                window.blit(label1, (0,50))
                label2 = font2.render(time.strftime("%a %d.%m.%Y ", lt), 1, (0,0,0))
                window.blit(label2, (0,150))
                window.blit(label0, (0,0))
                window.blit(label3, (10,210))
                pygame.display.update()
                time.sleep(1)

        except:
                sys.exit()


Viel Spaß bei der Entwicklung von eigenen Projekten mit diesen Quellcodes.
Ich bin schon mal gespannt darauf.