Raspobot

Aus MakerSpace
Wechseln zu: Navigation, Suche

Author und Projektbetreiber Kay Küstermann Mitarbeiter Dez. KIS-ITSM

Raspobot

Raspobot Poster für die Makerfair Rhein Ruhr 2016



ist ein Hobbyprojekt dass zum Ziel hat, einen autonomen Fahrzeugroboter zu entwickeln, der mit unterschiedlichen Sensoren autonom navigiert und Hindernisse gezielt ausweicht.

Projektbeginn April 2014.

Alles begann, als ich meinen ersten Raspberry Pi in die Finger bekam und versuchte sein Potenzial zu ermitteln. Schnell stellte ich fest, dass sich mit den GPIO´s (General-purpose input/output [1]) und etwas Python unterschiedliche Aktoren ansteuern ließen. Daraus entstand die Idee einen kleinen über Tastatur gesteuerten Roboter zu basteln.

Erste Version von Raspobot (Tastatur gesteuert)

Als Grundlage für mein Roboterprojekt, benötigte ich ein kleines Chassi.
Das fand ich im Netz unter dem Namen:
2WD Robot Car Chassis 2 Motors Dagu Magician Robotics Platform [2]
Schnell stellte sich heraus, dass diese Chassi Plattform eine solide Grundlage mit sehr viel Potenzial bot.
Um die Höhe der Basisplatten zu verändern, besorgte ich verschieden lange Distanzbolsen und einige 90° Winkel.
Ein paar Dosen verzinkte M3 Schrauben, in unterschiedlichen Längen machte es mir einfach, das Chassi nun so umzubauen,
damit ich jede gewünschte Höhe umsetzen konnte.


Die ersten Module an Raspobot, waren ein:
Raspberry Pi Revision 2 Modell B [3]
RaspiRobot Board [4] [5]
Raspberry Pi Camera Modul [6]
SRF-10 Ultraschall Entfernungsmesser (I²C) [7]
WLAN-Stick Edimax EW-7811UN [8]

Achtung:

Dieser WLan Stick von Edimax EW-7811UN, hat einen eingebauten Schlafmodus, der sich bei einer inaktiven Verbindung
schlafen legt und somit jede Verbindung trennt. Wenn der Pi also über diesen Adapter
z.B. mit Putty [9] (SSH) angesprochen wird,
sollte man diesen Schlafmodus deaktivieren.
Denn sonst kann es passieren, dass man den Connect verliert und den Pi damit nicht mehr
sauber herunter fahren kann. Wer den Pi für einen Reboot dann einfach stromlos macht,
riskiert dabei auf dauer Datenverlust auf der SD Karte. Zusätzlich führen diese
unkontrollierten Neustarts dazu, dass bei möglichen aktiven Schreibzugriffen,
Sektoren nachhaltig beschädigt werden und die SD Karte dadurch unbrauchbar wird.


Abhilfe:

Raspbian WLAN Schlafmodus abschalten.

Befehl:
sudo nano /etc/modprobe.d/8192cu.conf
 
Edit:
options 8192cu rtw_power_mgnt=0 rtw_enusbss=0
 
Save:
strg o enter strg x

Nach dem nächsten Reboot sollte diese Funktion deaktivert sein.


Die erste Fahrt des noch kleinen Raspobot, gesteuert mit einer Tastatur, war der
erste Schritt zu weiteren Überlegungen wie man diesen nun autonom fahren lassen könnte.


Programmcode Tastatur Steuerung (Python)

from raspirobotboard import * 
import pygame 
import sys 
from pygame.locals import * 
 
rr = RaspiRobot() 
 
pygame.init() 
screen = pygame.display.set_mode((640, 480)) 
pygame.display.set_caption('RaspiRobot') 
pygame.mouse.set_visible(0)
 
while True:
    for event in pygame.event.get():
        if event.type == KEYDOWN:
            if event.key == K_UP:
                rr.set_led1(True)
                rr.set_led2(True)
                rr.left()
        if event.type == KEYUP:
            if event.key == K_UP:
                rr.stop()
        if event.type == KEYDOWN:
            if event.key == K_DOWN:
                rr.set_led1(True)
                rr.set_led2(True)
                rr.right()
        if event.type == KEYUP:
            if event.key == K_DOWN:
                rr.stop()
        if event.type == KEYDOWN:
            if event.key == K_RIGHT:
                rr.set_led1(True)
                rr.set_led2(False)
                rr.reverse()
        if event.type == KEYUP:
            if event.key == K_RIGHT:
                rr.stop()
        if event.type == KEYDOWN:
            if event.key == K_LEFT:
                rr.set_led1(False)
                rr.set_led2(True)
                rr.forward()
        if event.type == KEYUP:
            if event.key == K_LEFT:
                rr.stop()
            elif event.key == K_SPACE:
                rr.stop()
                rr.set_led1(False)
                rr.set_led2(False)


Dies war nun meine erste Begegnung, mit einer mir bis dato unbekannten Programmiersprache, Python [10].
Nach einiger Recherche und viel Denkarbeit, realisierte ich dann die Tastatursteuerung.
Das Ergebnis sieht man nun im Video.

Neue Stromversorgung

Erster Umbau um ein 6V 4,5 mAh Bleiakku einzusetzen.

Nun bemerkte ich doch recht bald, dass das ständige aufladen der 1,2V AA Akkus x4 = 4,8V
ziemlich aufwendig war. Der Raspberry Pi benötigt von Haus her, schon eine Stromversorgung
von 5V und 700mA bzw. 3,5W, so sah ich mich gezwungen für eine etwas stabilere und länger
anhaltende Stromversorgung zu sorgen.
Da der Roboter von anfang an, mit einer autaken Stromquelle entwickelt werden sollte,
besorgte ich mir zwei 6V 4,5 Ah Bleiakkus, ein entsprechendes Ladegerät und baute das Chassi so um,
dass so ein Bleiakku zwischen den zwei Basisplatten, vom Platzangebot genau hineinpasste.
Somit war beschlossen dass die dem Boden zugewandte erste Plattenseite die Motorebene wird.
Dort brachte ich dann zusätzlich noch ein paar blaue LED´s als Unterbodenbeleuchtung an. (da steh ich voll drauf)
Die andere Plattenseite sollte von diesem Zeitpunkt an, dann generell zur Stromversorgungsebene werden.
Die obere Platte wurde somit zur Processorsteuerebene, wo der Raspberry Pi seine endgültige Position am Roboter fand.
Da der Motortreiber (Raspirobot Board) direkt auf die GPIO Reihe des Raspberry Pi aufgesteckt werden konnte
und eine eigene Stromversorgung benötigte, fertigte ich mir - mit zwei Kabelschuhhülsen, einem Wipschalter
und einem Hohlpinstecker 2,1mm - ein schaltbares Kabel, welches das Akku mit dem Motortreiber verbindet.
Auf dem Motortreiber ist ein Spannungsteiler für 5V vorhanden, somit wird der Raspberry Pi,
auch direkt über dieses Board und dem 5V VCC Pin 2 mit der benötigten Spannung und Strom versorgt.
Die zwei Motoren benötigen Strom von maximal je 250mA. Es war auf längere Sicht hin, die bessere
Lösung meines Stromproblems, denn der Motortreiber kann maximal mit Spannung von 12V versorgt werden.
Das Bleiakku hielt Abends für ca 2,5 Stunden. Es stellte sich heraus, wenn die WLAN Verbindung auf einmal abriss,
dass das Akku leer wurde. Nachdem ich dann das Akku gemessen hatte, bemerkte ich das die Spannung des Bleiakkus
auf ca. 4,5V gesunken war. Damit konnte eine stabile Versorgung nicht weiter gewährleisten werden.
Das Akku wurde dann gegen das zweite Akku ausgetauscht. Das andere wurde über Nacht wieder aufgeladen.
Am nächsten Morgen tauschte ich die Akkus dann wieder um, damit auch das andere über den Tag geladen werden konnte.
Damit standen mir am Abend, wieder zwei voll geladene Akkus zur Verfügung.
Irgendwann bin ich dann dazu übergegangen, das Kabel neu anzupassen, um das Akku direkt am Roboter laden zu können.
Also fertigte ich ein neues Kabel mit 2 Schaltern, einem 2,1mm Hohlpinstecker und einer kleinen Platine mit
Kabelschuhkontakten an, die ich am Heck angebracht habe. Es ermöglichte mir dann das Ladegerät direkt am Roboter
anzuschließen, um das Bleiakku entsprechend direkt zu laden. Jedoch war auch dies keine dauerhafte Lösung,
da der Roboter mittlerweile immer über den gesamten Abend eingeschaltet war, um diesen programmtechnisch weiterzuentwickeln.
Daraufhin habe ich die Kabelschuhkontakte an der Platine durch eine 2,1mm Hohlpinbuchse ersetzt und bestellte
mir ein neues 6 Stufenschaltbares 6V-15V 5000mA Steckernetzteil. Seither werden die Bleiakkus wieder ausserhalb
des Roboters am Ladegerät geladen und der Roboter in der programmierbaren Zeit durch das Steckernetzteil,
mit einer Spannung von 7,5V und maximal 5000mA, stabil versorgt. Die Bleiakkus kommen nur noch bei
autaken Bodentests zum Einsatz, wenn der Roboter umherfahren soll und dadurch nicht mehr an einem Kabel gebunden sein kann.

MCP 23017 I²C Portexpander

Desweiteren besorgte ich mir ein kleines Breadboard, worauf ich dann später einen MCP23017 I²C Portexpander
für die Fahrzeugbeleuchtung aufbaute. Nun hatte ich mehr Ports zum Schalten frei zur Verfügung, und spendierte
dem Raspobot ein Knight Rider LED Lauflicht aus 5 roten 3mm LED´s. Zusätzlich wurden Frontscheinwerfer,
Blinker vorn/hinten, Bremslicht und Rückfahrlicht LED´s an die Unterseite der Processorebene angebracht.
Diese werden über den Portexpander durch das jeweilige Fahrverhalten, so wie man es von einem Fahrzueg kennt,
durch die Programmschleife des Hauptprogramms entsprechend gesteuert.

In meiner damaligen Wohnung war nur Teppichboden verlegt, und das Casterwheel war keine optimale Lenklösung.
Daraufhin habe ich mir im Baumarkt ein paar kleine selbstlenkende Möbelrollen besorgt und diese dann vor den Motoren montiert.
Das Casterwheel habe ich am Heck montiert, was seither zum aufbocken des Roboters dient.
Dadurch muss ich bei Programmtests den Roboter nicht immer auf den Boden setzen, um das geänderte Script testen zu können.
Die Fahrbewegung des Roboters war nun um einiges besser als bisher.


Programmcode LED Lauflicht

#!/usr/bin/python
 
from time import sleep
import time
import smbus
 
BUSNR  = 1
ADDR   = 0x20
ADDR1  = 0x21
IODIRA = 0x00
IODIRB = 0x01
GPIOA  = 0x12
GPIOB  = 0x13
 
 
 
PATTERN = [0x80]
PINA0 = [0x01]
PINA1 = [0x02]
PINA2 = [0x04]
PINA3 = [0x08]
PINA4 = [0x10]
PINA5 = [0x20]
PINA6 = [0x40]
PINA7 = [0x80]
PINAA = [0x00]
PINA15 = [0x03]
 
PINB0 = [0x01]
PINB1 = [0x02]
PINB2 = [0x04]
PINB3 = [0x08]
PINB4 = [0x10]
PINB5 = [0x20]
PINB6 = [0x40]
PINB7 = [0x80]
PINBA = [0x00]
PINB15 = [0xC8]
 
 
 
i2cBus = smbus.SMBus(BUSNR)
i2cBus.write_byte_data(ADDR, IODIRA, 0x00)
i2cBus.write_byte_data(ADDR, IODIRB, 0x01)
i2cBus.write_byte_data(ADDR1, IODIRA, 0x00)
i2cBus.write_byte_data(ADDR1, IODIRB, 0x01)
 
DELAY1 = 0.075
 
#Frontlichter
for leds in PINB15:
    i2cBus.write_byte_data(ADDR1, GPIOB, leds)
 
 
def Stop():
    for leds in PINBA:
        i2cBus.write_byte_data(ADDR1, GPIOB, leds)
    for leds in PINAA:
        i2cBus.write_byte_data(ADDR1, GPIOA, leds)
    for leds in PINBA:
        i2cBus.write_byte_data(ADDR, GPIOB, leds)
    for leds in PINAA:
        i2cBus.write_byte_data(ADDR, GPIOA, leds)
 
 
try:
    while True:
        for leds in PINB3:
            i2cBus.write_byte_data(ADDR, GPIOB, leds)
            sleep(DELAY1)
        for leds in PINB4:
            i2cBus.write_byte_data(ADDR, GPIOB, leds)
            sleep(DELAY1)
        for leds in PINB5:
            i2cBus.write_byte_data(ADDR, GPIOB, leds)
            sleep(DELAY1)
        for leds in PINB6:
            i2cBus.write_byte_data(ADDR, GPIOB, leds)
            sleep(DELAY1)
        for leds in PINB7:
            i2cBus.write_byte_data(ADDR, GPIOB, leds)
            sleep(DELAY1)
        for leds in PINB6:
            i2cBus.write_byte_data(ADDR, GPIOB, leds)
            sleep(DELAY1)
        for leds in PINB5:
            i2cBus.write_byte_data(ADDR, GPIOB, leds)
            sleep(DELAY1)
        for leds in PINB4:
            i2cBus.write_byte_data(ADDR, GPIOB, leds)
            sleep(DELAY1)
 
except KeyboardInterrupt:
    Stop()
    print("Ich bin stehen geblieben, du musst das Programm neustarten!")


Verbindungsebene

Eine neue Ebene wurde notwendig. GPIO Übersetzung auf ein Breadboard

Neue Ideen zwangen mich dazu den Motortreiber vom Raspberry Pi zu trennen und auf eine neue Ebene zu setzen.
Hierfür besorgte ich mir ein GPIO T-Cobbler und ein normalen GPIO Breadboard-Cobbler.
Um nicht jedesmal die Belegung der beiden Cobbler neu zu untersuchen, erstelle ich mir eine Übersetzungsmaske
und hatte damit gleichzeitig meine erste Dokumentation von diesem Projekt gestartet.
Warum überhaupt zwei Cobbler? Ganz einfach, der T-Cobbler wird mit dem Verbindungskabel direkt am Pi verbunden.
Somit erhielt ich die Möglichkeit die GPIO´s alle auf ein Breadboard zu bringen, um diese auch nutzen zu können.
Der zweite Cobbler wurde benötigt, um darauf dann den Motortreiber wieder aufzustecken.
Beide Cobbler wurden dann miteinander verbunden. Da das Motortreiberboard nicht alle GPIO Pins durchgescheift
hatte und einige dabei auf der Strecke blieben, ich diese aber trotzdem nutzen wollte, musste ich eine weitere
Ebene aufbauen, um alle GPIO Pins wieder unabhängig vom Motortreiber zur Verfügung zu haben.
Auch sollte damit die Möglichkeit geschaffen werden, kleinere Verschaltungen mit kurzen Kabelwegen
direkt auf der Ebene zu realisieren. Wie z.B. der Not-shut-down-Taster. Eine Minischaltung, um mit Hilfe
eines Tasters und einem GPIO, der als (Input) definiert wurde, ein kleines in Python geschriebenes Script
auszulösen, um den Pi in jeder Notsituation herunterfarhren zu können, ohne dabei die SD Karte
nachhaltig zu beschädigen, wenn doch durch ein Softwarefehler die Verbindung zum PI unterbrochen wurde.


Programmcode Shutdown Script

#!/usr/bin/python
 
# shutdown script for Raspberry Pi
# status led on pin 14: ON = ready, BLINK = confirm button
 
import glob
import random
import RPi.GPIO as GPIO
import os
import time
import pygame.mixer
import sys, traceback
from time import sleep, gmtime, localtime, strftime
import datetime
 
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.cleanup()
GPIO.setup(14, GPIO.OUT)
GPIO.output(14, True)
GPIO.setup(22, GPIO.IN)
 
pygame.mixer.init(48000,-16,1,1048576)
soundfilesshutdown = glob.glob("rasposound/shutdown/*.wav")
soundfilesdown = glob.glob("rasposound/down/*.wav")
 
 
def LogWrite(str):
    file = open('/var/log/test.txt', "a+")
    file.write(str + '\n')
    file.close()
 
 
def playshutdown():
    print("playing")
    pygame.mixer.Sound(random.choice(soundfilesshutdown)).play()
 
 
def playdown():
    print("playing")
    pygame.mixer.Sound(random.choice(soundfilesdown)).play()
 
# start the loop for every .5 seconds, waiting for LOW on pin 22
# then 2 short flashes with led to confirm and shutdown to sleep mode
 
while True:
        if not (GPIO.input(22)):
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Not Shutdown Interrupt")
                playshutdown()
                GPIO.output(14, False)
                time.sleep(.1)
                GPIO.output(14, True)
                time.sleep(.1)
                GPIO.output(14, False)
                time.sleep(.1)
                GPIO.output(14, True)
                time.sleep(4)
                playdown()
                time.sleep(2)
                os.system("sudo shutdown -h now")
        time.sleep(.5)


Starthilfe rc.local

Damit das Script schon beim Hochfahren mit gestartet wird, da es ja letztendlich nur auf den Input des Tasters wartet, habe ich das Script in die rc.local mit eingetragen.

Befehl:
sudo nano /etc/rc.local
 
Edit:
/bin/sleep 1 && cd /home/pi/Raspobot/raspocode/ && sudo python -u shutdown.py >> /var/log/rc-shutdown.log 2>&1 &
 
am Ende der Datei muss ZWINGEND immer ein
Edit:
exit 0
stehen.
Kurzbeschreibung der Zeile:
/bin/sleep 1 
#sugeriert dem Script das nach starten der rc.local Datei das Shutdownscript 
#nur 1 Sekunde gewartet werden soll bis es geladen werden darf. 
#Danach kommt eine Pfadanweisung 
&& cd /home/pi/Raspobot/raspocode/ 
#wo sich das Script zum ausführen befindet.  
&& sudo python -u shutdown.py 
#Hier soll die Datei mit sudo Rechten als Python Script ausgeführt werden. 
#Der Parameter 
-u 
#bedeutet dass durch ein lineup buffering die Logausgaben 
 >> /var/log/rc-shutdown.log 2>&1 & 
#ohne vorheriges zwischenbuffern direkt in die Logdatei geschrieben werden soll.  
#Zwei 
>> 
#bedeutet das die Ausgabe die Datei, nicht bei jedem Neustart 
#des Pi´s überschreibt sondern das die neuen Ausgaben unten an die älteren 
Ausgaben angeheftet werden. 
2>&1 
#2 = stderr für Error Meldungen 
#1 = stdout normale Programmausführungsrückmeldung. 
#So wie da der Befehl lautet sollen beide Ausgaben entsprechend in die selbe 
#Logdatei geschrieben werden. Das 
& #am Ende des Befehls ist notwendig damit in einer neuen Zeile ein neuer 
Befehl ausgeführt werden kann. Im Grunde genommen wie das Ende eines Befehls. 
Wichtig ist das am Ende der Datei immer das 
exit 0 
steht da sonst die rc.local beim Bootvorgang nicht 
#richtig ausgeführt werden kann. Dadurch würden dann auch die Scipte natürlich, 
#nicht mit gestartet werden.
#In meinem Projekt werden auf diese Weise, 7 Scripte beim Hochfahren mit gestartet, 
#die zum Betrieb des Roboters notwendig sind.
 
/bin/sleep 1 && cd /home/pi/Raspobot/raspocode/ && sudo python -u shutdown.py >> /var/log/rc-shutdown.log 2>&1 &
/bin/sleep 4 && cd /home/pi/Raspobot/raspocode/ && sudo python -u light.py >> /var/log/rc-light.log 2>&1 &
/bin/sleep 3 && cd /home/pi/Raspobot/raspocode/ && sudo python -u led-chaser-small.py >> /var/log/rc-led-chaser-small.log 2>&1 &
/bin/sleep 5 && cd /home/pi/Raspobot/raspocode/ && sudo ./tts_date_de1.sh >> /var/log/rc-tts_date_de1.log 2>&1 &
/bin/sleep 7 && cd /home/pi/Raspobot/raspocode/ && sudo python -u oled1.py >> /var/log/rc-oled1.log 2>&1 &
/bin/sleep 9 && cd /home/pi/Raspobot/raspocode/ && sudo ./tts_time_de1.sh >> /var/log/rc-tts_time_de1.log 2>&1 &
/bin/sleep 16 && cd /home/pi/Raspobot/raspocode/ && sudo python -u rasposound-1.py >> /var/log/rc-rasposound-1.log 2>&1 &
/bin/sleep 45 && cd /home/pi/Raspobot/raspocode/ && sudo python -u netio_server-test-10.py >> /var/log/rc-netio_server-test-10.log 2>&1 &
 
Unter anderem ist in der rc.local auch ein Teil des Camerastreams Startcode enthalten.
Jedoch kommt diese Erklärung etwas später, weiter unten genauer zur Sprache.


Auch wurde diese Ebene, beim späteren Verlauf der Entwicklung als Brücke eingesetzt,um so unterschiedliche
Ebenen darüber miteinander zu verbinden und sämtliche Module dort an die GPIO´s anschließen zu können.
Dies ist nun die zentrale Verbindungsebene geworden, bei der alle Kabel zusammen kommen.

Da sich mit dem Austausch des Pi´s auf die aktuellste Version auch die Anzahl der GPIO´s erhöht hat,
ist dies der nächste Umbauschritt, der ansteht um die neuen GPIO´s mit Hilfe des neuen T-Cobbler auf
diese Verbindungsebene zu bringen. Es werden in diesem Umbauschritt, sämtliche alten Kabelverbindungen
innerhalb dieser Ebene erneuert, da die Steckpins nur eine Stärke von 0,6 mm aufweisen und sich als
anfällig gegen Erschütterungen erwiesen haben. Welches meistens zu unerwarteten Programmfehlern geführt hat.
Die neuen Steckpins werden eine Stärke von 0,8 mm haben und dadurch fester in den entsprechenden Breadboardlöchern sitzen.


Raspobot wird autonom

Erste autonome Version von Raspobot.

Nachdem nun die Verbindungsebene eingerichtet war, war es nun an der Zeit den ersten Ultraschalsensor in Betrieb zu nehmen.
Damit dieser effektiv seine Umgebung abscannen konnte, setze ich dafür ein Dagu Sensor Pan/Tilt Kit [11] mit Servomotoren
ein, um ein Abtastbereich von 180° abzudecken. Jedoch erwiesen sich die mitgelieferten Servos als nicht so Tauglich, für
meine Anforderung diese sauber anzusprechen. Diese tauschte ich dann später im weiteren Entwicklungsverlauf,
gegen ein (180° TowerPro MG995 Metal Gear Digital Servo Hi Torque HPI Savage XL FUTABA 55g [12]) aus.
Dieser war meinen Anforderungen weitaus gerechter geworden, als diese kleinen 9 Gram Servos,
die recht schnell einen Defekt aufwiesen.



Dennoch war das erste Ergebnis, eines autonomen Fahrzeugroboters doch schon mal ein riesen Erfolg
und hatte mir viel Spass bereitet. Jedoch zeigte mir diese Version der Entwicklungsstufe,
einige Schwächen auf, die ich in der weiteren Entwicklung, durch umfangreiche Umbaumaßnahmen überwinden musste.

Ernsthafte Beschädigung

Eine Chassierweiterung für neue Ultraschalsensoren.

Eine verhängnisvolle Begegnung mit einer Balkonmauer, war der Auslöser einer weiteren umfassenden Umbaumaßnahme.
Als das Script gestartet wurde fuhr er mit voller Wucht, eben gegen diese Mauer und die Platine woran der Servo mit dem
Ultraschalsensor befestigt war, zerbrach dabei. Das brach ihm dann das Genik, wodurch er natürlich seine Hauptaufgabe,
in diesem Moment einbüsste. Nun zeigten sich gleich zwei Schwächen auf einmal. Zum einem dass eine Lochrasterplatine
nicht die nötige Stabilität aufbrachte, um so eine Kollision unbeschadet zu überstehen.
Zum anderen war für eine genaue Messung im Bereich von 180°, ein Sensor wohl doch zu wenig, um bei seiner
aktuellen Geschwindigkeit mit der er unterwegs war, den gesamten Bereich scantechnisch abzudecken.
Dies brachte mich dazu eine Chassierweiterung Mit Hilfe von 5 mm dicken Acrylplatten durchzuführen.
Ich überlegte mir, dass es vielleicht Sinn machen würde, statt auf nur einen Sensor zu setzen,
es besser wäre mit 5 Sensoren den gesamten Bereich direkt abzudecken, um somit schneller auf Hindernisse
in seinem 180° Blickfeld reagieren zu können. Nun nach dieser Überlegung, folgte recht schnell der Umbau.
Ich skizierte eine massgenaue Chassierweiterung für die Anordnung von 5 weiteren Sensoren auf ein
Blatt Millimeterpapier. Die Sensoranordnung bekamen auch gleich eine feste Namensbezeichnung.

L_90 = Links Voll 90°
L_45 = Links 45°
M_0 = Mitte 0°
R_45 = Rechts 45°
R_90 = Rechts Voll 90°

Nachdem ich nun alle Teile für die neue Chassierweiterung fertig skiziert hatte, schnitt ich
die skizierten Layouts aus und zeichnete die Ränder dann auf eine 5 mm dicke Acrylplatte nach,
bis ich alle Teile auf der Acrylplatte abgebildet hatte. Anschließend sägte ich dann mit einem
Dremel und einem geeigneten Sägeblatt, die Teile auf der Acrylplatte heraus und bohrte mit einer
Standbohrmaschine die Löcher für die Winkel, Chassi, Sensor, Servo, Platinen, Lenkrollenbefestigungen
und der Kabellöscher für die Sensoren in alle Teile. Nun konnte der Zusammenbau erfolgen.
Schon in recht kurzer Zeit, wie man auf dem oberen Bild erkennen kann, war die neue Chassierweiterung
zusammengebaut und am Hauptchassi montiert. Ich begann sofort mit der Montierung der neuen Sensoren,
dem Servo und der gesamten Verkabelung, die sich dann auf der Verbindungsebene wieder zusammenfanden
um von den GPIO´s angesprochen werden zu können.


Modulebene

Eine weitere Ebene für die Servosteuerung wird hinzugefügt.

Nach einiger Zeit, bekamm ich dann auch den neuen Servocontroller
(16-Channel 12-bit PWM/Servo Driver-I2C interface-PCA9685 for Arduino [13] ) geliefert.
Um diesen nun auch anschließen zu können, benötigte ich wiederum eine weitere Ebene.
Diese wurde dann mit ein paar Distanzbolzen recht schnell aufgebaut und der Servocontroller
fand dort seinen Platz. Auch kam noch ein weiterer MCP23017 Portexpander hinzu.
Dieser soll anfänglich erstmal die Blinker LED´s mit übernehmen. Im späteren Verlauf wurde
diese Ebene zur Modulebene und der Portexpander bekam eine weitere Aufgabe, um ein 2/ Channel Kanal 5V Relais Relay Module Modul f Arduino DSP AVR PIC ARM C8 [14] für zwei Laserdioden anzusteuern.
Um die Modulebene mit einer zusätzlichen Stromquelle zu versorgen, setze ich auf der Stromebene
eine 5V 5600 mAh Akkubank, auf die neu enstandene Chassierweiterung und schloss diese dann mit
einem USB Kabel an ein 3.3V/ 5V Netzteil-Adapter Supply Power Module Adapter MB102 [15] ,
an die Modulebene mit an. Somit hatte der Roboter, dort nun eine zusätzliche 5V Stromversorgung zur Verfügung.
Da durch diese ständigen Erweiterungen der Roboter auch immer mehr an Gewicht zugenommen hatte,
bekam ich langsam ein Problem mit den Motoren und der Räder. Ich bestellte also zwei neue stärkere
Gear Motor 3 - 224:1 90 Degree Shaft [16] Motoren. Da die alten Räder
mit den neuen Motor nicht mehr kompatibel waren, bestellte ich noch zwei (GM Series Plastic Wheels [17]) dazu.
Als der Motorumbau durch war, kam der Roboter auf meinem Teppichboden auch nun wieder vom Fleck weg.
Jedoch hat der Roboter durch diesen Umbau seine Geschwindigkeit eingebüst, die er bis dato auf glatten Böden hatte.
Er war also langsamer unterwegs. Was bei seiner Bauhöhe und dem Gewicht auch ok war.
Wie Ihr mittlerweile beim Lesen des Entwicklungsverlaufes feststellen könnt, habe ich häufiger
weitere Teile des Roboters mit der Zeit ausgetauscht. Die Erfahrung die ich bis hierher mit allen
Teilen gesammelt habe, werden in späteren Projekten sehr hilfreich sein, um direkt von anfang an die richtigen Teile zu kaufen.




Nun wie man im Video sehen kann, ist sein Fahr- und Messverhalten durch
die verschiedenen Umabumaßnahmen, weitaus genauer und ruhiger geworden.


Remote Controll NetIO APP

Raspobot´s remote Steuerung (NetIO APP)

Ein Besuch der Makerfair 2015 in Hannover diente als Motivationsschub endlich eine
remote Steuerungssoftware für den Roboter zu implementieren. Auf der Makerfair lernte
ich den App Entwickler David Eickhoff kennen. Dieser hatte dort seine Software NetIO APP vorgestellt.
Schnell stellte ich in unserem Gespräch fest, dass diese Software genau konnte, was ich schon länger erfolglos versucht hatte.
Ich konnte es garnicht erwarten wieder zu Hause zu sein und mir diese Software genauer anzuschauen.

Die NetIO App arbeitet unabhängig von der Hardware und kann mit jeder Art von TCP/UDP/HTTP/HTTPS Server kommunizieren.
Damit besteht die Möglichkeit jede Art von PCs oder andere Mini-Computer zu steuern.
Ob Media-Player Fernsteuerung oder einfach nur das Starten von Programmen über ein Smartphone.
Hier werden zwei Server vorgestellt (Python und Java), die als Startpunkt für die eigene Implementierung genutzt werden können.
Quellenangabe: [18]

Schon nach recht kurzer Zeit, konnte ich im online Editor mir eine Grafische Oberfläche zusammenbauen
und in dem Python Script mit integrieren. Ziel war es dass der TCP Server (Python Script)
auf dem Pi beim Bootvorgang mit gestartet wurde. Nachdem dann die Verbindung mit dem Tablet
hergestellt wurde, sollten wiederum andere Python Scripte vom Tablet aus gestartet und beendet werden.
Dies gelang mir nach ein wenig Anpassung des Python Scripts. Ich arbeite hier in diesem Fall mit subprocess.

Programmcode Remote Controll Gui "JSON"

{
	"navBackground": "30,169,164",
	"name": "Raspobot-Makerfair",
	"pagebuttonwidth": "static",
	"navigation": "fixed",
	"preventSleep": false,
	"style": "flat",
	"connections": [
		{
			"host": "192.168.2.61",
			"protocol": "tcp",
			"name": "Adhoc_Netio",
			"port": 12340
		}
	],
	"theme": "dark",
	"version": 2,
	"orientation": "portrait",
	"device": "HTC One",
	"type": "NetIOConfiguration",
	"pages": [
		{
			"sound": "active",
			"name": "RPi Controll TCP",
			"items": [
				{
					"requiresSendReponse": false,
					"sends": [
						"temp an"
					],
					"type": "button",
					"top": 370,
					"label": "Termperatur on",
					"height": 20,
					"width": 100,
					"shape": "rounded",
					"fontsize": 12,
					"background": "4,0,33",
					"textcolor": "102,190,35",
					"border": "207,195,25",
					"left": 10
				},
				{
					"requiresSendReponse": false,
					"sends": [
						"stop autonom"
					],
					"type": "button",
					"top": 280,
					"label": "Autonom Stop",
					"height": 20,
					"width": 100,
					"shape": "rounded",
					"fontsize": 12,
					"background": "4,0,33",
					"textcolor": "35,154,190",
					"border": "42,211,177",
					"left": 190
				},
				{
					"requiresSendReponse": false,
					"sends": [
						"start autonom"
					],
					"type": "button",
					"top": 280,
					"label": "Start Autonom ",
					"height": 20,
					"width": 100,
					"shape": "rounded",
					"fontsize": 12,
					"background": "4,0,33",
					"textcolor": "45,190,35",
					"border": "207,195,25",
					"left": 10
				},
				{
					"requiresSendReponse": false,
					"sends": [
						"/usr/bin/sudo /sbin/shutdown -r now"
					],
					"type": "button",
					"top": 50,
					"label": "RPi reboot",
					"height": 20,
					"width": 90,
					"shape": "rounded",
					"fontsize": 12,
					"background": "4,0,33",
					"release": "/usr/bin/sudo /sbin/shutdown -r now",
					"textcolor": "190,113,35",
					"border": "184,215,28",
					"left": 10
				},
				{
					"requiresSendReponse": false,
					"sends": [
						"poweroff"
					],
					"type": "button",
					"top": 50,
					"label": "RPi shutdown",
					"height": 20,
					"width": 90,
					"shape": "rounded",
					"fontsize": 12,
					"background": "4,0,33",
					"release": "halt",
					"textcolor": "190,113,35",
					"border": "184,215,28",
					"left": 200
				},
				{
					"text": "Raspobot Controll",
					"top": 10,
					"height": 30,
					"width": 280,
					"fontsize": 25,
					"background": "11,36,68",
					"type": "label",
					"textcolor": "107,184,55",
					"border": "107,184,55",
					"left": 10
				},
				{
					"textcolor": "207,195,25",
					"requiresSendReponse": false,
					"sends": [
						"ruelps"
					],
					"border": "184,215,28",
					"top": 460,
					"height": 20,
					"width": 40,
					"shape": "rounded",
					"fontsize": 12,
					"background": "4,0,33",
					"label": "S1",
					"type": "button",
					"left": 250
				},
				{
					"textcolor": "218,0,0",
					"requiresSendReponse": false,
					"sends": [
						"GPIO.cleanup()"
					],
					"border": "0,0,244",
					"top": 50,
					"height": 20,
					"width": 60,
					"shape": "rounded",
					"fontsize": 12,
					"background": "4,0,33",
					"label": "GPIO´s off",
					"type": "button",
					"left": 120
				},
				{
					"textcolor": "218,0,0",
					"requiresSendReponse": false,
					"sends": [
						"laser"
					],
					"border": "0,0,244",
					"top": 340,
					"height": 20,
					"width": 60,
					"shape": "rounded",
					"fontsize": 12,
					"background": "4,0,33",
					"label": "Laser",
					"type": "button",
					"left": 120
				},
				{
					"requiresSendReponse": false,
					"sends": [
						"oh-kaputt"
					],
					"type": "button",
					"top": 490,
					"label": "S3",
					"height": 20,
					"width": 40,
					"shape": "rounded",
					"fontsize": 12,
					"background": "4,0,33",
					"textcolor": "207,195,25",
					"border": "184,215,28",
					"left": 10
				},
				{
					"textcolor": "102,190,35",
					"requiresSendReponse": false,
					"sends": [
						"start talk"
					],
					"border": "207,195,25",
					"top": 430,
					"height": 20,
					"width": 60,
					"shape": "rounded",
					"fontsize": 12,
					"background": "4,0,33",
					"label": "Talk on",
					"type": "button",
					"left": 10
				},
				{
					"textcolor": "21,76,205",
					"requiresSendReponse": false,
					"sends": [
						"stop talk"
					],
					"border": "42,211,177",
					"top": 430,
					"height": 20,
					"width": 60,
					"shape": "rounded",
					"fontsize": 12,
					"background": "4,0,33",
					"label": "Talk off",
					"type": "button",
					"left": 230
				},
				{
					"textcolor": "207,195,25",
					"requiresSendReponse": false,
					"sends": [
						"umgebung"
					],
					"border": "42,211,177",
					"top": 290,
					"height": 20,
					"width": 60,
					"shape": "rounded",
					"fontsize": 10,
					"background": "4,0,33",
					"label": "Umgebung",
					"type": "button",
					"left": 120
				},
				{
					"textcolor": "207,195,25",
					"requiresSendReponse": false,
					"sends": [
						"S46"
					],
					"border": "184,215,28",
					"top": 490,
					"height": 20,
					"width": 40,
					"shape": "rounded",
					"fontsize": 12,
					"background": "4,0,33",
					"label": "S46",
					"type": "button",
					"left": 250
				},
				{
					"textcolor": "207,195,25",
					"requiresSendReponse": false,
					"sends": [
						"S42"
					],
					"border": "184,215,28",
					"top": 460,
					"height": 20,
					"width": 40,
					"shape": "rounded",
					"fontsize": 12,
					"background": "4,0,33",
					"label": "S42",
					"type": "button",
					"left": 10
				},
				{
					"requiresSendReponse": false,
					"sends": [
						"start autonom MK"
					],
					"type": "button",
					"top": 340,
					"label": "Start Autonom MK",
					"height": 20,
					"width": 100,
					"shape": "rounded",
					"fontsize": 12,
					"background": "4,0,33",
					"textcolor": "45,190,35",
					"border": "207,195,25",
					"left": 10
				},
				{
					"requiresSendReponse": false,
					"sends": [
						"start autonom L"
					],
					"type": "button",
					"top": 310,
					"label": "Start Autonom L",
					"height": 20,
					"width": 100,
					"shape": "rounded",
					"fontsize": 12,
					"background": "4,0,33",
					"textcolor": "45,190,35",
					"border": "207,195,25",
					"left": 10
				},
				{
					"textcolor": "102,190,35",
					"requiresSendReponse": false,
					"sends": [
						"licht an"
					],
					"border": "207,195,25",
					"top": 400,
					"height": 20,
					"width": 70,
					"shape": "rounded",
					"fontsize": 12,
					"background": "4,0,33",
					"label": "Licht on",
					"type": "button",
					"left": 10
				},
				{
					"requiresSendReponse": false,
					"sends": [
						"stop autonom L"
					],
					"type": "button",
					"top": 310,
					"label": "Autonom L Stop",
					"height": 20,
					"width": 100,
					"shape": "rounded",
					"fontsize": 12,
					"background": "4,0,33",
					"textcolor": "35,154,190",
					"border": "42,211,177",
					"left": 190
				},
				{
					"requiresSendReponse": false,
					"sends": [
						"stop autonom MK"
					],
					"type": "button",
					"top": 340,
					"label": "Autonom MK Stop",
					"height": 20,
					"width": 100,
					"shape": "rounded",
					"fontsize": 12,
					"background": "4,0,33",
					"textcolor": "35,154,190",
					"border": "42,211,177",
					"left": 190
				},
				{
					"textcolor": "21,76,205",
					"requiresSendReponse": false,
					"sends": [
						"licht aus"
					],
					"border": "42,211,177",
					"top": 400,
					"height": 20,
					"width": 70,
					"shape": "rounded",
					"fontsize": 12,
					"background": "4,0,33",
					"label": "Licht off",
					"type": "button",
					"left": 220
				},
				{
					"requiresSendReponse": false,
					"sends": [
						"temp aus"
					],
					"type": "button",
					"top": 370,
					"label": "Temperatur off",
					"height": 20,
					"width": 100,
					"shape": "rounded",
					"fontsize": 12,
					"background": "4,0,33",
					"textcolor": "21,76,205",
					"border": "42,211,177",
					"left": 190
				},
				{
					"url": "http://192.168.2.61/html/index.php#",
					"top": 80,
					"height": 190,
					"width": 280,
					"type": "webview",
					"left": 10
				},
				{
					"text": "Up",
					"top": 370,
					"height": 20,
					"width": 60,
					"fontsize": 9,
					"textcolor": "102,190,35",
					"type": "label",
					"left": 120
				},
				{
					"textcolor": "230,230,230",
					"icon": "up",
					"requiresSendReponse": false,
					"sends": [
						"forward start"
					],
					"border": "104,39,160",
					"top": 390,
					"height": 20,
					"width": 40,
					"shape": "rounded",
					"background": "45,45,45",
					"release": "stop1",
					"label": "",
					"type": "button",
					"left": 130
				},
				{
					"text": "Left",
					"top": 450,
					"height": 20,
					"width": 70,
					"fontsize": 9,
					"textcolor": "102,190,35",
					"type": "label",
					"left": 60
				},
				{
					"textcolor": "230,230,230",
					"icon": "left",
					"requiresSendReponse": false,
					"sends": [
						"forward left"
					],
					"border": "104,39,160",
					"top": 430,
					"height": 20,
					"width": 30,
					"shape": "rounded",
					"background": "45,45,45",
					"release": "stop1",
					"label": "",
					"type": "button",
					"left": 80
				},
				{
					"textcolor": "230,230,230",
					"icon": "right",
					"requiresSendReponse": false,
					"sends": [
						"forward right"
					],
					"border": "104,39,160",
					"top": 430,
					"height": 20,
					"width": 30,
					"shape": "rounded",
					"background": "45,45,45",
					"release": "stop1",
					"label": "",
					"type": "button",
					"left": 190
				},
				{
					"text": "Right",
					"top": 450,
					"height": 20,
					"width": 70,
					"fontsize": 9,
					"textcolor": "102,190,35",
					"type": "label",
					"left": 170
				},
				{
					"textcolor": "56,162,30",
					"icon": "down",
					"requiresSendReponse": false,
					"sends": [
						"backward start"
					],
					"border": "104,39,160",
					"top": 470,
					"height": 20,
					"width": 40,
					"shape": "rounded",
					"background": "45,45,45",
					"release": "stop1",
					"label": "",
					"type": "button",
					"left": 130
				},
				{
					"text": "Down",
					"top": 490,
					"height": 20,
					"width": 60,
					"fontsize": 9,
					"textcolor": "102,190,35",
					"type": "label",
					"left": 120
				},
				{
					"requiresSendReponse": false,
					"sends": [
						"stop"
					],
					"type": "button",
					"top": 420,
					"label": "STOP",
					"height": 40,
					"width": 60,
					"shape": "rounded",
					"fontsize": 9,
					"background": "45,45,45",
					"left": 120,
					"release": "stop",
					"textcolor": "126,8,8",
					"border": "104,39,160",
					"icon": "stop"
				},
				{
					"textcolor": "207,195,25",
					"requiresSendReponse": false,
					"sends": [
						"start autonom LU"
					],
					"border": "184,215,28",
					"top": 520,
					"height": 20,
					"width": 60,
					"shape": "rounded",
					"fontsize": 9,
					"background": "4,0,33",
					"label": "ALU on",
					"type": "button",
					"left": 10
				},
				{
					"textcolor": "207,195,25",
					"requiresSendReponse": false,
					"sends": [
						"stop autonom LU"
					],
					"border": "184,215,28",
					"top": 520,
					"height": 20,
					"width": 60,
					"shape": "rounded",
					"fontsize": 9,
					"background": "4,0,33",
					"label": "ALU off",
					"type": "button",
					"left": 230
				},
				{
					"textcolor": "207,195,25",
					"requiresSendReponse": false,
					"sends": [
						"start talk slow"
					],
					"border": "207,195,25",
					"top": 520,
					"height": 20,
					"width": 60,
					"shape": "rounded",
					"fontsize": 9,
					"background": "4,0,33",
					"label": "Talk on slow",
					"type": "button",
					"left": 80
				},
				{
					"textcolor": "207,195,25",
					"requiresSendReponse": false,
					"sends": [
						"stop talk slow"
					],
					"border": "207,195,25",
					"top": 520,
					"height": 20,
					"width": 60,
					"shape": "rounded",
					"fontsize": 9,
					"background": "4,0,33",
					"label": "Talk off slow",
					"type": "button",
					"left": 160
				},
				{
					"requiresSendReponse": false,
					"sends": [
						"uhr start"
					],
					"type": "button",
					"top": 490,
					"label": "Start Uhr",
					"height": 20,
					"width": 50,
					"shape": "rounded",
					"fontsize": 9,
					"background": "4,0,33",
					"textcolor": "207,195,25",
					"border": "184,215,28",
					"left": 60
				},
				{
					"requiresSendReponse": false,
					"sends": [
						"uhr stop"
					],
					"type": "button",
					"top": 490,
					"label": "Stop Uhr",
					"height": 20,
					"width": 50,
					"shape": "rounded",
					"fontsize": 9,
					"background": "4,0,33",
					"textcolor": "207,195,25",
					"border": "184,215,28",
					"left": 190
				},
				{
					"textcolor": "207,195,25",
					"requiresSendReponse": false,
					"sends": [
						"temp1 an"
					],
					"border": "184,215,28",
					"top": 550,
					"height": 20,
					"width": 60,
					"shape": "rounded",
					"fontsize": 8,
					"background": "4,0,33",
					"label": "Temperatur on",
					"type": "button",
					"left": 80
				},
				{
					"textcolor": "207,195,25",
					"requiresSendReponse": false,
					"sends": [
						"kompass an"
					],
					"border": "184,215,28",
					"top": 550,
					"height": 20,
					"width": 60,
					"shape": "rounded",
					"fontsize": 9,
					"background": "4,0,33",
					"label": "Kompass on",
					"type": "button",
					"left": 10
				},
				{
					"textcolor": "207,195,25",
					"requiresSendReponse": false,
					"sends": [
						"temp1 aus"
					],
					"border": "184,215,28",
					"top": 550,
					"height": 20,
					"width": 60,
					"shape": "rounded",
					"fontsize": 8,
					"background": "4,0,33",
					"label": "Temperatur off",
					"type": "button",
					"left": 160
				},
				{
					"textcolor": "207,195,25",
					"requiresSendReponse": false,
					"sends": [
						"kompass aus"
					],
					"border": "184,215,28",
					"top": 550,
					"height": 20,
					"width": 60,
					"shape": "rounded",
					"fontsize": 9,
					"background": "4,0,33",
					"label": "Kompass off",
					"type": "button",
					"left": 230
				}
			],
			"label": "RPi Controll TCP",
			"height": 570,
			"width": 300,
			"connection": "Adhoc_Netio",
			"background": "40,40,40",
			"fitToScreen": true,
			"textcolor": "230,230,230"
		}
	],
	"switchOnSwipe": false,
	"description": "Robotcontroller"
}


Programmcode TCP Socket Server

#!/usr/bin/python
 
import os
import sys
import glob
import math
import time
import smbus
import random
import socket
import select
import thread
import serial
import signal
import datetime
import asyncore
import subprocess
import pygame.mixer
import sys, traceback
import RPi.GPIO as GPIO
import Adafruit_SSD1306
import Adafruit_GPIO.SPI as SPI
from Adafruit_PWM_Servo_Driver import PWM
from time import sleep, gmtime, localtime, strftime
from PIL import Image, ImageDraw, ImageFont, ImageOps
 
 
GPIO.setup
GPIO.setwarnings(False)
GPIO.cleanup()
GPIO.setmode(GPIO.BOARD)
GPIO.setup(19, GPIO.OUT)
GPIO.setup(7, GPIO.OUT)
GPIO.setup(22, GPIO.OUT)
GPIO.setup(11, GPIO.OUT)
 
BUSNR = 1
ADDR = 0x20
ADDR1 = 0x21
IODIRA = 0x00
IODIRB = 0x01
GPIOA = 0x12
GPIOB = 0x13
 
PINAA = [0x00]
PINA10 = [0x88]  # Blinker_rechts
PINA11 = [0x60]  # Brems_licht
PINA12 = [0x14]  # Blinker_links
PINA13 = [0x06]  # Rueck_licht
PINA14 = [0x03]  # Front_licht
PINA15 = [0x03]  # Rueck_licht
 
PINBA = [0x00]
PINB10 = [0x88]  # Blinker_rechts
PINB11 = [0x60]  # Brems_licht
PINB12 = [0x14]  # Blinker_links
PINB13 = [0x06]  # Rueck_licht
PINB14 = [0x03]  # Front_licht
 
PINAA1 = [0x00]
PINA101 = [0x80]
PINA102 = [0x40]
PINA103 = [0xC0]
 
PINBA1 = [0x00]
PINB101 = [0x80]
PINB102 = [0x40]
PINB103 = [0xC0]
 
i2cBus = smbus.SMBus(BUSNR)
i2cBus.write_byte_data(ADDR, IODIRA, 0x00)
i2cBus.write_byte_data(ADDR, IODIRB, 0x01)
i2cBus.write_byte_data(ADDR1, IODIRA, 0x00)
i2cBus.write_byte_data(ADDR1, IODIRB, 0x01)
 
pwm = PWM(0x40)#, debug=True
servoMin = 157
servoMhl3 = 206
servoMhl2 = 262
servoMhl1 = 319
servoMid = 375
servoMhr1 = 431
servoMhr2 = 487
servoMhr3 = 543
servoMax = 600
 
pygame.mixer.init(48000,-16,1,8192)
soundfilesstart = glob.glob("rasposound/start/*.wav")
soundfilesstop = glob.glob("rasposound/stop/*.wav")
soundfilesvorwaerts = glob.glob("rasposound/vorwaerts/*.wav")
soundfilesrueckwaerts = glob.glob("rasposound/rueckwaerts/*.wav")
soundfilesfun = glob.glob("rasposound/fun/*.wav")
soundfilesagro = glob.glob("rasposound/agro/*.wav")
soundfilesdefence = glob.glob("rasposound/defence/*.wav")
soundfilesshutdown = glob.glob("rasposound/shutdown/*.wav")
soundfilesmessenl = glob.glob("rasposound/messen-l/*.wav")
soundfilesmessenr = glob.glob("rasposound/messen-r/*.wav")
soundfileslaser = glob.glob("rasposound/laser/*.wav")
 
 
def LogWrite(str):
    file = open('/var/log/test.txt', "a+")
    file.write(str + '\n')
    file.close()
 
 
def playstart():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   playing SSP Start")
    pygame.mixer.Sound(random.choice(soundfilesstart)).play()
 
 
def playstop():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   playing SSP Stop")
    pygame.mixer.Sound(random.choice(soundfilesstop)).play()
 
 
def playvorwaerts():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   playing SSP Vorwaertz")
    pygame.mixer.Sound(random.choice(soundfilesvorwaerts)).play()
 
 
def playrueckwaerts():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   playing SSP Rueckwaertz")
    pygame.mixer.Sound(random.choice(soundfilesrueckwaerts)).play()
 
 
def playfun():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   playing SSP Fun")
    pygame.mixer.Sound(random.choice(soundfilesfun)).play()
 
 
def playagro():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   playing SSP Agro")
    pygame.mixer.Sound(random.choice(soundfilesagro)).play()
 
 
def playdefence():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   playing SSP Defence")
    pygame.mixer.Sound(random.choice(soundfilesdefence)).play()
 
 
def playshutdown():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   playing SSP Shutdown")
    pygame.mixer.Sound(random.choice(soundfilesshutdown)).play()
 
 
def playmessenl():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   playing SSP Messen Links")
    pygame.mixer.Sound(random.choice(soundfilesmessenl)).play()
 
 
def playmessenr():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   playing SSP Messen Rechts")
    pygame.mixer.Sound(random.choice(soundfilesmessenr)).play()
 
 
def playlaser():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   playing SSP Laser")
    pygame.mixer.Sound(random.choice(soundfileslaser)).play()
 
 
def setServoPulse(channel, pulse):
    pulseLength = 1000000                   # 1,000,000 us per second
    pulseLength /= 60                       # 60 Hz
    print "%d us per period" % pulseLength
    pulseLength /= 4096                     # 12 bits of resolution
    print "%d us per bit" % pulseLength
    pulse *= 1000
    pulse /= pulseLength
    pwm.setPWM(channel, 0, pulse)
 
pwm.setPWMFreq(60)
 
 
class Client(asyncore.dispatcher_with_send):
    def __init__(self, socket=None, pollster=None):
        asyncore.dispatcher_with_send.__init__(self, socket)
        self.data = ''
        if pollster:
            self.pollster = pollster
            pollster.register(self, select.EPOLLIN)
 
    def handle_close(self):
        if self.pollster:
            p = self.pollster
            self.pollster = None
            p.unregister(self)
 
    def handle_read(self):
        receivedData = self.recv(8192)
        if not receivedData:
            self.close()
            return
        receivedData = self.data + receivedData
        while '\n' in receivedData:
            line, receivedData = receivedData.split('\n', 1)
            self.handle_command(line)
        self.data = receivedData
 
    def handle_command(self, line):
        print repr(line)
        if line == "forward start":
            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Manuel Vorwaertz")
            Vorwaerts_fahren()
            self.send('\r\n')
            playvorwaerts()
        elif line == "stop1":
            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Manuel Stop 1")
            Stop1()
            self.send('\r\n')
        elif line == "forward left":
            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Manuel Vorwaertz Links")
            Links_fahren_voll()
            self.send('\r\n')
            playfun()
        elif line == "stop1":
            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Manuel Stop 1")
            Stop1()
            self.send('\r\n')
        elif line == "forward right":
            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Manuel Vorwaertz Rechts")
            Rechts_fahren_voll()
            self.send('\r\n')
            playfun()
        elif line == "stop1":
            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Manuel Stop 1")
            Stop1()
            self.send('\r\n')
        elif line == "backward start":
            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Manuel Rueckwaertz")
            Rueckwaerts_fahren()
            self.send('\r\n')
            playrueckwaerts()
        elif line == "stop1":
            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Manuel Stop 1")
            Stop1()
            self.send('\r\n')
        elif line == "poweroff":
            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Raspobot Shutdown")
            shutdown()
            self.send('\r\n')
            playshutdown()
            time.sleep(4)
        elif line == "stop":
            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Manuel Stop")
            Stop()
            self.send('\r\n')
            playstop()
        elif line == "umgebung":
            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Playing Sound ")
            sound = pygame.mixer.Sound("rasposound/remote/raspobot-sound-umgebung.wav")
            channelA = pygame.mixer.Channel(1)
            channelA.play(sound)
            self.send('\r\n')
        elif line == "/usr/bin/sudo /sbin/shutdown -r now":
            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Reboot")
            restart()
            self.send('\r\n')
            sound = pygame.mixer.Sound("rasposound/remote/raspobot-sound-back.wav")
            channelA = pygame.mixer.Channel(1)
            channelA.play(sound)
            self.send('\r\n')
        elif line == "forward stop":
            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Manuel Vorwaertz Stop")
            Stop()
            self.send('\r\n')
            playstop()
        elif line == "start autonom":
            if self.pollster.auto_command is None:
                self.pollster.auto_command = autonom1()
                self.send('\r\n')
                playstart()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Start Autonom")
        elif line == "stop autonom":
            self.send('\r\n')
            if self.pollster.auto_command is not None:
                Stop2()
                self.pollster.auto_command.terminate()
                self.pollster.auto_command.wait()
                GPIO.cleanup()
                self.pollster.auto_command = None
                self.send('\r\n')
                playstop()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Stop Autonom")
        elif line == "start autonom L":
            if self.pollster.auto_command is None:
                self.pollster.auto_command = autonom_light()
                self.send('\r\n')
                playstart()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Start Autonom Licht")
        elif line == "stop autonom L":
            self.send('\r\n')
            if self.pollster.auto_command is not None:
                Stop2()
                self.pollster.auto_command.terminate()
                self.pollster.auto_command.wait()
                GPIO.cleanup()
                self.pollster.auto_command = None
                self.send('\r\n')
                playstop()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Stop Autonom Licht")
        elif line == "start autonom LU":
            if self.pollster.auto_command is None:
                self.pollster.auto_command = autonom_light_u()
                self.send('\r\n')
                playstart()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Start Autonom Licht umgekehrt")
        elif line == "stop autonom LU":
            self.send('\r\n')
            if self.pollster.auto_command is not None:
                Stop2()
                self.pollster.auto_command.terminate()
                self.pollster.auto_command.wait()
                GPIO.cleanup()
                self.pollster.auto_command = None
                self.send('\r\n')
                playstop()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Stop Autonom Licht umgekehrt")
        elif line == "start autonom MK":
            if self.pollster.auto_command is None:
                self.pollster.auto_command = autonom_kompass()
                self.send('\r\n')
                playstart()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Start Autonom Kompass")
        elif line == "stop autonom MK":
            self.send('\r\n')
            if self.pollster.auto_command is not None:
                Stop2()
                self.pollster.auto_command.terminate()
                self.pollster.auto_command.wait()
                GPIO.cleanup()
                self.pollster.auto_command = None
                self.send('\r\n')
                playstop()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Stop Autonom Kompass")
        elif line == "led chaser an":
            if self.pollster.auto_command is None:
                self.pollster.auto_command = led_chaser()
                self.send('\r\n')
                playstart()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   LED Lauflicht an")
        elif line == "led chaser aus":
            self.send('\r\n')
            if self.pollster.auto_command is not None:
                Stop2()
                self.pollster.auto_command.terminate()
                self.pollster.auto_command.wait()
                GPIO.cleanup()
                self.pollster.auto_command = None
                self.send('\r\n')
                playstop()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   LED Lauflicht aus")
        elif line == "licht an":
            if self.pollster.auto_command is None:
                self.pollster.auto_command = light()
                self.send('\r\n')
                playstart()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Licht an")
        elif line == "licht aus":
            self.send('\r\n')
            if self.pollster.auto_command is not None:
                Stop2()
                lightoff()
                self.pollster.auto_command.terminate()
                self.pollster.auto_command.wait()
                GPIO.cleanup()
                self.pollster.auto_command = None
                self.send('\r\n')
                playstop()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Licht aus")
        elif line == "temp an":
            if self.pollster.auto_command is None:
                self.pollster.auto_command = temp()
                self.send('\r\n')
                playstart()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Temperatur an")
        elif line == "temp aus":
            self.send('\r\n')
            if self.pollster.auto_command is not None:
                Stop2()
                self.pollster.auto_command.terminate()
                self.pollster.auto_command.wait()
                GPIO.cleanup()
                self.pollster.auto_command = None
                self.send('\r\n')
                playstop()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Temperatur aus")
        elif line == "temp1 an":
            if self.pollster.auto_command is None:
                self.pollster.auto_command = temp1()
                self.send('\r\n')
                playstart()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Temperatur1 an")
        elif line == "temp1 aus":
            self.send('\r\n')
            if self.pollster.auto_command is not None:
                Stop2()
                self.pollster.auto_command.terminate()
                self.pollster.auto_command.wait()
                GPIO.cleanup()
                self.pollster.auto_command = None
                self.send('\r\n')
                playstop()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Temperatur1 aus")
        elif line == "kompass an":
            if self.pollster.auto_command is None:
                self.pollster.auto_command = kompass()
                self.send('\r\n')
                playstart()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Kompass an")
        elif line == "kompass aus":
            self.send('\r\n')
            if self.pollster.auto_command is not None:
                Stop2()
                self.pollster.auto_command.terminate()
                self.pollster.auto_command.wait()
                GPIO.cleanup()
                self.pollster.auto_command = None
                self.send('\r\n')
                playstop()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Kompass aus")
        elif line == "start talk":
            if self.pollster.auto_command is None:
                self.pollster.auto_command = sensormode()
                self.send('\r\n')
                playstart()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Start Talk")
        elif line == "stop talk":
            self.send('\r\n')
            if self.pollster.auto_command is not None:
                Stop2()
                self.pollster.auto_command.terminate()
                self.pollster.auto_command.wait()
                GPIO.cleanup()
                self.pollster.auto_command = None
                self.send('\r\n')
                playstop()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Stop Talk")
        elif line == "start talk slow":
            if self.pollster.auto_command is None:
                self.pollster.auto_command = sensormode_slow()
                self.send('\r\n')
                playstart()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Start Talk slow")
        elif line == "stop talk slow":
            self.send('\r\n')
            if self.pollster.auto_command is not None:
                Stop2()
                self.pollster.auto_command.terminate()
                self.pollster.auto_command.wait()
                GPIO.cleanup()
                self.pollster.auto_command = None
                self.send('\r\n')
                playstop()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Stop Talk slow")
        elif line == "uhr start":
            if self.pollster.auto_command is None:
                self.pollster.auto_command = uhr()
                self.send('\r\n')
                playstart()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Start Analog Uhr")
        elif line == "uhr stop":
            self.send('\r\n')
            if self.pollster.auto_command is not None:
                Stop2()
                self.pollster.auto_command.terminate()
                self.pollster.auto_command.wait()
                GPIO.cleanup()
                self.pollster.auto_command = None
                self.send('\r\n')
                playstop()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Stop Analog Uhr")
        elif line == "GPIO.cleanup()":
            gpiooff()
            self.send('\r\n')
            playagro()
            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   GPIO Clear")
        else:
            self.send('unknown Command\n')
            print 'unknown Command:', line
 
 
def control_pin_pair(pin1, state1, pin2, state2):
    GPIO.setup
    GPIO.setwarnings(False)
    GPIO.cleanup()
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(10, GPIO.OUT)
    GPIO.setup(4, GPIO.OUT)
    GPIO.setup(25, GPIO.OUT)
    GPIO.setup(17, GPIO.OUT)
    GPIO.output(pin1, state1)
    GPIO.output(pin2, state2)
 
 
def Vorwaerts_fahren():
    GPIO.setup
    GPIO.setwarnings(False)
    GPIO.cleanup()
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(10, GPIO.OUT)
    GPIO.setup(4, GPIO.OUT)
    GPIO.setup(25, GPIO.OUT)
    GPIO.setup(17, GPIO.OUT)
    control_pin_pair(10, True, 4, False)
    control_pin_pair(25, True, 17, True)
 
 
def Rechts_fahren_voll():
    GPIO.setup
    GPIO.setwarnings(False)
    GPIO.cleanup()
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(10, GPIO.OUT)
    GPIO.setup(4, GPIO.OUT)
    GPIO.setup(25, GPIO.OUT)
    GPIO.setup(17, GPIO.OUT)
    control_pin_pair(10, True, 4, True)
    control_pin_pair(25, True, 17, True)
 
 
def Links_fahren_voll():
    GPIO.setup
    GPIO.setwarnings(False)
    GPIO.cleanup()
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(10, GPIO.OUT)
    GPIO.setup(4, GPIO.OUT)
    GPIO.setup(25, GPIO.OUT)
    GPIO.setup(17, GPIO.OUT)
    control_pin_pair(10, True, 4, False)
    control_pin_pair(25, False, 17, True)
 
 
def Rueckwaerts_fahren():
    GPIO.setup
    GPIO.setwarnings(False)
    GPIO.cleanup()
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(10, GPIO.OUT)
    GPIO.setup(4, GPIO.OUT)
    GPIO.setup(25, GPIO.OUT)
    GPIO.setup(17, GPIO.OUT)
    control_pin_pair(10, True, 4, True)
    control_pin_pair(25, False, 17, True)
 
 
def Stop():
    GPIO.setup
    GPIO.setwarnings(False)
    GPIO.cleanup()
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(10, GPIO.OUT)
    GPIO.setup(4, GPIO.OUT)
    GPIO.setup(25, GPIO.OUT)
    GPIO.setup(17, GPIO.OUT)
    control_pin_pair(10, False, 4, False)
    control_pin_pair(25, False, 17, False)
 
 
def Stop1():
    GPIO.setup
    GPIO.setwarnings(False)
    GPIO.cleanup()
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(10, GPIO.OUT)
    GPIO.setup(4, GPIO.OUT)
    GPIO.setup(25, GPIO.OUT)
    GPIO.setup(17, GPIO.OUT)
    control_pin_pair(10, False, 4, False)
    control_pin_pair(25, False, 17, False)
 
 
def Stop2():
    GPIO.setup
    GPIO.setwarnings(False)
    GPIO.cleanup()
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(10, GPIO.OUT)
    GPIO.setup(4, GPIO.OUT)
    GPIO.setup(25, GPIO.OUT)
    GPIO.setup(17, GPIO.OUT)
    control_pin_pair(10, False, 4, False)
    control_pin_pair(25, False, 17, False)
 
 
def lightoff():
    for leds in PINBA:
        i2cBus.write_byte_data(ADDR1, GPIOB, leds)
 
 
def shutdown():
    os.system("poweroff")
 
 
def restart():
    command = "/usr/bin/sudo /sbin/shutdown -r now"
    proc = subprocess.Popen(['sudo', 'reboot'])
    process = subprocess.Popen(command.split(), stdout=subprocess.PIPE)
    output = process.communicate()[0]
    print output
 
 
def autonom1():
    command = ["sudo", "python", "robot-umbau-7-display.py"]
    return subprocess.Popen(command)
 
 
def uhr():
    command = ["sudo", "./uhr1"]
    return subprocess.Popen(command)
 
 
def autonom_light():
    command = ["sudo", "python", "robot-umbau-7-light.py"]
    return subprocess.Popen(command)
 
 
def autonom_light_u():
    command = ["sudo", "python", "robot-umbau-7-light-1.py"]
    return subprocess.Popen(command)
 
 
def autonom_kompass():
    command = ["sudo", "python", "robot-umbau-7-kompass.py"]
    return subprocess.Popen(command)
 
 
def led_chaser():
    command = ["sudo", "python", "led-chaser-small.py"]
    return subprocess.Popen(command)
 
 
def light():
    command = ["sudo", "python", "light.py"]
    return subprocess.Popen(command)
 
 
def temp():
    command = ["sudo", "python", "thermostat2.py"]
    return subprocess.Popen(command)
 
 
def temp1():
    command = ["sudo", "python", "temperatur-kompass.py"]
    return subprocess.Popen(command)
 
 
def kompass():
    command = ["sudo", "python", "compass-2.py"]
    return subprocess.Popen(command)
 
 
def sensormode():
    command = ["sudo", "python", "display3.py"]
    return subprocess.Popen(command)
 
 
def sensormode_slow():
    command = ["sudo", "python", "display3-1.py"]
    return subprocess.Popen(command)
 
 
def laser():
    for leds in PINA103:
        i2cBus.write_byte_data(ADDR1, GPIOA, leds)
        pwm.setPWM(0, 0, servoMid)
        time.sleep(0.5)
        pwm.setPWM(0, 0, servoMhr1)
        time.sleep(0.5)
        pwm.setPWM(0, 0, servoMhr2)
        time.sleep(0.5)
        pwm.setPWM(0, 0, servoMhr3)
        time.sleep(0.5)
        pwm.setPWM(0, 0, servoMax)
        time.sleep(0.5)
        pwm.setPWM(0, 0, servoMhr3)
        time.sleep(0.5)
        pwm.setPWM(0, 0, servoMhr2)
        time.sleep(0.5)
        pwm.setPWM(0, 0, servoMhr1)
        time.sleep(0.5)
        pwm.setPWM(0, 0, servoMid)
        time.sleep(0.5)
        pwm.setPWM(0, 0, servoMhl1)
        time.sleep(0.5)
        pwm.setPWM(0, 0, servoMhl2)
        time.sleep(0.5)
        pwm.setPWM(0, 0, servoMhl3)
        time.sleep(0.5)
        pwm.setPWM(0, 0, servoMin)
        time.sleep(0.5)
        pwm.setPWM(0, 0, servoMhl3)
        time.sleep(0.5)
        pwm.setPWM(0, 0, servoMhl2)
        time.sleep(0.5)
        pwm.setPWM(0, 0, servoMhl1)
        time.sleep(0.5)
        pwm.setPWM(0, 0, servoMid)
        time.sleep(0.6)
        pwm.setPWM(0, 0, servoMax)
        time.sleep(0.6)
        pwm.setPWM(0, 0, servoMin)
        time.sleep(1.5)
        pwm.setPWM(0, 0, servoMax)
        time.sleep(1.5)
        pwm.setPWM(0, 0, servoMin)
        time.sleep(0.6)
        pwm.setPWM(0, 0, servoMid)
        time.sleep(0.6)
    for leds in PINAA1:
        i2cBus.write_byte_data(ADDR1, GPIOA, leds)
        print "laser ende"    
 
 
def gpiooff():
    GPIO.cleanup()
 
 
class Server(asyncore.dispatcher):
    def __init__(self, listen_to, pollster):
        asyncore.dispatcher.__init__(self)
        self.pollster = pollster
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
        self.bind(listen_to)
        self.listen(5)
 
    def handle_accept(self):
        newSocket, address = self.accept()
        print "Connected from", address
        Client(newSocket, self.pollster)
 
 
def readwrite(obj, flags):
    try:
        if flags & select.EPOLLIN:
            obj.handle_read_event()
        if flags & select.EPOLLOUT:
            obj.handle_write_event()
        if flags & select.EPOLLPRI:
            obj.handle_expt_event()
        if flags & (select.EPOLLHUP | select.EPOLLERR | select.POLLNVAL):
            obj.handle_close()
    except socket.error, e:
        if e.args[0] not in asyncore._DISCONNECTED:
           obj.handle_error()
        else:
            obj.handle_close()
    except asyncore._reraised_exceptions:
        raise
    except:
        obj.handle_error()
 
 
class EPoll(object):
    def __init__(self):
        self.epoll = select.epoll()
        self.fdmap = {}
        self.auto_command = None
 
    def register(self, obj, flags):
        fd = obj.fileno()
        self.epoll.register(fd, flags)
        self.fdmap[fd] = obj
 
    def unregister(self, obj):
        fd = obj.fileno()
        del self.fdmap[fd]
        self.epoll.unregister(fd)
 
    def poll(self):
        evt = self.epoll.poll()
        for fd, flags in evt:
            yield self.fdmap[fd], flags
 
 
if __name__ == "__main__":
    pollster = EPoll()
    pollster.register(Server(("", 12340), pollster), select.EPOLLIN)
    while True:
        evt = pollster.poll()
        for obj, flags in evt:
            readwrite(obj, flags)

Ich habe das Script hier etwas eingekürzt, da dort viel mehr Aufrufe vorhanden sind, die jetzt nicht notwendig sind.
Auf der Tablet Ansicht habe ich dann auch endlich den Webstream der Raspi-Kamera mit einbinden können. Dieser Stream zeigt was
Raspobot selber sieht. Dies ist z.B. dann interessant, wenn man ein Roboter als Such und Rettungsroboter konzipiert. Da man dann z.B.
durch Erdbeben verschüttete Menschen, so schneller auffinden kann. Natürlich kann man mit der Raspikamera, noch einiges mehr anstellen.
Jedoch ist dies ein anderes Thema was an vielen anderen Stellen im Netz gut dokumentiert wurde.


Pi and More 7 Trier 2015

Raspobot war auf der Pi and More 7 in Trier.

Im Frühjar 2015 bin ich dann auch in ein neues Haus umgezogen und stellte mich der Herausforderung
den Roboter auch mal in der Öffentlichkeit bei einem Raspberry Pi Jam an der Uni Trier zu präsentieren.
Der Roboter und ich, wir hatten auf diesem Event eine Menge Spass. Es gab viele neugierige,
fragende Besucher die sein Aussehen bewunderten. Die beste Aussage über Raspobot, kam dann von
meinem Tischnachbar dem Pibot [19] Entwickler Thomas Schoch. Er meinte, es wäre
das Skurilste was er bis dato gesehen hatte. Ein paar Tage später stellte ich fest, das ein Reporter
der Zeitschrift Make vom Heise Verlag einen Artikel [20] auf Heise.de veröffentlich hatte.
Dies war einfach nur COOL, auf einer renomierten IT News Plattform etwas über meinen Roboter lesen zu dürfen.
Da ich schon seit Jahren Heise Online lese, um mich tagtäglich in der IT Welt über aktuelle Themen zu informieren,
bin ich sehr Stolz darauf, das mein Projekt dort mit durch das Pi and More Event veröffentlicht wurde.


Raspobot lernt sprechen

Raspobot lernt sprechen und erhält eine weitere Ebene.

Nach dem Event, ist wie vor dem Event. Ich setzte mich zu Hause also wieder daran,
um neue Ideen am Roboter umzusetzen. Also dachte ich mir, dass es doch amüsant wäre,
wenn er auch mal einen Ton von sich gibt. Da der PI von Haus aus nicht besonders mit Sound
umgehen kann, jedoch aber eine 3,5 mm Klinkenbuchse mitbrachte, besorgte ich mir ein weiteres Modul.
Ein LM386 Super MINI Amplifier Board 3V-12V Power Amplifier DE [21]
Dieses und ein Lautsprecher aus einem defekten Optipoint 410 Telefon, waren dann die
Geburt seiner unverwechselbaren Stimme. Damit man seine Stimme aber überhaupt hören konnte,
benötigte ich erstmal eine neue Energiequelle. Diese war dann auch recht schnell gefunden.
Die Stromversorgung übernahm ein 9V 200 mAh Akkublock, der in einer entsprechenden Batteriehalterung
seinen Platz, auf der Energieebene links neben der anderen 5V Akkubank fand.
Nun da die Stromquelle vorhanden war, war die Hardware für seine Stimmme komplett.
Ich verband das Sound Modul durch ein 3,5 mm Klinkenstecker Kabel mit dem Pi und
schon talkte er mich zu. :-) Na ja es war natürlich noch etwas mehr Arbeit notwendig
um ihn einen Ton zu entlocken. Zuerst probierte ich es mit der Software (espeak).
Mit dieser Software kann man sich geschriebene Texte oder entsprechende Scripte,
akustisch ausgeben lassen. Dies war schon mal ein Anfang, jedoch nicht dass was mir so vorschwebte.
Also fragte ich wieder einmal bei Tante Google an und bekam auch gleich die richtige Antwort
in Form eines You Tube Videos [22] was ich hier einmal verlinke.
Da der Ablauf doch recht komplex gewesen war, erstellte ich mir mit der Software (Mausmakro)
recht bald ein kleines Makro. Dabei zeichnet die Mausmakro Software die Mausbewegung
auf dem Desktop auf und kann diese dann später pixelgenau wieder abspielen.
Nun musste ich nur noch hingehen und einige kurze Sprüche mit einem Mikrofon,
in die Audacity Software aufnehmen und das Makro darauf anwenden. Voilà und schon nach
kurzer Zeit hatte Raspobot eine kleine Sammlung an witzigen Sprüchen, die er dann
in seinem Programmcode abrufen konnte. Damit er im Script an einer entsprechenden Stelle
nicht immer das gleiche von sich gibt, erstellte ich einige Ordner auf dem Pi,
wo dann mehrere unterschiedliche Sprüche, die zu den entsprechenden Funktionen
aufgerufen werden konnten, vorhanden waren. Dies erreichte ich dann über eine
Random Funktion die ich in die Scripte mit einbaute. Damit bekam er die Möglichkeit
seine Sprüche dynamisch zu kombinieren und wiederzugeben.


Arduino Sensor Ebene

Umfangreiche Umbauten neuer Hauptakku 7,4V 5000 mAh, Oled Display, Arduino Nano und einige neue Sensoren.

Nun da Raspobot das Sprechen gelernt hatte, standen einige umfangreiche Änderungen an.
Um diese Änderungen umsetzen zu können, benötigte ich wiederum eine weitere Ebene. (Arduino Sensor Ebene)
Im Laufe des Projektes hatte ich alle GPIO´s des Pi´s belegt und hatte mit argen Programabstürzen
in Verbindung mit den Ultraschalsensoren zu kämpfen. Um dies ein für alle mal zu lösen,
baute ich auf der neuen Ebene einen Arduino Nano V3 auf. Diesen schloss ich dann per USB Kabel
direkt an den Pi an. Am Arduino wurden dann alle 6 Ultraschalsensoren vom Roboter angeschlossen.
Auf dem Arduino entwickelte ich zusammen mit der Hilfe von Michael Springwald, den ich auf
der Open Rhein Ruhr ORR 2015 kennengelernt habe und einem Arbeitskollegen aus
dem Fachbereich 03 Elektrotechnik und Informatik Frank Kremer, M. Eng. ein Script, was die
6 HC-SR04 Ultraschalsensoren permanent abfragt und die Daten über eine "thread" Anfrage,
aus dem Python Hauptprogramm des Pi´s, über eine Serielle Verbindung zum Pi, dem Programm zur Verfügung stellt.









Programmcode Arduino HC-SR04 Ultraschalsensoren

#define echoPin_l_90 2 // Echo Pin
#define trigPin_l_90 3 // Trigger Pin
 
#define echoPin_l_45 4 // Echo Pin
#define trigPin_l_45 5 // Trigger Pin
 
#define echoPin_m_0 6 // Echo Pin
#define trigPin_m_0 7 // Trigger Pin
 
#define echoPin_r_45 8 // Echo Pin
#define trigPin_r_45 9 // Trigger Pin
 
#define echoPin_r_90 10 // Echo Pin
#define trigPin_r_90 11 // Trigger Pin
 
#define echoPin_servo 12 // Echo Pin
#define trigPin_servo 14 // Trigger Pin
 
#define LEDPin 13 // Onboard LED
 
int maximumRange = 200; // Maximum range needed
int minimumRange = 0; // Minimum range needed
float distl90, distl45, distm0, distr45, distr90, distservo;
 
 
char Data[12]; // Funktion
int z = 0;
char ch;
boolean isEnde=false;
 
void setup() {
 Serial.begin (115200);
 pinMode(trigPin_l_90, OUTPUT);
 pinMode(echoPin_l_90, INPUT);
 digitalWrite(echoPin_l_90,LOW);
 
 pinMode(trigPin_l_45, OUTPUT);
 pinMode(echoPin_l_45, INPUT);
 digitalWrite(echoPin_l_90,LOW);
 
 pinMode(trigPin_m_0, OUTPUT);
 pinMode(echoPin_m_0, INPUT);
 digitalWrite(echoPin_m_0,LOW);
 
 pinMode(trigPin_r_45, OUTPUT);
 pinMode(echoPin_r_45, INPUT);
 digitalWrite(echoPin_r_45,LOW);
 
 pinMode(trigPin_r_90, OUTPUT);
 pinMode(echoPin_r_90, INPUT);
 digitalWrite(echoPin_r_90,LOW);
 
 pinMode(trigPin_servo, OUTPUT);
 pinMode(echoPin_servo, INPUT);
 digitalWrite(echoPin_servo,LOW);
 
 pinMode(LEDPin, OUTPUT); // Use LED indicator (if required)
}
 
 
 
void loop() {
 
  if (Serial.available() ) {    
    ch=Serial.read(); 
          digitalWrite(LEDPin,HIGH);
    if (ch == '@') {
      isEnde=ch == '@';
 
      if (isEnde == true) {
        if (strcmp(Data, "DS") == 0) {
          ReadSensorData();
        }
      }
 
      for (int x=0; x <z; x++) Data[x]='\0'; 
      z=0; 
    }
    else {
      Data[z]=ch; 
      z=z+1; 
    }    
  }
 
 
delay(100);
 
}
 
void ReadSensorData() {
 
  distl90 = distance(trigPin_l_90,echoPin_l_90);
  delayMicroseconds(20);
  distl45 = distance(trigPin_l_45,echoPin_l_45);
  delayMicroseconds(20);
  distm0 = distance(trigPin_m_0,echoPin_m_0);
  delayMicroseconds(20);
  distr45 = distance(trigPin_r_45,echoPin_r_45);
  delayMicroseconds(20);
  distr90 = distance(trigPin_r_90,echoPin_r_90);
  delayMicroseconds(20);
  distservo = distance(trigPin_servo,echoPin_servo);
  Serial.print("l90;");
  Serial.print(distl90);
  Serial.print(";l45;");
  Serial.print(distl45);
  Serial.print(";m0;");
  Serial.print(distm0);
  Serial.print(";r45;");
  Serial.print(distr45);
  Serial.print(";r90;");
  Serial.print(distr90);
  Serial.print(";servo;");
  Serial.print(distservo);
  Serial.print(";\r\n");
}
 
float distance(long trigPin, long echoPin) {
  long duration;
  float distance;
 
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
 
  duration = pulseIn(echoPin, HIGH, 100000); 
  distance = (duration/2)/29.1;
  return distance;
 
}

Nachdem dieses Problem endlich gelöst war und der Roboter endlich stabile
und verlässliche Messdaten generieren konnte, wandte ich mich wiederum einem
altbekanntem Problem der Energieversorgung zu. Da die Bleiakkus mittlerweile,
bei der Menge an Modulen nur noch für kurze Zeit Strom zur Verfügung stellen
konnten, bestellte ich ein paar 7,4V 5000 mAh Lipoakkus [23].
Da diese Akkus eine andere Bauform und auch andere Anschlüsse hatten,
baute ich auf der Energieebene eine Akkuhalterung aus Lochband auf.
Desweiteren erweiterte ich wiederum einmal das Stromverbindungskabel mit
einem kleinen Apadpter Bananenstecker auf Kabelschuh.
Somit konnte ich die neuen Akkus auch in Betrieb nehmen.
Dieses Akku betreibt den Roboter, nun wieder für gute 2 Stunden.

Mit der neuen Ebene fügte ich auch ein kleines SSD1306 128x64 OLED Display [24] hinzu.
Dieses brachte ich zusammen mit der Kamera im vorderen Sichtbereich mit einem
Stück Acrylglas, zwischen der Sensor- und der Modulebene an. Auf diesem Display
werden beim Bootvorgang, die per DHCP [25] erhaltenen IP Adressen für LAN und WLAN angezeigt.
Desweiteren gibt das Display die Umgebungstemperatur, gemessen von einem MCP9808 Temperatursensors [26] aus.
Jedoch schwebte mir ein anderer Gedanke im Kopf herum. Und zwar animierte Augen
die sich im Programmablauf, auf die gemessenen Distanzen entsprechend reagieren.


