GPIO Board - analoge Signale auslesen

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Kampfgummibaerlie
User
Beiträge: 27
Registriert: Freitag 18. Juni 2021, 14:44

Ich versuche derzeit einen Potentiometer mit einem "Wandler" auszulesen.

Der Potentiometer ist richtig angeschlossen (eine LED ist damit dimmbar).
Ich habe das Problem, dass ich in meinem Python-Programm jedoch nur zwei Werte auslesen kann (0 und 1).

Ich würde gerne mehr Werte auslesen, als diese zwei.

Mein Fall wird folgend beschrieben:
1.: Ich habe fünf Maschinen
2.: Ich möchte mittels dem Potentiometer eine von den fünf Maschinen auswählen können
3.: Der Knopf ist auch bereits Funktionstüchtig.

Der Wert springt in etwa bei der Hälfte von 0 auf 1 um.
Versuche, den Wert mit einem Faktor hoch zu skalieren oder anderes ändern die Ausgabe von 0 und 1 auf 0 und 100 o.ä.

Muss ich hier mit (Habe Erfahrungen mit dem Arduino sammeln können) einer ähnlichen Map-Funktion arbeiten?

Habe richtig Freude an der Elektrotechnik gefunden (bisher zumindest xD)

Danke im Voraus ;)
Kampfgummibaerlie
Benutzeravatar
Dennis89
User
Beiträge: 1156
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

wie hast du den Poti denn genau angeschlossen und welcher ist es?
Wie sieht denn der Code aus?
Welcher Knopf?

Es gibt einige Tutorials zu Potentiometer und Raspberry Pi(oder hast du einen Pico?), falls du einem gefolgt bist, bitte verlinken.


Grüße
Dennis

Edit: Vielleicht hilft dir die Seite weiter, sah auf den ersten Blick fürs Verständnis nicht schlecht aus:
https://newbiely.com/tutorials/raspberr ... entiometer
"When I got the music, I got a place to go" [Rancid, 1993]
Kampfgummibaerlie
User
Beiträge: 27
Registriert: Freitag 18. Juni 2021, 14:44

a) Ein Dreh-Potenziometer, wenn das mehr aussagt ;)
b) nachdem ich nur 0er und 1er auslese, habe ich nicht viel weiter geschrieben...

aber hier ein paar Zeilen:

Code: Alles auswählen

import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)

GPIO.setup(12, GPIO.IN)

while True:
	print(GPIO.input(12))
	time.sleep(0.5)
EDIT: Es handelt sich um einen Raspberry Pi 4 und ich habe das ganze eigenständig zusammengesteckt (kein Guide)...
nur eckdaten ergoogelt, aber keinem Guide 1:1 gefolgt...
Benutzeravatar
Dennis89
User
Beiträge: 1156
Registriert: Freitag 11. Dezember 2020, 15:13

Schau dir mal den Link an.

Hast du einen Analog-to-digital-Converter verbaut oder wie ist der Poti angeschlossen?

Der Pin hat eine bestimmte Spannung (kenne den Wert nicht sicher auswendig), ab dem er von Low zu High wechselt und du stellst mit deinem Poti gerade die Spannung von dem einen in den anderen Bereich. Da kann so eigentlich nicht mehr wie 0 und 1 raus kommen.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Der Pi hat keine analogen Eingänge. Ohne einen ADC wird’s nicht gehen.
Kampfgummibaerlie
User
Beiträge: 27
Registriert: Freitag 18. Juni 2021, 14:44

Ich habe mehrere PCF8591 bei mir... reichen diese aus?

Sorry, wenn ich mich ahnungslos verhalte ;)
Benutzeravatar
Dennis89
User
Beiträge: 1156
Registriert: Freitag 11. Dezember 2020, 15:13

Einer müsste reichen. Der kann maximal 3,3V Input und stellt den Bereich von 0-3,3V in einem Bereich von 0-255 dar:
https://www.makershop.de/download/YL_40_PCF8591.pdf

Dann hast du fünf "51"er-Bereiche für die Ansteuerung deiner 5 Maschinen.


Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Kampfgummibaerlie
User
Beiträge: 27
Registriert: Freitag 18. Juni 2021, 14:44

Soda, nachdem meine Quelle ein Buch ist, kann ich hier nur schwer einen Link vergeben.

Ich habe das Problem gelöst, mein Fehler war, dass ich den GPIO-Pin nicht im Vorhinein als Input oder Output deklariert habe.
Der Rest funktioniert, einfach das PCF8591 entsprechend angeschlossen, SCL an Pi SCL(1) und SDA an Pi SDA(1) und den analogen Eingang vom Drehpotentiometer an AIN1 am PCF8591 angeschlossen.
VCC an 3.3Volt angeschlossen und die GND entsprechend geerdet.

Bin sehr froh das Problem gelöst zu haben und bin sogar stolz darauf, die Lösung auf eigenem Wege gefunden zu haben und komme drauf, ich sollte mich wirklich durch mehr solche Praxisbücher arbeiten ^^
In meinem Fall habe ich ein Exemplar von "Raspberry Pi - Handbuch für Einsteiger" ;)

PS: Wieder ausreichend geschafft für heute, Gute Nacht ;D

LG Kampfgummibaerlie

EDIT:
Hier mein Python Code

Code: Alles auswählen

import smbus
import time
address = 0x48
A0 = 0x41
bus = smbus.SMBus(1)

while True:
    bus.write_byte(address,A0)
    value = bus.read_byte(address)
    print(int(value/50))
    time.sleep(0.25)
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Das `SMBus`-Objekt sollte man am Programmende schliessen und `int()` kann man sich sparen wenn man die ganzzahlige Division macht:

Code: Alles auswählen

#!/usr/bin/env python3
import time
from contextlib import closing

import smbus

ADDRESS = 0x48


def main():
    with closing(smbus.SMBus(1)) as bus:
        while True:
            bus.write_byte(ADDRESS, 0x41)
            print(bus.read_byte(ADDRESS) // 50)
            time.sleep(0.25)


if __name__ == "__main__":
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten