Montag, 24. Juli 2017

Schwalbe Kräuterbeet

In diesem Post geht es um den Aufbau einer Schwalbe als Kräuterbeet.
Über die Jahre türmen sich die Ersatzteile, die ich ja doch nicht wieder verwenden würde. So kam die Idee diese innerhalb der Wohnung als Deko mit Lichtfunktion zu nutzen, oder eben als Kräuterbeet im Garten.
Letzteres wurde es dann, denn so konnten alle Teile genutzt werden, ohne die Teile zu zerstören. Wichtig war mir, dass alle Teile nach wie vor an einer Schwalbe genutzt werden könnten, ohne weitere Bohrungen etc zu setzen.
So wurde zunächst ein Holzgestell gebaut, dass die Blechteile tragen wird.
Im Anschluss daran dann die Blechteile gereinigt und lackiert.
Nach der Montage wurden dann noch Blumenkästen bearbeitet und fertig!

Mittwoch, 2. November 2016

LEGO NESPI | Temperaturabhängige Lüftersteuerung - Software Tutorial

Software für die temperaturabhängige Lüftersteuerung:

Die Software für die temperaturgesteuerte Lüftersteuerung basiert auf mehreren Skripten, die ich aus unterschiedlichen Quellen zusammengefasst habe.

Die Schritte, die zur Implementierung notwendig sind, kann man in X Schritte unterteilen:

1. Python-Script aktualisieren
2. GPIO-Steuerung über Python ermöglichen mit RPIO
3. Anlegen der Verzeichnisse und Kopieren der Scripte/ Berechtigung setzen
4. Test der Hardware mit Software mit Hilfsscripts für direkte Ansteuerung
5. Verankerung der Software als Autostart (Cronjob)/ Gewährleistung des Programmlaufs
6. Programmtest durch Belastung Stresstest/ Abbruch nach Direktansteuerung

1. Python Unterstützung aktualisieren
Zunächst wird durch folgende Befehle gewährleistet, dass die Python-Enwticklungsumgebung installiert wird:
Folgende Befehle in der Konsole ausführen oder per SSH auf den Pi schalten:

$ sudo apt-get install python3-pip
$ sudo apt-get install python-pip 

2. Installation RPIO (Ansteuern der GPIO Pins durch Python-Scripte)
Durch die Verwendung eines älteren RPI.GPIO Standes wie hier beschrieben erhielt ich Fehlermeldungen, daher rate ich zum Gebrauch dieses frischen Scripts bei einem Pi3.

$ git clone https://github.com/limuxy/RPIO.git
$ cd RPIO
$ sudo python setup.py install

3. Verzeichnisse und Daten anlegen
Durch folgende Befehle wir im /home Verzeichnis der Ordner für das Lüfter-Script erzeugt:

$ sudo mkdir /home/luefterscript
$ cd /home/luefterscript

Was macht das Script?

Zunächst erfolgt eine Abfrage, ob das Script bereits ausgeführt wird. Wird es bereits ausgeführt, wir der Neustart des Scripts abgebrochen. Es soll ja nur ein Mal gleichzeitig laufen.
Die Temperatur wird derzeitig alle 20 Sekunden abgefragt. Ist die Temperatur über 60° wird der Start des Lüfters initiiert. Der Lüfter läuft dann so lange, wie die 20 sekündliche Abfrage zurückmeldet, dass 55° noch nicht unterschritten sind.
Der Lüfter startet also über 60° und kühlt solange, bis 55° wieder unterschritten werden. Trotzdem läuft der Lüfter erst bei Überschreiten der 60° an, also nicht wundern, warum der Lüfter bei bsw. 58° nicht arbeitet.
Alle Aktivitäten werden in einem Logfile abgelegt:

/home/luefterscript/control_fan.log

Jetzt die fertige Scriptdatei: temperaturscript.sh  herunterladen und per WinSCP auf euren Pi in das Zielverzeichnis:

/home/luefterscript/

kopieren.

