Linux

Es geht voran…

Testfoto der neuen NestCam. Nachdem heute endlich eine neue Infrarot-Kamera für den RaspberryPi bei mir eingetroffen ist, konnte ich gleich ein paar “Testbilder” aufnehmen. Das sieht schon mal gut aus.

Nun muss nur noch die passende Software installiert werden. In der alten Version hat die Kamera ja stur jede Minute ein Bild aufgenommen. Und wenn dann mal wirklich kurz ein Piepmatz im Kasten war, war das ziemlich genau immer dann, wenn die Kamera gerade in ihrer Ruhephase war :o. Logisch, dass dann außer dem leeren Kasten meistens nichts zu sehen war.

Diesmal soll die Kamera mit einer automatischen Bewegungserkennung arbeiten, d.h., die Software erkennt, wenn sich am Inhalt des Bildes etwas ändert und nimmt dann automatisch Bilder/Video auf. Das soll dann ebenfalls automatisch hier auf den Webserver hochgeladen werden.
Das alles einzurichten wird die Arbeit der nächsten Tage sein.

Und jetzt noch ein ḱleiner Nachtrag zum letzten Eintrag im Blog. Da hatte ich ja beschrieben, wie ich dank des 3D-Druckers und FreeCAD innerhalb einer Stunde zu einer passablen Halterung für meine Platine gekommen bin. An dieser Stelle möchte ich euch FreeCAD noch einmal empfehlen.
Screenshot Platinenhalterung in FreeCAD
Es ist eine super Software, die zwar immer noch ein paar kleine Macken hat, dafür aber für (fast) alle Betriebssysteme gratis zu haben ist und die keinen zwingt, sich alle paar Wochen irgendwo zu registrieren, damit mit man damit weiter arbeiten kann. Und es besteht auch kaum die Gefahr, dass der Anbieter der Software plötzlich beschließt, Geld für sein Produkt zu verlangen und man seine bisher erstellten Arbeiten nicht mehr mit dem Programm öffnen/bearbeiten kann.

Neues Wetter

Meine Wetterstation kommt so langsam in die Jahre. Ein Außensensor hat sich schon teilweise verabschiedet und misst bei der Luftfeuchtigkeit nur noch Mist und die Batteriekontakte des Kombisensors fangen über kurz oder lang auch an, sich einem ordentlichen Stromfluß zu verweigern.
Deshalb fiel mir der Entschluss nicht schwer, in eine neue Station zu investieren.
Die Wahl fiel auf die WS3080. Und weil ich nicht nur im Wohnzimmer sehen will, wie die aktuelle Wetterlage ist, läuft auf einem RaspberryPi weewx, eine super Software, die in Python geschrieben wurde, zur Auswertung/Anzeige der Wetterdaten per Webseite.

Momentan läuft das Ganze noch im ‘Beta-Status’. Der Raspberry ist zwar sehr sparsam und Ressourcen schonend, aber die vielen Schreibvorgänge in die Wetterdatenbank sind auf Dauer eher suboptimal für die SD-Speicherkarte, auf der das Betriebssystem des Raspi läuft. Außerdem braucht die Webseite noch etliches an Überarbeitung, angefangen bei der Übersetzung, dem Design und … also noch viel Arbeit.

Wer trotzdem schon mal schauen möchte: hier geht’s lang 😀

Update: C-Berry Text aufs Display

Vor einiger Zeit habe ich mich mit dem C-Berry-Display für den RaspberryPi beschäftigt und ein kleines Programm geschrieben, mit dem man relativ einfach Text auf das Display schreiben kann.
Nun ist etwas Zeit vergangen und ich habe das Programm um zwei Parameter erweitert. Man kann den Text und in fetter Schrift ausgeben und eine Hintergrundtransparenz einschalten. So kann man zum Beispiel ein erst Bild ins Display laden und darüber dann einen transparenten Text ausgeben.
Alles wie immer ohne Gewähr… ;-).

Benutzt wird das Programm wie folgt:

Wobei Transparenz und Bold entweder den Wert Null oder Eins haben muss. 0 -> Eigenschaft ausgeschaltet, 1 -> Eigenschaft eingeschaltet
Die anderen Parameter erkläre ich hier jetzt nicht nochmal, da hat sich nichts geändert. Schaut bei Bedarf einfach mal hier nach.

Hier der Quellcode:

NestCam

Nistkasteninnenaufnahme mit IR-Kamera
Ein weiteres Projekt geht in die heiße Phase. Den Winter über habe ich an einem Nistkasten mit Webcam gebastelt.

So etwas hatte ich schon länger vor, doch dank RaspberryPi und Infrarot-Kamera ist es nun Wirklichkeit geworden.

Dazu habe ich mir einen Nistkasten mit drei Brutkammern besorgt. Eine Brutkammer beherbergt den RaspberryPi, die zweite eine IR-Kamera und vier schaltbare Infrarot-LEDs zur “Ausleuchtung” der Szene.

Die dritte Brutkammer ist dann noch frei für kamerascheue Piepmätze. Schließlich will ja nicht jeder in nen BigBrother-Container einziehen. 😉

Die Kamera schießt alle zwei Minuten ein Bild, welches der Raspi dann auf den Webserver hochlädt. Die IR-LEDs werden dazu nur während der Aufnahme des Bildes eingeschaltet und sind ansonsten zwecks Energieeinsparung abgeschaltet.

Ein simples Foto alle paar Minuten ist natürlich nicht

 

sooo der Brüller. Deshalb werde ich mal schauen, ob ich es hinbekomme, aus den einzelnen Bildern tageweise einen Zeitrafferfilm zu erstellen.

Technisch ist das kein Problem, da muss ich nur etwas Zeit und Hirnschmalz investieren. Wobei ersteres natürlich meistens das Problem ist… ;-).

Da der Raspi als Speicher üblicherweise nur eine SD-Karte benutzt und diese bei vielen Schreibzugriffen bekanntlich nur eine ziemlich kurze Lebensdauer besitzen, habe ich zum Speichern der Fotos eine RAM-Disk mit 8MB Größe angelegt.

Dazu habe ich als root das Verzeichnis /mnt/ram erstellt und danach  die Datei /etc/fstab um die folgende Zeile ergänzt:

Danach ein

und die RAM-Disk steht ab sofort zur Verfügung. Natürlich lassen sich dort auch andere temporär genutzte Dateien mit vielen Schreibzugriffen ablegen, ich denke da z.B. an diverse Logdateien u.ä..

Leider nein

Ich bekam kürzlich die Anfrage, ob ich nicht die Skripte, die für das ‘Homepagewetter’ verantwortlich sind, hier online stellen kann.

Das wird in nächster Zeit aber nicht passieren. Erstens fehlt mir momentan die Zeit und die Lust dazu und zweitens bin ich kein Profiprogrammierer. Daher könnte es sein, dass meine Skripte sicherheitstechnisch nicht optimal gestaltet sind, obwohl ich mir beim Schreiben natürlich die größte Mühe gegeben habe, Lücken zu vermeiden.

Aus diesem Grund behalte ich die also lieber für mich.

C-Berry: Linien zeichnen

Recktecke und Kreise sind zwar schon recht hübsch, aber Linien braucht man auch noch ;-).

Benutzung:

 

Hier der Quellcode:

 

Und für alle, die zu faul zum Abtippen sind, hier das File zum Download: tft_line.c

C-Berry: Rechtecke zeichnen

Und weiter geht’s mit dem C-Berry-Display. Diesmal werden Rechtecke gezeichnet.

Genutzt wird der Befehl wie folgt:

x1,y1: Ecke  oben links, gültige Werte: x1 0…319, y1 0…239
x2,y2:  Ecke unten rechts, gültige Werte: x2 0…319, y2 0…239
color:  Farbe, mit der das Rechteck gezeichnet wird
modus:  0 – nicht gefüllt, 1 – gefüllt zeichnen

Auch hier ist es so, dass das Rechteck komplett gefüllt gezeichnet wird.

UPDATE:

Auch dieser Quellcode und die dazugehörige Datei zum Download sind aktualisiert. Es können jetzt auch ungefüllte Rechtecke gezeichnet werden.

 

Quellcode:

Und hier die Datei zum Runterladen.

 

C-Berry: Kreise zeichnen

Heute gibt es den nächsten Schnipsel C-Code rund um das C-Berry Display. Diesmal geht es um das Zeichnen von Kreisen.
Mit tft_circle lassen sich, wie schon geschrieben, Kreise auf das Display zeichnen.

Aufgerufen wird der Befehl mit den folgenden Parametern:

tft_circle position_x position_y radius füllfarbe modus

Dabei haben die einzelnen Parameter folgende Wertebereiche:

  • Position_X: 0…319
  • Position_Y: 0…239
  • Radius: 0…319
  • Füllfarbe: 0…255
  • Modus: 0 – nicht gefüllt, 1 – gefüllt zeichnen

In dieser Version lassen sich nur gefüllte Kreise zeichnen, will man einen einfachen Kreis ohne Füllfarbe, zeichnet man einfach einen zweiten Kreis an die gleiche Position, verkleinert den Radius und nutzt die aktuelle Hintergrundfarbe zum Zeichnen. Ich denke darüber nach, eine zweite Version zu schreiben, die das automatisch erledigt. Mal sehen… ;-).

Update!

Ich habe mich nochmal durch den Beispielcode gekämpft und gesehen, dass es da schon eine Option gibt, Kreise und Rechtecke gefüllt oder eben nicht gefüllt zu zeichnen. Sourcecode und Datei zum Download sind entsprechend aktualisiert.

Hier nun der Quelltext:

Und für alle, die zu faul zum Abtippen sind, hier das File zum Download.

 

Neues von der Himbeere

C-Berry-DisplayVor einiger Zeit erwarb ich für den Raspberry Pi ein TFT-Display namens C-Berry mit 320×240 Bildpunkten. Bislang lag das mehr oder weniger in der Ecke, weil die Ansteuerung nur über C-Programmierung zu machen ist, bzw. über einen Umweg mit Python. Wobei dort mithilfe von Pygame ein Bild erzeugt wird und dieses dann per Shell-Kommando zum Display übertragen wird. Nicht gerade effektiv…
 
Also setzte ich mich hin, schnappte mir ein Buch für C-Anfänger und wurschtelte mich durch die mit dem Display gelieferten Beispiele. Inzwischen bin ich soweit, dass ich mir eigene Shell-Befehle zum Zeichnen von Linien, Rechtecken und der Ausgabe von kurzen Textschnipseln gebastelt habe. Letzterer ist noch nicht perfekt, weil der Text am Ende einer Displayzeile zwar umgebrochen wird, aber das passiert eben auch mitten in einem Wort. Und das ist dann ja nicht so toll… ;-).
 
Weitere Befehle zum Initialisieren und Löschen des Displays, sowie der Einstellung der Helligkeit habe ich hier gefunden.
 
Natürlich will ich den ganzen Kram nun nicht nur für mich behalten. Vielleicht hilft es dem einen oder anderen bei der Umsetzung eigener Projekte. Außerdem wäre es ja cool, wenn es jemand noch verbessern und ich dabei auch etwas lernen kann.
 
Heute gibt es zunächst den Code-Schnipsel zum Anzeigen von Text auf dem C-Berry. Wenn ihr es kompilieren wollt, solltet ihr euch vorher die orginale Software von Admatec herunterladen und entpacken. Dort findet ihr alle benötigten Header-Dateien.
 
Ich habe mir für meine Programme ein eigenes Verzeichnis angelegt und alle benötigten Dateien einschließlich des makefiles dorthin kopiert. Den nachfolgenden Code müsst ihr dann in eine Datei (bei mir heißt sie tft_string.c) kopieren.
 


#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include "RAIO8870.h"
#include <string.h>
int main( int argc, char *argv[] )
{
char text[255];
strcpy(text,argv[6]);
int fsf=atoi(argv[1]);
int px=atoi(argv[2]);
int py=atoi(argv[3]);
int col_fg=atoi(argv[4]);
int col_bg=atoi(argv[5]);

if (!bcm2835_init()){
printf("tft_string: Error, check your display!\n");
exit(1);
}

if( argc < 1 || argc > 7){
printf("tft_string: Error, check arguments!\n");
printf("Use 'tft_string fontsize pos_x pos_y fg_color bg_color string'");
exit(1);
}

if( strlen(text) > 255){
printf("tft_string: Error, string too long! Limit: 255 chars \n");
exit(1);
}

if( col_fg < 0 || col_fg > 255){
printf("tft_string: Error, foregroundcolor out of range! Use 0...255! \n");
exit(1);
}

if(col_bg < 0 || col_bg > 255){
printf("tft_string: Error, backgroundcolor out oft range! Use 0...255!\n");
exit(1);
}

if( px < 0 || px > 319){
printf("tft_string: Error, pos_x out of range! pos_x: 0...319!\n");
exit(1);
}

if ( py < 0 || py > 239){
printf("tft_string: Error, pos_y out of range! pos_y: 0...239!\n");
exit(1);
}
if ( fsf < 0 || fsf > 20){
printf("tft_string: Error, bad fontsize! fs: 0...20!\n");
exit(1);
}

RAIO_SetFontSizeFactor ( fsf );

RAIO_print_text ( px, py, text, col_bg ,col_fg);


return 0;
}

 

