Serielle übertragung zwischen Arduino und PC (Python3) 1

Ich stelle euch heute einmal meine erste Spielerei mit dem Arduino UNO R3 vor:
Ein Python Programm, welches am PC Analogwerte vom Arduino empfängt und ausgibt.

Es werden hier mit drei Potis, welche als Spannungsteiler zwischen 0V und 5V arbeiten, die analogen Eingänge A0 bis A2 des Arduino angesteuert.
Dabei werden im Arduino die Spannungen an den analogen Eingängen gemessen und die Werte von A0 und A1  über die serielle Verbindung zum Computer gesendet, um dort von einem Python Programm empfangen und dargestellt zu werden.
Der Wert des dritten analogen Einganges (A2) wird verwendet um die Geschwindigkeit der Übertragung zu beeinflussen, indem damit die Länge der Pause berechnet wird, welche dann nach jedem Programmdurchlauf abgewartet wird.

Arduino Code

// Sensorwerte 1 und 2 werden zum PC übertragen, Wert 3 stellt die Geschwindigkeit ein.

int sensor1 = A0;
int sensor2 = A1;
int sensor3 = A2;

int wert1 = 0;
int wert2 = 0;
int wert3 = 0;

int pause = 100;

void setup(){
  Serial.begin(9600);
}

void loop(){
  read_analog();  //Die 3 Analogeingänge auslesen
  write_serial();  //A0 und A1 über Serial ausgeben
  pause = (1000.0 - wert3 * 0.958);   //mit A2 die Pause einstellen (zwischen 20ms und 1s)
  delay(pause);
}

void read_analog(){
  wert1 = analogRead(sensor1);
  wert2 = analogRead(sensor2);
  wert3 = analogRead(sensor3); 
}

void write_serial(){
  Serial.print(wert1);
  Serial.print(';');
  Serial.print(wert2);
  Serial.println(';');
}

Python3 Code

Dies ist die erste Version meines Empfangs Programms in Python3.
Es gibt die beiden Spannungen an den analogen Eingängen A0 und A1 des Arduino auf der Standardausgabe aus und berechnet den Mittelwert, welcher daraufhin auch ausgegeben wird.
Es ist noch lange nicht perfekt (oder besonders nützlich), denn es ist durch die Endlosschleife nicht möglich eine sinnvolle Benutzerinteraktion zu implementieren.
Die Voraussetzungen für dieses Programm sind Python3 und das Python-Modul pySerial.

#!/usr/bin/python3

import serial
import time
import os

# Seriellen Port Konfigurieren:
ser = serial.Serial()
# Hier den passenden Port angeben
ser.port = 'COM5' if os.name=='nt' else '/dev/ttyACM0'
ser.baudrate = 9600
ser.timeout = 1

# Port öffnen
ser.open()
print("Port geöffnet")

# Daten einlesen
zahl1 = 0
zahl2 = 0
try:
    while 1:
        # Zeile als Bytestring einlesen und
        # mit decode in normalen string konvertieren.
        string = ser.readline()
        try:
            string = string.decode()
        except:
            print("Decodierungsfehler")

        # String via "slicing" kürzen (letztes Semikolon abschneiden):
        string = string[:len(string)-3]

        # String in die Einzelnen Werte aufteilen.        
        try:
            werte = string.split(';')
            # AD Wert (0-1023) umrechnen auf 0-5V.
            zahl1 = int(werte[0])* 0.00489
            zahl2 = int(werte[1])* 0.00489
        except:
            print("Typconvertierungsfehler")

        # Ausgeben der Ergebnisse jeweils mit 3 Nachkommastellen.
        os.system('cls' if os.name=='nt' else 'clear')
        print("A0= {0:.3f}   A1= {1:.3f}   Mittelwert= {2:.3f}".format(zahl1, zahl2, (zahl1+zahl2)/2))

# Keyboard Interrupt abfangen, zum beenden mit [STRG]+[C].
except(KeyboardInterrupt, SystemExit):
    print("\nWird Beendet:")
    ser.close()
    print("Com Port geschlossen!")
    print("\nENDE")

Bilder und Downloads

Arduino_Analog_Schaltung
Arduino Schaltung für Analogports

Download: Quellcode und Schaltplan

Links:

  • Version 2 des Empfangs Programmes, mit Threading
  • Infos zu RS232 unter Linux in meinem anderen Beitrag „Linux und RS232“
  • Dieser Beitrag aus kevin’s blog hat mich zu meinem Beitrag hier inspiriert.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.


*