Vistas de página en total

lunes, 30 de enero de 2012

Y el resultado final es el siguiente, en el que pueden ver los diferentes elementos del plotter.









Aquí se pueden apreciar las dos placas de control, así como la alimentación de ellas. Para realizar el conexionado se ha utilizado cable paralelo con terminales de fabricación propia (y un poco laborioso).



A continuación sólo falta diseñar la parte de software que realizará el control del plotter. Debe poder manejarlo en manual mediante un joystick y con un regulador de velocidad, limitando los movimientos a los extremos de los ejes del plotter. El eje Z se mueve pulsando el joystick que contiene un microinterruptor. En automatico he diseñado diferentes subrutinas para poder coger y dejar los 7 bolígrafos de colores de los que disponen y toto referenciado sobre un punto de coordenadas (0,0) que está situado en la esquina superior izquierda.

El programa está a continuación:

'****************************************************
'
'    APLICACION PARA EL CONTROL DE UN PLOTTER
'
'    Autor: Fernando Hernandez
'
'****************************************************

'Definicion de simbolos:
symbol t=2
'symbol tiempo=100
symbol tiempo1=50
'****************************************************

'Definicion e inicializacion de variables:
b0=0        'leer teclas bit0 a bit 7
b1=0        'reserva
b2=0        'eje X manual
b3=0        'eje Y manual
b4=0        'pulsador manual
b5=0        'velocidad manual

b6=0        'FC1 eje Y
b7=0        'FC2 eje X
b8=0        '0 Manual / 255 Automatico
b9=0        'Contador
b10=0        'Cotador eje X: w5
b11=0
b12=0        'Contador eje Y: w6
b13=0       

b14=0        'w7 variable X secuencia puntas
b15=0
b16=0        'w8 variable Y secuencua puntas
b17=0
b18=0
b19=0

'****************************************************

'Incicializacion bus I2C indicadores leds pulsadores del panel:
i2cslave %01000000,i2cslow,i2cbyte    'Define PFC8574 barra leds I/O Expander
writei2c (000000)    'apaga los leds
pause tiempo1
'****************************************************

'Parpadean los leds Alarm y Pen
for b9=0 to 10
    gosub led_alarm_on    'enciende el led ALARM
    gosub led_pen_on        'enciende el led PEN
    pause 200
    gosub led_alarm_off
    gosub led_pen_off
    pause 100
next b9
'****************************************************

'***************************   PROGRAMA PRINCIPAL   *****************************
main:

readadc 7, b8

if b8>128 then gosub automatico
if b8<128 then gosub manual

goto main
'********************************************************************************

'************* MODOS DE FUNCIONAMIENTO: MANUAL / AUTOMATICO *********************

'************************************** MODO MANUAL
manual:
high portc 7        'led indicador modo de funcionamiento
low portc 6

if pin0=1 then gosub entrada0    'arriba
if pin1=1 then gosub entrada1    'abajo
if pin2=1 then gosub entrada2    'derecha
if pin3=1 then gosub entrada3    'izquierda
if pin4=1 then gosub entrada4    'P2
if pin5=1 then gosub entrada5    'P1
if pin6=1 then gosub entrada6    'Enter
if pin7=1 then gosub entrada7    'Pen

if pin0=0 and pin1=0 and pin2=0 and pin3=0 and pin4=0 and pin5=0 and pin6=0 and pin7=0 then gosub entrada_off
 
readadc 0,b2    'eje X manual
readadc 1,b3    'eje Y manual
readadc 2,b4    'pulsador manual
readadc 3,b5    'velocidad manual

readadc 5,b6    'FC1    eje Y (254 tope)
readadc 6,b7    'FC2    eje X (254 tope)

if b2>200 then gosub motor_pap1iz    'izquierda eje X
if b2<100 then gosub motor_pap1de    'derecha eje X
if b3<100 then gosub motor_pap2ar    'arriba eje Y
if b3>200 then gosub motor_pap2ab    'abajo eje Y

if b4>128 then gosub sube_ejeZ    'sube eje Z
if b4<128then gosub baja_ejeZ        'baja eje Z

'debug

return
'****************************************************


'************************************** MODO AUTOMATICO
automatico:
high portc 6        'led indicador modo de funcionamiento
low portc 7

gosub origen
gosub lapiz1_coger
gosub origen
gosub lapiz1_dejar
gosub origen
'gosub lapiz2_coger
'gosub origen
'gosub lapiz2_dejar
'gosub origen
'gosub lapiz3_coger
'gosub origen
'gosub lapiz3_dejar
'gosub origen
'gosub lapiz4_coger
'gosub origen
'gosub lapiz4_dejar
'gosub origen
'gosub lapiz5_coger
'gosub origen
'gosub lapiz5_dejar
'gosub origen
'gosub lapiz6_coger
'gosub origen
'gosub lapiz6_dejar
'gosub origen
'gosub lapiz7_coger
'gosub origen
'gosub lapiz7_dejar
'gosub origen

