iPS Server für die Hutschiene im Eigenbau

Ich stelle hier eine Möglichkeit vor einen iPS Server auf Raspberry Pi B2 Basis incl. TFT Display im Hutschienengehäuse günstig selbst zu bauen.

Der Server ist neben Gehäuse, Display und Netzteil noch auf der Frontseite mit einem Taster, zwei Statusleds und einem Photosensor ausgestattet. Im innern steckt noch ein Sensormodul zur Messung des Luftrdrucks als Ergänzung zur Homematic Wetterstation. Nebenbei hat das Modul auch noch einen Temperatorsensor auf der Platine, der als „Abfallprodukt“ die Temperatur im Gehäuse innern misst (kann beim Übertakten helfen :wink: ).

Das kann dann z.B. so aussehen:

Mein Plan ist es zukünftig zwei Stück davon im Cluster zu betreiben sobald die iPS 4.0 final und stabil läuft.

1. Hauptkomponenten

1.1 Gehäuse

hutschienengehaeuse-pi-b-plus.jpg

[ul]
[li]Montage auf einer DIN-Schiene (35 mm)[/li][li]Breite 4TE[/li][li]Aussparungen für die Anschlüsse[/li][li]Platz für zusätzliche Einbauten[/li][li]LED-Sichtfenster für Display 2,2 Zoll[/li][li]Befestigung des Raspberry mit Schrauben[/li][li]schraubenlose Gehäusemontage[/li][li]Farbe grau[/li][li]Maße (BxHxT): 71,5×90,5×62 mm [/li][/ul]

Gibts z.B. bei Pollin: Link zum Gehäuse

1.2 Hutschienen-Netzteil

hutschienen-netzteil-5v.jpg

[ul]
[li]Hersteller: MeanWell[/li][li]Hersteller Serie: DR-15[/li][li]Herstellerartikelnummer: DR-15-5[/li][li]Ausgang: +5VDC[/li][li]Ausgang (min…max): 4,75…5,5VDC[/li][li]Eingangsspannung: 85…264VAC[/li][li]Eingangsspannung (AC/DC): AC[/li][li]Leistung [W]: 12 W[/li][li]Netzteil-Typ: Din-Rail Netzteil[/li][li]Strom: 2,4 A[/li][li]Wirkungsgrad: 77% [/li][/ul]

Gibts z.B. bei Pollin: Link zum Netzteil

1.3 Display

display_front_boot_001.jpg

SPI LCD TFT Display basierend auf ILI9341 chipset betrieben mit dem Nostro framebuffer driver.

[ul]
[li]Bildschirmdiagonale 2,2 Zoll[/li][li]Betriebsspannung: 3,3 Volt[/li][li]Anzahl der Farben: 262K[/li][li]Auflösung: 320×240 Pixel (QVGA)[/li][li]Schnittstelle: 4-Wire SPI[/li][li]Integrierter Controller: ILI9341[/li][li]Hintergrundbeleuchtung: 4 LEDs[/li][li]Abmessung der Platine: ca. 67 mm x 40 mm[/li][li]Hersteller: SHANGHAI TIANMA MICRO-ELECTRONICS[/li][li]Typ/Modell: TM022HDH26 [/li][/ul]

Display und Raspberry Pin Belegung:

TFT Screen Pin# Raspberry Pi Pin#
VCC 01 3.3v 01
GND 02 GND 09
CS 03 GPIO8 24
RESET 04 GPIO25 22
DC/RS 05 GPIO24 18
SD1/MOSI 06 GPIO10 19
SCK 07 GPIO11 23
LED 08 GPIO18 12
SD0/MISO 09 GPIO09 21

Gibts z.B. bei ebay: Link zum Display

2. Soviel zur Hardware, nun noch ein paar Tips zur Konfiguration

Basis ist ein Raspbian Jessie Lite Image

Raspbian Einstellungen:

sudo raspi-config

Unter 9 Advanced Options den Menüpunkt A6 SPI auswählen und default auf ‘Yes’ setzen,
ebenso Menüpunkt A7 i2C auswählen und default auf ‚Yes‘ setzen - danach reboot.

Zum automatischen Laden der FB-Kernelmodule anpassen der /etc/modules-load.d/modules.conf


snd-bcm2835
spi-bcm2835
i2c-bcm2708
i2c-dev
fbtft_device 

Wichtig spi-bcm2835 um SPI Master das vom Soundtreiber benutzt wird für den Framebuffer wieder freizugeben!!!

Im Verzeichnis /etc/modprobe.d/ folgenden Befehl zur Dateierstellung ausführen.

echo "options fbtft_device custom name=fb_ili9341  gpios=reset:25,dc:24,led:18 speed=16000000 rotate=90 bgr=1" > fbtft.conf

Zuletzt aktivieren des Framebuffers zur Bootzeit, dazu Ergänzung der Bootparameter in /boot/cmdline.txt am Ende der Zeile mit folgendem Parameter:

fbcon=map:10 

LCD Script

Skript zum Ein- und Ausschalten des LCD
Ich habe zusätzlich einen Photosensor eingebaut, der das Display automatisch ausschaltet wenn die Schaltschranktüre geschlossen ist und wieder einschaltet wenn die Türe geöffnet wird. Kann man aber auch mit einem Taster oder anderweitig realisieren.

#!/usr/bin/env python3
 
import RPi.GPIO as GPIO
import sys
 
# set Parameters via GPIO for SPI Display
 
 
# use Pi.GPIO layout (ordering like Pin-numbers)
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
 
param_count=len(sys.argv)
 
