Jump to content

saschaho

Members
  • Gesamte Inhalte

    13
  • Benutzer seit

  • Letzter Besuch

Posts erstellt von saschaho

  1. Also von der Genauigkeit her ist das wirklich gut. Wir haben hier einen (60W) Laser Cutter stehen, der ist auch nicht viel genauer! Der Laser ist natürlich ein ganzes Stück besser fokussiert, das würde jetzt hier im Ergebnis den Unterschied machen.

     

    Die Kollimatorlinse kostet auch wahrscheinlich das Hundertfache ;D

    Ich will aber noch an der "Verweildauer" bei kleinen Steps arbeiten.

     

     

    Sascha

     

  2. Die Hardware ist nicht so schwer nachzubauen.

    Es sind 2 Schlitten aus 2 samsung DVD-Rom Laufwerken.

    Die Schlitten bewegen die Laser in den Laufwerken.

    Statt des schwachen Originallasers habe ich auf eine Einheit eine Platte geschraubt (y-Richtung) und an den anderen den roten 300mW Laser gestrapst.

    Unter http://www.heise.de/hardware-hacks/projekte/Laserplotter-1351340.html gibt es mehr Infos zur Hardware.

     

    Hier also mein Programm:

    #!/usr/bin/env python

    # -*- coding: utf-8 -*-

    from __future__ import division

    HOST = "localhost"

    PORT = 4223

    UID = "a4JriVK3qZ8"

    UID_step1 ="9p3kGiXvHS3"

    UID_step2 ="a4LCLTU6G8m"

    UID_rel = "7Fq"

    UID_lcd = "8vA"

     

    from tinkerforge.ip_connection import IPConnection

    from tinkerforge.brick_stepper import Stepper

    from tinkerforge.brick_master import Master

    from tinkerforge.bricklet_dual_relay import DualRelay

    from tinkerforge.bricklet_lcd_20x4 import LCD20x4

     

    import time

    import string

    import math

     

    lsr= " "

    xur = 0

    yur = 0

    x = 0

    y = 0

    al = 0.00

    xsp = 0

    ysp = 0

    xysleep = 0.00

    i = 1

    fakt = 1.000

    sl = 0

    xdif = 1090.0

    ydif = 1090.0

    ms = 70

     

    if __name__ == "__main__":

    ipcon = IPConnection(HOST, PORT) # Create IP connection to brickd

    master = Master(UID) # Create device object

    ipcon.add_device(master) # Add device to IP connection

    stepperx = Stepper(UID_step1) # Create device object

    ipcon.add_device(stepperx) # Add device to IP connection

    steppery = Stepper(UID_step2) # Create device object

    ipcon.add_device(steppery) # Add device to IP connection

    dr = DualRelay(UID_rel) # Create device object

    ipcon.add_device(dr) # Add device to IP connection

    lcd = LCD20x4(UID_lcd) # Create device object

    ipcon.add_device(lcd) # Add device to IP connection

     

    lcd.backlight_on()

    fobj = open("C:\\Dokumente\\Plots\\test1.plt", "r")

    content = fobj.read()

    fobj.close()

    dataset = content.split("\n")

    lcd.write_line(0, 0, "Achtung Laser Kl. 3b")

    dr.set_state(True, False)

    stepperx.enable()

    stepperx.set_speed_ramping(600,600)

    stepperx.set_motor_current(350)

    stepperx.set_step_mode(8)

    stepperx.set_max_velocity(400) # Velocity 400 steps/s

    steppery.enable()

    steppery.set_speed_ramping(600,600)

    steppery.set_motor_current(350)

    steppery.set_step_mode(8)

    steppery.set_max_velocity(400) # Velocity 400 steps/s

    stepperx.set_current_position(0)

    steppery.set_current_position(0)

    stepperx.set_target_position(1090)

    steppery.set_target_position(1090)

    time.sleep(4)

    stepperx.set_current_position(0)

    steppery.set_current_position(0)

    xur = 0.0

    yur = 0.0

    for data in dataset:

    arr = data.split(" ")

    if arr[0] <> "SP1;" and arr[0] <> "SP0;":

    lsrx = arr[0]

    lsr = lsrx[0]+lsrx[1]

    if len(lsrx) == 3:

    x = int(lsrx[2])

    elif len(lsrx) == 4:

    x = int(lsrx[2]+lsrx[3])

    elif len(lsrx) == 5:

    x = int(lsrx[2]+lsrx[3]+lsrx[4])

    elif len(lsrx) == 6:

    x = int(lsrx[2]+lsrx[3]+lsrx[4]+lsrx[5])

    elif len(lsrx) == 7:

    x = int(lsrx[2]+lsrx[3]+lsrx[4]+lsrx[5]+lsrx[6])

    lsry = arr[1]

    if len(lsry) == 2:

    y = int(lsry[0])

    elif len(lsry) == 3:

    y = int(lsry[0]+lsry[1])

    elif len(lsry) == 4:

    y = int(lsry[0]+lsry[1]+lsry[2])

    elif len(lsry) == 5:

    y = int(lsry[0]+lsry[1]+lsry[2]+lsry[3])

    elif len(lsry) == 6:

    y = int(lsry[0]+lsry[1]+lsry[2]+lsry[3]+lsry[4])

     

    xdif = abs(xur-x)

    ydif = abs(yur-y)

    if xdif == 0:

    xdif = 1

    if ydif == 0:

    ydif = 1

    if xdif > ydif:

    fakt = xdif/ydif

    ysp = int(ms / fakt)+1

    xsp = ms

    xysleep = (xdif/ms)+0.4

    if xdif <= ydif:

    fakt = ydif/xdif

    ysp = ms

    xsp = int(ms / fakt)+1

    xysleep = (ydif/ms)+0.4

     

    power = stepperx.get_stack_input_voltage()

    if lsr == "PD":

    dr.set_state(True, True)

    time.sleep(0.1)

    lcd.write_line(1, 0, "Laser An          ")

    lcd.write_line(2, 0, "brennt " + str(x) +" "+ str(y) + "  ")

    lcd.write_line(3, 0, "Spannung " + str(power) + " mV ")

     

    if lsr == "PU":

    lcd.write_line(1, 0, "Laser Aus          ")

    lcd.write_line(2, 0, "faehrt " + str(x) +" "+ str(y) + "  ")

    lcd.write_line(3, 0, "Spannung " + str(power) + " mV ")

    dr.set_state(True, False)

    xsp = ms * 8

    ysp = ms * 8

    xysleep = xysleep / 4

     

    print xdif, ydif, x, y, xsp, ysp, xysleep, fakt

    stepperx.set_max_velocity(xsp) # Velocity steps/s

    steppery.set_max_velocity(ysp) # Velocity steps/s

    stepperx.set_target_position(x)

    steppery.set_target_position(y)

    xur = x

    yur = y

    time.sleep(xysleep)

    dr.set_state(True, False)

    time.sleep(0.2)

     

    dr.set_state(False, False)

    time.sleep(1)

    stepperx.set_max_velocity(400) # Velocity 400 steps/s

    steppery.set_max_velocity(400) # Velocity 400 steps/s

    stepperx.set_target_position(-1090)

    steppery.set_target_position(-1090)

    lcd.write_line(2, 0, "Ich habe fertig    ")

    time.sleep(10)

    stepperx.disable()

    steppery.disable()

    lcd.clear_display()

    lcd.backlight_off()

    raw_input('Press key to exit\n') # Use input() in Python 3

    ipcon.destroy()

     

     

    Vor allem an der Umwandlung des Plotfiles in die Einschaltsignale und in die xy Koordinaten habe ich lange getüftelt.

    Vielleicht hat da jemand eine elegantere Lösung

     

    Sascha

     

  3. Moin,

     

    ich habe den Laserplotter aus der ct "Mach Flott den Schrott" mal nachgebaut.

    Die Plotterfläche beträgt ca 40 x 40mm. Die Auflösung beträgt bei mir 53 Steps/mm.

    Verwendet habe ich :

    Step Down Power Supply

    Master-Brick

    2 Stepper-Bricks

    Dual-Relais Bricklet

    20x4 LCD

    Python

    CorelDraw malings speichere ich als .plt ab. Anschl muss ich nur den "Vorspann" bis zum 1. SP1 entfernen.

    Nach Einlesen des Files und Umwandlung der Zeilen in PU, PD ,x und y Koordinaten werden die Fahrzeiten, Laser-On Zeiten und Pausenzeiten berechnet. Ist einiges an Tüftelei, da ja von den Schrittmotoren keine Rückmeldung kommt.

    Die Stepper stehen auf 350mA, der 300mW Laser (Vorsicht Klasse 3b) wird über eine regelbare Konstantstromquelle versorgt und über eins der Relais geschaltet. Das 2. Relais schaltet den Lüfter am Beginn ein.

    Sonst hat man den Rauch im Strahl.

    Da ich nicht die "Leuchte" in Python bin, möchte ich den Code hier nicht veröffentlichen. Auf Nachfrage gibt´s aber selbstverständlich Teile davon und zus. Infos.

    Anbei noch 2 Bilder.

     

    Grüße

     

    Sascha

    [[Category:Projekte]]

    Foto1.thumb.JPG.3a26276e619635aff79fde6690194c0d.JPG

    Foto2.JPG.a0e8e57291ddc9c5e5d6b48421f4bf27.JPG

  4. @batti

     

    Habe die Aufrufe aus der Schleife rausgenommen.

     

    ....

    js.register_callback(js.CALLBACK_ANALOG_VALUE, posi)

    js.register_callback(js.CALLBACK_PRESSED, cb_pressed)

     

    print "ready"

     

    while br == 0:

     

    dc.set_velocity(sp) # speed

    servo.set_position(0, st) # Set position

    print str(sp), str(st)

    ....

     

    Ist aber wie gehabt, der print-Befehl zeigt mir die umgerechneten Joystickwerte aber Motor und Servo reagieren nicht :'(.

    ??????

     

  5. Hallo Tinkerforge Gemeinde,

     

    nachdem ich diese tollen Klötzchen entdeckt hatte, bin ich nun auch Fan geworden und bastle an den ersten Versuchen.

    Bin jetzt nicht die große Leuchte im Programmieren, aber es geht voran.

    Jetzt habe ich alledings ein seltsames (für mich) Problem.

     

    Ich bastle ein ferngesteuertes Auto mit einigen Features.

    Hier mal der Phyton-Code in Auszügen:

     

     

    ...

    from tinkerforge.ip_connection import IPConnection

    from tinkerforge.brick_master import Master

    from tinkerforge.bricklet_joystick import Joystick

    from tinkerforge.brick_dc import DC

    from tinkerforge.brick_servo import Servo

    sp = 0

    st = 0

    br = 0

     

    def posi(x,y):

    global sp, st

    sp = int((-32767+y*16)/2)

    st = int(4095-x*2)

     

    def cb_pressed():

    global br

    br = 1

     

    if __name__ == "__main__":

     

    ipcon = IPConnection(HOST, PORT) # Create IP connection to brickd

     

    dc = DC(UID_DC) # Create device object

    ipcon.add_device(dc) # Add device to IP connection

     

    master = Master(UID) # Create device object

    ipcon.add_device(master) # Add device to IP connection

     

    js = Joystick(UID_JS) # Create device object

    ipcon.add_device(js) # Add device to IP connection

     

    servo = Servo(UID_SERVO) # Create device object

    ipcon.add_device(servo) # Add device to IP connection

     

    js.set_debounce_period(200)

    js.set_analog_value_callback_period(50)

    dc.set_pwm_frequency(2000) # Use PWM frequency of 10khz

    dc.set_drive_mode(1) # use 1 = Drive/Coast instead of 0 = Drive/Brake

     

    dc.enable()

    dc.set_acceleration(65000) # Slow acceleration

    servo.set_output_voltage(5500)

    servo.enable(0)

    print "ready"

     

    while br == 0:

     

    js.register_callback(js.CALLBACK_ANALOG_VALUE, posi)

    js.register_callback(js.CALLBACK_PRESSED, cb_pressed)

     

    dc.set_velocity(sp)

    servo.set_position(0, st)

    print str(sp), str(st)

     

    ipcon.destroy()

     

    Wobei der Servo und der DC-Brick nicht reagieren.

    Der print-Befehl zeigt mir beide Variablen an und sie reagieren auch auf den Joystick.

    Trage ich feste Werte statt z.b. sp ein geht´s ebenfalls.

    Auch wenn ich die beiden Zeilen

     

    dc.set_velocity(sp)

    servo.set_position(0, st)

     

    in die Funktion posi(x,y) schreibe funktioniert es. Will ich aber nicht.

     

    Für Hilfe wäre ich dankbar, da ich schon länger an dem Problem tüftle.

     

    Sascha

×
×
  • Neu erstellen...