end

return
'****************************************************

'************************ SUBRUTINAS **************************

entrada0:
bit0=1
gosub led_tecla0
return

entrada1:
bit1=1
gosub led_tecla1
return

entrada2:
bit2=1
gosub led_tecla2
return

entrada3:
bit3=1
gosub led_tecla3
return

entrada4:
bit4=1
gosub led_tecla4
return

entrada5:
bit5=1
gosub led_tecla5
return

entrada6:
bit6=1
gosub led_tecla6
return

entrada7:
bit7=1
gosub led_tecla7
return

entrada_off:
b0=0
gosub led_tecla_apaga
return
'****************************************************

'***** LEDS- TECLAS *****
led_tecla_apaga:
i2cslave %01000000,i2cslow,i2cbyte    'Define PFC8574 barra leds I/O Expander
writei2c (000000)
return

led_tecla0:
i2cslave %01000000,i2cslow,i2cbyte    'Define PFC8574 barra leds I/O Expander
writei2c (%10000000)
pause tiempo1
return

led_tecla1:
i2cslave %01000000,i2cslow,i2cbyte    'Define PFC8574 barra leds I/O Expander
writei2c (%01000000)
pause tiempo1
return

led_tecla2:
i2cslave %01000000,i2cslow,i2cbyte    'Define PFC8574 barra leds I/O Expander
writei2c (100000)
pause tiempo1
return

led_tecla3:
i2cslave %01000000,i2cslow,i2cbyte    'Define PFC8574 barra leds I/O Expander
writei2c (010000)
pause tiempo1
return

led_tecla4:
i2cslave %01000000,i2cslow,i2cbyte    'Define PFC8574 barra leds I/O Expander
writei2c (001000)
pause tiempo1
return

led_tecla5:
i2cslave %01000000,i2cslow,i2cbyte    'Define PFC8574 barra leds I/O Expander
writei2c (000100)
pause tiempo1
return

led_tecla6:
i2cslave %01000000,i2cslow,i2cbyte    'Define PFC8574 barra leds I/O Expander
writei2c (000010)
pause tiempo1
return

led_tecla7:
i2cslave %01000000,i2cslow,i2cbyte    'Define PFC8574 barra leds I/O Expander
writei2c (000001)
pause tiempo1
return

led_pen_on:
low portc 0
return

led_pen_off:
high portc 0
return

led_alarm_on:
low portc 1
return

led_alarm_off:
high portc 1
return


'****************************************************




'******* MOTOR PASO A PASO 1 ********
motor_pap1iz:
gosub step_1a
gosub step_1a1
gosub step_1b
gosub step_1b1
gosub step_1c
gosub step_1c1
gosub step_1d
gosub step_1d1
w5=w5-1
return

motor_pap1de:
gosub step_1d1
gosub step_1d
gosub step_1c1
gosub step_1c
gosub step_1b1
gosub step_1b
gosub step_1a1
gosub step_1a
w5=w5+1
return

step_1a:
high 7
low 6
low 5
high 4
pause t
return

step_1a1:
high 7
high 6
low 5
high 4
pause t
return

step_1b:
low 7
high 6
low 5
high 4
pause t
return

step_1b1:
low 7
high 6
high 5
high 4
pause t
return

step_1c:
low 7
high 6
high 5
low 4
pause t
return

step_1c1:
high 7
high 6
high 5
low 4
pause t
return

step_1d:
high 7
low 6
high 5
low 4
pause t
return

step_1d1:
high 7
low 6
high 5
high 4
pause t
return
'****************************************************

'******* MOTOR PASO A PASO 2: con pasos intermedios ********
motor_pap2ar:
gosub step_2a
gosub step_2a1
gosub step_2b
gosub step_2b1
gosub step_2c
gosub step_2c1
gosub step_2d
gosub step_2d
w6=w6-1
return

motor_pap2ab:
gosub step_2d1
gosub step_2d
gosub step_2c1
gosub step_2c
gosub step_2b1
gosub step_2b
gosub step_2a1
gosub step_2a
w6=w6+1
return

step_2a:
high 3
low 2
low 1
high 0
pause t
return

step_2a1:
high 3
high 2
low 1
high 0
pause t
return

step_2b:
low 3
high 2
low 1
high 0
pause t
return

step_2b1:
low 3
high 2
high 1
high 0
pause t
return

step_2c:
low 3
high 2
high 1
low 0
pause t
return

step_2c1:
high 3
high 2
high 1
low 0
pause t
return

step_2d:
high 3
low 2
high 1
low 0
pause t
return

step_2d1:
high 3
low 2
high 1
high 0
pause t
return
'****************************************************

parar_motores:
b6=254
b7=254

w7=0
w8=0

high 7
high 6
high 5
high 4
high 3
high 2
high 1
high 0
return

'********* ELECTROIMAN EJE Z ********
sube_ejeZ:
high portc 5
return

baja_ejeZ:
low portc 5
return
'****************************************************

'********* COORDENADAS ********
origen:    '(0,0)
readadc 5,b6
readadc 6,b7

do while b6<254 or b7<254
readadc 5,b6
readadc 6,b7
if b6<200 then gosub motor_pap2ar
if b6>200 and  b7<200 then gosub motor_pap1iz
if b6>200 and b7>200 then gosub parar_motores
loop 

wait 1
return

'*********************************
lapiz1_coger:
for w7=0 to 60 step 1
gosub motor_pap1de
next w7
for w8=0 to 62 step 1
gosub motor_pap2ab
next w8
for w7=60 to 10 step -1
gosub motor_pap1iz
next w7
for w8=62 to 87 step 1
gosub motor_pap2ab
next w8
for w7=10 to 60 step 1
gosub motor_pap1de
next w7
return

'*********************************
lapiz1_dejar:
for w7=0 to 60 step 1
gosub motor_pap1de
next w7
for w8=0 to 87 step 1
gosub motor_pap2ab
next w8
for w7=60 to 10 step -1
gosub motor_pap1iz
next w7
for w8=87 to 62 step -1
gosub motor_pap2ar
next w8
for w7=10 to 60 step 1
gosub motor_pap1de
next w7

return

'*********************************
lapiz2_coger:
for w7=0 to 60 step 1
gosub motor_pap1de
next w7
for w8=0 to 148 step 1
gosub motor_pap2ab
next w8
for w7=60 to 10 step -1
gosub motor_pap1iz
next w7
for w8=148 to 173 step 1
gosub motor_pap2ab
next w8
for w7=10 to 60 step 1
gosub motor_pap1de
next w7
return

'*********************************
lapiz2_dejar:
for w7=0 to 60 step 1
gosub motor_pap1de
next w7
for w8=0 to 173 step 1
gosub motor_pap2ab
next w8
for w7=60 to 10 step -1
gosub motor_pap1iz
next w7
for w8=173 to 148 step -1
gosub motor_pap2ar
next w8
for w7=10 to 60 step 1
gosub motor_pap1de
next w7
return

'*********************************
lapiz3_coger:
for w7=0 to 60 step 1
gosub motor_pap1de
next w7
for w8=0 to 244 step 1
gosub motor_pap2ab
next w8
for w7=60 to 10 step -1
gosub motor_pap1iz
next w7
for w8=244 to 269 step 1
gosub motor_pap2ab
next w8
for w7=10 to 60 step 1
gosub motor_pap1de
next w7
return

'*********************************
lapiz3_dejar:
for w7=0 to 60 step 1
gosub motor_pap1de
next w7
for w8=0 to 269 step 1
gosub motor_pap2ab
next w8
for w7=60 to 10 step -1
gosub motor_pap1iz
next w7
for w8=269 to 244 step -1
gosub motor_pap2ar
next w8
for w7=10 to 60 step 1
gosub motor_pap1de
next w7
return

'*********************************
lapiz4_coger:
for w7=0 to 60 step 1
gosub motor_pap1de
next w7
for w8=0 to 332 step 1
gosub motor_pap2ab
next w8
for w7=60 to 10 step -1
gosub motor_pap1iz
next w7
for w8=332 to 357 step 1
gosub motor_pap2ab
next w8
for w7=10 to 60 step 1
gosub motor_pap1de
next w7
return

'*********************************
lapiz4_dejar:
for w7=0 to 60 step 1
gosub motor_pap1de
next w7
for w8=0 to 357 step 1
gosub motor_pap2ab
next w8
for w7=60 to 10 step -1
gosub motor_pap1iz
next w7
for w8=357 to 332 step -1
gosub motor_pap2ar
next w8
for w7=10 to 60 step 1
gosub motor_pap1de
next w7
return

'*********************************
lapiz5_coger:
for w7=0 to 60 step 1
gosub motor_pap1de
next w7
for w8=0 to 419 step 1
gosub motor_pap2ab
next w8
for w7=60 to 10 step -1
gosub motor_pap1iz
next w7
for w8=419 to 444 step 1
gosub motor_pap2ab
next w8
for w7=10 to 60 step 1
gosub motor_pap1de
next w7
return

