Posts mit dem Label #raspberry werden angezeigt. Alle Posts anzeigen
Posts mit dem Label #raspberry werden angezeigt. Alle Posts anzeigen

14.07.2013

Wärmebild-(Thermographie)-Kamera mit dem Raspberry Pi (Teil 1: Übersicht)

Thermographie mit dem Raspberry Pi

1. Thermographie-Kamera mit dem Raspberry Pi (dieser Teil)
2. Ansteuerung des Sensors mit Perl
3. Ansteuerung der Servos / Auswertung
4. Zusammenfassung, WLAN und  Batteriebetrieb

 

Kontaktlose Thermometer und entsprechende Sensoren sind sehr günstig erhältlich. Diese Sensoren messen pyroelektrisch die Temperatur an einem Punkt in ihrem Gesichtsfeld.

Die Idee ist es, einen solchen Sensor an einen Raspberry Pi anzuschließen, und von ihm die Daten weiterverarbeiten und anzeigen zu lassen um damit eine preiswerte Thermographie-Kamera zu bauen.


Die Bilder, die dabei rauskommen sind erstaunlich gut.

Scanmechanismus

Ein solcher einfacher Sensor misst die Temperatur nur in einen Punkt - Sensoren mit vielen Pixeln sind extrem teuer. Um ein komplettes Bild zu erhalten, muß der einpixelige Sensor das Sichtfeld mechanisch abscannen.

Für den Scan-Mechanismus lassen sich preiswerte RC-Servos einsetzen, die  direkt vom Raspberry Pi angesteuert werden können. Mit zwei Servos lässt sich dann bequem die Gegend in X- und Y-Achse abscannen.



Für eine hohe Auflösung ist ein möglichst kleines Sichtfeld ("Field of View", POV) des Sensors wichtig. Zusätzlich muß der Sensor eine Schnittstelle haben, die über den Raspberry Pi bedient werden kann. Der MLX90614 erfüllt diese Bedingungen.

Da der Raspberry Pi ein vollwertiges Linux-System ist, stehen dort auch alle möglichen Scriptsprachen und Libraries zur Nachbearbeitung und Darstellung der Daten zur Verfügung.

Bedient wird das System über einen Browser, auf dem RasPi läuft ein Webserver. Es ist also keine weitere Hardware nötig. Der Raspberry Pi kann auch batteriebetrieben als WiFi-Accesspoint konfiguriert werden. Damit kann dann ein Smartphone mit Browser als Benutzerinterface dienen.

Übersicht

Diagramm TBD

Hardware

Raspberry Pi Model B

Als Plattfrom dient der Raspberry Pi, Model B. Der hat 512 MB RAM und zusätzlich zur USB-Schnittstelle noch einen Ethernet-Anschluß. Das ist sehr praktisch zum Entwickeln, man kann sich direkt per SSH einloggen (von Windows z.B. über putty) und zusätzlich noch einen WLAN-Dongle anschließen, falls man das Gerät standalone benutzen will.

Sensor

Als Sensor wurde der MLX90614 gewählt. Er hat eine I2C-Schnittstelle, über die man ihn an den Raspberry Pi anschließen kann. Den Sensor gibt es in verschiedenen Ausführungen, die sich in der Betriebsspannung und dem Gesichtsfeld (FOV) unterscheiden.

Ich habe die Variante MLX90614ESF-DCI genommen. Der hat eine nominale Betriebsspannung von 3,6 Volt und arbeitet gut mit den 3,3V, die der Raspberry Pi bereitstellt. Das ist der MLX90614 mit dem kleinsten FOV: 5 Grad! Es gibt auch billigere Ausführungen mit 10 oder gar 35 Grad FOV, aber die sind nicht gut für diese Anwendung geeignet - das Gesichtsfeld ist einfach zu groß!

Der Sensor wird über einen Perl-Daemon abgefragt und ist per HTTP erreichbar. Grund dafür: momentan gibt es nur für Perl eine Library, mit der der Sensor über I2C angesteuert werden kann. Näheres dazu im Teil 2.

Webserver

Das Hauptprogramm ist ein Webserver, der in Python geschrieben ist. Er steuert die Servos und holt sich die Daten des Sensors per HTTP. Ist der Scan fertig werden die gewonnen Daten per python-matplotlib als Image visualisiert und an den Browser geliefert (und im Filesystem gespeichert). Nähere dazu in Teil 3 und Teil 4.

Schaltung

 

 

Software

Repository auf GitHub

Die Software wird laufend verbessert und kann auf GitHub unter

