Einführung Raspberry Pi

Die Grundlagen für euch!

Kursinhalt

INHALT
EINFÜHRUNG RPi
COMPUTERBASICS
HARDWARE
BETRIEBSYSTEM
AUTOSTART
NETZWERK
LED
TASTER
LCD-DISPLAY
WETTERBERICHT
ULTRASCHALL

Kurze Einführung.
Wikipedia

Eigenes Projekt vorstellen.

Kurze allgemeine Einführung in die elektronische Datenverarbeitung
EVA = Eingabe - Verarbeitung - Ausgabe       --> Wikipedia

HARDWARE
Unterschiede in den Versionen, Anschlüsse
- Wikipedia

BETRIEBSYSTEM

Wie installiere ich das Betriebssystem Jessie ohne Monitor und Tastatur!

1. Wheezy herunterladen.
    https://www.raspberrypi.org/downloads/raspbian/
    Achtet bitte darauf, dass Ihr genügend Speicherplatz auf dem Rechner habt!
    (ungefähr 5,5GB freier Speicher wird benötigt.)

2. Image mit Win32imager auf eine SD-Karte kopieren.
    Download u. a. von https://sourceforge.net/projects/win32diskimager/
    Achtet bitte darauf, den richtigen Laufwerksbuchstaben anzugeben.

3. Am Raspberry das LAN-Kabel (kein WLAN) anschließen und einschalten.

4. IP des RPi ausfindig machen.
    Android: "Network scanner" oder "RaspiCAM"   (google play store).
    In der APP: suchen nach MAC: b8:27:eb:...
    Achtung:  Smartphone und RPi müssen zu Hause im selben Netzwerk sein.
    ALTERNATIVE:    Windowsrechner mit folgenden Tool
        http://www.advanced-ip-scanner.com/de/
        Ist kostenlos und muss auch nicht installiert werden.

5. PuTTY aufrufen und am RPi anmelden.
    Download unter http://www.putty.org/
    Gefundene IP eingeben (Port 22) und anmelden mit:
    Benutzer:    pi
    Passwort:    raspberry

Ab jetzt kannst Du schon richtig mit dem RPi arbeiten. Zwar "nur" mit der Shell, ist aber so vollwertig, als wenn man direkt am RPi damit arbeitet.
Vergiss nicht mit "sudo raspi-config" zuerst den RPi einzustellen.

Wenn Du lieber mit der grafischen Oberfläche arbeiten möchtest...

6. Remotedesktopverbindung installieren
    sudo apt-get install xrdp

7. Remotedesktopverbindung von einem Windows-PC aufrufen
    Raspberry konfigurieren (unter Menü --> ....)

8. Gegenfalls von der SD-Karte mit Win32imager ein Image erstellen.

NETZWERK

- Was ist eine IP-Adresse?
- Wie funktioniert eine Verbindung zwischen Computer?

Der Startvorgang
Was passiert da eigentlich?
- Die LED's

GRAFISCHE OBERFLÄCHE

Dateimanager:
Versteckte Dateien anzeigen (Strg+h)

AUTOSTART

Es gibt mehere Verfahren!
sudo nano /etc/rc.local
    /home/pi/autorun.sh &    (&=Hintergrundprozess)

sudo nano autorun.sh
    #!/bin/bash     --> es folgen Kommandozeilenbefehle
    cd /home/pi
    sleep 5
    python /home/pi/SNH.py

Gestartetes Programm wieder stoppen:
Konsole:  
    pstree -p
        Python suchen und Nummer merken
    sudo kill 555     (555=Nummer des Prozesses)

Links zum Thema:
https://raspberry.tips/raspberrypi-einsteiger/raspberry-pi-autostart-von-skripten-und-programmen-einrichten/
https://developer-blog.net/raspberry-pi-autostart-von-programmen/

Handhabung unter Linux
Installation:  sudo apt-get install .....
Shell-Kommandos:
ls          list                        --> Inhalt des aktuellen Ordners auflisten
cd         change directory    --> Ordner wechseln
mkdir    make directory      --> Ordner erstellen
cp         copy                      --> Datei kopieren
pwd      print working directory    --> Aktueller Ordner anzeigen

Zu den meisten Befehlen kannst Du Dir eine Hilfestellung anzeigen lassen, z.B.:
cp --h            oder       man cp

Programmieren mit Scratch
Einführung und Beispiel

 

Programmieren mit Python
Einführung und Beispiele

Wichtige Hinweise:
Die Einrückung ist wichtig.

Beispielprojekt ZAHLENRATEN
+++++ Beispielprojekt "ZAHLENRATEN" +++++

# Zusätzliche Softwarepakete werden zur Verwendung in Python geladen.
import random  

Bereich=input("Bis zur welchen Zahl möchtest Du raten? ")  # Erweiterung
zahl=random.randrange(Bereich); tipp=0; i=0

while tipp != zahl:
    tipp=input("Dein Tipp:")
    if zahl < tipp:
        print "Die gesuchte Zahl ist kleiner als ", tipp
    if zahl > tipp:
        print "Die gesuchte Zahl ist größer als ",tipp
    i +=1
print "Du hast die Zahl beim ", i, ". Tipp erraten"
+++ Ende +++

Beispielprojekt LED ansteuern
Zunächst in der Shell zusätzliche Softwarepakete in das Betriebssystem (Wheezy oder Jessie) installieren:
sudo apt-get install python-dev
sudo apt-get install python-rpi.gpio

Dann unter Python:
+++++ Beispielprojekt "LED" +++++
import RPi.GPIO as GPIO
import time
LED=input("LED: ")
GPIO.setmode(GPIO.BCM)             # BCM = Art der Nummerierung der Ports
GPIO.setup(LED, GPIO.OUT)          # Initialisieren als IN oder OUT
GPIO.output(LED,1)
time.sleep(3)
GPIO.output(LED,0)
GPIO.cleanup()                     # Alle Ports wieder zurücksetzen (aufräumen)
+++ Ende +++

Es kann sein das Dir Berechtigungen fehlen um das Programm auszuführen.
In diesem Fall musst Du Python mit "sudo" starten.
Einfacher ist es wenn Du Dir eine neue Verknüpfung auf den Desktop erstellst:
--> RPi wurde gestartet, und Du hast mit "startx" die grafische Oberfläche aufgerufen.

1.Schritt:  Verknüpfung erstellen
--> mit der linken Maustaste "Menü" anklicken
--> mit der rechten Maustaste "Python 2" anklicken.
--> mit der linken Maustaste "auf dem Desktop kopieren" anklicken.

2.Schritt: Verknüpfung bearbeiten
--> Shell aufrufen
--> Eingabe "ls" --> Du siehst den Inhalt des Ordners "home/Pi"
--> In den Ordner "Desktop" wechseln mit "cd Desktop" (achte bitte auf die genaue Schreibweise!!!)
--> Eingabe "ls" -->  Du siehst den Inhalt des Ordners "Desktop"
--> Dort sollte jetzt Deine neu erstellte Verknüpfung "idle.desktop" liegen
Zum bearbeiten der Verknüpfung rufen wir nun einen Editor auf
--> Shell-Eingabe :  "sudo nano idle.desktop"
--> gehe mit den Pfeiltasten (nicht mit der Maus) in die Zeile "Exec=..."
--> hinter "Exec=" schreibst Du bitte ein "sudo "
Das Ganze soll dann so aussehen:
        "Exec=sudo /usr/bin/idle"
Jetzt müssen wir das Ganz noch abspeichern und beenden:
--> Drücke "Strg-o" und dann "Enter" zum speichern.
--> Drücke "Strg-x" zum beenden
Das war es. Immer wenn Du jetzt auf die Verknüpfung "Python 2" auf dem Desktop klickst, startest Du Python mit allen notwendigen Berechtigungen.
--> testen

Zwei Programme miteinander verknüpfen.
Da Programm Zahlenraten haben wir bereits geschrieben, nun wollen wir noch eine LED anschließen, die nach der erratene Zahl leuchten soll.
Das letzte Beispielprojekt mit der "LED" haben wir "zufällig" im Internet gefunden, und wollen nun den Programmcode für unser "Zahlenraten" verwenden:

+++++ Beispielprojekt "ZAHLENRATEN_LED" +++++
# Hier werden zusätzliche Softwaremodule geladen
import random  
import RPi.GPIO as GPIO
import time

# Hier wird die Hardware vorbereitet
GPIO.setmode(GPIO.BCM)             # BCM = Art der Nummerierung der Ports
GPIO.setup(27, GPIO.OUT)          # Port 27 initialisieren als IN oder OUT

# Hier fängt das eigentliche Spiel an
Bereich=input("Bis zur welchen Zahl möchtest Du raten? ")
zahl=random.randrange(Bereich); tipp=0; i=0
while tipp != zahl:
    tipp=input("Dein Tipp:")
    if zahl < tipp:
        print "Die gesuchte Zahl ist kleiner als ", tipp
    if zahl > tipp:
        print "Die gesuchte Zahl ist größer als ",tipp
    i +=1
print "Du hast die Zahl beim ", i, ". Tipp erraten"
# Hier wird jetzt bei erratener Zahl auch noch eine LED angesteuert
GPIO.output(27,1)            # LED einschalten
time.sleep(5)                   # Wartezeit von 5s)
GPIO.output(27,0)            # LED ausschalten

# Am Ende des Programms
GPIO.cleanup()                 # Alle Ports wieder zurücksetzen (aufräumen)
+++ Ende +++

LED anschließen:


Du kannst nun am gewünschten Port eine LED mit einem 220Ohm-Vorwiderstand anschließen.
Ein gute Übersicht über die PIN's findest Du hier:
RaspberryPi_GPIO_PIN_B_B+   
(ACHTUNG: Du verläßt damit die Kursseite!! Keine Gewähr.)

Wenn Du Dir noch unsicher bist, solltest Du Dir von einem "Erfahrenen" helfen lassen. Sonst werden wir Dir beim nächsten Kurstermin weiterhelfen.

Weiteres Experiment:
Du kannst auch eine LED leuchten lassen, wenn der Tipp zu groß war. (...und eine wenn zu klein).

+++++ Zahlenraten von 02.04.2016 +++++
import random
import RPi.GPIO as GIPO
import time

wz = "w"

while wz == "w":

    Bereich = input("Bis zur welcher Zahl mchtest du raten? ")

    zahl=random.randrange(Bereich); tipp=0; i=0
    while tipp != zahl:
        tipp=input("Dein Tipp:")

        if tipp > Bereich:
        print "Die Zahl ist außerhalb des Bereiches", Bereich

        if zahl < tipp and tipp < Bereich:
        print "Die gesuchte Zahl ist kleiner als ", tipp

        if zahl > tipp and tipp < Bereich:
        print "Die gesuchte Zahl ist größer als ", tipp

        i +=1
    print "Du hast die Zahl beim ", i, ". Tipp erraten"

    wz = raw_input("noch eine Runde? (w=weiter) ")

print "Das Programm wurde beendet"
+++++++++++++++++++++
siehe auch http://www.python-kurs.eu

Taster anschliessen


Wähle für den Widerstand einen recht hohen Wert von 22kOhm.

SCRATCH am 09.04.2016

Zahlenraten

Samstag den 16.04.2016

PROJEKTARBEIT
Projekt: Raspberry fernsteuern
Wir wollten uns mal an ein echtes Projekt wagen und haben uns dazu eine Projektbeschreibung unter Youtube angeschaut:
    https://www.youtube.com/watch?v=3QcLq5SxxgI

Ziel ist es, eine Lampe oder LED über ein Smartphone (vom Papa) zu steuern!

Wir haben die Anweisungen nachgebaut, jedoch ein Problem bekommen, da der Befehl zum Ansteuern des Port (GPIO) nicht funktioniert.

Wir versuche alle ein Lösungsansatz zu finden...

Samstag den 30.04.2016

I2C-Bus
im Vergleich zum IP-Netzwerk. Anwendung von I2C-Tools. Ansteuerung eines Servos.
GRUNDINSTALLATION
sudo apt-get install i2c-tools           # Werkzeug um den I2C-Bus zu verwenden.
sudo apt-get install python-smbus   # Werkzeug um unter Python I2C zu verwenden

INSTALLATION Treiber für die Servosteuerplatine von Adafruit:  PCA9685    
SHOP: https://www.adafruit.com/?q=PCA9685%20%20%20%20%20&   (ca 15€)
--> Gibt es aber auch bei deutschen Händlern.
Konfigurationsanleitung: https://learn.adafruit.com/adafruit-16-channel-servo-driver-with-raspberry-pi/configuring-your-pi-for-i2c

 sudo apt-get install git build-essential python-dev
 cd ~
 git clone https://github.com/adafruit/Adafruit_Python_PCA9685.git
 cd Adafruit_Python_PCA9685
 sudo python setup.py install

Beispielprogramm nach der Installation unter:
  /home/pi/Adafruit_Python_PCA9685/examples    -->  simpletest.py

Fernsteuerung
Wir haben dieses Video im Internet gefunden:  Lampe oder LED über ein Smartphone ansteuern.
    https://www.youtube.com/watch?v=3QcLq5SxxgI
Leider funktioniert diese Anleitung nicht: Ursache sind meistens eine andere Versionen des Betriebssystems oder Zusatztools.
KORRIGERTE KURZANLEITUNG:
Zunächst einen Pythoncode erstellen und testen, den man über ein Smartphone starten möchte. Das kann zum Beispiel das LED-Programm sein.
Der Pythoncode muss dazu vom Betriebssystem (OS) selber direkt starten können, sonst gehts so nicht.
Dazu folgende Zeilen im Pythoncode voranstellen:
  #!/usr/bin/python           <-- Um dem OS zu sagen: Das ist Python
  # -*- coding: utf-8 -*-       <-- Um den Pythoncode kompatibel mit dem OS zu machen.
  ....                                 <-- euer Pythoncode

Das Ganze sollte jetzt in einer Datei stehen, zum Beipiel:   FernLED.py

Nun muss das OS noch wissen, dass man diese Datei auch "Ausführbar" ist. Das heißt, da ist ein Programm drin.   Also:
 chmod -x FernLED.py   <-- um die Ausführbarkeit herzustellen.
Wenn das allerdings nicht ausreichen sollte, dann....
 chmod 777 FernLED.py

Jetzt können wir das kleine Script mal testen:
TEST:  In der Shell:     ./FernLED.py         <--   Das   ./    ist hier wichtig.

Wenn das geklappt hat, können wir dann auch den nächsten Schritt machen:
Das Smartphone vorbereiten:
 - Im Google play store die kostenlose App  "Raspberry SSH Lite" installieren.
 - RPi mit der IP-Adresse des RPi in der App hinzufügen.
 - Neuen Button anlegen
    IP:        eures RPi
    Port:     22
    User Name:    pi    (oder wie euer Anmeldename)
    Passwort:        raspberry    (oder euer Passwort)
    Name des Buttons  (Btn Text):   irgendwas
    Befehlsfolge (Btn Cmd):             /home/pi/FernLED.py

Das wars, --> testen   

LCD-Display

Für die Inbetriebnahme des Displays ist das folgende Script hilfreich:

+++ ANFANG +++

#!/usr/bin/env python
# -*- coding: utf8 -*-

# LCD-Display: https://www.sunfounder.com/wiki/index.php?title=Raspberry_Pi_5110_Mini_LCD_84*48_PCD8544_Usage#Step_1:_Download_example_code
# git clone https://github.com/adafruit/Adafruit_Nokia_LCD.git
# cd Adafruit_Nokia_LCD
# sudo apt-get install python-dev
# sudo python setup.py install
# sudo apt-get install python-imaging

from time import * #sleep
import time
# LCD
import Adafruit_Nokia_LCD as LCD
import Adafruit_GPIO.SPI as SPI
from PIL import Image
import Image
import ImageDraw
import ImageFont

lt = localtime()

# DISPLAY
# Raspberry Pi software SPI config:
SCLK = 5
DIN = 6
DC = 26
RST = 19
CS = 13
# Software SPI usage (defaults to bit-bang SPI interface):
disp = LCD.PCD8544(DC, RST, SCLK, DIN, CS)
# Initialize library.
disp.begin(contrast=60)
# Clear display.
disp.clear()
disp.display()
# Load image and convert to 1 bit color.
image = Image.open('happycat_lcd.ppm').convert('1') # Startbild
# Display image.
disp.image(image)
disp.display()

sleep(5)

# Load default font for text.
font = ImageFont.load_default()
# Create blank image for drawing.
# Make sure to create image with mode '1' for 1-bit color.
image = Image.new('1', (LCD.LCDWIDTH, LCD.LCDHEIGHT))
# Get drawing object to draw on image.
draw = ImageDraw.Draw(image)
draw.rectangle((0,0,LCD.LCDWIDTH,LCD.LCDHEIGHT), outline=255, fill=255)
draw.text((2,32),'Hello World!',font=font)
disp.image(image)
disp.display()

sleep(5)

draw.ellipse((2,2,22,22), outline=0, fill=255)
draw.rectangle((24,2,44,22), outline=0, fill=255)
draw.polygon([(46,22), (56,2), (66,22)], outline=0, fill=255)
draw.line((68,22,81,2), fill=0)
draw.line((68,2,81,22), fill=0)
disp.image(image)
disp.display()

sleep(5)

draw.rectangle((0,0,LCD.LCDWIDTH,LCD.LCDHEIGHT), outline=255, fill=255)
draw.text((2,1),strftime("%H:%M:%S",lt),font=font)
draw.text((2,12),'Zeile2',font=font)
draw.text((2,22),'Zeile3', font=font)
draw.text((2,32),'Zeile4', font=font)
disp.image(image)
disp.display() # LCD: Alle Daten anzeigen

+++  ENDE +++

Wetterbericht auf dem LCD-Display

Der untenstehende Code ist als eine FUNKTION geschrieben.
Beginne eine neue Datei!
+++ ANFANG +++

# WETTERBERICHT
def Wetter():
  global TemperaturMorgenLow
  global TemperaturMorgenHigh

  # Logfile
  global LogZeile
  LogOut.write(str(LogZeile)+" DEF Wetter, nach global"+"\n")
  LogZeile = LogZeile + 1

  Wetterbericht = urllib.urlopen('http://weather.tuxnet24.de/?id=648395').read()
  TempAktPos = Wetterbericht.find("current_temp") # Aktuelle Temperatur suchen
  TempAkt = Wetterbericht[TempAktPos+15:TempAktPos+21] # Aktuelle   Temperatur
  TemperaturAktuell = TempAkt.decode("utf-8") # Text umwandeln wegen "°C"

  TempMorgenLowPos = Wetterbericht.find("forecast1_temp_low") # Temperatur low morgen suchen
  TempMorgenHighPos = Wetterbericht.find("forecast1_temp_high") # Temperatur high morgen suchen
  TempMorgenLow = Wetterbericht[TempMorgenLowPos+21:TempMorgenLowPos+27] # Aktuelle Temperatur
  TempMorgenHigh = Wetterbericht[TempMorgenHighPos+22:TempMorgenHighPos+28] # Aktuelle Temperatur
  TemperaturMorgenLow = TempMorgenLow.decode("utf-8") # Text umwandeln wegen "°C"
  TemperaturMorgenHigh = TempMorgenHigh.decode("utf-8") # Text umwandeln wegen "°C"

  # Logfile
  LogOut.write(str(LogZeile)+" DEF Wetter, vor Print"+"\n")
  LogZeile = LogZeile + 1

  # Ausgabe im Pythonfenster
  # print Wetterbericht
  # print TemperaturAktuell, TemperaturMorgenLow, TemperaturMorgenHigh

  # Logfile
  LogOut.write(str(LogZeile)+" DEF Wetter, nach Print"+"\n")
  LogZeile = LogZeile + 1

  return TemperaturAktuell

+++ ENDE +++
Baue diese in eine Dauerschleife ein:
+++ ANFANG +++

# ASSISTENT
while intDist >= 0 :
  AktZeit = str(time.time()) # Hole Zeit

  AktTemp = Wetter()     # Hole aktuelle Temperatur
  # LCD-AUSGABE
  sleep(300)   # Alle 300 Sekunden oder 5 Minuten

+++ ENDE +++
Setze Anstatt    # LCD-AUSGABE    den umgearbeiteten Code für die LCD-Ausgabe ein!
Beachte, das in der Dauerschleife nicht alle Befehle (wie z.B. Import) jedesmal mit aufgerufen werden sollen.

Aufgabe 2:  Bringe die Uhrzeit auf das Display.  Was stellst Du fest?  Ist die Uhrzeit immer aktuell?
Was muss getan werden damit Du die aktuelle Uhrzeit anzeigen kannst, aber der Wetterbericht nur alle 5 Minuten abgefragt wird?

Ultraschallsensor

Der Schaltplan

+++ULTRASCHALL-Pythoncode+++

import RPi.GPIO as GPIO
import time

#GPIO definieren (Modus, Pins, Output)
GPIO.setmode(GPIO.BCM)
GPIO_TRIGGER = 20
GPIO_ECHO = 21
GPIO.setup(GPIO_TRIGGER, GPIO.OUT)
GPIO.setup(GPIO_ECHO, GPIO.IN)

def entfernung():
    # Trig High setzen
    GPIO.output(GPIO_TRIGGER, True)

    # Trig Low setzen (nach 0.01ms)
    time.sleep(0.00001)
    GPIO.output(GPIO_TRIGGER, False)

    Startzeit = time.time()
    Endzeit = time.time()

    # Start/Stop Zeit ermitteln
    while GPIO.input(GPIO_ECHO) == 0:
        Startzeit = time.time()

    while GPIO.input(GPIO_ECHO) == 1:
        Endzeit = time.time()

    # Vergangene Zeit
    Zeitdifferenz = Endzeit - Startzeit

    # Schallgeschwindigkeit (34300 cm/s) einbeziehen
    entfernung = (Zeitdifferenz * 34300) / 2

    return entfernung

if __name__ == '__main__':
    try:
        while True:
            distanz = entfernung()
            print ("Distanz = %.1f cm" % distanz)
            time.sleep(1)

        # Programm beenden
    except KeyboardInterrupt:
        print("Programm abgebrochen")
        GPIO.cleanup()

+++ENDE+++