Jump to content

Recommended Posts

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

 

 

Link to post
Share on other sites

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.

Link to post
Share on other sites

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.

Link to post
Share on other sites

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 🙈

Link to post
Share on other sites

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.

Link to post
Share on other sites

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

 

1607668649_WhatsAppImage2020-10-15at12_30_27.thumb.jpeg.a64c5f972a8fa8a86fb94e369a771166.jpeg

Und hier die Ergebnisse von Brick Viewer, welcher mir konstante Werte angibt, bis eine Umdrehung abgeschlossen ist.

1405283580_WhatsAppImage2020-10-15at12_30_26.thumb.jpeg.212478a6a783c85f28f4368ddfbb7211.jpeg

Link to post
Share on other sites

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.

  • Like 1
Link to post
Share on other sites

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 :)

Link to post
Share on other sites

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.

  • Like 1
Link to post
Share on other sites
  • 3 weeks later...

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()

 

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...