Está en la página 1de 4

Brazo por RS232

Pese a que los puertos COM estn en desuso (hoy en da todo se disea para USB) ha que todava lo usan para sus proyectos. He recibido mails pidindome que los datos brazo (los ngulos y la distancia de las pinzas) puedan salir a travs del Puerto Serie cuenta lo que hay detrs del puerto de comunicaciones, eso quiere decir que tu elec PLC, controladora de servos, etc.) se supone que entiende lo que recibe. El cdigo es muy largo porque contiene la parte de OpenGL (es el mismo programa "BrazoSimple.bas" con varias lneas de cdigo ms), es mejor que te bajes fuente, ejecutable y todo lo necesario haciendo clic aqu.

Se trata de abrir el puerto de comunicaciones (puerto serie) y enviar los datos de to ngulos cada vez que movemos el brazo robot, y cerrar el puerto de comunicaciones salir del programa. Vers justo donde comienza el programa principal est "abrir el puerto":
Open Com "COM1:9600, N, 8, 1, CD0, CS0, DS0, RS" For Binary As #1

y luego, al final del procedimiento "Inversek", el envo de datos al puerto COM:


If Flag = 1 Then Print #1, CInt(AngGiro+180); CInt(AngBrazo+90); CInt(AngAntBr+180);_ CInt(AngMunecA+180); CInt(AngMunecB+180); CInt(DistDedos*1000) EndIf

O bien, lo podemos hacer de esta otra forma, es lo mismo:


If Flag = 1 Then Print #1, CInt(AngGiro+180); Print #1, CInt(AngBrazo+90); Print #1, CInt(AngAntBr+180); Print #1, CInt(AngMunecA+180); Print #1, CInt(AngMunecB+180); Print #1, CInt(DistDedos*1000) EndIf

La suma de 180 90 grados a cada variable convierte los ngulos en reales y adem nmeros negativos. Esto se debe a que las variables tienen un rango de -180 a 179 g sumas 180 a las variables (a excepcin de "AngBrazo" donde le sumamos 90 grado obtenemos una salida de rango 0 a 359grados (360 en total).

La funcin "CInt" (redondeo al alza) deja el nmero entero sin decimales. Puedes cam

funcin "Int" o "Fix" de entero si quieres. Si usas servos no vas a necesitar precisin p servos tipo Futaba RC u otros del estilo carece de precisin (unas 100 posiciones apr grados y de aquella manera...) Por eso es mejor eliminar los decimales, lo cual hace q de datos sea un poco ms rpido. Si necesitas los decimales has de eliminar las func

He puesto como velocidad de transmisin de los datos a 9600 baudios porque es esta esta velocidad de envo el brazo se mueve muy lentamente (para aburrirse). Pero pue este detalle a la mxima velocidad que soporte tu invento. Al triple de esta velocidad ( brazo se mueve con total normalidad.

La variable "Flag" tiene como funcin detectar que quieres mover el brazo. Esto signif cuando mueves el brazo enva los datos al puerto COM (COM1 en nuestro ejemplo) e saturacin del puerto. Para saber qu es exactamente lo que sale por el puerto:

Puedes hacer una cosa, y es que en vez de sacar los datos por el puerto COM, lo esc fichero de texto. De esta manera vers qu tipo de dato sale y la forma. Podrs comp formato de salida es ASCII.

Le pones una comilla ' (equivale al REM del Basic) para deshabilitar temporalmente e comunicaciones y as hacer esta prueba y debajo configuras para abrir un fichero norm como sigue:

'Open Com "COM1:9600, N, 8, 1, CD0, CS0, DS0, RS" For Binary As #1 Kill "Pruebas.txt ' Elimina el fichero "Pruebas.txt" si hubiese uno anterior. Open "Pruebas.txt" For Binary As #1 ' Crea el fichero "Pruebas.txt"

Ejecutas el programa, mueves el brazo un poco y sales del programa. Se habr cread "Pruebas.txt". Lo abres y vers un buen montn de nmeros en columnas de seis sep un espacio. Esto se debe a que hemos separado cada variable por un punto y coma Cambiar el formato de salida: En el procedimiento "InverseK", cambias la parte de enviar los datos por esta otra:
If Flag = 1 Then Print #1, CInt(AngGiro+180) Print #1, CInt(AngBrazo+90) Print #1, CInt(AngAntBr+180) Print #1, CInt(AngMunecA+180) Print #1, CInt(AngMunecB+180) Print #1, CInt(DistDedos*1000) EndIf

En este caso, sale el ngulo con un "retorno de carro" y "nueva lnea", lo que equivale los caracteres no imprimibles chr(13)+chr(10).

Hay otra forma de hacerlo y sale todo junto con un espacio entre cada dato pero sin lo carro que es poniendo un punto y coma ; al final de cada comando Print:

If Flag = 1 Then Print #1, CInt(AngGiro+180); Print #1, CInt(AngBrazo+90); Print #1, CInt(AngAntBr+180); Print #1, CInt(AngMunecA+180); Print #1, CInt(AngMunecB+180); Print #1, CInt(DistDedos*1000); EndIf

El comando "Print", tanto en ficheros como en caracteres imprimibles, tiene como par que si pones un punto y coma ; al final del comando, no enva retorno de carro y nuev decir, los famosos caracteres no imprimibles Chr( 13, 10 ) en este orden ]. Por el co le pones punto y coma al final, s enva un retorno de carro y nueva lnea [ Chr( 13, 1 con este detalle en el programa de descarga (primer ejemplo de Prints, arriba); obser llevan punto y coma ; a excepcin del ltimoPrint para que ste ltimo haga el retorno nueva lnea. Si en vez de poner un punto y coma ; pones una coma , deja un espacio espacios entre variable y variable (no recomendado para nuestro caso).

Y por ltimo, una forma donde no es en formato ASCII, sino tal como es en la memori ordenador, sale segn su tipo. Por "tipo" me refiero a que el formato es diferente si es "Single" o "Double". Las variables de los ngulos en el programa de ejemplo "BrazoSi tiene el formato "Double". La salida es totalmente binaria, no de unos y ceros, sino en ilegible a la vista.
If Flag = 1 Put #1,, Put #1,, Put #1,, Put #1,, Put #1,, Put #1,, EndIf Then CInt(AngGiro+180) CInt(AngBrazo+90) CInt(AngAntBr+180) CInt(AngMunecA+180) CInt(AngMunecB+180) CInt(DistDedos*1000)

Segn la versin del compilador de Freebasic, en las funciones "MultiKey()" puede d Si te da fallo en esa funcin tendras que cambiar todos los "FB.SC_" por "SC_", o al el caso), y asunto resuelto.

Ejemplo: If MultiKey(FB.SC_A) Then Xreal=Xreal-1 por If MultiKey(SC_A) Then Xreal=Xreal-1 As con todas las funciones "MultiKey()".

También podría gustarte