Programmcode IP Ausgabe auf dem OLED Display

import os
import re
import time
import socket
import fcntl
import struct
import datetime
import sys, traceback
from smbus import SMBus
from urllib import urlopen
from lib_sh1106 import sh1106
from PIL import ImageFont, ImageDraw, Image
from time import sleep, gmtime, localtime, strftime
 
i2cbus = SMBus(1)
oled = sh1106(i2cbus)
draw = oled.canvas
 
font = ImageFont.load_default()
oled.cls()
 
 
def LogWrite(str):
    file = open('/var/log/test.txt', "a+")
    file.write(str + '\n')
    file.close()
 
 
def getPublicIp():
    data = str(urlopen('http://checkip.dyndns.com/').read())
    return re.compile(r'Address: (\d+\.\d+\.\d+\.\d+)').search(data).group(1)
 
 
def get_ip_address(ifname):
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        return socket.inet_ntoa(fcntl.ioctl(
            s.fileno(),
            0x8915,  # SIOCGIFADDR
            struct.pack('256s', ifname[:15])
        )[20:24])
    except:
      return 'null'
 
 
draw.text((0, 1), strftime('Time: ' '%I:%M:%S %p') , font=font, fill=1) 
draw.text((0, 14), strftime('%a, %b %d %Y'), font=font, fill=1) 
 
 
s=get_ip_address('wlan0')
if s != 'null':
    draw.text((1,26),'WLAN: ' + s,font=font,fill=1)
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   WLAN   "+ s);
 
s=get_ip_address('eth0')
if s != 'null':
    draw.text((1,38),'ETH0: ' + s,font=font,fill=1)
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   ETH0   "+ s);
 
data=getPublicIp()
if data != r'Address: (\d+\.\d+\.\d+\.\d+)':
    draw.text((1,50),'WAN:  ' + data,font=font,fill=1)
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   WAN   "+ data);
 
oled.display()


Programmcode Termperatur & Kompass Ausgabe aus dem Oled Display mit akustischer Warnhinweise von Raspobot

#!/usr/bin/python
# coding: utf-8
 
import os
import sys
import math
import time
import glob
import smbus
import Image
import random
import datetime
import ImageFont
import ImageDraw
import pygame.mixer
import RPi.GPIO as GPIO
import Adafruit_SSD1306
import Adafruit_MCP9808.MCP9808 as MCP9808
from time import gmtime, localtime, strftime
 
bus = smbus.SMBus(1)
address = 0x1e
disp = Adafruit_SSD1306.SSD1306_128_64(rst=27)
sensor = MCP9808.MCP9808()
 
anim_state = 'none'
disp.begin()
sensor.begin()
disp.clear()
disp.dim(True)
disp.set_contrast(0)
disp.display()
 
pygame.mixer.init(48000, -16, 1, 8192)
soundfileswarm = glob.glob("rasposound/temperatur-warm/*.wav")
soundfileskalt = glob.glob("rasposound/temperatur-kalt/*.wav")
 
def read_byte(adr):
    return bus.read_byte_data(address, adr)
 
def read_word(adr):
    high = bus.read_byte_data(address, adr)
    low = bus.read_byte_data(address, adr+1)
    val = (high << 8) + low
    return val
 
def read_word_2c(adr):
    val = read_word(adr)
    if (val >= 0x8000):
        return -((65535 - val) + 1)
    else:
        return val
 
def write_byte(adr, value):
    bus.write_byte_data(address, adr, value)
 
write_byte(0, 0b01110000) # Set to 8 samples @ 15Hz
write_byte(1, 0b00100000) # 1.3 gain LSb / Gauss 1090 (default)
write_byte(2, 0b00000000) # Continuous sampling
 
scale = 0.92
 
 
def LogWrite(str):
    file = open('/var/log/test.txt', "a+")
    file.write(str + '\n')
    file.close()
 
 
def playwarm():
    LogWrite("playing warm")
    pygame.mixer.Sound(random.choice(soundfileswarm)).play()
    time.sleep(3)
 
 
def playkalt():
    LogWrite("playing kalt")
    pygame.mixer.Sound(random.choice(soundfileskalt)).play()
    time.sleep(3)
 
 
def drawShadowedText(draw, x, y, text, font):
	draw.text((x, y+1), text, font=font, fill=0)
	draw.text((x+1, y), text, font=font, fill=0)
	draw.text((x+1, y+1), text, font=font, fill=0)
	draw.text((x, y-1), text, font=font, fill=0)
	draw.text((x-1, y), text, font=font, fill=0)
	draw.text((x, y), text, font=font, fill=255)
 
 
while True:
 
	if anim_state == 'none':
		try:
			temp = sensor.readTempC()
		except IOError as e:
			print "IOError(readTempC) ({0}): {1}".format(e.errno, e.strerror)
 
	currenttime = strftime("%H:%M", localtime())
	width = disp.width
	height = disp.height
	image = Image.new('1', (width, height))
	draw = ImageDraw.Draw(image)
	draw.rectangle((0,0,width,height), outline=0, fill=0)
	fontDefault = ImageFont.load_default()
	fontBig = ImageFont.truetype('/usr/share/fonts/truetype/freefont/FreeSans.ttf', size=20)
	fontSmall = ImageFont.truetype('/usr/share/fonts/truetype/freefont/FreeSansBold.ttf', size=8)
	fontSmall1 = ImageFont.truetype('/usr/share/fonts/truetype/freefont/FreeSansBold.ttf', size=14)
	fontLarge = ImageFont.truetype('/usr/share/fonts/truetype/freefont/FreeSans.ttf', size=20)	
	fontMed = ImageFont.truetype('/usr/share/fonts/truetype/freefont/FreeSans.ttf', size=14)
	fontMed1 = ImageFont.truetype('/usr/share/fonts/truetype/freefont/FreeSans.ttf', size=12)
 
        drawShadowedText(draw, 1, 18, "Temperatur: ", fontMed1)
	drawShadowedText(draw, 75, 18, str(round(temp,1)),  fontMed1)
        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Temperatur: "+ str(round(temp,1))+" °C");
        drawShadowedText(draw, 98, 18, u' °C', fontMed1)
	drawShadowedText(draw, 1, 0, strftime("%d/%m/%Y %H:%M:%S", localtime()), fontDefault);
 
        if float(temp) > 26:
            playwarm()
            drawShadowedText(draw, 1, 50, "warm", fontMed)
        elif float(temp) < 25:
            playkalt()
            drawShadowedText(draw, 88, 50, "kalt", fontMed)
 
        if range(0,1000):
            x_out = read_word_2c(3) * scale
            y_out = read_word_2c(7) * scale
            z_out = read_word_2c(5) * scale
 
            bearing  = math.atan2(y_out, x_out) #y_out, x_out
            if int(bearing < 0):
                bearing += 2 * math.pi
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Kompass   "+ str(int(math.degrees(bearing)))+"°")
            drawShadowedText(draw, 1, 35, "Kompass: ", fontSmall1)
            drawShadowedText(draw, 75, 35, str(int(math.degrees(bearing)))+ u' °',  fontSmall1)
	disp.image(image)
	oldimage = Image.new('1', (width, height))
	oldimage.paste(image,(0,0))
 
	try:
		disp.display()
	except IOError as e:
		print "IOError(display) ({0}): {1}".format(e.errno, e.strerror)
 
	if anim_state == 'none':
		time.sleep(0.01)


Programmcode Kompass Ausgabe aus dem Oled Display

#!/usr/bin/python
# coding: utf-8
 
import os
import sys
import time
import math
import smbus
import Image
import datetime
import ImageFont
import ImageDraw
import RPi.GPIO as GPIO
import Adafruit_SSD1306
from time import gmtime, localtime, strftime
 
bus = smbus.SMBus(1)
address = 0x1e
disp = Adafruit_SSD1306.SSD1306_128_64(rst=27)
 
disp.begin()
disp.clear()
disp.dim(True)
disp.set_contrast(0)
disp.display()
 
 
def read_byte(adr):
    return bus.read_byte_data(address, adr)
 
 
def read_word(adr):
    high = bus.read_byte_data(address, adr)
    low = bus.read_byte_data(address, adr+1)
    val = (high << 8) + low
    return val
 
 
def read_word_2c(adr):
    val = read_word(adr)
    if (val >= 0x8000):
        return -((65535 - val) + 1)
    else:
        return val
 
 
def write_byte(adr, value):
    bus.write_byte_data(address, adr, value)
 
write_byte(0, 0b01110000) # Set to 8 samples @ 15Hz
write_byte(1, 0b00100000) # 1.3 gain LSb / Gauss 1090 (default)
write_byte(2, 0b00000000) # Continuous sampling
 
scale = 0.92
 
def LogWrite(str):
    file = open('/var/log/test.txt', "a+")
    file.write(str + '\n')
    file.close()
 
 
def drawShadowedText(draw, x, y, text, font):
	draw.text((x, y+1), text, font=font, fill=0)
	draw.text((x+1, y), text, font=font, fill=0)
	draw.text((x+1, y+1), text, font=font, fill=0)
	draw.text((x, y-1), text, font=font, fill=0)
	draw.text((x-1, y), text, font=font, fill=0)
	draw.text((x, y), text, font=font, fill=255)
 
 
while True:
    width = disp.width
    height = disp.height
    image = Image.new('1', (width, height))
    draw = ImageDraw.Draw(image)
    draw.rectangle((0,0,width,height), outline=0, fill=0)
    fontDefault = ImageFont.load_default()
    fontBig = ImageFont.truetype('/usr/share/fonts/truetype/freefont/FreeSans.ttf', size=20)
    fontSmall = ImageFont.truetype('/usr/share/fonts/truetype/freefont/FreeSansBold.ttf', size=14)
    fontSmall1 = ImageFont.truetype('/usr/share/fonts/truetype/freefont/FreeSansBold.ttf', size=30)
    drawShadowedText(draw, 1, 0, strftime("%d/%m/%Y %H:%M:%S", localtime()), fontDefault);
    if range(0,1000):
        x_out = read_word_2c(3) * scale
        y_out = read_word_2c(7) * scale
        z_out = read_word_2c(5) * scale
        bearing = math.atan2(y_out, x_out) #y_out, x_out
        if int(bearing < 0):
            bearing += 2 * math.pi
            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Kompass   "+ str(int(math.degrees(bearing)))+"°")
        drawShadowedText(draw, 1, 19, "Kompassrichtung",  fontSmall)
        drawShadowedText(draw, 1, 35, str(int(math.degrees(bearing)))+ u' °',  fontSmall1)
    disp.image(image)
    oldimage = Image.new('1', (width, height))
    oldimage.paste(image,(0,0))
    try:
        disp.display()
    except IOError as e:
        print "IOError(display) ({0}): {1}".format(e.errno, e.strerror)


Weiterhin fügte ich ein TSL2591 Licht / IR Sensor auf der Sensorebene hinzu.
Dieses habe ich in einem alternativen Hauptprogramm mit eingebunden.
Damit der Roboter seine Programmschleife starten kann, muss ein als "if Bedingung"
vordefinierter Schwellwert überschritten bzw. erfüllt werden.
Und zu guter letzt wurde auch der Raspberry Pi, ein Opfer eines Hardware Upgrades. Im austausch zum alten Pi´s bekam Raspobot mehr Performence, durch den Raspberry Pi 2 Model B.
Dies war auch eine gute Gelegenheit, das neue Raspbian Jessie Lite Betriebssystem aufzuspielen.
Die Folge war das das gesamte System von Grund auf neu installiert und eingerichtet wurde.
Dadurch löste ich mich von alten Installations und Softwaretestresten die auf dem alten Pi,
unnötig Performence in anspruch nahmen und nicht weiter benötigt wurden.


Als nächstes fügte ich ein Magnetkompass und ein Gyrosensor der Sensorebene hinzu.
Jedoch sind diese noch nicht in Betrieb.
Dafür muss ich nun erst einmal weitere Scripte entwickeln, damit diese beiden Sensoren
entsprechend in dem Hauptprogram eingebunden werden können.
Da der Magnetkompass sehr anfällig gegen Magnete ist und somit die angezeigte Richtung, vom
Optipoint Lautsprecher abgelenkt wurde, habe ich den Lautsprecher nun mit auf die Enegieebene verlegt.


T-Cobbler Umbau 2016


So wie weiter oben im Projektverlauf schon angekündigt, erfolgte heute nun endlich der Austausch
des neuen T-Cobbler´s für den Raspberry Pi 2 B. Auch wurden in diesem Schritt sämtliche Kabel,
auf der Verbindungsebene gegen selbstgelötete erneuert. Dieser operative Eingriff gab mir die Möglichkeit,
ein paar Detailbilder von den einzelnen Ebenen anzufertigen. Diese könnt Ihr nun nachfolgend betrachten.
Der Umbau benötigte ganze 10 Stunden und wurde durch dem Zusammenbau und des darauffolgenden Funktionstest,
erfolgreich abgeschlossen.

OP am offenen Herzen von Raspobot


Arduino Sensor Ebene


Modul Ebene


Raspobot Zerlegt Austausch der T-Cobbler


Der Austausch der T-Cobbler mit Kabelerneuerung ist erfolgreich abgeschlossen.






































Raspberry Pi 3 Umbau 2016


Wieder einmal gibt es ein weiteres Hardwareupgrade.
Da am 29.02.2016 der neue Raspberry Pi 3 B ganz überraschend vorgestellt wurde,
hab ich mir sofort einen zugelegt und diesen dann gegen den Pi 2 B ausgetauscht.
Da dieser nun WLAN und Bluetooth on board hat, gehören die am Anfang der
Dokumentation beschriebenen Probleme, mit dem Edimax WLan Stick der Vergangenheit an.

Nach diesem Upgrade habe ich noch ein kleines Licht Script, was mir schon
seit einiger Zeit im Kopf herumschwirte, geschrieben. Es hat eigentlich nur
eine kleine Funktion. Es soll die beiden vorderen Scheinwerfer LED´s ein
und ausschalten. Wenn es also dunkel wird, schalten diese sich automatisch ein.
Wenn es wieder hell wird, schalten diese sich wieder ab. Diese Funktion wird schon
im Bootvorgang mit gestartet. Nachfolgend das Script hierzu.

WLAN Verbindungsabbrüche

Ok also ich revidiere meine Aussage bezüglich der WLAN Problematik.
Nachdem ich den neuen Pi nun einige Tage im Einsatz habe, musste ich nun feststellen
dass auch dieser WLAN Chip on board scheinbar einen sleepmodus besitzt.
Diesen kann man jedoch recht simpel abschalten.

#WLAN Sleepmode abschalten Raspberry Pi 3
 
#Befehl:
sudo nano /etc/network/interfaces
 
#Edit: Unter den Zeilen der WLAN Konfiguration diese zwei Zeilen hinzufügen.
pre-up iw dev wlan0 set power_save off
post-down iw dev wlan0 set power_save on


Verschiedene Programmcodes

Programmcode Scheinwerfer an/aus

#!/usr/bin/env python
import os
import sys
import time
import smbus
import tsl2591
import datetime
from time import sleep
from time import sleep, gmtime, localtime, strftime
 
BUSNR  = 1
ADDR1  = 0x21
IODIRA = 0x00
IODIRB = 0x01
GPIOA  = 0x12
GPIOB  = 0x13
PINBA = [0x00]
PINB15 = [0xC8] #Scheinwerfer_licht
 
i2cBus = smbus.SMBus(BUSNR)
 
i2cBus.write_byte_data(ADDR1, IODIRA, 0x00)
i2cBus.write_byte_data(ADDR1, IODIRB, 0x01)
 
DELAY1 = 0.075
 
def LogWrite(str):
    file = open('/var/log/light.txt', "a+")
    file.write(str + '\n')
    file.close()
 
 
def Stop():
    for leds in PINBA:
        i2cBus.write_byte_data(ADDR1, GPIOB, leds)
 
 
def light():
    for leds in PINB15:
        i2cBus.write_byte_data(ADDR1, GPIOB, leds)
 
 
try:
    while True:
        tsl = tsl2591.Tsl2591()
        full, ir = tsl.get_full_luminosity()
        lux = tsl.calculate_lux(full, ir)
        if lux < 1000:
            light()
            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist zu niedrig Licht an"+"   lux=%3.2f" % (lux))
        elif lux > 1000:
            Stop()
            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist zu hoch Licht aus"+"   lux=%3.2f" % (lux))
 
except KeyboardInterrupt:
    Stop()
    print("Ich bin stehen geblieben, du musst das Programm neustarten!")

Programmcode Bootvorgang von Raspobot

##!/usr/bin/python
 
import glob
import random
import pygame.mixer
import sys, traceback
from time import sleep
import time
import RPi.GPIO as GPIO
import smbus
from Adafruit_PWM_Servo_Driver import PWM
import datetime
import sys, traceback
from time import sleep, gmtime, localtime, strftime
 
 
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.cleanup()
Schalter = 9
LED = 11
 
GPIO.setup(Schalter, GPIO.IN)
GPIO.setup(LED, GPIO.OUT)
 
DELAY = 1
 
pygame.mixer.init(48000, -16, 1, 8192)
soundfilesstart = glob.glob("rasposound/start/*.wav")
soundfilesonline = glob.glob("rasposound/online/*.wav")
 
def LogWrite(str):
    file = open('/var/log/test.txt', "a+")
    file.write(str + '\n')
    file.close()
 
 
def play():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   playing Bootsequence")
    pygame.mixer.Sound(random.choice(soundfilesstart)).play()
 
 
def playonline():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   playing Raspobot ist online!")
    pygame.mixer.Sound(random.choice(soundfilesonline)).play()
 
 
 
pwm = PWM(0x40)#, debug=True
servoMin = 157
servoMhl3 = 206
servoMhl2 = 262
servoMhl1 = 319
servoMid = 375
servoMhr1 = 431
servoMhr2 = 487
servoMhr3 = 543
servoMax = 600  
 
 
def setServoPulse(channel, pulse):
    pulseLength = 1000000                   # 1,000,000 us per second
    pulseLength /= 60                       # 60 Hz
    print "%d us per period" % pulseLength
    pulseLength /= 4096                     # 12 bits of resolution
    print "%d us per bit" % pulseLength
    pulse *= 1000
    pulse /= pulseLength
    pwm.setPWM(channel, 0, pulse)
 
pwm.setPWMFreq(60)
 
 
def Error():
    Stop()
    GPIO.output(LED, 1)
    time.sleep(0.3)
    GPIO.output(LED, 0)
    time.sleep(0.3)
 
 
try:
    GPIO.output(LED, 1)
    if (GPIO.input(Schalter) == 0):
        GPIO.output(LED, 0)
        play()
        time.sleep(2)
        pwm.setPWM(0, 0, servoMid)
        time.sleep(0.5)
        pwm.setPWM(0, 0, servoMhr1)
        time.sleep(0.5)
        pwm.setPWM(0, 0, servoMhr2)
        time.sleep(0.5)
        pwm.setPWM(0, 0, servoMhr3)
        time.sleep(0.5)
        pwm.setPWM(0, 0, servoMax)
        time.sleep(0.5)
        play()
        time.sleep(2)
        pwm.setPWM(0, 0, servoMhr3)
        time.sleep(0.5)
        pwm.setPWM(0, 0, servoMhr2)
        time.sleep(0.5)
        pwm.setPWM(0, 0, servoMhr1)
        time.sleep(0.5)
        pwm.setPWM(0, 0, servoMid)
        time.sleep(0.5)
        play()
        time.sleep(2)
        pwm.setPWM(0, 0, servoMhl1)
        time.sleep(0.5)
        pwm.setPWM(0, 0, servoMhl2)
        time.sleep(0.5)
        pwm.setPWM(0, 0, servoMhl3)
        time.sleep(0.5)
        pwm.setPWM(0, 0, servoMin)
        time.sleep(0.5)
        play()
        time.sleep(2)
        pwm.setPWM(0, 0, servoMhl3)
        time.sleep(0.5)
        pwm.setPWM(0, 0, servoMhl2)
        time.sleep(0.5)
        pwm.setPWM(0, 0, servoMhl1)
        time.sleep(0.5)
        pwm.setPWM(0, 0, servoMid)
        time.sleep(0.6)
        play()
        time.sleep(2)
        pwm.setPWM(0, 0, servoMax)
        time.sleep(0.6)
        pwm.setPWM(0, 0, servoMin)
        time.sleep(1.5)
        pwm.setPWM(0, 0, servoMax)
        time.sleep(1.5)
        play()
        pwm.setPWM(0, 0, servoMin)
        time.sleep(0.6)
        pwm.setPWM(0, 0, servoMid)
        time.sleep(0.6)
        pwm.setPWM(0, 0, servoMax)
        time.sleep(0.6)
        pwm.setPWM(0, 0, servoMid)
        time.sleep(2.6)
        playonline()
        time.sleep(2)
    else:
        print("Ich mache pause, schalte S1 zum fortfahren um!")
        Error()
        GPIO.cleanup()
    raise Exception()
except:
    traceback.print_exc(file=sys.stdout)
    print("Ich bin online, kannst mich starten!")
    GPIO.output(LED, 1)
    exit(3)


Haupprogrammcode autonomer Modus von Raspobot

##!/usr/bin/python
 
import serial
import glob
import random
import pygame.mixer
import sys, traceback
from time import sleep, gmtime, localtime, strftime
import time
import RPi.GPIO as GPIO
import smbus
from Adafruit_PWM_Servo_Driver import PWM
import thread
import Adafruit_SSD1306
from PIL import Image, ImageDraw, ImageFont, ImageOps
import datetime
import math
import psutil, os
 
p = psutil.Process(os.getpid())
p.nice(50)
p.nice()
 
GPIO.setup
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.cleanup()          #Board /BCM 
GPIO.setup(10, GPIO.OUT)  #19  #10
GPIO.setup(4, GPIO.OUT)   #7   #4
GPIO.setup(25, GPIO.OUT)  #22  #25
GPIO.setup(17, GPIO.OUT)  #11  #17
#GPIO.setup(24, GPIO.OUT)  #18  #24
#GPIO.setup(18, GPIO.OUT)  #12  #18
#GPIO.setup(23, GPIO.IN)   #16  #23
#GPIO.setup(15, GPIO.IN)  #10   #15
#GPIO.setup(7, GPIO.IN)  #26    #7
#GPIO.setup(27, GPIO.IN)  #13   #21/27
#GPIO.setup(8, GPIO.IN)  #24    #8
#GPIO.setup(14, GPIO.IN)   #8   #14 
Schalter = 9             #21   #9
LED = 11                  #23  #11
RST = 27
pwm = PWM(0x40)#, debug=True
servoMin = 157
servoMhl3 = 206
servoMhl2 = 262
servoMhl1 = 319
servoMid = 375
servoMhr1 = 431
servoMhr2 = 487
servoMhr3 = 543
servoMax = 600
 
 
BUSNR = 1
ADDR = 0x20
ADDR1 = 0x21
IODIRA = 0x00
IODIRB = 0x01
GPIOA = 0x12
GPIOB = 0x13
 
PINAA = [0x00]
PINA10 = [0x88]  # Blinker_rechts
PINA11 = [0x60]  # Brems_licht
PINA12 = [0x14]  # Blinker_links
PINA13 = [0x06]  # Rueck_licht
PINA14 = [0x03]  # Front_licht
PINA15 = [0x03]  # Rueck_licht
 
PINBA = [0x00]
PINB10 = [0x88]  # Blinker_rechts
PINB11 = [0x60]  # Brems_licht
PINB12 = [0x14]  # Blinker_links
PINB13 = [0x06]  # Rueck_licht
PINB14 = [0x03]  # Front_licht
 
PINAA1 = [0x00]
PINA101 = [0x80]
 
PINBA1 = [0x00]
PINB101 = [0x80]
 
i2cBus = smbus.SMBus(BUSNR)
i2cBus.write_byte_data(ADDR, IODIRA, 0x00)
i2cBus.write_byte_data(ADDR, IODIRB, 0x01)
i2cBus.write_byte_data(ADDR1, IODIRA, 0x00)
i2cBus.write_byte_data(ADDR1, IODIRB, 0x01)
 
GPIO.setup(Schalter, GPIO.IN)
GPIO.setup(LED, GPIO.OUT)
 
DELAY = 1
 
pygame.mixer.init(48000, -16, 1, 8192)
soundfilesstart = glob.glob("rasposound/start/*.wav")
soundfilesstop = glob.glob("rasposound/stop/*.wav")
soundfilesvorwaerts = glob.glob("rasposound/vorwaerts/*.wav")
soundfilesrueckwaerts = glob.glob("rasposound/rueckwaerts/*.wav")
soundfilesfun = glob.glob("rasposound/fun/*.wav")
soundfilesagro = glob.glob("rasposound/agro/*.wav")
soundfilesdefence = glob.glob("rasposound/defence/*.wav")
soundfilesshutdown = glob.glob("rasposound/shutdown/*.wav")
soundfilesmessenl = glob.glob("rasposound/messen-l/*.wav")
soundfilesmessenr = glob.glob("rasposound/messen-r/*.wav")
 
disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST)
disp.begin()
disp.clear()
disp.dim(True)
disp.set_contrast(255)
disp.display()
 
def LogWrite(str):
    file = open('/var/log/test.txt', "a+")
    file.write(str + '\n')
    file.close()
 
def playstart():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   playing Start")
    pygame.mixer.Sound(random.choice(soundfilesstart)).play()
 
 
def playstop():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   playing Stop")
    pygame.mixer.Sound(random.choice(soundfilesstop)).play()
    time.sleep(2)
 
def playvorwaerts():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   playing Vorweartz")
    pygame.mixer.Sound(random.choice(soundfilesvorwaerts)).play()
#    time.sleep(0.5)
 
def playrueckwaerts():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   playing Rueckweartz")
    pygame.mixer.Sound(random.choice(soundfilesrueckwaerts)).play()
    time.sleep(1)
 
def playfun():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   playing Fun")
    pygame.mixer.Sound(random.choice(soundfilesfun)).play()
 
 
def playagro():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   playing Agro")
    pygame.mixer.Sound(random.choice(soundfilesagro)).play()
 
 
def playdefence():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   playing defence")
    pygame.mixer.Sound(random.choice(soundfilesdefence)).play()
 
 
def playshutdown():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   playing shutdown")
    pygame.mixer.Sound(random.choice(soundfilesshutdown)).play()
 
 
def playmessenl():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   playing messen links")
    pygame.mixer.Sound(random.choice(soundfilesmessenl)).play()
 
 
def playmessenr():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   playing messen rechts")
    pygame.mixer.Sound(random.choice(soundfilesmessenr)).play()
 
 
LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   ..............Ultraschallmessung mit HC-SR04...............")
 
# A routine to control a pair of pins
 
 
def ControlAPairOfPins(FirstPin, FirstState, SecondPin, SecondState):
    if FirstState == "1":
        GPIO.output(int(FirstPin), True)
    else:
        GPIO.output(int(FirstPin), False)
    if SecondState == "1":
        GPIO.output(int(SecondPin), True)
    else:
        GPIO.output(int(SecondPin), False)
    return
 
 
def Stop():
    ControlAPairOfPins("10", "0", "4", "0")
    ControlAPairOfPins("25", "0", "17", "0")
    for leds in PINA11:
        i2cBus.write_byte_data(ADDR, GPIOA, leds)
        sleep(DELAY)
    for leds in PINAA:
        i2cBus.write_byte_data(ADDR, GPIOA, leds)
 
 
def Stop_anhalten_permanent():
    ControlAPairOfPins("10", "0", "4", "0")
    ControlAPairOfPins("25", "0", "17", "0")
    for leds in PINA11:
        i2cBus.write_byte_data(ADDR, GPIOA, leds)
        sleep(DELAY)
    for leds in PINAA:
        i2cBus.write_byte_data(ADDR, GPIOA, leds)
 
 
def Vorwaerts_fahren():
    for leds in PINA14:
        i2cBus.write_byte_data(ADDR, GPIOA, leds)
    ControlAPairOfPins("10", "1", "4", "0")
    ControlAPairOfPins("25", "1", "17", "1")
 
 
def Geradeaus_vorwaerts_start():
    for leds in PINA14:
        i2cBus.write_byte_data(ADDR, GPIOA, leds)
    ControlAPairOfPins("10", "1", "4", "0")
    ControlAPairOfPins("25", "1", "17", "1")
 
 
def Links_fahren():
    for leds in PINA12:
        i2cBus.write_byte_data(ADDR, GPIOA, leds)
    ControlAPairOfPins("10", "0", "4", "0")
    ControlAPairOfPins("25", "0", "17", "1")
    time.sleep(0.55)
    for leds in PINAA:
        i2cBus.write_byte_data(ADDR, GPIOA, leds)
 
 
def Links_fahren_voll():
    for leds in PINA12:
        i2cBus.write_byte_data(ADDR, GPIOA, leds)
    ControlAPairOfPins("10", "1", "4", "0")
    ControlAPairOfPins("25", "0", "17", "1")
    time.sleep(0.75)
    for leds in PINAA:
        i2cBus.write_byte_data(ADDR, GPIOA, leds)
 
 
def Rechts_fahren():
    for leds in PINA10:
        i2cBus.write_byte_data(ADDR, GPIOA, leds)
    ControlAPairOfPins("10", "1", "4", "1")
    ControlAPairOfPins("25", "1", "17", "0")
    time.sleep(0.55)
    for leds in PINAA:
        i2cBus.write_byte_data(ADDR, GPIOA, leds)
 
 
def Rechts_fahren_voll():
    for leds in PINA10:
        i2cBus.write_byte_data(ADDR, GPIOA, leds)
    ControlAPairOfPins("10", "1", "4", "1")
    ControlAPairOfPins("25", "1", "17", "1")
    time.sleep(0.15)
    for leds in PINAA:
        i2cBus.write_byte_data(ADDR, GPIOA, leds)
 
 
def Rueckwaerts_fahren():
    for leds in PINA15:
        i2cBus.write_byte_data(ADDR1, GPIOA, leds)
#    for leds in PINA101:
#        i2cBus.write_byte_data(ADDR1, GPIOA, leds)
    ControlAPairOfPins("10", "1", "4", "1")
    ControlAPairOfPins("25", "0", "17", "1")
    time.sleep(1.5)
    for leds in PINAA:
        i2cBus.write_byte_data(ADDR1, GPIOA, leds)
#    for leds in PINAA1:
#        i2cBus.write_byte_data(ADDR1, GPIOA, leds)
 
 
def Rueckwaerts_fahren_l():
    for leds in PINA15:
        i2cBus.write_byte_data(ADDR1, GPIOA, leds)
    ControlAPairOfPins("10", "1", "4", "1")
    ControlAPairOfPins("25", "0", "17", "1")
    time.sleep(0.5)
    for leds in PINAA:
        i2cBus.write_byte_data(ADDR1, GPIOA, leds)
 
 
def Rueckwaerts_fahren_r():
    for leds in PINA15:
        i2cBus.write_byte_data(ADDR1, GPIOA, leds)
    ControlAPairOfPins("10", "1", "4", "1")
    ControlAPairOfPins("25", "0", "17", "1")
    time.sleep(0.5)
    for leds in PINAA:
        i2cBus.write_byte_data(ADDR1, GPIOA, leds)
 
 
def setServoPulse(channel, pulse):
#    for leds in PINA101:
#        i2cBus.write_byte_data(ADDR1, GPIOA, leds)
    pulseLength = 1000000                   # 1,000,000 us per second
    pulseLength /= 60                       # 60 Hz
    LogWrite("%d us per period" % pulseLength)
    pulseLength /= 4096                     # 12 bits of resolution
    LogWrite("%d us per bit" % pulseLength)
    pulse *= 1000
    pulse /= pulseLength
    pwm.setPWM(channel, 0, pulse)
#    for leds in PINAA1:
#        i2cBus.write_byte_data(ADDR1, GPIOA, leds)
 
pwm.setPWMFreq(60)
 
 
def Messung_dist_links():
    elapsed = dist_sensor_servo
    global dist_links
    dist_links = elapsed * 1
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Servo_Abstand_links:    "+ dist_links+" cm")
 
 
def Messung_dist_rechts():
    elapsed = dist_sensor_servo
    global dist_rechts
    dist_rechts = elapsed * 1
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Servo_Abstand_rechts:    "+ dist_rechts+" cm")
 
 
def Error():
    Stop()
    GPIO.output(LED, 1)
    time.sleep(0.3)
    GPIO.output(LED, 0)
    time.sleep(0.3)
 
def thread_dist():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   THREAD STARTED")
 
    ser = serial.Serial('/dev/ttyUSB0', 115200)
    time.sleep(1.5)
 
    a = []
    global dist_links_voll_perma
    global dist_links_perma
    global dist_vorn_perma
    global dist_rechts_perma
    global dist_rechts_voll_perma
    global dist_sensor_servo
 
 
    try:
        while True:
            ser.write('DS@');
            a=ser.readline();
            x=a.split(';');
            if ( len(x)==13 and x[0] == 'l90' and float(x[1]) != 0.00 ):
                #LogWrite (len(x))
                dist_links_voll_perma = x[1];
                #LogWrite (dist_links_voll_perma)
                dist_links_perma = x[3];
                #LogWrite (dist_links_perma)
                dist_vorn_perma = x[5];
                #LogWrite (dist_vorn_perma)
                dist_rechts_perma = x[7];
                #LogWrite (dist_rechts_perma)
                dist_rechts_voll_perma = x[9];
                #LogWrite (dist_rechts_voll_perma)
                dist_sensor_servo = x[11];
                #LogWrite (dist_sensor_servo)
 
 
    except:
        print 'error / thread aborted';
 
 
 
try:
    # start distance measurement in separate thread
    thread.start_new_thread( thread_dist, ())
 
    # wait for first values of distance sensors
    x = 1
    while x == 1:
        try:
             dist_links_voll_perma
             dist_links_perma
             dist_vorn_perma
             dist_rechts_perma
             dist_rechts_voll_perma
             dist_sensor_servo
 
             x = 2
        except NameError:
             time.sleep(0.2)
 
 
 
 
    while True:
 
        currenttime = strftime("%H:%M", localtime())
        width = disp.width
        height = disp.height
        image = Image.new('1', (width, height))
 
        draw = ImageDraw.Draw(image)
 
        draw.rectangle((0,0,width,height), outline=0, fill=0)
 
        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   .............Schleife-Start............."+(strftime("%d/%m/%Y %H:%M:%S", localtime())))
        GPIO.output(LED, 1)
        if GPIO.input(Schalter) == 0:
            GPIO.output(LED, 0)
            Vorwaerts_fahren()
            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   fahre_vorwaerts")
            if float(dist_vorn_perma) > 35:
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Vorn_ist_alles_frei_1 M_0    "+ dist_vorn_perma+" cm");
                flameImage = Image.open('images/auge71.png').convert("1")
                image.paste(flameImage,(0,0))
                disp.image(image)
                oldimage = Image.new('1', (width, height))
                disp.display()
                Vorwaerts_fahren()
                playvorwaerts()
            if float(dist_vorn_perma) < 35:
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Hindernis erkannt_1!  M_0    "+ dist_vorn_perma+" cm");
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   STOP_VORN")
                flameImage = Image.open('images/auge67.png').convert("1")
                image.paste(flameImage,(0,0))
                disp.image(image)
                oldimage = Image.new('1', (width, height))
                disp.display()
                Stop_anhalten_permanent()
                playstop()
                playrueckwaerts()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   fahre_ruckwaerts")
                flameImage = Image.open('images/auge94.png').convert("1")
                image.paste(flameImage,(0,0))
                disp.image(image)
                oldimage = Image.new('1', (width, height))
                disp.display()
                Rueckwaerts_fahren()
                Stop()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   STOP_ruckwaerts")
                pwm.setPWM(0, 0, servoMin)
                time.sleep(0.2)
                flameImage = Image.open('images/auge9.png').convert("1")
                image.paste(flameImage,(0,0))
                disp.image(image)
                oldimage = Image.new('1', (width, height))
                disp.display()
                time.sleep(1)
                playagro()
                Messung_dist_links()
                pwm.setPWM(0, 0, servoMax)
                time.sleep(0.2)
                flameImage = Image.open('images/auge8.png').convert("1")
                image.paste(flameImage,(0,0))
                disp.image(image)
                oldimage = Image.new('1', (width, height))
                disp.display()
                time.sleep(1)
                Messung_dist_rechts()
                pwm.setPWM(0, 0, servoMid)
                time.sleep(0.2)
                flameImage = Image.open('images/auge71.png').convert("1")
                image.paste(flameImage,(0,0))
                disp.image(image)
                oldimage = Image.new('1', (width, height))
                disp.display()
                time.sleep(1)
                if dist_links > dist_rechts:
                    flameImage = Image.open('images/auge94.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    Rueckwaerts_fahren_l()
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   fahre_rueckwaerts_links")
                    flameImage = Image.open('images/auge42.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    Stop()
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   STOP_ruckwaerts")
                    Links_fahren_voll()
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   fahre_links_voll")
                else:
                    flameImage = Image.open('images/auge94.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    Rueckwaerts_fahren_r()
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   fahre_rueckwaerts_rechts")
                    flameImage = Image.open('images/auge43.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    Stop()
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   STOP_ruckwaerts")
                    Rechts_fahren_voll()
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   fahre_rechts_voll")
            else:
                flameImage = Image.open('images/auge71.png').convert("1")
                image.paste(flameImage,(0,0))
                disp.image(image)
                oldimage = Image.new('1', (width, height))
                disp.display()
                Geradeaus_vorwaerts_start()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   geradeaus_vorwaerts_start")
            if float(dist_links_perma) < 26:
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Hindernis_Links! L_45   "+ dist_links_perma+" cm");
                flameImage = Image.open('images/auge42.png').convert("1")
                image.paste(flameImage,(0,0))
                disp.image(image)
                oldimage = Image.new('1', (width, height))
                disp.display()
                Rechts_fahren()
                pwm.setPWM(0, 0, servoMhl2)
                time.sleep(0.2)
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   rechts_ausweichen")
                playmessenr()
                Geradeaus_vorwaerts_start()
                flameImage = Image.open('images/auge71.png').convert("1")
                image.paste(flameImage,(0,0))
                disp.image(image)
                oldimage = Image.new('1', (width, height))
                disp.display()
                pwm.setPWM(0, 0, servoMid)
                time.sleep(0.2)
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   fahre_geradeaus_vorwaertz")
            else:
                if float(dist_links_perma) > 26:
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   L_45   "+ dist_links_perma+" cm");
                    flameImage = Image.open('images/auge73.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
            if float(dist_links_voll_perma) < 26:
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Hindernis_Links_voll! L_45   "+ dist_links_voll_perma+" cm");
                flameImage = Image.open('images/auge9.png').convert("1")
                image.paste(flameImage,(0,0))
                disp.image(image)
                oldimage = Image.new('1', (width, height))
                disp.display()
                Rechts_fahren()
                pwm.setPWM(0, 0, servoMin)
                time.sleep(0.2)
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   rechts_ausweichen")
                playmessenr()
                Geradeaus_vorwaerts_start()
                flameImage = Image.open('images/auge71.png').convert("1")
                image.paste(flameImage,(0,0))
                disp.image(image)
                oldimage = Image.new('1', (width, height))
                disp.display()
                pwm.setPWM(0, 0, servoMid)
                time.sleep(0.2)
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   fahre_geradeaus_vorwaertz")
            else:
                if float(dist_links_voll_perma) > 26:
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   L_90   "+ dist_links_voll_perma+" cm");
                    flameImage = Image.open('images/auge72.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
            if float(dist_links_perma) < 26:
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Hindernis_Links! L_45   "+ dist_links_perma+" cm");
                flameImage = Image.open('images/auge42.png').convert("1")
                image.paste(flameImage,(0,0))
                disp.image(image)
                oldimage = Image.new('1', (width, height))
                disp.display()
                Rechts_fahren()
                pwm.setPWM(0, 0, servoMhl2)
                time.sleep(0.2)
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   rechts_ausweichen")
                playmessenr()
                Geradeaus_vorwaerts_start()
                flameImage = Image.open('images/auge71.png').convert("1")
                image.paste(flameImage,(0,0))
                disp.image(image)
                oldimage = Image.new('1', (width, height))
                disp.display()
                pwm.setPWM(0, 0, servoMid)
                time.sleep(0.2)
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   fahre_geradeaus_vorwaertz")
            else:
                if float(dist_links_perma) > 26:
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   L_45   "+ dist_links_perma+" cm");
                    flameImage = Image.open('images/auge73.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
            if float(dist_vorn_perma) > 35:
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Vorn_ist_alles_frei M_0    "+ dist_vorn_perma+" cm");
                flameImage = Image.open('images/auge71.png').convert("1")
                image.paste(flameImage,(0,0))
                disp.image(image)
                oldimage = Image.new('1', (width, height))
                disp.display()
                Vorwaerts_fahren()
            if float(dist_vorn_perma) < 35:
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Hindernis erkannt_2!  M_0    "+ dist_vorn_perma+" cm");
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   STOP_VORN")
                flameImage = Image.open('images/auge67.png').convert("1")
                image.paste(flameImage,(0,0))
                disp.image(image)
                oldimage = Image.new('1', (width, height))
                disp.display()
                Stop_anhalten_permanent()
                playstop()
                time.sleep(2)
                playrueckwaerts()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   fahre_ruckwaerts")
                flameImage = Image.open('images/auge94.png').convert("1")
                image.paste(flameImage,(0,0))
                disp.image(image)
                oldimage = Image.new('1', (width, height))
                disp.display()
                Rueckwaerts_fahren()
                Stop()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   STOP_ruckwaerts")
                pwm.setPWM(0, 0, servoMin)
                time.sleep(0.2)
                flameImage = Image.open('images/auge9.png').convert("1")
                image.paste(flameImage,(0,0))
                disp.image(image)
                oldimage = Image.new('1', (width, height))
                disp.display()
                time.sleep(1)
                playagro()
                Messung_dist_links()
                pwm.setPWM(0, 0, servoMax)
                time.sleep(0.2)
                flameImage = Image.open('images/auge8.png').convert("1")
                image.paste(flameImage,(0,0))
                disp.image(image)
                oldimage = Image.new('1', (width, height))
                disp.display()
                time.sleep(1)
                Messung_dist_rechts()
                pwm.setPWM(0, 0, servoMid)
                time.sleep(0.2)
                flameImage = Image.open('images/auge71.png').convert("1")
                image.paste(flameImage,(0,0))
                disp.image(image)
                oldimage = Image.new('1', (width, height))
                disp.display()
                time.sleep(1)
                if dist_links > dist_rechts:
                    flameImage = Image.open('images/auge94.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    Rueckwaerts_fahren_l()
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   fahre_rueckwaerts_links")
                    flameImage = Image.open('images/auge42.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    Stop()
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   STOP_ruckwaerts")
                    Links_fahren_voll()
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   fahre_links_voll")
                else:
                    flameImage = Image.open('images/auge94.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    Rueckwaerts_fahren_r()
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   fahre_rueckwaerts_rechts")
                    flameImage = Image.open('images/auge43.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    Stop()
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   STOP_ruckwaerts")
                    Rechts_fahren_voll()
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   fahre_rechts_voll")
            else:
                flameImage = Image.open('images/auge71.png').convert("1")
                image.paste(flameImage,(0,0))
                disp.image(image)
                oldimage = Image.new('1', (width, height))
                disp.display()
                Geradeaus_vorwaerts_start()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   geradeaus_vorwaerts_start")
            if float(dist_rechts_perma) < 26:
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Hindernis_Rechts! R_45   "+ dist_rechts_perma+" cm");
                flameImage = Image.open('images/auge43.png').convert("1")
                image.paste(flameImage,(0,0))
                disp.image(image)
                oldimage = Image.new('1', (width, height))
                disp.display()
                Links_fahren()
                pwm.setPWM(0, 0, servoMhr2)
                time.sleep(0.2)
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   links_ausweichen")
                playmessenl()
                Geradeaus_vorwaerts_start()
                flameImage = Image.open('images/auge71.png').convert("1")
                image.paste(flameImage,(0,0))
                disp.image(image)
                oldimage = Image.new('1', (width, height))
                disp.display()
                pwm.setPWM(0, 0, servoMid)
                time.sleep(0.2)
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   fahre_geradeaus_vorwaertz")
            else:
                if float(dist_rechts_perma) > 26:
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   R_45   "+ dist_rechts_perma+" cm");
                    flameImage = Image.open('images/auge72.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
            if float(dist_rechts_voll_perma) < 26:
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Hindernis_Rechts_voll! R_90   "+ dist_rechts_voll_perma+" cm");
                flameImage = Image.open('images/auge8.png').convert("1")
                image.paste(flameImage,(0,0))
                disp.image(image)
                oldimage = Image.new('1', (width, height))
                disp.display()
                Links_fahren()
                pwm.setPWM(0, 0, servoMax)
                time.sleep(0.2)
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   links_ausweichen")
                playmessenl()
                Geradeaus_vorwaerts_start()
                flameImage = Image.open('images/auge71.png').convert("1")
                image.paste(flameImage,(0,0))
                disp.image(image)
                oldimage = Image.new('1', (width, height))
                disp.display()
                pwm.setPWM(0, 0, servoMid)
                time.sleep(0.2)
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   fahre_geradeaus_vorwaertz")
            else:
                if float(dist_rechts_voll_perma) > 26:
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   R_90   "+ dist_rechts_voll_perma+" cm");
                    flameImage = Image.open('images/auge73.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
            if float(dist_rechts_perma) < 26:
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Hindernis_Rechts! R_45   "+ dist_rechts_perma+" cm");
                flameImage = Image.open('images/auge43.png').convert("1")
                image.paste(flameImage,(0,0))
                disp.image(image)
                oldimage = Image.new('1', (width, height))
                disp.display()
                Links_fahren()
                pwm.setPWM(0, 0, servoMhr2)
                time.sleep(0.2)
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   links_ausweichen")
                playmessenl()
                Geradeaus_vorwaerts_start()
                flameImage = Image.open('images/auge71.png').convert("1")
                image.paste(flameImage,(0,0))
                disp.image(image)
                oldimage = Image.new('1', (width, height))
                disp.display()
                pwm.setPWM(0, 0, servoMid)
                time.sleep(0.2)
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   fahre_geradeaus_vorwaertz")
            else:
                if float(dist_rechts_perma) > 26:
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   R_45   "+ dist_rechts_perma+" cm");
                    flameImage = Image.open('images/auge72.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   .............Schleife-Ende.............."+(strftime("%d/%m/%Y %H:%M:%S", localtime())))
        else:
            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Ich mache pause, schalte S1 zum fortfahren um!")
            print(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Ich mache pause, schalte S1 zum fortfahren um!")
            playagro()
            time.sleep(3)
            Error()
 
except KeyboardInterrupt:
    Stop()
    playshutdown()
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Ich bin stehen geblieben, du musst das Programm neustarten!")
    print(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Ich bin stehen geblieben, du musst das Programm neustarten!")
    GPIO.output(LED, 1)


Programmcode Tischtalking Raspobot

##!/usr/bin/python
 
import serial
import glob
import random
import pygame.mixer
import sys, traceback
from time import sleep, gmtime, localtime, strftime
from PIL import Image, ImageDraw, ImageFont, ImageOps
import time
import RPi.GPIO as GPIO
import smbus
from Adafruit_PWM_Servo_Driver import PWM
import thread
import Adafruit_SSD1306
import Adafruit_GPIO.SPI as SPI
import datetime
import math
import psutil, os
 
p = psutil.Process(os.getpid())
p.nice(30)
p.nice()
 
GPIO.setup
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.cleanup()          #Board /BCM 
GPIO.setup(10, GPIO.OUT)  #19  #10
GPIO.setup(4, GPIO.OUT)   #7   #4
GPIO.setup(25, GPIO.OUT)  #22  #25
GPIO.setup(17, GPIO.OUT)  #11  #17
#GPIO.setup(24, GPIO.OUT)  #18  #24
#GPIO.setup(18, GPIO.OUT)  #12  #18
#GPIO.setup(23, GPIO.IN)   #16  #23
#GPIO.setup(15, GPIO.IN)  #10   #15
#GPIO.setup(7, GPIO.IN)  #26    #7
#GPIO.setup(27, GPIO.IN)  #13   #21/27
#GPIO.setup(8, GPIO.IN)  #24    #8
#GPIO.setup(14, GPIO.IN)   #8   #14 
Schalter = 9             #21   #9
LED = 11                  #23  #11
RST = 27                 #13  #27
pwm = PWM(0x40) #, debug=True
servoMin = 157
servoMhl3 = 206
servoMhl2 = 262
servoMhl1 = 319
servoMid = 375
servoMhr1 = 431
servoMhr2 = 487
servoMhr3 = 543
servoMax = 600
 
BUSNR = 1
ADDR = 0x20
ADDR1 = 0x21
IODIRA = 0x00
IODIRB = 0x01
GPIOA = 0x12
GPIOB = 0x13
 
PINAA = [0x00]
PINA10 = [0x88]  # Blinker_rechts
PINA11 = [0x60]  # Brems_licht
PINA12 = [0x14]  # Blinker_links
PINA13 = [0x06]  # Rueck_licht
PINA14 = [0x03]  # Front_licht
PINA15 = [0x03]  # Rueck_licht
 
PINBA = [0x00]
PINB10 = [0x88]  # Blinker_rechts
PINB11 = [0x60]  # Brems_licht
PINB12 = [0x14]  # Blinker_links
PINB13 = [0x06]  # Rueck_licht
PINB14 = [0x03]  # Front_licht
 
PINAA1 = [0x00]
PINA101 = [0x80]
PINA102 = [0x40]
PINA103 = [0xC0]
 
PINBA1 = [0x00]
PINB101 = [0x80]
PINB102 = [0x40]
PINB103 = [0xC0]
 
i2cBus = smbus.SMBus(BUSNR)#BUSNR or 1
i2cBus.write_byte_data(ADDR, IODIRA, 0x00)
i2cBus.write_byte_data(ADDR, IODIRB, 0x01)
i2cBus.write_byte_data(ADDR1, IODIRA, 0x00)
i2cBus.write_byte_data(ADDR1, IODIRB, 0x01)
 
GPIO.setup(Schalter, GPIO.IN)
GPIO.setup(LED, GPIO.OUT)
 
DELAY = 1
DELAY1 = 0.075
 
pygame.mixer.init(48000, -16, 1, 8192)
soundfilesallsounds = glob.glob("rasposound/allsounds/*.wav")
soundfileslaser = glob.glob("rasposound/laser/*.wav")
soundfilestalk = glob.glob("rasposound/talk/*.wav")
soundfilesagro = glob.glob("rasposound/agro/*.wav")
soundfilesshutdown = glob.glob("rasposound/shutdown/*.wav")
 
disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST)
disp.begin()
disp.clear()
disp.dim(True)
disp.set_contrast(0xFF)
disp.display()
 
 
def LogWrite(str):
    file = open('/var/log/test.txt', "a+")
    file.write(str + '\n')
    file.close()
 
def playallsounds():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   playing allsounds")
    pygame.mixer.Sound(random.choice(soundfilesallsounds)).play()
 
 
def playlaser():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   playing laser")
    pygame.mixer.Sound(random.choice(soundfileslaser)).play()
 
 
def playtalk():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   playing talk")
    pygame.mixer.Sound(random.choice(soundfilestalk)).play()
    time.sleep(5)
 
 
def playagro():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   playing agro")
    pygame.mixer.Sound(random.choice(soundfilesagro)).play()
 
 
def playshutdown():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   playing shutdown")
    pygame.mixer.Sound(random.choice(soundfilesshutdown)).play()
 
 
def setServoPulse(channel, pulse):
    pulseLength = 1000000                   # 1,000,000 us per second
    pulseLength /= 60                       # 60 Hz
    print "%d us per period" % pulseLength
    pulseLength /= 4096                     # 12 bits of resolution
    print "%d us per bit" % pulseLength
    pulse *= 1000
    pulse /= pulseLength
    pwm.setPWM(channel, 0, pulse)
 
pwm.setPWMFreq(60)
 
 
def Messung_distance_vorn():
    elapsed = dist_sensor_servo
    global distance
    distance = elapsed * 1
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Servo Abstand Vorn:     "+ distance+" cm")
 
 
def laserblink():
    for x in range(15):
        for leds in PINA103:
            i2cBus.write_byte_data(ADDR1, GPIOA, leds)
            sleep(DELAY1)
            LogWrite (strftime("%d/%m/%Y %H:%M:%S", localtime())+"   laser on")
        for leds in PINAA1:
            i2cBus.write_byte_data(ADDR1, GPIOA, leds)
            LogWrite (strftime("%d/%m/%Y %H:%M:%S", localtime())+"   laser off")
            sleep(DELAY1)
 
 
def Error():
    Stop()
    GPIO.output(LED, 1)
    time.sleep(0.3)
    GPIO.output(LED, 0)
    time.sleep(0.3)
 
 
def control_pin_pair(pin1, state1, pin2, state2):
    GPIO.setup(10, GPIO.OUT)
    GPIO.setup(4, GPIO.OUT)
    GPIO.setup(25, GPIO.OUT)
    GPIO.setup(17, GPIO.OUT)
    GPIO.output(pin1, state1)
    GPIO.output(pin2, state2)
 
 
def Stop():
    GPIO.setup(10, GPIO.OUT)
    GPIO.setup(4, GPIO.OUT)
    GPIO.setup(25, GPIO.OUT)
    GPIO.setup(17, GPIO.OUT)
    control_pin_pair(10, False, 4, False)
    control_pin_pair(25, False, 17, False)
 
 
def drawShadowedText(draw, x, y, text, font):
	draw.text((x, y+1), text, font=font, fill=0)
	draw.text((x+1, y), text, font=font, fill=0)
	draw.text((x+1, y+1), text, font=font, fill=0)
	draw.text((x, y-1), text, font=font, fill=0)
	draw.text((x-1, y), text, font=font, fill=0)
	draw.text((x, y), text, font=font, fill=255)
 
 
def thread_dist():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   THREAD SENSOR STARTED")
    ser = serial.Serial('/dev/ttyUSB0', 115200)
    time.sleep(1.5)
 
    a = []
    global dist_links_voll_perma
    global dist_links_perma
    global dist_vorn_perma
    global dist_rechts_perma
    global dist_rechts_voll_perma
    global dist_sensor_servo
 
 
    try:
        while True:
            ser.write('DS@');
            a=ser.readline();
            x=a.split(';');
            if ( len(x)==13 and x[0] == 'l90' and float(x[1]) != 0.00 ):
                #print len(x);
                dist_links_voll_perma = x[1];
                #LogWrite("L_90   "+ dist_links_voll_perma+" cm");
                dist_links_perma = x[3];
                #LogWrite("L_45   "+ dist_links_perma+" cm");
                dist_vorn_perma = x[5];
                #LogWrite("M_0    "+ dist_vorn_perma+" cm");
                dist_rechts_perma = x[7];
                #LogWrite("R_45   "+ dist_rechts_perma+" cm");
                dist_rechts_voll_perma = x[9];
                #LogWrite("R_90   "+ dist_rechts_voll_perma+" cm");
                dist_sensor_servo = x[11];
                #LogWrite("R_90   "+ dist_sensor_servo+" cm");
 
 
    except:
        print 'error dist/ thread aborted';
 
try:
    # start distance measurement in separate thread
    thread.start_new_thread( thread_dist, ())
 
    # wait for first values of distance sensors
    x = 1
    while x == 1:
        try:
             dist_links_voll_perma
             dist_links_perma
             dist_vorn_perma
             dist_rechts_perma
             dist_rechts_voll_perma
             dist_sensor_servo
             x = 2
        except NameError:
             time.sleep(0.2)
 
 
 
 
 
    while True:
 
        currenttime = strftime("%H:%M", localtime())
        width = disp.width
        height = disp.height
        image = Image.new('1', (width, height))
 
        draw = ImageDraw.Draw(image)
 
        draw.rectangle((0,0,width,height), outline=0, fill=0)
        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   .............Schleife-Start............."+(strftime("%d/%m/%Y %H:%M:%S", localtime())))
 
        if GPIO.input(Schalter) == 0:
            GPIO.output(LED, 1)
            if float(dist_vorn_perma) < 35:
                flameImage = Image.open('images/auge62.png').convert("1")
                image.paste(flameImage,(0,0))
                disp.image(image)
                oldimage = Image.new('1', (width, height))
                disp.display()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Aktivitaet.......M_0    "+ dist_vorn_perma+" cm");
                playallsounds()
                pwm.setPWM(0, 0, servoMid)
                LogWrite (strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Servo auf M_0")
                if float(dist_sensor_servo) < 20:
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Servo Abstand Vorn:     "+ dist_sensor_servo+" cm")
                    flameImage = Image.open('images/laser.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Laser aktiviert")
                    playlaser()
                    laserblink()
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Laser deaktiviert")
            else:
                if float(dist_vorn_perma) > 35:
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   keine Aktivitaet M_0    "+ dist_vorn_perma+" cm");
                    flameImage = Image.open('images/auge71.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
            if float(dist_links_perma) < 35:
                flameImage = Image.open('images/auge42.png').convert("1")
                image.paste(flameImage,(0,0))
                disp.image(image)
                oldimage = Image.new('1', (width, height))
                disp.display()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Aktivitaet.......L_45   "+ dist_links_perma+" cm");
                playallsounds()
                pwm.setPWM(0, 0, servoMhl2)
                LogWrite (strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Servo auf L_45")
                if float(dist_sensor_servo) < 20:
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Servo Abstand Vorn:     "+ dist_sensor_servo+" cm")
                    flameImage = Image.open('images/laser.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Laser aktiviert")
                    playlaser()
                    laserblink()
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Laser deaktiviert")
            else:
                if float(dist_links_perma) > 35:
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   keine Aktivitaet L_45   "+ dist_links_perma+" cm");
                    flameImage = Image.open('images/auge72.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
            if float(dist_links_voll_perma) < 35:
                flameImage = Image.open('images/auge9.png').convert("1")
                image.paste(flameImage,(0,0))
                disp.image(image)
                oldimage = Image.new('1', (width, height))
                disp.display()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Aktivitaet.......L_90   "+ dist_links_voll_perma+" cm");
                playallsounds()
                pwm.setPWM(0, 0, servoMin)
                LogWrite (strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Servo auf L_90")
                if float(dist_sensor_servo) < 20:
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Servo Abstand Vorn:     "+ dist_sensor_servo+" cm")
                    flameImage = Image.open('images/laser.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Laser aktiviert")
                    playlaser()
                    laserblink()
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Laser deaktiviert")
            else:
                if float(dist_links_voll_perma) > 35:
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   keine Aktivitaet L_90   "+ dist_links_voll_perma+" cm");
                    flameImage = Image.open('images/auge71.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
            if float(dist_links_perma) < 35:
                flameImage = Image.open('images/auge42.png').convert("1")
                image.paste(flameImage,(0,0))
                disp.image(image)
                oldimage = Image.new('1', (width, height))
                disp.display()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Aktivitaet.......L_45   "+ dist_links_perma+" cm");
                playallsounds()
                pwm.setPWM(0, 0, servoMhl2)
                LogWrite (strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Servo auf L_45")
                if float(dist_sensor_servo) < 20:
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Servo Abstand Vorn:     "+ dist_sensor_servo+" cm")
                    flameImage = Image.open('images/laser.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Laser aktiviert")
                    playlaser()
                    laserblink()
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Laser deaktiviert")
            else:
                if float(dist_links_perma) > 35:
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   keine Aktivitaet L_45   "+ dist_links_perma+" cm");
                    flameImage = Image.open('images/auge73.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
            if float(dist_vorn_perma) < 35:
                flameImage = Image.open('images/auge82.png').convert("1")
                image.paste(flameImage,(0,0))
                disp.image(image)
                oldimage = Image.new('1', (width, height))
                disp.display()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Aktivitaet.......M_0    "+ dist_vorn_perma+" cm");
                playallsounds()
                pwm.setPWM(0, 0, servoMid)
                LogWrite (strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Servo auf M_0")
                if float(dist_sensor_servo) < 20:
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Servo Abstand Vorn:     "+ dist_sensor_servo+" cm")
                    flameImage = Image.open('images/laser.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Laser aktiviert")
                    playlaser()
                    laserblink()
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Laser deaktiviert")
            else:
                if float(dist_vorn_perma) > 35:
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   keine Aktivitaet M_0    "+ dist_vorn_perma+" cm");
                    flameImage = Image.open('images/auge71.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
            if float(dist_rechts_perma) < 35:
                flameImage = Image.open('images/auge43.png').convert("1")
                image.paste(flameImage,(0,0))
                disp.image(image)
                oldimage = Image.new('1', (width, height))
                disp.display()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Aktivitaet.......R_45   "+ dist_rechts_perma+" cm");
                playallsounds()
                pwm.setPWM(0, 0, servoMhr2)
                LogWrite (strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Servo auf R_45")
                if float(dist_sensor_servo) < 20:
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Servo Abstand Vorn:     "+ dist_sensor_servo+" cm")
                    flameImage = Image.open('images/laser.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Laser aktiviert")
                    playlaser()
                    laserblink()
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Laser deaktiviert")
            else:
                if float(dist_rechts_perma) > 35:
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   keine Aktivitaet R_45   "+ dist_rechts_perma+" cm");
                    flameImage = Image.open('images/auge72.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
            if float(dist_rechts_voll_perma) < 35:
                flameImage = Image.open('images/auge8.png').convert("1")
                image.paste(flameImage,(0,0))
                disp.image(image)
                oldimage = Image.new('1', (width, height))
                disp.display()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Aktivitaet.......R_90   "+ dist_rechts_voll_perma+" cm")
                playallsounds()
                pwm.setPWM(0, 0, servoMax)
                LogWrite (strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Servo auf R_90")
                if float(dist_sensor_servo) < 20:
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Servo Abstand Vorn:     "+ dist_sensor_servo+" cm")
                    flameImage = Image.open('images/laser.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Laser aktiviert")
                    playlaser()
                    laserblink()
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Laser deaktiviert")
            else:
                if float(dist_rechts_voll_perma) > 35:
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   keine Aktivitaet R_90   "+ dist_rechts_voll_perma+" cm");
                    flameImage = Image.open('images/auge71.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
            if float(dist_rechts_perma) < 35:
                flameImage = Image.open('images/auge43.png').convert("1")
                image.paste(flameImage,(0,0))
                disp.image(image)
                oldimage = Image.new('1', (width, height))
                disp.display()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Aktivitaet.......R_45   "+ dist_rechts_perma+" cm");
                playallsounds()
                pwm.setPWM(0, 0, servoMhr2)
                LogWrite (strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Servo auf R_45")
                if float(dist_sensor_servo) < 20:
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Servo Abstand Vorn:     "+ dist_sensor_servo+" cm")
                    flameImage = Image.open('images/laser.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Laser aktiviert")
                    playlaser()
                    laserblink()
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Laser deaktiviert")
            else:
                if float(dist_rechts_perma) > 35:
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   keine Aktivitaet R_45   "+ dist_rechts_perma+" cm");
                    flameImage = Image.open('images/auge73.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   .............Schleife-Ende.............."+(strftime("%d/%m/%Y %H:%M:%S", localtime())))
        else:
            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Ich mache pause, schalte S1 zum fortfahren um!")
            print(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Ich mache pause, schalte S1 zum fortfahren um!")
            playagro()
            time.sleep(3)
            Error()
 
 
 
except KeyboardInterrupt:
    Stop()
    playshutdown()
    time.sleep(3)
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Ich bin stehen geblieben, du musst das Programm neustarten!")
    print(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Ich bin stehen geblieben, du musst das Programm neustarten!")
    GPIO.output(LED, 1)


Programmcode autonomer mit Licht gesteuerter Raspobot

##!/usr/bin/python
 
import os
import sys
import glob
import math
import time
import serial
import random
import smbus
import thread
import tsl2591
import datetime
import psutil, os
import pygame.mixer
import sys, traceback
import RPi.GPIO as GPIO
import Adafruit_SSD1306
from Adafruit_PWM_Servo_Driver import PWM
from time import sleep, gmtime, localtime, strftime
from PIL import Image, ImageDraw, ImageFont, ImageOps
 
 
p = psutil.Process(os.getpid())
p.nice(50)
p.nice()
 
 
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.cleanup()          #Board /BCM 
GPIO.setup(10, GPIO.OUT)  #19  #10
GPIO.setup(4, GPIO.OUT)   #7   #4
GPIO.setup(25, GPIO.OUT)  #22  #25
GPIO.setup(17, GPIO.OUT)  #11  #17
Schalter = 9              #21   #9
LED = 11                  #23  #11
RST = 27
pwm = PWM(0x40)
servoMin = 157
servoMhl3 = 206
servoMhl2 = 262
servoMhl1 = 319
servoMid = 375
servoMhr1 = 431
servoMhr2 = 487
servoMhr3 = 543
servoMax = 600
 
 
BUSNR = 1
ADDR = 0x20
ADDR1 = 0x21
IODIRA = 0x00
IODIRB = 0x01
GPIOA = 0x12
GPIOB = 0x13
 
PINAA = [0x00]
PINA10 = [0x88]  # Blinker_rechts
PINA11 = [0x60]  # Brems_licht
PINA12 = [0x14]  # Blinker_links
PINA13 = [0x06]  # Rueck_licht
PINA14 = [0x03]  # Front_licht
PINA15 = [0x03]  # Rueck_licht
 
PINBA = [0x00]
PINB10 = [0x88]  # Blinker_rechts
PINB11 = [0x60]  # Brems_licht
PINB12 = [0x14]  # Blinker_links
PINB13 = [0x06]  # Rueck_licht
PINB14 = [0x03]  # Front_licht
 
PINAA1 = [0x00]
PINA101 = [0x80]
 
PINBA1 = [0x00]
PINB101 = [0x80]
 
i2cBus = smbus.SMBus(BUSNR)
i2cBus.write_byte_data(ADDR, IODIRA, 0x00)
i2cBus.write_byte_data(ADDR, IODIRB, 0x01)
i2cBus.write_byte_data(ADDR1, IODIRA, 0x00)
i2cBus.write_byte_data(ADDR1, IODIRB, 0x01)
 
GPIO.setup(Schalter, GPIO.IN)
GPIO.setup(LED, GPIO.OUT)
 
DELAY = 1
 
pygame.mixer.init(48000, -16, 1, 8192)
soundfilesstart = glob.glob("rasposound/start/*.wav")
soundfilesstop = glob.glob("rasposound/stop/*.wav")
soundfilesvorwaerts = glob.glob("rasposound/vorwaerts/*.wav")
soundfilesrueckwaerts = glob.glob("rasposound/rueckwaerts/*.wav")
soundfilesfun = glob.glob("rasposound/fun/*.wav")
soundfilesagro = glob.glob("rasposound/agro/*.wav")
soundfilesdefence = glob.glob("rasposound/defence/*.wav")
soundfilesshutdown = glob.glob("rasposound/shutdown/*.wav")
soundfilesmessenl = glob.glob("rasposound/messen-l/*.wav")
soundfilesmessenr = glob.glob("rasposound/messen-r/*.wav")
 
disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST)
disp.begin()
disp.clear()
disp.dim(True)
disp.set_contrast(255)
disp.display()
 
def LogWrite(str):
    file = open('/var/log/test.txt', "a+")
    file.write(str + '\n')
    file.close()
 
def playstart():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   playing Start")
    pygame.mixer.Sound(random.choice(soundfilesstart)).play()
 
 
def playstop():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   playing Stop")
    pygame.mixer.Sound(random.choice(soundfilesstop)).play()
    time.sleep(2)
 
def playvorwaerts():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   playing Vorweartz")
    pygame.mixer.Sound(random.choice(soundfilesvorwaerts)).play()
#    time.sleep(0.5)
 
def playrueckwaerts():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   playing Rueckweartz")
    pygame.mixer.Sound(random.choice(soundfilesrueckwaerts)).play()
    time.sleep(1)
 
def playfun():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   playing Fun")
    pygame.mixer.Sound(random.choice(soundfilesfun)).play()
 
 
def playagro():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   playing Agro")
    pygame.mixer.Sound(random.choice(soundfilesagro)).play()
 
 
def playdefence():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   playing defence")
    pygame.mixer.Sound(random.choice(soundfilesdefence)).play()
 
 
def playshutdown():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   playing shutdown")
    pygame.mixer.Sound(random.choice(soundfilesshutdown)).play()
 
 
def playmessenl():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   playing messen links")
    pygame.mixer.Sound(random.choice(soundfilesmessenl)).play()
 
 
def playmessenr():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   playing messen rechts")
    pygame.mixer.Sound(random.choice(soundfilesmessenr)).play()
 
 
LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   ..............Ultraschallmessung mit HC-SR04...............")
 
# A routine to control a pair of pins
 
 
def ControlAPairOfPins(FirstPin, FirstState, SecondPin, SecondState):
    if FirstState == "1":
        GPIO.output(int(FirstPin), True)
    else:
        GPIO.output(int(FirstPin), False)
    if SecondState == "1":
        GPIO.output(int(SecondPin), True)
    else:
        GPIO.output(int(SecondPin), False)
    return
 
 
def Stop():
    ControlAPairOfPins("10", "0", "4", "0")
    ControlAPairOfPins("25", "0", "17", "0")
    for leds in PINA11:
        i2cBus.write_byte_data(ADDR, GPIOA, leds)
        sleep(DELAY)
    for leds in PINAA:
        i2cBus.write_byte_data(ADDR, GPIOA, leds)
 
 
def Stop_anhalten_permanent():
    ControlAPairOfPins("10", "0", "4", "0")
    ControlAPairOfPins("25", "0", "17", "0")
    for leds in PINA11:
        i2cBus.write_byte_data(ADDR, GPIOA, leds)
        sleep(DELAY)
    for leds in PINAA:
        i2cBus.write_byte_data(ADDR, GPIOA, leds)
 
 
def Vorwaerts_fahren():
    for leds in PINA14:
        i2cBus.write_byte_data(ADDR, GPIOA, leds)
    ControlAPairOfPins("10", "1", "4", "0")
    ControlAPairOfPins("25", "1", "17", "1")
 
 
def Geradeaus_vorwaerts_start():
    for leds in PINA14:
        i2cBus.write_byte_data(ADDR, GPIOA, leds)
    ControlAPairOfPins("10", "1", "4", "0")
    ControlAPairOfPins("25", "1", "17", "1")
 
 
def Links_fahren():
    for leds in PINA12:
        i2cBus.write_byte_data(ADDR, GPIOA, leds)
    ControlAPairOfPins("10", "0", "4", "0")
    ControlAPairOfPins("25", "0", "17", "1")
    time.sleep(0.55)
    for leds in PINAA:
        i2cBus.write_byte_data(ADDR, GPIOA, leds)
 
 
def Links_fahren_voll():
    for leds in PINA12:
        i2cBus.write_byte_data(ADDR, GPIOA, leds)
    ControlAPairOfPins("10", "1", "4", "0")
    ControlAPairOfPins("25", "0", "11", "1")
    time.sleep(0.75)
    for leds in PINAA:
        i2cBus.write_byte_data(ADDR, GPIOA, leds)
 
 
def Rechts_fahren():
    for leds in PINA10:
        i2cBus.write_byte_data(ADDR, GPIOA, leds)
    ControlAPairOfPins("10", "1", "4", "1")
    ControlAPairOfPins("25", "1", "17", "0")
    time.sleep(0.55)
    for leds in PINAA:
        i2cBus.write_byte_data(ADDR, GPIOA, leds)
 
 
def Rechts_fahren_voll():
    for leds in PINA10:
        i2cBus.write_byte_data(ADDR, GPIOA, leds)
    ControlAPairOfPins("10", "1", "4", "1")
    ControlAPairOfPins("25", "1", "17", "1")
    time.sleep(0.15)
    for leds in PINAA:
        i2cBus.write_byte_data(ADDR, GPIOA, leds)
 
 
def Rueckwaerts_fahren():
    for leds in PINA15:
        i2cBus.write_byte_data(ADDR1, GPIOA, leds)
#    for leds in PINA101:
#        i2cBus.write_byte_data(ADDR1, GPIOA, leds)
    ControlAPairOfPins("10", "1", "4", "1")
    ControlAPairOfPins("25", "0", "17", "1")
    time.sleep(1.5)
    for leds in PINAA:
        i2cBus.write_byte_data(ADDR1, GPIOA, leds)
#    for leds in PINAA1:
#        i2cBus.write_byte_data(ADDR1, GPIOA, leds)
 
 
def Rueckwaerts_fahren_l():
    for leds in PINA15:
        i2cBus.write_byte_data(ADDR1, GPIOA, leds)
    ControlAPairOfPins("10", "1", "4", "1")
    ControlAPairOfPins("25", "0", "17", "1")
    time.sleep(0.5)
    for leds in PINAA:
        i2cBus.write_byte_data(ADDR1, GPIOA, leds)
 
 
def Rueckwaerts_fahren_r():
    for leds in PINA15:
        i2cBus.write_byte_data(ADDR1, GPIOA, leds)
    ControlAPairOfPins("10", "1", "4", "1")
    ControlAPairOfPins("25", "0", "17", "1")
    time.sleep(0.5)
    for leds in PINAA:
        i2cBus.write_byte_data(ADDR1, GPIOA, leds)
 
 
def setServoPulse(channel, pulse):
#    for leds in PINA101:
#        i2cBus.write_byte_data(ADDR1, GPIOA, leds)
    pulseLength = 1000000                   # 1,000,000 us per second
    pulseLength /= 60                       # 60 Hz
    LogWrite("%d us per period" % pulseLength)
    pulseLength /= 4096                     # 12 bits of resolution
    LogWrite("%d us per bit" % pulseLength)
    pulse *= 1000
    pulse /= pulseLength
    pwm.setPWM(channel, 0, pulse)
#    for leds in PINAA1:
#        i2cBus.write_byte_data(ADDR1, GPIOA, leds)
 
pwm.setPWMFreq(60)
 
 
def Messung_dist_links():
    elapsed = dist_sensor_servo
    global dist_links
    dist_links = elapsed * 1
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Servo_Abstand_links:    "+ dist_links+" cm")
 
 
def Messung_dist_rechts():
    elapsed = dist_sensor_servo
    global dist_rechts
    dist_rechts = elapsed * 1
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Servo_Abstand_rechts:    "+ dist_rechts+" cm")
 
 
def Error():
    Stop()
    GPIO.output(LED, 1)
    time.sleep(0.3)
    GPIO.output(LED, 0)
    time.sleep(0.3)
 
 
tsl = tsl2591.Tsl2591()
full, ir = tsl.get_full_luminosity()   
lux = tsl.calculate_lux(full, ir)
 
 
 
 
def thread_dist():
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   THREAD STARTED")
 
    ser = serial.Serial('/dev/ttyUSB0', 115200)
    time.sleep(1.5)
 
    a = []
    global dist_links_voll_perma
    global dist_links_perma
    global dist_vorn_perma
    global dist_rechts_perma
    global dist_rechts_voll_perma
    global dist_sensor_servo
 
 
    try:
        while True:
            ser.write('DS@');
            a=ser.readline();
            x=a.split(';');
            if ( len(x)==13 and x[0] == 'l90' and float(x[1]) != 0.00 ):
                #LogWrite (len(x))
                dist_links_voll_perma = x[1];
                #LogWrite (dist_links_voll_perma)
                dist_links_perma = x[3];
                #LogWrite (dist_links_perma)
                dist_vorn_perma = x[5];
                #LogWrite (dist_vorn_perma)
                dist_rechts_perma = x[7];
                #LogWrite (dist_rechts_perma)
                dist_rechts_voll_perma = x[9];
                #LogWrite (dist_rechts_voll_perma)
                dist_sensor_servo = x[11];
                #LogWrite (dist_sensor_servo)
 
 
    except:
        print 'error / thread aborted';
 
 
 
try:
    # start distance measurement in separate thread
    thread.start_new_thread( thread_dist, ())
 
    # wait for first values of distance sensors
    x = 1
    while x == 1:
        try:
             dist_links_voll_perma
             dist_links_perma
             dist_vorn_perma
             dist_rechts_perma
             dist_rechts_voll_perma
             dist_sensor_servo
 
             x = 2
        except NameError:
             time.sleep(0.2)
 
 
 
 
    while True:
 
        currenttime = strftime("%H:%M", localtime())
        width = disp.width
        height = disp.height
        image = Image.new('1', (width, height))
        draw = ImageDraw.Draw(image)
        draw.rectangle((0,0,width,height), outline=0, fill=0)
 
        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   .............Schleife-Start............."+(strftime("%d/%m/%Y %H:%M:%S", localtime())))
        GPIO.output(LED, 1)
        if GPIO.input(Schalter) == 0:
            GPIO.output(LED, 0)
            tsl = tsl2591.Tsl2591()
            full, ir = tsl.get_full_luminosity()   
            lux = tsl.calculate_lux(full, ir)
            if lux > 1000:
                Vorwaerts_fahren()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist OK fahre vorwaertz"+"   lux=%3.2f" % (lux))
                if float(dist_vorn_perma) > 65:
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Vorn_ist_alles_frei_1 M_0    "+ dist_vorn_perma+" cm");
                    flameImage = Image.open('images/auge71.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    tsl = tsl2591.Tsl2591()
                    full, ir = tsl.get_full_luminosity()   
                    lux = tsl.calculate_lux(full, ir)
                    if lux > 1000:
                        Vorwaerts_fahren()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist OK fahre vorwaertz"+"   lux=%3.2f" % (lux))
                    elif lux < 1000:
                        Stop()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist zu niedrig"+"   lux=%3.2f" % (lux))
                    playvorwaerts()
                if float(dist_vorn_perma) < 65:
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Hindernis erkannt_1!  M_0    "+ dist_vorn_perma+" cm");
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   STOP_VORN")
                    flameImage = Image.open('images/auge67.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    Stop_anhalten_permanent()
                    playstop()
                    playrueckwaerts()
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   fahre_ruckwaerts")
                    flameImage = Image.open('images/auge94.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    tsl = tsl2591.Tsl2591()
                    full, ir = tsl.get_full_luminosity()   
                    lux = tsl.calculate_lux(full, ir)
                    if lux > 1000:
                        Rueckwaerts_fahren()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist OK fahre rueckwaertz"+"   lux=%3.2f" % (lux))
                    elif lux < 1000:
                        Stop()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist zu niedrig STOP"+"   lux=%3.2f" % (lux))
 
                    Stop()
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   STOP_ruckwaerts")
                    pwm.setPWM(0, 0, servoMin)
                    time.sleep(0.2)
                    flameImage = Image.open('images/auge9.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    time.sleep(1)
                    playagro()
                    Messung_dist_links()
                    pwm.setPWM(0, 0, servoMax)
                    time.sleep(0.2)
                    flameImage = Image.open('images/auge8.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    time.sleep(1)
                    Messung_dist_rechts()
                    pwm.setPWM(0, 0, servoMid)
                    time.sleep(0.2)
                    flameImage = Image.open('images/auge71.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    time.sleep(1)
                    if dist_links > dist_rechts:
                        flameImage = Image.open('images/auge94.png').convert("1")
                        image.paste(flameImage,(0,0))
                        disp.image(image)
                        oldimage = Image.new('1', (width, height))
                        disp.display()
                        tsl = tsl2591.Tsl2591()
                        full, ir = tsl.get_full_luminosity()   
                        lux = tsl.calculate_lux(full, ir)
                        if lux > 1000:
                            Rueckwaerts_fahren_l()
                            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist OK fahre rueckwaertz l"+"   lux=%3.2f" % (lux))
                        elif lux < 1000:
                            Stop()
                            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist zu niedrig STOP"+"   lux=%3.2f" % (lux))
 
#                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   fahre_rueckwaerts_links")
                        flameImage = Image.open('images/auge42.png').convert("1")
                        image.paste(flameImage,(0,0))
                        disp.image(image)
                        oldimage = Image.new('1', (width, height))
                        disp.display()
                        Stop()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   STOP_ruckwaerts")
                        tsl = tsl2591.Tsl2591()
                        full, ir = tsl.get_full_luminosity()   
                        lux = tsl.calculate_lux(full, ir)
                        if lux > 1000:
                            Links_fahren_voll()
                            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist OK fahre links voll"+"   lux=%3.2f" % (lux))
                        elif lux < 1000:
                            Stop()
                            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist zu niedrig STOP"+"   lux=%3.2f" % (lux))
 
#                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   fahre_links_voll")
                    else:
                        flameImage = Image.open('images/auge94.png').convert("1")
                        image.paste(flameImage,(0,0))
                        disp.image(image)
                        oldimage = Image.new('1', (width, height))
                        disp.display()
                        tsl = tsl2591.Tsl2591()
                        full, ir = tsl.get_full_luminosity()   
                        lux = tsl.calculate_lux(full, ir)
                        if lux > 1000:
                            Rueckwaerts_fahren_r()
                            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist OK fahre rueckwaertz r"+"   lux=%3.2f" % (lux))
                        elif lux < 1000:
                            Stop()
                            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist zu niedrig STOP"+"   lux=%3.2f" % (lux))
 
#                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   fahre_rueckwaerts_rechts")
                        flameImage = Image.open('images/auge43.png').convert("1")
                        image.paste(flameImage,(0,0))
                        disp.image(image)
                        oldimage = Image.new('1', (width, height))
                        disp.display()
                        Stop()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   STOP_ruckwaerts")
                        tsl = tsl2591.Tsl2591()
                        full, ir = tsl.get_full_luminosity()   
                        lux = tsl.calculate_lux(full, ir)
                        if lux > 1000:
                            Rechts_fahren_voll()
                            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist OK fahre rechts voll"+"   lux=%3.2f" % (lux))
                        elif lux < 1000:
                            Stop()
                            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist zu niedrig STOP"+"   lux=%3.2f" % (lux))
 
#                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   fahre_rechts_voll")
                else:
                    flameImage = Image.open('images/auge71.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    tsl = tsl2591.Tsl2591()
                    full, ir = tsl.get_full_luminosity()   
                    lux = tsl.calculate_lux(full, ir)
                    if lux > 1000:
                        Geradeaus_vorwaerts_start()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist OK fahre vorwaertz weiter"+"   lux=%3.2f" % (lux))
                    elif lux < 1000:
                        Stop()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist zu niedrig STOP"+"   lux=%3.2f" % (lux))
                if float(dist_links_perma) < 56:
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Hindernis_Links! L_45   "+ dist_links_perma+" cm");
                    flameImage = Image.open('images/auge42.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    tsl = tsl2591.Tsl2591()
                    full, ir = tsl.get_full_luminosity()   
                    lux = tsl.calculate_lux(full, ir)
                    if lux > 1000:
                        Rechts_fahren()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist OK fahre rechts"+"   lux=%3.2f" % (lux))
                    elif lux < 1000:
                        Stop()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist zu niedrig STOP"+"   lux=%3.2f" % (lux))
 
                    pwm.setPWM(0, 0, servoMhl2)
                    time.sleep(0.2)
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   rechts_ausweichen")
                    playmessenr()
                    tsl = tsl2591.Tsl2591()
                    full, ir = tsl.get_full_luminosity()   
                    lux = tsl.calculate_lux(full, ir)
                    if lux > 1000:
                        Geradeaus_vorwaerts_start()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist OK fahre vorwaertz weiter"+"   lux=%3.2f" % (lux))
                    elif lux < 1000:
                        Stop()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist zu niedrig STOP"+"   lux=%3.2f" % (lux))
 
                    flameImage = Image.open('images/auge71.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    pwm.setPWM(0, 0, servoMid)
                    time.sleep(0.2)
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   fahre_geradeaus_vorwaertz")
                else:
                    if float(dist_links_perma) > 56:
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   L_45   "+ dist_links_perma+" cm");
                        flameImage = Image.open('images/auge73.png').convert("1")
                        image.paste(flameImage,(0,0))
                        disp.image(image)
                        oldimage = Image.new('1', (width, height))
                        disp.display()
                if float(dist_links_voll_perma) < 56:
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Hindernis_Links_voll! L_45   "+ dist_links_voll_perma+" cm");
                    flameImage = Image.open('images/auge9.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    tsl = tsl2591.Tsl2591()
                    full, ir = tsl.get_full_luminosity()   
                    lux = tsl.calculate_lux(full, ir)
                    if lux > 1000:
                        Rechts_fahren()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist OK fahre rechts"+"   lux=%3.2f" % (lux))
                    elif lux < 1000:
                        Stop()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist zu niedrig STOP"+"   lux=%3.2f" % (lux))
 
                    pwm.setPWM(0, 0, servoMin)
                    time.sleep(0.2)
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   rechts_ausweichen")
                    playmessenr()
                    tsl = tsl2591.Tsl2591()
                    full, ir = tsl.get_full_luminosity()   
                    lux = tsl.calculate_lux(full, ir)
                    if lux > 1000:
                        Geradeaus_vorwaerts_start()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist OK fahre vorwaertz weiter"+"   lux=%3.2f" % (lux))
                    elif lux < 1000:
                        Stop()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist zu niedrig STOP"+"   lux=%3.2f" % (lux))
 
                    flameImage = Image.open('images/auge71.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    pwm.setPWM(0, 0, servoMid)
                    time.sleep(0.2)
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   fahre_geradeaus_vorwaertz")
                else:
                    if float(dist_links_voll_perma) > 56:
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   L_90   "+ dist_links_voll_perma+" cm");
                        flameImage = Image.open('images/auge72.png').convert("1")
                        image.paste(flameImage,(0,0))
                        disp.image(image)
                        oldimage = Image.new('1', (width, height))
                        disp.display()
                if float(dist_links_perma) < 56:
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Hindernis_Links! L_45   "+ dist_links_perma+" cm");
                    flameImage = Image.open('images/auge42.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    tsl = tsl2591.Tsl2591()
                    full, ir = tsl.get_full_luminosity()   
                    lux = tsl.calculate_lux(full, ir)
                    if lux > 1000:
                        Rechts_fahren()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist OK fahre rechts"+"   lux=%3.2f" % (lux))
                    elif lux < 1000:
                        Stop()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist zu niedrig STOP"+"   lux=%3.2f" % (lux))
 
                    pwm.setPWM(0, 0, servoMhl2)
                    time.sleep(0.2)
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   rechts_ausweichen")
                    playmessenr()
                    tsl = tsl2591.Tsl2591()
                    full, ir = tsl.get_full_luminosity()   
                    lux = tsl.calculate_lux(full, ir)
                    if lux > 1000:
                        Geradeaus_vorwaerts_start()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist OK fahre vorwaertz weiter"+"   lux=%3.2f" % (lux))
                    elif lux < 1000:
                        Stop()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist zu niedrig STOP"+"   lux=%3.2f" % (lux))
 
                    flameImage = Image.open('images/auge71.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    pwm.setPWM(0, 0, servoMid)
                    time.sleep(0.2)
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   fahre_geradeaus_vorwaertz")
                else:
                    if float(dist_links_perma) > 56:
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   L_45   "+ dist_links_perma+" cm");
                        flameImage = Image.open('images/auge73.png').convert("1")
                        image.paste(flameImage,(0,0))
                        disp.image(image)
                        oldimage = Image.new('1', (width, height))
                        disp.display()
                if float(dist_vorn_perma) > 65:
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Vorn_ist_alles_frei M_0    "+ dist_vorn_perma+" cm");
                    flameImage = Image.open('images/auge71.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    tsl = tsl2591.Tsl2591()
                    full, ir = tsl.get_full_luminosity()   
                    lux = tsl.calculate_lux(full, ir)
                    if lux > 1000:
                        Vorwaerts_fahren()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist OK fahre vorwaertz"+"   lux=%3.2f" % (lux))
                    elif lux < 1000:
                        Stop()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist zu niedrig"+"   lux=%3.2f" % (lux))
                if float(dist_vorn_perma) < 65:
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Hindernis erkannt_2!  M_0    "+ dist_vorn_perma+" cm");
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   STOP_VORN")
                    flameImage = Image.open('images/auge67.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    Stop_anhalten_permanent()
                    playstop()
                    time.sleep(2)
                    playrueckwaerts()
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   fahre_ruckwaerts")
                    flameImage = Image.open('images/auge94.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    tsl = tsl2591.Tsl2591()
                    full, ir = tsl.get_full_luminosity()   
                    lux = tsl.calculate_lux(full, ir)
                    if lux > 1000:
                        Rueckwaerts_fahren()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist OK fahre rueckwaertz"+"   lux=%3.2f" % (lux))
                    elif lux < 1000:
                        Stop()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist zu niedrig STOP"+"   lux=%3.2f" % (lux))
 
                    Stop()
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   STOP_ruckwaerts")
                    pwm.setPWM(0, 0, servoMin)
                    time.sleep(0.2)
                    flameImage = Image.open('images/auge9.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    time.sleep(1)
                    playagro()
                    Messung_dist_links()
                    pwm.setPWM(0, 0, servoMax)
                    time.sleep(0.2)
                    flameImage = Image.open('images/auge8.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    time.sleep(1)
                    Messung_dist_rechts()
                    pwm.setPWM(0, 0, servoMid)
                    time.sleep(0.2)
                    flameImage = Image.open('images/auge71.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    time.sleep(1)
                    if dist_links > dist_rechts:
                        flameImage = Image.open('images/auge94.png').convert("1")
                        image.paste(flameImage,(0,0))
                        disp.image(image)
                        oldimage = Image.new('1', (width, height))
                        disp.display()
                        tsl = tsl2591.Tsl2591()
                        full, ir = tsl.get_full_luminosity()   
                        lux = tsl.calculate_lux(full, ir)
                        if lux > 1000:
                            Rueckwaerts_fahren_l()
                            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist OK fahre rueckwaertz l"+"   lux=%3.2f" % (lux))
                        elif lux < 1000:
                            Stop()
                            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist zu niedrig STOP"+"   lux=%3.2f" % (lux))
 
#                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   fahre_rueckwaerts_links")
                        flameImage = Image.open('images/auge42.png').convert("1")
                        image.paste(flameImage,(0,0))
                        disp.image(image)
                        oldimage = Image.new('1', (width, height))
                        disp.display()
                        Stop()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   STOP_ruckwaerts")
                        tsl = tsl2591.Tsl2591()
                        full, ir = tsl.get_full_luminosity()   
                        lux = tsl.calculate_lux(full, ir)
                        if lux > 1000:
                            Links_fahren_voll()
                            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist OK fahre links voll"+"   lux=%3.2f" % (lux))
                        elif lux < 1000:
                            Stop()
                            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist zu niedrig STOP"+"   lux=%3.2f" % (lux))
 
#                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   fahre_links_voll")
                    else:
                        flameImage = Image.open('images/auge94.png').convert("1")
                        image.paste(flameImage,(0,0))
                        disp.image(image)
                        oldimage = Image.new('1', (width, height))
                        disp.display()
                        tsl = tsl2591.Tsl2591()
                        full, ir = tsl.get_full_luminosity()   
                        lux = tsl.calculate_lux(full, ir)
                        if lux > 1000:
                            Rueckwaerts_fahren_r()
                            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist OK fahre rueckwaertz r"+"   lux=%3.2f" % (lux))
                        elif lux < 1000:
                            Stop()
                            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist zu niedrig STOP"+"   lux=%3.2f" % (lux))
 
#                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   fahre_rueckwaerts_rechts")
                        flameImage = Image.open('images/auge43.png').convert("1")
                        image.paste(flameImage,(0,0))
                        disp.image(image)
                        oldimage = Image.new('1', (width, height))
                        disp.display()
                        Stop()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   STOP_ruckwaerts")
                        tsl = tsl2591.Tsl2591()
                        full, ir = tsl.get_full_luminosity()   
                        lux = tsl.calculate_lux(full, ir)
                        if lux > 1000:
                            Rechts_fahren_voll()
                            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist OK fahre rechts voll"+"   lux=%3.2f" % (lux))
                        elif lux < 1000:
                            Stop()
                            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist zu niedrig STOP"+"   lux=%3.2f" % (lux))
 
#                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   fahre_rechts_voll")
                else:
                    flameImage = Image.open('images/auge71.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    tsl = tsl2591.Tsl2591()
                    full, ir = tsl.get_full_luminosity()   
                    lux = tsl.calculate_lux(full, ir)
                    if lux > 1000:
                        Geradeaus_vorwaerts_start()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist OK fahre vorwaertz weiter"+"   lux=%3.2f" % (lux))
                    elif lux < 1000:
                        Stop()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist zu niedrig STOP"+"   lux=%3.2f" % (lux))
                if float(dist_rechts_perma) < 56:
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Hindernis_Rechts! R_45   "+ dist_rechts_perma+" cm");
                    flameImage = Image.open('images/auge43.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    tsl = tsl2591.Tsl2591()
                    full, ir = tsl.get_full_luminosity()   
                    lux = tsl.calculate_lux(full, ir)
                    if lux > 1000:
                        Links_fahren()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist OK fahre links"+"   lux=%3.2f" % (lux))
                    elif lux < 1000:
                        Stop()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist zu niedrig STOP"+"   lux=%3.2f" % (lux))
 
                    pwm.setPWM(0, 0, servoMhr2)
                    time.sleep(0.2)
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   links_ausweichen")
                    playmessenl()
                    tsl = tsl2591.Tsl2591()
                    full, ir = tsl.get_full_luminosity()   
                    lux = tsl.calculate_lux(full, ir)
                    if lux > 1000:
                        Geradeaus_vorwaerts_start()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist OK fahre vorwaertz weiter"+"   lux=%3.2f" % (lux))
                    elif lux < 1000:
                        Stop()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist zu niedrig STOP"+"   lux=%3.2f" % (lux))
 
                    flameImage = Image.open('images/auge71.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    pwm.setPWM(0, 0, servoMid)
                    time.sleep(0.2)
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   fahre_geradeaus_vorwaertz")
                else:
                    if float(dist_rechts_perma) > 56:
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   R_45   "+ dist_rechts_perma+" cm");
                        flameImage = Image.open('images/auge72.png').convert("1")
                        image.paste(flameImage,(0,0))
                        disp.image(image)
                        oldimage = Image.new('1', (width, height))
                        disp.display()
                if float(dist_rechts_voll_perma) < 56:
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Hindernis_Rechts_voll! R_90   "+ dist_rechts_voll_perma+" cm");
                    flameImage = Image.open('images/auge8.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    tsl = tsl2591.Tsl2591()
                    full, ir = tsl.get_full_luminosity()   
                    lux = tsl.calculate_lux(full, ir)
                    if lux > 1000:
                        Links_fahren()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist OK fahre links"+"   lux=%3.2f" % (lux))
                    elif lux < 1000:
                        Stop()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist zu niedrig STOP"+"   lux=%3.2f" % (lux))
 
                    pwm.setPWM(0, 0, servoMax)
                    time.sleep(0.2)
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   links_ausweichen")
                    playmessenl()
                    tsl = tsl2591.Tsl2591()
                    full, ir = tsl.get_full_luminosity()   
                    lux = tsl.calculate_lux(full, ir)
                    if lux > 1000:
                        Geradeaus_vorwaerts_start()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist OK fahre vorwaertz weiter"+"   lux=%3.2f" % (lux))
                    elif lux < 1000:
                        Stop()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist zu niedrig STOP"+"   lux=%3.2f" % (lux))
 
                    flameImage = Image.open('images/auge71.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    pwm.setPWM(0, 0, servoMid)
                    time.sleep(0.2)
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   fahre_geradeaus_vorwaertz")
                else:
                    if float(dist_rechts_voll_perma) > 56:
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   R_90   "+ dist_rechts_voll_perma+" cm");
                        flameImage = Image.open('images/auge73.png').convert("1")
                        image.paste(flameImage,(0,0))
                        disp.image(image)
                        oldimage = Image.new('1', (width, height))
                        disp.display()
                if float(dist_rechts_perma) < 56:
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Hindernis_Rechts! R_45   "+ dist_rechts_perma+" cm");
                    flameImage = Image.open('images/auge43.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    tsl = tsl2591.Tsl2591()
                    full, ir = tsl.get_full_luminosity()   
                    lux = tsl.calculate_lux(full, ir)
                    if lux > 1000:
                        Links_fahren()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist OK fahre links"+"   lux=%3.2f" % (lux))
                    elif lux < 1000:
                        Stop()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist zu niedrig STOP"+"   lux=%3.2f" % (lux))
 
                    pwm.setPWM(0, 0, servoMhr2)
                    time.sleep(0.2)
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   links_ausweichen")
                    playmessenl()
                    tsl = tsl2591.Tsl2591()
                    full, ir = tsl.get_full_luminosity()   
                    lux = tsl.calculate_lux(full, ir)
                    if lux > 1000:
                        Geradeaus_vorwaerts_start()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist OK fahre vorwaertz weiter"+"   lux=%3.2f" % (lux))
                    elif lux < 1000:
                        Stop()
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist zu niedrig STOP"+"   lux=%3.2f" % (lux))
 
                    flameImage = Image.open('images/auge71.png').convert("1")
                    image.paste(flameImage,(0,0))
                    disp.image(image)
                    oldimage = Image.new('1', (width, height))
                    disp.display()
                    pwm.setPWM(0, 0, servoMid)
                    time.sleep(0.2)
                    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   fahre_geradeaus_vorwaertz")
                else:
                    if float(dist_rechts_perma) > 56:
                        LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   R_45   "+ dist_rechts_perma+" cm");
                        flameImage = Image.open('images/auge72.png').convert("1")
                        image.paste(flameImage,(0,0))
                        disp.image(image)
                        oldimage = Image.new('1', (width, height))
                        disp.display()
            elif lux < 1000:
                Stop()
                LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Lux ist zu niedrig"+"   lux=%3.2f" % (lux))
            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   .............Schleife-Ende.............."+(strftime("%d/%m/%Y %H:%M:%S", localtime())))
        else:
            LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Ich mache pause, schalte S1 zum fortfahren um!")
            print(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Ich mache pause, schalte S1 zum fortfahren um!")
            playagro()
            time.sleep(3)
            Error()
 
except KeyboardInterrupt:
    Stop()
    playshutdown()
    LogWrite(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Ich bin stehen geblieben, du musst das Programm neustarten!")
    print(strftime("%d/%m/%Y %H:%M:%S", localtime())+"   Ich bin stehen geblieben, du musst das Programm neustarten!")
    GPIO.output(LED, 1)


Raspobot OS bisherige Installationsanweisungen

Bash History unendlich setzen
 
Befehl:
sudo nano ~/.bashrc
 
Edit:
HISTSIZE=20000         #definiert Ramgröße
HISTFILESIZE=""        #definiert Dateigröße
____________________________________________
 
Passwort Benutzer ändern
 
Befehl:
passwd pi
 
aktuelles Passwort eingeben
2x neues Passwort eingeben
-----
 
Befehl:
sudo passwd root
 
aktuelles Passwort eingeben
2x neues Passwort eingeben
 
Befehl:
sudo adduser pi i2c
sudo adduser pi root
-----
 
SSH WINSCP Root login:
 
Befehl:
sudo nano /etc/ssh/sshd_config
 
Edit:
PermitRootLogin without-password
to
PermitRootLogin yes
____________________________________________
 
Raspberry Pi ausschalten
 
Befehl:
sudo halt
sudo poweroff
sudo shutdown now -h
____________________________________________
 
Netzwerk einstellungen (WLAN) / LAN
 
------------------
 
Raspbian WLAN Schlafmodus abschalten
 
Befehl:
sudo nano /etc/modprobe.d/8192cu.conf
 
Edit:
options 8192cu rtw_power_mgnt=0 rtw_enusbss=0
 
save:
----
WLAN Sleepmode abschalten Raspberry Pi 3
 
Befehl:
sudo nano /etc/network/interfaces
 
Edit: # Unter den Zeilen der WLAN Konfiguration diese zwei Zeilen hinzufügen.
pre-up iw dev wlan0 set power_save off
post-down iw dev wlan0 set power_save on
-------------------
 
Interface Datei bearbeiten.
 
Befehl:
sudo nano /etc/network/interfaces
 
Edit:
# interfaces(5) file used by ifup(8) and ifdown(8)
 
# Please note that this file is written to be used with dhcpcd
# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'
 
# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d
 
auto lo
iface lo inet loopback
 
iface eth0 inet dhcp
 
auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp
 
save:
-------------------
 
Wlan AP´s eintragen.
 
Befehl:
sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
 
Edit:
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
 
network={
        ssid="tfk-home"
        psk="xxxx"
        proto=RSN
        key_mgmt=WPA-PSK
        pairwise=CCMP
        auth_alg=OPEN
}
 
network={
        ssid="AndroidHotspot"
        psk="xxxx"
        proto=RSN
        key_mgmt=WPA-PSK
        pairwise=CCMP
        auth_alg=OPEN
}
 
network={
        ssid="SamsungAP"
        scan_ssid=1
        psk="xxxx"
        proto=RSN
        key_mgmt=WPA-PSK
        pairwise=CCMP
        auth_alg=OPEN
}
 
#network={
#        ssid="HN1X"
#        scan_ssid=1
#        key_mgmt=WPA-EAP
#        eap=PEAP
#        ca_cert="/etc/Deutsche_Telekom_Root_CA_2.pem"
##        anonymous_identity="user@domain"
#        identity="xxxx"
#        password="xxxx"
#        phase1="peaplabel=0"
#        phase2="auth=MSCHAPV2"
#}
 
#network={
#        ssid="eduroam"
#        scan_ssid=1
#        key_mgmt=WPA-EAP
#        eap=PEAP
#        ca_cert="/etc/Deutsche_Telekom_Root_CA_2.pem"
#        anonymous_identity="user@domain"
#        identity="xxxx"
#        password="xxxx"
#        phase1="peaplabel=0"
#        phase2="auth=MSCHAPV2"
#}
 
 
save:
 
-----
NETWORK restart:
Befehl:
sudo /etc/init.d/networking/ restart
-----
DHCP discover:
Befehl:
sudo ifdown wlan0 / eth0
sudo ifup wlan / eth0
-----
WLAN testen:
Befehl:
sudo wpa_supplicant -dd -Dwext -iwlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf 
-----
 
____________________________________________
 
Raspberry Pi Grundeinrichtung
 
Befehl:
sudo raspi-config
____________________________________________
 
Raspberry Pi Update & Upgrade
 
Befehl:
sudo apt-get update 
sudo apt-get upgrade
____________________________________________
 
Grafischen Shell Taskmanager "htop" installieren 
 
Befehl:
sudo apt-get install htop
 
ausführen:
htop
____________________________________________
 
Raspobot Projekt Ordner im /home/pi erstellen
 
Befehl:
mkdir Raspobot
cd Raspobot
mkdir librarys
mkdir testcoding
mkdir examples
mkdir downloads
mkdir temp
mkdir raspocode
cd raspocode
mkdir images
mkdir rasposound
____________________________________________
 
Entwicklungs Tools installieren.
 
Befehl:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
sudo apt-get install espeak
sudo apt-get install omxplayer
sudo apt-get install netcat
sudo apt-get install mplayer
sudo apt-get install i2c-tools
sudo apt-get install python-smbus
sudo apt-get install python-dev
sudo apt-get install python-serial
sudo apt-get install python-rpi.gpio
sudo apt-get install python-pip
sudo apt-get install samba
sudo apt-get install spe
sudo apt-get install git
sudo apt-get install git-core
sudo apt-get install build-essential
sudo apt-get install python-setuptools
sudo apt-get install psutil
sudo apt-get install unzip
sudo apt-get install lm-sensors
sudo apt-get install libi2c-dev
sudo apt-get install snmp
sudo apt-get install python-pygame
sudo apt-get install python-tk idle python-pmw python-imaging
sudo apt-get install dstat                  # dstat # dstat -c --top-cpu -d --top-bio --top-latency
sudo apt-get install iotop                  # sudo iotop
sudo apt-get install ifstat                 # ifstat
sudo pip install RPIO
sudo pip install pillow
 
-----
 
APT-GET anwendung erklärt:
 
Einlesen der Paketlisten aus Repositories:
Befehl:
apt-get update
 
Paket installieren:
Befehl:
apt-get install [paketname]
 
Paket deinstallieren (nur Programm):
Befehl:
apt-get remove [paketname]
 
Paket deinstallieren (komplettes Entfernen inklusive Konfigurationsdateien):
Befehl:
apt-get purge [paketname]
 
Pakete aktualisieren/updaten:
Befehl:
apt-get upgrade
 
Pakete zu Paketindex hinzufügen:
Befehl:
apt-cache add [dateiname.deb]
 
Anzeigen von Paketinformationen (übersichtlich):
Befehl:
apt-cache show [paketname]
 
Anzeigen von Paketinformationen (ausführlich):
Befehl:
apt-cache showpkg [paketname]
 
Anzeige von Abhängigkeiten des Paketes:
Befehl:
apt-cache depends [paketname]
 
Durchsucht Paketindex:
Befehl:
apt-cache search [suchbegriff]
 
Repositories oder auch dem darauf folgenden Paketindex gesprochen. 
Diese sind in der Datei /etc/apt/sources.list definiert.
Befehl:
sudo nano /etc/apt/sources.list
 
Schlüssel hinzufügen
Befehl:
apt-key add [schlüsseldatei]
 
Schlüssel entfernen
Befehl:
apt-key del [schlüssel id]
 
Auflistung aller registrierter Schlüssel mit ID und Name
Befehl:
apt-key list ID
-----
 
Paket-Cache löschen
Befehl:
sudo apt-get autoremove
sudo apt-get clean
Danach kann man veraltete Init-Skripte und Konfigurationsdateien der alten Pakete entfernen.
Befehl:
sudo dpkg -P `dpkg -l | grep "^rc" | awk -F" " '{ print $2 }'`
 
-----
 
Paketquellen anpassen und aktualisieren
Befehl:
sudo nano /etc/apt/sources.list
Edit:
deb http://mirrordirector.raspbian.org/raspbian/ jessie main contrib non-free rpi
Vor allen anderen Zeilen setzt man ein "#".
Dann löscht man alte Paketquellen im Verzeichnis "/etc/apt/sources.list.d/".
Befehl:
sudo rm -f /etc/apt/sources.list.d/*
Dann erzeugt man eine neue Datei:
Befehl:
sudo nano /etc/apt/sources.list.d/raspi.list
Hier trägt man folgende Zeile ein:
Edit:
deb http://archive.raspberrypi.org/debian jessie main ui
Nachdem man die Paketquellen geändert hat, muss die Liste der verfügbaren Pakete aktualisiert werden.
Befehl:
sudo apt-get update
-----
 
sudo pip install psutil
Check for correct installation. This command must not throw errors.
sudo python -c "import psutil"
-----
 
Locate installieren
Befehl:
sudo apt-get install locate
 
Datenbank updaten:
 
Befehl:
sudo updatedb
 
Locate anwenden:
locate -i *.Dateiendung oder Name.Dateiendung
-----
 
 
Pastebin installieren.
 
Befehl:
sudo apt-get install pastebinit
 
ausführen:
cat xxxxx.py|pastebinit -f python
-----
NetIO installieren
 
Befehl:
sudo apt-get install -y nmap
-----
____________________________________________
 
Configuration GPIO I2C / SPI
 
Befehl:
sudo nano /etc/modprobe.d/raspi-blacklist.conf
 
Edit:
#blacklist i2c-bcm2708
#blacklist spi-bcm2708
-----
Befehl:
sudo nano /etc/modules
 
Edit:
i2c-dev
i2c-bcm2708
-----
Befehl:
sudo nano /boot/config.txt
 
Edit:
dtparam=i2c1=on
dtparam=i2c_arm=on
dtparam=i2c_arm=on,i2c_baudrate=400000
-----
I2C Adressstatus abfragen
 
Befehl:
sudo i2cdetect -y 1
-----
SPI Devicesatus abfragen
 
Befehl:
ls -l /dev/spidev*
_____________________________________________
 
NTP aktuallisieren
 
Befehl:
sudo apt-get purge ntp
sudo apt-get install ntpdate
sudo crontab -e
2
Edit:
@reboot ntpdate -s 0.de.pool.ntp.org
1 1 * * * ntpdate -s 0.de.pool.ntp.org
-----
manuele Abfrage:
Befehl:
sudo ntpdate ptbtime1.ptb.de
Webseite:
http://www.netzmafia.de/skripten/hardware/RasPi/RasPi_Install.html
 
_____________________________________________
 
Librarys installieren
 
Raspirobotboard:
Befehl:
cd /Raspobot/librarys/
sudo git clone https://github.com/simonmonk/raspirobotboard.git
cd raspirobotboard
sudo python setup.py install --record install-files.txt
cd ..
Webseite:
https://github.com/simonmonk/raspirobotboard
-----
 
MCP23017:
Befehl:
cd /Raspobot/librarys/
sudo git clone https://github.com/computerlyrik/MCP23017-RPi-python.git
cd MCP23017-RPi-python
sudo python setup.py install --record install-files.txt
cd ..
Webseite:
https://github.com/computerlyrik/MCP23017-RPi-python
-----
 
HMC5883L:
 
-----
Adafruit Python MCP9808:
Befehl:
cd /Raspobot/librarys/
sudo git clone https://github.com/adafruit/Adafruit_Python_MCP9808.git
cd Adafruit_Python_MCP9808
sudo python setup.py install --record install-files.txt
cd ..
Webseite:
https://github.com/adafruit/Adafruit_Python_MCP9808
-----
 
Adafruit_SSD1306:
Befehl:
cd /Raspobot/librarys/
sudo git clone https://github.com/adafruit/Adafruit_SSD1306.git
Webseite:
https://github.com/adafruit/Adafruit_SSD1306
-----
 
SH1106:
Befehl:
cd /Raspobot/librarys/
sudo git clone https://github.com/rm-hull/ssd1306.git
cd ssd1306
sudo python setup.py install --record install-files.txt
cd ..
Webseite:
https://github.com/rm-hull/ssd1306
-----
 
Adafruit_Python_SSD1306
Befehl:
cd /Raspobot/librarys/
sudo git clone https://github.com/adafruit/Adafruit_Python_SSD1306.git
cd Adafruit_Python_SSD1306
sudo python setup.py install --record install-files.txt
cd ..
Webseite:
https://github.com/adafruit/Adafruit_Python_SSD1306
-----
 
ArduiPi_OLED:
Befehl:
cd /Raspobot/librarys/
sudo git clone https://github.com/hallard/ArduiPi_OLED.git
cd ArduiPi_OLED
sudo make
cd ..
Webseite:
https://github.com/hallard/ArduiPi_OLED
-----
 
ArduiPi_SSD1306:
Befehl:
cd /Raspobot/librarys/
sudo git clone https://github.com/hallard/ArduiPi_SSD1306.git
cd ArduiPi_OLED
sudo make
cd ..
Webseite:
https://github.com/hallard/ArduiPi_SSD1306
-----
 
37-Sensors-Code:
Befehl:
cd /Raspobot/librarys/
sudo git clone https://github.com/hackabletype/37-Sensors-Code.git
Webseite:
https://github.com/hackabletype/37-Sensors-Code
http://botbook.com/code.html
-----
 
Adafruit-Raspberry-Pi-Python-Code:
Befehl:
cd /Raspobot/librarys/
sudo git clone https://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code.git
cd Adafruit-Raspberry-Pi-Python-Code
Webseite:
https://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code
-----
 
PCA9685 16 Bit Servo Controller:
Library ist in der Adafruit-Raspberry-Pi-Python-Code Library enthalten.
Tutorial Webseite:
https://learn.adafruit.com/adafruit-16-channel-servo-driver-with-raspberry-pi/overview
-----
 
Adafruit Python GPIO:
Befehl:
cd /Raspobot/librarys/
sudo git clone https://github.com/adafruit/Adafruit_Python_GPIO.git
cd Adafruit_Python_GPIO
sudo python setup.py install --record install-files.txt
cd ..
Webseite:
https://github.com/adafruit/Adafruit_Python_GPIO
-----
 
TSL2591 Licht & IR Sensor:
Befehl:
cd /Raspobot/librarys/
sudo git clone https://github.com/maxlklaxl/python-tsl2591.git
cd python-tsl2591
sudo apt-get install libffi5 libffi5-dbg libffi5-dev
sudo python setup.py install --record install-files.txt
cd ..
Webseite:
https://github.com/watterott/TSL25911-Breakout
-----
 
MCP9808-device:
Befehl:
cd /Raspobot/librarys/
sudo git clone https://github.com/robotice-devices/mcp9808-device.git
Webseite:
https://github.com/robotice-devices/mcp9808-device
-----
 
WiringPi 2 Python
Befehl:
sudo apt-get install wiringpi
cd /Raspobot/librarys/
sudo git clone https://github.com/WiringPi/WiringPi2-Python.git
cd WiringPi2-Python
sudo python setup.py install --record install-files.txt
sudo git clone git://git.drogon.net/wiringPi
cd wiringPi
sudo git pull origin
sudo ./build
Webseite:
https://github.com/WiringPi/WiringPi2-Python
 
GPIO Status Check Test wiringPi’s installation
Befehl
gpio -v
gpio readall
-----
 
Pillow:
Befehl:
cd /Raspobot/librarys/
sudo git clone https://github.com/python-pillow/Pillow.git
cd Pillow
sudo apt-get install libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.5-dev tk8.5-dev python-tk
sudo apt-get install libjpeg-dev libpng12-dev libtiff-dev
sudo make
sudo python setup.py install --record install-files.txt
Webseite:
https://github.com/python-pillow/Pillow
https://pillow.readthedocs.org/en/3.1.x/installation.html
http://stackoverflow.com/questions/8915296/python-image-library-fails-with-message-decoder-jpeg-not-available-pil
 
-----
 
Oled_96:
Befehl:
cd /Raspobot/librarys/
sudo git clone https://github.com/BLavery/lib_oled96
Webseite:
https://github.com/BLavery/lib_oled96
-----
 
PIGPIO Libary installieren
Befehl:
cd /Raspobot/librarys/
wget abyz.co.uk/rpi/pigpio/pigpio.zip
unzip pigpio.zip
cd PIGPIO
sudo make
sudo make install
sudo pigpiod
git clone https://github.com/joan2937/pigpio
cd pigpio
sudo make
sudo make install
sudo python setup.py install --record install-files.txt
cd ..
-----
 
_____________________________________________________
 
Project Thermostat (MCP9808) Installation
 
Befehl:
cd /Raspobot/examples/
sudo git clone http://github.com/baldingwizard/thermostatpi
_____________________________________________________
 
GPU Temperatur ausgeben
Befehl:
/opt/vc/bin/vcgencmd measure_temp
 
Mailversand wenn CPU Temperatur kirtischen Wert übersteigt.
Webseite mit Tutorial:
http://jankarres.de/2013/12/raspberry-pi-ueberwachen-mit-monitoring/
Befehl für das regelmäßige wiederholen.
Befehl:
crontab -e
Edit:
*/5 * * * * python /home/pi/Raspobot/raspocode/monitoring-cpu-temp.py >/dev/null 2>&1
______________________________________________________
 
Bootvorgang Log ausgeben
Befehl:
dmesg | more
______________________________________________________
 
Soundmixer Lautstärke einstellen
Befehl: #Maximum
amixer cset numid=1 -- 400
Befehl: #Minimum
amixer cset numid=1 -- -10239
Webseite:
http://www.dronkert.net/rpi/vol.html
______________________________________________________
 
RPI Camera installieren und einrichten
Befehl:
cd /Raspobot/librarys/
sudo git clone https://github.com/silvanmelchior/RPi_Cam_Web_Interface.git
cd RPi_Cam_Web_Interface
sudo chmod u+x RPi_Cam_Web_Interface_Installer.sh                #alt
sudo ./RPi_Cam_Web_Interface_Installer.sh install                #alt
Configuration:                                                   #alt
sudo ./RPi_Cam_Web_Interface_Installer.sh install                #alt
-----
sudo chmod u+x install.sh
sudo ./install.sh install
Webseite:
http://192.168.2.42/html/index.php
http://elinux.org/RPi-Cam-Web-Interface
https://www.raspberrypi.org/forums/viewtopic.php?f=43&t=63276
http://raspberrypiguide.de/howtos/raspberry-pi-camera-how-to/
https://github.com/silvanmelchior/RPi_Cam_Web_Interface
________________________________________________________
 
Python Datei ausführbar machen.
Befehl:
chmod u+x test.py
Starten:
sudo ./test.py
________________________________________________________
 
Python Paket Library deinstallieren:
Befehl:
cd /Raspobot/librarys// #in die jeweilige Library mit "setup.py"
cat install-files.txt | sudo xargs rm -rf
Webseite:
http://codeyarns.com/2014/05/30/how-to-install-and-uninstall-python-module-from-source-code/
________________________________________________________________
 
im Ordner /Raspobot/raspocode die Dateien ausführbar machen.
Befehl:
sudo chmod +x tts_date_de1.sh
sudo chmod +x tts_time_de1.sh
sudo gcc -Ofast -mfpu=vfp -mfloat-abi=hard -march=armv6zk -mtune=arm1176jzf-s -Wall  -lssd1306 -lm uhr1.cpp -o uhr1
Datei ausführen:
sudo ./tts_date_de1.sh
________________________________________________________________
 
RAMDISK erstellen
 
tmpfs für /var/log einrichten
 
Befehl:
sudo nano /etc/init.d/varlog
Edit:
#!/bin/bash
### BEGIN INIT INFO
# Provides:          varlog
# Required-Start:    $local_fs
# Required-Stop:     $local_fs
# X-Start-Before:    $syslog
# X-Stop-After:      $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start/stop logfile saving
### END INIT INFO
#
# varlog        This init.d script is used to start logfile saving and restore.
#
 
varlogSave=/var/save.log/
[ ! -d $varlogSave ] && mkdir -p $varlogSave
 
PATH=/sbin:/usr/sbin:/bin:/usr/bin
 
case $1 in
    start)
        echo "*** Starting tmpfs file restore: varlog."
        if [ -z "$(grep /var/log /proc/mounts)" ]; then
            echo "*** mounting /var/log"
            cp -Rpu /var/log/* $varlogSave
            varlogsize=$(grep /var/log /etc/fstab|awk {'print $4'}|cut -d"=" -f2)
            [ -z "$varlogsize" ] && varlogsize="70M"
            mount -t tmpfs tmpfs /var/log -o defaults,size=$varlogsize
            chmod 755 /var/log
        fi
        cp -Rpu ${varlogSave}* /var/log/
    ;;
    stop)
        echo "*** Stopping tmpfs file saving: varlog."
        #[ -n $varlogSave ] && rm -rf ${varlogSave}*
        #[ ! -d $varlogSave ] && mkdir -p $varlogSave
        cp -Rpu /var/log/* $varlogSave >/dev/null 2>&1
        sync
        umount -f /var/log/
    ;;
    *)
        echo "Usage: $0 {start|stop}"
    ;;
esac
 
exit 0
 
-----
 
Befehl:
sudo chmod +x /etc/init.d/varlog
sudo update-rc.d varlog start 01 2 3 4 5 . stop 99 0 1 6 .
sudo /etc/init.d/varlog start
sudo /etc/init.d/varlog stop
Befehl:
sudo nano /etc/fstab
Edit:
tmpfs        /var/log    tmpfs    size=70M    0    0
Befehl:
sudo sed -i /etc/default/rcS -e "s/RAMRUN=no/RAMRUN=yes/"
sudo sed -i /etc/default/rcS -e "s/RAMLOCK=no/RAMLOCK=yes/"
 
Befehl:
sudo crontab -e
2
Edit:
#varlog - alle 25 minuten
*/25 * * * * /etc/init.d/varlog stop && sleep 2 && /etc/init.d/varlog start >/dev/null 2>&1
#varlog - Taeglich um 05:00
0 5 * * * /etc/init.d/varlog stop && sleep 2 && /etc/init.d/varlog start >/dev/null 2>&1
 
Befehl:
sudo reboot
Webseite:
http://www.forum-raspberrypi.de/Thread-tutorial-var-log-in-eine-art-ramdisk-auslagern-weitere-optimierungen-bezgl-logs
_______________________________________________________________________________
 
Bash Design Anpassung SSH Login
 
Befehl:
sudo nano /etc/motd
Edit: 
nur reinen Text Formatierung einsetzen!
z.B. ein ASCII Generator: http://www.glassgiant.com/ascii/
-----
 
Befehl:
sudo nano /etc/bash.bashrc
Edit:
ip=`ip addr show scope global | grep inet | cut -d' ' -f6 | cut -d/ -f1`
let upSeconds="$(/usr/bin/cut -d. -f1 /proc/uptime)"
let secs=$((${upSeconds}%60))
let mins=$((${upSeconds}/60%60))
let hours=$((${upSeconds}/3600%24))
let days=$((${upSeconds}/86400))
UPTIME=`printf "%d days, %02dh%02dm%02ds" "$days" "$hours" "$mins" "$secs"`
# get the load averages
read one five fifteen rest < /proc/loadavg
echo -e "\n";
echo -e "\n";
echo -e "\n";
echo -e "                            =\$MMMMMMM       NMMMMMM\$I$=                         "
echo -e "                          MMM\033[1;32m7O\$\$777\033[0mM\$MM   MMZ\033[1;32m\$7\$7\$Z7O\033[0mMMM     "
echo -e "                          MN\033[1;32m\$\$Z\$\$\$\$\$\$\$\033[0mM7M,M\033[1;32m\$\$\$\$\$\$\$\$Z\$\$\033[0mMNM     "
echo -e "                          MM\033[1;32m\$\$\$\$\$M7\$\$\$\$\033[0mMDMM\$\033[1;32m\$7\$7N87\$\$\033[0mM\$MM      "
echo -e "                           MN\033[1;32m\$\$\$\$\$7MZ\$\$\033[0mM8MN\$\033[1;32m\$7M7\$\$\$\$\$\033[0mM\$M      "
echo -e "                           NM\033[1;32m\$\$\$\$\$\$\$\$\033[0mMMMMMMMM\033[1;32m\$\$\$\$\$\$7\033[0mM7ON       "
echo -e "                             M7\033[1;32m\$\$\$\$\$\$\033[0mMMMMMMMM\033[1;32m\$\$\$\$\$\$\033[0mM7MN        "
echo -e "                              MMM77DMMMMMMMMMN77MMM                "
echo -e "                              NMMDDMMN\033[1;31mZZZZZ\033[0mMMMNMMMM     "
echo -e "                             M\033[1;31mZZZZ\033[0mDM8\033[1;31m\033[1;31mZZZZZZZZ\033[0mM\033[1;31mZZZZ\033[0mNMD    "
echo -e "                            MO\033[1;31mZZZ\033[0mMMMMO\033[1;31m\033[1;31mZZZZZZ\033[0mNMMO\033[1;31mZZZ\033[0mMM    "
echo -e "                           ?M\033[1;31mZZ\033[0mNMMMNNMMMMMMM8ONMM\033[1;31mZZ\033[0m8MI      "
echo -e "                           MMMMMD\033[1;31mZZZZZZ\033[0mMMM\033[1;31mZZZZZZZ\033[0mMMMMM    "
echo -e "                          MNZMMO\033[1;31mZZZZZZZ\033[0mNMD\033[1;31mZZZZZZZZ\033[0mM8ZMM            "
echo -e "                         MD\033[1;31mZZ\033[0mNM\033[1;31mZZZZZZZZ\033[0mDMD\033[1;31mZZZZZZZZ\033[0mM\033[1;31mZZZ\033[0mMM   "
echo -e "                         M\033[1;31mZZZ\033[0mNM\033[1;31mZZZZZZZZ\033[0mMMM\033[1;31mZZZZZZZZ\033[0mM\033[1;31mZZZZ\033[0mMZ   "
echo -e "                         M\033[1;31mZZZ\033[0mMM\033[1;31mZZZZZZZ\033[0mNMMMM\033[1;31mZZZZZZZ\033[0mM8\033[1;31mZZZ\033[0mMM  "
echo -e "                         M\033[1;31mZZZ\033[0mMMMD\033[1;31mZZZZ\033[0mMM8OOMMN\033[1;31mZZZ\033[0mDMMMZZ\033[0mDM+    "
echo -e "                         OMZMMMMMMMMM\033[1;31mZZZZZZZ\033[0mNMMMMMMMMOMO                        "
echo -e "                          MMN\033[1;31mZZZ\033[0mDMMM\033[1;31mZZZZZZZZZ\033[0mMMM\033[1;31mZZZZ\033[0mOMM       "
echo -e "                          ,M8\033[1;31mZZZZZ\033[0mMM\033[1;31mZZZZZZZZZ\033[0mMM\033[1;31mZZZZZZ\033[0mM,  "
echo -e "                           MN\033[1;31mZZZZZ\033[0m8MD\033[1;31mZZZZZZZZ\033[0mM\033[1;31mZZZZZZZ\033[0mM   "
echo -e "                           OM\033[1;31mZZZZZZ\033[0mMMO\033[1;31mZZZZZ\033[0mOMM\033[1;31mZZZZZZ\033[0mMO    "
echo -e "                             M8\033[1;31mZZZZ\033[0mMMMMMMMMMMM\033[1;31mZZZZ\033[0m8M8   "
echo -e "                              MMMMMMMNO\033[1;31mZZZZ\033[0mDMMMNMMM               "
echo -e "                                IMMM\033[1;31mZZZZZZZZZ\033[0mMMMM                "
echo -e "                                   OMN\033[1;31mZZZZZ\033[0mNMO                  "
echo -e "                                     ZMMMMMO                                     ";
echo -e "\n";
echo -e "\033[1;31m          _,met\$\$\$\$\$gg.";
echo -e "       ,g\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$P.";
echo -e "     ,g\$\$P\"\"       \"\"\"Y\$\$.\".";
echo -e "    ,\$\$P'              \`\$\$\$.";
echo -e "  ',\$\$P       ,ggs.     \`\$\$b:";
echo -e "  \`d\$\$'     ,\$P\"'   .    \$\$\$";
echo -e "   \$\$P      d\$'     ,    \$\$P";
echo -e "   \$\$:      \$\$.   -    ,d\$\$'      ";
echo -e "   \$\$;      Y\$b._   _,d\$P'   \033[1;35m     _,           _,      ,'\`.";
echo -e "\033[1;31m   Y\$\$.    \`.\`\"Y\$\$\$\$P\"'\033[1;35m         \`\$\$'         \`\$\$'     \`.  ,'";
echo -e "\033[1;31m   \`\$\$b      \"-.__           \033[1;35m    \$\$           \$\$        \`'";
echo -e "\033[1;31m    \`Y\$\$b                     \033[1;35m   \$\$           \$\$         _,           _";
echo -e "\033[1;31m     \`Y\$\$.                \033[1;35m ,d\$\$\$g\$\$  ,d\$\$\$b.  \$\$,d\$\$\$b.\`\$\$' g\$\$\$\$\$b.\`\$\$,d\$\$b.";
echo -e "\033[1;31m       \`\$\$b.          \033[1;35m    ,\$P'  \`\$\$ ,\$P' \`Y\$. \$\$\$'  \`\$\$ \$\$  \"'   \`\$\$ \$\$\$' \`\$\$";
echo -e "\033[1;31m         \`Y\$\$b.      \033[1;35m     \$\$'    \$\$ \$\$'   \`\$\$ \$\$'    \$\$ \$\$  ,ggggg\$\$ \$\$'   \$\$";
echo -e "\033[1;31m           \`\"Y\$b._     \033[1;35m   \$\$     \$\$ \$\$ggggg\$\$ \$\$     \$\$ \$\$ ,\$P\"   \$\$ \$\$    \$\$";
echo -e "\033[1;31m               \`\"\"\"\"    \033[1;35m  \$\$    ,\$\$ \$\$.       \$\$    ,\$P \$\$ \$\$'   ,\$\$ \$\$    \$\$";
echo -e "\033[1;35m                          \`\$g. ,\$\$\$ \`\$\$._ _., \$\$ _,g\$P' \$\$ \`\$b. ,\$\$\$ \$\$    \$\$";
echo -e "\033[1;35m                           \`Y\$\$P'\$\$. \`Y\$\$\$\$P',\$\$\$\$P\"'  ,\$\$. \`Y\$\$P'\$\$.\$\$.  ,\$\$.";
echo -e "\n";
echo -e "\033[1;33m                        Willkommen bei Raspobot \033[0m";
echo -e "\n";
echo -e "\033[1;34m==============================================================================================="
echo -e "\033[1;33m Debian Verson:      \033[1;31m" `cat /etc/debian_version`
echo -e "\033[1;33m Kernel Version:     \033[1;31m" `uname -srmo`
echo -e "\033[1;33m Rasp-Build-Datum    \033[1;31m" `more /boot/issue.txt | grep '20' | awk '{print $4}'`
echo -e "\033[1;34m==============================================================================================="
echo -e "\033[1;33m Datum:              \033[1;31m" `date +"%A, %e %B %Y, %r"`
echo -e "\033[1;33m Systemzeit:         \033[1;31m" `date | awk '{print $4}'`
echo -e "\033[1;33m Online seit:        \033[1;31m" ${UPTIME}
echo -e "\033[1;34m==============================================================================================="
echo -e "\033[1;33m Free Disk Space SDC:\033[1;31m"  `df -Pk | grep -E '^/dev/root' | awk '{ print $4 }' | awk -F '.' '{ print $1 }'` KB on /dev/root
echo -e "\033[1;33m Disk Usage:         \033[1;31m" `du -sh /home/pi`
echo -e "\033[1;33m Speichernutzung:    \033[1;31m" `cat /proc/meminfo|grep 'MemF'| awk '{print $2/1000}'` "MB (Frei) von" `cat /proc/meminfo|grep 'MemT'| awk '{print $2/1000}'` "MB (Total)"
echo -e "\033[1;33m Load Averages:      \033[1;31m" ${one}, ${five}, ${fifteen} 1, 5, 15 min
echo -e "\033[1;33m Running Processes:  \033[1;31m"  `ps ax | wc -l | tr -d " "`
echo -e "\033[1;33m CPU-Freq:           \033[1;31m"  `sudo cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq | awk '{print $1/1000}'` "Mhz"
echo -e "\033[1;33m CPU-Temp:           \033[1;31m"  `cat /sys/class/thermal/thermal_zone0/temp | awk '{printf("%.1f\n", $1/1000)}'` "°C"
echo -e "\033[1;33m IP Adresse:         \033[1;31m"  $ip `/sbin/ifconfig eth0 | /bin/grep "inet addr" | /usr/bin/cut -d ":" -f 2 | /usr/bin/cut -d " " -f 1` and WAN `wget -q -O - http://icanhazip.com/ | tail`
echo -e "\033[1;33m Weather:            \033[1;31m"  `curl -s "http://rss.accuweather.com/rss/liveweather_rss.asp?metric=1&locCode=EUR|DE|NRW|GREFRATH" | sed -n '/Currently:/ s/.*: \(.*\): \([0-9]*\)\([CF]\).*/\2°\3, \1/p'`
echo -e "\033[1;34m==============================================================================================="
echo -e "\033[1;32mUser     Anschluß     Seit             von"
/usr/bin/who
echo -e "\033[1;34m==============================================================================================="
echo -e "\n";
 
 
-----
 
Webseite:
http://www.forum-raspberrypi.de/Thread-tutorial-ssh-terminal-begruessung
https://www.raspberrypi.org/forums/viewtopic.php?t=23440
https://www.raspberrypi.org/forums/viewtopic.php?f=91&t=23440
___________________________________________________________________________________________________________


Bisherige eingesetzte Hardwarekomponenten


Chassi:

Acrylglass 5 mm
1x 2WD Robot Car Chassis 2 Motors Dagu Magician Robotics Platform
2x GM Series Plastic Wheels
2x Furniture Castors
1x Casterwheel
5x 830 Breadboard
1x 400 Breadboard
1x Batteriehalter Batterieclip Anschlussclip für 9V

Aktoren:

1x Dagu Sensor Pan/Tilt Kit mit Servomotoren
1x 180° TowerPro MG995 Metal Gear Digital Servo Hi Torque HPI Savage XL FUTABA 55g
2x Gear Motor 3 - 224:1 90 Degree Shaft
2x 5 mW Lasermodule HLM1230 Linie, 650nm Red Laser Line Diode

Platinen:

1x Raspberry Pi 3 B + Raspicam
1x Arduino Nano V3
1x RaspiRobot Board
1x Levelshifter 1x SSD1306 128x64 OLED Display
1x 16-Channel 12-bit PWM/Servo Driver-I2C interface-PCA9685 for Arduino
1x 2/ Channel Kanal 5V Relais Relay Module Modul f Arduino DSP AVR PIC ARM C8
1x LM386 Super MINI Amplifier Board 3V-12V Power Amplifier DE
2x MCP23017-E/SP 16 I/O Expander mit/ohne DIP28 I2C
1x Raspberry PI GPIO adapter connvetor module for breadboard RP02005 C31
1x T-Cobbler GPIO Breakout Kit für Raspberry Pi inkl. Breadboard / Steckboard
1x WLan Stick Edimax EW-7811UN

Sensoren:

6x Sensor HC-SR04
1x MCP9808 Temperatursensor
1x TSL2591 Licht / IR Sensor
1x GY-521 Gyrosensor
1x HMC5883L Magnetkompass

Sensorkarte Ultraschall
Hc-sr04.jpg
Name HC-SR04 Ultraschall Messmodul
Betriebs Spannung VCC +5V +-10%, GND 0V
Betriebs Strom 15mA
Betriebs Frequenz 40Khz
Trigger Eingangs Signal 10us TTL pulse
Echo Ausgangs Signal Ausgabe TTL Level Signal, proportional mit Reichweite
messbare Distanz 2cm - ca. 400cm
Messintervall 0,3cm
Messungen pro Sekunde maximal 50
Abmessungen (l, b, t) mm 45 x 21 x 18
Datenblatt HC-SR04
HC-SR04
Pinbelegung
Pin 1 VCC, Versorgungsspannung 5V
Pin 2 Triggereingang, TTL-Pegel
Pin 3 Echo, Ausgang Messergebnis, TTL-Pegel
Pin 4 GND, 0V
Pin 5
Pin 6



Stromversorgung:

1x 3.3V/ 5V Netzteil-Adapter Supply Power Module Adapter für Modul MB102 Breadboard
1x 5V 5600mAh Anker® Astro USB Externer Akku Pack Power Bank Ladegerät mit LED
1x 7,4V 5000 mAh Lipoakku
1x 9V 200 mAh Blockakku (only for the LM386 Board and one phone Optipiont 410 speaker)
1x 5-15V (7,5V) 3000mA Goobay NTS 3000 Universal Netzteil Ladegerät einstellbar 8 Adapter (for developing)


Viele Kabel, Wiederstände, Schalter, Taster, Distanzbolzen, Winkel und eine kleine Menge an unterschiedlichen LED´s

Ein Samsung Tablet dient mit der Software NetIO App [27] zur remote Steuerung.

Eingesetzte Software:

OS: Raspbian Jessie Lite (Debian 8)
Programmiersprache:
Python 2.7
Arduino C
Java


to be continued.........