S2 - TESIUAMI

Anuncio
Universidad Autónoma Metropolitana
División de Ciencias Básicas e Ingeniería
Casa abierta al tiempo
Proyecto Terminal:
Reconstrucción y Reproducción de Volúmenesy
Superficies en Movimiento
(i Martinez Pacheco Josefina
L
Ramírez Ortíz Jorge Luis
Asesor: Dr. Leona
Y Noviembre 200 1
Reconstruccióny Reproducción de
Volúmenes y superficies en movimiento.
Índice
Página
2
Introducción
Capítulo Primero
“Teoría Matemática de cuaterniones”
Generalidades sobre cuaterninones
Notación Matricial
Algunas aplicaciones con cuaterninones
3
4
11
Capítulo Segundo
“Programas en MAT LAB”
13
Capítulo Tercero
“Interfaz”
Teoría de los Motoresa paso
Uso del Puerto Paralelo
Módulo de Acoplamiento
Selección de Motory Potencia
Módulo de Conteoy Selección de datos de Entrada
Circuitos impresos
21
23
28
29
30
31
Capítulo Cuarto
“Controladores”
Programación Orientadaa Objetos
Control para Salida-Entrada
Interfaz versión Consola
Interfaz en Java
Interfaz en C++Builder
37
38
41
43
44
Capítulo Quinto
“Códigos”
La interfaz tipo consola (MS-DOS)
La Interfaz enJava
La Interfaz en (=++Builder
Bibliografia
46
47
52
58
Noviembre del 2001
Página
1
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
Introducción
El propósito de este trabajo reside en enfocamos en el problema de representar y reconstruir,
mediantelainterpolacióndemovimientosdecuerposrígidostridimensionales,utilizandouna
teoría de aproximación en el campo hipercomplejo, en particular en el anillo de cuaterniones, con
la finalidad de encontrarla ecuación del movimiento.
Esta inquietud se funda en la necesidad de reconstruir a partir de datos dispersos, superficies y
volúmenes que se encuentran en movimiento, en otras palabras, cuando se desea reproducir una
superficie preestablecida o tal vez cuando se requiere modelar un volumen, estos casos se dan por
ejemplo en la industria metalmecánica, en la automotriz o en campos muy disímiles a estos como
la mete reología, la oceanografiao la biomedicina, entre otros.
Históricamente, el problema fue abordado primeramente usando ángulos
de Euler -método que
aún hoy en día ,se hace en casi todos los casos-, ésta técnica tiene grandes problemas en cuanto al
volumen de cálculos, además de un efecto poco realista en los resultados, acelerandoo retrasando
los movimientos durante los giros provocando velocidades imposibles de alcanzar. Normalmente
la aproximación al problema que sehadesarrolladohastaahorahasido
la representación de
estadossucesivos de la superficie o delvolumen, para luegoreproducirloscuadroporcuadro
como si se tratara de un film. Básicamente el problema consiste que
en se puede llegar a confundir
el movimiento con la trayectoria, un tip importante para obtener resultados es que hay que tener
presente siempre que interpolar es aproximar las ecuaciones horarias
de un movimiento específico.
y usandocuaterniones para
La primeraaproximaciónteniendoencuentaestosproblemas
resolverlossedebea
Shoemake (1985).Estetipo
de solucionestienencomocaracterística
fundamental,elsepararlosmovimientos
de rotaciónytraslaciónparaluegointerpolarlospor
separado y unirlos. Las solucionesque presentamos están basadas en cuaterniones duales.
Partiendo de un problema planteando por G. Whaba en 1962 han habido varios intentos para
resolver la estimación de la orientación de un objeto en rotación. Se puede citar un primer uso de
cuaterniones por Brian S. en 1982. Un enfoque más sistemático se debe a Tchelnokov Ju N de
ruso que presentan algoritmos
quien se encuentran dos trabajos en 1983 y en 1991, ambos en
cuatemiónicos para navegación inercial.
m
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
[’.e., PI,lrl‘ d! I!!
UniversidadAut6noma Mctropolltana
W&*9
,‘, :,a
Capítulo Primero
“Teoría Matemáticade Cuaterniones”
Generalidades sobre los cuaterniones
Al hablar de cuaterniones, el ámbito se torna amplísimo ya que esta relacionado con temas aún
más vastos e importantes como lo esel álgebra de Clifford. Para elloesnecesariorecordar
algunos conceptos básicos y simples relativos a los cuaterninones que nos serán de gran ayuda
para entender lo que sigue.
Si recordamos los números complejos, dados de la forma (z = x + iv) donde i2 = -1 se puede
definir un cuaternión de forma análoga como:
Q = 4 0 + q1i + q 2 j + q3k
Donde:
i2 =: j’ = k 2 = i j k = - I
Así resulta fácil deducir que un cuaternión unitario será aquel cuya normaes uno:
q; +q; +q; +q;
=1
Ahora bien, sea R4 el espacio euclidean0 4-dimensional. Tomamos en éI la base ortonormal
formada por: so = (1,0,0,0), sI = (0,1,0,0), s2 = (0,0,1,0), s3 = (O,O,O,l), entonces un cuadrivector
3
dado por ejemplo: q = (qo,ql,q2,q3) se puede escribir en general como: q = c q i s i
r=O
3
También se puede usar la notación
q i s , para la parte vectorial así queda representado:
Q=
i=l
4 = u040
+Q
El cuaternión q, puede escribirse en términos de ángulos Euler quedando así:
qo = COS(U/ 2)
q1 = slsen(a/ 2)
q2 = s2sen(aI 2)
q3 = s3sen(a/ 2)
Asíel cuaternión obtenido representa una rotación de ángulo a alredor del eje formadopor
sl,s2,S3.
Una ley de multiplicación no conmutativa se puede establecer así:
q, = (qoao- q.a)s0 + ÜAÜ
+ U,Ü + üa,
donde q.a y uAa representan el producto escalar y vectorial en R3 respectivamente. De esta
manera el espacio vectorial R4 obtiene una estructura algebraica de anillo, quellamaremos
álgebra de los cuaterniones reales H.
Propiedades:
2
2
i)
so = sosi
-so, i = 1,2,3
ii)
s i s , + s,si = O , i # j , i j = 1,2,3
Noviembre
2001
Página
3
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
4, * q h = 4 u * q h
"
1.3) 4, * q u = 4 , * q a E Q
2) La transformación <.,.>: R4 * R" + R se puede representar como:
(q,,4,)=%(4<, * q h
también, la norma
@ q b
E
*4u)
l[jlQ + R se puede representar como:
Q
* x
IlqlI = (4,4jX = 4 4
Es también. útil, usando expresiones matriciales considerar el concepto de anticuaternión:
d -a -b -c
d
b
a
c
4=
a
d
-
b
c
d
c - h a
c
-
b
q* =
a
-U
d
-C
b
-b
c
d
-a
a
d
-b
-c
d
- 1 0 0 0
o
1.' =
1 0 0
O 0 1 0
o O 0 1
Donde q es el cuaternión y q* = v.q.v el anticuaternión. También q = v.q*.v se sabe también que
v2=Iy llvll=-l
Por u(x) notamos una función vectorial cuaterniónica notada como:
Notación Matricial
Otra ventaja que nos da el uso de cuaterniones es la facilidad de expresarlos en notación matricial
como matrices reales 4 x 4:
a,,
-a,
-a,
-a,
a2
a3
a0
0.3
-a2
a,
-a,
a,,
y los versores pasana ser en esta notación:
es imDortante también definir almnos contentos como los simientes:
Noviembre
2001
Página
4
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
~~
1
0
S, =
O
O
es importante
0 0 0
0 - 1 0
o
1 0 0
1 0 0 0
S] =
o o 0-1
0 1 0
0 0 1
O 0 1 0
también definir:
o o
s2 =
O
1
- 1 0
0 0 1
0 0 0
0 - 1
o o
O 0 o
0 0 - 1
s3=
o 1 o
1
0
0
-1
o
o
o
3
a = aOsO- c a p ,
Parte real: Re a = aOsO
= 1/ 2(a + a)
Cuaternión conjugado:
i=l
Parte imaginaria: Im a =
Cais, = 1/ 2(a -- a)
3
i=l
d
Sea D = (0,Dl,D2,D3)un vector donde D i= -el operador de
dXi
D=
Cauchy Riemann será:
3
CDisi
i=I
Es importante notar que:
Du = (-divü)s,
+ gradu, + rotu
grad%)=(Dl u, )SI + @,u, >S, + (D3u0 >S,
divü := Dlul + D,u,+ D3u,
S2
S1
rotü = det D l D,
u2
1.]
%I
S3
D,
Es importante resaltar el sistema deMoisil Teodorescu:
diva = O
gradu, + rotü = O
que describe el fluido irrotacionalsin fuentes ni sumideros. Una función con valores en
H se llama
H-regular o monogénica si satisfaceMoisil Teodorescu.
Nótese el conjunto de todas l a s funciones H-regulares como AH(G).Nótese que:
DD=-A
Siendo A el laplaciano en R3.Veamos algunos problemas:
1. El producto de dos funciones H-regular no es necesariamente H-regular. Para
evitar ese
problema Delanghe introdujo el concepto de variables totalmente analíticas. Una variable
z EH se llama totalmente analítica si y solo si para cada k E N la k-ésima potencia de z es
H-regular. Si representamosz como:
3
z =CXid,
i=O
con di E H entonces didj = djdi es una condición suficientepara que z sea totalmente analítica.
Sea di E H, i=O,1,2,3 entonces existen números realesai, tales que:
Noviembre del 2001
Página
5
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
Si es así es importante considerar el rango de la matriz:
a02
a03
all
a12
'13
a21
a22
a23
a31
a32
a33
Propiedades Importantes
1) did, = djdi ,i,j=O,l,2,3 si y solo si el rango A'<2
a,
-ao
-a3
a2
a2
a3
-ao
-a,
a,
-ao
a3 -a2
Si u E AH(C;)con u(x)#O en G entonces u" E AH(G) si y solo si [uI'D - M(gradlu12)F= 0
3) Si z E A.H(G),el rango A'<2 entonces 2-l E AH(G')con G'=(x~R~:z(x)#o).
3
4) Sea u(;c) = c u , ( x ) d , ,
V(X)
el rango A'<2 entonces la regla para el producto
¡=O
i=O
es
3
=xv,di y
+ @)u .
D(UV) = ( D U ) ~
5) Si U E AH(G),
x
3
U(X)
=
U ;(x)d, , el
rango A'<2 entonces U" E AH(G)para todo n
E
N.
i=O
6) Si z
E
AH(G), el rango A'<2 entonces z - E~ AH(G)para todo n con Gr=(x~R4:z(x)+0).
Rotaciones
Una rotación alrededor de un punto en un espacio euclidean0 n dimensional viene dada por una
mismo punto viene dad por una matriz
matriz n x n, una rotación infinitesimal alrededor del
también n x n cuasisimétrica. La relación entre ambas, llamémosleA y M es:
m
[ A ] = e"'
[MY / k!
=
k=O
sabiendo de antemano que:
[A] = e
= e[N1e[M3
si y solosi [M][N] = [N][M]
Ahora bien, notemos esto en algunos ejemplos:
0
Para el caso de 2D:
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
~~
Consideremos una rotación infinitesimal en el plano euclideano, estará dado por una matriz tipo M
de 2 x 2 de la siguiente forma:
L
la matriz [A tienelapropiedaddeque:
[ a 2 = -[E*] donde [Ek] eslamatrizidentidadparala
dimensión k, ahora evaluando el exponencial matricial tenemos:
cose -sene
[A] = e'['] = cos e[E2] + sen e[r]=
[sene cos e
que es la ya conocida matriz de rotación en 2D. Obsérvese también que esta es la representación
matricial de lafórmula deEüler:
e" = cose + isen8
]
0
Para el caso de 3D:
Considerando ahorauna matriz 4 x 4 cuasisimétrica, llamémosle[M41
dónde:
; -J
o
-S3
s2
Y
=1
En el momento que [S]es una matriz cuasisimétrica de 3 x 3 representa una rotación infinitesimal
en 3D y lo mismo[M4].
Así las matrices de rotación eetsl y etM4]
representan una rotación finita enE3 alrededor del eje
S = (sI,s2,s3)con ángulo de rotación8.
Ge demostró en 1994 que:
e [ K l = e(':2:Q+1e(e:2,[s-1 = e(':2)[s-le(s~2)[s+l
S; +S;
r
donde:
0
[S+]=( -S2
s3
-S3
S2
S,
0
-SI
o
1 [s-]=I
SI1
S2
S2
+S;
[
0
S3
-S2
-S3
S2
S1
O
o
I
-811
-s2
-S3
Ge también demostró en 1994 (aunque fuera
de este contexto De Casteljauya había llegado ala
misma conclusión en 1990) que:
Noviembre del 2001
Página
7
r
Am
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
UniversidadAut6noma Metropolitana
!lf&9W
I.iY i!NYlJ,,l!~:,',F,
cos(e / 2 )
--
s,sen(e / 2)
- s,sen(e/ 2 )
,,sen@ / 2)
cos(@/ 2)
s,sen(e/ 2)
- s,sen(e / 2)
-- s2sen(e/ 2 )
e w 2 / + l = ~
s,sen(e/ 2)
s2sen(e 2 )
- s,sen(e/ 2) s2sen e / 2
cos(@/ 2 )
s,sen(e 2)
- s,sen(e
/ 2)
cos(0( / 2))
I
y además que esa matriz está asociada con el cuaternión:
G=cos(~/2)+se~(~/2~~,~+s2~+s,~)
y que e[e'21[s-1
está asociado con el cuaternión conjugado:
G = cos(@/ 2) - sen(@/ 2)(s,i + s 2 j + s3k)
De aquí deducirnosdos cosas importantes:
l . Una rotación infinitesimal en 3D está compuesta por dos rotaciones infinitesimales en 4D.
2. Un cuaternitjn representa en realidad una rotación en 4D y no en 3D como se pensaba.
Para explicarlo de otra manera, sea p(p,.):Q-+Q una transformación lineal con p E Q definida por:
1
1
P ( P , q ) = P * q * P l =?.(P*q*P) , v q E
JIPI1
Q
entonces la matriz asociada es:
/lPIl2
o
M=-"-
(IP1(2
'
0
O
Pi +P: +P2'"Pi
2(POP3 + PIP2 )
2(PlP,
O
2(PlP2 +P3PO)
Pi - P:
I
donde P = ( P ~ , P ~ , PE ~
Q~ P ~ )
La expresión di-ferencial:
O
2(P2P3
+ p2' - Pf
2bOPl
- POP')
O
2(p0P2 +PIP3)
+ P2P2)
- POPI
)
Po2 - P: - Pz'+ P.:
0
%;;;
v*v=:
o
a42
a43
a44
los componentes anteriores quedan de la siguiente forma:
+" da'2 + d 2
ay' 3 z 2
d2
d2
a , , =-+-
d2
-_
at2
ax2
a3' = 2 ( K + c )
ax+
a33
d2
d2
d2
d2
d2
d2
azat
Sintetizando, un cuaternión unitario representa un eje y una rotación alrededor de é1:
Noviembre
Página
2001
"
.
.
" "
"
~~
"
"
"
"
~
8
"
"
. ."
~
.
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
e
,xsen - ,ysen - ,zsen 2
2
donde 8 es el ángulo de giro y x,y,z la dirección del ejede giro.
Cuaterniones Dobles
En general una rotación en el espacio 4D consiste en dos rotaciones independientes planas endos
planos mutuamente ortogonales. Hay que hacer notar que por planos mutuamente ortogonales
entendemos aquellos tales que toda línea de uno es ortogonal a toda del otro plano y que esto no
es posible en31).
Una rotación infinitesimalen el espacio de 4D viene dada por:
- m3
m2
--m2m,
notando que [1"] es lo mismo que [S'] solo que cambiando
las matrices:
S
por t, siguiendo tenemos ahora que
son las representaciones matricialesde cuatemiones similares a los anteriores.
4D de un punto x en un punto _x viene dada por:
De esta manera una rotación en
un par de cuaterniones G y H es lo quese llama un cuaternión doble.
Obsérvese que, un cuatemión unitario representa dos rotaciones planas en el espacio de 4D.Esas
rotaciones son de igual ángulo, llamémosle812.
El producto de las dos rotaciones de igual ángulo doble [GI y [HI cancela las rotaciones en un
plano y dobla las rotaciones en elotro por lo cual se vuelve un rotación en
3D con ángulo8.
Desplazamientos en 3D con cuaterniones dobles
En Geografia, pequeños desplazamientos sobre la superficie de la tierra son consideradas en
2D
cuando en realidad son rotaciones en 3D.La filosofia a seguir aquí es similar pero en
3D y 4D.
Concretando que tan grandese necesita hacerla esfera en4D para que sea 3D.
Para un nivel especificado de error 6 y una cota superior L, el radio de la esfera en 4D denotado
por R queda como:
Sea d la representación de una traslación en 4D,la cual es aproximada por una rotación de ángulo
y tal que el límite de sen y + siendo que y = d/R.
Noviembre del 2001
Página
9
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
El cuaternión do'ble querepresenta tal rotación es:
D = cos(uy/2) + sen(uy/2) u
Donde u es un vector unitario en la dirección de traslación. La traslación se puede representar por
el cuaternión doble (D, D ).
De la misma manera la rotación se puede representar por el cuaternión doble (Q,Q),de esta forma
podemos obtenerun movimiento combinadode rotación y traslación en 3D, dada porun
cuaternión doble G*, tal que éste último esta formado por los dos cuaterniones unitarios G y H
tales que:
G=DQ
H=DQ
La ventaja de este planteamiento es que se puede demostrar que es invariante o casi invariante al
sistema de coordenadas. Para representar movimientos con cuaterniones dobles se da el siguiente
algoritmo:
Algoritmo
l. Convertir la matriz de rotación 3 x 3 a su representación cuaterniónica Q y considerar la
traslación como el vector d = (dl,d*,d3), para cada sistema de coordenadas considerado
(por ejemplo puede tratarse de un cuerpo girando sobre sí mismo y trasladándose en el
espacio).
2. Seleccionar un límite superior L de las dimensiones del espacio de trabajo y un límite 6 de
tolerancia en el error de la posici6n. Calcular el radio de la esfera en 4D con la siguiente
T
fórmula:: R =
L
~
6"2
3. Aproximar la traslación en 3D, d utilizando la rotación en 4D: D cos(uy/2) + sen(uy/2) u
4. Calcular las dos componentes del cuaternión doble G*.
5. Calcular la distancia entre dos movimientos sucesivos i e i+l como entre respectivas
componentes de los cuaterniones dobles: a = COS-' (Gi,Gi+l) y p = coS"(Hi,Hi+l), estos
ángulos definen la secuencia de nodos necesarios paracualquier esquema de interpolación.
6. Aplicar cualquier esquema de interpolación cuaterniónica para interpolar los cuaterniones
unitarios de cada movimiento.
7. Ya obtenidos G y H interpolados se recuperan Q y d mediante: Q = (G + H)/(2cosy)
d = (R,/seny)(G + H)
si y z O y O si y=O, donde y = (1/2)cos"(G.H).
8. Para obtener la transformación homogénea se convierte el cuaternión Q en la matriz de
rotación de 3 x 3 y se ensambla con el vector de traslación d.
e
Cuaterniones Duales
Los cuaterniones duales son una herramienta poderosa cuando se tienen que resolver problemas en
cinemática.
Ahora presentamos el concepto de cuatemión dual, la unión de una unidad dual E con E * = O con
los cuaterniones los lleva al anillo no conmutativo H [ E ] de los cuaterniones duales. Un cuaternión
dual se define de la siguiente forma:
Q=QO+€Q€
=(q0+4-0)+E(q€+q-E)
Noviembre del 2001
Página
10
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
Consiste en una parte realQo = ReQ E H y una parte dual Q‘
= DuQ E
H.
Algunas aplicaciones con cuaterniones
Ahora se dan unos ejemplos
de aplicación y posibles soluciones, para que el lector tenga una
impresión de lo intentamos plantear en este trabajo, además de imaginarse situaciones en las que
se pueden aplicar los cuatemiones optimizando los cálculos utilizados en cada caso.
El primerejemplosepuededarconuncambiodeiluminación
o perspectivade un objeto,
supongamos que tenemos dado un objeto por un número finito de datos que consisten en temas
dadas por (x,y,z) y que además conocemos la dirección de la luz. Teniendo estos datos, es posible
calcular en cada punto la normal al objeto, ya sea tomando en cuenta los datos vecinos o algún
procedimiento similar.
Una vez que hayamos obtenido la normal podemos calcular el ángulo formado entre esta
fuente de luz. Así como el ángulo con la dirección del observador.
y la
Asignaremos entonces a cada punto un cuaternión tal que represente por ejemplo el giro que hay
que hacer para ir en la dirección de luz
la a la normal (puede elegirsede varias maneras).
Como estamos hablando de intensidades de luz, podemos representar a cada ángulo de giro como
un color o intensidad (ordenando los colores en el orden del espectroy las intensidades de 1 a 256
que son las que nosda la pantalla).
Mover la luz es entonces hacer un giro que multiplicado por el cuatemión característico de cada
punto da como resultado otro cuatemión el cual representa el nuevo color o intensidad. Más aún,
si lo que se pretende es dar animación a una secuencia basta con interpolar entre dos posiciones
considerando el giro completo entre la posición inicial y la final como una sucesión de pequeños
giros. Una nota importante es que
la interpolación debe darse en el ángulo, de lo contrario el
resultado no daría un cuaternión.
Otra aplicación la tendríamos si suponemos ahora que de una determinada superficie conocemos
no solo la posición de nuestros datos sino también el color. Se puede realizar dos interpolaciones,
una para la posición y otra para el color. Es importante observar que de esta manera seguimos
atados a un sistema de coordenadas,porlo menos paralaprimerainterpolaciónespacial.
Al
utilizar cuaterniones en este
problema se vera que no
es necesario casarse con un sistema de
gran ventajaqueofrecenesquepuedenserusados
en sistemas
coordenadas, yaqueuna
independientes del sistema de coordenadas.
Ahoraellector
podría imaginarsequeseencuentraanteun“pixelreflejante”,unapequeña
plaquita metálicamoviéndose
en elespacio.Pensaremosen
dos problemasporresolver:
a)
Construir un camino que en una exposición continua marcarían en su camino entendiéndose por
reconstruir, dibujarla con las distintas intensidades de luz, b) “Animar ” la trayectoria, esto es,
construirelcamino
y mover el pixelsobre él. Hayquehacerporsupuestounaseriede
restricciones y simplificaciones para queel problema este al alcance de nuestras herramientas.
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
Ahora bien, el problema al que nos enfrentamos consiste en el siguiente: dadas algunas posiciones
(localización y orientación) de un objeto móvil en el espacio de tres dimensiones. Encontrar el
movimiento continuo que interpole esas posiciones. Esto último tiene gran aplicación en el campo
de animación y robótica. La solución usual a este problema es el utilizar splines de funciones
trigonométricas como ángulos de Euler. El resultado es conocido como Curvas Noracionales.
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
Capítulo Segundo
ccProgramasen MAT LAB”
....................................................
prodcuatmm....................................................... I
El programa pr0dcuat.m realiza la multiplicación de dos cuaterniones, esta función recibe como parámetros dos
variables de tipo cuaterniones (QI ,Q2) y devuelve como resultado un cuaternión. Además utiliza la función esca1ar.m
para realizar la operación. La forma de realizar las operaciones la puede consultar el lector en la parte
correspondiente a la teoría de cuaterniones que también se presenta en este trabajo.
O,Ófuncion que realiza la multiplicacion de dos cua:erniones
function prod=prodcuat(Ql ,Q2)
VI
=[Q1(2) QI(3) Q1(4)];
~2=[Q2(2)Q2(3) Q2(4)];
temp=escalar(vl ,v2);
esc=Q1(I)*Q2(1)-temp;
tempO=[(QI (3)*Q2(4)-Q1(4)*Q2(3)) (Q1(2)*Q2(4)-QI (4)*Q2(2)) (Q1(2)*Q2(3)-QI(3)*Q2(2))];
tempi =[Q2(2) Q2(3) Q2(4)];
temp2=[Q1(2) Ql(3) Q2(4)];
vec=QI (l)*templ
+Q2( l)*temp2tternpO;
prod=[esc vec(1) vec(2) vec(3)l;
I************X***********************************.~**
I
escalar.m ..................................................... I
La función esca1ar.m realiza el producto escalar de dos vectores, esta función recibe como parámetro dos vectores y
devuelve como resultado un escalar.
obfuncion que calc:ula el producto escalar de dos vectores
function prod=escalar(vl ,v2)
prod=vl (1)*v2(l)tvl(2)*v2(2)tvl(3)*v2(3);
.....................................................
cuaternión .m .......................................................I
Esta función permite asignarle a un vector un cuaternión, el primer componente del cuaternión es un 1. Recibe como
parámetro un cuaternión y devuelve también un cuaternión.
sbme permite pasar de vectores a cuaterniones
function cuat=cuaternion(Q)
cuat=[l Q(1,l) Q(1,2) Q(I,3)];
~~~~~
Noviembre
2001
Página
13
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
....................................................
ejes .m .......................................................
I
ejes.m recibe como parámetro un vector y devuelve un cuaternión con el primer componente igual a cero.
Ooesta funcion devuelve los ejes de la siguiente forma(0.el .e2,e3)
function q=ejes(v)
q=[O VU) v(2) v(3)I;
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
cuatdual .m ....................................................... I
Esta función recibe como parámetros tres enteros, correspondientes a un vector, la función devuelve el cuaternión
dual asociado a ese punto, calcula por separado la traslación y la rotación, luego los multiplica y devuelve el resultado.
4bme devuelve un fcuaternion dual correspondientl? al movlrniento dado
oox=radio'cos(t), y:=radio'sen(t). z=radio*paso
function func=cuatdual(x,y,z)
"'parte traslaclonal
'OTRASLACION
tempO=xA2ty*2tP2;
templ=sqrt(tempO);
alfa=2*atan(Ttempl);
xo=cos(alfd2);
temp=[xo x y z];
OóROTACION
Sx=(l/sin(alfa))*x;
Sy=(l/sin(alfa))*y;
Sz=( I/sin(alfa))*z;
S=[alfa Sx Sy Sz];
oolos desplazamientos
Desp=prodcuat(temp,S);
func=Desp;
....................................................
.m . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . I
La función pes0s.m obtiene los pesos correspondientes a cada punto que se encuentra sobre una línea recta dada,
recibe como parámetro el punto específico al cual le quiero asignar un peso y los puntos inicial y final de la línea recta
que pasa por éI, esta función devuelve un entero correspondiente al peso asignado.
O6para obtener los pesos de los puntos
function func=pesos(x,y,z,plx,plylp1z,p2x,p2y,p2z)
"bx,y,z es el punto al que deseo encontrar el peso
c~plx,ply,plz,p2x.p2y,p2z
son Io puntos inicio y final de la linea
'óque los une
X=[x y 2;plx ply plz;p2xp2y p2z];
DET=det(X);
tempO=(p2~-plx)~2t(p2y-ply)~2t(p2z-plz)~2;
peso=DET/sqrt(tempO);
func=peso;
Noviembre del 2001
Página
14
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
cob .m ........................................................ I
Este programa crea un cubo y Io rota sobre un mismo eje utilizando CuaterniOneS dobles, todo esta a base de
rotaciones.
.....................................................
Ooprograma querota un cubo en un solo eje
n=2; ';controla el numero de rotaciones sobre el mismo eje
w=n*20;
alfa=(n*pi)/w; O'bangulo de giro
centro de masa del cubo
a=O; o;odesplazamiento eje x
b=O; o,odesplazamientoeje y
c=O; o.;,desplazamiento eje z
Ob
Xl=[a-O.I a-0.1 a-0.1 a-0.11;
Yl=[b-0.1 btO.l btO.l b-0.11;'ócara trasera
Z1=[CtO.l cto.1 c-0.1 c-0.11;
X2=[a-0.1 atO.l atO.l a-0.11;
Y2=[bt0.1 btO.l btO.l bt0.11; O.bcara lateral derecha
z2=[ctO.I cto.1 c-0.1 c-O.l];
X3=[at0.1 at0.1 atO.l at0.11;
Y3=[bt0.1 b-0.1 b-0.1 bt0.11; '/$cara frontal
Z3=[ctO.I cto.1 c,.O.lc-0.11;
X4=[at0.1 a-0.1 a-0.1 at0.11;
Y4=[b-0.1 b-0.1 b-0.1b-0.11; ohcara lateral izquierda
Z4=[ctO.I cto.1 00.1 c-0.11;
for i=l:4
plot3(X1,Y1 ,Z1,'ID-'); o;ocara trasera
plot3(X2,Y2,Z2,'r-'); oolateral derecha
plot3(X3,Y3,23,'y-'); oocara delantera
plot3(X4,Y4,Z4,'g-'); O61ateral izquierda
end:
pg=[O 1 1 I]; ?ópalra hacer girar a los ejes rojos
cla;
Film=moviein(w);
for j=1:w
'óesto es dato de entrada por el usuario
cla;
O6estamos genera.ndoel cuaternion
sl=[XI(l) Yl(1) Zl(l)];
S2=[X1(2) Y l(2) Z1(2)];
~3=[X1(3)Y1 (3) Z1(3)];
~4=[X1(4)Y1 (4) Z1(4)];
Wl=[X2(1) Y2(1) 72(1)];
W2=[X2(2) Y2(2) z2(2)];
~3=[X2(3)Y2(3) Z2(3)];
~4=[X2(4)Y2(4) Z2(4)];
~~
Noviembre
2001
~
Página
15
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
rl=[X3(1) Y3(1) Z3(1)];
r2=[X3(2) Y3(2) Z3(2)];
r3=[X3(3) Y3(3) Z3(3)];
r4=[X3(4) Y3(4)
Z3(:4)];
gl=[X4(1) Y4(1) Z4(1)];
g2=[X4(2) Y4(2)
Z4.(2)];
93=[X4(3) Y4(3) Z4(3)];
94=[X4(4) Y4(4)
Z4(4)];
'ógenerando los ejes
xl=ejes(sl);
tl=ejes(wl);
hl=ejes(rl);
kl=ejes(gl);
x2=ejes(s2);
t2=ejes(w2);
x3=ejes(s3);
t3=ejes(w3);
x4=ejes(s4);
t4=ejes(w4);
h2=ejes(R);
h3=ejes(r3);
h4=ejes(r4);
E=ejes(g2);
k3=ejes(g3);
k4=ejes(g4);
QI=[cos(alfa/2) pg(:2)*sin(alfa/2)pg(3)*sin(alfa/2) pg(4)*sin(alfa/2)];
oornultiplicando los cuaterniones
C1= prodcuat(Q1,xl);
D l = prodcuat(Q1Jl);
C2= prodcuat(Q1,x2);
D2= prodcuat(Q1,t2);
C3= prodcuat(Q1,x3);
D3= prodcuat(Q1,t3);
C4= prodcuat(Q1,x4);
D4= prodcuat(Q1J4);
E l = prodcuat(Q1,hl);
E2= prodcuat(Q1,h2);
E3= prodcuat(Q1,h3);
E4= prodcuat(Q1,h4);
F1= prodcuat(Q1,kl);
F2= prodcuat(Q1,k2);
F3= prodcuat(Q1,k3);
F4= prodcuat(Q1,k4);
Xl=[CI (2) C2(2) C3(2) C4(2)];
Yl=[Cl (3) C2(3) C3(3) C4(3)];
ZI=[C1(4) C2(4) C3(4) C4(4)];
X2=[D1(2) D2(2) D3(2) D4(2)];
Y2=[D1(3) D2(3) D3(3) D4(3)];
Z2=[D1(4) D2(4) D3(4) D4(4)];
X3=[E1(2) E2(2) E3(2) E4(2)];
Y3=[E1(3) E2(3) E3(3) E4(3)];
Z3=[E1(4) E2(4) E3(4) E4(4)];
X4=[F1(2) F2(2) F3(2) F4(2)];
Y4=[F1(3) F2(3) F3(3) F4(3)];
Z4=[F1(4) F2(4) F3(4) F4(4)];
';oirnprimiendo el cdbo
plot3(X1,Y1 ,Z1,lb-');
"cara trasera
plot3(X2,Y2,Z2,'r-'); Ohlateral derecha
plot3(X3,Y3,Z3,'y-'); %cara delantera
plot3(X4,Y4,Z4,'g-'); ':olateral izquierda
Film(:,j)=getframe;
end;
movie(Fi1rn);
Noviembre
Página
2001
"
"
~
16
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
cilindro .m .......................................................
I
ci1indro.m es una función que recibe como parámetros una altura y un radio, corespondientes al cilindro que
deseamos reconstruir, esta función devuelve una matriz que contiene los puntos obtenidos sobre la superficie de un
cilindro, guiándose por las siguientes ecuaciones, x = radio cos(h), y = radio sin(h), z = radio * paso.
/*************************************************t*
"trabajando con un cilindro
function func=cilindro(radio,altura);
"Lprograma de prueba que reconstruye un cilindro con una espira
o,odeclaracionde las variables.
CIL=[;P=[];
paso=0.01;pasot=O.l;
cs=o;
Ooaqui se asocian 'cuaterniones duales a los puntos del cilindro
for j=O.l:pasot:l
rad=2-radio*j;
for i=O:pi/lOO:altura*pi
cs=cst 1;
xo=cos(i/2);
x=rad*cos(i);
y=rad*sin(i);
z=i*paso;
aux=[xo x y z];
CIL=[CIL;aux];
end;
end;
La idea esconstruir una figura constituida por dos conos invertidos, unidos por la punta, como se muestra en lafigura
1, a partir de uncilindro reconstruido por una espira. Utilizo para ello cuaterniones duales.
Figura 1
A continuación detallo paso a paso los puntos a seguir.
0
Primero empiezo reconstruyendo el cilindro con una espiral de puntos:
%datos de entrad,asobre el cilindro
radio= input ('cual es el radio del cilindro:
altura= input ('cual es la altura del cilindro: I ) ;
I);
%calculando los puntos con coordenadas polare; del cilindro.
n=altura;
axis([-5,5,-5,5,-5,5]);
Noviembre del 2001
Página
17
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
cont=O;
Ooparte traslacional
w=n*pi;
for i=0:0.5:w
cont=conttl;
x=radio*cos(i);
y=radio*sin(i);
z=i*O.05;
temp=[x y z];
puntos=[puntos;temp];
end;
Oograficando los puntos del cilindro
Film=moviein(contj
for j=l:cont
temp=[puntos(j,l) puntos(j,2) puntos(j,3)];
plot3(temp(l),temp(2),temp(3),'b');
Film(:,j)=getframe;
end;
movie(Fi1m);
El cilindro resultante es el siguiente:
. .
.. . . . . . .
.
. . . .
.
.
:
. .
. ." ... :
.. .. u
..-.._. . ...
. . . - _. . .. . ....._
.
: .. , _ . .
. , . .'.
.. . .
.
i
.
.
.. . . .. : .
, ,
.
'.
_,
,
.
.
Figura 2
O
Reconstruyo los conos con puntos, como se hizo con el cilindro.
cont=O;
temp=radio;
%para reconstruir los conos
for i=0:0.5:n*pi
cont=conttl;
if i==((n/2)*pi)
temp=radio/2;
end
if i<=((n/2)*pi)
temp=temp-0.01;
else i>((nR)'pi)
temp=temptO.Ol;
end;
x=(temp)*cos(i);
y=(temp)*sin(i);
z=O.O5*i;
tmp=[x y z];
conol=[conol;tmp];
end;
Noviembre del 2001
Página
18
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
ooimprimiendolos conos con la espiral de puntos
Film=moviein(cont)
for j=l:cont
temp=[conol (j,l) conol (j,2) conol (j,3)];
plot3(temp(l),temp(2),temp(3),'r-');
Film(:,j)=getframe;
end;
movie(Fi1m);
Obteniendo la figura siguiente:
Figura 3
0
Después de haber construido la figura utilizando una espira formada por puntos, el siguiente paso es asignar
los cuaterniones a cada punto, es imporiante tener en cuenta que los puntos obtenidos tan solo representan
o describen la posición del objeto en el espacio mas no un movimiento. De ahí que se requiera encontrar los
cuaterniones que pertenecen a la traslación y a la rotación del objeto.
Se requiere en primer termino definir sobre cual de sus propios ejes esta girando el objeto, esto Io represento con
las coordenadas S=[Sx,Sy,Sz] la velocidad de giro la estoy tomando en términos de un ángulo de giro y el tiempo,
de la siguiente manera: W = ALFRT.
NOTA: en el siguiente código n corresponde a la altura del cilindro.
o,óaquiasocio los cuaterniones duales a los puntos obtenidos
Ob(en términos de desplazamientos)
?&parterotacional del objeto
06defino los ejes d'e dirección (Sx,Sy.Sz)
S=[l o O];
Obdefino alfa como el ángulo de rotación del objelo
alfa=n*pi/4;
Después de haber definido, el ángulo de giro y los ejes, el siguiente paso es encontrar los cuaterniones asociados a
las posiciones.
NOTA: ver partes del articulo publicado por George V Paul y Katsushi lkeuchi
Primero estoy definiendo el cuaternión asociado a la rotación.
?bel cuaternión asociado a la rotación es:
qO=cos(alfa/2);ql =S( l)*sin(alfa/2);
q2=S(2)*sin(alfa/2);q3=S(3)*sin(alfa/2);
q=[qO q l 92 931; SLcuaterniÓn resultante de la rotación
Ahora es tiempo de trabajar con la traslación del objeto, las matrices que definen las coordenadas del objeto que se
esta trasladando (Dx,Dy,Dz) se encuentran en el articulo publicado por George V Paul y Katsushi Ikeuchi.
Noviembre
2001
Página
19
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
De esta manera se obtiene el cuaternión de traslación.
Ooahora la parte de traslación del objeto
oomatrices utilizadas
Dx=[O O O 1;O O -10;O 1O 0;-1O O O];
Dy=[O O 10;O O O 1;-I O O 0;O -1 O O];
Dz=[O -1 O Oil O O ($0 O O 1;O O -1O];
Ooel cuaternión dual de traslación Io obtengo de la siguiente manera
for i=l :cont
tmp0=[cono(i,l);cono(i,2);cono(i,3)];
tmpl=(tmpO(l)*Dx*ql)t(tmp0(2)*Dy*q2)t(tmp0(3)*Dz*q3);
Q=[Q;tmpl];
end
Hasta aquí, he definido los movimientos del objeto, el cuaternión dual encontrado se refiere a los movimientos que
mas adelante se desean interpolar.
Para interpolar los cuaterniones encontrados la herramienta que utilizo son los B-spline cúbicos, esto me permite
suavizar más la curva del objeto que deseo reconstruir.
Bert Jüttler propone en uno de sus artículos encontrar coeficientes asociados a la rotación y traslación
repectivamente, los cuales los denomina pj E R3 y Cj E H (al anillo de cuaterniones).
La implementaciónl propuesta es a base de curvas de Bézier .
En primer lugar hay que tener en cuenta que ahora nuestros datos conocidos pueden verse de la siguiente manera:
x = = [ m Y(t) N 1
Con t E R
Con x(t), y(t), z(t) todas funciones diferenciales de t. Y que cumplen con lasiguiente condición:
X’(t)=[x’(t) y’(t) z’(t)] f o
Quedando la función de la siguiente forma:
X’(t)=[-radio*sin(t) radio*cos(t) paso 1;
Ya en este punto es importante no perder de vista el comportamiento del parámetro t, sobre todo porque a
continuación se estudia la parametrización de dicho elemento. Para la parametrización estoy usando una entidad que
en la literatura la denominan longitud de arco y que nos ayudara más adelante a controlar el grado de profundidad de
la cuchilla que en su momento tallará el objeto. El parámetro t juega un papel importante, pues los ti estarán definidos
de la forma: ti = a t At con AbO. Estos segmentos de tiempo pueden escogerse de diferentes formas de acuerdo a
las necesidades. Algunas de estas formas son presentadas por Bert Jüttler.
Ahora requerimos que las tramas que deseamos trabajar, experimenten movimientos como el de torsión y curvatura
de la trayectoria, para ello es necesario definir otros dos nuevos elementos llamados curvatura y torsión
respectivamente (K,z).Estos dos últimos son independientes de la parametrización de la curva.
La torsión estará dada por una función diferenciable en el tiempo. Cada posición del objeto obtenido estará
representado por un sistema móvil con origen en el puntos x y los ejes t,m,b obtenido por el proceso de
ortonormalización, de la siguiente forma:
Noviembre del 2001
Página
20
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
Capítulo Tercero
Para logar entender como funciona la interfaz hecha, pensamos que es necesario conocer
un poco de la teoría de cómo funcionan los motores a paso y el puerto paralelo, debido a esto,
se fue haciendo.
presentamos un resumen de estos temas y dentro de ellos se va explicando que
Teoría de los motores a paso
Los motores a paso y losmotoressinescobillasconstituyenenconjuntolosmotores
llamados de conmutación electrónica. Los motores a paso son apropiados para mover el eje una
cantidad de giro exacta.
Los motores a paso son fundamentalmente diferentes de los demás motores
de corriente
directa: no tienenescobillas ni conmutadormecánico.Ensulugar,
la acción de conmutación
necesaria para la función del motor de corriente directa es lograda por transistores externos. Es
mas,elrotornotienedevanado
de armadura.Simplemente
es unacolección
de imanes
permanentes salientes, como se muestra en la figura.
..-. ...
En la figura 13-5, los polos permanentes del rotor están etiquetados del 1 al 6, siendo sur
los polos 1, 3 y 5. Los polos alternos, números 2, 4 y 6, son norte. El principio de operación de un
motor a paso de imán permanente es el siguiente: el polo del estator energizado que se vuelve
norte magnético activo atrae el polo surmás cercano del rotorpara alinearlo con él. Esta acciónde
producción de par es ayudada por el polo sur pasivo del estator (del lado opuesto del estator),
atrayendo elrotor norte opuesto para alinearlo con él.
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
Definam.os la posición del rotor, mostrado en
la figura 13-5,como la posición O grados.
Hemos mostrado una flecha imaginaria de posición en el eje que apunta hacia arriba, a las 12 en
punto. A medida que gira el eje del rotor, podemos describir su nueva posición dando la dirección
en la que apunta la flecha imaginaria.
El circuito de control apaga ahora el transistor A y enciende simultáneamente el transistor
B. El polo B de:l estator se convierte en el norte activo; el polo D del estator se vuelvesur pasivo.
Los polos A y C se vuelven neutrales, se desmagnetizan. El polo B del estator atrae el polo sur 5
del rotor. El p01.0 D del estator atrae el polo norte 2 del rotor.
El rotor se mueve en direcciónde las
manecillas del reloj 30 grados, por lo que los polos del norte se alinean con los polos del estator.
Decimos que el motor toma un paso de 30 grados. La flecha imaginaria de posición ahora apunta
hacia la 1 en punto. Para avanzar los siguientes30 grados desde la posición actual, se debe apagar
la flecha
eltransistor B y encenderdeformasimultaneaeltransistorD,haciendoqueahora
imaginaria, apunte a las 2 en punto. Para hacer girar una vuelta completa el rotor, se debe seguir
la
secuencia de encendido y apagado de los transistores, hasta completar los360 grados.
Observando la figura13-5,tenemosquelasecuencia
completos en la. dirección de las manecillas del reloj:
posición del eje
o
CI O
60
90
de entradasparatomarpasos
entrada activada
A
B
C
D
y siguiendo esta secuencia se llegaríaa los 360 grados. Para mover el motor en dirección contraria
a las manecillas del reloj tenemosla siguiente secuencia:
O
-3 O
entrada activada
A
D
-60
-90
B
posición del eje
C
Se continúa con la misma secuencia hasta completarlos -360 grados
Para hacerque el motor tome medios pasos:
posición del eje
o
15
3O
45
60
'75
(30
Noviembre del 2001
entrada activada
A
AYB
B
BYC
C
CYD
D
Página
22
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
y como antes se repite la secuencia hasta completar los 360 grados.
Información practica delos motores a pasos
Lascaracterísticas de losmotoresqueseconsiguieron:estánmarcadounpaso
de 7.5
grados y una impedancia de entrada de 500. A los cuales se les empezaronha hacer pruebas de su
funcionamiento, para poder
corroborar
la
teoría
presentada
anteriormente,
y lograr
que
funcionaran.
Se observo que cada motor tiene
6 cables, de los cuales 2 son tierras y los otros cuatro
corresponden a las entradas marcadas como A, B, C y D que son las utilizadas para polarizar el
4 movimientos se recorren 30 grados, esto
estator y hacer que gire el rotor. Se deduce que con
equivale quecada giro completo delrotor (360 grados) tiene 48 pasos aproximadamente.
A estos motores que se están utilizando en el laboratorio, se alimentan con 12 Volts de cd,
y con una corriente de 200mA, generados por un eliminador de corriente con las características
antes citadas.
Algunasdelasobservaciones,
siguiente:
de laspruebasrealizadas
a losmotores,mostraronlo
Se logro ver que si se desea realizar medios pasos, estos son de aproximadamente
3.75
grados, esto nosayuda para poderavanzarconunamayordefiniciónen
los movimientos
deseados.
Tambiénseaprecióque
si unodejaunadelasentradas
de alimentacióndelmotor
conectada, estepresenta una oposición a cualquier movimiento por parte de un agente externo.
Paralograrqueserrealizaralareproduccióndelobjetoquepreviamentesehabía
reconstruido,sedebíahacerunamaquinaquefueracapazdehacerestetrabajo,peroconla
peculiaridad de ser controlada por medio de una computadora de escritorio o PC, llevándonos a la
limitación de sólo tener acceso al envíode información por alguna de sus ranuras de comunicación
con otros dispositivos, estas ranuras de comunicación son los puertos serial y paralelo. Esto nos
llevo a tomar la decisión de usar únicamente el puerto paralelo, porque muchas veces no se puede
introducir en las computadoras tarjetas de interfaz, por la arquitectura que cada fabricante maneja
en el tipo de ranuras o slot's o por el simple hecho de que muchas veces el acceso a estas ranuras
esta condicionado, para poder hacer válida una garantía,por defecto de fabrica.
Uso del puerto paralelo
El puerto paralelo de una PC es ideal paraser usado como herramienta de controlde motores,
relés, LED's, etc., El mismo posee conexión directa con el bus de datos
de la computadora, siendo
de 8 bits (Pin 2 a 9), también tiene otras terminales conectadasa é1, asociadas a algunas señales de
control que puedenser usadas fácilmente, para determinarel estado de el dispositivo conectado a
él.
Noviembre
Página
2001
~
.
23
_
_
_
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
Las PCk generalmente poseen solounodeestos
puertos (LPT1 puerto paralelo).La
dirección hexadecimal del puerto LPTlesigual
a 378h (888 en decimal). A continuación
presentamos las características del puerto paralelo.
Descripción del puerto paralelo:
El puerto paralelo de un PC posee un conector de salida del tipo DB25 hembracuyo
diagrama y señales utilizadas podemos vex-en la siguiente figura:
%
"
out; STROBE
Datea O
Datea 1
Data 2
out
Data 3
Datea 4
Data 5
Data
6
RUTOFD out
15 ERROR i n
16
INIT
out
17 SLCTIN out
18%
19
20
21
>GND
22
ACK
lo 23
IIUSY
l
1
24
PE
25
SLCT
<Data
in
in
in
in
7
-
W'
Si deseamos escribir un dato en el bus de salida de datos (pin 2 a 9) solo debemos escribir
el byte correspondiente en la dirección hexadecimal 378h (888 en decimal) cuando trabajamos con
él. Los distintos pin's (bits) de salida correspondientes al bus de datos no pueden ser escritos en
forma independiente, por lo que siempre que se desee modificar uno se deberán escribir los ocho
bits nuevamente.
Para leer el estado de los pin's de entrada (10, 12, 13 y 15) se debe realizar una lectura a la
dirección hexadecimal 379h (889 en decimal) si trabajamos con el LPTl . La lectura será devuelta
en unbyte en dondeel bit 6 corresponde al pin 10, el bit 5 corresponde al pin 12,el bit 4
corresponde al pin 13 y el bit 3 corresponde al pin 15.
En la siguiente tabla se puede ver lo antedicho en una forma más gráfica:
Noviembre del 2001
Página
24
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
En este momento uno puede lograr, por medio del bus de datos exclusivamente, manejar
un par de motores a paso, pero con la siguiente codificación, uno logra hacer trabajar hasta 16
motores, de forma independiente; Se dividió en2 grupos de cuatro bits, para enviar la información
de trabajo decada motor ( parte alta del byte ) y a que motor nos referíamos( parte baja del byte)
y por medio de un decodificador y un Latchpor motor, el lograr hacer trabajar a cada motor.
Existen otros tres bits más, distintos al bus de datos (del pin 2 al pin 9), estos tres pines
son: pin 14, pin 16 y 17; Los cuales trabajande la siguiente manera.
Para poder enviar información por medio
de estos tres pines, debe uno cambiar la dirección
del puerto, de la13781.1 a la 37Ah,y trabajar la informacióncomo se muestra en la siguiente tabla:
Noviembre del 2001
-
Página
______
25
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
Dentro tie la tabla se nos informa que cuando uno coloca un O para cualquiera de los pines
14 y 17, en realidad por el pin saldrá un 1, debido a que trabajan con lógica negativa (inversa),
mientras que el pin 16, trabaja bajo lógica positiva o directa.
Gracias a estos tres pines y al cambio de dirección, se facilita la tarea de convertir el bus de
datos a su forrna bi-direccional, y generar un nuevo diseño de hardware, y lograr tanto enviar
información de la computadora como hacer que recibainformación de la máquina talladora.
Se hizo una nueva codificación pa.ra estos tres pines:
Esta tabla nos ayuda a separar la nueva manera de trabajo con la interfaz de la máquina,
esto es, cuando se produzca la salida O00 por estos pines, la maquina sabrá que la información que
se manda por los pines 2 a 9, lleva la infixmación de trabajo de unmotor, mientras que si aparece
un 001, sabrá que se envía información lde que motor se desea revisar, y por último si llegara un
010, es que se estará usando los pines 2 a 9 para enviar la información hacia la computadora.
Noviembre del 2001
Página
26
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
UniversidadAuthonu Metropolitana
C,lU lmrld ill ! 4 / I l y ; ’ ,
!lf&9*
Gracias a esta forma de codificacih se armo el siguiente circuito:
de acoplamiento
de salida de data
Et-
Etap de Conteo del Nth.
de sue1t.s por motor
L
etapldeclcoplamienm
de tectum de data
Noviembre del 2001
Página
27
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
Donde a continuación se explicaráde una forma un pocomás detallada cada módulo:
Módulo de Acoplamiento
Efapc~de acoplamiento
de salida de datar
i r
selcctorde
Entrada o salida
de datar a la
S S
I
JCtapa de (Mplumienta
de l e c h u a de datar
Noviembre del 2001
Página
28
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
Estem6duloseencarga
de lacomunicación y protecciónentrelacomputadora
y la
máquina que se encargará de la reproducción del objeto reconstruido, de la siguiente manera. Los
optoacopladores (NTE 3221) son los encargados de proteger y comunicar a la máquina, debido a
que son diferentes hentes de alimentación de los dispositivos. Una vez pasando este punto se
(SN74LS04), porque los optoacopladoresinviertenlaseñal
encuentrancompuertasinversoras
enviado, es decir, si se envía un 1 lógico (5V),estos se encargan de transformarlo en un O lógico
(OV).
El decodificador (SN74LS139), que se encuentra enseguida de los inversores conectados a las
terminales 14, 16 y 17, se encarga de informarle a la interfaz para que parte de la información
enviada le corresponde trabajar.
El buffer (SN74LS244), que se encuentra. conectado enla etapa de entrada de datos, por medio del
decodificador, antes mencionado,dejapasarlainformación
de loscontadores de vueltas,que
censarán el trabajo de los motores. Los inversores que se encuentran antes del buffer, son para
invertir la información, y que cuando pase por los optoacopladores, lleguen
a la computadora,
como los enviaron los contadores.
Modulo de selección de motory Potencia
En este módulo, se realiza la partede separar la información correspondientepara cada motor, por
medio del otro decodificador (SN74LS139), y sea recibida por medio del latch(SN74LS373) para
cada motor, que se encargará de enviar una señala cada transistor (TIP29), que son los encargade
alimentar con la corriente necesariaa cada paso de el motor.
Noviembre del2001
Página
29
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
Módulo deconteo y selección de datos de Entrada
Aquípor rnedj.0 de los contadores (SN74LS93) y los fototransistores, se lleva el registro de
cuantos pasos ha dado elmotor que se encuentra bajo observación, hay que tomar en cuenta que se
ocuparon 4 contadores, para así tener 16 bits.
Etapa de Conteo del Niun.
de vueltas por motor
Noviembre del 2001
Página
30
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
~
~~~~~~
~
~
~~
~~~
~~~~
~____
~~
se debe recordar que los latchs (SN74LS373), se están ocupando para retener el número de pasos
contados, para ser ingresados en la computadora, pero como el bus de datos es solo de 8 bits, se
realizó con otro juego de buffers, la operación de poder ingresar por partes los 16 bits que se
ocupan para el 'conteo depasos.
Módulo de Alimentación
En esta etapa se buscó el poder dar los dos voltajes (5V y 12V), y la corriente necesaria para el
trabajo de los motores y la interfaz (aprox. 4A), para esta labor se ocuparon 2 reguladores de
voltaje (LM317T) para el voltaje de 12V y para 5V (MC7805CT).
Circuitos impresos
Para la realización de los circuitos impresos, se recurrió a la técnica de serigrafia, donde por medio
deunamalla, se realiza un sellado (fotolito) de los poros que se desea que nopase la tinta,
mientras que se dejan destapados donde se desea que la tinta se pase a la placa a gravar. A
continuación presentamos los diseños de los circuitos impresos:
Fuente de alimentación
Noviembre del 2001
Página
31
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
M:ódulo de potencia
Noviembre del 2001
Página
32
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
Interfaz principal
~~
~
Noviembre del 2001
Página
33
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
1\/1ódulode conteo
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
Módulo de selección de entrada de datos
Noviembre
2001
Página
35
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
Módulo de:Almacenamiento de datos
Noviembre
2001
Página
36
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
Capitulo Cuarto
Controladores
Programación Orientada a Objetos
Esta metodología es utilizada para la creación del software, que controla el movimiento de los
ya quelopodemosencontrarenlibros
motores. No profundizaremos mucho enestetema,
dedicados sólo a la programación orientada objetos.
a
Tenemos 3 versiones delainterfazque
controla losmotoresapaso.Dichasversiones
fueron
construidas con la metodología de orientado aobjetos.
Quizás se preguntaran: ¿Por qué no programar con una metodología procedural, en lugar de usar
la programación orientada objetos?
a
La respuesta es muy simple:
- Para poder tener código reutilizable.
- Para hacer más legible el programa.
Más adelante veremos las tres versiones de la interfaz un poco
más a detalle.
Pero eso sí cabe mencionarcada una de ellas:
- Primera versión en modo consola p,ara ms-dos utilizando c++.
- Segunda versión construida enJava..
-
Tercera versión y definitiva elaborada en C++Builder.
Puerto Bidireccional
Un serio problema es encontrar un puerto paralelo que sea bidireccional a través del bus
de datos.
Este modo de puerto, lo podemos encontrar en el Bios de una computadora. Para ser más exactos,
es el modo EPP. Pero hay un problema:
Sólo en los bios de Pentium I hacia arriba podemos
encontrar éste modo de puerto. Para otros microprocesadores equivalentes también se encuentra el
modo EPP. Así que la computadora en donde valla a ser utilizado el software y el hardware para
control de motores, previamentedeberáse
inicializada endichomodo.
Los valoresque son
generados por el software para el control
de los motores, son enviados al puerto paralelo, a la
dirección 0378H. Esta es la dirección del bus de datos del
puerto. Con una instrucción como
outp(Ox378,valor); puede ser enviado el tiato a la
salida del puerto paralelo.
Para la entradade información, utilizando el bus de datos del puerto paralelo, se tiene que hacer lo
siguiente:
- Primero enviamos a la dirección 0.378H del puerto, puras F’s. Hay que poner en alto el bus
de datos para lograr la lectura.
- Ahora se hace la lectura del puerto utilizando la instrucción: inp(Ox37C).
Noviembre del 2001
Página
31
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
Quizás se pregunten: ¿Si el busde datos está en la dirección 0378H, por qué se lee la entrada
de la
dirección 037C’? Estaes la manera en que opera el puerto bidireccional, colocando en alto el bus
de datos y leyendo de la dirección 037CH, sólo así podemos tener informaciónde entrada.
Control para Salida-Entrada
Hasta este punto, ya sabemos como sacar datos a través del puerto y como meter datos también.
Pero tenemos que tener presente que el hardware tiene un cierto comportamiento cuando salen
datos y cuando entran datos. ¿Cómo sabe el hardware cuando hay salida o entrada de datos? Para
ello utilizamos las siguientes palabras de control:
- valor 08FI
-
ó 8d, éstevalorse manda a ladirección 037AH.En éstadirecciónsehaceel
control de entrada o salida. El valor 8 le dice al hardware que se prepare para que el puerto
tenga entradade datos.
El valor OAH ó 10d, le dice hardware que se prepare para salida de datos, y con ello permitir
el movimiento de los motores.
Cabe señalar que la salida de datos, le da al hardware la información necesaria para permitir el
movimiento de los motores. Y la entrada de datos, mostrará en pantalla al usuario, que distancia ó
cuantos pasos han dadocada uno de los motores.
Generación de valores para el control de movimiento de motores a paso.
Hemos mencionado que ciertos valores, los cuales se mandan al puerto, son los que controlan el
movimiento de los motores a paso.
Recordemos rápidamente que:
Tenemos 8 bits en el bus de datos y los; cuatro menos significativos me dicen que motor es el
elegido. Y los cuatro más significativosno dan los valorespara mover los motores.
Así podemos ver la siguiente tabla, la cuál nos muestra los valores que necesitan cada uno de los
motores.
Noviembre del 2001
~
”
_
Página
_
-~
_
_
_
_
_
____________
~
38
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
1
10000001
3-......I.~
01000010
10000010
1
I
130
Cada valor de los mostrados en la tabla, permiten que cada motor pueda dar
un paso. Un ciclo que
repita cada una de éstas secuencias, perm:itirá que cada motor avance.
Por ejemplo para que el motor 1 gire en dirección de las manecillas del reloj, necesito mandar la
siguiente secuencia: primero el 16, luego el 32 y así hasta el 128. Si quiero que el motor1 gire en
la dirección contraria, mando primero el 128 luego el 64 y así hasta el 16. De la misma forma
podemos operar los otros motores.
Los datos anteriormente mostrados, son generados bajo la función: genera-datos(). Basta con dar el valor
inicial, por ejemplo el 16 para el motor 1, y genera-datos() me dará los 3 valores faltantes como son el 32,
64 y el 128. A continuación presento el código de genera-datos():
void
Motor
: :genera-datos
()
{
/ / En esta funcion realizaremos la salida
/ / para mover un motor,
en cualquiera de las
int auxiliar;
char
name[25]
,name1;
auxiliar=count;
if(se1ecciona-giro==l)
I
tout<< "Archivo: ;
cin>>name;
por el puerto paralelo
dos direcciones
[25]
'I
fstream guarda;
guarda.open(name, ios::out I ios::app);
for(int i=O;i<=ll;i++)
{
for(int j = 1 ; j<=5; j + + )
{
if ( j!=3)
{
guarda.write((char * ) this, sizeof(* this));
/ / cout<<"En la salida tenemos:"<<count<<endl;
count+=
(16*
j) ;
1
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
1
else
{
cout<<"Arc:hivo
: ";
cin>>namel;
fstream guarda;
guarda.open(name1, ios::out I 1~os::app);
for
(int
i=:O; i < = l li++)
;
I
for(int j=:4; j > = O ; j - - )
I
if(j!=:3)
I
guarda.wri.te( (char
* ) this,
sizeof
( * this) ) ;
//cout:<<"En la salida tenemos:
"<<count<<endl;
count-=:( 1 6 "j) ;
1
1
count=auxiliar;
/ / cout<<"El valor de i es: "<.:i<<endl;
1
Así
podemos
for
(int
ver
que
la
sección
de
código:
;i <
i=O
= l li++)
;
{
for(int j"4; j > = O ; j--)
I
if(j!:=3)
{
guarda.write((char * ) this, sizeof(* this)
1;
count-:=( 1 6 *j) ;
1
1
count=auxiliar;
1
genera los valorespara cada uno de los tres motores.
Cabe señalar, que la forma como utilizamos el bus de datos, nos permite llegar a tener hasta 16
motores. Sólo necesitamos en el programa dar de alta el nuevo motor y su valor inicial. Así todos
los valores que faltan para ese motor, el programa los generará sin ningún problema.
Página
40
____
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
Interfaz Versión Consola
Veamos como luce la versión consola del software:
Esta versión fimciona, tal y como se mencionó anteriormente. Tanto para generar datos , como
para salida-entrada de los mismos.
Aquí hay un problema, y es que al momento de seleccionar un motor y su respectiva dirección, se
pide el nombre del Archivo,y al teclear el nombre, este aparece en la parte superior
de la pantalla.
Tal y como se muestraa continuación:
Noviembre del 2001
Página
41
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
En términos de estética, esto no se ve muy bien. Pero en términos de funcionalidad, trabaja como
se ha descrito anteriormente. Para el control de los motores, realicemos una corrida:
Primero se da un click enla direccitjn que queramos parael motor uno.
Aparece la leyenda "Archivo".
Se tecléale nombre delarchivo.
Una vez que se da enter el programa determina los valores necesarios y los guarda en un
archivo.
Se hace los pasos anteriores para el motor2
Cuando se da click en Funciona, el programa pide el nombre de los archivos que se deben
abrir.
Manda lo datos al puerto paralelo.
Cuando se da un click en datos motor1 ó el motor que sea, el software nos dice los pasos
que ha dado el motor.
A continuación se muestra como se ve la. pantalla para consola, despuésde haber seleccionado los
motores y haberlos mandado a funcionar.
Noviembre del 2001
_
_
_
~
-
Página
.
"
"
"
42
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
Interfaz en Java
La interfaz conjava luce de la siguiente forma:
.......
Motor 3:
Constante
Funciona
I
Salir
I
Y tiene las mismas funciones, tales como: ajusta-cuenta() y genera-datos(). Esta interfaz trabaja
de la misma manera que la interfazpara :ms-dos. Aquípara controlar el puerto se utilizó la interfaz
nativa de java. Y se tuvo que construir un archivo dll. Sólo así logramos mandar datos al puerto.
Noviembre del 2001
Página
43
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
Interfaz en <:++Builder
La interfaz en ctbuilder luce de la siguiente manera:
Esta es la versión definitiva que controla el movimiento de los motores a paso. El funcionamiento
es igual al de las versiones anteriores y contiene los mismos métodos. Pero para mandar datos al
puerto se utiliztj un pedazo de código en lenguaje ensamblador, el cuál lo presento
a continuación:
asm {
mov ax,a
mov dx,Q378H
out &,art
}
éste código seutiliza para la salida de datos.
Noviembre del 2001
I-
"
__
Página
"
-
_"
__
44
"
"
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
~~
El siguiente código:
asm {
mov ax,OOH
mov ax,b
mov dx,037AH
out dx,ax
1
éste código se utiliza para la entrada de datos.
Aquí las direcciones que se utilizan, ya se: explicaron anteriormente. (ver: puerto Bidireccional).
Haciendo funcionar nuestra interfaz en ct-tbuilder nos quedm’a algo así:
Aquí seleccionamos motor1 a la derecha, y el motor 2 a la izquierda. Presionamos el botón de
funcionar, y se mueven los motores registrando un determinado númerode pasos. Los cuáles
podemos observaral presionar los correspondientes botones que dicen: recorrido motor. Cabe
señalar que el botón de restaurar se utiliza para hacer que los botones que quedan deshabilitados
se habiliten nuevamente, y se pueda hacer un nuevomovimiento de los motores.
Noviembre
~~-
2001
Página
45
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
Capítulo Cuarto
Códigos
Código dela interfaz tipo consola(ms-dos)
Presentamos a continuación las funciones principales que generan datos y los mandan al puerto.
No se presenta el código para generar los botones ya que eso es fácil realizar.
de
void
Motor:
:genera-datos ( )
t
/ / En esta funcion realizaremos
la salida por el puerto paralelo
/ / para mover un motor, en cualquiera de las dos direcciones
int auxiliar;
char name[25] ,name1[25];
auxiliar=count;
if (selecciona-giro==l)
c
cout<<"Arc:hivo:" ;
cin>>name;
fstream guarda;
: :out
I ios: :app);
guarda.
open
(name,
ios
for
(int
i=O;i<=ll;i++ 1
for(int j=l;j<=5;j + +)
{
if(j!=3)
{
guarda.write( (char
* ) this, sizeof
( * this)) ;
/ / cout:<<"En la salida tenemos:
"<<count<<endl;
count+=
(16*
) ;
j
I
1
count=auxiliar;
/ / cout<<"El valor de i es: "<.:i<<endl;
I
I
else
{
cout<<"Arc:hivo: " ;
cin>>namel-;
fstream guarda;
guarda. open (namel,
for
(int
i=O ;i<=ll;i++)
ios:
I i o s:out
: :app);
{
for(int j - 4 ; j > = O ; j--)
I
if (j!==3)
{
guarda.write( (char
* ) this, si:zeof( * this) ) ;
/ /cout;<<"En la salida tenemos
: "<<count<<endl;
count-=.
j
(16*
) ;
I
Noviembre del 2001
Página
46
~
~-
"
_
..
~
.
"
"
"
. ." ..
~
m
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
~
"
"
~
"
"
~~
~~
"
~__
UniversidadA u t 6 n w McttOpoiitaM
r w iliuwi , i l l ' c ~ , ~ ~ p
W
A
9
W
1
count=auxiliar;
/ / cout<<"El valor de ies: "<<i<<endl;
I
1
1
void
Motor:
: ajusta-count
()
{
switch
(selecciona-motor)
{
case l:if(selecciona-giro==l)
{ count~=16
;
1
else
{ count=12 ; 8
1
break ;
case 2 :if (selecciona-giro==l)
{count:=18;
I
else
{count=130;
1
break ;
case 3:exit(l);
I
1
Cabe reiterar que ésta versión de interfaz guarda y saca los datos de un archivo. Esto lo podemos
observar con el siguiente código:
El siguiente
enunciado
guarda.write(
se
utiliza
(char
* ) this,
para
guardar
datos.
siaeof( * this) )
;
El siguiente enunciado se utiliza para sacar datos.
salida.
read
(' (char * ) &all,
sizeof
(sall)
) ;
Código de la interfaz de java
Aquí sólo presento el código que es importante para mandar datos al archivo
se encarga de enviarlo al puerto paralelo.
dll. Este archivo dl1
import java.awt.*;
import java.applet..Applet;
import java.awt.event.*;
import java.awt.event.ActionListener;
import java.awt.evr:nt.ActionEvent;
/I En esta versión colocaremos todo en esta misma clase para ver si la generación de datos y el envio se lleva a cabo
mejor
public class Pantalla extends Applet implements ActionListener { //inicio class pantalla
Noviembre del 2001
Página
47
-
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
/I creacion de codigo nativo
public static native: void manda-datos(short dato,int diley); //Generando prototipo nativo
static {
System.loadLnbrary("Pantal1aimp") ;
1
public boolean listo=false;
Button Izquierda1,Izquierda2,Derechal ,Derecha2,Funciona,Salir;
static final String IZQUIERDAl="izquierda 1 'I;
static final String I)ERECHAl="derechal Ir;
static final String IZQUIERDA2="izquierda2";
static final String I)ERECHA2="derecha2";
static final String €UNCIONA="funciona";
static final String SALIR="Salir";
int numeromotor;
int selecciona-giro;
short count;
public static short arr[]=new short[ 121;
public void ajusta-cuenta()
{
switch(numer0-motor)
{ I/ inicio del switch
case 1: if(se1ecciona-giro")
{
Icount= 16;
// System.out.println(count);
1
e.lse
{count=128;
// System.out.println(count);
1
break;
case 2: iflselecciona-giro=l)
{count=18;
// System.out.println(count);
1
else
{count=l30;
// System.out.println(count);
1
bre.ak;
case 3: count=20;
break;
}//fin switch
}//fin ajusta cuenta
public void genera-datos( ) // Le paso un arreglo para generar los datos necesarios para cualquier motor
Noviembre del 2001
Página
48
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
{ N inicio genera-datos
int i=O;
if(numero-moto-1)
{ i=O; }
if(numero-motor==2)
{ ¡=4;}
if(numero-moto~=3) { i=8;)
if(selecciona-giro=l)
{
for(int j=1; j<=S;j++)
{
if(j !=3)
{
arr[i]=c:ount;
count+=( 16*j);
i++;
1
1
}
else
{
for(int j+;j>:=O;j--)
if(j!=3)
{
arr[i]-count;
count-=( 16*j);
i++;
1
1
} //fin else
Ill fin genera-datos
public void muestra-datos()
{
for( inti=O;i<= 1 I ;i++)
System.out.println(arr[i]);
GridBagLayout gridbag= new GridBagLayoutO;
void addComponente( Component comp,intgridx,int gridy,
int gridw,int gridh ) {
GridBagConstraints gbc= new GridBagCons.traints();
gbc.gridx = gridx;
gbc.gridy = gridy;
gbcgridwidth = gridw;
gbc.gridheight = gridh;
gridbag.setConstraints( comp,gbc );
add( comp );
1
I
Noviembre del 2001
Página
49
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
public void espera()
{
while(listo!=tnle){
continue ;
1
t
public void init() {
setlayout( gridbag ); //Colocamos los componentes en la pantalla
addComponente( new Label("Motor 1 ),0,0,1,l );
Izquierdal=new Button("1zquierda");
Izquierdal .setActionCommand(IZQUIERDAl);
Izquierdal .addActionListener(this);
addComponente(Izquierda1, I ,O, 1,l);
Derechal=new Button("Derecha");
Derechal .setrictionCommand(DERECHAl);
Derechal .addActionListener(this);
addComponente(Derecha1,2,0,1,l);
addComponente(new Label("Motor 2:"),0,1,1,l);
Izquierda2=new Button("1zquierda");
:I'
Izquierda2.setActionCommand(IZQUIERDP~2);
Izquierda2.addActionListener(this);
addComponente(Izquierda2,1,1,1,1);
Derecha2=new Button("Derecha");
Derecha2.~etrictionCommand(DERECHA2);
Derecha2.addActionListener(this);
addComponente(Derecha2,2,1,1,1);
addComponente(new Label("Motor 3:"),0,2,1,1);
addComponente(new Label("Constante"), 1,2,1,1);
Funciona=new Button("Funciona");
Funciona.setActionCommand(FUNCI0NA);
Funciona.addActionListener(this);
addComponente(Funciona,1,4,1,1);
Salir=new Button("Sa1ir");
Salir.setActionCommand(SAL1R);
Salir.addActionListener(this);
addComponente(Salir,2,4,1,1);
I
public void actionF'erforrned(ActionEvent evt)
String command=evt.getActionComrnand();
if(command==SALIR){ // Si se teclea salir nos salimos del programa completamente
System.exit(0);
{
1
if(command =: IZQUIERDAl){ // Para el programa si se teclea boton izquierdo
Derechal .setEnabled(false);
selecciona-gi.r0=2;
numeromotor= 1;
ajusta-cuenta();
~
Noviembre del 2001
~~~~
Página
50
~~
.. ."
"~
"~
.
. -. -
~-
"
~- ~ _ _
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
."
~
m
Tn%l hijclli dl!,:?l.,p
-
~
.
~
UniversidadAut6nom M@tropolkaM
! l f d a d 9 ~
genera-datos();
1
if(command==DERECHAl)
í
Izquierda1 .setEnabled(false);
;
selecciona-giro=l
numero-motor=l ;
ajusta-cuenta();
genera-datos(:);
1
if(command==IZQUIERDA2) { // Para el programa si se teclea boton izquierdo
Derecha2.~e:tEnabled(false);
selecciona_giro=2;
numero-motor=2;
ajusta-cuenta();
genera-datos();
1
if(command= DERECHA2)
í
Izquierda2.~etEnabled(false);
selecciona-giro=l ;
numero-moto~2;
ajusta-cuenta();
genera-datos();
1
if(command=FIJNCIONA)
i
selecciona-giro=l ;
numero-moto~3;
ajusta-cuenta();
genera-datos();
muestra-datos();
listo = true;
1
I
public static void main (String arg[] )
{
Frame g n e w Frame("Contro1 de motores a paso");
Pantalla Pansnew Pantalla();
Pantinit();
f.add("Center",Pant);
f.pack();
f.show();
Noviembre del 2001
Página
51
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
1
} llfin class pantalla
Código interfaz c++builder
Aquí presentamos, todo el código de ésta interfazya que es la interfaz definitiva.
I/
#include <vcl.h>
#include <time.h>
#include <stdio.h>
#include <dos.h>
#include<conio.h>
#pragma hdrstop
#include "m0tor.h"
#pragma package(smart-init)
#pragma resource " * . d h "
TForml *Form1 ;
short am[ 12],count=O,b=l6,delay=O;
/lint retardo=O;
int selecciona-motor=O,selecciona-giro=O;
11
void ajusta-count()
{
switch(se1ecciona-.motor)
{
case l:if(selecciona-giro=l)
{count= 16;
1
else
{count= 128;
}
break;
case 2:if(selecciona-giro=l)
{ counSl'7;
1
else
{count= 129;
1
break;
case 3: if(se1ecciona-giro== 1)
{ count=l8;
1
else
{count= 130;
1
I
break;
Noviembre del 2001
Página
52
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
//
void carga-arreglo()
{
"""-
int i=O;
if(selecciona-motor=l)
{ izo;}
if(selecciona~motor=2)
{ i=4;}
if(selecciona~motor==3) { i=8;}
if(se1ecciona-giro==I)
{
for(short j=1; j<=5;j++)
{
if(j!=3)
{
arr[i]=count;
count+=(b*j);
i++;
t
1
t
else
{
for(short j=4;j>=O;j--)
1
ifcj!=3)
{
arr[i]=count;
count-=(b*j);
i++;
t
1
} //fin else
/I
/I
}//fin füncion carga-arreglo()
//
void salidapuerto(sh0rt a){
asm {
mov ax,a
mov dx,0378H
out dx,ax
t
1
void selecciona-entrada() {
short b=8;
asm {
mov ax,OOH
Noviembre del 2001
Página
53
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
mov ax,b
mov dx,037AP[
out dx,ax
I
1
//
"""""""---------
void retardo() //tiene la función del delay()
í
for(int i=O;i<=2OOOOOOO;i~)
{
9
t
t
// """_
void mandadatoso
{ short a,b=l O;
int vueltas=O;
I/ al hardware le indico quesolo tendré salida de datos
asm {
mov ax,OOH
mov ax,b
mov dx,037AH
out dx,ax
I
do f
for(int i=O;i<=3;i++)
f
a=arr[i];
salidapuerto(a);
retardo();
a=arr[i+4];
salidapuerto(a);
retardo();
a=arr[i+8];
salidapuerto(a);
retardo();
t
vueltas++;
}while(vueltas<=48);
t
//
short lectura()
í
short salida=255,entrada=O;
asm { //ponemos en alto el puerto
mov ax,salida
mov dx,0378H
out dx,ax
I
/I nos esperamos un poco
Noviembre del 2001
Página
54
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
asm {
mov dx,037cH
in ax,dx
mov ah,OOH
mov entrada,ax
I
return entrada;
I
//
-fastcall TForml ::TForml(TComponent* Owner)
: TForm(0wner)
{
I
//""_""""""
void -fastcall TForm1 ::Button1Click(T0bject *Sender)
{ Button2->Enabled=false;
selecciona-motor= 1;
selecciona-giro=2; //siempre hacia la derecha
ajusta-count();
carga-arreglo();
1
//
void "fastcall
TForm1 ::SalirClick(TObject *Sender)
i
Close();
I
//
""_"""""
void -fastcall TForm1::FuncionaClick(TObject *Sender)
{
selecciona-motor=3;
selecciona-giro= 1; //siempre hacia la derecha
ajusta-count();
carga-arreglo();
mandadatoso;
}
//
"_
void -fastcall TForm1 ::SalirlClick(TObject *Sender)
t
Close();
I
//
"
"
"
"
"
"
"
"
"
"
"
"_
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
void -fastcall TForml ::Button2Click(TObject *Sender)
{ Button1->Enabled=false;
selecciona-motorzl ;
selecciona-giro= 1; //siempre hacia la derecha
ajusta-count();
carga-arreglo();
1
//
void -fastcall TForml ::Button3Click(TObject *Sender)
{ Button4->Enabied=false;
Noviembre del 2001
~
_
_
_
_
"
~
Página
-
55
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
selecciona-moto~2;
selecciona-giro=2; //siempre hacia la derecha
ajusta-count();
carga-arreglo();
1
//
void -fastcall TFormI ::Button4Click(TObject *Sender)
{ Button3->Enabled=false;
selecciona-motor=2;
selecciona-giro=l ; //siempre hacia la derecha
ajusta-count();
carga-arreglo();
1
//
"""""""-
"
"
"
"
"
"
"
"
"
"
""
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
void -fastcall
TForml ::ButtonSClick(TObject *Sender)
{
Button 1->Enabled=true;
Button2->Enabled~=true;
Button3->Enabled=true;
Button4->Enabled--true;
1
//
void -fastcall
{
TForml::EditlChange(TObject*Sender)
//introducir datos para el delay()
1
//
void -fastcall
I
TForml ::Button6Click(TObject *Sender) //recorrido m1
short cl,c2,alta=l6,baja=O;
// primero seleccionamos modo de entrada
selecciona-entrada();
retardo(); //Esperamos un pequeño retardo
// primero pedimos la partealta
asm { mov ax,OOH
mov ax,alta
mov dx,0378H
out dx,ax
1
c 1 =lectura();
Labels->Caption=cl;
asm { mov ax,OOH
mov ax,baja
mov dx,0378H
out dx,ax
1
retardo();
c2=lectura();
Label7->Caption=c2;
1
Noviembre del 2001
Página
56
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
""_
//
void -fastcall TForm1 ::Button7Click(TObject *!sender) //recorrido m2
{
short cl,c2,alta=l7,baja=l;
I/ primero seleccionamos modo de entrada
selecciona-entrada();
retardo(); //Esperamos un pequeño retardo
I/ primero pedimos la parte alta
asm{mov ax,OOH
mov ax,alta
mov dx,0378H
out dx,ax
1
c I=lectura();
Label6->Caption=:c1;
//seleccionamos parte baja
asm { mov ax,OOH
mov ax,baja
mov dx,0378H
out dx,ax
1
retardo();
c2=lectura();
Label8->Caption=c2;
1
//
......................................
void -fastcall TForm1 ::Button8Click(TObject *Sender)
1
short cl,c2,alta=l8,baja=2;
/I primero seleccionamos modo de entrada
selecciona-entrada();
retardo(); //Esperamos un pequeño retardo
/I primero pedimos la parte alta
asm { mov ax,OOH
mov ax,alta
mov dx,0378H
out dx,ax
1
c I=lectura();
Label9->Caption=c1;
//seleccionamos parte baja
asm { mov ax,OOH
mov ax,baja
mov dx,0378H
out dx,ax
1
retardo();
c2=lectura();
Label 1O->Caption=c2;
1
//
Noviembre del 2001
Página
57
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
BIBLIOGRAFÍA
Electrónica Industrial Moderna
TIMOTHY J. Maloney
3". Edición (1997)
Prentice Hall
Los microprocesadores Intel
Arquitectura, programación e Interfaces
BARRY B. Brey
3". Edición (1995)
Prentice Hall
Lenguaje Ensambladory Programación para PC IBMy Compatibles
PETER Abel
3". Edición (1996)
Pearson Educación
Aprendiendo Borland Cbuilder3
DONALD Dohertyy Michel Manning
1". Edición (2000)
Pearson Educación
Aprendiendo Orientado a Objetos en C++ en21 días
GREG Perry
Gráficos poderosos con C++
WEISKAMP y Heiny
1". Edición (1994)
Noriega Editores
Sitios de internet:
www.abcdatos.cm
www.sun.iava.com
www.suDeriorelectric.com
www.swin.net/usuarios/miguel/index.htm
Noviembre
Página
2001
~
_
_
_
58
_
_
_
_
~
Reconstrucción y Reproducción de
Volúmenes y superficies en movimiento.
i
m
L I U dlu71;
ni !'W'p.,
Universidad Aut6nonu Metropolitana
!74u&d9*
Articulos:
Representing the Motionof Objets in Contact using Dual Quaternions and its Applications
George V Paul and Katsushi Ikeuchi
1997 Carnegie Mellon University
Visualization of Moving objects Using Dual Quaternion Curves
Bert Jiittler
1994 Elsevier Science Ltd.
Quaternion optimization problems in englineering
L. Meister
Diseño de Movimientos
Un Ejemplode Interpolación multivariada
Leonardo Traversoni
Universidad Autónoma Metropolitana
Computer Aided Geometric Desing
of two-parameter freeform motions
Q.J.Ge y M. Sirchia
1998 ASME Desing Engineering Technical Conferences
Noviembre del 2001
Página
59
Descargar