Jump to content

Uhlhorn

Members
  • Gesamte Inhalte

    104
  • Benutzer seit

  • Letzter Besuch

Alle erstellten Inhalte 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. Ich habe jetzt mal das Script auf dem Red Brick laufen lassen, mit dem selben Ergebnis. (Ich habe es gefilmt und lade es später hoch.) Jetzt nehme ich mal ein anderes Brick und schließe dort das OLED an.
  3. Okay, das werde ich mal probieren. 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.
  4. Das sind ja alles ganz neue Module. Die Stecker sind alle in Ordnung, die sind auch nicht zu fein für mich, ich kann schon seit den 90er Jahren SMD löten. ;-) Jedenfalls keine umgeknickten Beine, kein Schmutz, nichts Auffälliges. Jetzt teste ich das Programm mal vom Red Brick aus. Wenn dort der Fehler auch auftritt, liegt es nicht am USB-Port oder Kabel. :-)
  5. Tja, es funktioniert aber trotzdem nicht. Ich kann ja mal davon ein Video machen.
  6. 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
  7. Mit dem BrickViewer geht es, mit dem Script von der Website nicht.
  8. Merkwürdig. Bei mir verabschiedet sich das Programm immer mit dem obigen Fehler, wenn ich den Stepper nicht direkt ansteuere. Und das immer innerhalb von wenigen Minuten. Vielleicht ist ja etwas mit dem Stepper nicht in Ordnung. Nur wenn ich das USB-Kabel direkt anschließe, läuft es zuverlässig.
  9. 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.
  10. 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()
  11. Also, ich habe jetzt einen Master, den Silent Stepper, ein Netzteil und ein Schrittmotor. Der Master ist unter den Stepper gesteckt. Schließe ich das USB-Kabel an den Master an, hängt sich der Stepper nach kurzer auf. Schließe ich es an den Stepper an, läuft es länger. (Zumindest hängt es sich nicht so schnell auf. Ich mache mal einen Langzeittest)
  12. Es lief jetzt eine ganze Zeit lang gut. Jetzt habe ich wieder den Stepper auf den den Red Brick gesetzt. Und schon habe ich sofort Ausfälle. Ich habe jetzt einen PTC (will Motortemperatur messen) und den Rotary Encoder an den Silent Stepper angeschlossen und bekomme nur noch Timeouts!
  13. Hmm, jetzt läuft es störungsfrei. Vielleicht bricht die Akkuspannung zu sehr ein, dass sie diese Probleme verursacht. Ich teste das nachher noch mal mit dem Akku.
  14. Habe gerade mein Netzteil bekommen. Nun teste ich es mal in der Minimalkonfiguration. Dafür muss die Zeile 44 für den Rotary Encoder auskommentiert werden, damit das Script läuft. Ich teste es gerade und im Moment läuft er gerade störungsfrei. :-/ Ich lasse ihn mal länger laufen.
  15. Ja, das sollte gehen. Bei meinen Versuchen lief es so etwas länger, was aber auch Zufall sein kann. Ich bin mir noch nicht sicher, ob der Rotary Encoder einen Einfluss hat. Ich habe noch nicht alle Kombis durch.
  16. Der Fehler tritt in jeder Kombination auf. Und wenn das Programm auf dem PC läuft, bekomme ich die obige Fehlermeldung. Die Fehlermeldung vom Red Brick muss ich nachliefern.
  17. 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()
  18. 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. Das werde ich gerne machen.
  19. Ja, okay, da sind aber auch andere PCX4-Motore, auch welche mit 12 V und 400 mA. Ist halt die Frage, welcher Teil der Typenbezeichnung relevant ist. Zumindest ist das aber schon mal ein grober Anhaltspunkt, das stimmt.:-)
  20. 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. ;-)
  21. Hi borg, wie kannst Du diese Werte aus den Bilder ableiten?!? 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.
  22. 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.
  23. Oh, jetzt kann ich ohne wieder flashen. :-) Ich habe ein paar Mal den Port hin und her geschaltet (was ich vorher aber schon gemacht habe). Aber davor habe ich erst versucht mit „Connect“ eine Verbindung hinzubekommen. Irgendwie scheint mir der Brick Viewer sehr buggy zu sein, kann das sein?
  24. Nach studieren der FAQ wollte ich den Silent Stepper 2.0 neu flashen, doch jetzt ist er ganz tot. :-( Ich habe die Tasten versehentlich falsch gedrückt: Reset gedrückt und gehalten Erase gedrückt und gehalten Reset losgelassen Erase losgelassen. Jetzt geht keine LED mehr und ich bekomme immer die Meldung „Could not connect to Brick“. Und nun?!?
×
×
  • Neu erstellen...