Widerspenstige Variable

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Benutzeravatar
Bendy
User
Beiträge: 2
Registriert: Dienstag 13. November 2012, 14:06
Wohnort: Wilhelmshaven

Hallo zusammen,

Ich habe ein Verständnisproblem, bin auch schon im Rentenalter und noch nicht so erfahren mit Python und Arduino.
Ich möchte später eine Aktive Magnetic Loop Antenne um 180 Grad drehen können und möchte dies mit einem Servo machen.
Das klappt in ersten Versuchen, mein selbstgebastelter Rotor dreht so leicht das der Servo das locker hinbekommt.
Die Steuerung übernimmt ein Arduino Uno. Auf diesem läuft die Firmata Software.
Ich brauche aber die Position der Antenne um sie als Kompassrose im Python-Programm auf dem Rechner darzustellen.
Dazu lese ich ein Poti mit dem analogen Eingang am Arduino aus.
Ich habe zum Lernen und Testen dieses Programm.

1 import pyfirmata
2 import time
3
4 board = pyfirmata.Arduino('COM5')
5 it = pyfirmata.util.Iterator(board)
6 it.start()
7
8 analog_input = board.get_pin('a:0:i')
9
10 while True:
11 analog_value = analog_input.read()
12 print(analog_value)
13 time.sleep(0.1)

Soweit so gut, ich bekomme fortlaufend Ausgaben der Potistellung. Z.B 0.3325, Also einen Zahlenwert zwischen 0 und 1.
Diesen möchte ich aber umrechnen in Gradzahlen von 0 bis 180
Zum Test habe ich mal die Zeile 12 geändert um die Ausgabe in Volt umzurechnen. (Das Poti hängt an der Betriebsspannung)

12 print(analog_value * 5)

Und bekomme prompt den Fehler:
TypeError: unsupported operand type(s) for *: 'NoneType' and 'int'
Nanu ich denke die Variable ist automatisch vom Typ Float?

In einem anderem Programm wird doch auch mit dieser Variablen gerechnet.
Dort kommt folgendes vor:
while True:
analog_value = analog_input.read()
if analog_value is not None:
delay = analog_value * 2

Aber ich verstehe die If Abfrage nicht.
Da steht doch nur: "Wenn die Variable nicht nichts ist dann"
Aber jede Variable die einen Inhalt hat, ist doch irgendwas!
Und Inhalt hat sie ja, eben einen Wert zwischen 0 und 1

Mir schwirrt der Kopf!
Bitte klärt mich auf!

LG Bendy
Bolitho
User
Beiträge: 219
Registriert: Donnerstag 21. Juli 2011, 07:01
Wohnort: Stade / Hamburg
Kontaktdaten:

Code kannst du zwischen code-Tags setzen, dann kann man es hier besser lesen. Der fünfte Button von links über dem Editor. </>

Schau dir mal die Zeile 8 an.
Ich nehme an, dass dort kein Wert ankommt. Warum nicht, kann ich leider nicht beantworten. Aber ich wette, ein

Code: Alles auswählen

print(analog_input)
in Zeile 9 würde zur Ausgabe None führen.
Sirius3
User
Beiträge: 18227
Registriert: Sonntag 21. Oktober 2012, 17:20

@Bendy: die Funktion analog_input.read liefert offensichtlich manchmal None als Rückgabewert, was soviel bedeutet, dass kein Wert gelesen werden konnte und genau diesen Fall prüft die if-Abfrage.
Benutzeravatar
Bendy
User
Beiträge: 2
Registriert: Dienstag 13. November 2012, 14:06
Wohnort: Wilhelmshaven

Hallo,
Ihr habt recht! Die erste Abfrage ist immer "None". Danach läuft alles Wunschgemäß
und ich kann auch mit der Variablen rechnen. Warum? Es mag wohl an der Hardware liegen.
Man konnte das "None" in der Ausgabe bloß nicht so schnell lesen weil es so schnell hochscrollte.
Ich habe das Programm nun geändert. Klappt wunderbar.

Code: Alles auswählen

import pyfirmata
import time

board = pyfirmata.Arduino('COM5')
it = pyfirmata.util.Iterator(board)
it.start()
i=0
analog_input = board.get_pin('a:0:i')

while i <= 8:
    analog_value = analog_input.read()
    if analog_value is not None:
       analog_value = analog_value * 5
       print(round(analog_value, 2))
       time.sleep(0.1)
       i=i+1
    
Dankeschön
LG Bendy
Antworten