Vor dem Kompilieren müsst ihr das orginale Makefile noch etwas bearbeiten, sonst rattert es Fehlermeĺdungen 😉
 

all: tft_string

tft_string: tft_string.o tft.o RAIO8870.o
gcc tft_string.o tft.o RAIO8870.o -lbcm2835 -lrt -o tft_string

tft.o: tft.c tft.h
gcc -Os -c tft.c

tft_string.o: tft_string.c
gcc -Os -c tft_string.c

RAIO8870.o: RAIO8870.c RAIO8870.h
gcc -Os -c RAIO8870.c

clean:
rm -rf *o tft_string

 
So sollte es anschließend aussehen. Danach wird das Progrämmchen mit “make” erstellt. Wenn alles ohne Fehlermeldung kompiliert wurde könnt ihr es gleich testen mit einem fröhlichen “Hallo Welt” :-).
 

sudo ./tft_string 0 10 10 255 0 "Hallo Welt"

 
Wichtig: alle Parameter nach dem “./tft_string” müssen durch Leerzeichen voneinander getrennt sein! Die Parameter bedeuten im einzelnen:

0 ------------ Schriftgröße, gültiger, von mir willkürlich festgelegter Wertebereich 0-20
10 10 -------- Cursorposition x y, gültiger Wertebereich: x 0-319, y 0-239
255 ---------- Schriftfarbe, hier Weiß, gültiger Wertebereich: 0-255
0 ------------ Hintergrundfarbe, hier Schwarz. Gültiger Wertebereich: 0-255
"Hallo Welt" - sollte klar sein. Es sind maximal 255 Zeichen möglich.

 
Damit der Befehl systemweit aufgerufen werden kann, kopiert ihr ihn (wenn er euch gefällt und funktioniert) nach /usr/bin.
 
Für Fragen, Anregungen und Hinweise nutzt bitte die Kommentarfunktion (solange sich der SPAM in Grenzen hält) oder das Kontaktformular!
Sollten hier irgendwo grobe Fehler vorhanden sein, denkt bitte dran: Ich bin C-Anfänger! Also bitte nicht hauen, sondern sagen, wie man es besser macht… 😉
 
Hier noch ein kleines Demo. Ein Shellscript, das die Uhrzeit auf das C-Berry schreibt, bestehend aus ganzen 8 Zeilen… 🙂
 

Stalk-Pi / 2

Foto: Infrarotaufnahme vom NistkasteninnerenHeute war es soweit. Nach einem Besuch auf dem Baumarkt des geringsten Misstrauens, bei dem ich ein notwendiges Werkzeug für die “Operation Kamera” erstand, ging es zur Sache.
 
Das Objektivgehäuse der Kamera hat jetzt zwar einen unschönen Kratzer, aber der Eingriff scheint mehr oder weniger gelungen zu sein. Das Bild ist scharf, aber irgendwie ist jetzt immer ein dunkler Streifen in der Mitte des Bildes. Mal sehen, woher das kommt und ob ich das noch weg bekomme. Zur Not geht es so, besser als gar kein Blick in den Kasten. Ein weiterer Punkt wäre die Optimierung der Beleuchtung. Die LEDs machen einen hübschen hellen Spot in der Mitte. Den muß ich auch noch irgendwie “entschärfen”. Vielleicht hilft es, die LEDs etwas mit der Feile zu bearbeiten…
 
Als nächstes muß dann die Befestigung der Kamera noch etwas optimiert werden. Das ist mir alles noch zu wacklig und der Blickwinkel verstellt sich deshalb zu leicht. Danach kommt der Temperatursensor an die Reihe.