TFT mittels C ansteuern

Nach einer etwas längeren Pause hier mal wieder ein weiteres Update für den Raspberry Pi. Ich lege hiermit allerdings nun völlig meine Regelmäßigkeit ab😉

Den TFT Bildschirm (siehe hierzu auch 1.8 Zoll TFT Display) mittel C anzusteuern hat einige Recherche im Netz gebraucht…

Am Anfang habe ich zunächst versucht den Adafruit Code umzuschreiben. Allerdings habe ich nicht ganz den Code verstanden in dem die Grundlagenfunktionen geschrieben sind.
Nach einigen weiteren Googleversuchen bin ich dann letztendlich auf diesen Post im Raspberry Forum gestoßen. Mit dem dort verlinkten Code konnte ich dann auch endlich etwas anfangen und weitere Funktionen von Adafruit hinzufügen.
Hier die erweiterte Version in Git. Hierbei ist vor allem die Bibiliothek hy18spi.h wichtig. Hier sind die Funktionen hinterlegt, mit denen man etwas auf dem Bildschirm darstellen kann. Vorallem die Funktion writeText(const char *str) find ich wichtig, da man hiermit auf einfache Art Texte darstellen kann.

Natürlich könnte man noch Funktionen hinzufügen, mit denen man einfach die Schriftgröße ändern könnte, brauch ich aber bisher nicht und kann man ja einfach schreiben, wenn mans braucht🙂

Jetzt kann man die Funktionen ganz einfach über eine Main-Funktion aufrufen. Als Beispiel ist die Beispielfunktion.c dabei. Beim Kompilieren wird statt wiringPi bcm2835 benutzt, da der Code auf dieser Bibliothek beruht. Unter Umständen muss die Bibliothek vorher installiert werden (Guide hier), weiß nicht mehr, ob die nicht standardmäßig mitgelierfert wird.

2 Kommentare

Eingeordnet unter C, TFT

Den Raspberry Pi mittels Sprache steuern Teil 3

Bei den vorherigen Teilen habe ich noch vergessen das ganze beim Hochfahren des Raspberrys autostarten zu lassen.

Hierfür legen wir ein kleines Skript an, welches wir vom System beim Starten ausführen lassen.
Das Skript habe ich Sprachfernbedieunung.sh genannt und unter

/home/pi/Skripte/

gespeichert.
Der Inhalt des Skripts besteht aus zwei Zeilen:

#!/bin/bash
sudo /home/pi/C/Sprache

Der Pfad „/home/pi/C/Sprache“ ist hierbei der Pfad zu meiner kompillierten Sprache.c Datei.
Anschließend mit

$ sudo chmod +x /home/pi/Skripte/Sprachfernbedieunung.sh

ausführebar machen.
In den Autostart habe ich das ganze über die rc.local gepackt.
Hierfür mit

$ sudo nano /etc/rc.local

bearbeiten und die Zeile

/home/pi/Skripte/Sprachfernbedieunung.sh

hinzufügen.

Jetzt startet das Skript und damit unser Programm automatisch.

Hinterlasse einen Kommentar

Eingeordnet unter Sprachsteuerung

Funksteckdose mittels Sprache steuern

Nach der „kurzen“ Pause gehts wieder los. Da ich die Pause allerdings nicht alzu produktiv genutzt habe, werde ich den Rhytmus auf einen Beitrag pro Woche zurückschrauben.

Genug des Vorworts, weiter zum Projekt:
Da ich zuhause Fernsehn über DVBT empfange, habe ich natürlich eine Antenne an meinem Fernsehr angeschlossen. Diese ist ein etwas leistungsfähigeres Modell, was eigentlich kein Problem ist, allerdings besitzt diese Leuchten und summt ab und zu mal vor sich hin, was vor allen Dingen Nachts stört. Bisher wurde das Problem über eine Verlängerung mit Schalter gelöst, mein Wunsch war es aber schon länger das ganze aus der Ferne (sprich Bett) zu steuern. Einfach geht das natürlich über eine Funksteckdose mit Fernbedienung. Das Problem hieran ist allerding wieder, dass man eine zusätzliche Fernbedienung benötig, die auch mal gern verschwindet, oder eben nicht dort ist, wo man selber ist.
Deshalb habe ich mal nach 433MHz Sendern gesucht (die übliche Wellenlänge der Funksteckdosen) und habe auch günstig bei Ebay einen mit zusätzlichem Empfängermodul gefunden (z.B. Ebay, Amazon).
Als nächstes wird dann natürlich noch eine Funksteckdose gebrauch. Ich hab einfach das günstigste Modell von Conrad genommen, denke dass alle Steckdosen mit 433MHz für das weitere Vorgehen kompatibel seien dürften.
Also zunächst die Fernbedienung auf die Steckdose einstellen, falls nicht schon voreingestellt.
Als nächstes den Receiver mit Ground und 5V verbinden und den Datenausgang mit dem Soundkabel an den Mikrofoneingang des Laptops anschließen zum auslesen des Codes. Hierzu wieder den IR-Analyzer verwenden.
Bei der Conrad Fernbedienung kommt dieses Signal für den Bereich 1 Steckdose 1 An an:1 An. Das Signal für das „Aus“ Kommando natürlich auch aufnehmen und anschließend den Code daraus basteln.

Der Code für die Funksteuerung ist hier zu finden. Die Verkabelung ist unten im Beitrag zu finden. Außerdem muss für die Sprachsteuerung die Datei Sprache.c mit neuen Befehlen versorgt und neue kompilliert werden.

433MHz_Steckplatine

Hinterlasse einen Kommentar

Eingeordnet unter Funksteckdose, Sprachsteuerung

„Kurze“ Pause

Der geneigte Leser, sofern ich überhaupt welche habe, hat vielleicht festgestellt, dass ich meine Beiträge jeweils Dienstags und Donnerstags veröffentlicht habe. Da ich allerdings momentan anderweitig beschäftigt bin und nicht jede Woche 2 neue Projekte aus dem Ärmel schütteln kann, mache ich eine relativ kurze Pause von, sagen wir mal, einem Monat. Ich hoffe, dass ich bis dahin dann wieder mit vielein neuen Ideen auftrumpfen kann, wobei mir die Ideen nicht unbedingt fehlen, sondern die Art der Umsetzung.
Ich muss zum Beispiel immer noch die Erkennungsrate der Spracherkennung steigern.
Ansonsten habe ich mich schon daran versucht PIC-Prozessoren mit dem Raspberry zu programmieren um somit kleine Schaltungen unabhängig steuern zu können. Alzuweit bin ich dabei allerdings noch nicht gekommen.
Nun gut wir sehen uns in hoffentlich einem Monat.

Hinterlasse einen Kommentar

Eingeordnet unter Uncategorized

Sprachgesteuerter Fernsehr

Da wir mit dem Raspberry sowohl den Fernsehr ansteuern, als auch den Raspberry über Sprache Befehle erteilen können, werde ich nun in diesem Beitrag die beiden Funktionen verbinden, sodass man den Fernsehr mittels Sprache steuern kann.
Hierfür müssen wir die Datei Fernsehr2.c in Fernsehr2.h umbenennen und diese mittels

#include "Fernsehr2.h"

(vorrausgesetzt die Datei befindet sich im gleichen Ordner wie unser Programm) in den continuous.c Code hineinfügen. Zusätzlich muss man noch die Main() Methode etwas abändern. Code zu finden auf GitHub.
Anschließend schreiben wir ein paar Zeilen Code, um die beiden Programme miteinander zu verbinden. Das Ganze ist mal wieder auf GitHub zu finden.
Viel Spaß🙂

P.s. Das Hauptprogramm ist etwas verschieden (neben den offensichtlichen Änderungen) von dem Code der continuous.c Datei, da ich den Code von dem Mikrowellen Projekt übernommen hatte. Im Endeffekt sollte aber das gleiche rauskommen.

Hinterlasse einen Kommentar

Eingeordnet unter C, Fernsehr, Sprachsteuerung

Den Raspberry Pi mittels Sprache steuern Teil 2