https://github.com/hermann-kurz/thermography-raspberrypi

geholt werden. Sie steht unter einer Open-Source-Lizenz


1. Thermographie-Kamera mit dem Raspberry Pi (dieser Teil)
2. Ansteuerung des Sensors mit Perl
3. Ansteuerung der Servos / Auswertung
4. Zusammenfassung, WLAN und  Batteriebetrieb

31.03.2013

I²C mit dem Raspberry Pi, Problem mit "repeated start"

I²C-Bus - wofür?

Der I²C-Bus (Inter-Integrated-Circuit) wurde von Philips zunächst entwickelt, um mit einem geringen Pin-Count ICs innerhalb von Geräten miteinander kommunizieren zu lassen. Später brachten auch andere Hersteller Chips mit I²C auf den Markt. Seit 2006 werden auch keine Lizenzgebühren mehr verlangt, so daß I²C inzwischen sehr verbreitet ist. Im PC wird er z.B. für Temperatursensoren auf dem Motherboard verwendet oder auch zur Identifikation von VGA-Monitoren oder SDRAM-Riegeln.

Sensoren

Ein sehr interessanter Anwendungsfall für den Raspberry Pi sind Auswertungen/Erfassung von physikalischen Größen. Dafür gibt es sehr viele Sensoren, die ebenfalls eine I²C-Schnittstelle haben. Darunter welche für Temperatur, Druck, Magnetfeld (Kompass), Luftfeuchte und vieles mehr. Wem das nicht ausreicht, kann Analog-Digital-Converter (ADCs) per I²C anschließen.

Hardware-Unterstützung

Der Raspberry Pi hat den Broadcom-BCM2835-Chip als Video-Prozessor an Bord, der auch die GPIO-Pins ansteuert, die dann über eine Stiftleiste zugänglich sind. Zusätzlich hat er direkte Hardware-Unterstützung für I²C, die auch direkt über den Linux-Kernel erschlossen ist (/dev/i2c).

Kernel-Modul für I²C

Um I2C via Kernel zu benutzen, braucht dieser das Modul i2c-bcm2708. Das ist bei Linux wheezy per Default disabled, deshalb muß in der Datei

/etc/modprobe.d/raspi-blacklist.conf

Der blacklist-Eintrag für das Modul entfernt oder auskommentiert werden.

Nach dem nächsten Reboot wird das Modul geladen.

Tools

Als nächstes installiert man am besten die i2c-tools mit

sudo apt-get update && apt-get install i2c-tools

wenn ein Gerät am Bus angeschlossen ist, sieht man es mit

i2cdetect -y 1 (RasPi mit 512MB RAM)
bzw
i2cdetect -y0 (für den alten 256MB-Raspi)

Mit i2cget und i2cdump kann man sich nun die Register der angeschlossenen Devices auf dem Bus ansehen, mit i2cset lassen sich Werte speichern.

So weit so gut, ich konnte einwandfrei ein EEPROM (Firmware eines Bluetooth-Keyboards) auslesen, aber ein Thermosensor MLX90614 zeigte sich sehr zickig:

Problem mit "Repeated Start"

