T-112179 Núñez Bolívar-Valarezo Mauricio
T-112179 Núñez Bolívar-Valarezo Mauricio
T-112179 Núñez Bolívar-Valarezo Mauricio
PROYECTO INTEGRADOR
Ingenieros en Mecatrónica
Presentado por:
Bolı́var Steward Núñez Montoya
Mauricio David Valarezo Añazco
GUAYAQUIL - ECUADOR
Año: 2021
DEDICATORIA
personal y profesional.
universitaria.
éxito.
adelante.
I
ABSTRACT
The continuous evolution of knowledge and technologies has prompted the development
of new areas of knowledge in Ecuadorian education to achieve a level of learning similar
to that of foreign institutions. For this reason, this project proposes the design and
implementation of the control system of an anthropomorphic robotic hand (MRA) with 6
degrees of freedom using myoelectric signals to promote learning in students and
teachers of the Neuroimaging and Bioengineering laboratory of ESPOL. EMG data was
first collected from 10 participants (four men and six women) who imitated four hand
gestures. The implementation design was based on an electronic board for data
acquisition Cyton Board, which communicates via serial port to a PC. The PC hosts the
control system and the classification model through machine learning that issues the
movement through a Rest API (communication with HTTP POST and GET) to an ESP32
that controls the movement of the MRA. The Multi-layer Perceptron Classifier algorithm
was selected with three hidden layers, whose accuracy was 84.78 %, allowing the
identification of 7 out of 10 randomly performed movements among the four selected
gestures with a reaction time of 2 seconds. The final design of the MRA was printed in
3D, containing the entire electrical system inside. This design contributes to objectives 3
and 4 of the SDGs as it is a teaching device that encourages research and could help
people with amputated hands. The final price was $1,570.00, making it 51 % cheaper
than other locally available biomedical equipment. Allowing the device to be more
accessible to be implemented in different educational and research centres.
II
ÍNDICE GENERAL
RESUMEN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . I
ABSTRACT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . II
SIMBOLOGÍA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . V
ABREVIATURAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . VI
ÍNDICE DE TABLAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . X
1 INTRODUCCIÓN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1 Descripción del problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 Justificación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3.1 Objetivo general . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3.2 Objetivos especı́ficos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.4 Marco teórico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.4.1 Mano robótica antropomórfica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.4.2 Señales mioeléctricas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.4.3 Posición y cantidad de electrodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.4.4 Procesamiento de señales mioeléctricas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.4.5 Filtros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.4.6 Rest API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.4.7 Modelos ML de clasificación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.4.8 Estado del arte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2 METODOLOGÍA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.1 Requerimientos de Diseño . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.2 Placa de adquisición de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.2.1 RFDuino USB dongle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.2.2 OpenBCI GUI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.3 Alternativas de solución para la implementación. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.4 Sistema de adquisición de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
III
2.4.1 Ubicación de electrodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.4.2 Selección de movimientos a realizar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.4.3 Programación del sistema de adquisición de datos. . . . . . . . . . . . . . . . . . . . . 22
2.4.4 Adquisición de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.5 Procesamiento de datos.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.5.1 Preprocesamiento de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.5.2 Filtrado de señal. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.5.3 Extracción de caracterı́sticas de la señal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.5.4 Selección de caracterı́sticas relevantes de la señal . . . . . . . . . . . . . . . . . . . . 31
2.6 Diseño de control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.6.1 Modelos de clasificación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
2.7 Implementación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
2.7.1 Cálculo de consumo energético . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
2.7.2 Rest API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3 RESULTADOS Y ANÁLISIS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.1 Adquisición y procesamiento de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.2 Diseño de sistema de control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.2.1 Selección de modelo de clasificación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.2.2 Sistema de control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.3 Implementación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
3.3.1 Sistema eléctrico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
3.3.2 Diseño final . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.3.3 Resultados finales de implementación. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
3.4 Análisis de Costos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
4 CONCLUSIONES Y RECOMENDACIONES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
4.1 Conclusiones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.2 Recomendaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
BIBLIOGRAFÍA
APÉNDICES
IV
SIMBOLOGÍA
mV milivoltio
µV microvoltios
Hz Hercio
A Amperios
Fs Factor de seguridad
ms milisegundos
V
ABREVIATURAS
EMG Electromiografı́a
EEG Encefalograma
ECG Electrocardiograma
CB Cyton Board
ML Machine Learning
VI
IA Inteligencia Artificial
VII
ÍNDICE DE FIGURAS
Figura 1.1 Prótesis pierna 300A.C [1]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Figura 1.2 Gasto en actividades de ciencia, tecnologı́a e innovación, 2012-2014 [1]. 2
Figura 1.3 Publicaciones cientı́ficas por cada 100.000 habitantes, 2010 - 2019 [2]. . 2
Figura 1.4 Diseño de mano robótica antropomórfica [3]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Figura 1.5 Generación de un impulso eléctrico debido al movimiento de las fibras
musculares [4]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Figura 1.6 Curva de número de canales vs el porcentaje de precisión de
clasificación [5]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Figura 1.7 Disposición de los electrodos [5]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Figura 1.8 Diagrama de bloques del Sistema de adquisición de señales EMG [6]. . 9
Figura 1.9 Mano robótica mimética [7]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Figura 1.10 Diseño de mano antropomórfica [8]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Figura 2.1 Metodologı́a de diseño e implementación. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Figura 2.2 Placa de biodetección Cyton Board desarrollado por OpenBCI [9]. . . . . . . . 15
Figura 2.3 Adaptador USB con Bluetooth [9]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Figura 2.4 Diseño de implementación de la solución A. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Figura 2.5 Diseño de implementación de la solución B. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Figura 2.6 Diseño de implementación de la solución C. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Figura 2.7 Diseño de implementación de la solución D. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Figura 2.8 Ubicación de electrodos en el CB. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Figura 2.9 Diagrama de ubicación y distanciamiento de los electrodos a nivel
muscular del antebrazo de una persona. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Figura 2.10 Gestos seleccionados para implementación. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Figura 2.11 Diagrama de flujo de adquisición de datos. Parte I. . . . . . . . . . . . . . . . . . . . . . . . . 23
Figura 2.12 Diagrama de flujo de adquisición de datos. Parte II.. . . . . . . . . . . . . . . . . . . . . . . . 24
Figura 2.13 Muestra obtenida del movimiento 1 repetición 6 de una persona. . . . . . . . . 27
Figura 2.14 Gráfica de los datos preprocesados de la Figura 2.13. . . . . . . . . . . . . . . . . . . . . 28
Figura 2.15 Espectro de frecuencias de repetición 6 del gesto 1 de una muestra. . . . 29
Figura 2.16 Señal filtrada del movimiento 1 repetición 6 de una muestra. . . . . . . . . . . . . . 31
Figura 2.17 Relevancia de las 20 mejores caracterı́sticas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
VIII
Figura 2.18 Matriz de correlación. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Figura 2.19 Diseño base de MRA. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Figura 2.20 Diagrama de conexión de ESP32 y PCA9685 [10]. . . . . . . . . . . . . . . . . . . . . . . . . 36
Figura 2.21 Fuente de alimentación de protoboards [11]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Figura 3.1 Curvas de entrenamiento y validación, escalabilidad y rendimiento del
modelo seleccionado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Figura 3.2 Matriz de confusión. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Figura 3.3 Curva ROC. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Figura 3.4 Diagrama de bloques del sistema de control del clasificador. . . . . . . . . . . . . . 44
Figura 3.5 Diagrama de sistema de control de posición de un servomotor [12]. . . . . . 44
Figura 3.6 Diagrama de bloques del sistema de control de los servomotores. . . . . . . 45
Figura 3.7 Diagrama de conexión del sistema eléctrico. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Figura 3.8 Diseño final de la MRA. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Figura 3.9 Resultados de predicción de implementación del diseño. Parte 1. . . . . . . . 48
Figura 3.10 Resultados de predicción de implementación del diseño. Parte 2. . . . . . . . 49
Figura 3.11 Diagrama de Flujo de funcionamiento del diseño de implementación. . . . 50
IX
ÍNDICE DE TABLAS
Tabla 2.1 Requerimientos para el diseño e implementación del sistema. . . . . . . . . . . . . . 14
Tabla 2.2 Requerimientos para el diseño e implementación del sistema. . . . . . . . . . . . . . 19
Tabla 2.3 Matriz de decisión de alternativas de solución. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Tabla 2.4 Medidas de ubicación de cada zona del antebrazo. . . . . . . . . . . . . . . . . . . . . . . . . . 21
Tabla 2.5 Datos de sujetos de prueba parte 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Tabla 2.6 Datos de sujetos de prueba parte 2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Tabla 3.1 Resultado de entrenamiento y validación de modelos de clasificación . . . . 39
Tabla 3.2 Parámetros de evaluación cruzada. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Tabla 3.3 Resultados de evaluación cruzada con modelo seleccionado. . . . . . . . . . . . . . 40
Tabla 3.4 Reporte del modelo MLPC seleccionado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Tabla 3.5 Cotización de rubros. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
Tabla 3.6 Comparativo entre prótesis de mano. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
X
CAPÍTULO 1
1. INTRODUCCIÓN
Estos sistemas también fueron abordados por Leonardo Da Vinci, una persona
destacada por su ingenio e invenciones en el siglo XV. Jack Steele en 1959-1960
acuño el término de biónica como la ”Materialización de los funcionamientos
reales de los sistemas vivos en aparatos” [14]. Posteriormente surge el término
prótesis, como aquel dispositivo cuya finalidad es mejorar o reemplazar una parte,
sección o miembro completo del cuerpo humano que haya sido afectado o
amputado permitiendo recuperar su movilidad y aspecto [15]. En la última década,
se ha desarrollado nuevas y mejores interfaces hombre-máquina mediante la
incorporación del mundo digital en la Industria 4.0; entre los cuales se tienen los
sistemas ciberfı́sicos [16].
Figura 1.3 Publicaciones cientı́ficas por cada 100.000 habitantes, 2010 - 2019 [2].
2
Por lo tanto, el desarrollo de un recurso didáctico para el Laboratorio de
Neuroimagen y Bioingenierı́a (LNB) de la ESPOL permitirá expandir las bases de
conocimiento impartidos a los estudiantes y elevar la calidad de enseñanza de la
institución educativa. El presente proyecto está seccionado en 4 capı́tulos
empezando con la descripción del marco teórico y objetivos; el capı́tulo 2 detalla la
metodologı́a implementada para clasificar las señales EMG según el movimiento
muscular; el capı́tulo 3 presenta los resultados obtenidos de la implementación, y
el capı́tulo 4 finaliza el documento con las conclusiones y recomendaciones.
3
1.2 Justificación
1.3 Objetivos
4
1.3.2 Objetivos especı́ficos
5
Figura 1.4 Diseño de mano robótica antropomórfica [3].
Las señales EMG son señales bioeléctricas producidas por las fibras
musculares o nervios durante el movimiento de una extremidad.
Continuamente se ha buscado mejores algoritmos de diferenciación y
clasificación de los distintos movimientos de las extremidades para ser
replicados en sus semejantes robotizados [27]. Estas señales son
medidas por dos métodos: el primero es por inserción de una aguja
hipodérmica, pero se considera invasivo e impropio para el cuerpo
humano (Figura 1.5); el segundo método son electrodos superficiales. Se
diferencian en la cantidad de grupos musculares que logran medir, siendo
la intramuscular aquella capaz de seccionar las fibras musculares [4].
6
Figura 1.5 Generación de un impulso eléctrico debido al movimiento de las fibras
musculares [4].
7
Figura 1.6 Curva de número de canales vs el porcentaje de precisión de clasificación [5].
8
Figura 1.8 Diagrama de bloques del Sistema de adquisición de señales EMG [6].
1.4.5 Filtros
s2 + ω N
2
T (s) = 2
(1.1)
s2 + 2ξωN s + ωN
9
aprecian los picos en el diagrama de Bode. Su fórmula depende de la
paridad del orden, siendo la Ecuación 1.2 para orden ”M” impar y la
Ecuación 1.3 para orden par en filtros pasa baja [34]. Para filtros pasa
alta se deben agregar ceros en en el origen según el orden.
−1)/2
(MY 2
ωN ωN
T (s) = 2
, θi = i × 180/N (1.2)
s + ωN 1
s2 + 2 cos (θi )ωN s + ωN
M/2 2
Y ωN
T (s) = 2
, θi = (i − 0.5) × 180/N (1.3)
1
s2 + 2 cos (θi )ωN s + ωN
10
Decisión Tree.
Random Forest.
Ridge Classifier.
11
Otro ejemplo es el desarrollado en [8], cuyo diseño se puede aprecia en
la Figura 1.10. Su diseño es similar al anterior, pero únicamente utiliza un
solo cordón por dedo para ejercer su respectivo movimiento. Su
metodologı́a se basa en la sinergia muscular para la clasificación de
varios movimientos de la mano a partir de un pequeño conjunto de
movimientos aprendidos. El clasificador implementado era una red
recurrente que mezcla un modelo logarı́tmico-linearizado gaussiano
(R-LLGMN). La exactitud de su modelo logró alcanzar el 90 % entre sus
pruebas.
Por otro lado, en [39] desarrollo el control de una prótesis robótica de una
mano mediante el uso de redes neuronales convoluciones (CNN). En el
procesamiento de las señales EMG se aplicó el análisis de los
componentes principales (PCA) para la extracción de las caracterı́sticas
de mayor relevancia que ingresarı́an a la CNN. Sus resultados
demostraron un varianza en la exactitud del modelo según el sujeto de
prueba, el cual variaba entre un 60 % a un 80 % aproximadamente.
12
CAPÍTULO 2
2. METODOLOGÍA
Criterio Descripción
14
Figura 2.2 Placa de biodetección Cyton Board desarrollado por OpenBCI [9].
OpenBCI posee un potente GUI que contenı́a una interfaz muy amigable
e iterativa para analizar los datos en tiempo real debido a sus
herramientas de visualización, grabación y transmisión de datos. Para
ello, se utilizó el lenguaje Python para su programación y el sistema de
Lab Steaming Layer (LSL) para la transmisión de datos [41]. Una mayor
descripción de la funcionalidad del sistema LSL se encuentra en el
Apéndice C.
15
2.3 Alternativas de solución para la implementación
16
Figura 2.5 Diseño de implementación de la solución B.
17
Figura 2.7 Diseño de implementación de la solución D.
Interferencia El diseño debı́a ser semi robusto reducir las afectaciones por
ruido.
18
Tabla 2.2 Requerimientos para el diseño e implementación del sistema.
Criterios de evaluación
Rango de % de
Peso Criterio
importancia decisión
2.0 Costo 3 17 %
1.5 Portabilidad 5 13 %
0.5 Interferencia 6 4%
Cada alternativa propuesta fue evaluada según los pesos de los criterios
especificados. Dado los resultados obtenidos en la Tabla 2.3, se determinó
que la mejor alternativa de solución fue la opción B. A pesar de su alto costo
por el PC, la capacidad de computo era mayor y este suele estar presente en
los laboratorios por lo que el costo final puede ser reducido.
Criterios Resultados
Portabilidad
Alternativas
de computo
Capacidad
Tiempo de
Prioridad
reacción
de datos
Costo
A 7 9 4 8 5 7 40 80.1 4
B 8 9 4 9 7 9 46 89.3 1
C 9 6 9 6 6 10 46 87.2 3
D 9 8 7 7 5 10 46 88.9 2
19
2.4 Sistema de adquisición de datos
20
Figura 2.9 Diagrama de ubicación y distanciamiento de los electrodos a nivel muscular del
antebrazo de una persona.
D1 0.205*DAnt zona 1.
D2 0.295*DAnt zona 2.
D3 0.5*DAnt zona 3.
D4 0.273*dPost zona 4.
D5 0.545*dPost zona 5.
D6 0.182*dPost zona 6.
21
2.4.2 Selección de movimientos a realizar
22
Figura 2.11 Diagrama de flujo de adquisición de datos. Parte I.
23
Figura 2.12 Diagrama de flujo de adquisición de datos. Parte II.
24
Tabla 2.5 Datos de sujetos de prueba parte 1.
Contextura
Foto Edad Dexteridad
muscular
20 Media Diestra
18 Media Diestra
32 baja Diestra
25 baja Diestro
34 baja Diestra
25
Tabla 2.6 Datos de sujetos de prueba parte 2.
Contextura
Foto Edad Dexteridad
muscular
25 Media Diestra
48 Media Diestra
43 Media Diestro
44 Media Diestro
43 Media Diestra
26
Figura 2.13 Muestra obtenida del movimiento 1 repetición 6 de una persona.
X − Xmin
Xsc = (2.1)
Xmax − Xmin
27
X − (−153416.984375)
Xsc = (2.2)
17447.056640625 − (−153416.984375)
28
(a) Canal 1 (b) Canal 2
Para atenuar las frecuencias atı́picas se utilizó el filtro digital notch a una
frecuencia de 60 [Hz] [47], ecuación 2.3. Y un filtro pasa banda de 10 -
100 [Hz] para atenuar las frecuencias fuera del espectro seleccionado. El
29
filtro digital aplicado fue del tipo Butterworth de orden 5, cuya expresión
matemática para el filtro pasa baja se aprecia en la ecuación 2.4 y para el
filtro pasa alta en la ecuación 2.5.
s2 + (2π60)2
H(s) = A (2.3)
s2 + s 2π60
2π4
+ (2π60)2
(2π100)2
2π100
T (s) =
s + (2π100) s2 + 2 cos (36)2π100s + (2π100)2
(2.4)
(2π100)2
(2π10)2 s2
2π10s
T (s) =
s + 2π10 s2 + 2 cos (36)2π10s + (2π10)2
(2.5)
(2π10)2 s2
30
Figura 2.16 Señal filtrada del movimiento 1 repetición 6 de una muestra.
31
Figura 2.17 Relevancia de las 20 mejores caracterı́sticas.
32
Figura 2.18 Matriz de correlación.
33
2.6.1 Modelos de clasificación
34
Gaussian process: Se mantuvo los valores predeterminados de sus
parámetros y se modificó el estado inicial aleatorio en 10. La función
implementada fue: ”GaussianProcessClassifier(random state=10)”.
2.7 Implementación
35
Para el movimiento de cada GDL se utilizó un pequeño servomotor cuyo par
de torque era de 2.5 [kg-cm], todos los demás datos técnicos se encuentran
en el Apéndice G. Mediante el módulo PCA9685 se logró establecer el
control de los 6 servomotores mediante comunicación I2C con el ESP32.
Este módulo actuaba como un pequeño driver de control, sus datos técnicos
se encuentran en el Apéndice H.
36
Figura 2.21 Fuente de alimentación de protoboards [11].
Itotal = n × I¯ × Fs
(2.6)
Itotal = 6 × 625 × 1.3
37
CAPÍTULO 3
3. RESULTADOS Y ANÁLISIS
Exactitud de Exactitud de
Modelo de clasificación
entrenamiento validación
Parámetros Datos
alpha [0.0001]
hidden layer sizes [(250, 150, 50), (250, 500, 60), (1200, 400, 50),
activation [relu,tanh]
39
Para los resultados de la Figura 3.1 se aplicó aleatoriedad a los datos y
se escogı́a cada vez el 20 % de los datos para validación y el resto para
entrenamiento. De esta forma se podı́a determinar la evolución del
modelo conforme se entrenaba con datos virtualmente nuevos. De ello,
se puede apreciar que el rendimiento del modelo llegó alcanzar casi el
80 % con una varianza semi constante de aproximadamente de 2.5 %. El
modelo obtenido es escalable, pero debido a la variabilidad de los sujetos
y el reuso de los electrodos al adquirir los datos, se requerı́a de un
entrenamiento cada vez que se colocan los electrodos.
40
Figura 3.1 Curvas de entrenamiento y validación, escalabilidad y rendimiento del modelo
seleccionado.
41
positivos) y los valores de alrededor indican aquellas estimaciones que no
se lograron predecir correctamente (falsos positivos). Tomando en cuenta
ello, se logró observar con más claridad que el gesto 1 fue el que tuvo
más problemas al confundirse 7 veces con el gesto 3, por lo que un
entrenamiento con más repeticiones del gesto 1 y del gesto 4 ( el cual
también presenta problemas en comparación con los demás) podrı́an
mejorar la exactitud del modelo.
42
área bajo la curva por lo que se procedió analizar una buena relación entre
sensibilidad y especificidad. En la Figura 3.3 se determinó que en la zona
encerrada en rojo, las curvas son un poco más estables, su sensibilidad
no es menor a 0.8 y la especificidad es cercana a 0.1 siendo esta la zona
mas óptima del modelo. Un mayor grado de sensibilidad podrı́a llevar a una
mayor falencia debido a que se incrementa considerablemente los falsos
positivos.
43
Figura 3.4 Diagrama de bloques del sistema de control del clasificador.
44
3.3 Implementación
45
aprecian en la Figura 3.7.
Entre los elementos con mayor tamaño se tenı́a la fuente de control de los
servomotores, por lo que se rediseñó la base de la MRA para incorporar
todas los elementos eléctricos en su interior. En la Figura 3.8 se puede
apreciar las 3 secciones que complementan la base de la MRA. En el
Apéndice K se encuentran las respectivos planos de la base.
46
(a) Segmentos de la MRA
47
3.3.3 Resultados finales de implementación.
48
(a) Gesto 4 (b) Gesto 4 en MRA
49
Figura 3.11 Diagrama de Flujo de funcionamiento del diseño de implementación.
50
Tabla 3.5 Cotización de rubros.
Tipo de sistema Descripción Cantidad unidad Precio Unit (USD) Total (USD)
Total $1570.00
A nivel nacional los precios por equipos médicos son muy elevados debido a
que en su mayorı́a son exportados y cuyos impuestos son altos. Por lo tanto,
la opción que se presentó es más económica en comparación con otros
equipos similares tanto nacionales como internacionales, como se puede
apreciar en la Tabla 3.6. La MRA desarrollada es mucho mas económica,
dándonos la ventaja de producirla localmente y pueda ser utilizada como un
recurso didáctico de aprendizaje en las distintas entidades de educación
superior o centros de investigación.
51
Tabla 3.6 Comparativo entre prótesis de mano.
Proteus No Si $3.500,00
ESPOCH No No $3.000,00
52
CAPÍTULO 4
4. CONCLUSIONES Y RECOMENDACIONES
54
4.1 Conclusiones
55
a 250Hz es compatible con el equipo Cyton Board y sus semejantes como
el Ganglion Board que pertenecen al mismo proveedor.
Aunque los equipos biomédicos tiene un alto valor, el precio final del
proyecto fue de $1 570.00 dolares, siendo un 51 % mas económico que
otros proyectos de similares caracterı́sticas. El precio fue tomando en
consideración el cambio de la placa de adquisición de datos a uno de 4
canales,lo cual representa un precio asequible como equipo de laboratorio
comparado con equipos comerciales de similares caracterı́sticas.
4.2 Recomendaciones
56
conductividad en la medición mioeléctrica. También se recomienda utilizar
esparadrapos sobre los electrodos para establecer un mejor contacto con
la piel. Sin embargo, estos no deben hacer una alta presión sobre los
electrodos debido a que afectarı́a en la amplitud de la señal adquirida.
57
BIBLIOGRAFÍA
[1] “Encuesta nacional de actividades de ciencia, tecnologı́a e innovación-acti —.”
[7] H. Wang, J. Qian, and Z. Zhang, “Research on mechanism design and gesture
recognition application of high biomimetic anthropomorphic robotic hand,” in 2020
IEEE International Conference on Information Technology,Big Data and Artificial
Intelligence (ICIBA), vol. 1, pp. 343–347, 2020.
[13] C. S. Johnson, A Brief History of Bionic Sonars, pp. 769–771. Boston, MA: Springer
US, 1988.
[23] L. Biagiotti, F. Lotti, C. Melchiorri, and G. Vassura, “How far is the human hand? a
review on anthropomorphic robotic end-effectors,” 2002.
[24] E. Martinez-Garcia, “Diseño y modelado de mano robótica antropomórfica de
músculos artificiales,” Instituto de Ingenierı́a y Tecnologı́a, 2020.
[25] Z. Li and S. Sastry, “Issues in dextrous robot hands,” Dextrous Robot Hands, pp. 154–
186, 1990.
[30] A. J. Young, L. J. Hargrove, and T. A. Kuiken, “The effects of electrode size and
orientation on the sensitivity of myoelectric pattern recognition systems to electrode
shift,” IEEE Transactions on Biomedical Engineering, vol. 58, no. 9, pp. 2537–2544,
2011.
[31] B. Hudgins, P. Parker, and R. N. Scott, “A new strategy for multifunction myoelectric
control,” IEEE Transactions on Biomedical Engineering, vol. 40, pp. 82–94, 1993.
[35] J. T. Park, H. Hwang, J.-s. Yun, and I.-y. Moon, “Study of html5 websocket for
a multimedia communication,” International Journal of Multimedia & Ubiquitous
Engineering, vol. 9, no. 7, pp. 61–72, 2014.
[37] B. Romero Rojas, “Una introducción a los modelos de machine learning,” B.S. thesis,
2020.
[42] A. A. Suzen, B. Duman, and B. Sen, “Benchmark analysis of jetson tx2, jetson
nano and raspberry pi using deep-cnn,” HORA 2020 - 2nd International Congress on
Human-Computer Interaction, Optimization and Robotic Applications, Proceedings,
6 2020.
[47] D. T. Mewett, H. Nazeran, and K. J. Reynolds, “Removing power line noise from
recorded emg,” Annual Reports of the Research Reactor Institute, Kyoto University,
vol. 3, pp. 2190–2193, 2001.
[49] J. D. Nobel, H. Wang, and T. Baeck, “Explorative data analysis of time series based
algorithm features of cma-es variants,” GECCO 2021 - Proceedings of the 2021
Genetic and Evolutionary Computation Conference, pp. 510–518, 6 2021.
Entre las especificaciones técnicas mas relevantes de la placa CB, se presentan las
siguientes:
Convertidor ADC de 24 Bits especializado para mediciones bioeléctricas con una tasa
de muestreo de 250 Hz en cada canal. Procedente de Texas Instruments.
5 pines GPIO.
Acelerómetro: LIS3DH
Ranura SD card
Cabecera
• Byte 1: 0xA0
Datos EEG/ECG/EMG
Datos Auxiliares
• Bytes 27-32: 6 bytes de datos que se definen y analizan según el byte de parada.
Byte de parada
Figura B.1 Configuraciones de los 6 bytes auxiliares según el byte de parada [53].
APÉNDICE C
Lab Streaming Layer (LSL).
Figura D.1 Configuración de los widgets a utilizar en el Software OpenBCI GUI [9].
1
2 d e f o n e F o r A l l t a g s ( DFrame , ID number ) :
3 d f = DFrame
4 d f = d f . f i l t e r ( [ ’ t i m e ’ , ’ ch1 ’ , ’ ch2 ’ , ’ ch3 ’ , ’ ch4 ’ , ’ ch5 ’ , ’ ch6 ’ , ’ t a g ’ ] )
5
6 tag1 = pd . DataFrame ( )
7 tag2 = pd . DataFrame ( )
8 tag3 = pd . DataFrame ( )
9 tag4 = pd . DataFrame ( )
10
11 groups = [ 0 ]
12
13 for i in t r a n g e ( d f . shape [ 0 ] − 1 , desc= ” E x t r a c t i n g groups ” ) :
14 i f ( d f . t i m e . i l o c [ i +1] − d f . t i m e . i l o c [ i ] ) > 1 . 0 :
15 groups . append ( i +1)
16
17 groups . append ( d f . shape [ 0 ] )
18
19 p r i n t ( f ’ E x i s t e n {l e n ( groups ) −1} r e p e t i c i o n e s ’ )
20
21 Secuencia = np . ones ( [ 4 , 1 ] )
22
23 f o r j i n t r a n g e ( l e n ( groups ) −1 , desc= ” C l u s t e r by t a g s ” ) :
24
25 d f a u x = d f [ groups [ j ] : groups [ j + 1 ] ]
26
27 d f a u x = impute ( d f a u x )
28
29 d f a u x = d f a u x . a s s i g n ( ID = ID number )
30 d f a u x [ ’ t i m e ’ ] = ( d f a u x . t i m e − d f a u x . t i m e . i l o c [ 0 ] ) * 1000
31 d f a u x . t i m e = d f a u x . t i m e . astype ( i n t )
32
33 channels = d f a u x . i l o c [ : , 1 : 7 ]
34 channels = channels − channels . mean ( )
35 s c a l e r = MinMaxScaler ( )
36 d f a u x . i l o c [ : , 1 : 7 ] = s c a l e r . f i t t r a n s f o r m ( channels )
37
38 i f d f a u x . t a g . i l o c [ j ] == 1 :
39 d f a u x = d f a u x . a s s i g n ( R e p e t i c i o n = i n t ( Secuencia [ 0 ] ) )
40 tag1 = tag1 . append ( df aux , i g n o r e i n d e x = True )
41 Secuencia [ 0 ] += 1
42
43 i f d f a u x . t a g . i l o c [ j ] == 2 :
44 d f a u x = d f a u x . a s s i g n ( R e p e t i c i o n = i n t ( Secuencia [ 1 ] ) )
45 tag2 = tag2 . append ( df aux , i g n o r e i n d e x = True )
46 Secuencia [ 1 ] += 1
47
48 i f d f a u x . t a g . i l o c [ j ] == 3 :
49 d f a u x = d f a u x . a s s i g n ( R e p e t i c i o n = i n t ( Secuencia [ 2 ] ) )
50 tag3 = tag3 . append ( df aux , i g n o r e i n d e x = True )
51 Secuencia [ 2 ] += 1
52
53 i f d f a u x . t a g . i l o c [ j ] == 4 :
54 df aux = d f a u x . a s s i g n ( R e p e t i c i o n = i n t ( Secuencia [ 3 ] ) )
55 tag4 = tag4 . append ( df aux , i g n o r e i n d e x = True )
56 Secuencia [ 3 ] += 1
57
58
59
60 # p r i n t ( Secuencia )
61 r e t u r n tag1 , tag2 , tag3 , tag4
Código E.2.2 Función para normalización y división de datos por tipo de movimiento.
1
2 d e f g r a f i c a s t a g ( DFrame , f i l t e r , name ) :
3 d f = DFrame
4
5 i d = d f . ID . i l o c [ 0 ]
6 mov = d f . t a g . i l o c [ 0 ]
7 rept = df . Repeticion . i l o c [ 0 ]
8
9 f i g , axs = p l t . s u b p l o t s ( 6 , f i g s i z e = ( 1 3 , 1 0 ) , sharex=True , sharey=True )
10 f i g . s u p t i t l e ( ’ G r a f i c a s canales vs tiempo d e l movimiento ’ + s t r ( mov ) )
11
12 l a b e l s = [ ’ ch1 ’ , ’ ch2 ’ , ’ ch3 ’ , ’ ch4 ’ , ’ ch5 ’ , ’ ch6 ’ ]
13
14 f o r i , ax i n enumerate ( axs ) :
15 axs [ i ] . p l o t ( d f [ ” t i m e ” ] , d f [ l a b e l s [ i ] ] , l a b e l = l a b e l s [ i ] )
16 axs [ i ] . legend ( l o c = ” upper r i g h t ” )
17
18 path = ’ Figuras mov / ’ + name
19 os . makedirs ( path , e x i s t o k =True )
20
21 if filter :
22 p l t . s a v e f i g ( path + ’ / F i l t e r m o v ’ + s t r ( mov ) + ’ r e p ’ + s t r ( r e p t ) + ’ I D ’ + s t r ( i d ) + ’ . png ’ )
23 else :
24 p l t . s a v e f i g ( path + ’ / mov ’ + s t r ( mov ) + ’ r e p ’ + s t r ( r e p t ) + ’ I D ’ + s t r ( i d ) + ’ . png ’ )
25
26 p l t . close ( )
27 # p l t . show ( )
1
2 def A l l f o r O n e f i l t e r ( list dfNames , i d ) :
3
4 A l l d a t a m o v = pd . DataFrame ( )
5
6 f o r i i n t r a n g e ( l e n ( l i s t d f N a m e s ) , desc= ” A p li c a n d o f i l t r o s ” ) :
7
8 d f = pd . r e a d c s v ( l i s t d f N a m e s [ i ] + ” . csv ” , i n d e x c o l =0)
9
10 tag1 , tag2 , tag3 , tag4 = o n e F o r A l l t a g s ( df , i d )
11
12 d f f i l t e r m o v 1 = f i l t e r p r o c e s s d f ( tag1 , l i s t d f N a m e s [ i ] + ’ ’ + s t r ( i d ) )
13 d f f i l t e r m o v 2 = f i l t e r p r o c e s s d f ( tag2 , l i s t d f N a m e s [ i ] + ’ ’ + s t r ( i d ) )
14 d f f i l t e r m o v 3 = f i l t e r p r o c e s s d f ( tag3 , l i s t d f N a m e s [ i ] + ’ ’ + s t r ( i d ) )
15 d f f i l t e r m o v 4 = f i l t e r p r o c e s s d f ( tag4 , l i s t d f N a m e s [ i ] + ’ ’ + s t r ( i d ) )
16
17 d f f i l t e r m o v 1 . t o c s v ( l i s t d f N a m e s [ i ] + ” d f F i l t e r m o v 1 . csv ” )
18 d f f i l t e r m o v 2 . t o c s v ( l i s t d f N a m e s [ i ] + ” d f F i l t e r m o v 2 . csv ” )
19 d f f i l t e r m o v 3 . t o c s v ( l i s t d f N a m e s [ i ] + ” d f F i l t e r m o v 3 . csv ” )
20 d f f i l t e r m o v 4 . t o c s v ( l i s t d f N a m e s [ i ] + ” d f F i l t e r m o v 4 . csv ” )
21
22 i d +=1
23
24
25 A l l d a t a m o v = pd . DataFrame ( )
26
27 f o r i i n range ( 1 , 5 ) :
28 movimiento = ’ d f F i l t e r m o v ’ + s t r ( i ) + ’ . csv ’
29 data mov = pd . DataFrame ( )
30
31 f o r j i n range ( l e n ( l i s t d f N a m e s ) ) :
32 rf = pd . r e a d c s v ( l i s t d f N a m e s [ j ] +movimiento , i n d e x c o l =0)
33 r f [ ” R e p e t i c i o n ” ] = ( np . a r r a y ( r f . ID . astype ( i n t ) ) −1) * 20 + np . a r r a y ( r f . R e p e t i c i o n . astype ( i n t ) )
34
35 data mov = data mov . append ( r f , i g n o r e i n d e x = True )
36
37 data mov . t o c s v ( ” Data ” + movimiento )
38
39 A l l d a t a m o v = A l l d a t a m o v . append ( data mov , i g n o r e i n d e x = True )
40
41 A l l d a t a m o v . t o c s v ( ” D a t a f i l t e r a l l M o v e . csv ” )
42
43 return All data mov
Código E.2.5 Función principal para normalizar, graficar y separar los datos por
movimiento.
2 r e l e v a n c e t a b l e = c a l c u l a t e r e l e v a n c e t a b l e ( d a t a f e a t u r e s , tag , ’ c l a s s i f i c a t i o n ’ , True , 4 )
3 p r i n t ( f ’ Tabla de r e l e v a n c i a con { r e l e v a n c e t a b l e . shape [ 0 ] } f e a t u r e s ’ )
4 relevance table = relevance table [ relevance table . relevant ]
5 r e l e v a n c e t a b l e . t o c s v ( ” r e l e v a n c e t a b l e ” +name+ ” a l l M o v . csv ” )
6 p r i n t ( f ’ Tabla de r e l e v a n c i a r e d u c i d a con { r e l e v a n c e t a b l e . shape [ 0 ] } f e a t u r e s ’ )
7
7 f e a t i m p o r t a n c e s = pd . S e r i e s ( model . f e a t u r e i m p o r t a n c e s , i n d e x = d a t a r v . columns )
8 f e a t i m p o r t a n c e s . n l a r g e s t ( 2 0 ) . p l o t ( k i n d = ’ barh ’ , f i g s i z e = ( 8 , 8 ) )
9 p l t . t i t l e ( ”N r e l e v a n t f e a t u r e s ” )
10 p l t . show ( )
11
2 def t r a i n c l a s s i f i c a t o r s ( d a t a t r a i n , t a g t r a i n ) :
3 p r i n t ( ’ * * * Resultados de e n t r e n a m i e n t o * * * \n ’ )
4
5 #Decision tree
6 dt = DecisionTreeClassifier ( ) . f i t ( data train , t a g t r a i n )
7 d t s c o r e = d t . score ( d a t a t r a i n , t a g t r a i n )
8 p r i n t ( f ’ Accuracy u s i n g D e c i s i o n t r e e : { d t s c o r e * 1 0 0 : . 2 f } ’ )
9
10 #svm P o l y n o m i a l
11 p o l y = svm .SVC( k e r n e l = ’ p o l y ’ , degree =8 , C=0.001) . f i t ( d a t a t r a i n , t a g t r a i n )
12 p o l y s c o r e = p o l y . score ( d a t a t r a i n , t a g t r a i n )
13 p r i n t ( f ’ Accuracy u s i n g Polynominal : { p o l y s c o r e * 1 0 0 : . 2 f } ’ )
14
15 # KNN
16 knn= K N e i g h b o r s C l a s s i f i e r ( n n e i g h b o r s = 20) . f i t ( d a t a t r a i n , t a g t r a i n )
17 knn score = knn . score ( d a t a t r a i n , t a g t r a i n )
18 p r i n t ( f ’ Accuracy u s i n g KNN: { knn score * 1 0 0 : . 2 f } ’ )
19
20 # Random F o r e s t C l a s s i f i e r
21 r f = R a n d o m F o r e s t C l a s s i f i e r ( random state =21) . f i t ( d a t a t r a i n , t a g t r a i n )
22 r f s c o r e = r f . score ( d a t a t r a i n , t a g t r a i n )
23 p r i n t ( f ’ Accuracy u s i n g Random F o r e s t : { r f s c o r e * 1 0 0 : . 2 f } ’ )
24
25 # Multi − l a y e r Perceptron c l a s s i f i e r
26 mlpc = M L P C l a s s i f i e r ( ( 2 5 0 , 1 5 0 , 5 0 ) , m a x i t e r =400 , a c t i v a t i o n = ’ r e l u ’ , s o l v e r = ’ adam ’ ,
random state =1)
27 mlpc score = mlpc . score ( d a t a t r a i n , t a g t r a i n )
28 p r i n t ( f ’ Accuracy u s i n g MLPC1 : { mlpc score * 1 0 0 : . 2 f } ’ )
29
30 # Gaussian Process C l a s s i f i e r
31 # k e r n e l = 1 . 0 * RBF ( 1 . 0 ) i s used
32 gpc = G a u s s i a n P r o c e s s C l a s s i f i e r ( random state =10) . f i t ( d a t a t r a i n , t a g t r a i n )
33 gpc score = gpc . score ( d a t a t r a i n , t a g t r a i n )
34 p r i n t ( f ’ Accuracy u s i n g Gaussian Process : { gpc score * 1 0 0 : . 2 f } ’ )
35
36 # Ridge C l a s s i f i e r
37 rc = RidgeClassifier ( ) . f i t ( data train , t a g t r a i n )
38 r c s c o r e = r c . score ( d a t a t r a i n , t a g t r a i n )
39 p r i n t ( f ’ Accuracy u s i n g Ridge : { r c s c o r e * 1 0 0 : . 2 f } ’ )
40
41 # Ridge C l a s s i f i e r
42 sgd = S G D C l a s s i f i e r ( ) . f i t ( d a t a t r a i n , t a g t r a i n )
43 sgd score = sgd . score ( d a t a t r a i n , t a g t r a i n )
44 p r i n t ( f ’ Accuracy u s i n g SGD: { r c s c o r e * 1 0 0 : . 2 f } ’ )
45
52 #Decision tree
53 d t p r e d = DecisionT . p r e d i c t ( d a t a t e s t )
54 dt accuracy = accuracy score ( t a g t e s t , dt pred )
55 p r i n t ( f ’ Accuracy u s i n g D e c i s i o n Tree : { d t a c c u r a c y * 1 0 0 : . 2 f } ’ )
56 #svm P o l y n o m i a l
57 p o l y p r e d = POLY . p r e d i c t ( d a t a t e s t )
58 poly accuracy = accuracy score ( t a g t e s t , poly pred )
59 p r i n t ( f ’ Accuracy u s i n g P o l y n o m i a l K e r n e l : { p o l y a c c u r a c y * 1 0 0 : . 2 f } ’ )
60 # KNN
61 knn pred = KNN. p r e d i c t ( d a t a t e s t )
62 knn accuracy = a c c u r a c y s c o r e ( t a g t e s t , knn pred )
63 p r i n t ( f ’ Accuracy u s i n g KNN: { knn accuracy * 1 0 0 : . 2 f } ’ )
64 # Random F o r e s t C l a s s i f i e r
65 r f p r e d = RF . p r e d i c t ( d a t a t e s t )
66 rf accuracy = accuracy score ( t a g t e s t , r f p r e d )
67 p r i n t ( f ’ Accuracy u s i n g RF : { r f a c c u r a c y * 1 0 0 : . 2 f } ’ )
68 # Multi − l a y e r Perceptron c l a s s i f i e r
69 mlpc pred = MLPC. p r e d i c t ( d a t a t e s t )
70 mlpc accuracy = a c c u r a c y s c o r e ( t a g t e s t , mlpc pred )
71 p r i n t ( f ’ Accuracy u s i n g MLPC1 : { mlpc accuracy * 1 0 0 : . 2 f } ’ )
72 # Gaussian Process C l a s s i f i e r
73 gpc pred = GPC. p r e d i c t ( d a t a t e s t )
74 gpc accuracy = a c c u r a c y s c o r e ( t a g t e s t , gpc pred )
75 p r i n t ( f ’ Accuracy u s i n g GPC: { gpc accuracy * 1 0 0 : . 2 f } ’ )
76 # Ridge C l a s s i f i e r
77 r c p r e d = RC. p r e d i c t ( d a t a t e s t )
78 rc accuracy = accuracy score ( t a g t e s t , rc pred )
79 p r i n t ( f ’ Accuracy u s i n g RC: { r c a c c u r a c y * 1 0 0 : . 2 f } ’ )
80 # s t o c h a s t i c g r a d i e n t descent C l a s s i f i e r
81 sgd pred = SGD. p r e d i c t ( d a t a t e s t )
82 sgd accuracy = a c c u r a c y s c o r e ( t a g t e s t , sgd pred )
83 p r i n t ( f ’ Accuracy u s i n g SGD: { sgd accuracy * 1 0 0 : . 2 f } ’ )
84
89 p r i n t ( ’ * ’ *80)
90
2 # i n c l u d e <Arduino . h>
3 # i n c l u d e <WiFi . h>
4 # i n c l u d e <HTTPClient . h>
5 # i n c l u d e <Wire . h>
6 # i n c l u d e <Adafruit PWMServoDriver . h>
7
8 / / C o n f i g u r a c i o n de conexion W i f i
9 c o n s t char * s s i d = ” SSID ” ;
10 c o n s t char * password = ” password ” ;
11 / / / / C o n f i g u r a c i o n de i p s e r v e r
12 i p = ” Colocar l a d i r e c c i o n i p d e l s e r v e r ”
13 c o n s t char * serverName = i p + ” / read ” ;
14
21 / / C o n f i g u r a c i o n movimientos
22 S t r i n g movimiento ;
23 i n t t = 200; / / tiempo e n t r e movimiento de dedos
24 / / i n t t 2 = 4000; tiempo de r e t o r n o a movimiento base de l a mano
25
26
27 / / C o n f i g u r a c i o n de l a p l a c a pca9685
28 Adafruit PWMServoDriver servos = Adafruit PWMServoDriver ( 0 x40 ) ;
29 / / p u l s o s = ms( f r e c u e n c i a / 1 0 0 0 ) * 4096
30 unsigned i n t pos 0 = 184; / / C a l c u l o de p u l s o s para 0 grados
31 unsigned i n t pos 180 = 574; / / C a l c u l o de p u l s o s para 180 grados
32
33 u i n t 8 t mov = 0 ;
34
35
36 v o i d setup ( ) {
37
38 S e r i a l . begin (115200) ;
39 WiFi . begin ( s s i d , password ) ;
40
41 S e r i a l . p r i n t ( ” Conecting t o WiFi ” ) ;
42
43 w h i l e ( WiFi . s t a t u s ( ) ! = WL CONNECTED)
44 {
45 Serial . print ( ” . ” ) ;
46 delay (500) ;
47 }
48
49 S e r i a l . p r i n t ( ” \nConnected t o t h e WiFi network ” ) ;
50 S e r i a l . p r i n t ( ” IP address : ” ) ;
51 S e r i a l . p r i n t ( WiFi . l o c a l I P ( ) ) ;
52
53 servos . begin ( ) ;
54 servos . setPWMFreq ( 5 0 ) ; / / F r e c u e c i a PWM de 50Hz
55 }
56
67 S t r i n g payload = ” {} ” ;
68
69 i f ( httpResponseCode >0) {
70 S e r i a l . p r i n t ( ”HTTP Response code : ” ) ;
71 S e r i a l . p r i n t l n ( httpResponseCode ) ;
72 payload = h t t p . g e t S t r i n g ( ) ;
73 }
74 else {
75 S e r i a l . p r i n t ( ” E r r o r code : ” ) ;
76 S e r i a l . p r i n t l n ( httpResponseCode ) ;
77 }
78 / / Free r e s o u r c e s
79 h t t p . end ( ) ;
80
81 r e t u r n payload ;
82 }
83
90 / / ( dedo , c a n a l )
91 / / ( indice , 8) ( Medio , 5 ) ( Anular , 3 ) ( M e i q u e , 0 ) ( p u l g a r 1 , 12) ( p u l g a r 1 , 15)
92
93 v o i d movimiento 0 ( )
94 {
95 movServo ( 1 2 , 100) ;
96 delay ( t ) ;
97 movServo ( 1 5 , 25) ;
98 delay ( t ) ;
99 movServo ( 8 , 170) ;
100 delay ( t ) ;
101 movServo ( 5 , 170) ;
102 delay ( t ) ;
103 movServo ( 3 , 170) ;
104 delay ( t ) ;
105 movServo ( 0 , 170) ;
106 delay ( t ) ;
107 }
108
109 v o i d movimiento 1 ( )
110 {
111 movServo ( 0 , 60) ;
112 delay ( t ) ;
113 movServo ( 3 , 75) ;
114 delay ( t ) ;
115 movServo ( 5 , 100) ;
116 delay ( t ) ;
117 movServo ( 1 5 , 110) ;
118 delay ( t ) ;
119 movServo ( 1 2 , 20) ;
120 delay ( t ) ;
121 }
122
123 v o i d movimiento 2 ( )
124 {
125 movServo ( 0 , 60) ;
126 delay ( t ) ;
127 movServo ( 3 , 75) ;
128 delay ( t ) ;
129 movServo ( 5 , 100) ;
130 delay ( t ) ;
131 movServo ( 8 , 80) ;
132 delay ( t ) ;
133 movServo ( 1 5 , 110) ;
134 delay ( t ) ;
135 movServo ( 1 2 , 100) ;
136 delay ( t ) ;
137 }
138
139 v o i d movimiento 3 ( )
140 {
141 movServo ( 1 5 , 110) ;
142 delay ( t ) ;
143 movServo ( 1 2 , 30) ;
144 delay ( t ) ;
145 movServo ( 0 , 60) ;
146 delay ( t ) ;
147 movServo ( 3 , 75) ;
148 delay ( t ) ;
149 movServo ( 5 , 120) ;
150 delay ( t ) ;
151 movServo ( 8 , 105) ;
152 delay ( t ) ;
153 }
154
155 v o i d movimiento 4 ( )
156 {
157 movServo ( 8 , 170) ;
158 delay ( t ) ;
159 movServo ( 5 , 170) ;
160 delay ( t ) ;
161 movServo ( 3 , 75) ;
162 delay ( t ) ;
163 movServo ( 0 , 60) ;
164 delay ( t ) ;
165 movServo ( 1 5 , 110) ;
166 delay ( t ) ;
167 movServo ( 1 2 , 30) ;
168 delay ( t ) ;
169 }
170
171
183 s w i t c h ( movimiento . t o I n t ( ) ) {
184 case 1 :
185 movimiento 1 ( ) ;
186 / / delay ( t2 ) ;
187 / / movimiento 0 ( ) ;
188 / / delay ( t2 ) ;
189 S e r i a l . p r i n t l n ( ” movimiento 1 ” ) ;
190 break ;
191
192 case 2 :
193 movimiento 2 ( ) ;
194 / / delay ( t2 ) ;
195 / / movimiento 0 ( ) ;
196 / / delay ( t2 ) ;
197 S e r i a l . p r i n t l n ( ” movimiento 2 ” ) ;
198 break ;
199
200 case 3 :
201 movimiento 3 ( ) ;
202 / / delay ( t2 ) ;
203 / / movimiento 0 ( ) ;
204 / / delay ( t2 ) ;
205 S e r i a l . p r i n t l n ( ” movimiento 3 ” ) ;
206 break ;
207
208 case 4 :
209 movimiento 4 ( ) ;
210 / / delay ( t2 ) ;
211 / / movimiento 0 ( ) ;
212 / / delay ( t2 ) ;
213 S e r i a l . p r i n t l n ( ” movimiento 4 ” ) ;
214 break ;
215
216 default :
217 movimiento 0 ( ) ;
218 / / delay ( t2 ) ;
219 S e r i a l . p r i n t l n ( ” movimiento 0 ” ) ;
220 break ;
221 };
222
226 }
227 else {
228 S e r i a l . p r i n t l n ( ” WiFi Disconnected ” ) ;
229 }
230 lastTime = m i l l i s ( ) ;
231 }
232
233 }
2 from f l a s k i m p o r t Flask , r e q u e s t
3 i m p o r t os
4 import json
5
7 app = F l a s k ( name )
8
9 @app . r o u t e ( ’ / ’ )
10 d e f home ( ) :
11 r e t u r n ’HELLO WORLD ’
12
13 @app . r o u t e ( ’ / mov ’ )
14 d e f movimiento ( ) :
15 s t a t e = r e q u e s t . args . g e t ( ” movimiento ” )
16 s = { ” movimiento ” : s t a t e }
17
20 w i t h open ( fname , ’w ’ ) as o u t f i l e :
21 j s o n . dump ( s , o u t f i l e )
22
23 r e t u r n ’ success ’
24
25 @app . r o u t e ( ’ / read ’ )
26 d e f readJson ( ) :
27 fname = os . path . j o i n ( app . s t a t i c f o l d e r , ” movimiento . j s o n ” )
28
29 w i t h open ( fname , ’r ’) as o p e n f i l e :
30 j s o n o b j = json . load ( o p e n f i l e )
31
32 r e t u r n j s o n o b j [ ’ movimiento ’ ]
33
34 if name == ’ main ’:
35 app . run ( h o s t = ’ IP ’ , debug = True , p o r t = 8080)
Tiny and lightweight with high output power. Servo can rotate approximately 180 degrees (90 in each direction), and works just like the standard kinds
but smaller. You can use any servo code, hardware or library to control these servos. Good for beginners who want to make stuff move without building a
motor controller with feedback & gear box, especially since it will fit in small places. It comes with a 3 horns (arms) and hardware.
There are two sets of control input pins on either side. Both sides of the pins are
identical! Use whichever side you like, you can also easily chain by connecting up two
side-by-side
Power Pins
• GND - This is the power and signal ground pin, must be connected
• VCC - This is the logic power pin, connect this to the logic level you want to use
for the PCA9685 output, should be 3 - 5V max! It's also used for the 10K pullups
on SCL/SDA so unless you have your own pullups, have it match the
microcontroller's logic level too!
• V+ - This is an optional power pin that will supply distributed power to the
servos. If you are not using for servos you can leave disconnected. It is not used
at all by the chip. You can also inject power from the 2-pin terminal block at the
top of the board. You should provide 5-6VDC if you are using servos. If you have
to, you can go higher to 12VDC, but if you mess up and connect VCC to V+ you
could damage your board!
Control Pins
• SCL - I2C clock pin, connect to your microcontrollers I2C clock line. Can use 3V
or 5V logic, and has a weak pullup to VCC
Output Ports
There are 16 output ports. Each port has 3 pins: V+, GND and the PWM output. Each
PWM runs completely independently but they must all have the same PWM frequency.
That is, for LEDs you probably want 1.0 KHz but servos need 60 Hz - so you cannot
use half for LEDs @ 1.0 KHz and half @ 60 Hz.
They're set up for servos but you can use them for LEDs! Max current per pin is
25mA.
There are 220 ohm resistors in series with all PWM Pins and the output logic is the
same as VCC so keep that in mind if using LEDs.
Assembly
Install the Servo Headers
Install 4 3x4 pin male headers into the
marked positions along the edge of the
board.
Este modulo posee salidas de 3.3V y 5V, posee un regulador para cada voltaje, Estos voltajes
se seleccionan con jumpers.
La entrada de voltaje al módulo puede ser por el conector Jack o a través del conector USB
(no recomendable, la corriente se limita a la que puede entregar el puerto USB de la PC). Si
se usa el conector Jack, el conector USB se puede utilizar como salida de 5V.
ESPECIFICACIONES TÉCNICAS
1
APÉNDICE J
Datasheet de consumo de poder del ESP32
3 Functional Description
– Ping
– Advertising
– Scanning
– Multiple connections
– LE Ping
• Power modes
– Active mode: The chip radio is powered on. The chip can receive, transmit, or listen.
– Modemsleep mode: The CPU is operational and the clock is configurable. The Wi-Fi/Bluetooth
baseband and radio are disabled.
– Lightsleep mode: The CPU is paused. The RTC memory and RTC peripherals, as well as the ULP
coprocessor are running. Any wake-up events (MAC, host, RTC timer, or external interrupts) will wake
up the chip.
– Deepsleep mode: Only the RTC memory and RTC peripherals are powered on. Wi-Fi and Bluetooth
connection data are stored in the RTC memory. The ULP coprocessor is functional.
– Hibernation mode: The internal 8 MHz oscillator and ULP coprocessor are disabled. The RTC
recovery memory is powered down. Only one RTC timer on the slow clock and certain RTC GPIOs are
active. The RTC timer or the RTC GPIOs can wake up the chip from the Hibernation mode.
Note:
• * Among the ESP32 series of SoCs, ESP32-D0WD-V3, ESP32-U4WDH, ESP32-D0WD (NRND), ESP32-D0WDQ6
(NRND), and ESP32-D0WDQ6-V3 (NRND) have a maximum CPU frequency of 240 MHz, ESP32-S0WD has a
maximum CPU frequency of 160 MHz.
• When Wi-Fi is enabled, the chip switches between Active and Modem-sleep modes. Therefore, power consumption
changes accordingly.
• In Modem-sleep mode, the CPU frequency changes automatically. The frequency depends on the CPU load and
the peripherals used.
• During Deep-sleep, when the ULP coprocessor is powered on, peripherals such as GPIO and RTC I2C are able to
operate.
• When the system works in the ULP sensor-monitored pattern, the ULP coprocessor works with the ULP sensor
periodically and the ADC works with a duty cycle of 1%, so the power consumption is 100 µA.
1. JEDEC document JEP155 states that 500 V HBM allows safe manufacturing with a standard ESD control process.
2. JEDEC document JEP157 states that 250 V CDM allows safe manufacturing with a standard ESD control process.
6,80 cm
7,55 cm
0,30 cm
2,33 cm
R3
,49
cm
1,27 cm 1,35 cm
2,61 cm
8,34 cm
8,04 cm
6,05 cm
6,35 cm
R2,08 cm
0,50 cm
R0
, 60
cm
0,78 cm
8,48 cm
8,96 cm
10,16 cm
1,52 cm
R5,78 cm
10,29 cm
7,92 cm
8,04 cm
8,34 cm
9,94 cm
cm
0
,3
R5
11
,6 7
cm
11,75 cm
12,54 cm
0,79 cm
8,92 cm
3,28 cm 7,75 cm
0,90 cm
2,09 cm
10,29 cm
5,20 cm
6,20 cm
4,70 cm
6,53 cm
6,18 cm
R0, 5,57 cm
93
cm 3,17 cm