Damla Geschrieben October 8, 2020 at 10:21 Geschrieben October 8, 2020 at 10:21 Hallo Liebes Community, Im Rahmen meiner Masterarbeit bin ich zur Zeit dabei ein Messsystem zu bauen. Das ganze soll in Tinkerforge gewährleistet werden. Ich habe das grobe System bereits vorbereitet : Red Brick, Masterbrick und ein Industrial 4IN Bricklet. Einen Programm habe ich auch in Python schon geschrieben. Jedoch will ich das Messsystem auch ohne ein Laptop benutzen. Dazu müsste ich ja auf dem RED Brick bzw. auf der darin integrierten SD-Karte programmieren oder? Nun stellt sich jedoch die Frage: - Wie kann ich es auf dem Red Brick umsetzen? --> Ich weiss, dass es mit einem Rasperry Pi möglich wäre, darf ich aber leider nicht benutzen. Ich würde mich auf eure Antworten und Tipps freuen :) Viele Grüße Zitieren
photron Geschrieben October 8, 2020 at 11:18 Geschrieben October 8, 2020 at 11:18 Du kannst über Brick Viewer Programme auf den RED Brick laden und ausführen lassen: https://www.tinkerforge.com/de/doc/Hardware/Bricks/RED_Brick_Program_Tab.html Auf dem RED Brick läuft ein Debian Linux, daher unterschiedet sich der RED Brick vom Betriebssystem her nicht stark von einem Raspberry Pi. Über USB steht dir eine serielle Konsole bereit, die du auch auch über den Brick Viewer zugreifen kannst. Wenn du dem RED Brick über eine USB WLAN Strick oder USB Ethernet Stick oder eine Ethernet Master Extension eine Netzwerkschnittstelle gibst, die du über Brick Viewer konfigurieren kannst, dann kannst du den RED Brick auch über SSH erreichen. Zitieren
Damla Geschrieben October 8, 2020 at 12:03 Autor Geschrieben October 8, 2020 at 12:03 Genau das weiß ich. nur dafür brauche ich zur Zeit immernoch mein Laptop damit ich ich den Python Skript starten kann. aber ich will es ganz ohne Laptop benutzen. Zitieren
photron Geschrieben October 8, 2020 at 12:32 Geschrieben October 8, 2020 at 12:32 Wenn du das Programm auf den RED Brick lädst kannst du dabei angeben, dass das Programm automatisch gestartet werden soll. Das kannst du auch nachträglich noch umstellen. Zitieren
Damla Geschrieben October 15, 2020 at 09:56 Autor Geschrieben October 15, 2020 at 09:56 Danke Photron für die Antwort. nun funktioniert es ohne ein Laptop. Jedoch habe ich jetzt ein weiteres Problem, dass er mir die Signale nicht pro Sekunde ausgibt sondern Pro Umdrehung des drehgebers 🤯🤯 hast du vielleicht dazu auch eine Idee 🙈 Zitieren
photron Geschrieben October 15, 2020 at 10:04 Geschrieben October 15, 2020 at 10:04 Dann würde ich provokant sagen, dass du eben dein Programm so schreiben musst, dass es die "Signale" pro Sekunde und nicht pro Umdrehung ausgibt 😜 Sorry, aber da musst du mal genauer beschreiben, was du da machst. Mir ist unklar was du da genau misst und wie, so kann ich dir da keine sinnvolle Antwort zu geben. Wenn möglich zeigt auch mal dein Python Programm vor. Zitieren
Damla Geschrieben October 15, 2020 at 10:34 Autor Geschrieben October 15, 2020 at 10:34 Da hast du natürlich Recht :) hier ist mein Python Skript, wenn ich es über Python ausführe funktioniert alles einwandfrei. Nur wenn ich es "offline" durchführe bekomme ich nur Ergebnisse für n*360grad HOST = "localhost" PORT = 4223 UID = "PN5" # Change XYZ to the UID of your Industrial Digital In 4 Bricklet 2.0 import time from tinkerforge.ip_connection import IPConnection from tinkerforge.bricklet_industrial_digital_in_4_v2 import BrickletIndustrialDigitalIn4V2 if __name__ == "__main__": ipcon = IPConnection() # Create IP connection idi4 = BrickletIndustrialDigitalIn4V2(UID, ipcon) # Create device object channel_number = 1 ipcon.connect(HOST, PORT) # Connect to brickd # Don't use device before ipcon is connected # Configure rising edge count (channel 3) with 10ms debounce idi4.set_edge_count_configuration(channel=channel_number, edge_type=1, debounce=1) # Get edge count 10 times with 1s delay for i in range(10): time.sleep(1) count = idi4.get_edge_count(channel=channel_number, reset_counter=False) r= 0.03 alpha= (count*360)*10/1000 b= (alpha/360)*2*math.pi*r print("Count" + str(b) + time.ctime()) input("Press key to exit\n") # Use raw_input() in Python 2 ipcon.disconnect() Kurz als Input: Mein Messsystem ist ein Drehgeber Encoder und das Ziel ist es die Impulse aus dem Drehgeber in eine Längeneinheit umzuwandeln. In Python selbst gibt er mir die Richtigen Werte raus. Aber in der Logs File im Brick Viewer rundet er die Daten bis auf eine ganze Umdrehung auf. Siehe auch die Bilder als Vergleich: Hier sind die Ergebnisse in Python, er gibt mir unterschiedliche Werte für jede Sekunde aus Und hier die Ergebnisse von Brick Viewer, welcher mir konstante Werte angibt, bis eine Umdrehung abgeschlossen ist. Zitieren
photron Geschrieben October 15, 2020 at 11:37 Geschrieben October 15, 2020 at 11:37 Das ist ein Python 2 vs 3 Problem. Du verwendest auf deinem PC Python 3, auf dem RED Brick aber Python 2. In Python 2 hängt der Typ einer Division von den Operanden ab: 2 / 3 ergibt eine Integer-Division 2 / 3.0 eine Float-Division. In Python 3 macht der normale Divisions Operator / immer eine Float-Division und für eine Integer-Division muss man // verwenden. In deinem Fall betrifft dieser Unterschied die alpha Berechnung: alpha = (count*360)*10/1000 Alle Operanden darin sind Integer, dadurch passiert dort eine Integer-Division, obwohl du eine Float-Division erwartest. Um das zu lösen musst du in Brick Viewer, im "Python Configuration" Abschnitt für dein Programm, die Python Version von 2 auf 3 umstellen. 1 Zitieren
Damla Geschrieben October 15, 2020 at 12:24 Autor Geschrieben October 15, 2020 at 12:24 Ja, das war wohl der Grund. Jetzt funktioniert es einwandfrei :) Dankeschön :) Zitieren
Damla Geschrieben October 15, 2020 at 12:40 Autor Geschrieben October 15, 2020 at 12:40 Noch eine allerletzte Frage: Ist es möglich, dass das Status des Programmes beispielsweise nach 8h selbstständig gekillt wird? Und am nächsten Tag soll er wieder automatisch gestartet werden --> Dazu kann ich ja einfach den automatisch schedule einsetzen oder nicht? Danke für die Hilfe :) Zitieren
photron Geschrieben October 15, 2020 at 12:59 Geschrieben October 15, 2020 at 12:59 Das Beenden müsste dein Programm selbst machen. Zum Beispiel den Wert time.time() beim Start des Programm speichern, dann in der Schleife mit dem aktuellen time.time() Wert vergleichen und nach 8h (28800s) das Programm beenden. Das Starten kannst du über den Scheduler machen. Dort den Cron Modus wählen mit "0 8 * * *", damit das Programm jeden Tag um 8 Uhr gestartet wird. 1 Zitieren
Damla Geschrieben November 2, 2020 at 13:11 Autor Geschrieben November 2, 2020 at 13:11 Ist es vielleicht auch möglich, dass ich dem Programm sage, Gib mir nur dann eine Ausgabe, falls du Signale von Channel 1 kriegst. Bisher habe ich selbst definiert, dass mein Channel_number=1 ist (siehe oben). Jedoch ist nun der Schritt, dass auch ein Signal B gegeben wird. Ich habe es mit diesem Schritt versucht, aber irgendwie funktioniert es nicht so ganz: def channel_number (channel): if channel == BrickletIndustrialDigitalIn4V2.CHANNEL_0: # Configure rising edge count (channel 3) with 10ms debounce idi4.set_edge_count_configuration(channel=0, edge_type=1, debounce=1) elif channel == BrickletIndustrialDigitalIn4V2.CHANNEL_1: print('Falsche Richtung') leider kriege ich aber keine Werte so rausgespuckt.. Hier nochmal der ganze Skript: HOST = "localhost" PORT = 4223 UID = "PN5" # Change XYZ to the UID of your Industrial Digital In 4 Bricklet 2.0 import math import time from tinkerforge.bricklet_industrial_digital_in_4_v2 import BrickletIndustrialDigitalIn4V2 from tinkerforge.ip_connection import IPConnection def channel_number (channel): global count if channel == BrickletIndustrialDigitalIn4V2.CHANNEL_0: # Configure rising edge count (channel 0) with 10ms debounce idi4.set_edge_count_configuration(channel=0, edge_type=1, debounce=1) count = idi4.get_edge_count(channel=0, reset_counter=False) elif channel == BrickletIndustrialDigitalIn4V2.CHANNEL_1: print('Falsche Richtung') if __name__ == "__main__": ipcon = IPConnection() # Create IP connection idi4 = BrickletIndustrialDigitalIn4V2(UID, ipcon) # Create device object ipcon.connect(HOST, PORT) # Connect to brick b = 0.0 endTime = time.time() + 60*60*8 print(time.ctime() + "\tStart Logging..") print("-----------------------------------------------------") while time.time() < endTime: time.sleep(1) r = 0.03 # meter alpha = (count * 360) / 1024 # P = Anzahl Impulse, PPR = Impulse pro Umdrehung = 1024 d = b b = (alpha / 360) * 2 * math.pi * r # - b_old if b > 0.0 and b != d: print(time.ctime() + "\t" + str(b)) print("-----------------------------------------------------") print(time.ctime() + "\tEnd of the Log") # input("Press key to exit\n") # Use raw_input() in Python 2 ipcon.disconnect() Zitieren
photron Geschrieben November 2, 2020 at 13:31 Geschrieben November 2, 2020 at 13:31 Entweder du hast nicht ein ganzes Programm gezeigt, oder du rufst einfach deine channel_number() Funktion nicht auf. Zitieren
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.