saschaho
-
Gesamte Inhalte
13 -
Benutzer seit
-
Letzter Besuch
Posts erstellt von saschaho
-
-
Wow, wie krass ist das denn? Tolles Projekt.
Willst du (die Frage kommt von mir ja immer :-D) es vielleicht in die Wiki stellen? Mit ein paar Bildern und mehr Details?
Wie geht denn das?
Wie kann man den die Sektion "L" unter Projekte erstellen?
Sascha
-
Sorry,
meinte das Step Down Power Supply
Sascha
-
Die Laufwerke (wenn man selbst keinen Schrott mehr hat) gibt´s für 13€.
Der Laser kostet so um 25€ + Gehäuse und Linse alles bei http://www.insaneware.de/epages/61714203.sf/de_DE/?ObjectPath=/Shops/61714203/Products/oc300mw.
Holz müsst ihr selber besorgen.
Der Akku ist ein Alter aus meiner USV.
Also, die Kosten halten sich im Rahmen.
Sascha
-
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
Ich will aber noch an der "Verweildauer" bei kleinen Steps arbeiten.
Sascha
-
@AuronX
Der Rahmen um meinen Namen ist genau 38mm.
Die Linien des Rahmens haben 1mm Abstand zueinander.
Die Positionierung ist wirklich sehr exakt.
Sascha
-
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(
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(
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
-
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]]
-
@borg
Den Sinn hatte ich verstanden. Wenn ich das set jedoch in die def posi(x,y) reinschreibe ändert sich nichts.
Schreibe ich es hinter js.register_callback(js.CALLBACK_PRESSED, cb_pressed) bleibt das Proggi im wait stehen.
Mit time() geht´s ganz gut.
Danke nochmals
Sascha
-
@borg
Mit event läuft´s nicht, die Schleife bleibt stehen, aber mit time.sleep(0.1) geht´s jetzt.
Das war es also....
Danke für die Hilfe
Sascha
-
@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 :'(.
???
-
Die callbacks werden ausgeführt.
Mit "print str(sp), str(st)" werden die sich ändernden Werte ja angezeigt.
-
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
Taster vom LCD herausführen
in Hardware
Geschrieben
Schließe doch 2 oder 3 Taster über Dioden zusammen, dann hast du noch 4 Möglichkeiten mehr.
Zur Not Schottky-Dioden nehmen.
Kannst ja dann die Zustände über "and" abfragen.
Sascha