Jump to content

Recommended Posts

Geschrieben
Du könntest diesen Timeout einmal testweise erhöhen

Okay, das werde ich mal probieren.

 

Weitere Frage: Wenn die TimeoutException auftritt, kannst du danach dein Programm wieder starten und es läuft erst normal weiter?

Nein, es hilft auch nicht das Drücken der Reset-Taste. Der Brick reagiert auf gar nichts mehr. Ich muss ihn jedes Mal spannungsfrei machen.

Geschrieben

Du könntest an der Stelle entweder […] oder sogar den Count per Callback holen und in der Schleife nur drauf reagieren wenn der Count sich ändert.

 

Das Konzept von Callback ist mir noch nicht ganz klar. Ich vermute, dass es sich um so etwas wie einen Interrupt in Assembler handelt, wo ein Vorgang dem Prozessor mitteilt, dass irgendetwas zu tun ist.

 

Aus dem Wort „Callback“ (Rückruf) leite ich ab, dass sich das Modul meldet, wenn es neue Werte zur Abholung bereit hat.

 

Was ich aber nicht verstehe ist der Ablauf. Wo wird hingesprungen, wenn ein Ereignis ansteht?

 

Vielleicht könnte man die Dokumentation um einen Artikel erweitern, der in das Konzept der Callback-Funktion einführt. ;-)

 

Oder besser: macht ganz kurze YouTube-Videos zu all diesen kleinen Dingen, so in der Art der Quick-Look-Videos von pixelfondue, die meist nur wenige Sekunden lang sind:

Das hätte sogar den schönen Nebeneffekt, dass Eure Produkte sehr viel bekannter werden und der Umsatz steigt. ;-)

Geschrieben

Der Aufbau mit RED Brick ist im Vergleich zum anderen Aufbau leider schwerer zu debuggen. Das hat auch mehr Komplexität (SD Karte, CPU Last bei dem "While-True"-Programm auf dem RED Brick etc).

ja, das kann ich mir gut vorstellen. Daher habe ich den Aufbau so minimiert, dass der Red Brick verzichtbar ist. Man kann es auch nur mit einem Stepper und einem Master nachbilden, siehe meine Antwort #18 vom 28.02. 20:02 Uhr:

« Antwort #19 am: Februar 28, 2019, 20:02:31 »

 

 

Eine andere Frage: Du bekommst jedes mal eine TimeoutException, richtig? Per Default haben wir einen 2,5 Sekunden Timeout im System. D.h. wenn es auf eine Anfrage an den Brick für 2,5 Sekunden keine Antwort gibt, fliegt die Exception. Du könntest diesen Timeout einmal testweise erhöhen (set_timeout auf der IPConnection aufrufen): https://www.tinkerforge.com/en/doc/Software/IPConnection_Python.html

 

Am besten auf 30 Sekunden oder so stellen, damit wir ganz sicher sein können das auch wirklich eine Nachricht verloren geht und nicht nur für eine längere Zeit irgendwo stecken bleibt.

 

Weitere Frage: Wenn die TimeoutException auftritt, kannst du danach dein Programm wieder starten und es läuft erst normal weiter?

Das werde ich heute mal ausprobieren. Ich werde berichten …

Geschrieben

Auch mit 30 Sekunden ändert sich nichts daran. Ich habe jetzt zusammen mit dem Silent Stepper und dem Master (sonst nichts) dieses Programm benutzt:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# python 3

HOST = "localhost"
PORT = 4223
UID_r = "Ehv" # Change XYZ to the UID of your Rotary Encoder Bricklet 2.0
UID_s = "5VH7xb" # Change XXYYZZ to the UID of your Silent Stepper Brick


from tinkerforge.ip_connection import IPConnection
from tinkerforge.brick_silent_stepper import BrickSilentStepper

from tinkerforge.ip_connection import IPConnection
from tinkerforge.bricklet_rotary_encoder_v2 import BrickletRotaryEncoderV2

from random import *
import time

alt = 0
Zeitpunkt = time.time() + 10.1
ZeitDiff = time.time() - Zeitpunkt

if __name__ == "__main__":
    ipcon = IPConnection() # Create IP connection
    re = BrickletRotaryEncoderV2(UID_r, ipcon) # Create device object
    ss = BrickSilentStepper(UID_s, ipcon) # Create device object

    ipcon.connect(HOST, PORT) # Connect to brickd
    ipcon.set_timeout(30)
    # Don't use device before ipcon is connected

    ss.set_motor_current(850)  # 800mA
    ss.set_minimum_voltage(6000)
    ss.set_step_configuration(ss.STEP_RESOLUTION_64, True)  # 1/8 steps (interpolated)
    ss.set_max_velocity(4000)  # Velocity 2000 steps/s

    # Slow acceleration (500 steps/s^2),
    # Fast deacceleration (5000 steps/s^2)
    ss.set_speed_ramping(1000, 1000)

    ss.set_basic_configuration(1, 250, 10, 1000, 65535, 65534, 65535, 1)
    #ss.set_basic_configuration(1, 250, 10, 1000, 65535, 65536, 65536, 1)

    while 1:
        # Get current count without reset
        #count = re.get_count(False)

        Schritte = round(random()*100000)+10000
        Richtung = round(random())
        Zeit = round(random()*30+1,1)
        Geschwindigkeit = round(random()*40000)+15000
        Beschleunigung = round(random()*40000)+10000

        if ZeitDiff <= 0:
            if Richtung == 1: # Rechts drehen
                ss.full_brake()
                ss.enable()  # Enable motor power

                print("Schritte: " + str(Schritte))
                if Richtung == 1:
                    print("Richtung: rechts")
                else:
                    print("Richtung: links")
                print("Zeit:     " + str(Zeit))
                print("Geschwindigkeit: " + str(Geschwindigkeit))
                print("Beschleunigung: " + str(Beschleunigung) + "\n")

                ss.set_speed_ramping(Beschleunigung, Beschleunigung)
                ss.set_max_velocity(Geschwindigkeit)
                ss.set_steps(Schritte)  # Drive „Schritte“ steps forward
                Zeitpunkt = time.time()+Zeit

            if Richtung == 0: # Links drehen
                ss.full_brake()
                ss.enable()  # Enable motor power

                print("Schritte: " + str(Schritte))
                if Richtung == 1:
                    print("Richtung: rechts")
                else:
                    print("Richtung: links")
                print("Zeit:     " + str(Zeit))
                print("Geschwindigkeit: " + str(Geschwindigkeit))
                print("Beschleunigung: " + str(Beschleunigung) + "\n")

                ss.set_speed_ramping(Beschleunigung, Beschleunigung)
                ss.set_max_velocity(Geschwindigkeit)
                ss.set_steps(-Schritte)  # Drive „Schritte“ steps backward
                Zeitpunkt = time.time()+Zeit

        ZeitDiff = Zeitpunkt-time.time()
        #print("ZeitDiff: "+str(ZeitDiff))
        #print(" ")

        if ss.get_current_velocity() == 0:
                ss.disable()
                ZeitDiff = -1


    input("Press key to exit\n") # Use input() in Python 3
    ss.disable()
    ipcon.disconnect()

 

Herausgekommen ist nach einer erfolgreichen Bewegung diese Fehlermeldung: Siehe Screenshot.

 

Mit dem BrickViewer 2.4.0 beta2 hängt es sich genau so auf. Das Brick kommuniziert nicht mehr mit dem BrickViewer, aber der Motor läuft unverändert weiter.

Screenshot_2019-03-06_21_32_43.thumb.png.7b2fec006b0777b3136a18e1ccb81d81.png

Geschrieben

Ich hab das Test-Script was du zuvor gepostet hattest für 2x je ~8 Stunden am Stück laufen lassen ohne Probleme.

 

Die Exception bedeutet das du auf einen Getter (get_current_velocity in diesem Fall) keine Antwort bekommen hast.

 

Das heißt entweder die Anfrage ist verloren gegangen oder die Antwort auf die Anfrage.

 

Ich würde erwarten das du auch mit einem

 

while True:
    ss.get_current_velocity()

 

ohne den ganzen anderen Code das Problem erzeugen kannst?

 

Wenn die Kommunikation einmal gestört war, bleibt Sie gestört und du musst erst das Brick vom Strom trennen damit es wieder funktioniert.

 

Am einfachsten wäre es ja noch wenn irgendein Hardwaredefekt vorliegen würde, aber mir fällt nichts ein was diese Symptome erzeugen könnte.

Geschrieben

Ich würde erwarten das du auch mit einem […]

ohne den ganzen anderen Code das Problem erzeugen kannst?

Das müsste ich ausprobieren.

 

Am einfachsten wäre es ja noch wenn irgendein Hardwaredefekt vorliegen würde, aber mir fällt nichts ein was diese Symptome erzeugen könnte.

Ich bin inzwischen am überlegen, ob ich noch einen Silent Stepper und einen Master bestelle, nur um einen einzelnen Hardwaredefekt sicher ausschließen zu können.

 

Von dem ganzen Umgestecke ist mir jetzt auch noch der Kühlkörper abgegangen. :-( Kann man den mit irgend etwas wieder ankleben? Ansonsten nehme ich Wärmeleitpaste für Prozessoren und eine mit dem 3D-Drucker gedruckten Haltespange. Das müsste ja auch funktionieren.

Geschrieben

Dass der Kühlkörper abbricht ist ja so schonmal nicht gedacht. Normalerweise sollte der absolut fest sitzen und nicht so ohne weiteres abbrechen können.

 

Ich würde vorschlagen wir schicken dir erstmal einen neuen Master Brick und einen neuen Silent Stepper Brick. Dann hast du einen Ersatz für den Silent Stepper Brick mit dem abgebrochenen Kühlkörper und wir können schauen ob deinen Timeouts ein Hardwareproblem zugrunde liegt oder nicht.

Geschrieben

Ich habe die Teile heute erhalten und gleich getestet:

 

Der neue Stepper läuft nun einwandfrei in allen (getesteten) Variationen, also auch mit dem alten Master. Wollt Ihr den alten Stepper zurück haben, um nach der Ursache zu suchen zu können?

 

Auch beim neuen Stepper ist der Kühlkörper wieder abgebrochen. Dabei habe ich so aufgepasst ihn möglichst nicht zu berühren. Doch ich bin wohl beim ersten Herausziehen des Steckers doch ganz leicht dagegen gekommen. Jedenfalls war er plötzlich lose.

 

Der Kleber, mit dem der Kühlkörper befestigt ist, haftet nicht am Aluminium. Vielleicht hilft es, wenn man das Aluminium vorher mit eine Feile oder Sandpapier aufraut, um eine größere Oberfläche zu erhalten?

 

Egal, ich habe mir eine Haltespange konstruiert (siehe Foto). Falls jemand Interesse daran hat, ich stelle die Fusion-360-Datei oder eine STL gerne zur Verfügung. ;-)

IMG_2377.jpg.96ec9d4b27ae3d6a136079def6196098.jpg

Geschrieben

Schon wieder der Kühlkörper abgefallen? :o

 

Normalerweise sollte der absolut Bombenfest sitzen. Der Kleber den wir da verwenden ist genau dafür gedacht. Wir gehen Montag den Lagerbestand durch und schauen ob wir weitere Kühlkörper abbrechen können.

 

Anrauen sollte mit dem Kleber den wir verwenden soweit ich weiß nicht notwendig sein. Eventuell waren ein paar der Kühlkörper etwas "fettig" und wir hätten erst einmal mit IPA drüberwischen sollen? Wir werden das untersuchen.

 

Wenn du den defekten Silent Stepper Brick zurück schickst können wir schauen was dort der Grund für die verlorenen Nachrichten ist. Es reicht wenn du den Brick einfach per Post in einem Luftpolsterumschlag oder so verschickt. Muss nicht schnell gehen.

Geschrieben

Ja, werde ich zurücksenden. Kommt die Tage …

 

Das mit dem Kühlkörper ist jetzt nicht so dramatisch, weil ich den Schrittmotor im Moment nur für einen Zeiger verwende. Ich brauche keine Drehmomente und fahre ihn mit entsprechend geringem Strom.

 

Kann man ihn nicht mit dem gleichen Kleber wieder ankleben? Ansonsten verwende ich meine Spange und einen Tropfen Wärmeleitpaste.

Join the conversation

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

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...