Planta Piloto para La Obtencion de Bioetanol - R5
Planta Piloto para La Obtencion de Bioetanol - R5
Planta Piloto para La Obtencion de Bioetanol - R5
INSTITUTO TECNOLÓGICO DE
LÁZARO CÁRDENAS
TRABAJO DE INVESTIGACION
PRESENTA:
Av. Melchor Ocampo # 2555, Col. Cuarto Sector, C.P. 60950, Cd. Lázaro Cárdenas, Michoacán,
Teléfono (753) 53 7 19 77, 53 2 10 40, 53 7 53 91, 53 7 53 92 Dirección Ext. 101
e-mail: direccion@itlac.mx Internet: www.itlac.mx.
CONTENIDO
CONTENIDO
CAPÍTULO I. PRELIMINARES..........................................................................6
1.1. INTRODUCCION........................................................................................................6
1.2. PLANTEAMIENTO DEL PROBLEMA.....................................................................8
1.3. ANTECEDENTES........................................................................................................9
1.3.1. ESTADO DEL ARTE.............................................................................................21
1.4. OBJETIVO GENERAL DE LA INVESTIGACIÓN.................................................24
1.4.1. OBJETIVOS ESPECÍFICOS..................................................................................24
1.5. JUSTIFICACIÓN.......................................................................................................24
1.5.1. ALCANCES Y LIMITACIONES...........................................................................26
CAPÍTULO II. MARCO TEÓRICO..................................................................28
2.1. INTRODUCCION..........................................................................................................28
2.2. SISTEMA DE ADQUISICIÓN DE DATOS (SAD).....................................................29
2.2.1. ELEMENTOS DE UN SISTEMA DE ADQUISICIÓN DE DATOS....................30
2.2.2. ESQUEMAS DE ADQUISICIÓN DE DATOS......................................................42
2.2.3. SISTEMAS DE ADQUISICIÓN DE DATOS BASADOS EN PC........................44
CAPÍTULO III. METODOLOGIA.....................................................................49
3.1. DIAGRAMA A BLOQUES DEL INVERSOR PARA UPS.........................................49
3.1.1. CARGADOR DE BATERÍA..................................................................................50
3.1.2. INVERSOR.............................................................................................................51
3.1.3. SISTEMA DE ALIMENTACIÒN ININTERRUMPIDA (UPS)............................56
3.2. DIAGRAMA COMPLETO DEL INVERSOR PARA UPS..........................................59
CAPÍTULO IV.....................................................................................................60
4.1. CARGADOR DE BATERÍA.........................................................................................62
4.2. INVERSOR....................................................................................................................64
4.3. UPS.................................................................................................................................65
CAPÍTULO V......................................................................................................67
5.1. INVERSIÓN INICIAL...................................................................................................67
5.2. FINANCIAMIENTO DE LA INVERSIÓN..................................................................70
5.3. PRESUPUESTO DE INGRESOS..................................................................................70
CAPÍTULO I. PRELIMINARES
1.1. INTRODUCCION.
El proyecto está orientado al estudio de los principales procesos que se llevan a cabo
en él, tales como la fermentación, que es una reacción química simple en la que el
azúcar reacciona con la levadura a determinada presión y temperatura para
convertirse en alcohol etílico y dióxido de carbono. Una vez realizada dicha
fermentación es importante separar el compuesto que se obtiene tanto como sea
posible, por lo que la planta se conformará también con un proceso de separación,
en este caso el óptimo es la destilación, por la naturaleza líquida de mezcla. Puesto
que es una planta a escala, en nuestros objetivos no se espera una cantidad
significativa del destilado sino un proceso funcional que nos permita estudiarlo.
El proceso está diseñado para tener un gran control sobre las variables, la
temperatura en la sección de destilación se mide mediante un termómetro montado
en campo y se controla mediante un quemador.
primas, entre las cuales se encuentra la fruta o cualquier vegetal que contenga
azúcar, este se lava y desinfecta para evitar que contenga elementos que puedan
contaminar la mezcla, que se encuentra en un medio acuoso a temperatura
ligeramente alta. Finalmente, se le agrega la levadura y se agita.
1.2. ANTECEDENTES.
Diseño de una planta piloto para la producción de etanol a partir del bagazo de
la caña de azúcar. Carolina Parsons Martínez, Emmanuel Ramith Banqueth Verbel,
2004
medio y con herramienta de fácil adquisición, esto con el fin de reducir los costos del
producto y hacerlo viable.
Este proyecto fue realizado bajo el marco de compromisos adquiridos con el grupo
de Bioetanol
para celdas de combustible del CYTED (Programa iberoamericano de ciencia y
tecnologia para el desarrollo). El objetivo principal fue realizar el diseño de una planta
piloto para la producción de etanol a partir
del bagazo de la caña de azúcar, haciendo en primer lugar, una revisión bibliografica
de las tecnologias existentes para la producción de alcohol a partir de material
lignoceluidsico, de donde se escogió la tecnologia utilizada en este proyecto;
prehidrálisis con ácido diluido, Hidrolisis con ácido concentrado, fermentación con
Zymomonas Mobilis y la recuperación y recirculación del ácido teniendo en cuenta la
calidad del producto obtenido y la rentabilidad de su producción.
Hacer una planta piloto de fermentado y destilado para obtener alcohol a partir de
frutas
Elaborar un fermentador
Elaborar un destilador
1.5. JUSTIFICACIÓN.
2.1. INTRODUCCION.
El mundo físico que nos rodea, es realmente analógico, y en teoría no hubiese cabida posible
de la tecnología actual, por su desarrollo alrededor de estructuras digitales; es por esto que,
para que una magnitud física en particular pueda ser controlada o modificada, requiere una
previa conversión, mediante un transductor, al correspondiente valor de tensión analógico; de
esta forma se posibilita el procesamiento de una magnitud específica, a través de un sistema
electrónico, para obtener una respuesta deseada [6, 7].
Estos sistemas electrónicos son conocidos como sistemas de adquisición de datos (DAQ), los
cuales permiten una integración de velocidad y control entre elementos centrales y periféricos,
con el objetivo de obtener una representación digital lo más fiel posible a la señal analógica
original [7].
Esta interacción entre el mundo físico y el virtual es posible a través del protocolo USB cuya
característica Plug & Play lo convierte en la interfaz de transmisión de datos y distribución de
energía, por excelencia [9, 10].
En este capítulo se muestra información útil para el compendio de los sistemas de adquisición
de datos, se continua con la instrumentación virtual para el desarrollo de plataformas HMI
(Interfaz Humano - Maquina), y se plasma el protocolo USB como interfaz de comunicación
entre dichas arquitecturas. Se trata además, temas como los sistemas de procesamiento de
señales en los cuales se hace énfasis en los procesadores orientados a la alta velocidad.
Los sistemas integrados mencionados, son los denominados Sistemas de Adquisición de Datos
(SAD) que poseen características de conversión de señales provenientes del entorno, en datos
digitales equivalentes factibles de manipulación. Las aplicaciones posibles que se pueden
desarrollar, a través de estos sistemas, dependerán únicamente de la función que se requiera
implementar [7].
Al ser sistemas como tales, están compuestos de varios elementos con los que requieren
interactuar para cumplir con su fin ulterior. Estos elementos están agrupados por etapas que se
clasifican en [7]:
a. Amplificación; usada para los casos en que las señales que ingresan en el sistema sean
demasiado pequeñas como para que sus características e información útil sea
identificable por el ADC. Este proceso permite el incremento en la resolución y la
reducción en el ruido inherente de la señal en cuestión.
b. Aislamiento; en lo que respecta al transductor con el objeto de eliminar ruido, proteger
al sistema contra posibles picos de tensión/corriente y evitar lecturas erróneas
ocasionadas por lazos de tierra (diferencia de potencial en tierra).
c. Multiplexado; cuya funcionalidad se ve reflejada en una multiplicidad de mediciones a
diferentes fuentes de señales de ingreso. Estas mediciones se efectúan en una relación
de 1 a 1 entre el número de muestras tomado y el canal a medir por lo que la toma de
datos es secuencial. La velocidad efectiva de muestreo por canal es inversamente
proporcional al número de canales existentes.
d. Filtrado; cuya idea de existencia es la de limitar o eliminar en su totalidad todas
aquellas señales interferentes con la señal a manipular, con el objeto de obtener
solamente información útil para el respectivo procesamiento. Dado que puede
trabajarse con señales de índole continua y alterna, los filtros a implementar deberán
ser diseñados para que, en el ingreso del dispositivo ADC, se tenga la señal original sin
modificación de ningún tipo.
e. Linearización; usada en el ingreso de los S.A.D. para aquellos transductores cuya
respuesta no es lineal. Esta conversión tiene por objeto obtener información escalable
de la señal adquirida para poder transformarla a su símil digital y de esta forma
emplear dicha información para monitoreo y control de un proceso en particular.
f. Proceso de Sample & Hold; que permite garantizar la función total de un ADC a través
de un amplificador del mismo tipo, lo que permite a su vez mantener las muestras en el
estado requerido durante el tiempo propicio para su lectura y conversión [8].
Existen de diferentes tipos cuya particularidad de función estará definida por la aplicación a la
que se encamina [8]. Su selección se hace dependiendo de los siguientes factores:
o Resolución.
o Tiempo de establecimiento, que es el tiempo requerido para la conversión como tal.
o Precisión absoluta, entendida como el margen de error entre la salida analógica real
y la esperada.
o Estabilidad térmica
o Conversión unipolar o bipolar, entendida como la posibilidad de aceptación de
códigos unipolares o bipolares de ingreso.
o Códigos digitales de entrada, de los cuales los más aceptados son BCD,
complemento a dos, binario natural, etc.
o Salida analógica, cuya caracterización será por corriente o tensión.
o Sensibilidad ante variaciones de la fuente de alimentación.
o Margen dinámico de la señal de salida, entendido como el margen de señal que se
puede obtener en las salidas de estos conversores.
Dichos conversores se clasifican según dos criterios básicos, así tenemos [8]:
o Estructuras directas, que a su vez se clasifican en estructuras multiplicadoras con
fuentes de corriente o resistencias ponderadas y en estructuras con redes de
resistencias en escalera R-2R. Los efectos obtenidos a través de estas estructuras
son los mismos.
o Generación de impulsos (sobremuestreo) o bit-stream, esta técnica es empleada
sobre la frecuencia de salida de las muestras con el objeto de poder hacer uso de
conversores de menor precisión y, por ende, mayor resolución.
Las alternativas comerciales que se presentan para los dos tipos de conversores, A/D y D/A,
son extensas, entre las más usadas para aplicaciones de adquisición de datos se encuentran las
siguientes [8].
Se hace énfasis principalmente en las técnicas de diseño de tipo monolítico e hibrido ya que
estas presentan grandes niveles de desempeño para el fin buscado. En esta sección se
presentan las arquitecturas internas de los diversos componentes de la conversión de alta
velocidad [10].
Como se mencionó anteriormente, varias son las etapas de conversión, por lo que, en este
apartado se tratan sobre las más importantes definidas como amplificación, acondicionamiento
y conversión propiamente dicha.
En lo que respecta a la etapa de amplificación, las estructuras usadas son las siguientes:
o Amplificadores Buffer:
En la figura 2.3 podemos apreciar esquemas de Buffer para alta velocidad. Estos circuitos en
particular integran simplicidad, bajo costo, banda ancha y sencillez de aplicación. Estos
arreglos son básicamente buffer de lazo abierto que tienen impedancias de 5 ohms y pueden
lograr anchos de banda de varios cientos de MHz.
Figura 2.3. Arquitectura interna de un amplificador tipo High Speed Buffer (Buffer HS). a. Buffer
Bipolar. b. Buffer FET
Dichos circuitos permiten manejar cargas altamente capacitivas sin implicar reducción alguna
del ancho de banda ofrecido.
o Amplificador Operacional:
Este tipo de amplificadores se presenta en la figura 2.4 y se caracterizan por poseer tiempos de
establecimiento por debajo de los 100ns con una tolerancia de 0.01% y anchos de banda en
lazo abierto por encima de los 100 MHz. Esta optimización decanta en perdida de ganancia en
lazo abierto, pero permite una estabilidad sobre la temperatura y linealidad mediante una
correcta adecuación de señal.
Se debe tener en cuenta que los amplificadores High Speed o de alta velocidad deben ser
diseñados con una resistencia interna mínima de 50 ohms ya que los cables empleados en
estos sistemas serán usados para interconectar señales de alta frecuencia [10].
o Comparador:
un amplificador de alta ganancia que posee una estructura en cascada para lograr un ancho de
banda de ganancia alta. En la figura 2.5 se ve la implementación de este tipo de comparador.
Figura 2.5. Arquitectura interna de un comparador de alta ganancia tipo High Speed.
La segunda implementación que es por aproximación tipo latch, se muestra en la figura 2.6 y
permite una gran ganancia a través de la puesta en marcha de la filosofía de estados
regenerativos, o estados realimentados, mediante la señal de habilitación latch.
Los conversores A/D más rápidos del mercado hacen uso de comparadores tipo latch para
cada nivel de cuantización ya que implementan una moderada simplicidad capaz de permitir la
cantidad necesaria de integración de los demás dispositivos involucrados [10].
o Conversores D/A:
El esquema de la figura 2.7 muestra la arquitectura interna típica de los conversores de alta
velocidad. Estos se caracterizan por ser compatibles con los elementos TTL. Dichos esquemas
permiten alcanzar resoluciones de 12 bits con un tiempo de establecimiento de 26ns con
tolerancia de 0.01% y puede operar en condiciones ambiente en un rango de entre -55º C y
Figura 2.7. Arquitectura interna de un conversor D/A de alta velocidad con corrientes equilibradas.
o Conversores A/D:
Las primeras arquitecturas son características para las aplicaciones de alta velocidad, tienen
una estructura monolítica que les permite alcanzar velocidades mayores a 500MHz y tiempos
de conversión mayores a las 200MHz apegados al uso de dispositivos bipolares [10].
Las siguientes se caracterizan por su alto grado de desempeño mostrado en conjunto con su
compatibilidad hibrida y monolítica a través de tecnologías Bipolar, CMOS y BiMOS.
Las últimas mencionadas son también conocidas como de doble paso, pueden lograr una alta
resolución en comparación a los anteriores. Integran las características más relevantes de las
anteriores. El diagrama de bloques de la figura 1.8 muestra sus etapas embebidas.
Una vez analizados los componentes de un Sistema de Adquisición de Datos, se continúa con
la caracterización de los diferentes esquemas que pueden presentarse en la adquisición de
datos como tal.
Los esquemas que podemos encontrar en un sistema de este tipo dependen de la característica
en la etapa de control que posean pudiendo ser de tres tipos [6].
Debido a que los esquemas de control digital directo son los que se encuentran en auge en la
actualidad, por las innumerables aplicaciones que son factibles a través de ellos, se amplía su
caracterización a través de los sistemas basados en PC, cuyo funcionamiento se encuentra
basado en dicho esquema.
Los sistemas basados en PC, como se indicó anteriormente, precisan de una interacción entre
hardware y software para cumplir sus fines ulteriores, cuyos resultados se plasman en datos
disponibles para su correspondiente análisis. Esta interacción se presenta como factible a
través de una interfaz por protocolo USB y una interfaz gráfica a través de instrumentación
virtual. Se analizan las características de cada uno de ellos.
Protocolo USB.
El protocolo USB contempla una interfaz plug & play entre una PC y dispositivos periféricos.
Una característica importante de este protocolo es que permite a los dispositivos trabajar a
velocidades mayores, con característica High Speed, esto es, aproximadamente, de 120 a 200
veces más rápido que un dispositivo de puerto paralelo y de 800 a 1600 veces más rápido que
un dispositivo de puerto serial [5].
Los nuevos avances en lo referente a estos modelos han hecho posible la existencia comercial
del USB 3.0 que puede alcanzar velocidades de hasta 4.8 Gbps y contempla aplicaciones
enfocadas a HDTV.
La interfaz implementada a través de este protocolo debe caracterizarse por una marcada
simplicidad por lo que varios son los métodos que se implementa para tal fin. En la parte de
hardware, específicamente en la comunicación ADC – Microprocesador, cuando se presenta el
caso de módulos independientes, los esquemas más importantes son:
Instrumentación virtual.
El termino instrumentación se refiere a la medición de variables tanto físicas como virtuales,
mediante dispositivos diseñados para tal fin, con el propósito de ejercer alguna acción sobre
dichas variables que generalmente son señales [11].
Esta virtualización representa una gran ventaja en lo que se refiere a repetitividad de procesos,
ya que un mismo hardware permite, mediante interconexión de redes, un uso general para un
mayor número de dispositivos de censado, que si lo estuviéramos haciendo mediante la
instrumentación convencional.
Dicha instrumentación virtual decanta en dos corrientes de censado mostrado al usuario final,
estas son:
El software a usar en estos sistemas, para contemplar aplicaciones con instrumentación virtual,
debe cumplir con las siguientes consideraciones [13]:
Los instrumentos virtuales, que forman una parte esencial de un sistema basado en PC, para
ser comparables con la realidad, deben cumplir con tres funciones específicas como son:
análisis, adquisición, y presentación de datos, solo así se asegura el brindar un dispositivo de
instrumentación completo [12, 13].
Puerto USB compatible con V2.0, velocidad máxima sin cristal de 12 Mbps, buffer
RAM de acceso de 1 kByte.
Estructura de oscilador flexible con multiplicadores de reloj PLL de x3 y x4, dos
modos de reloj externo de hasta 48 MHz (12 MIPS), oscilador interno de 31 kHz a 16
MHz.
Hasta 33 terminales de E/S como puertos digitales, con corriente de 25 mA.
Tres Interrupciones externas programables.
Módulo de puerto serie síncrono maestro, compatible con comunicación SPI a tres
cables e I2C modo maestro esclavo.
Modulo convertidor analógico a digital de 10 bits con 25 canales de entrada.
Módulo USART mejorado, que soporta RS-485, RS-232 y LIN / J2602 y detección
automática de baudios.
Tecnología flash CMOS de alta velocidad y bajo consumo.
Arquitectura optimizada del compilador C para códigos reentrantes.
Amplio rango de voltaje de funcionamiento de 2.3 V a 5.5 V.
Memoria flash de programa de 10,000 ciclos de borrado / escritura, retención de datos
mínima de 20 años.
Niveles de prioridad para interrupciones.
Auto programable bajo control de software.
Multiplicador de hardware de ciclo único 8 x 8.
Temporizador de vigilancia extendido (WDT): Periodo programable de 4 ms a 131 s.
Programación en serie en circuito de suministro único (ICSP) a través de dos pines.
X-TRAINER P8 LITE (Figura 3.3.) es una versión ligera del emblemático X-TRAINER P8,
un módulo de desarrollo para proyectos electrónicos basados en microcontroladores PIC de 40
terminales a 8 bits, su nuevo y compacto diseño permite la programación, depuración e
implementación de códigos. Conserva la característica de tener un conector SIL de 40 pines
clasificado por puertos que facilita la integración en un Protoboard, sin importar el
microcontrolador PIC que se coloque en el zócalo siempre se conservará la misma distribución
de los pines. Dispone de dos push button (RESET y BOOT), un LED para uso de propósito
general, un conector micro USB para comunicación por el puerto USB del PIC y un conector
ICSP para el uso de programadores externos [15].
Especificaciones técnicas:
Fuente de alimentación: 5 V.
Conector de alimentación externa: 7-12 VDC.
Compatible con 104 microcontroladores Microchip PIC® de 40 pines a 8 bits.
Conector SIL macho de 40 pines serigrafiado para acceso a puertos digitales,
analógicos y periféricos.
Conector micro USB tipo-B para programación y alimentación.
Puerto de programación ICSP.
La elección de esta tarjeta se debe a su bajo costo de adquisición (su costo ronda los $200
pesos mexicanos), la posibilidad de permitir insertarse en un Protoboard (figura 3.4.) gracias a
su peineta de más de 30 terminales tipo headers que nos permiten acceder a las funciones
incorporadas de sus terminales y nos facilita el poder realizar prácticas de laboratorio, además
los extremos de esta peineta tiene dos puntos para alimentar pequeñas cargas, ya que nos
permite tomar alimentación de +5V y GND.
El bus de comunicación USB (Universal Serial Bus) es un bus serie con una estructura de
árbol que permite la conexión de diversos dispositivos en cadena permitiendo la transferencia
síncrona y asíncrona entre estos [17].
La comunicación USB es un bus punto a punto, que comienza en el HOST y cuyo destino es
el HUB. El HOST es el dispositivo maestro que inicia la comunicación y el HUB es el
dispositivo que contiene uno o más conectores o conexiones hacia otros dispositivos USB.
Cada conector es un puerto USB.
Además, cada dispositivo USB tiene una jerarquía de descriptores que informan al host sobre
cómo se constituye el dispositivo y sus características de funcionamiento, tales como: la clase,
el número de serie del producto, la identificación del fabricante, el tipo de dispositivo, etc.
El cable USB posee internamente un par trenzado (D+ y D-) además de la tierra y la
alimentación (+5V). USB es muy popular debido a su compatibilidad con diversas
plataformas y sistemas operativos, además de su bajo costo de implementación y su facilidad
de uso. Hay dos tipos de puertos y conectores de cables USB: A, B y C. En la actualidad se ha
ampliado el alcance de conectores utilizados para dispositivos USB, pero la mayoría de
productos USB todavía utilizan los conectores con interfaces A y B (figura 3.5.).
Básicamente, hay tres tipos de clases más utilizadas: Human Interface Device (HID), Mass
Storage Device (MSC), Communications Device Class(CDC).
Nuestro enfoque de estudio estará en la Clase de Dispositivo de Comunicaciones (CDC). Los
dispositivos de este tipo de clase implementan un mecanismo de comunicación de propósito
general que se puede utilizar para la comunicación entre la mayoría de los dispositivos.
El VID es un número de 16 bits asignado por el fabricante del hardware a conectar. En nuestro
caso podemos utilizar el número 04D8h que identifica a Microchip. O para este ejemplo, usar
el número propio del CCS C 2405h que viene por defecto en el compilador.
USB_CDC_ISR () se puede definir si desea que una rutina específica cuando haya
datos entrantes por el USB CDC (puerto virtual virtual). Esta es una rutina de
“interrupción serial” la cual posee algunas limitaciones.
usb_task(): se usa para verificar el estado lógico del pin USB_CON_SENSE y debe
llamarse como máximo cada 1 ms cuando se usa una fuente externa. Si se alimenta el
PIC a través del propio USB NO es necesario llamar esta función cada 1 ms.
Limitaciones de interrupción.
El manejo del USB es complejo, y a menudo requiere varias transmisiones de paquetes para
lograr la transferencia de un bloque de datos. La mayor parte de este procesamiento se realiza
en el USB ISR. Debido a esto, no se puede llamar la función usb_cdc_putc() dentro de
otro ISR, el USB ISR o cuando los ISR están deshabilitados. Para solucionar este problema, se
recomienda usar usb_cdc_putc_fast() y la opción USB_CDC_DELAYED_FLUSH.
La tarjeta X-TRAINER P8 LITE, cuenta con un conector micro USB tipo-B hembra para
programación, alimentación de +5 V (figura 3.6.) y al adquirir la tarjeta trae el cable de
conexión micro USB tipo-B macho & USB tipo-A de 1.20 mts de largo.
Para elegir el puerto USB de la tarjeta y quede habilitado eléctricamente se debe seleccionar
su conexión mediante un interruptor que conecta USB < o > GPIO, en este caso elegimos la
opción USB por su puesto.
El sistema DAQDyna cuenta con tres puertos digitales de propósito general que son el puerto
B [B0 – B7] con 8 bits, el puerto D [D0 – D7] con 8 bits y el puerto E [E0 – E5] con 6 bits.
Los puertos B, D y E tienen la capacidad de ser configuradas cada una de sus terminales como
entradas o salidas de manera independiente, pero solo los puertos B y D se pueden configurar
para trabajar como buces de datos de 8 bits de entrada o salida.
El microcontrolador PIC18F45K50 cuenta con resistencia de pull-up interna para lo que sería
el puerto digital B únicamente, estas resistencias pull-up se pueden activar o desactivar en
Decidimos utilizar estas pull-ups internas cuando el puerto digital B sea configurado como
entradas digitales, de manera que el usuario podrá habilitar o deshabilitar esta opción. Por lo
tanto cuando se habilitan las resistencias de pull-up las entradas digitales del puerto B, estas se
leerán con un estado lógico de 1 cuando estén en el aire.
Las terminales de los puertos digitales de propósito general B, D y E del sistema DAQDyna se
muestran en la figura 3.8., recordemos que se utiliza la tarjeta X-TRAINER P8 LITE. En este caso
concuerda perfectamente la nomenclatura de la tarjeta con la asignación de nombres de los puertos
digitales B y D.
El puerto digital B del sistema DAQDyna está conformado por las terminales marcadas como PORTB
[0 - 7] en la tarjeta X-TRAINER P8 LITE.
El puerto digital D del sistema DAQDyna está conformado por las terminales marcadas como PORTD
[0 - 7] en la tarjeta X-TRAINER P8 LITE.
El puerto digital E del sistema DAQDyna esta distribuidos en la tarjeta X-TRAINER P8 LITE:
E0 PORTC [0] E1 PORTC [1] E2 PORTC [2]
E3 PORTA [7] E4 PORTA [6] E5 PORTA [4]
Códigos para escribir o sacar un cero lógico por cada terminal del puerto digital B.
Códigos para escribir o sacar uno lógico por cada terminal del puerto digital B.
Código para escribir o sacar por todo las terminales del puerto digital B.
Al realizar la función de lectura de estados lógicos del puerto digital B, el sistema DAQDyna
retorna la siguiente información hacia la PC mediante el puerto USB-CDC.
Z+T+PIN+ESTADO PIN puede ser del ‘0’ al ‘7’ incluyendo la letra ‘A’ y ESTADO es el
carácter ‘0’ cuando el estado lógico es cero en la terminal que se lee o
‘1’ cuando el estado lógico es uno en la terminal que se lee, o
ESTADO es una variable de 8 bits que contiene la información de los
estados lógicos de todas las terminales del puerto digital B para la
opción PIN = ‘A’.
Códigos para escribir o sacar un cero lógico por cada terminal del puerto digital D.
Códigos para escribir o sacar uno lógico por cada terminal del puerto digital D.
Código para escribir o sacar por todo las terminales del puerto digital D.
Al realizar la función de lectura de estados lógicos del puerto digital D, el sistema DAQDyna
retorna la siguiente información hacia la PC mediante el puerto USB-CDC.
Z+N+PIN+ESTADO PIN puede ser de ‘0’ al ‘7’ incluyendo la letra ‘A’ y ESTADO es el
carácter ‘0’ cuando el estado lógico es cero en la terminal que se lee o
‘1’ cuando el estado lógico es uno en la terminal que se lee, o
ESTADO es una variable de 8 bits que contiene la información de los
estados lógicos de todas las terminales del puerto digital D para la
opción PIN = ‘A’.
Códigos para escribir o sacar un cero lógico por cada terminal del puerto digital E.
Códigos para escribir o sacar uno lógico por cada terminal del puerto digital E.
Al realizar la función de lectura de estados lógicos del puerto digital E, el sistema DAQDyna
retorna la siguiente información hacia la PC mediante el puerto USB-CDC.
Z+I+PIN+ESTADO PIN puede ser de ‘0’ al ‘5’ y ESTADO es el carácter ‘0’ cuando el
estado lógico es cero en la terminal que se lee o ‘1’ cuando el estado
lógico es uno en la terminal que se lee.
El sistema DAQDyna cuenta con 8 canales analógicos de entrada de 10 bits conocido como
Puerto analógico A (AN0 – AN7), estos se encuentran distribuidos en las terminales de la
tarjeta X-TRAINER P8 LITE como se indica y se puede observar en la figura 3.9.
Códigos para realizar una conversión en los puertos analógicos del convertidor A/D.
Al realizar una conversión con convertidor A/D el sistema DAQDyna retorna la siguiente
información hacia la PC mediante el puerto USB-CDC.
Z+Z+CANAL+ADH+ADL CANAL es un carácter entre el ‘0’ y ‘7’ que nos indica que
canal realizo la conversión y los datos ADH y ADL son variables
de 8 bits que contienen la conversión binaria del valor analógico
(ADH contiene solo la parte alta y ADL contiene la parte baja
de los 10 bits de resolución).
El puerto digital D del sistema DAQDyna tiene una función especial para controlar 8
servomotores (servos) comerciales controlados por modulación de ancho de pulso (PWM).
Los servos son un tipo especial de motor de c.c. que se caracterizan por su capacidad para
posicionarse de forma inmediata en cualquier posición dentro de su intervalo de operación
(figura 3.10.). Para ello, el servomotor espera un tren de pulsos que se corresponde con el
movimiento a realizar. Están generalmente formados por un amplificador, un motor, un
sistema reductor formado por ruedas dentadas y un circuito de realimentación, todo en una
misma caja de pequeñas dimensiones. El resultado es un servo de posición con un margen de
operación de 180° aproximadamente. Un servo normal se usa para controlar un movimiento
angular de entre 0 y 180 grados. Un servo normal no es mecánicamente capaz de retornar a su
lugar, si hay un mayor peso que el sugerido por las especificaciones del fabricante.
La modulación por anchura de pulso, PWM (Pulse Width Modulation), es una de los sistemas
más empleados para el control de servos. Este sistema consiste en generar una onda cuadrada
en la que se varía el tiempo que el pulso está a nivel alto, manteniendo el mismo período
(normalmente), con el objetivo de modificar la posición del servo según se desee.
Como se puede observar en las figura 3.12., las señal PWM debe tener un periodo de 20 ms
(50Hz) y el ciclo de trabajo se controlara desde 0.5 ms (0° en la posición del servo) a 2.5 ms
(180° en la posición del servo).
3.1.5.1. CODIGOS PARA LA FUNCION PWM DEL PUERTO DIGITAL D.
Códigos modificar o ajustar el ciclo de trabajo de las señales PWM del puerto digital D.
Z+G+0+DutH+DutL Modifica el ciclo de Trabajo del canal PWM0 del pin D0.
Z+G+1+DutH+DutL Modifica el ciclo de Trabajo del canal PWM1 del pin D1.
Z+G+2+DutH+DutL Modifica el ciclo de Trabajo del canal PWM2 del pin D2.
Z+G+3+DutH+DutL Modifica el ciclo de Trabajo del canal PWM3 del pin D3.
Z+G+4+DutH+DutL Modifica el ciclo de Trabajo del canal PWM4 del pin D4.
Z+G+5+DutH+DutL Modifica el ciclo de Trabajo del canal PWM5 del pin D5.
Z+G+6+DutH+DutL Modifica el ciclo de Trabajo del canal PWM6 del pin D6.
Z+G+7+DutH+DutL Modifica el ciclo de Trabajo del canal PWM7 del pin D7.
Las señales PWM tiene un periodo de 24 ms en cada terminal del puerto digital D y el ciclo de
trabajo se puede modificar en un rango de 0.5 ms a 2.5 ms mandando con las variables DutH y
DutL una cifra numérica entre 0 y 24000 respectivamente, donde DutH es la parte alta y DutL
es la parte baja del ciclo de trabajo.
Dynamixel es una línea de actuadores en red de alto rendimiento para aplicaciones robóticas.
Fabricados por la industria coreana Robotis. Cada motor está totalmente integrado con
funcionalidad de realimentación y programación. La línea Dynamixel contiene motores que se
pueden controlar con la interfaz de red TTL o la interfaz de red RS-485.
Los motores Dynamixel aprovechan una estructura todo en uno para ofrecer una inmensa
versatilidad en aplicaciones robóticas. La retroalimentación de posición y el control son
estándar en todos los motores, y el control de torque directo está disponible en varios modelos
específicos. Múltiples motores pueden conectarse en red en forma de cadena, y cada motor
tiene un valor de ID modificable para controlar fácilmente motores específicos en la red.
temperatura interna o tensión de alimentación. Estos actuadores tienen muchas ventajas sobre
productos similares como son:
Dynamixel AX-12A
En la Tabla 3.1 se muestran las principales especificaciones del actuador Dynamixel AX-12A.
Múltiples servomotores pueden ser conectados en paralelo como se muestra en la Figura 3.15.
Para controlar los actuadores DYNAMIXEL, el controlador principal necesita convertir sus
señales UART al tipo semi-dúplex. El diagrama de circuito recomendado para esto se muestra
a continuación en la figura 3.16.
Como se puede observar se necesitan tres terminales, la terminal de recepción de datos RX, la
terminal de transmisiones datos TX y la terminal de control.
La tarjeta X-TRAINER P8 LITE tiene las terminales RX y TX del módulo de comunicación EUSART
en los pines PORTC [7] y PORTC [6] respectivamente y la terminal que usaremos como de control es
la terminal digital del puerto E0 (figura 3.17.):
Z+H+1 Dynamixel_init(),
Esta función inicializa el puerto de comunicaciones USART y la
terminal de control para realizar los servomotores Dynamixel.
Z+H+2 Dynamixel_action(),
Esta función ejecuta las funciones guardadas en la memoria el
servomotor Dynamixel.
Z+H+3+ID Dynamixel_readPosition(ID),
Esta función lee la posición en la que se encuentra el eje del servomotor
Dynamixel y retorna tal información. ID es el número de identificación
del servomotor.
Z+H+4+ID+newID Dynamixel_setID(ID,newID),
Esta función cambia el ID del servomotor. newID es el nuevo
número de identificación que se asignara al servomotor.
Z+H+6+ID+Status Dynamixel_setEndless(ID,Status),
Esta función activa o desactiva la rotación continua del rotor del
servomotor. Status es ‘0’ para desactivar el giro continuo y ‘1’
para activar el el giro continuo.
Z+H+7+ID+Side+speH+speL Dynamixel_turn(ID,Side,Speed),
Esta función configura el giro hacia la derecha o
la izquierda y la velocidad del servomotor cuando
se configura la rotación continua. Side con ‘0’
realiza el giro hacia la izquierda y con ‘1’ el giro
hacia la derecha. speH y speL con forman un
numero de 10 bits para ajustar la velocidad de 0 a
1023 (0 a 114 rpm).
Z+H+8+ID+posH+posL+speH+speL Dynamixel_moveSpeed(ID,Position,Speed)
Esta función mueve el servomotor a la posición
indicada y a la velocidad que se desee. posH y
posL forman un numero de 10 bits de 0 a 1023 (0°
a 360°) para indicarle la posición. speH y speL
con forman un numero de 10 bits para ajustar la
velocidad de 0 a 1023 (0 a 114 rpm).
Z+H+9+ID+posH+posL+speH+speLDynamixel_moveSpeedRW(ID,position,Speed)
Esta función guarda en la memoria del servomotor
la orden de que se mueva a la posición y a la
velocidad que se desee. posH y posL forman un
numero de 10 bits de 0 a 1023 (0° a 360°) para
indicarle la posición. speH y speL con forman un
numero de 10 bits para ajustar la velocidad de 0 a
1023 (0 a 114 rpm).
La librería que se diseñó para controlar los actuadores Dynamixel se encuentra en el anexo B.
Un esquema completo del sistema DAQDyna se muestra en la figura 3.19., recordemos que
las terminales marcadas con la letra A son los canales analógicos de entrada, las macadas con
B son el puerto digital B, las marcadas con D son el puerto digital D y también son las salidas
de PWM, las marcadas con E son el puerto digital E, las terminales RX y TX son el puerto C
de comunicaciones y en los extremos de la tarjeta tenemos 5V y GND.
Se recomienda retirar los jumperes marcados como BOOT y LED para que las terminal A2 y
A1 respectivamente queden libres como canales analógico de entrada.
El interruptor marcado como USB < > GPIO se debe colocar seleccionando el modo USB del
microcontrolador PIC18F45K50.
Para comenzar las pruebas del sistema DAQDyna, lo primero que se debe realizar es la
conexión de la tarjeta a la computadora. La primera vez que se conecta la tarjeta a la
computadora, esta le configura un controlador (Driver) y le asigna un puerto de
comunicaciones tipo COM.
La asignación del puerto COM9, se puede modificar para elegir otro puerto COM, esto se
realiza dando clic con botón derecho del mouse sobre la asignación actual CCS USB to UART
(COM9), lo que desplegara un menú emergente y elegiremos la opción Propiedades (Figura
4.2).
Figura 4.2. Menú emergente del puerto CCS USB to UART (COM9).
Al elegir la opcion Propiedades, nos abre una ventana de Propiedades CCS USB to UART
(COM9), donde elegiremos la pestaña de Configuración de Puertos, donde daremos clic en
Opciones avanzadas (Figura 4.3.), para abrir una nueva ventana de dialogo donde nos
permitirá elegir el tamaños del buffer de transmisión y recepción, y el número del puerto COM
que deseemos (Figura 4.4.).
Podremos cambiar el puerto COM asignado por defaul, por el que consideremos pertinenete
de los 256 puertos disponibles, teniendo en cuenta no usar los puertos que marque que estan
en uso actualmente.
Siempre que se conecte la tarjeta del sistema DAQDyna en el mismo puerto USB de la misma
computadora le sera asignado el mismo puerto, en cambio si conectamos la tarjeta en otro
puerto USB de la computadora nos asignara un puerto COM direrente por default, asignacion
que podremos cambiar si lo deseamos.
Al conectar la tarjeta X-TRAINER P8 LITE al puerto USB, tambien se enciende un led verde en
el emblema XIDE, indicandonos la alimentacion de +5 V (Figura 4.5.).
El voltaje medido en las terminales de 5V y GND en los header de la peineta de la tarjeta nos
indicaron 5.07 V de CD medido con un multimetro FLUKE 179 TRUE RMS MULTIMETER.
Como se puede apreciar en la figura 4.5., la terjeta del sistema DAQDyna se monto en un
protoboard sin ningun incombeniente y se realizaron las conecciones para que el voltaje de
alimentacion de 5 V y GND esten en contacto con las lineas que se utilizan para alimentacion
en el protoboard. De manera que tenemos la alimentacion de +5 V y GND en el protoboar,
lista para realizar practicas de laboratorio.
Para la comprobacion del funcionamineto de los puertos digitales se realizo una interfaz
grafica de usuario en RAD STUDIO XE7 en lenjuage C, la interfaz grafica controla el
encendidio y apagado de los puertos digitales de la tarjeta DAQDyna, el circuito que se tiene
que armar es muy sencillo consiste en 8 diodos emisores de luz conectodos en el puerto D
como se muestra en la figura 4.6.
La interfaz grafica de usuario para probar el puerto digital D (Figura 4.7.), tiene cinco botones
y un grafico que representa los 8 diodos led conectados al puerto digital D. El boton Open nos
sirve para abrir o cerrar las comunicaciones, ademas podemos selecconar la velocidad de
Figura 4.8. DAQDyna trabajando con la interfaz gráfica que controla el puerto D.
El voltaje que entrega en las terminales del puerto digital D cuando los diodos led encienden
es de 4.95V y el voltaje que entregan las terminales del puerto digital D cuando los diodos led
están apagados es de 0.02V. Todas las lecturas de estos voltajes se realizaron con un
multímetro FLUKE 179 TRUE RMS.
Para la comprobacion del funcionamiento de los puertos analogicos de entrada se realizo una
interfaz grafica de usuario en RAD STUDIO XE7 en lenguaje C, la interfaz grafica muestra el
voltaje del canal analogico cero (A0) numericamente con dos flotantes de presisicon y grafica
en tiempo real el voltaje del canal analogico uno (A1) mostrando tambien su voltaje
numericamente con dos flotantes de presicion. El circuito que se tiene que armar consta de
La interfaz grafica de usuario (Figura 4.10.) tiene un boton de Open que nos sirve para enlasar
o desenlasar la tarjeta DAQDyna con la computadora y seleccionar la velocidad de
transferencia de informacion. Ademas cuanta con un indicador de conexión color verde que se
ilumina cuando la conexión de la terjeta y la computadora es exitosa.
Figura 4.10. Interfaz gráfica de usuario para probar los canales analógicos A0 y A1.
La velocidad del muestreo de los canales analogicos se ajusto en la interfaz graficas a 10 ms,
de manera que se miden 100 valores por segundo. La lectura del voltaje del canal analogico
A0 se muestra cada 10 leturas, de manera que se actualiza su indicacion 10 veces por segundo,
mientras que las lecturas del voltaje del canal analogico A1 se realizan cada 10 ms.
Figura 4.11. DAQDyna trabajando con la interfaz gráfica que controla las entradas analógicas.
6.1. CONCLUSIONES.
6.2. RECOMENDACIONES.
REFERENCIAS
[1] Borjas Fernández, Luis Hernando; Espinel Fernández (2007), Francisco José,
“Desarrollo de un sistema de medición digital autónomo de variables meteorológicas
para el parque natural Paramillo”.
[4] Andrés Felipe López Orozco, Juan Miguel Aricapa Quiceno (2015). “Implementación
de un sistema de adquisición de datos para el análisis cinemático en un mecanismo
plano”.
[5] Moreno O., Juan (2012). “Desarrollo de un Sistema de Adquisición de Datos para
variables de temperatura y humedad para el Laboratorio de Suelos, Aguas y Plantas
de la UNET”.
[10] KOEN, Mike; “High Speed Data Conversion”; Burr Brown, Application
Octubre de 2003.
Julio de 2006.
Chile.
[17] Sergio Andres Castaño Giraldo, “Comunicación USB – CDC con PIC + CCS
C.”
/*
Programa para la adquisicion de datos analogico y digitales
, controlar actuadores dinamixel con el puerto
USB de una computadora utilizando el puerto USB_CDC y
el modulo de comunicacion serial EUSART.
#include <18f45k50.h>
#fuses NOWDT
#device adc=10
#use delay(internal=48MHz)
#include "Dynamixel.h"
#include "usb_cdc.h"
#define BUFFLEN 16
#define TMPO 5
void main() {
char tm = TMPO,side;
char buffer[BUFFLEN],rxda,cd=0,fun=0,dfun,did,canp;
int buffid = 0, buffou=0;
long dpos,dspe;
unsigned long adc,pwm;
set_tris_a(0xff);
set_tris_b(0xff);
set_tris_c(0xff);
set_tris_d(0xff);
set_tris_e(0xff);
setup_adc_ports(sAN0 | sAN1 | sAN2 | sAN3 | sAN4 | sAN5 | sAN6 | sAN7);
setup_adc(ADC_CLOCK_DIV_8 | ADC_TAD_MUL_2);
enable_interrupts(INT_TIMER1);
enable_interrupts(INT_TIMER2);
enable_interrupts(GLOBAL);
usb_cdc_init();
usb_init();
while(!usb_cdc_connected());
usb_task();
while(!usb_enumerated());
for(;;){
usb_task();
if(!usb_cdc_kbhit())
goto otra;
tm = TMPO;
do{
if(!usb_cdc_kbhit()){
delay_us(40);
tm--;
if(tm == 0)
break;
}
else{
buffer[buffid] = usb_cdc_getc();
buffid++;
}
}while(buffid < BUFFLEN);
while(buffid != buffou){
rxda = buffer[buffou];
buffou++;
if(buffou >= BUFFLEN)
buffou = 0;
switch(cd){
case 0: if(rxda == 'Z')
cd = 1;
else
cd = 0;
break;
case 2: switch(fun){
case 'Z':
if(rxda >= '0' && rxda <= '7'){
set_adc_channel(rxda & 0x0F);
delay_us(5);
adc = read_adc();
printf(usb_cdc_putc,"ZZ%c%c%c", rxda, adc >> 8, adc);
}
else if(rxda == 'A')
setup_adc_ports(VSS_VDD);
else if(rxda == 'B')
setup_adc_ports(VSS_VREF);
else if(rxda == 'C')
setup_adc_ports(VREF_VDD);
else if(rxda == 'D')
setup_adc_ports(VREF_VREF);
cd = 0; break;
else
usb_cdc_putc('0');
break;
case '7': if(input(PIN_D7))
usb_cdc_putc('1');
else
usb_cdc_putc('0');
break;
case 'A': usb_cdc_putc(input_d());
}
cd = 0; break;
case 'M':switch(rxda){
case '0': output_float(PIN_C0); break;
case '1': output_float(PIN_C1); break;
case '2': output_float(PIN_C2); break;
case '3': output_float(PIN_A7); break;
case '4': output_float(PIN_A6); break;
case '5': output_float(PIN_A4);
}
cd = 0; break;
case 3: switch(fun){
case 'H': switch(dfun){
case '3': dpos = Dynamixel_readPosition(rxda);
printf(usb_cdc_putc,"ZH%c%c%c", rxda, dpos>>8, dpos);
cd = 0; break;
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': did = rxda; cd = 4;
} break;
case 4: switch(fun){
case 'H': switch(dfun){
case '4': Dynamixel_setID(did, rxda); cd = 0; break;
case '5': if(rxda == '0')
Dynamixel_torqueStatus(did, OFF);
else
Dynamixel_torqueStatus(did, ON);
cd = 0; break;
case '6': if(rxda == '0')
Dynamixel_setEndless(did, OFF);
else
Dynamixel_setEndless(did, ON);
cd = 0; break;
case '7': side = rxda; cd = 5; break;
case '8':
case '9': dpos = rxda * 256; cd = 5;
} break;
case 5: switch(dfun){
case '7': dspe = rxda*256; cd = 6; break;
case '8':
case '9': dpos += rxda; cd = 6;
}
break;
case 6: switch(dfun){
case '7': dspe += rxda;
if(side == '0')
Dynamixel_turn(did, LEFT, dspe);
else
Dynamixel_turn(did, RIGTH, dspe);
cd = 0; break;
case '8':
case '9': dspe = rxda*256; cd = 7;
}
break;
case 7: switch(dfun){
case '8': dspe += rxda; Dynamixel_moveSpeed(did, dpos, dspe);
break;
case '9': dspe += rxda; Dynamixel_moveSpeedRW(did, dpos, dspe);
}
cd = 0;
break;
}
}
}
}
#int_timer1
void ciclo (void){
output_d(0x00);
setup_timer_1(T1_DISABLED);
}
#int_timer2
void periodo (void){
output_d(s);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
set_timer1(W[i]);
i++;
if(i >= 8)
i = 0;
s = 0x01 << i;
}
Se necesita una terminal de control y se puede configurar escribiendo antes de declara la librerias:
#define ControlData PIN_C1 // puedes elegir el pin que desees.
Recuarda para comprender mejor el funcionmiento de esta libreria, lee el manual del Dynamixel AX-12.
#define AX_PRESENT_LOAD_H 41
#define AX_PRESENT_VOLTAGE 42
#define AX_PRESENT_TEMPERATURE 43
#define AX_REGISTERED_INSTRUCTION 44
#define AX_PAUSE_TIME 45
#define AX_MOVING 46
#define AX_LOCK 47
#define AX_PUNCH_L 48
#define AX_PUNCH_H 49
#define AX_GOAL_LENGTH 5
#define AX_MT_LENGTH 5
#define AX_PUNCH_LENGTH 5
#define AX_SPEED_LENGTH 5
#define AX_GOAL_SP_LENGTH 7
#define AX_ACTION_CHECKSUM 250
#define BROADCAST_ID 254
#define AX_START 255
#define AX_CCW_AL_L 255
#define AX_CCW_AL_H 3
#define TIME_OUT 10
#define TX_DELAY_TIME 200
#define Tx_MODE 1
#define Rx_MODE 0
#define LOCK 1
char Checksum;
char Time_Counter;
char Incoming_Byte;
char Position_High_Byte;
char Position_Low_Byte;
#define RXBUF 16
char rec[RXBUF], rxdi=0, rxdo=0;
long Position_Long_Byte;
int Error_Byte;
long read_error(void);
long read(void);
long peek(void);
char available(void);
void ini_Dyna(char ID);
void fin_Dyna(void);
void Dynamixel_init(void);
long Dynamixel_setID(char ID, char newID);
long Dynamixel_moveSpeed(char ID, long Position, long Speed);
long Dynamixel_moveSpeedRW(char ID, long Position, long Speed);
void Dynamixel_action(void);
long Dynamixel_torqueStatus(char ID, short Status);
long Dynamixel_readPosition(char ID);
long Dynamixel_setEndless(char ID, short Status);
long Dynamixel_turn(char ID, short SIDE, long Speed);
long read_error(void){
Time_Counter = 0;
while((available() < 5) && (Time_Counter < TIME_OUT)){ // Espera por datos
Time_Counter++;
delay_us(50);
}
long read(void){
if(rxdo == rxdi)
return (-1);
else{
rxdo++;
if(rxdo >= RXBUF){
rxdo = 0;
return (rec[RXBUF-1]);
}
else
return (rec[rxdo-1]);
}
}
long peek(void){
if(rxdo == rxdi)
return (-1);
else
return (rec[rxdo]);
}
char available(void){
if(rxdi >= rxdo)
return (rxdi-rxdo);
else
return (RXBUF+rxdi-rxdo);
}
void fin_Dyna(void){
putc(Checksum);
delay_us(TX_DELAY_TIME);
output_bit(ControlData,Rx_MODE);
}
void Dynamixel_init(void){
output_drive(ControlData);
output_low(ControlData);
set_uart_speed(1000000);
rxdi = 0; rxdo = 0;
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
delay_ms(100);
}
ini_Dyna(ID);
putc(AX_ID_LENGTH);
putc(AX_WRITE_DATA);
putc(AX_ID);
putc(newID);
fin_Dyna();
return (read_error());
}
ini_Dyna(ID);
putc(AX_GOAL_SP_LENGTH);
putc(AX_WRITE_DATA);
putc(AX_GOAL_POSITION_L);
putc(Position_L);
putc(Position_H);
putc(Speed_L);
putc(Speed_H);
fin_Dyna();
return (read_error());
}
ini_Dyna(ID);
putc(AX_GOAL_SP_LENGTH);
putc(AX_REG_WRITE);
putc(AX_GOAL_POSITION_L);
putc(Position_L);
putc(Position_H);
putc(Speed_L);
putc(Speed_H);
fin_Dyna();
return (read_error());
}
void Dynamixel_action(void){
ini_Dyna(BROADCAST_ID);
putc(AX_ACTION_LENGTH);
putc(AX_ACTION);
Checksum = AX_ACTION_CHECKSUM;
fin_Dyna();
}
ini_Dyna(ID);
putc(AX_TORQUE_LENGTH);
putc(AX_WRITE_DATA);
putc(AX_TORQUE_ENABLE);
putc(Status);
fin_Dyna();
return (read_error());
}
ini_Dyna(ID);
putc(AX_POS_LENGTH);
putc(AX_READ_DATA);
putc(AX_PRESENT_POSITION_L);
putc(AX_BYTE_READ_POS);
fin_Dyna();
Position_Long_Byte = -1;
Time_Counter = 0;
while((available() < 7) && (Time_Counter < TIME_OUT)){
Time_Counter++;
delay_us(50);
}
ini_Dyna(ID);
putc(AX_GOAL_LENGTH);
putc(AX_WRITE_DATA);
putc(AX_CCW_ANGLE_LIMIT_L);
putc(AX_CCW_AL_LT);
putc(AX_CCW_AL_LT);
fin_Dyna();
return (read_error());
}
else{
Dynamixel_turn(ID,0,0);
Checksum = ~(ID + AX_GOAL_LENGTH + AX_WRITE_DATA +
AX_CCW_ANGLE_LIMIT_L + AX_CCW_AL_L + AX_CCW_AL_H);
ini_Dyna(ID);
putc(AX_GOAL_LENGTH);
putc(AX_WRITE_DATA);
putc(AX_CCW_ANGLE_LIMIT_L);
putc(AX_CCW_AL_L);
putc(AX_CCW_AL_H);
fin_Dyna();
return (read_error());
}
}
ini_Dyna(ID);
putc(AX_SPEED_LENGTH);
putc(AX_WRITE_DATA);
putc(AX_GOAL_SPEED_L);
putc(Speed_L);
putc(Speed_H);
fin_Dyna();
return (read_error());
}
*** Esta libreria debe ser colocada debajo de la sentencia: TForm1 *Form1;
SetDigB(opcion, pin); Configura los pines digitales (B0 al B7) como entrada o salida.
En la variable pin se coloca un caracter entre el '0' y '7' o 'A'(todos pull-up)
o B (todos con pull-up), para elegir el pin digital que queremos configurar,
la variable opcion nos sirve para configurar como entrada 'I', salida 'O'.
SetDigD(opcion, pin); Configura los pines digitales (D0 al D7) como entrada o salida.
En la variable pin se coloca un caracter entre el '0' y el '7' o la 'A'(todos)
para elegir el pin digital que queremos configurar, la variable opcion nos
sirve para configurar como entrada 'I', salida 'O' o todos para la opcion 'A'.
Para activar las salidas PWM coloque en opcion O y en pin B.
Para desactivar las salidas PWM coloque en opcion I y en pin A.
SetDigE(opcion, pin); Configura los pines digitales (E0 al E3) como entrada o salida.
En la variable pin se coloca un caracter entre el '0' y el '3' para elegir
el pin digital que queremos configurar, la variable opcion nos sirve para
configurar como entrada 'I' o salida 'O' el pin elegido.
DynaAct(opc, id, pos, vel); Comanda funciones para los actuadores dynamixel AX-12 o Ax-18.
La variable opc elige entre las funciones del dynamixel y puede ser desde 1 - 9.
La variable id es el ID del Dynamixel.
La variable pos es para seleccionar la posicion del actuador entre otras cosas.
La variable vel es para seleccionar la velocidad del actuador.
DynaAct('1',0,0,0) Dynamixel_init();
DynaAct('2',0,0,0) Dynamixel_action();
DynaAct('3',ID,0,0) long var = Dynamixel_readPosition(ID);
DynaAct('4',ID,NEWID,0) Dynamixel_setID(ID, newID);
DynaAct('5',ID,STATUS,0) Dynamixel_torqueStatus(ID, Status);
DynaAct('6',ID,STATUS,0) Dynamixel_setEndless(ID,Status);
DynaAct('7',ID,SIDE,VELOCIDAD) Dynamixel_turn(ID,Side,Speed);
DynaAct('8',ID,POSICION,VELOCIDAD) Dynamixel_moveSpeed(ID, Position, Speed);
DynaAct('9',ID,POSICION,VELOCIDAD) Dynamixel_moveSpeedRW(ID, Position,
Speed);
DutyPwm(canal, duty); Modifica el ciclo de trabajo de los PWM0 - PWM7 para servomotores.
La variable canal nos sirve para selecionar el canal y pede ser '0' a '7'.
La variable duty es donde se coloca el ciclo de trabajo puede ser desde 0 a 24000.
*/
// Define como USB a la Forma principal y el comPort utilizados.
// Si el nombre de la Form1 y el Comport no son estos, haga las correccion.
// Funcion para leer los estados de los bits digitales del puerto B.
// PIN son los caracteres del '0' al '7' o A para leer todos.
void __fastcall ReaDigB(char PIN){
if(USB->Connected == true){
if(PIN >= '0' && PIN <= '7' || PIN == 'A'){
datos[0] = 'Z';
datos[1] = 'T';
datos[2] = PIN;
USB->Write(datos,3);
}
}
}
// Funcion para leer los estados de los bits digitales del puerto D.
// PIN son los caracteres del '0' al '7' o A para leer todos.
void __fastcall ReaDigD(char PIN){
if(USB->Connected == true){
if(PIN >= '0' && PIN <= '7' || PIN == 'A'){
datos[0] = 'Z';
datos[1] = 'N';
datos[2] = PIN;
USB->Write(datos,3);
}
}
}
datos[1] = 'O';
datos[2] = EST;
USB->Write(datos,3);
}
}
}
// Funcion para leer los estados de los bits digitales del puerto E.
// PIN son los caracteres del '0' al '3'.
void __fastcall ReaDigE(char PIN){
if(USB->Connected == true){
if(PIN >= '0' && PIN <= '5'){
datos[0] = 'Z';
datos[1] = 'I';
datos[2] = PIN;
USB->Write(datos,3);
}
}
}
USB->Write(datos,3);
}
}
}
switch(OPC){
case '1':
case '2': USB->Write(datos,3); break;
case '3': USB->Write(datos,4); break;
case '4':
case '5':
case '6': datos[4] = POS;
USB->Write(datos,5); break;
// Esta Funcion trabaja junto con el evento OnRxChar de FComPort y nos sirve
// para capturar los datos que recibe el puerto serial USB de la PC y nos
// manda la tarjeta ADQ2016.
// Count es una variable que contiene los elementos recibidos en
// el buffer del puerto serial.
void __fastcall RecibeAQDyna(int Count){
if(USB->Connected == true){
char unsigned dat[1], con;
USB->Read(dat,1);
switch(cad){
case 0: if(dat[0] == 'Z')
cad = 1;
else
cad = 0;
break;
case 1: if(dat[0] == 'Z' || dat[0] == 'T' || dat[0] == 'N' || dat[0] == 'I' || dat[0] == 'H'){
op = dat[0];
cad = 2;
}
else
cad = 0;
break;
case 2: switch(op){
case 'Z': if(dat[0] >= '0' && dat[0] <= '7'){
op1 = dat[0];
cad = 3;
}
else
cad = 0;
break;
case 'T': if( dat[0] >= '0' && dat[0] <= '7' || dat[0] == 'A'){
op1 = dat[0];
cad = 3;
}
else
cad = 0;
break;
case 'N': if(dat[0] >= '0' && dat[0] <= '7' || dat[0] == 'A'){
op1 = dat[0];
cad = 3;
}
else
cad = 0;
break;
case 'I': if( dat[0] >= '0' && dat[0] <= '5'){
op1 = dat[0];
cad = 3;
}
else
cad = 0;
break;
case 3: switch(op){
case 'Z': Adc = dat[0];
cad = 4;
break;
case 'T': if((op1 >= '0' && op1 <= '7') && (dat[0] >= '0' && dat[0] <= '1'))
DigB[op1 - 48] = dat[0];
else if(op1 == 'A')
DigBB = dat[0];
cad = 0;
break;
case 'N': if((op1 >= '0' && op1 <= '7') && (dat[0] >= '0' && dat[0] <= '1'))
DigD[op1 - 48] = dat[0];
else if(op1 == 'A')
DigDB = dat[0];
cad = 0;
break;
case 4: switch(op){
case 'Z': Ana[op1 - 48] = (Adc * 256) + dat[0];
break;