Raspberry Pi GPIO Pins Pragrammieren

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
therealgherkhin

Hallo liebes Forum,

ich möchte an meinem Raspberry Pi ein LED Strip verbauen.
Die Elektronische Herausforderung beim Zusammenbau ist nicht das "besondere", da es bei der Anleitung sehr gut beschrieben ist. (diese Anleitung habe ich benutzt: http://popoklopsi.github.io/RaspberryPi-LedStrip/#/ )


Nur möchte ich nicht wie in der Anleitung beschrieben das Programm zum Steuern benutzen sondern ein Python Programm dazu verwenden.

Ich habe schon einmal ein Programm geschrieben das so Aussieht :

Code: Alles auswählen

import RPI.GPIO as GPIO 
import time

GPIO.setmode(GPIO.Board)

GPIO.setup(17,GPIO.OUT)		#Rot
GPIO.output(17,GPIO.LOW)	#Rot
GPIO.setup(22,GPIO.OUT)		#Grün
GPIO.output(22,GPIO.LOW)	#Grün
GPIO.setup(24,GPIO.OUT)		#Blau
GPIO.output(24,GPIO.LOW)	#Blau

dauer = 60
dauer2 = 0.5

for x in range(10
		GPIO.output(17,GPIO.HIGH)
		time.sleep(dauer)
		GPIO.output(17,GPIO.LOW)
		time.sleep(dauer2)
		GPIO.output(22,GPIO.HIGH)
		time.sleep(dauer)
		GPIO.output(22,GPIO.LOW)
		time.sleep(dauer2)
		GPIO.output(24,GPIO.HIGH)
		time.sleep(dauer)
		GPIO.output(24,GPIO.LOW)
		time.sleep(dauer2)
		
		GPIO.cleanup() 
Ich möchte jeweils für 60 sekunden einen der drei verbauten GPIO Pins ansteueren.


Da ich relativ neue in der Programmierung mit Python bin, bin ich mir nicht ganz sicher ob dieser Code gehen würde...?
Und aussprobieren kann ich es auch noch nicht da die Teile ewigkeiten brauchen um geliefert zu werden.



Für Verbesserungen oder Korrekturen bin ich dankbar



Vielen Dank im Vorraus :mrgreen:
BlackJack

@therealgherkhin: Erster Verbesserungsvorschlag wäre das syntaktisch so zu schreiben das nicht schon der Compiler mit einem `SyntaxError` aussteigt. Dann wäre ein Blick in den Style Guide for Python Code angesagt.

Das `cleanup()` *in* der Schleife macht sicher Probleme.

Innerhalb der Schleife wird dreimal fast das gleiche gemacht, und auch bei der Initialisierung. Das könnte man jeweils als Schleife schreiben.
therealgherkhin

Danke erstmal für die Antwort,

durch den Style Guide werde ich mich einmal durcharbeiten.

Was meinst du mit Syntaktisch schreiben? :shock: (Sorry beschäftige mich erst seit ca. 1 Woche mit Python)


Das mit den Schleifen einzel schreiben werde ich machen das bekomme ich hin.

Aber wie beende ich die Schleife dann wenn ich nicht

Code: Alles auswählen

 Cleanup ()
benutzen kann?


Mfg
therealgherkhin

Kann ich bei der 2. Schleife dann auch wieder

Code: Alles auswählen

for x in range ()
schreiebn oder muss ich dort noch einen Punkt beachten?

Würde meiner Meinung nach dann so aussehen:

Code: Alles auswählen

import time

GPIO.setmode(GPIO.Board)

GPIO.setup(17,GPIO.OUT)		#Rot
GPIO.output(17,GPIO.LOW)	#Rot
GPIO.setup(22,GPIO.OUT)		#Grün
GPIO.output(22,GPIO.LOW)	#Grün
GPIO.setup(24,GPIO.OUT)		#Blau
GPIO.output(24,GPIO.LOW)	#Blau

dauer = 60
dauer2 = 0.5


for x in range(10)
		GPIO.output(17,GPIO.HIGH)
		time.sleep(dauer)
		GPIO.output(17,GPIO.LOW)
		time.sleep(dauer2)
	
for x in range(10)
		GPIO.output(22,GPIO.HIGH)
		time.sleep(dauer)
		GPIO.output(22,GPIO.LOW)
		time.sleep(dauer2)

for x in range(10) 	
		GPIO.output(24,GPIO.HIGH)
		time.sleep(dauer)
		GPIO.output(24,GPIO.LOW)
		time.sleep(dauer2)

                Cleanup ()
BlackJack

@therealgherkhin: Mit syntaktisch korrekt meine ich Du sollst *Python*-Quelltext schreiben der auch fehlerfrei als solcher erkannt wird. Auch beim letzten Quelltext sind die ``for``-Schleifen syntaktisch nicht korrekt. Schreib am besten keinen Code den Du nicht auch tatsächlich ausprobieren kannst.

Der letzte Quelltext würde auch bei einigen Namen darüber stolpern das sie nicht definiert sind. `GPIO` und `Cleanup` sind unbekannt.

Die Aufteilung der Schleife ist falsch denn das Programm macht jetzt etwas anderes als das Programm davor machen sollte. Auch hier ist es wieder sehr unpraktisch wenn Du das selber überhaupt nicht überprüfen kannst. Programmieren lernt man unter anderem dadurch das man Änderungen vornimmt und dann das Ergebnis mit dem vergleicht welches man erwartet hat, und falls das nicht so ist, sich klar macht warum. Das funktioniert aber nicht wenn man die Ergebnisse gar nicht sehen kann.
therealgherkhin

Okay dann warte ich lieber bis ich alles zusammbauen kann und probiere das Prigramm dann aus.

Trotzdem danke für die Hilfe. :oops:
therealgherkhin

Habe jetzt einen alten Trafo gefunden der die Passende Spannung hat.

Wenn ich das Programm ausführe bekomme ich die Fehlermeldung :

File "ledschaltung2.py", line 17
GPIO.output(17,GPIO.HIGH)
^
SyntaxError: invalid syntax



Wie kann ich den Fehler beheben?


Habe auch schon probiert es ohne eine schleife laufen zu lassen...
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@therealgherkhin: in dem Du ein Python-Tutorial durcharbeitest, vor allem das Kapitel über for-Schleifen.
therealgherkhin

Mein Code sieht jetzt so aus

Code: Alles auswählen

#!/usr/bin/python3
import RPi.GPIO as gpio
import time
gpio.setmode(gpio.Board)
gpio.setup(11,gpio.OUT)		
gpio.setup(15,gpio.OUT)		
gpio.setup(18,gpio.OUT)		
for i in range(10):
    gpio.output(11,gpio.HIGH)
    time.sleep(1)
    gpio.output(11,gpio.LOW)
    time.sleep(1)
    gpio.output(15,gpio.HIGH)
    time.sleep(1)
    gpio.output(15,gpio.LOW)
    time.sleep(1)
    gpio.output(18,gpio.HIGH)
    time.sleep(1)
    gpio.output(18,gpio.LOW)nan
    time.sleep(1)
gpio.cleanup()
Jetzt sagt mir der Terminal:


File "ledschaltung.py", line 4, in <module>
gpio.setmode(gpio.Board)
AttributeError: 'module' object has no attribute 'Board'



Wie kann ich das beheben?
therealgherkhin

Habe es jetzt hinbekommen.


Danke für die Antworten
BlackJack

Ohne Daten- und Codewiederholungen (ungetestet):

Code: Alles auswählen

from time import sleep
from RPi import GPIO


RGB_PINS = [11, 15, 18]


def main():
    GPIO.setmode(GPIO.BOARD)
    
    GPIO.setup(RGB_PINS, GPIO.OUT)
    try:
        GPIO.output(RGB_PINS, GPIO.LOW)
        for _ in xrange(10):
            for pin in RGB_PINS:
                GPIO.output(pin, GPIO.HIGH)
                sleep(1)
                GPIO.output(pin, GPIO.LOW)
                sleep(1)
    finally:       
        GPIO.cleanup()


if __name__ == '__main__':
    main()
Antworten