Wissenswertes
Die PPL wurde für Python 2.7.9 entwickelt, eignet sich aber auch für den Einsatz mit Python 3.4.2. Beide Python-Versionen sind auf einem RasPi mit Raspbian bereits vorinstalliert, sodass es keine zusätzlichen Abhängigkeiten mehr aufzulösen gilt.
Über die Library greifen Sie auf alle Funktionen des PiXtend-Boards zu. Die Tabelle “PPL-Dokumentation” zeigt im Überblick, welche Möglichkeiten die Bibliothek bereitstellt. Die komplette Dokumentation finden Sie im Ordner doc/ der PPL-Installation. Sie beschreibt alle Funktionen sehr ausführlich.
Das Board selbst stellt zwei Betriebsmodi bereit: den langsamen manuellen Modus und den Auto-Mode. Über die Bibliothek haben Sie die Möglichkeit, alle Eigenschaften im manuellen Modus zu verwenden. Dadurch dürfen Sie an einer beliebigen Stelle im Programm der Hardware eine Anweisung erteilen oder einen Sensor abfragen.
Das Ausführen eines Befehls im manuellen Mode benötigt jedoch Zeit. Der Auto-Mode dagegen tauscht bei jedem Aufruf alle Informationen mit dem Mikrocontroller auf dem PiXtend aus, was die Kommunikation insgesamt effizienter macht. Für zyklische Aufrufe stellt dieser Modus daher die bessere Wahl dar. Dabei rufen Sie die Funktion auto_mode() so lange auf, bis sie eine Null zurückgibt, was bedeutet, dass die Kommunikation mit dem Mikrocontroller abgeschlossen ist.
PPL-Dokumentation
|
Methode |
Funktion |
|---|---|
|
|
Kommunikationsmodus RasPi-PiXtend |
|
|
öffnet eine Verbindung zum Board |
|
|
beendet die Verbindung |
|
|
DA-Wandler aktivieren |
|
|
DA-Werte ausgeben |
|
|
Konfiguration für PWM-Generator aktivieren |
|
|
RTC mit Uhrzeit auf den RasPi synchronisieren |
|
|
Analogeingang lesen |
|
|
Status des 10-Volt-Jumpers lesen und ändern |
|
|
Anzahl der Messungen des Analogeingangs |
|
|
RAW-Daten eines Analogeingangs |
|
|
Frequenz des AD-Wandlers |
|
|
Auswahl des AD-Wandlers |
|
|
DHT-1-Wire-Sensor an GPIO |
|
|
Wert des Ports |
|
|
Betriebsmodus des Ports |
|
|
Luftfeuchtigkeit DHT11 |
|
|
Luftfeuchtigkeit DHT22 |
|
|
RAW-Wert der Luftfeuchtigkeit DHT |
|
|
Wert für den PWM-Ausgang |
|
|
Wert CS0 für den PWM-Teiler |
|
|
Wert CS1 für den PWM-Teiler |
|
|
Wert CS2 für den PWM-Teiler |
|
|
Modus für die PWM-Ausgänge (Servo/PWM) |
|
|
Servo-Overdrive-Mode (Drehung > 180 Grad) |
|
|
Periodendauer des PWM-Signals |
|
|
Relay-Ausgang n ansteuern |
|
|
Modus für serielle Schnittstelle (RS232/RS485) |
|
|
Wert für Servoposition |
|
|
Temperatur DHT11 |
|
|
Temperatur DHT22 |
|
|
RAW-Wert der Temperatur DHT |
|
|
Version des Boards |
|
|
Mikrocontroller-Control-Register lesen/schreiben |
|
|
Firmware-Version des Mikrocontrollers |
|
|
Mikrocontroller-Status-Byte |
|
|
DHT-Eingänge auf Fahrenheit setzen |
Testprogramm
Mit Python und der Library lassen sich sehr einfach Programme für das PiXtend-Board schreiben. Das liegt zum einen daran, dass es sich bei Python um eine leicht zu erlernende, gut strukturierte Sprache handelt. Python interpretiert die Programme, erstellt also erst Bytecode und führt diesen danach aus. So können Sie ohne großen Aufwand Funktionen schnell testen.
Darüber hinaus stellt die PPL alle Funktionen des Boards einfach und übersichtlich bereit. Sie benötigen daher nur wenig Code, um ans Ziel zu kommen. Das konkrete Programm in unserem Beispiel trägt den Namen sortier.py (Listing 1), Sie starten es entsprechend mit dem Aufruf sudo python sortier.py.
Listing 1
#!/usr/bin/env python
# coding=utf-8
from __future__ import print_function
from pixtendlib import Pixtend
import time
import sys
# configure
p = Pixtend()
try:
p.open()
except IOError as io_err:
print("Error opening the SPI bus! Error is: ", io_err)
p.close()
p = None
try:
if p is not None:
p.pwm_ctrl_mode = p.PWM_MODE
p.pwm_ctrl_cs0 = p.ON
p.pwm_ctrl_cs1 = p.ON
p.pwm_ctrl_cs2 = p.OFF
p.pwm_ctrl_od0 = p.OFF
p.pwm_ctrl_od1 = p.OFF
p.pwm_ctrl_period = 5000
p.pwm_ctrl_configure()
print (p.digital_input0)
print (p.digital_input1)
print (p.digital_input2)
# wait for S1
while p.auto_mode()==0:
p.pwm1=300 #250
if p.digital_input0==0:
break
time.sleep(.1)
print ("S1 pressed")
# start conveyor belt
print ("start conveyor belt")
run=1
metal=0
count=0
while True:
if p.auto_mode()==0:
if run==0:
break
p.pwm0=400
if metal==1:
print("metal detect")
count=count+1
p.pwm1=450 #500
else:
p.pwm1=300 #250
# S2 pressed
if p.digital_input1==1:
metal=1
# S3 pressed
if (p.digital_input2 == 1) or (count == 40):
print("stop conveyor belt")
p.pwm0=0
p.pwm1=300
run=0
time.sleep(0.1)
except KeyboardInterrupt:
# p.pwm0=0
# p.pwn1=0
p.close()
p = None
exit()
p.pwm0=0
p.pwm1=0
p.close()
p=None
print("done")
exit()
Zunächst importiert das Programm alle benötigten Bibliotheken. Als Nächstes baut es eine Verbindung zum Board auf und initialisiert die PWM-Schnittstelle (Zeile 9 bis 27). Verläuft die Konfiguration fehlerfrei, wartet die Software darauf, dass der Sensor 1 auslöst und damit den Wert 0 liefert (Zeile 31). Wie bereits erwähnt, wäre es sinnvoller, wenn er beim Auslösen eine 1 liefern würde, doch dieser Umstand lässt sich in der Software leicht berücksichtigen.
In der Schleife, die auf den Sensor 1 wartet, sorgt der Code außerdem dafür, dass der Servomotor in die Startposition fährt (Zeile 30). Das bedeutet, dass das Förderband frei ist. Löst der Sensor aus, bricht die Schleife ab und das Programm läuft weiter.
Es folgt die Definition einiger Variablen, die das Hauptprogramm steuern (Zeile 38 bis 40). Mit run testet das Skript, ob die Hauptschleife abbricht. In metal speichert es, wenn der Metallsensor auslöst. Über die Variable count weiß die Software, wie lange das Band noch läuft, wenn ein Sensor Metall erkannt hat. Solche Objekte schaffen es nicht bis zu S3, weshalb es gilt, das Band über eine Zeitverzögerung abzuschalten. Über die Hauptschleife startet der Motor (p.pwm0=400). Soll er schneller laufen, erhöhen Sie den Wert.
Legt der Servomotor ein eigenwilliges Verhalten an den Tag, sobald das Band läuft, liegt das vermutlich an Störungen, die der Bandantrieb in der Versorgungsspannung verursacht. In einem solchen Fall bauen Sie entweder einen zusätzlichen Kondensator in die Spannungsversorgung ein, der diese etwas stabilisiert, oder Sie verwenden einen anderen Servotyp. Es gibt Modelle, die mit entsprechenden Störungen einfach besser klarkommen.
Als weitere Alternative bietet sich das Verwenden einer etwas kräftigeren Spannungsversorgung an. Falls alle Stricke reißen, bleibt nichts anderes übrig, als Servo- und Bandmotor über zwei unterschiedliche Spannungsquellen zu versorgen. Schauen Sie sich aber die Signale vorher mit dem Oszilloskop an und prüfen Sie, ob die Schwankungen wirklich die Ursache für die Störungen darstellen. Möglicherweise ist das Steuersignal für den Servo einfach zu schwach.
Im regulären Ablauf (Zeile 41 bis 61) treten zwei Fälle ein: Das Band befördert entweder ein Stück Metall oder ein nicht metallisches Objekt vor den Sensor. Betrachten wir den einfacheren der beiden Fälle zuerst: Es liegt ein Stück Holz auf dem Band, der Sensor S2 löst nicht aus. Das Teil gelangt daher bis zum Sensor S3, der das Band anhält. Danach beendet sich das Programm.