def prt_help():
    print("Usage: lcd [OPTION]
Set values for SPI LCD Display
")
    print("--led		--led=on turns the LED Backlight on
		--led=off turns the LED Backlight off")
 
if param_count <= 1:
  prt_help()
elif sys.argv[1]=='--led=on':
  print('LED einschalten')
  GPIO.setup(12, GPIO.OUT)
  GPIO.output(12, True)
elif sys.argv[1]=='--led=off':
  print('LED ausschalten')
  GPIO.setup(12, GPIO.OUT)
  GPIO.output(12, False)
elif sys.argv[1]=='--help' or sys.argv[1]=='-h':
  prt_help()
else:
  print("lcd: unrecognized option ",sys.argv[1],"
Try `lcd --help' for more information.")

3. Module

3.1 Barometer Modul

Für den Luftdruck verwende ich das sehr genaue Modul BMP180 von Bosch
BMP180_Modul_klein.jpg

Gibts z.B. für knapp 3,- Euro bei Amazon: Link zum BMP180 Modul

Die Ansteuerung geht sehr einfach über den I²C-Bus
Ein Beispiel zur Verdrahtung findet Ihr hier: Link zur Ansteuerung

Beispiel-Code zum Abfragen der Werte und automatischer Korrektur auf NormalNull:

#!/usr/bin/python

from Adafruit_BMP085 import BMP085

# ===========================================================================
# Example Code
# ===========================================================================

# Altitude over sea level in meter
# please adjust the value to your homebase altitude
altitude = 190


# Initialise the BMP085 and use STANDARD mode (default value)
# bmp = BMP085(0x77, debug=True)
bmp = BMP085(0x77)

# To specify a different operating mode, uncomment one of the following:
# bmp = BMP085(0x77, 0)  # ULTRALOWPOWER Mode
# bmp = BMP085(0x77, 1)  # STANDARD Mode
# bmp = BMP085(0x77, 2)  # HIRES Mode
# bmp = BMP085(0x77, 3)  # ULTRAHIRES Mode

temp = bmp.readTemperature()

# Read the current barometric pressure level
pressure = bmp.readPressure()

psea = pressure / pow(1.0 - altitude/44330.0, 5.255)

print "Temperature:              %.2f C" % temp
print "Pressure:                 %.2f hPa" % (pressure / 100.0)
print "Pressure at sea level:    %.2f hPa" % (psea / 100.0)

3.2 LDR GL5528

Als Helligkeitssensor kommt die LDR GL5528 in Verbindung mit einem 1 µF Kondensator zum Einsatz

LDR-GL5528.jpg

Anbei ein Beispiel-Code zum Ansteuern. Hier ist aber darauf zu achten, dass die Schwellwerte am Anfang des Codes individuell angepasst werden müssen. Je nach Einbautiefe der LDR bzw. der Beschattung durch Gehäuse und Front sind die Werte unterschiedlich.

Auch frisst der Code etwas CPU Leistung wenn die LDR abgedunkelt ist, wenn hier jemand einen besseren Vorschlag für die Abfrage hat, nur her damit.

Die Verdrahtung findet Ihr Beispielhaft hier: Beispiel Aufbau

#!/usr/bin/env python2.7


import time
import os
import RPi.GPIO as GPIO

MaxReads = 40000 	#maximum reads from Sensor, higher values need more cpu cycles
SensorPin = 23 		#raspberry IO pin number
ThresHold = 0.002 	#threshold for activating display, may depend on position of the sensor
CycleDelay = 3 		#seconds between sensor reading, lower value means more cpu cycles but faster action
Daemon = 1 		#set to 1 to enable daemon mode

debug = 0 		#set debug to 1 to get values printed


GPIO.setmode(GPIO.BCM)
GPIO.setup(SensorPin, GPIO.OUT) # 23 for LDR light sensor

def msr_time(msr_pin):
    reading = 0
    GPIO.setup(msr_pin, GPIO.OUT)
    GPIO.output(msr_pin, GPIO.LOW)
    time.sleep(0.1)
    starttime = time.time()                     # note start time
    GPIO.setup(msr_pin, GPIO.IN)
    while (GPIO.input(msr_pin) == GPIO.LOW):
        reading += 1
	if reading > MaxReads:
		break
    endtime = time.time()                       # note end time
    total_time = 1000 * (endtime - starttime)
    return total_time                           # reading in milliseconds

def run():
    Display = 0
    while True:
    	time.sleep(CycleDelay)
	MSR_Value = msr_time(SensorPin)
	LightLevel = round(float(1 / MSR_Value / 6),3)
        DisplayLast = Display
	if LightLevel < ThresHold:
		Display = 0
		if DisplayLast <> Display:
			os.system("lcdctrl --led=off")
                if debug:
			print "Display:", Display, "DisplayLast", DisplayLast, "LightLevel", LightLevel, "MSR Value:", MSR_Value
        else:
		Display = 1
	        if DisplayLast <> Display:
	        	os.system("lcdctrl --led=on")
		if debug:
			print "Display:", Display, "DisplayLast", DisplayLast, "LightLevel", LightLevel, "MSR Value:", MSR_Value

if __name__ == "__main__":
		run()

Hoffe das reicht zum Nachbauen. Viel Spass

iPS-Server-Pic2.jpg

Schickes Projekt: +1 von mir : )

Hübsch. +1

Danke fürs Teilen!!
Peter

Gefällt mir.
Wie ist das denn mit dem Photosensor hardwaremässig gelöst?

Sehr cooles Projekt!!! :cool: Saubere Arbeit!

Danke!
-Chris-

Der eingebaute Photosensor ist ein LDR GL5528 gekoppelt mit einem Kondensator. Darüber frage ich mit einem Skript den Helligkeitswert ab. Einziges Problem dabei, die Abfrage kostet bei Dunkelheit einige CPU Cycles, was ca 2% der Gesamt-CPU Leistung in Anspruch nimmt. Ist aber beim Raspi B2 zu verkraften. Alternativ einfach einen Taster nutzen, den man kurz drückt um das Display zu aktivieren und dann einfach nach 30 Min wieder abschalten.

sieht schick aus. Hatte bei mir schon vor längerer Zeit das Pi-TFT von Adafruit eingebaut, dafür gabs auch ein Gehäuse, aber das war ein ziemlicher Kampf mit den Modulen. Nach jedem Raspbian Update ging das auch wieder von vorne los.

Was für ein Modul ist für den Luftdruck und Temperatur zuständig?

Tommi

Super interessantes Projekt. Dank für die Anleitung!!!

Tobias

Das SPI TFT Modul ist nicht explizit für dieses Gehäuse, es passt aber zufällig genau hinter die Plastikscheibe des Hutschienengehäuses, ausserdem ist es mit gut 10,- Euro sehr günstig.
Die Modulproblematik ist in der Zwischenzeit entspannt, da die SPI Frambuffer Treiber in der Zwischenzeit bei Raspbian fester Kernelbestandteil sind. Auch der Wechsel zu Raspbian Jessie war diesbezüglich unkritisch.

Die Details zum Sensor Modul packe ich noch oben in die Beschreibung.

Hallo cyberganny,

möglicherweise haben wir was den „Clusterbetrieb“ angeht gemeinsame Ziele - wir sollten uns dazu mal austauschen…

Ich habe die gleiche technische Konstellation bei mir installiert. Was zeigst Du denn in der Regel auf dem Display an?

Joachim

An den nächsten Schritten wie generelle Management Software und Display Ausgabe sowie Web-Frontend bin ich noch in den Anfängen, da kann ich noch nichts zeigen. Werde dann aber den Thread Updaten. Für Ideen auch zum Thema Cluster steht der Thread ja jederzeit offen.

Hi,

echt geniales Projekt, werde mir die Hardware auch bestellen. Kannst du zur Performance was sagen, wenn man mit einem Client auf das Webfront zugreift und sich z.B. Graphen oder Kamerabilder anzeigen lässt. Läuft das alles geschmeidig :confused:
Was für eine SD Karte setzt du ein?

Der erste Eindruck war: Super Idee, toll umgesetzt.
Der zweite als ich auf mein Raspberry im gleichen Gehäuse schaute: Das ist ja real sehr sehr winzig. Was will man denn da vernünftig darstellen.

Ich hab hier ein 2.8" Farbdisplay für meinen 3D-Drucker. Naja, für den nötigsten Zweck reicht das aber sonst.

Trotzdem klasse Arbeit

Real werden dort nur die Daten ausgegeben, die den aktuellen OS und Prozessstatus relevanter Prozesse aufzeigt oder den aktuellen Systemload, falls ein remote Zugriff nicht möglich ist.
Ansonsten wird ohnehin alles per remote SSH-Shell oder WebFrontend administriert. Ich sehe das als erweitertes LOM.
So kann man aber immernoch mit einer usb Funk Tastatur etwas auf dem System machen ohne zwingend als nächsten Schritt einen HW-Reset zu durchzuführen. Der bringt immer das Risiko mit sich, dass es die DB zerschiesst.

Performance ist wie bei jedem anderen Raspberry 2B auch, da findest Du genügend Infos hier im Forum.

Ich hab mir das Display zum Spielen mal bestellt. :smiley:
Haste mal geprüft, was es abgedunkelt so zusätzlich verbraucht?
Vielleicht stell ich auch um. IPS läuft sehr gut auf dem PI2 und die CCU2 könnte auch in Ruhestand, wenn das stabil ist. Direktverknüpfungen funktionieren ja sowieso.

Wie kommt der Strom vom Netzteil zum Pi? Nen USB Stecker dran gemacht oder gibt es auch eine Einspeisung auf der Platine?

Es gibt bei z.B. Polin Mini-USB Kabel für den Pi um ihn an das Netzteil anzuschließen. Also USB auf der einen Seite, Rot/Schwarze Kabel auf der Anderen.
Peter

Onboard hat der Pi keinen Anschluss habe ein USB Kabel angelötet wie von Peter beschrieben