<?xml version="1.0" encoding="utf-8"?><!DOCTYPE article  PUBLIC '-//OASIS//DTD DocBook XML V4.4//EN'  'http://www.docbook.org/xml/4.4/docbookx.dtd'><article><articleinfo><title>LabElectronica/ControlRomaaIIWeb</title><revhistory><revision><revnumber>10</revnumber><date>2010-11-14 14:52:20</date><authorinitials>TiN</authorinitials></revision><revision><revnumber>9</revnumber><date>2010-11-12 22:00:00</date><authorinitials>localhost</authorinitials></revision><revision><revnumber>8</revnumber><date>2010-11-12 21:59:44</date><authorinitials>localhost</authorinitials></revision><revision><revnumber>7</revnumber><date>2010-10-25 20:28:11</date><authorinitials>localhost</authorinitials></revision><revision><revnumber>6</revnumber><date>2010-06-15 18:42:17</date><authorinitials>localhost</authorinitials></revision><revision><revnumber>5</revnumber><date>2010-06-01 19:20:08</date><authorinitials>GonzaloPerezPaina</authorinitials></revision><revision><revnumber>4</revnumber><date>2010-06-01 19:17:56</date><authorinitials>GonzaloPerezPaina</authorinitials></revision><revision><revnumber>3</revnumber><date>2010-06-01 19:17:22</date><authorinitials>TiN</authorinitials></revision><revision><revnumber>2</revnumber><date>2010-06-01 19:16:05</date><authorinitials>GonzaloPerezPaina</authorinitials></revision></revhistory></articleinfo><section><title>Sistema de control de a bordo del robot !RoMAA-II</title><section><title>Objetivos</title></section><section><title>Modos de funcionamiento</title></section><section><title>Comunicación</title><section><title>Trama</title><para>La trama de petición de datos de la PC de abordo, está representada en el siguiente gráfico: </para><para><inlinemediaobject><imageobject><imagedata fileref="https://ciii.frc.utn.edu.ar/wiki/LabElectronica/ControlRomaaIIWeb?action=AttachFile&amp;do=get&amp;target=trama.png" width="250"/></imageobject><textobject><phrase>&quot;&quot;</phrase></textobject></inlinemediaobject> </para><itemizedlist><listitem><para>Representa el byte de Inicio de Trama. </para></listitem></itemizedlist><para># Es un número entero, que indica la cantidad de bytes que se envian (no se tiene en cuenta el Inicio de Trama). </para><para>C Representa los distintos Comandos de Petición de la PC de abordo. </para><para>Datos son los datos, los cuales pueden ser, ninguno, 1 char, 2 float (8 char), 3 float (12 char) o 2 int (8 char) </para><section><title>Borrador</title><para>La comunicación entre la PC a bordo y el controlador embebido del robot !RoMAA se realiza a través del puerto serie (RS232), utilizando una trama predefinida. La comunicación es del tipo maestro/esclavo, siendo la PC a bordo el maestro y el controlador embebido el esclavo. La trama utilizada varía ligeramente dependiendo si corresponde de un comando enviado de la PC al controlador embebido o si son datos que devuelve el controlador. </para><para>La trama de comandos de la PC a bordo al controlador tiene el siguiente formato </para><itemizedlist><listitem><para><emphasis role="strong">primer byte</emphasis>: comienza siempre con un byte de inicio de trama, más precisamente el caracter ASCII del asterisco ('*' = 0x2A) </para></listitem><listitem><para><emphasis role="strong">segundo byte</emphasis>: indica el tamaño de la trama sin incluir el byte de inicio de trama </para></listitem><listitem><para><emphasis role="strong">tercer byte</emphasis>: indica el comando que debe ejecutar el controlador embebido utilizando, si es debido, los bytes de datos de la trama </para></listitem></itemizedlist><para>el siguiente esquema muestra la trama. </para><para><inlinemediaobject><imageobject><imagedata fileref="https://ciii.frc.utn.edu.ar/wiki/LabElectronica/ControlRomaaIIWeb?action=AttachFile&amp;do=get&amp;target=trama1.png" width="250"/></imageobject><textobject><phrase>&quot;&quot;</phrase></textobject></inlinemediaobject> </para><para><emphasis role="strong">La trama enviada por el controlador embebido a la PC no tiene el campo &quot;comando&quot; (3er byte)</emphasis>. </para><para>Los comandos disponibles se indican en la siguiente tabla </para><informaltable><tgroup cols="6"><colspec colname="col_0"/><colspec colname="col_1"/><colspec colname="col_2"/><colspec colname="col_3"/><colspec colname="col_4"/><colspec colname="col_5"/><tbody><row rowsep="1"><entry colsep="1" rowsep="1"><para><emphasis role="strong">comando</emphasis> </para></entry><entry colsep="1" rowsep="1"><para><emphasis role="strong">ASCII</emphasis> </para></entry><entry colsep="1" rowsep="1"><para><emphasis role="strong">hexa</emphasis> </para></entry><entry colsep="1" rowsep="1"><para>*# bytes de datos* </para></entry><entry colsep="1" rowsep="1"><para><emphasis role="strong">bytes de datos</emphasis> </para></entry><entry colsep="1" rowsep="1"><para><emphasis role="strong">descripción</emphasis> </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Reset </para></entry><entry colsep="1" rowsep="1"><para>r </para></entry><entry colsep="1" rowsep="1"><para>0x72 </para></entry><entry colsep="1" rowsep="1"><para>- </para></entry><entry colsep="1" rowsep="1"><para>- </para></entry><entry colsep="1" rowsep="1"><para>Reset general de todas las variables del controlador </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Modo de lazo abierto </para></entry><entry colsep="1" rowsep="1"><para>o </para></entry><entry colsep="1" rowsep="1"><para>0x6F </para></entry><entry colsep="1" rowsep="1"><para>- </para></entry><entry colsep="1" rowsep="1"><para>- </para></entry><entry colsep="1" rowsep="1"><para>En lazo abierto se controla mediante comandos de PWM </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Modo de lazo cross-coupling </para></entry><entry colsep="1" rowsep="1"><para>c </para></entry><entry colsep="1" rowsep="1"><para>0x63 </para></entry><entry colsep="1" rowsep="1"><para>- </para></entry><entry colsep="1" rowsep="1"><para>- </para></entry><entry colsep="1" rowsep="1"><para>Fija el modo lazo cerrado para comandos de (v,w) </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Modo lazo cerrado de motores </para></entry><entry colsep="1" rowsep="1"><para>f </para></entry><entry colsep="1" rowsep="1"><para>0x66 </para></entry><entry colsep="1" rowsep="1"><para>- </para></entry><entry colsep="1" rowsep="1"><para>- </para></entry><entry colsep="1" rowsep="1"><para>Lazo cerrado de motors (sin cross-coupling), funciona con comandos de vel. de motores </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Petición de modo </para></entry><entry colsep="1" rowsep="1"><para>e </para></entry><entry colsep="1" rowsep="1"><para>0x65 </para></entry><entry colsep="1" rowsep="1"><para>- </para></entry><entry colsep="1" rowsep="1"><para>- </para></entry><entry colsep="1" rowsep="1"><para>Petición del modo actual del funcionamiento </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Habilitación de motores </para></entry><entry colsep="1" rowsep="1"><para>h </para></entry><entry colsep="1" rowsep="1"><para>0x68 </para></entry><entry colsep="1" rowsep="1"><para>- </para></entry><entry colsep="1" rowsep="1"><para>- </para></entry><entry colsep="1" rowsep="1"><para>Habilita los motores, para responder a los comandos </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Deshabilitación de motores </para></entry><entry colsep="1" rowsep="1"><para>H </para></entry><entry colsep="1" rowsep="1"><para>0x48 </para></entry><entry colsep="1" rowsep="1"><para>- </para></entry><entry colsep="1" rowsep="1"><para>- </para></entry><entry colsep="1" rowsep="1"><para>Deshabilita los motores </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Fijar PID de los motores </para></entry><entry colsep="1" rowsep="1"><para>m </para></entry><entry colsep="1" rowsep="1"><para>0x6D </para></entry><entry colsep="1" rowsep="1"><para>12 </para></entry><entry colsep="1" rowsep="1"><para>3 números en punto flotante (Kp,Ki,Kd) </para></entry><entry colsep="1" rowsep="1"><para>Fijar fila las constantes Kp, Ki y Kd de los controladores PID de los motores </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Petición de PID de los motores </para></entry><entry colsep="1" rowsep="1"><para>M </para></entry><entry colsep="1" rowsep="1"><para>0x4D </para></entry><entry colsep="1" rowsep="1"><para>- </para></entry><entry colsep="1" rowsep="1"><para>- </para></entry><entry colsep="1" rowsep="1"><para>Petición de las constantes Kp, Ki, y Kd de los controladores PID de los motores </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Fijar PID del lazo cross-coupling </para></entry><entry colsep="1" rowsep="1"><para>v </para></entry><entry colsep="1" rowsep="1"><para>0x76 </para></entry><entry colsep="1" rowsep="1"><para>12 </para></entry><entry colsep="1" rowsep="1"><para>3 números en punto flotante (Kp,Ki,Kd) </para></entry><entry colsep="1" rowsep="1"><para>Fijar fila las constantes Kp, Ki y Kd de los controladores PID del cross-coupling </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Petición de PID de los motores </para></entry><entry colsep="1" rowsep="1"><para>V </para></entry><entry colsep="1" rowsep="1"><para>0x56 </para></entry><entry colsep="1" rowsep="1"><para>- </para></entry><entry colsep="1" rowsep="1"><para>- </para></entry><entry colsep="1" rowsep="1"><para>Petición de las constantes Kp, Ki, y Kd de los controladores PID del cross-coupling </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Fijar velocidad </para></entry><entry colsep="1" rowsep="1"><para>s </para></entry><entry colsep="1" rowsep="1"><para>0x73 </para></entry><entry colsep="1" rowsep="1"><para>1. </para></entry><entry colsep="1" rowsep="1"><para>2 números en punto flotante, (v,w) </para></entry><entry colsep="1" rowsep="1"><para>Fijar la velocidad lineal y angular del robot </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Petición de velocidad </para></entry><entry colsep="1" rowsep="1"><para>S </para></entry><entry colsep="1" rowsep="1"><para>0x53 </para></entry><entry colsep="1" rowsep="1"><para>- </para></entry><entry colsep="1" rowsep="1"><para>- </para></entry><entry colsep="1" rowsep="1"><para>Petición de la velocidad lineal y angular actual del robot </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Fijar velocidad de los motores </para></entry><entry colsep="1" rowsep="1"><para>w </para></entry><entry colsep="1" rowsep="1"><para>0x77 </para></entry><entry colsep="1" rowsep="1"><para>1. </para></entry><entry colsep="1" rowsep="1"><para>2 números en punto flotante (v1,v2) </para></entry><entry colsep="1" rowsep="1"><para>Fijar velocidad lineal de cada uno de los motores indep. </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Fijar PWM </para></entry><entry colsep="1" rowsep="1"><para>p </para></entry><entry colsep="1" rowsep="1"><para>0x70 </para></entry><entry colsep="1" rowsep="1"><para>1. </para></entry><entry colsep="1" rowsep="1"><para>2 números enteros de PWM </para></entry><entry colsep="1" rowsep="1"><para>Fija el valor de PWM para cada motor (pwm1,pwm2) en modo lazo abierto </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Petición PWM </para></entry><entry colsep="1" rowsep="1"><para>P </para></entry><entry colsep="1" rowsep="1"><para>0x50 </para></entry><entry colsep="1" rowsep="1"><para>- </para></entry><entry colsep="1" rowsep="1"><para>- </para></entry><entry colsep="1" rowsep="1"><para>Petición de los valores de PWM de cada motor </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Fijar valores de odometría </para></entry><entry colsep="1" rowsep="1"><para>y </para></entry><entry colsep="1" rowsep="1"><para>0x79 </para></entry><entry colsep="1" rowsep="1"><para>12 </para></entry><entry colsep="1" rowsep="1"><para>3 números en punto flotante (x,y,theta) </para></entry><entry colsep="1" rowsep="1"><para>Fijar valor de odometría, posición y orientación (x,y,theta) </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Petición de odometría </para></entry><entry colsep="1" rowsep="1"><para>Y </para></entry><entry colsep="1" rowsep="1"><para>0x59 </para></entry><entry colsep="1" rowsep="1"><para>- </para></entry><entry colsep="1" rowsep="1"><para>- </para></entry><entry colsep="1" rowsep="1"><para>Petición del valor de odometría (x,y,theta) </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Reset de odoemtría </para></entry><entry colsep="1" rowsep="1"><para>z </para></entry><entry colsep="1" rowsep="1"><para>0x7A </para></entry><entry colsep="1" rowsep="1"><para>- </para></entry><entry colsep="1" rowsep="1"><para>- </para></entry><entry colsep="1" rowsep="1"><para>Borrar los valores de odometría (x,y,theta)=(0,0,0) </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Fijar tiempo de cierre de lazo </para></entry><entry colsep="1" rowsep="1"><para>t </para></entry><entry colsep="1" rowsep="1"><para>0x74 </para></entry><entry colsep="1" rowsep="1"><para>1. </para></entry><entry colsep="1" rowsep="1"><para>Valor de 0-255 en milisegundos </para></entry><entry colsep="1" rowsep="1"><para>Fijar el tiempo en el que se ejecuta el lazo de control </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Petición tiempo de cierre de lazo </para></entry><entry colsep="1" rowsep="1"><para>T </para></entry><entry colsep="1" rowsep="1"><para>0x54 </para></entry><entry colsep="1" rowsep="1"><para>- </para></entry><entry colsep="1" rowsep="1"><para>- </para></entry><entry colsep="1" rowsep="1"><para>Petición de tiempo de cierre de lazo </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Fijar tiempo de logging </para></entry><entry colsep="1" rowsep="1"><para>l </para></entry><entry colsep="1" rowsep="1"><para>0x6C </para></entry><entry colsep="1" rowsep="1"><para>1. </para></entry><entry colsep="1" rowsep="1"><para>Valor de 0-255 en milisegundos </para></entry><entry colsep="1" rowsep="1"><para>Fijar el tiempo en que el controlador envía los datos en logging </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Petición de tiempo de logging </para></entry><entry colsep="1" rowsep="1"><para>L </para></entry><entry colsep="1" rowsep="1"><para>0x4C </para></entry><entry colsep="1" rowsep="1"><para>- </para></entry><entry colsep="1" rowsep="1"><para>- </para></entry><entry colsep="1" rowsep="1"><para>Petición del tiempo de logging de datos </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Fijar tiempo de calc. de odom. </para></entry><entry colsep="1" rowsep="1"><para>x </para></entry><entry colsep="1" rowsep="1"><para>0x78 </para></entry><entry colsep="1" rowsep="1"><para>1. </para></entry><entry colsep="1" rowsep="1"><para>Valor de 0-255 en milisegundos </para></entry><entry colsep="1" rowsep="1"><para>FIjar el tiempo en el que se calcula la odometría </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Petición tiempo de calc. de odom. </para></entry><entry colsep="1" rowsep="1"><para>X </para></entry><entry colsep="1" rowsep="1"><para>0x58 </para></entry><entry colsep="1" rowsep="1"><para>- </para></entry><entry colsep="1" rowsep="1"><para>- </para></entry><entry colsep="1" rowsep="1"><para>Petición del tiempo del cálculo de odometría </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Fijar constantes cinemáticas </para></entry><entry colsep="1" rowsep="1"><para>k </para></entry><entry colsep="1" rowsep="1"><para>0x6B </para></entry><entry colsep="1" rowsep="1"><para>1. </para></entry><entry colsep="1" rowsep="1"><para>2 números en punto floatante (r,b) </para></entry><entry colsep="1" rowsep="1"><para>Fijar valores cinemáticos, r:radio de la rueda y b:dist. entre ruedas </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Petición de const. cinemáticas </para></entry><entry colsep="1" rowsep="1"><para>K </para></entry><entry colsep="1" rowsep="1"><para>0x4B </para></entry><entry colsep="1" rowsep="1"><para>- </para></entry><entry colsep="1" rowsep="1"><para>- </para></entry><entry colsep="1" rowsep="1"><para>Petición de valores cinemáticos </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Petición de la geometría del robot </para></entry><entry colsep="1" rowsep="1"><para>G </para></entry><entry colsep="1" rowsep="1"><para>0x47 </para></entry><entry colsep="1" rowsep="1"><para>- </para></entry><entry colsep="1" rowsep="1"><para>- </para></entry><entry colsep="1" rowsep="1"><para>Petición de las dimensiones geométricas del robot (w,l,h) </para></entry></row></tbody></tgroup></informaltable><para>La trama de datos utilizada por el controlador embebido para responder a los comandos (de petición) de la PC de abordo difiere de la anterior únicamente en la ausencia del tercer byte (byte de comando). Las tramas disponibles son </para><informaltable><tgroup cols="5"><colspec colname="col_0"/><colspec colname="col_1"/><colspec colname="col_2"/><colspec colname="col_3"/><colspec colname="col_4"/><tbody><row rowsep="1"><entry colsep="1" rowsep="1"><para><emphasis role="strong">resp. al comando</emphasis> </para></entry><entry colsep="1" rowsep="1"><para>*# bytes de datos* </para></entry><entry colsep="1" rowsep="1"><para><emphasis role="strong">bytes de datos</emphasis> </para></entry><entry colsep="1" rowsep="1"><para><emphasis role="strong">descripción</emphasis> </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Petición del modo de lazo </para></entry><entry colsep="1" rowsep="1"><para>1 </para></entry><entry colsep="1" rowsep="1"><para>1 byte que indica el modo </para></entry><entry colsep="1" rowsep="1"><para>modo </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Petición de PID de motores </para></entry><entry colsep="1" rowsep="1"><para>12 </para></entry><entry colsep="1" rowsep="1"><para>3 números en punto flotante </para></entry><entry colsep="1" rowsep="1"><para>El controlador responde enviando los valores Kp, Ki, y Kd del controlador PID de los motores </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Petición de PID de cross-coupling </para></entry><entry colsep="1" rowsep="1"><para>12 </para></entry><entry colsep="1" rowsep="1"><para>3 números en punto flotante </para></entry><entry colsep="1" rowsep="1"><para>El controlador responde enviando los valores Kp, Ki, y Kd del controlador PID de cross-coupling </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Petición de velocidad </para></entry><entry colsep="1" rowsep="1"><para>1. </para></entry><entry colsep="1" rowsep="1"><para>2 números en punto flotante </para></entry><entry colsep="1" rowsep="1"><para>El controlador responde enviando la velocidad lineal y angular actual del robot </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Petición de PWM </para></entry><entry colsep="1" rowsep="1"><para>1. </para></entry><entry colsep="1" rowsep="1"><para>2 números enteros </para></entry><entry colsep="1" rowsep="1"><para>El controlador responde enviando los valores de PWM de cada motor </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Petición de odometría </para></entry><entry colsep="1" rowsep="1"><para>12 </para></entry><entry colsep="1" rowsep="1"><para>3 números en punto flotante (x,y,theta) </para></entry><entry colsep="1" rowsep="1"><para>El controlador responde enviando el valor de odometría (x,y,theta) </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Petición de contadores de encoders </para></entry><entry colsep="1" rowsep="1"><para>1. </para></entry><entry colsep="1" rowsep="1"><para>2 números enteros </para></entry><entry colsep="1" rowsep="1"><para>El controlador responde con las cuentas de los encoder (enc1,enc2) </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Petición de vel. lineal de las ruedas </para></entry><entry colsep="1" rowsep="1"><para>1. </para></entry><entry colsep="1" rowsep="1"><para>2 números en punto flotante </para></entry><entry colsep="1" rowsep="1"><para>El controlador responde las velocidades lineales de cada rueda (v1,v2) </para></entry><entry colsep="1" rowsep="1"/></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Petición de vel. angular de las ruedas </para></entry><entry colsep="1" rowsep="1"><para>1. </para></entry><entry colsep="1" rowsep="1"><para>2 números en punto flotante </para></entry><entry colsep="1" rowsep="1"><para>El controlador responde con las velocidades angulares de cada rueda (w1,w2) </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Petición de despl. lineal de las ruedas </para></entry><entry colsep="1" rowsep="1"><para>1. </para></entry><entry colsep="1" rowsep="1"><para>2 números en punto flotante </para></entry><entry colsep="1" rowsep="1"><para>El controlador responde con los despl. lineales de cada rueda (l1,l2) </para></entry></row></tbody></tgroup></informaltable></section></section><section><title>Comandos</title></section></section><section><title>Software embebido</title><section><title>Diagrama de flujo</title></section></section></section></article>