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