'*********************************
lapiz5_dejar:
for w7=0 to 60 step 1
gosub motor_pap1de
next w7
for w8=0 to 444 step 1
gosub motor_pap2ab
next w8
for w7=60 to 10 step -1
gosub motor_pap1iz
next w7
for w8=444 to 419 step -1
gosub motor_pap2ar
next w8
for w7=10 to 60 step 1
gosub motor_pap1de
next w7
return

'*********************************
lapiz6_coger:
for w7=0 to 60 step 1
gosub motor_pap1de
next w7
for w8=0 to 508 step 1
gosub motor_pap2ab
next w8
for w7=60 to 10 step -1
gosub motor_pap1iz
next w7
for w8=508 to 533 step 1
gosub motor_pap2ab
next w8
for w7=10 to 60 step 1
gosub motor_pap1de
next w7
return

'*********************************
lapiz6_dejar:
for w7=0 to 60 step 1
gosub motor_pap1de
next w7
for w8=0 to 533 step 1
gosub motor_pap2ab
next w8
for w7=60 to 10 step -1
gosub motor_pap1iz
next w7
for w8=533 to 508 step -1
gosub motor_pap2ar
next w8
for w7=10 to 60 step 1
gosub motor_pap1de
next w7
return

'*********************************
lapiz7_coger:
for w7=0 to 60 step 1
gosub motor_pap1de
next w7
for w8=0 to 597 step 1
gosub motor_pap2ab
next w8
for w7=60 to 10 step -1
gosub motor_pap1iz
next w7
for w8=597 to 622 step 1
gosub motor_pap2ab
next w8
for w7=10 to 60 step 1
gosub motor_pap1de
next w7
return

'*********************************
lapiz7_dejar:
for w7=0 to 60 step 1
gosub motor_pap1de
next w7
for w8=0 to 622 step 1
gosub motor_pap2ab
next w8
for w7=60 to 10 step -1
gosub motor_pap1iz
next w7
for w8=622 to 597 step -1
gosub motor_pap2ar
next w8
for w7=10 to 60 step 1
gosub motor_pap1de
next w7
return

Si alguien necesita los esquemas de las placas los tengo diseñados con Crocodile.

martes, 24 de enero de 2012

Plotter (Parte 3)

Una vez desmontado todo el plotter comienza la tarea de identificación de componentes. Para esta tarea necesitamos un multimetro (tester), una hoja para apuntar todos los datos y mucha, mucha paciencia.

Después de dedicar muchas horas probando todos los elementos tenemos toda la información.

Los resultados obtenidos se pueden ver en el siguiente esquema:




Con estos resultados asignamos a nuestro microcontrolador Picaxe las entradas y salidas que vamos a utilizar.

Entradas:
joystick manual eje X
joystick manual eje Y
pulsador eje Z
potencimetro velocidad manual
Final de Carrera eje Y (posición 0)
Final de Carrera eje X (posición 0)
Interrptor manual/automático
Pusadores del panel de control del plotter (8 teclas)

Salidas:
led PEN
led ALARM
bus i2c (2 lineas)
relé eje Z
led automático
led manual
4 salidas motor paso a paso Eje X
4 salidas motor paso a paso Eje Y



Para no complicar mucho el montaje y ahorrar dinero y tiempo utilizaremos la fuente de alimentación interna que viene con el plotter y su interruptor de puesta en marcha.

Esta fuente nos servirá para alimentar a los motores y la parte de control (por seguridad) la alimentaremos a parte mediante 4 pilas AA.

Plotter (Parte 2)

Primero debemos realizar Ingenieria inversa, es decir, determinar como funcionan y como está conectado todo el plotter.

Para ello debemos desmontar el plotter. A continuación se detallan los pasos:












Desmontamos todas las tapas: posterior, inferior y lateral....
Y, por último, el panel de pulsadores.




Ya tenemos todo desmontado y a punto para empezar a montar el nuevo hardware y software que hemos diseñado!

Plotter (Parte 1)

El siguiente proyecto consiste en convertir un plotter antiguo y que no funciona su sistema de control en un plotter nuevo en el que hemos substituido todo su hardware y software de control por uno propio.
Para ello utilizaremos una placa de Picaxe, en concreto la placa para el Picaxe 40X.

A esta placa le hemos añadido una placa de control propia que nos permite controlar el plotter en manual (mediante un joystick) o automático mediante un programa predeterminado. En esta placa tambien estan los drivers de potencia para los motores paso a paso, finales de carrera, electroimán para subir y bajar el lápiz, diodos indicativos, control para el panel táctil propio del plotter, etc.

El plotter que vamos a utilizar es un plotter que tiene dos servomotores para los ejes X e Y y un electroimán para el eje Z.