Jump to content

Uhlhorn

Members
  • Gesamte Inhalte

    104
  • Benutzer seit

  • Letzter Besuch

Posts erstellt von Uhlhorn

  1. Ah, okay. Das ist natürlich ein valides Argument. Dass kann ich einsehen. :-)

     

    Kann man vielleicht nicht nur die Funktion in die API aufnehmen, die auf einen externen True-Type-Font verweist? Also so in der Art:

     

    BrickletLCD128x64.draw_TTCtext(position_x, position_y, font, size, index, encoding, color, text)

    (Also angelehnt an PIL.ImageFont.truetype)

     

     

    Wobei

    font

    ein String mit Pfad und Namen der TTC-Datei ist:

    font = "Fonts/Menlo.ttc"

     

    So was müsste doch gehen, oder?

     

    Und kann man den Speicher vielleicht auch vergrößern?

    LCDugly.jpg.9a3b850e89c0be25e871adbd73ee9e8f.jpg

    LCDnice.jpg.66c0626b9c5cc875cd4429b4ead6f0f9.jpg

  2. 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.

  3. 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

  4. 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.

  5. 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

  6. 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 …

  7. Ja, werde ich gleich mal ausprobieren.

     

    Nachtrag: Ja, das Problem ist behoben! :-)

     

    Ich hatte schon als Kind einen „grünen Daumen“ für alles technische. Und wenn etwas einen Bug hat, dann finde ich ihn schnell. Es gibt Software, wenn ich sie benutze, dann finde ich innerhalb von Minuten ein gutes Dutzend Bugs. :-)

     

    Seit einigen Tagen kenne ich auch den Grund für diese Fähigkeit und werde mit diesem Wissen meine Fähigkeiten erweitern können.

  8. Kannst du mir vielleicht deinen ganzen Order zippen und schicken in dem das OLED-Beispiel ist welches das Problem erzeugt?

    Ja, das mache ich gerne. Allerdings sind die ganzen Scripte etwas unaufgeräumt, da ich ständig daran rumgebastelt habe. Falls also dazu Fragen sind, einfach fragen. ;-)

     

    (Ist als PM raus, weil da möglicherweise urheberrechtlich geschütztes Material drin ist.)

  9. Ich habe inzwischen

    Pillow-5.4.1.tar.gz

    heruntergeladen und auf den Red Brick kopiert. Dann musste ich erst mal herausfinden, wo das Teil liegt, denn die Dokumentation erklärt leider nicht, wo die hochgeladenen Dateien liegen (➢Verbesserungsvorschlag!).

     

    Falls das hier ein anderer Anfänger liest:

    Sie liegen im Userverzeichnis unter „programs“ „Name des Programms“/bin/.

     

    In meinem Fall heißt das Programm: OLED_Hello_World. Daraus ergibt sich der Pfad:

    ~/programs/OLED_Hello_World/bin/

     

    Hier bekommt man das File: Pillow 5.4.1 – Download files

     

    Dann habe ich, wie auf der Website beschrieben,

    tar xvfz Pillow-5.4.1.tar.gz

    erfolgreich ausgeführt. Nun muss ich aber den Namen der .whl-Datei haben, um

    pip install …

    ausführen zu können. Woher bekommt man den?!?

     

    Also habe ich mit

    sudo updatedb

    die Locate-Datenbank aktualisiert und mit

    locate ".whl"

    nach den Wheel-Datein gesucht. Doch eine Wheel-Datei für PIL oder Pillow ist nicht dabei.

    locate „pil*.whl"

    bringt ebenfalls kein Treffer.

     

    Gemäß der Website sollte aber eine .whl-Datei vorhanden sein oder entstehen. Das ist aber nicht der Fall. :-(

     

    pip install Pillow

    wirft auch jedem menge unverständlicher Fehlermeldungen raus.

    Screenshot_2019-03-03_19_25_10.png.e91bc9c123234505ac56819bb13b207b.png

    Screenshot_2019-03-03_19_51_41.thumb.png.8d69a39f6661b8b6b0e1fdacd8864c80.png

  10. Am einfachsten ist es wenn du den RED Brick dafür kurz ins Internet bringst, z.B. mit einem WIFI USB Stick.

    Das ist es leider nicht, weil ich keinen WLAN-Stick habe. Ich nutze seit Mitte der 90er Jahre Computer von Apple, und Apple brachte als einer der ersten Hersteller weltweit WLAN ausgestattete Rechner auf den Markt. Seit diesem Zeitpunkt hatte ich nie wieder einen Computer ohne WLAN. Daher gab es für mich auch nie die Notwendigkeit einen WLAN-Stick anzuschaffen.

     

    Ich müsste erst einen WLAN-Stick bestellen und mehrere Tage auf die Lieferung warten. Und ich bräuchte ihn auch nur für diesen Zeck, sonst nicht.

     

    Nein, ich beziehe mich auf Eure Aussage: „Wenn andere Bibliotheken […] genutzt werden sollen, dann können diese […] mit dem eigenen Programm hochgeladen werden […]“ DAS möchte ich gerne machen. Ich weiß aber nicht wie das geht, das wird nämlich nicht erklärt.

     

    Den externen Link schaue ich mir natürlich auch an. Danke dafür. ;-) Vielleicht bekomme ich es ja hin.

  11. „Wenn andere Bibliotheken, wie die Installierten genutzt werden sollen, dann können diese entweder mit dem eigenen Programm hochgeladen werden oder aber mittels apt-get, pip, pear, npm oder ähnlichen Paketmanagern installiert werden.“

    (Gefunden: Doku RED Brick)

     

    Leider steht da nicht, wie man diese mit dem eigenen Programm hochlädt. Auch eine Suche bei YouTube und Google hat nichts Brauchbares ergeben. Und die Paketmanager, die ich ausprobiert habe, benötigen Internet, welches aber auf dem Red Brick nicht verfügbar ist.

     

    Wie installiere ich das nun? Oder wie lade ich diese Bibliotheken hoch?!?

     

    Ich habe schon die Programme aus meinem lokalen PIL-Ordner mit meinem Programm hochgeladen. Es hat leider nichts geholfen.

     

    Ich bin jetzt völlig gestrandet und weiß nicht mehr weiter. :-(

  12. 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. ;-)

  13. Hast du die bei uns von der Homepage geladen und händisch installiert? Oder per pip?

    Ich bin in Python ein Newbee! Ich habe früher (80er Jahre) mal BASIC und 6502-Assembler programmiert, später ein bisschen PHP und AppleScript.

     

    Was für Bindings? Ich habe mir PyCharm installiert und damit geht das alles.

     

    Vielleicht ist das ja auch das Problem bei dem Stepper Brick?

     

    Wie kann ich es denn besser machen?

  14. Das Testprogramm soll einen String mit großen Fonts anzeigen. Allerdings laufe ich jetzt in eine andere Fehlermeldung außerhalb meines eigenen Programms.

     

    in dem einen Programm funktioniert es, in dem anderen Programm bekomme ich komische Fehlermeldungen. :-(

     

    [size=9pt]Traceback (most recent call last):
      File "/Users/gerhard/PycharmProjects/RedBrick/tinkerforge/ip_connection.py", line 1164, in send_request
        response = device.response_queue.get(True, self.timeout)
      File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/queue.py", line 178, in get
        raise Empty
    _queue.Empty
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "/Users/gerhard/PycharmProjects/RedBrick/OLED-Test.py", line 56, in <module>
        oled.write_pixels(0, 0, WIDTH, HEIGHT, pixels)
      File "/Users/gerhard/PycharmProjects/RedBrick/tinkerforge/bricklet_oled_128x64_v2.py", line 400, in write_pixels
        ret = self.write_pixels_low_level(x_start, y_start, x_end, y_end, pixels_length, pixels_chunk_offset, pixels_chunk_data)
      File "/Users/gerhard/PycharmProjects/RedBrick/tinkerforge/bricklet_oled_128x64_v2.py", line 130, in write_pixels_low_level
        self.ipcon.send_request(self, BrickletOLED128x64V2.FUNCTION_WRITE_PIXELS_LOW_LEVEL, (x_start, y_start, x_end, y_end, pixels_length, pixels_chunk_offset, pixels_chunk_data), 'B B B B H H 448!', '')
      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)[/size]

     

    Hier das betroffene Programm:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    HOST = "localhost"
    PORT = 4223
    UID = "XYZ" # Change to your UID
    WIDTH = 128 # Columns
    HEIGHT = 64 # Rows
    MODE = "1"
    
    import sys
    from PIL import Image, ImageDraw, ImageFont
    from tinkerforge.ip_connection import IPConnection
    from tinkerforge.bricklet_oled_128x64_v2 import BrickletOLED128x64V2
    
    
    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()
    
        image = Image.new(MODE,(WIDTH,HEIGHT))
        font = ImageFont.truetype('Menlo.ttc', 28, 1)
        d = ImageDraw.Draw(image) # get a drawing context
        d.text((5, 15), "-42,0°C", font=font, fill=(255))  # draw text
        image_data = image.load()
    
        # Convert image to black/white pixels
        #image = Image.open(image_data)
        #print("size:  "+str(image_data.size[0]))
        pixels = []
    
        for row in range(HEIGHT):
            for column in range(WIDTH):
                print("row: " + str(row))
                print("column: " + str(column))
                # print(image.size[0])
                # print(image.size[1])
                # print(image_data[column, row])
                if column < image.size[0] and row < image.size[1]:
                    pixel = image_data[column, row] > 0
                else:
                    pixel = False
    
                pixels.append(pixel)
    
        print(pixels)
        print(len(pixels))
        image.show()
    
        oled.write_pixels(0, 0, WIDTH, HEIGHT, pixels)
    
        input('Press key to exit\n') # Use input() in Python 3
        ipcon.disconnect()

×
×
  • Neu erstellen...