ODER:
An dieser Stelle die Datei temperaturscript.sh selbst anlegen und folgendes Script einfügen (Markieren und per Rechtsklick in der Konsole einfügen, speichern und beenden):

$ sudo nano /home/luefterscript/temperaturscript.sh
  
 


#!/usr/bin/env bash

# ~ RaspBerry PI ~
# fan control script
# -----------------------------------------
# Author:      Bagheera
# Created:     28.12.2013
# Last change: 31.12.2013
# Version      1.2
# -----------------------------------------
# 1.2: 31.12.2013
#      - traps for common signals added
#      - commentary
#      - logfile beautification
#
# 1.1: 30.12.2013
#      - logfile changed
#      - logturn added
#      - verbose by global setting
#
# 1.0: 28.12.2013
#      - control_fan.sh created
# -----------------------------------------
# 1.3: Author: Snydeaps
# Aenderung des GPIO von 14 auf 21
# Aenderung Logfile Ordner auf luefterscript
#------------------------------------------
# 1.4: Author: Snydeaps
#       Aenderung Verhindern des Parallellaufs mehrerer Prozesse

test -n "$DEBUG" && set -x

cmd="$(basename "$0")"
lockfile="/var/run/$cmd"

exec 9<>"$lockfile"

flock -n 9 || {
  echo "ERROR: already running $(cat <&9) - exiting." >&2
  exit 1
}

echo $$ >&9

echo "running as $$"
sleep 5
echo "finished $$"

VERBOSE=1;             # show info on console (0=no; 1=yes)

MAX_THRESH=60;         # start above xx degrees
MIN_THRESH=55;         # stop below xx degrees

SLEEPER=20;            # scan every xx seconds
LOGTURN=6;             # log temp every LOGTURN * SLEEPER seconds

# logfile destination
LOGFILE="/home/luefterscript/control_fan.log";


# prepare signal trap function
function finish  {
    echo $(date '+%F %T %Z') "##     0:CONTROL:       Script about to stop" >> $LOGFILE
    echo $(date '+%F %T %Z') "##     2:GPIO_INIT:     Stopping fan" >> $LOGFILE
    echo "0" > /sys/class/gpio/gpio21/value
    echo $(date '+%F %T %Z') "##     2:GPIO_INIT:     Unexport of GPIO port 21" >> $LOGFILE
    echo "21" > /sys/class/gpio/unexport
    echo $(date '+%F %T %Z') "##     0:CONTROL:       Going down... bye bye" >> $LOGFILE
    exit;
}

# trap exit
trap finish EXIT

# initialize GPIO port 21
if [ ! -e "/sys/class/gpio/gpio21" ]; then
    echo $(date '+%F %T %Z') "##     ==================================================================" >> $LOGFILE
    echo $(date '+%F %T %Z') "##     0:CONTROL:       Starting up..." >> $LOGFILE
    echo $(date '+%F %T %Z') "##     1:CONFIG:        Maximum threshold $MAX_THRESH C" >> $LOGFILE
    echo $(date '+%F %T %Z') "##     1:CONFIG:        Minimum threshold $MIN_THRESH C" >> $LOGFILE
    echo $(date '+%F %T %Z') "##     1:CONFIG:        Scan interval $SLEEPER sec" >> $LOGFILE
    echo $(date '+%F %T %Z') "##     1:CONFIG:        Log temperature interval $(($SLEEPER*$LOGTURN)) sec" >> $LOGFILE
    echo $(date '+%F %T %Z') "##     2:GPIO_INIT:     Export of GPIO port 21" >> $LOGFILE
    echo "21" > /sys/class/gpio/export
    echo $(date '+%F %T %Z') "##     2:GPIO_INIT:     Direction: out" >> $LOGFILE
    echo "out" > /sys/class/gpio/gpio21/direction
    echo $(date '+%F %T %Z') "##     2:GPIO_INIT:     Port 21: init value 0" >> $LOGFILE
    echo "0" > /sys/class/gpio/gpio21/value
fi

i=0;
while [ true ]; do

    # get current recalculated temperature and fan status
    cpuTemp=$(cat /sys/class/thermal/thermal_zone0/temp)
    cpuTemp=$(($cpuTemp/1000))
    fanState=$(cat /sys/class/gpio/gpio21/value)

    # echo current temperature to logfile if logturn met
    i=$(($i+1))
    if [ $i -eq $LOGTURN ]; then
        echo $(date '+%F %T %Z') "##     0:CONTROL:       Current temperature: $cpuTemp C" >> $LOGFILE
        i=0;
    fi

    # do some info stuff
    [ $VERBOSE -eq 1 ] && echo -e "CPU: \033[36m$cpuTemp\033[0mC  |  FAN: $fanState  |  THRESHOLD: $MIN_THRESH-$MAX_THRESH"

    # too hot and fan not running? start!
    if [ $cpuTemp -gt $MAX_THRESH ] && [ $fanState -eq 0 ]; then
        echo "1" > /sys/class/gpio/gpio21/value
        [ $VERBOSE -eq 1 ] && echo -e "====> [ \033[32mON\033[0m ]"
        echo $(date '+%F %T %Z') "##     0:CONTROL:       Starting fan ($cpuTemp C)" >> $LOGFILE
    fi

    # everything cool and fan running? stop!
    if [ $cpuTemp -lt $MIN_THRESH ] && [ $fanState -eq 1 ]; then
        echo "0" > /sys/class/gpio/gpio21/value
        [ $VERBOSE -eq 1 ] && echo -e "====> [ \033[31mOFF\033[0m ]"
        echo $(date '+%F %T %Z') "##     0:CONTROL:       Stopping fan ($cpuTemp C)" >> $LOGFILE
    fi

    sleep $SLEEPER

done
 

4. Test der Hardware
Der Test der Hardware erfolgt durch direkte Ansteuerung des GPIO Pins 21 durch ein Python Script. Die beiden Dateien: gpio21on.py und gpio21off.py können wieder heruntergeladen und in /home/luefterscript abgelegt werden, oder händisch erzeugt werden:

Anschalten des Lüfters mit eigenem Script für Testlauf:

$ cd /home/luefterscript
$ sudo nano gpio21on.py
 
In die gpio21on.py hinein: 

#!/usr/bin/python
import RPi.GPIO as GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(21, GPIO.OUT)
GPIO.output(21, False)


speichern und beenden des Scripts.

Abschalten des Lüfters nach Testlauf:

$ sudo nano gpio21off.py

#!/usr/bin/python
import RPi.GPIO as GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(21, GPIO.OUT)
GPIO.output(21, True)
 


Den Scripts werden die ausreichenden Rechte zugewiesen durch:
 
$ sudo chmod +x gpio21on.py
$ sudo chmod +x gpio21off.py 

Lüfter anschalten:

$ sudo python gpio21on.py

Lüfter abchalten:

$ sudo python gpio21off.py

Sollte bis dahin der Testlauf erfolgreich sein, ist die Hardware richtig konfiguriert und das automatische Script kann nach der Ausstattung mit ausreichenden Rechte in die Automatisierung gehen.

Wir geben der temperaturabhängigen Lüftersteuerung die ausreichenden Rechte durch:

$ sudo chmod +x /home/luefterscript/temperaturscript.sh 

Nun ein Test, ob das Script läuft durch:

$ sudo su
$ sudo env -i SHELL=/bin/sh PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin HOME=/home/dru LOGNAME=dru /home/luefterscript/temperaturscript.sh

Sollte das Script bereits laufen erscheint folgerichtig:

root@retropie:/home/pi# ERROR: already running 510 - exiting.
 
 
Ist dies jedoch der erste Test, so läuft das Script an und das Logfile wird erstellt. Alle 20 Sekunden bekommt man nun einen neuen Temperaturwert.

Beenden kann man die Funktion nun mit STRG+z

