Archiv der Kategorie: Raspberry Pi

Livebild der Rasperry Pi Kamera über den Browser aufrufen

Neben Einzelbildern kann man die raspicam auch nutzen um ein Livestream zu erstellen. Der Livestream kann dann von verschiedenen Clients per Browser abgerufen werden.

Folgende Schritte müssen als root ausgeführt werden.
apt-get install libjpeg8-dev imagemagick libv4l-dev
ln -s /usr/include/linux/videodev2.h /usr/include/linux/videodev.h
wget http://sourceforge.net/code-snapshots/svn/m/mj/mjpg-streamer/code/mjpg-streamer-code-182.zip
unzip mjpg-streamer-code-182.zip
cd mjpg-streamer-code-182/mjpg-streamer
make mjpg_streamer input_file.so output_http.so
cp mjpg_streamer /usr/local/bin
cp output_http.so input_file.so /usr/local/lib/
cp -R www /usr/local/www

Nachdem die aufgeführten Befehle erfolgreich ausgeführt wurden, kann das Modul genutzt werden.
mkdir /tmp/stream
raspistill --nopreview -w 640 -h 480 -q 5 -o /tmp/stream/live.jpg -tl 100 -t 9999999 -th 0:0:0 &

In einer weiteren Linux Shell wird der eigentliche Live Stream gestartet.
LD_LIBRARY_PATH=/usr/local/lib mjpg_streamer -i "input_file.so -f /tmp/stream -n live.jpg" -o "output_http.so -w /usr/local/www" &

Das direkte Livebild kann im Anschluss per Browser über die Url http://serverip:8080/?action=stream aufgerufen werden.

Erstes Foto mit der Camera des Raspberry Pi

Die Kamera für den Raspbery ist schon seit längerem auf dem Markt, jedoch habe ich mir erst kürzlich eine zugelegt. Die Installation ist recht einfach, Kamera anschließen, mit Hilfe von raspi-config aktivieren und Neustarten.

Nach dem das System wieder verfügbar war erhielt ich nach ausführen des Befehls raspistill -o image.jpg die folgende Fehlermeldung:
mmal: mmal_vc_component_enable: failed to enable component: ENOSPC
mmal: camera component couldn't be enabled
mmal: main: Failed to create camera component
mmal: Failed to run camera app. Please check for firmware updates

Die Lösung stand bereits in der Fehlermeldung, zum aktualisieren der Firmware muss lediglich rpi-update auf der Kommandozeile ausgeführt werden.

Digitaler Fotorahmen

Mittlerweile gibt es auf dem Markt diverse Displays, die sich gut für Projekte mit dem Raspberry Pi eignen.

In diesem Artikel geht es um die Erstellung eines digitalen Bilderrahmens, die Bilder werden hierfür aus einem Dropbox Ordner heruntergeladen.

Leider gibt es für den Raspberry Pi keinen Dropbox Client, jedoch gibt es ein Script welches für den Download bzw. Upload von Dateien genutzt werden kann.
Zunächst muss das Script heruntergeladen und ausführbar gemacht werden.
curl "https://raw.githubusercontent.com/andreafabrizi/Dropbox-Uploader/master/dropbox_uploader.sh" -o dropbox_uploader.sh
chmod 755 dropbox_uploader.sh

Nach dem ausführen des Scripts erhält man eine gute Anleitung, damit das Script zum synchronisieren genutzt werden kann.

Zum herunterladen der neuen Bilder und darstellen auf dem Display verwende ich die folgenden Zeilen:
#!/bin/bash

for i in `/home/pi/dropbox/dropbox_uploader.sh list | grep -i jpg | tr -s ' ' | cut -d ' ' -f 4`
do
/home/pi/dropbox/dropbox_uploader.sh -s download $i /home/pi/Pictures
done
pqiv -f /home/pi/Pictures/ -s -i -t -d 30

Die Darstellung der Bilder erfolgt über das Programm pqiv.

[dashing] Fehler beim auslesen einer Excel Datei

Beim auslesen von xlsx Dateien mit Hilfe von roo kam es zu keinen Problem, wenn die rb Datei direkt über die Kommandozeile ausgeführt wurde. Wurde die Datei jedoch innerhalb des Jobs Ordners abgelegt und über dashing ausgeführt, kam es zu folgendem Fehler:

.gem/ruby/gems/backports-3.6.6/lib/backports/std_lib.rb:9:in `require': cannot load such file -- roo (LoadError)
from /home/dashing/.gem/ruby/gems/backports-3.6.6/lib/backports/std_lib.rb:9:in `require_with_backports'
from /home/dashing/sweet_dashboard_project/jobs/todo.rb:1:in `'
from /home/dashing/.gem/ruby/gems/backports-3.6.6/lib/backports/std_lib.rb:9:in `require'
from /home/dashing/.gem/ruby/gems/backports-3.6.6/lib/backports/std_lib.rb:9:in `require_with_backports'
from /home/dashing/.gem/ruby/gems/dashing-1.3.4/lib/dashing/app.rb:157:in `block in require_glob'
from /home/dashing/.gem/ruby/gems/dashing-1.3.4/lib/dashing/app.rb:156:in `each'
from /home/dashing/.gem/ruby/gems/dashing-1.3.4/lib/dashing/app.rb:156:in `require_glob'
from /home/dashing/.gem/ruby/gems/dashing-1.3.4/lib/dashing/app.rb:167:in `'
from /home/dashing/.gem/ruby/gems/dashing-1.3.4/lib/dashing.rb:3:in `require'
from /home/dashing/.gem/ruby/gems/dashing-1.3.4/lib/dashing.rb:3:in `'

Das Problem trat nicht mehr auf, nachdem im Gemfile gem 'roo', '~> 2.3.2' hinterlegt wurde.

[dashing] Rss Widget

Ein Dashboard könnte auch in einem Empfangsbereich einer Firma genutzt werden. Neben aktuellen Informationen wie eventuell Zahlen der Firma können andere Informationesquellen wie Wetter oder Nachrichten eingebunden werden.
In diesem Fall habe ich ein kleines rss Widget erstellt, welches den Heise rss Feeds inklusive dem Artikelbild ausgibt.

rss.coffee
class Dashing.Rss extends Dashing.Widget

# constructor: ->
# super
onData: (data) ->
node = $(@node)
node.addClass("blinking")
setTimeout ( =>
node.removeClass("blinking")
), 5000

rss.html
<h1 class="title" data-bind="title"></h1>

<div  data-bind="titel" class="titel"></div>
<div class="bild">
<img  data-bind-src="bild" align="left">
</div>
<div class="beschreibung">
<span   data-bind="beschreibung | raw"></span>
</div>
<div style="clear:both"></div>
<p class="more-info" data-bind="moreinfo"></p>
<p class="updated-at" data-bind="updatedAtMessage"></p>

rss.scss
.widget-rss {
background-color: $background-color;
}
.more-info {
color: $moreinfo-color;
}
.updated-at {
color: rgba(255, 255, 255, 0.7);
}
li {
font-size: 15px;
margin-top: 8px;
text-indent: 10px;
font-weight: normal;
}
.title {
color: $title-color;
}
.beschreibung {
font-size:25px;
width:450px;
float:left;
text-align:left;
}
.bild {
float:left;
width:270px;
}
&.blinking {
animation: blink 1s linear infinite;
animation-iteration-count: 1;
}
}


job

require 'nokogiri'
require 'open-uri'
require 'xpath'
require 'split'
require 'sub'

SCHEDULER.every '10m', :first_in => 0 do |job|

@doc = Nokogiri::HTML(open("http://www.heise.de/newsticker/heise-atom.xml"))

beschreibung = @doc.xpath('//entry//summary')
titel = @doc.xpath('//entry//title')
bild = @doc.xpath('//entry//img')
bild = @doc.xpath('//entry//img')
zaehler = 1
while zaehler < titel.length
#puts titel[zaehler]
bil = bild[zaehler].to_s.sub("<img src=\"", "").split('"')[0]
tit = titel[zaehler].to_s.sub("<title type=\"text\">", "").to_s.sub("</title>", "")
besch =  beschreibung[zaehler].to_s.sub("<summary type=\"html\">", "").to_s.sub("</summary>", "")
send_event("heise",{ titel: tit , beschreibung: besch, bild: bil })
sleep 30
zaehler += 1
end
end