Im ersten Teil habe ich mich darum gekümmert, die Grundlagen zu legen, so dass man nun zumindest ansatzweise Sprache in Text umwandeln kann. Wenn man dies aber cmomentan ausprobiert (über pocketsphinx_continuous) erkennt man, dass Pocketsphinx nicht viel erkennt, oder besser gesagt: nicht gut. Man sieht auch, dass die Zeit, die das Programm benötigt, um erneut einen Befehl entgegenzunehmen, nicht gerade kurz ist.
Für beide Probleme gibt es zunächst eine einfache Lösung: Man beschneidet das Wörterbuch in dem Pocketsphinx nachschlägt.
Hierdurch wird sowohl die Zeit zwischen zwei Befehlen verkürzt, als auch die Erkennungsrate verbessert. Allerdings zum Preis der erkennbaren Wörter.
Da ich allerdings keine großen Unterhaltungen mit meinem Raspberry führen möchte (zumindest zunächst😉 ), sondern nur eine recht überschaubare Anzahl an fest definierten Befehlen, stellt dies kein Problem dar.
Für ein neues Wörterbuch kann man einfach eine Textdatei (hier mit Namen Dict.txt) anlegen, wobei jeder Befehl in einer eigenen Zeile steht. Die Textdatei kann man anschließend bei lmtools hochladen. Für das Wörterbuch benötigen wir die Dateien mit der Endung .lm und .dic.

Um das Wörterbuch einzubinden verschiebt man die Dateien am besten zunächst in den Ornder /usr/local/share/pocketsphinx/model/lm/ mit dem Befehl

$ sudo cp Quellordner/Dict.* /usr/local/share/pocketsphinx/model/lm/

Anschließend kann man das Programm continous.c im Ordner /pocketsphinx-x.x/src/programs/ (vielleicht woanders hinkopieren) bearbeiten. Hier in der Main() Methode (am Ende) die Zeilen

    if (argc == 2) {
        config = cmd_ln_parse_file_r(NULL, cont_args_def, argv[1], TRUE);
    }
    else {
        config = cmd_ln_parse_r(NULL, cont_args_def, argc, argv, FALSE);
    }

löschen und stattdessen die Zeilen

//Übernimmt das Wörterbuch
	config = cmd_ln_init(NULL, ps_args(), TRUE,
			     "-hmm", MODELDIR "/hmm/en_US/hub4wsj_sc_8k",
			     "-lm", MODELDIR "/lm/Dict.lm",
			     "-dict", MODELDIR "/lm/Dict.dic",
			     NULL);
//--------------------------------------------------------

einfügen.
Anschließend kann man das Programm mittels

$ gcc -o continous continous.c `pkg-config --cflags --libs pocketsphinx sphinxbase`

kompillieren. Nach dem Starten des Programms kommt nach ein paar Zeilen wieder das

READY...

Jetzt kann man seine eingegebenen Befehle ins Mikro sprechen und hoffen, dass auch was Sinnvolles erkannt wird😉

3 Kommentare

Eingeordnet unter Uncategorized

Den Raspberry Pi mittels Sprache steuern Teil 1

Was bringt einem ein Raspberry, wenn dieser immer an einem Bildschirm angeschlossen sein, oder man sich übers Netzwerk verbinden mus, um mit diesem interagieren zu können. Deshalb fand ich die Idee der Sprachsteuerng des Raspberrys, z.B. wie bei einer XBOX One (dies soll keine Werbung sein), sehr cool.
Um das ganze zu verwirklichen gibt es natürlich wieder mehrere Möglichkeiten. Das einfachste wäre wohl die GoogleVoice API zu verwenden. Allerdings will ich nicht, dass das Internet die ganze Zeit mein Zimmer belauscht (spätestens seit dem NSA Skandal [Jaja, immer und überall in aller Munde]). Also am bleibt nur eine Lösung übrig, die alles nötige mit sich bringt, und keine Internetverbindung benötigt. Nach einer Internetrecherche bin ich auf diesen Blog gestoßen. Das Ganze höhrte sich ziemlich einfach, und doch ausreichend für meine Ansprüche an. Genauer gesagt, hat der Beitrag genau meinen Wunsch getroffen🙂. Zusätzlich hat der Autor noch seinen Code veröffentlicht, so dass nachbauen möglich ist.