Symptom: i2cdetect erkennt den Sensor an Adresse 0x5a.
i2cdump liefert unsinnige Werte :-(

Andere haben das Problem auch, es liegt daran, daß das Kernelmodul bzw der BCM2835-Chip nicht die I²C-Repeated-Start-Sequenz unterstützt, die vom MLX90614 aber benötigt wird.

Somit fällt der Weg, diesen Sensor über das BCM-Kernelmodul anzusprechen, zunächst mal flach :-(

04.01.2013

Raspberry Pi - Home Automation: 7. per Telefon schalten mit Tropo

1. Übersicht
2. Hardware - Interface vom Raspberry Pi zur Funksteckdose
3. Software auf dem Raspberry Pi Ansteuerung und Webserver
4. DynDNS, Siri & mehr
5. Schalten mit  Google Calendar und IFTTT
6. Lampe bei Sonnenaufgang einschalten
7. Raspberry Pi - Home Automation: per Telefon schalten mit Tropo (dieser Teil)


Funksteckdose mit Telefonnummer: Motivation und Ziel

Die Telekom hat seit neuestem ein API für telefonbasierte Dienste - das Telekom Tropo API.

Es funktioniert so, daß der Telekomserver bei einem Telefonanruf einen JSON-REST-Aufruf auf eine URL macht und von dort Befehle an den Server zurückgeschickt werden. Die Telefonnummer erhält man von der Telekom - es sind sogar Nummern in anderen Ländern möglich!

Ziel ist es, die in vorherigen Posts beschriebene internetbasierte Funksteckdosen-Steuerung mit dem Raspberry Pi über eine eigene Telefonnummer mit Sprachmenü anzusprechen:
  1. man ruft die Telefonnummer der Funksteckdose an
  2. es wird gefragt, ob die Steckdose ein oder ausgeschaltet werden soll
  3. per Spracherkennung wird die Aktion erkannt und dann ausgeführt
  4. es gibt eine Rückmeldung, fertig
Zunächst braucht man etwas Geduld, um sich die Accounts bei der Telekom zu besorgen:
  • Zunächst wird ein Account beim Developercenter der Telekom benötigt: http://www.developercenter.telekom.com/
  • Dann kann man dort eine Telefonnummer beantragen - das geht nur mit einem Nachweis, daß man in Deutschland lebt. Eine SIP-Adresse gibt es noch dazu.
  • Zusätzlich braucht man einen Account beim Developergarden: http://www.developergarden.com/de/ dort gibt es Foren, API-Doku und einen Gutschein, mit dem man den Developercenter-Account aufladen kann
  • Nun kann man eine Tropo-Anwendung im Developercenter anlegen, ein Parameter dabei ist die URL des Client-Rechners + Route: Das ist der Raspberry Pi, der die Funksteckdosen bedient.

Software auf dem Raspberry Pi

Für den Client gibt es Tropo-Libraries für PHP, Ruby, JavaScript und Python. Ich verwende das Python-API, da die bisherige Raspberry-Pi-Software ebenfalls in Python geschrieben ist und ich Tropo in den selben Webserver einbaue.

Hier die Erweiterungen des Python-Scripts aus Teil 3:

1. Import der library: Ins Verzeichnis des Scripts wird die tropo.py-Library gelegt, Zeile 2 importiert sie.

from bottle import route, run, post, request
from tropo import Tropo



2. Ansage des Sprachmenüs mit Auswahl. Das ist die URL der Tropo-Anwendung im Developercenter

@post('/homeswitch')
def index():
  tropo = Tropo()
  tropo.ask(choices = "1(1,ein),0(0,aus)", timeout=30, name="choice", say = "Sag
en sie. ein. oder. aus. um die Heizung zu schalten", recognizer = "de-de", voice
 = "Katrin")
  tropo.on(event = "continue", next ="/continue")
  json = tropo.RenderJson()
  print json
  return json


Dieser Code wird beim Anruf der Telefonnummer vom Telekom-Server auf dem Raspberry Pi aufgerufen. Der Anrufer hört den Text in "tropo.ask" (Text-To-Speech vom Telekomserver, die Punkte machen kleine Pausen). Als Stimme wird "Katrin" verwendet. Für die Spracherkennung wird deutsch genommen. Die Auswahl des "choice" erfolgt entweder über Spracheingabe ("ein", "aus") oder Tonwahl (0,1). Als nächsten Schritt wird der Telekom-Server die URL "/continue" aufrufen.

3. Auswertung und Schalten der Steckdose

@post("/continue")
def index():
  rjson = request.json
  answer = rjson['result']['actions']['value']
  interpretation = rjson['result']['actions']['interpretation']
  if answer == '0':
    setSwitch('A', 'OFF')
    print "A OFF"
  else:
    setSwitch('A', 'ON')
    print "A ON"
  print answer
  t = Tropo()
  t.voice = "Katrin"
  t.say("Heizung ist jetzt " + interpretation)
  return t.RenderJson()


Die benötigten Parameter werden aus dem hereinkommenden JSON-REST-Aufruf extrahiert ("answer" und "interpretation"). Je nach "answer" wird die Steckdose ein- oder ausgeschaltet. Anschließend kommt noch eine Ansage des neuen Zustandes und der Telekom-Server legt auf.

Mashup von Telefon- und Webdienst: Ziel erreicht!

Die Funksteckdose hat eine eigene Telefonnummer und kann per Spracherkennung ein- oder ausgeschaltet werden. Dazu wurden nur ungefähr 25 Zeilen Code benötigt!

Links



1. Übersicht
2. Hardware - Interface vom Raspberry Pi zur Funksteckdose
3. Software auf dem Raspberry Pi Ansteuerung und Webserver
4. DynDNS, Siri & mehr
5. Schalten mit  Google Calendar und IFTTT
6. Lampe bei Sonnenaufgang einschalten
7. Raspberry Pi - Home Automation: per Telefon schalten mit Tropo (dieser Teil)

23.12.2012

Home Automation mit dem Raspberry Pi 5: Funksteckdosen schalten mit Google Calendar und IFTTT

Inhalt

1. Übersicht
2. Hardware - Interface vom Raspberry Pi zur Funksteckdose
3. Software auf dem Raspberry Pi Ansteuerung und Webserver
4. DynDNS, Siri & mehr
5. Schalten mit  Google Calendar und IFTTT (dieser Teil)
6. Lampe bei Sonnenaufgang einschalten
7. Raspberry Pi - Home Automation:  per Telefon schalten mit Tropo 

Google Calendar zum Schalten von Funksteckdosen


Ein Google-Kalender für jede Funksteckdose wäre doch toll, damit kann man bequem einstellen, wann da daran hängende Gerät ein- und ausgeschaltet werden soll. Der Kalender lässt sich teilen, und Google sorgt für ein tolles UI und spart uns viel Arbeit. Für meine Heizungspumpe sieht das dann beispielsweise so aus:




IFTTT.com

Für die Verknüpfung von Webdiensten verwende ich IFTTT (If This Then That). Das ist ein genialer Meta-Webdienst, der bei festgelegten Ereignissen (If This-Trigger) bestimmte Aktionen (Then That) ausführt. Ein solches Ereignis (Event) kann  ein Kalendereintrag bei Google Calendar sein, der ein bestimmtes Wort im Titel als Trigger enthält.  Insgesamt gibt es momentan über 60 verschiedene Channels, über die ein Event reinkommen kann.

Eine direkte URL-Aufruf-Action gibt es nicht, aber ein kleiner Workaround löst das Problem: man kann das Ergebnis eines URL-Aufrufs in seiner Dropbox ablegen lassen. Die Aufrufe sind dann eben die Ein- bzw Ausschalt-URL - voila!

Insgesamt sind damit folgende Zutaten für das IFTTT-Recipe nötig:
  • IFTTT-Account
  • Google Calendar-Account
  • Dropbox-Account

Schritt für Schritt

1. Auswahl des Trigger-Channels


Durch das Erstellen eines Rezepts (Recipe) bei IFTTT führt ein Assistent. Erster Schritt, klick auf das Google-Calendar-Icon. Beim ersten Mal kommt ein Authentifizierungsdialog, der IFTTT erlaubt, auf den Kalender zuzugreifen.

2. Trigger wählen


Wir nehmen "Event from scratch starts", das kann Kalendertermine nach einem bestimmten Wort durchsuchen.


3. Trigger festlegen


Das Wort "ein" soll der Trigger sein.




4. Action-Channel wählen


Als Action-Channel nehmen wir Dropbox. Auch hier kommt beim ersten Mal ein Authentication-Dialog, der IFTTT erlaubt, Dropbox zu benutzen.


5. Action auswählen


Wir nehmen "add file from URL". Das holt die angegebene URL und speichert sie in der Dropbox


6. URL angeben


Hier die URL zum Einschalten der Steckdose angeben




7. Fertig

Im letzten Schritt geben wir dem Rezept noch einen Namen, fertig!

Das selbe machen wir nun noch mit der Ausschalt-URL, die bei "aus" im Kalender aufgerufen wird.

Zusammenfassung: was haben wir erreicht?

Wenn im Google Calendar ein Termin mit Titel "ein" erreicht ist, wird die Steckdose eingeschaltet. Beim nächsten Termin mit Titel "aus" wird sie wieder ausgeschaltet.

Komplexität bleibt verborgen

Der Google-Calendar-Benutzer hat überhaupt nichts mit der IFTTT-Konfiguration zu tun.

Jeder, der Termine auf dem Kalender eintragen darf, kann die Steckdose ein und ausschalten, er muß nur wissen, daß der Termintitel "ein" bzw "aus" heissen muss.

Rechteverwaltung und User-Interface erledigt Google. Die Kopplung zum Raspberry-Pi per URL erledigt IFTTT, sie bleibt dem Benutzer komplett verborgen!



Inhalt

1. Übersicht
2. Hardware - Interface vom Raspberry Pi zur Funksteckdose
3. Software auf dem Raspberry Pi Ansteuerung und Webserver
4. DynDNS, Siri & mehr
5. Schalten mit  Google Calendar und IFTTT (dieser Teil)
6. Lampe bei Sonnenaufgang einschalten
7. Raspberry Pi - Home Automation:  per Telefon schalten mit Tropo