Integración de Los Sistemas Embebidos Raspberry Pi y Arduino para El Manejo de Un Brazo Robótico Mediante Una Aplicación Android
Integración de Los Sistemas Embebidos Raspberry Pi y Arduino para El Manejo de Un Brazo Robótico Mediante Una Aplicación Android
RESUMEN
Los sistemas de comunicación permiten hoy en día controlar dispositivos electrónicos que facilitan su uso y
desplazamiento. Sin embargo, la integración entre diferentes tipos de sistemas se convierte en un inconveniente
porque existen diversas tecnologías y protocolos. En el presente artículo se plasma la integración de los sistemas
embebidos, Raspberry Pi y Arduino, mediante el uso de los lenguajes de programación Java y Phyton, teniendo
en cuenta comunicación serial de dos formas diferentes: puerto GPIO y cable USB. El sistema de integración
que permite la transmisión y la recepción de datos se realiza por medio del software Python, y la interfaz de
conexión es realizada con Java sobre una plataforma Android. Con el fin de establecer resultados de primera
mano, se diseñó e implementó un brazo robótico, el cual es controlado por un Arduino, y la interfaz de acceso
al sistema se realiza usando la placa Raspberry Pi. Los resultados de las pruebas que se hicieron determinaron
la eficiencia del sistema de comunicación y la confiabilidad de la información recibida por la placa Raspberry
Pi y transmitida a la placa Arduino para la conexión directa con cada uno de los servomotores.
Palabras clave: Arduino, brazo robótico, comunicación, Raspberry Pi, sistemas
embebidos.
1 MSc. Network System. Miembro del grupo de investigación Automatización Industrial, Universidad Cooperativa
Cómo citar este artículo: Suárez Mora, D. R., Aparicio Gómez, A., Gallego Ibáñez, Y. K. y Ramírez Salcedo, J. C. (2015).
Integración de los sistemas embebidos Raspberry Pi y Arduino para el manejo de un brazo robótico mediante una aplica-
ción Android. Épsilon, (25), 69-96.
ABSTRACT
Nowadays it is possible to control electronic devices with communication systems that facilitate
their use and transportation. However, integration between different types of systems has its
drawbacks, due to the existence of different technologies and protocols. This paper captures the
integration of the Raspberry Pi and Arduino embedded systems by using Java and Phyton program-
ming languages, considering two different types of serial communication: GPIO port and USB
cable. The integration system allowing transmission and reception of data is performed through
the Python software, and the connection interface is made using java on an Android platform. In
order to establish first hand results, a robotic arm controlled by an Arduino was designed and im-
plemented, and the system access interface is made using the Raspberry Pi plate. Test results show
the efficiency of the communication system and the reliability of the information received by the
Raspberry Pi plate and transmitted to the Arduino Plate for direct connection to each servomotor.
David Rolando Suárez Mora, Alexandra Aparicio Gómez, Yuli Katerine Gallego Ibáñez, Juan Camilo Ramírez Salcedo
RESUMO
Os sistemas de comunicação permitem hoje m dia controlar dispositivos eletrônicos que facilitam
seu uso e deslocamento. Contudo, a integração entre diferentes tipos de sistemas se transforma em
um inconveniente porque existem diversas tecnologias e protocolos. Neste presente artigo se plas-
ma a integração dos sistemas embebidos, Raspberry Pi e Arduino, mediante o uso das linguagens
de programação Java e Phyton, levando em conta a comunicação serial de duas formas diferentes:
porto GPIO e cabo USB. O sistema de integração que permite a transmissão e a recepção de dados
se realiza por meio do software Python, e a interfase de conexão é realizada mediante Java sobre
uma plataforma Android. Com o fim de estabelecer resultados de primeira mão, se desenhou e
implementou um braço robótico, o qual é controlado por um Arduino, e a interfase de acesso ao
sistema se realiza usando a placa Raspberry Pi. Os resultados das provas realizadas determinaram
a eficiência do sistema de comunicação e a confiabilidade da informação recebida pela placa Ras-
pberry Pi e transmitida à placa Arduino para a conexão direta com cada um dos servomotores.
Palavras chave: Arduino, comunicação, sistemas embebidos, Raspberry
Pi, braço robótico.
En la actualidad, cada vez más se puede encontrar con mayor frecuencia el uso de
sistemas especializados, los cuales fueron construidos y programados para realizar
tareas particulares. El objetivo es dividir tareas grandes en mucho más pequeñas
y así construir subsistemas que se especialicen en este tipo de tareas. El concepto
de sistemas embebidos cobra fuerza en este enfoque, y por tal motivo muchos fabri-
cantes construyen placas con mayores capacidades y diferentes tipos de interfaces.
Integración de los sistemas embebidos Raspberry Pi y Arduino para el manejo de un brazo robótico mediante una aplicación Android
los diferentes sistemas embebidos. Aquí es cuando surgen soluciones que varían
desde la construcción de dispositivos hasta el desarrollo de algoritmos con el fin de
realizar dicha integración. Sin embargo, cada sistema embebido por separado ha
tenido grandes desarrollos y esto se puede evidenciar en los diferentes proyectos
y prototipos que se han construido a partir de estas placas.
En conclusión, se pueden encontrar muchas bondades que nos presentan los sis-
temas embebidos, definidos como sistemas diseñados para realizar tareas particu-
lares. De todas formas, es necesario considerar una serie de tareas necesarias para
realizar la integración sin perder todas las ventajas que tiene cada sistema por inde-
pendiente. En este trabajo se realiza la integración del sistema embebido Raspberry
Pi y Arduino. Cada uno de ellos tendrá funciones particulares. El primero permitirá
la interacción del sistema con su entorno a través de una interfaz gráfica sobre un sis-
tema operativo Android para su uso en un dispositivo móvil; por otro lado, recibirá
las peticiones realizadas por parte de los usuarios mediante el uso de la conexión
wireless. El segundo sistema realizará la conexión con los servomotores de un brazo
robótico. En la figura 1 se puede apreciar la arquitectura general del proyecto en la
que se encuentran presentes los sistemas embebidos (Raspberry Pi y Arduino), la
interfaz gráfica en Android y los servomotores que forman parte del brazo robótico.
Interfaz
gráfica
Señales para
David Rolando Suárez Mora, Alexandra Aparicio Gómez, Yuli Katerine Gallego Ibáñez, Juan Camilo Ramírez Salcedo
los actuadores
Existen diferentes campos de acción para este tipo de tecnologías. Uno de ellos es
la telemedicina. Así es como Dudas y colaboradores (2014), en el Departamento
Comunicación inalámbrica
Interfaz gráfica
Servomotores brazo robótico
en Android ( Java)
Integración de los sistemas embebidos Raspberry Pi y Arduino para el manejo de un brazo robótico mediante una aplicación Android
Figura 2. Flujo de información en el sistema
Fuente: elaboración propia.
Según Siegle (2014), el hardware de código abierto como Arduino, Raspberry Pi,
y otras placas que han sido desarrolladas para ser usadas en diferentes aplicaciones,
ha permitido a campos como la electrofisiología acercarse a soluciones más econó-
micas con las mismas prestaciones y rendimiento que una solución creada por una
compañía especializada ( Jutila et al., 2014). Otro campo de acción para este tipo
de placas es el geoposicionamiento. Con este concepto se desarrolló un sistema que
permite el seguimiento de niños dentro de un área particular. Al tener un tamaño
pequeño, la placa Arduino y muchas placas de su tipo se prestan para ser ubicadas
en sitios estratégicos. En este caso fue ubicada en los chalecos que usaba un grupo
de niños dentro de una escuela, y mediante el uso de la tarjeta XBEE de Arduino y
algunos sensores fue posible hacer un seguimiento dentro de las instalaciones de
la escuela a los niños y determinar si cada uno de ellos se encontraba en algún tipo
de situación que generara peligro para la integridad de los infantes.
Integración de los sistemas embebidos Raspberry Pi y Arduino para el manejo de un brazo robótico mediante una aplicación Android
Wireless sensor network system lámbrico para monitorear variables
Design using Raspberry Pi and de una aplicación particular; en este
Arduino for environmental mo- Sí se observa la integración de las placas No
nitoring applications (Ferdoush Arduino y Raspberry Pi con el fin de
y Li, 2014) tomar datos y tratarlos en una aplica-
ción particular.
Metodología
A pesar de tener el concepto de que cada placa es una plataforma embebida, las
cuales tienen sus puertos de comunicación y sus dispositivos para el procesamiento
Sin embargo, cuando se trabaja a bajo nivel, señales como voltajes o corrientes pro-
venientes de actuadores o pulsadores, la placa no cuenta con las herramientas que
permitan hacer fácilmente esta labor. Esto no significa que no sea capaz de realizar
este tipo de tareas, sino que se deben implementar más pasos y procedimientos
para realizar la misma tarea. En contraste, las placas como Arduino tienen todo el
desarrollo de hardware y software que facilitan la integración con aplicaciones a bajo
David Rolando Suárez Mora, Alexandra Aparicio Gómez, Yuli Katerine Gallego Ibáñez, Juan Camilo Ramírez Salcedo
nivel. Por lo tanto, con el fin de extraer las mayores prestaciones de cada placa y
especializar las tareas, aprovechando las ventajas que ofrecen cada una de ellas, se
plantea la integración entre estas; no obstante, tienen problemas de conectividad,
velocidad y protocolos de transmisión.
Por otro lado, la interfaz de comunicación para el usuario debe ser capaz de recibir
los datos y realizar la validación y envío de dichos datos a la placa que realizará la
manipulación inicial. De todos modos, todo este proceso debe ser transparente
para el usuario. La integración de las entidades anteriormente mencionadas es el
problema que se presenta y el cual será resuelto en las siguientes secciones.
Integración de los sistemas embebidos Raspberry Pi y Arduino para el manejo de un brazo robótico mediante una aplicación Android
Figura 3. Diagrama general de la placa Raspberry Pi
Fuente: Pixabay (2016).
La forma más común de establecer dicha la transmisión de datos entre las placas
es a través del protocolo comunicación serial. Esta consiste en la transmisión y
recepción de pulsos digitales a una misma velocidad, ya que el transmisor envía
pulsos que representan el dato enviado a una velocidad determinada y el receptor
escucha dichos pulsos a esa misma velocidad. Para realizar la conexión entre las
placas en el software, se implementó en cada una de ellas un algoritmo con el fin de
establecer los protocolos de comunicación y las políticas de velocidad. En la placa
Raspberry Pi se instaló el lenguaje de programación Python y en la Arduino se uti-
lizó el IDE propietario para establecer la configuración necesaria para los puertos.
Nombre_Variable=serial.Serial(‘/dev/ttyACM0’,9600)
Serial.begin(9600);
En Arduino se tienen dos formas de leer los datos: una es por bit, en la que solo
es posible recibir un carácter, y la otra es por byte, en la cual se puede recibir una
cadena. En esta última los parámetros son dos: buffer y Long; el primero es el vec-
tor que guarda cada uno de los caracteres de la cadena, y el segundo es la longitud
o tamaño de la cadena. Es necesario tener en cuenta que al momento de enviar
enteros por el puerto serial este los envía en formato ASCII.
Para lograr la implementación del sistema fue necesario el uso de ciertos lenguajes
de programación que permitieron realizar la integración en la parte lógica para cada
una de las tarjetas embebida. En la tabla 2 se muestra un resumen de los lenguajes
y sus funciones dentro del sistema.
Tabla 2. Resumen de los lenguajes de programación y sus funciones dentro del sistema
Lenguaje de Capa
Funciones
programación arquitectura
• Aplicación en Android
• Interacción con el usuario a través de la interfaz gráfica
• Conexión entre la aplicación Android y la placa embebida Capa
Java
Raspberry Pi de presentación
• Envío de los parámetros para la selección de los diferentes
modos
Integración de los sistemas embebidos Raspberry Pi y Arduino para el manejo de un brazo robótico mediante una aplicación Android
• Interpretación de los parámetros enviados por la placa Rasp-
berry Pi mediante el lenguaje de programación Python
Fuente: elaboración propia.
Descripción de la aplicación
posición, temperatura y torque. Una vez definidas las características del dispositivo
para pruebas, se realizan los respectivos planos para hacer los cortes de las piezas en
acrílico. Luego se ensambla cada uno de los elementos para obtener el dispositivo
para pruebas esperado, el cual se expone a continuación.
Importar bibliotecas,
Inicio creación del canal de
comunicación serial
Dato [] =
Argumentos
Integración de los sistemas embebidos Raspberry Pi y Arduino para el manejo de un brazo robótico mediante una aplicación Android
No
Dato [0] == 1 Dato [0] == 2
Motor Base
Grados Rutina 1 Enviar orden
Dato [1] == 1 Dato [1] == 1
a posición Dato [2:] a Arduino
Dato [2:]
No No
Motor Link1
Grados Rutina 2 Enviar orden
Dato [1] == 2 Dato [1] == 2
a posición Dato [2:] a Arduino
Dato [2:]
No No
Motor Link2
Grados Rutina 3 Enviar orden
Dato [1] == 3 Dato [1] == 3
a posición Dato [2:] a Arduino
Dato [2:]
No
Motor Pinza
Grados Dato [1] == 4
a posición
Dato [2:]
Enviar
orden a Fin
Arduino
Aplicación en Python
import sys
import serial
import time
arduino = serial.Serial(‘/dev/ttyACM0’,9600)//determina la conexión y la velocidad
de la conexión
Integración de los sistemas embebidos Raspberry Pi y Arduino para el manejo de un brazo robótico mediante una aplicación Android
time.sleep(2) //Retardo en la conexión
dato=sys.argv[1]// recibe el valor de las posiciones
//En esta parte del código dependiendo del valor de la posición, convierte a los valores en
grados
//Existe un vector donde se almacenan los parámetros necesarios para determinar el mo-
vimiento de los //servomotores
//La posición 0 del vector define el modo de rutina, 1 para modo individual y 2 para
modo rutina
if dato[0]==’1’:
//En el Modo individual se hace un llamado a otro condicional donde se selecciona la parte
del //dispositivo que desea mover, 1. Base, 2. Link1, 3. Link2 y 4. Pinza, al momento de
ingresar //alguna de estas opciones el programa convierte grados a posición y por último
se envía una //cadena de 5 bits a Arduino, 1 bit para el modo de ejecución, 1 bit para la
parte que se desea //mover y 3 bit para los grados
if dato[1]==’1’:
grados=int(dato[2:])
if grados > 159:
grados=159
if grados < -159:
grados=-159
posicion=int((((1002-512)/159.8)*grados)+512)
if posicion <100:
posicion=’0’+str(posicion)
envio=dato[0]+dato[1]+str(posicion)
arduino.write(envio)
elif dato[1]==’2’:
grados=-1*int(dato[2:])
elif dato[0]==’2’:
if dato[1]==’1’:
envio=dato[0]+dato[1]+’000’
arduino.write(envio)
elif dato[1]==’2’:
envio=dato[0]+dato[1]+’000’
arduino.write(envio)
elif dato[1]==’3’:
envio=dato[0]+dato[1]+’000’
arduino.write(envio)
arduino.close()
Void Setup
Inicio Importar bibliotecas configuración inicial
de los motores
Integración de los sistemas embebidos Raspberry Pi y Arduino para el manejo de un brazo robótico mediante una aplicación Android
Void Loop
Lectura de datos
Python
Fin
//El algoritmo primero configura e inicializa los servomotores, después recibe los datos
//que provienen de Python, estos datos son procesados y se convierten en tres variables,
int modo=0;
int articulacion=0;
int posicion=0;
Servo pinza;
void setup(){
Serial.begin(9600);
Herkulex.begin(115200,10,11);
David Rolando Suárez Mora, Alexandra Aparicio Gómez, Yuli Katerine Gallego Ibáñez, Juan Camilo Ramírez Salcedo
Herkulex.reboot(1);
Herkulex.reboot(2);
Herkulex.reboot(3);
delay(500);
Herkulex.initialize();
Herkulex.moveAllAngle(1, 0, 1);
Herkulex.moveAllAngle(2, -6, 1);
Herkulex.moveAllAngle(3, 5, 1);
Herkulex.actionAll(2000);
delay(2100);
pinza.attach(9);
pinza.write(180);
}
// la función loop
void loop(){
if (Serial.available() >= 5) {
char pos[5];
Serial.readBytes(pos,5);
int modo=pos[0]-0x30;
int articulacion=pos[1]-0x30;
int posicion=(pos[4]-0x30)+(pos[3]-0x30)*10+(pos[2]-0x30)*100;
Serial.println(modo);
Serial.println(articulacion);
Serial.println(posicion);
Integración de los sistemas embebidos Raspberry Pi y Arduino para el manejo de un brazo robótico mediante una aplicación Android
else if(articulacion==4){
if (posicion==001){
pinza.write(180);
}
else{
pinza.write(90);
}
}
}
else if(modo==2){
if (articulacion ==1){
Herkulex.moveAll(1, posicion, 1);
}
else if (articulacion ==2){
Herkulex.moveAll(2, posicion, 1);
}
else if (articulacion ==3){
Herkulex.moveAll(3, posicion, 1);
}
else if (articulacion ==4){
Herkulex.actionAll(2000);
}
}
}
}
Ciclo infinito se recibe una variable String (en este caso una H para encender el led o una
L para apagarlo)
Integración de los sistemas embebidos Raspberry Pi y Arduino para el manejo de un brazo robótico mediante una aplicación Android
void loop () {
// El ciclo determina si hay alguna comunicación serial, esto se hace con el comando Se-
rial.available, si esta existe, se lee la información y se guarda en una variable tipo char, la
condicional ejecuta la decisión que prender o apagar el led. Cuando se ejecute la aplicación
el usuario deberá seleccionar entre algunas de las dos opciones
if (Serial.available()) {
char c = Serial.read();
if (c == ‘H’) {
digitalWrite(led, HIGH);
}
else if (c == ‘L’) {
digitalWrite(led, LOW);
}
}}
La fórmula anterior solo sirve para convertir solo una unidad. Si lo que se quiere
es convertir una decena o un número mayor, se usa la siguiente fórmula (ejemplo
si el dato es de tres cifras):
n = (Dato [2] – 0 x 30) + 10 * (Dato [1] – 0 x 30) + 100 + (Dato [0] – 0 x 30)
(2) transformación de ASCII a entero (números mayores a la unidad)
#include <Servo.h>
char posicion[3];
void setup(){
Serial.begin(9600);// establece la velocidad de comunicación
motor.attach(9);
}
// envía los datos para realizar el movimiento
void loop(){
if (Serial.available() >= 3){
Integración de los sistemas embebidos Raspberry Pi y Arduino para el manejo de un brazo robótico mediante una aplicación Android
Serial.readBytes(posicion,3);
//Convierte a hexadecimal la posición para ser enviada al Arduino
pos=(posicion[2]-0x30)+(posicion[1]-0x30)*10+(posicion[0]-0x30)*100;
motor.write(pos);
}
}
En el siguiente código se capturan los valores en grados que deben mover el mo-
tor y después se envían al código en Arduino para que este mueva el motor a la
posición deseada.
import serial
arduino = serial.Serial(‘/dev/ttyACM0’, 9600)
print(“Starting!”)
while True:
//captura los valores en grados que se debe mover el motor
grados = raw_input(‘Que posicion desea mover el servo (000-180 grados): ‘)
//envió el valor en hexadecimal para que el Arduino mueva el motor a la posición
arduino.write(grados)
arduino.close()
( Posición–512 ) *159.8
Grados = (3) Posición a grados
(1002–512 )
(1002–512 ) * Grados
Posición = + 512 (10) Posición a grados
159.8
Integración de los sistemas embebidos Raspberry Pi y Arduino para el manejo de un brazo robótico mediante una aplicación Android
public SSHCliente() {
jsch = new JSch();
try {
JSch.setConfig(“StrictHostKeyChecking”, “no”); //Tipo de conexión
sesion = jsch.getSession(“pi”,”192.168.0.150”,22); //Usuario y dirección IP
sesion.setPassword(“raspberry”); //contraseña para la conexión
sesion.connect();
m= sesion.isConnected(); //creación del objeto M el cual genera la sesión
x= sesion.getHost();
consola = (ChannelExec) sesion.openChannel(“exec”);
//Envió del comando para ser ejecutado en la placa Raspberry Pi
((ChannelExec)consola).setCommand(“sudo shutdown -h now.py”);
consola.connect();
} catch( JSchException e) {
System.out.println(“Error de JSCH. Mensaje: “+e.getMessage());
}
}
}
if (botonoff==1) {
((ChannelExec)consola).setCommand(“sudo ledoff.py”);
consola.connect();
}
} catch( JSchException e) {
System.out.println(“Error de JSCH. Mensaje: “+e.getMessage());
}
}
Conclusiones
Modo rutinas
Conectar
Integración de los sistemas embebidos Raspberry Pi y Arduino para el manejo de un brazo robótico mediante una aplicación Android
Motor 1 Motor 2 Motor 3
Rutina 1
Enviar grados
Una vez realizadas las pruebas de conexión serial entre Arduino y Raspberry Pi, lec-
tura, escritura de datos y manejo del servomotor Herkulex drs-0101 entre los siste-
mas embebidos, se desarrollaron dos programas para el manejo del dispositivo para
pruebas: el programa en Python se encarga de procesar la información dada por el
usuario, organizarla y enviarla al Arduino, que recibe dicha información, la interpre-
ta y la ejecuta. Lo anterior es útil en el desarrollo de proyectos en automatización.