Aus Raspberry Pi Geek 04/2018

Mit Python und dem PiXtend-Board Sortieralgorithmen programmieren (Seite 2)

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

auto_mode()

Kommunikationsmodus RasPi-PiXtend

open()

öffnet eine Verbindung zum Board

close()

beendet die Verbindung

open_dac()

DA-Wandler aktivieren

set_dac_output()

DA-Werte ausgeben

pwm_ctrl_configure()

Konfiguration für PWM-Generator aktivieren

update_rtc()

RTC mit Uhrzeit auf den RasPi synchronisieren

analog_input[n]()

Analogeingang lesen

analog_input[n]_10volts_jumper

Status des 10-Volt-Jumpers lesen und ändern

analog_input[n]_nos

Anzahl der Messungen des Analogeingangs

analog_input[n]_raw

RAW-Daten eines Analogeingangs

analog_input_nos_freq

Frequenz des AD-Wandlers

dac_selection

Auswahl des AD-Wandlers

dht[n]

DHT-1-Wire-Sensor an GPIO

gpio[n]

Wert des Ports

gpio[n]_direction

Betriebsmodus des Ports

h[n]_dht11

Luftfeuchtigkeit DHT11

h[n]_dht22

Luftfeuchtigkeit DHT22

hum_input[n]_raw

RAW-Wert der Luftfeuchtigkeit DHT

pwm[n]

Wert für den PWM-Ausgang

pwm_ctrl_cs0

Wert CS0 für den PWM-Teiler

pwm_ctrl_cs1

Wert CS1 für den PWM-Teiler

pwm_ctrl_cs2

Wert CS2 für den PWM-Teiler

pwm_ctrl_mode

Modus für die PWM-Ausgänge (Servo/PWM)

pwm_ctrl_od[n]

Servo-Overdrive-Mode (Drehung > 180 Grad)

pwm_ctrl_period

Periodendauer des PWM-Signals

relay[n]

Relay-Ausgang n ansteuern

serial_mode

Modus für serielle Schnittstelle (RS232/RS485)

servo[n]

Wert für Servoposition

t[n]_dht11

Temperatur DHT11

t[n]_dht22

Temperatur DHT22

temp_input[n]_raw

RAW-Wert der Temperatur DHT

uc_board_version

Version des Boards

uc_control

Mikrocontroller-Control-Register lesen/schreiben

uc_fw_version

Firmware-Version des Mikrocontrollers

uc_status

Mikrocontroller-Status-Byte

use_fahrenheit

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.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 5 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben