Jump to content

Uhlhorn

Members
  • Gesamte Inhalte

    104
  • Benutzer seit

  • Letzter Besuch

Posts erstellt von Uhlhorn

  1. Also, auch am Stepper Brick und am CD Brick zeigt das OLED nicht richtig an. Ich habe auch verschiedene Bricklet-Anschlüsse getestet. Es ist egal.

     

    Wenn ich das Programm vom Red Brick laufen lassen (ohne PC), ist es derselbe Fehler. Manchmal verschwinden sogar andere Zeilen.

     

    Hier das Programm, was ich getestet habe. Es beschreibt die Zeilen 7 bis 0 nacheinander. Dann baut es mit 8 Befehlen 8 Zeilen gleichzeitig auf. Schließlich beginnt es von vorn.

     

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    HOST = "localhost"
    PORT = 4223
    UID = "Hhh" # Change XYZ to the UID of your OLED 128x64 Bricklet 2.0
    
    from tinkerforge.ip_connection import IPConnection
    from tinkerforge.bricklet_oled_128x64_v2 import BrickletOLED128x64V2
    import time
    
    if __name__ == "__main__":
        ipcon = IPConnection() # Create IP connection
        oled = BrickletOLED128x64V2(UID, ipcon) # Create device object
    
        ipcon.connect(HOST, PORT) # Connect to brickd
        # Don't use device before ipcon is connected
    
        # Clear display
        oled.clear_display()
    
        # Write "Hello World" starting from upper left corner of the screen
    
        while True:
            line = 7
            while line >= 0:
                oled.clear_display()
                Text = str(line)+": Hello World"
                print(Text)
                oled.write_line(line, 0, Text)
                line = line-1
                time.sleep(0.2)
    
            oled.write_line(0, 0, "0: Hello World")
            oled.write_line(1, 0, "1: Hello World")
            oled.write_line(2, 0, "2: Hello World")
            oled.write_line(3, 0, "3: Hello World")
            oled.write_line(4, 0, "4: Hello World")
            oled.write_line(5, 0, "5: Hello World")
            oled.write_line(6, 0, "6: Hello World")
            oled.write_line(7, 0, "7: Hello World")
            time.sleep(3)
            print()
    
        input("Press key to exit\n") # Use input() in Python 3
        ipcon.disconnect()
    

  2. Moin,

     

    als Anfänger hat man es ziemlich schwer.

     

    Okay, ich habe das Script zum OLED 128x64 Bricklet 2.0 hergenommen um ein Bild auszugeben. Wenn ich in Photoshop stellte Bitmaps lade, klappt es prima.

     

    Nun erstelle ich aber die Bitmap in PIL. Und nun klappt es gar nicht mehr. :-(

     

    Also, beim Aufruf von

    image_data[0, 0]

    bekomme ich die Fehlermeldung

    TypeError: 'Image' object is not subscriptable

     

    Bei den geladenen Bitmaps macht der Aufruf keine Probleme, bei den selbst erstellten Bitmaps aber schon.

     

    Das funktioniert:

    …
    image_data = image.load()
    pixel = image_data[column, row] > 0
    …

     

    Das funktioniert nicht:

    …
    image_data = Image.new('1', (128,64))
    pixel = image_data[column, row] > 0
    …

     

    Beides sind 1-Bit-Bilder in 128 x 64 Pixel.

     

    Hier ein Beispiel:

     

    from PIL import Image, ImageDraw, ImageFont
    
    Mode = "1"
    Size = (21 * 5, 64)
    
    # make a blank image for the text, initialized to transparent text color
    image_data = Image.new('1', (128,64))
    
    # get a font
    fnt = ImageFont.truetype('Menlo.ttc', 28, 1)
    
    # get a drawing context
    d = ImageDraw.Draw(image_data)
    
    # draw text, half opacity
    d.text((15,15), "-42°C", font=fnt, fill=(255)) # draw text
    
    print(image_data.size[0])
    print(image_data.size[1])
    
    print(image_data[0, 0])
    print()
    
    image_data.show()

     

    In dem Ordner mit dem Script muss die Schrift Menlo liegen (im Anhang).

    Menlo.ttc.zip

  3. Moin,

     

    irgendwie scheinen in den meisten Sachen Bugs drin zu sein (oder ich habe eine besondere Fähigkeit diese zu finden).

     

    Das OLED 128x64 Bricklet 2.0 funktioniert nicht wie erwartet:

     

    Das ist mein Aufbau:

    Master (A)——— PTC

          (B)——— OLED

          ©———

          (D)———

    (An den Master sind ein OLED und ein PTC Bricklet angeschlossen)

     

    Wenn ich das erste Beispielprogramm von aus der Tinkerforge-Doku ausführe, bleibt der Bildschirm leer.

    Python - OLED 128x64 Bricklet 2.0

     

    Ändere ich hingegen die Zeile der Ausgabeposition des Textes auf 3, dann wird „Hello World“ korrekt ausgegeben.

     

      oled.write_line(3, 0, "Hello World")

     

    In den Zeilen 0, 1 und 2 kann man keinen Text ausgeben.

  4. So, hier ist eine Minimalkonfiguration:

     

    Ich verwende nur einen Master und einen Stepper, keine weiteren Bricks oder Bricklets. (Und ich verwende das Netzteil und nicht den Akku, Letzteren habe ich nur für’s Foto als Symbolstromquelle genommen.)

     

    • Stecke ich das USB-Kabel in den Master und lasse mein Programm auf dem PC laufen hängt sich das Ganze sehr schnell auf.
    • Stecke ich das USB-Kabel in den Stepper, läuft alles problemlos (getestet über 40 Minuten)

    Ich habe es auch mit Bricklets (Rotary Encoder + PTC) am Stepper angeschlossen probiert. Auch das verursacht nicht das Problem.

     

    Das Problem scheint irgendwie bei der Kommunikation zwischen den Bricks zu liegen. Es tritt zwischen Stepper und Red Brick auf wie auch zwischen Stepper und Master.

     

    In den Fotos sind beine Minimalaufbauten zu sehen. Am Ende hängt das modifizierte Programm (Motorströme verringert, Thresholds hoch gesetzt, Rotary Encoder auskommentiert)

     

    #!/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
        # Don't use device before ipcon is connected
    
        ss.set_motor_current(500)  # 800mA
        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()

    IMG_2356.jpg.2d8be3b614dc91f8e305a1ad7ce5dee6.jpg

    IMG_2355.jpg.cc7e028e1796b3594b5f3b5099591204.jpg

  5. So, ich habe jetzt ein Programm, das den Motor mit zufälligen Werten dreht. Und das hängt sich manchmal nach ein paar Minuten auf, manchmal läuft es auch ’ne viertel Stunde oder so.

     

    Hier habe ich mal ein nicht gelistetes Video dazu gemacht. Der Stack besteht (von unten nach oben) aus einer Stromversorgung, einem Red Brick, einem Master, einem DC und dem Silent Stepper. Das Rotary Bricklet ist an den Stepper angeschlossen. Die Stromversorgung hängt an dem untersten Modul.

     

    Die Versionen der Module sind im Screenshot zu sehen.

     

    Hier das Video:

     

    Danach habe ich dasselbe nur mit der Stromversorgung, dem Master und dem Stepper gemacht. Auch das hängt sich auf.

     

    Hier das Programm dazu, was allerdings noch etwas unaufgeräumt ist. Ich habe halt damit experimentiert.

     

    #!/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
        # Don't use device before ipcon is connected
    
        ss.set_motor_current(800)  # 800mA
        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, 800, 0, 1000, 500, 500, 1000, 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()

    Screenshot_2019-02-27_19_13_38.png.e73a774ef8c436822ddf10e0ba141166.png

  6. Wenn du in allen Testes das selbe USB Kabel verwendest dann spielt es natürlich keine Rolle, ob du das einen Master oder RED Brick zwischen hast.

    Das Problem tritt auch ganz ohne USB-Kabel auf, wenn ich das Programm auf dem Red Brick ausführe. Und es ist (bei mir) reproduzierbar.

     

    Wir haben das jetzt verbessert und brickv meldet unerwarteter Fehler jetzt mit mehr Details. Teste mal bitte diese Version: …

    Flash damit bitte den Brick nochmal. Ich würde gerne sehen welchen Fehler du da erzeugen kannst denn ich hier nicht reproduziert bekomme.

    Das werde ich gerne machen.

  7. Wenn ich Bewegungsanweisungen per set_steps() an den Treiber sende und diese immer wieder mit full_brake() unterbreche um anschließend eine neue Bewegung zu starten, dann hängt er sich immer mal wieder wie beschrieben auf. Das kann man manuell in Brick Viewer provozieren oder mit einem Script über USB-Kabel und auch mit einem Script auf dem Red Brick, also ohne USB-Kabel.

     

    Der läuft also nicht stabil! Zumindest meiner nicht.

     

    Ich werde heute Nacht mal ein hier gekauftes nagelneues USB-Kabel verwenden. Nur um sicher zu sein.

     

    Dann werde ich außerdem ein Script erstellen, welches zufällige Bewegungen in schneller Folge erzeugt. Ich bin mir sicher, dass ich damit den Brick zum Aufhängen bekomme. ;-)

  8. Hi borg,

     

    wie kannst Du diese Werte aus den Bilder ableiten?!?

     

    Schrittmotoren sind stromgetrieben …

    Ah, okay, das ergibt auch einen Sinn.

     

    Ich habe mich auch in den Einstellungen langsam nach oben getastet. Mehr als lauwarm wird er nicht. Und die Temperatur ist wohl eins der wichtigen Kriterien.

     

    Nun habe ich noch mal tief darüber nachgedacht und bin zu folgendem Schluss gekommen:

    So wie sich mir das im Moment darstellt, ist es eine Frage von Drehmoment und Temperatur. Der Strom muss so hoch eingestellt sein, dass der das für die Arbeit erforderliche Drehmoment hat. Gleichzeitig muss man eine zu hohe Temperatur vermeiden. Und bei Akkubetrieb will man ja auch Strom sparen. Daher muss man die Werte nach Bedarf auswählen.

     

    Nach unten wird der Strom durch das Drehmoment begrenzt, nach oben durch die Temperatur. Ich wähle den Strom also so aus, dass er genug Kraft hat, aber möglichst wenig warm wird.

  9. Also, manchmal geht es eine ganze Weile, manchmal nicht. Dann bekomme ich eine Fehlermeldung in meinem Programm, wobei ein Teil wohl aus anderen Modulen kommt:

    • bricklet_rotary_encoder_v2.py
    • ip_connection.py

     

      File "/Users/gerhard/PycharmProjects/RedBrick/tinkerforge/bricklet_rotary_encoder_v2.py", line 124, in get_count
        return self.ipcon.send_request(self, BrickletRotaryEncoderV2.FUNCTION_GET_COUNT, (reset,), '!', 'i')
      File "/Users/gerhard/PycharmProjects/RedBrick/tinkerforge/ip_connection.py", line 1173, in send_request
        raise Error(Error.TIMEOUT, msg)
    tinkerforge.ip_connection.Error: Did not receive response for function 1 in time (-1)

     

    Vielleicht hilft das ja bei der Analyse.

×
×
  • Neu erstellen...