5. Automatisierten Start und Kontrollfunktion des Programmlaufs


In meiner häufig zitierten Quelle wird der Autostart mit /etc/inittab beschrieben, was aber aufgrund der aktuellen Raspbian Version nicht mehr funktioniert. Daher habe ich weitere Möglichkeiten in betracht gezogen und folgende gewählt:

$ sudo su 
$ sudo nano /etc/crontab

Inhalt:

 /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --repo$
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --repo$
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --repo$
#
*/10 * * * *    root    /home/luefterscript/temperaturscript.sh
@reboot         root    /home/luefterscript/temperaturscript.sh
# Luefterautomatik


Wichtig sind die am Ende eingefügten Zeilen zum Luefterscript. Die */10 * * * * .. Zeile sorgt dafür, dass alle zehn Minuten eine erneuter Start des Scripts eingeleitet wird. Das Script selbst ist mit einem Schutz versehen, das checkt, wenn es bereits läuft und dann keinen Neustart ausführt.
Die weitere Zeile mit @reboot sorgt für einen Initialstart beim Booten des Systems. Damit ist ein Erststart angelegt und eine Abfrage, falls unter irgendwelchen Umständen dass Script beendet wird ein Neustart des Scripts alle 10 Minuten abgefragt wird.


6. Belastungstest
Wenn das Script ordnungsgemäß arbeitet wir der Lüfter bei über 60° anspringen. Da der Pi3 aber nur unter bestimmten Belastungen die 60° übersteigt versuchen wir mit einem Stresstest die Belastung zu erhöhen und einen Temperaturanstieg herbeizuführen.

Dazu solltet ihr euch sysbench wie hier beschrieben besorgen und dann folgenden Stresstest ausführen:

$ apt-get install sysbench 

sysbench --test=cpu --cpu-max-prime=20000 run


Das sollte möglichst aus einer SSH Konsole heraus passieren. Bei Bedarf auch mehrere parallel.
In einer weiteren Konsole könnt ihr dann mit folgendem Befehl die Temperatur auslesen, damit ihr wisst, ob euer Lüfter bereits laufen sollte:

$ vcgencmd measure_temp
 
Ist die Temperatur über 60° sollte der Lüfter laufen und erreicht die Temperatur wieder unter 55° sollte der Lüfter stoppen.  

Dienstag, 1. November 2016

LEGO NESPI | Lego Case Tutorial

Anleitung für ein LEGO Raspberry Pi3 Gehäuse im NES-Look:

Im Netz kursieren diverse Anleitungen und Bausätze für ein LEGO Case im NES-Look.
Ein fertiges Set zu bestellen kam für mich nicht in Frage, da der Bestellvorgang auf dieser Seite aus Spanien sehr schwierig ist und am Ende auch nicht geklappt hat.

Ohnehin fand ich beim Scrollen auf dieser Seite eine Anleitung und ein fertiges Modell eines Lego-Gehäuses, das frei erhältlich ist.

Mein Modell sollte neben den bereits erhältlichen Modellen noch die Funktion eines Aktivkühlers übernehmen. Der Lüfter sollte an der oberen Seite montiert werden und frische Luft von oben in das Gehäuse ziehen und auf den Passivkühler des Pi3 pusten.

Dazu musste das bestehende Modell mit dem Lego Digital Designer angepasst werden.

Hier ein Bild von der Situation vor dem Umbau (Origialdatei von Andre Rinas)

Der Umbau betrifft drei größere Umfänge:
1. Der Belüftungsschacht auf der oberen Seite. Hier war wichtig, dass die Öffnung der Klappe nicht beeinflusst wird. Wichtig war auch, dass die Optik der Oberfläche nicht zu stark unterbrochen wird. Dazu war es ein Problem, geeignete Steine zu finden, die eine Montage des Lüfters ermöglichten, ohne Steine zu modifizieren oder zu beschädigen.
2. Der Platz für den Lüfter auf der Innenseite musste geschaffen werden. Dazu wurde in Summe eine Reihe Steine addiert.
3. Der Zugang zur SD-Karte sollte verbessert werden. Seit dem Modell Pi3 ist keine Push-Push Halterung der Karte mehr vorgesehen. Daher muss man durch ziehen der Karte die Karte entfernen können. Dazu habe ich eine Mulde in den Boden eingesetzt.