Für die Sprachsteuerung wird also CMU Sphinx verwendet.
Das Installieren war nicht ganz einfach, obwohl es mehrere Guides1 2 gibt, wobei diese sich auch jeweils etwas unterscheiden. Eigentlich sollte es aber schon klappen, wenn man der offizielen Seite folgt.
Zum Testen obs geklappt hat, kann man das pocketsphinx_continuous ausführen, zu finen unter /pocketsphinx-x.x/src/programs/. Am Ende sollte so etwas wie

READY...

stehen, wonach man ins Mikro sprechen kann und der Text dann anschließend angezeigt wird (oder zumindest wie er verstanden wurde).
Mein Problem lag nicht direkt bei der Installation, sondern bei der Kompilierung des „Hello World!“ Programms.
Eigentlich kann man dieses einfach mit dem Befehl

$ gcc -o hello_ps hello_ps.c `pkg-config --cflags --libs pocketsphinx sphinxbase`

kompilieren. Allerdings habe ich beim abtippen nicht verstanden, dass diese „`“ (das Zeichen zwischen ß und „Rücktaste“) nicht diese „‚“ (das auf der # Taste) sind😛

Im nächsten Teil werde ich darauf eingehen, die Worterkennung zu verbessern und unter Umständen schon eine erste konkrete Anwendung zu schreiben. Bis dahin kann man sich ja mal di Dokumentation unter dem Punkt Learn durchlesen, insbesondere den Punkt Adapting the default acoustic model

Momentan verwende ich für das ganze ein einfaches „Guitar Hero“ Mikrofon (hatte mein Mitbewohner gerade übrig) über den USB Anschluss. Das ist sicherlich nicht perfekt, da man das Mikro immer noch recht nahe an den Mund halten muss. Die Blogger empfehlen eine PS3 Webcam mit eingebauten Mikrofon, dieses soll wohl ganz gut den ganzen raum abdecken können, ich suche aber momentan noch nach einer günstigeren Lösung ohne Kamera (muss es doch wohl irgendwo geben…).

2 Kommentare

Eingeordnet unter Sprachsteuerung

Raspberry als Fernbedienung Teil 3

In diesem Teil werde ich das Fernbedienungprogramm ein wenig erweitern, um mehr Funktionen aufrufen zu können.
Da ich auf die Funktion piHiPri()1erst später gestoßen bin, habe ich das Programm für eine externe Clock geschrieben, da ich nur damit eine für mich annehmbare Fehlerrate hatte.

Das Programm ist hier zu finden.

Nachdem man das Programm kompiliert hat, kann man mittels

$ sudo ./Fernsehr2 -List

die möglichen Befehle anzeigen lassen und mit

$ sudo ./Fernsehr2 -Befehl -"Anzahl der Wiederholungen"

den jeweiligen Befehl ausführen. Hierbei ist der Parameter „Anzahl der Wiederholungen“ die Anzahl wie oft der Befehl schnell wiederholt wird um die Fehlerrate zu senken, nicht um den Befehl öffters auszuführen! Diesen Parameter kann man auch weglassen.

Die Schaltung der externen Clock ist unten zu finden. Hierbei wird ein 20MHz Oszillator verwendet, welcher mit dem Binärzähler und dem UND-Gatter auf die nötigen 38kHz heruntergeteilt wird.

IR-LED_externe_Clock_Steckplatine

1Die Funktion piHiPri() erhöht die Priorität des auszuführenden Threads (Teil eines Prozesses). Gefunden habe ich die Funktion hier (in den Kommentaren), da mein Problem war, dass das Betriebsystem bei den hohen Schaltvorgängen der GPIOs dazwischenfunkt, so dass die Genauigkeit von delayMicroseconds() abnimmt. War ein ganz schöner Akt da hinter zu kommen🙂.

Hinterlasse einen Kommentar

Eingeordnet unter C, Fernsehr

Raspberry als Fernbedienung Teil 2

Wie in Teil 1 schon beschrieben, gibt es mehrere Möglichkeiten die nötige Frequenz zum Steuern des Fernsehrs zu erzeugen.

Um die nötige Frequenz mit den GPIOs zu erzeugen benötigen wir eine schnelle Programmiersprache. Laut diesem Benchmark ist C mit bis zu 22MHz mit Abstand die schnellste. Da wir nur Frequenzen bis ca. 40kHz benötigen und WiringPi einfacher zu programmieren ist als die native Bibliothek, verwende ich für weitere C Projekte WiringPi.

Zum Installieren einfach diesem Guide folgen.
Zum Kompillieren der Programme

$ gcc -o Programm Programm.c -lwiringPi

verwenden, wobei man im Ordner des Programms sein muss.
Zum Ausführen den Befehl

sudo ./Programm

ausführen.

Eine erste Version ist im GitHub einmal ohne Hardware Clock (eher nicht zu empfehlen) und einmal mit Clock zu finden.

Dieses Programm kann bislang nur den Fernsehr ein und ausschalten, weiter Befehle folgen im nächsten Teil. Wer die Hardware Clock des Raspberry Pi für andere Sachen verwenden möchte, kann sich auf den nächsten Teil freuen, denn man kann sich auch für kleines Geld selber eine bauen.

P.s. Natürlich kann man das ganze Programmieren auch auslassen und einfach LIRC benutzen, allerdings kann man dann nicht einfach mit anderen Programmen darauf zugreifen und man lernt nicht soviel🙂

Hinterlasse einen Kommentar

Eingeordnet unter C, Fernsehr

Raspberry als Fernbedienung Teil 1

Als nächstes gehts daran den Fernsehr mit dem Raspberry Pi zu steuern. Dafür benötigt man zunächst eine Infrarot (IR) LED und einen Widerstand.
Zur LED: Ich weiß nicht welche Wellenlänge typisch für Fernsehr sind, ich habe eine aus einer alten Fernbedienung ausgebaut. Als ich mir eine zweite von Conrad mit der (laut Wikipedia) typischen Wellenlänge von 950nm gekauft hatte, funktionierte diese nicht mit meinem Samsung TV. Daher muss man hier leider auf andere Quellen ausweichen oder einfach ausprobieren.
Nun gut also wenn man eine IR-LED und einen Widerstand (so um die 450 Ohm) hat, kann man nun die LED mit Widerstand richtig gepolt an einen GPIO und Ground des Raspberrys Pis anlegen. Das ganze dürfte dann in etwa so auschauen:
IR-LED_Pur_Steckplatine

Eine kurze Vorbemerkung zur Steuerung vom Fernsehr:
Fernsehr akzeptieren Signale nur, wenn diese mit einer bestimmten Frequenz gesendet werden, typischerweise 36 oder 38kHz. Da mein Samsung TV mit 38kHz arbeitet, werde ich im weiteren diese Frequenz nutzen. Das umschreiben auf andere Frequenzen ist aber kein großes Problem.

Nun gehts ans Programmieren. Hier kann man nun mehrere Ansätze wählen.
Man kann z.B. die LED als Clock benutzen, so dass die Frequenz von der Hardware des Raspberrys erledigt wird.
Man kann die Frequenz aber auch mit der Software erzeugen, indem man in einer Funktion den Pin einfach oft an und aus schaltet.
Um zu wissen welche Signale die Fernbedienung sendet, kann man entweder auf die LIRC-Sammlung zurückgreifen, oder man liest seine eigene Fernbedienung aus. Zum auslesen kann man auch auf LIRC zurückgreifen, oder man verwendet das schöne Tool IR-Analyzer. Hierfür braucht man nur zusätzlich ein Klinkenkabel. Das Tool ist ziemlich selbsterklärend vorallem mit dem, wie ich finde, guten Handbuch.

Weiter gehts demnächst im 2. Teil.

Hinterlasse einen Kommentar

Eingeordnet unter Fernsehr