Hier der fertige Umbau in der aktuellen Version Rev4. Die nächste Version Rev5 ist in Planung und soll neben einem transparenten Eckstein für die Aktivitäts LED auch einen LEGO ON/OFF Switch erhalten.

Anleitung des LEGO Bausatzes und Bauteile bestellen:

Bauanleitung exportieren:
In Lego Digital Designer durch F7 in den Bauanleitungsmodus wechseln, Mit STRG+H die Anleitung erstellen lassen und im folgenden Fenster den Zielort angeben.

Die fertigen Dateien:
Anleitung als PDF
LXF Modell (LDD Export)

(Archiv: Rev2 für flachen Lüfter) 


Bauteile bestellen:

Generell hat man zwei Möglichkeiten die Teile zu bestellen.
1. Bricklink.com
2. Lego Steine und Teile / Lego Shop vor Ort

Beide Varianten haben ihr Vor-und Nachteile.

1. Bricklink.com
Account erstellen und anmelden. Dann zur Wanted-List
Upload wählen.

Unter "Upload a file from your computer" -> "Drag a file here" die .LXF Datei einfügen. "Add to" sollte auf "Create New Wanted List" stehen. Dann rechts unten den neuen Namen der Liste definieren. Bsp. "Nespi" . Durch diese Mehode erspart man sich das Anlegen einer Teileliste im CSV oder XML Format

Wenn die Datei akzeptiert wurde:

 Über Verify Items gelangen wir zur Teileliste:


 Bestätigen mit "Add to wanted list" dann folgt die Bestätigung:



Mit "Buy all" geht es weiter:
Nun auf "Find stores" -> "Auto Finder":

Mit der Einstellung "By Fewest Stores" kann man unter Umständen Versandkosten sparen. Ich musste jedoch für ein CASE immer bei mindestens zwei Stores bestellen, was oft dazu führt, dass die Versandkosten die Kosten der Steine übersteigen.

Ab hier ist der Bestellprozess abhängig von der Kombination der Shops und Bezahlmethode. Das überlasse ich vollständig euch.


Zusammenbau nach Anleitung:

Zusammenbau des Gehäuses:



Mit fertig montiertem Lüfter (Abbildungen zeigen noch Rev2).




LEGO NESPI | Temperaturabhängige Lüftersteuerung - Hardware Tutorial

Tutorial für die Hardware der Lüftersteuerung

Die Hardware der Lüftersteuerung ist relativ simpel gestrickt. Insgesamt benötigt man folgende Teile:

  • Transistor (Bisher BC547) -> Derzeitig nur 0,1mA Durchsatz Update zu Rev5

Die fertige Schaltung sieht folgendermaßen aus (GPIO Bild und Schaltung):


Optional:
  • kurze Kabel
  • Lötkolben mit Zubehör zum Löten

Einen Test der Hardware kann man provisorisch nach installierter Software vornehmen.
Hierzu wurden mit Krokodilklemmen die nötigen Verbindungen geschaffen:


Als Layout für die Platine hat sich für mich ein 4x4 Lochbild als zielführend herausgestellt. Da mir nur 1x4 Buchsenleisten zur Verfügung standen habe ich das Layout darauf ausgelegt:



Das fertige Layout sieht folgenermaßen aus:


Die Platine dann mit den Verbindungskabeln ausgestattet und mit dem Lüfter verbunden:


 Auf dem Pi angesteckt sieht es so aus:


Baumscheibenradio - Internetradio mit den Raspberry Pi Zero W

Ein neues Projekt ist gerade fertig dokumentiert worden. Das Baumscheiben-Radio :