Saludos,
continuamos en este mes de septiembre que poco tiempo me ha
dejado para rolear y mucho para desarrollar e montar. En este publicación continuare
con el hilo “El
tentáculo que quería reptar”. Si como de un Chthonian
se tratase he hecho dos tentáculos que tenían
que participar en una performance, emulando a “creepy worm”, pero de la
performance ya hablare cuando tenga el vídeo de la misma.
Como ya más o menos explique el sistema iba a estar
controlado con dos motores, cada motor controla de forma inversa dos tendones,
cuando uno se estira el otro se encoje. A diferencia de sistemas determinista,
como un brazo realizado con servos, con los tentáculos no podemos determinar la
posición final pues el sistema tiene juego. Es decir, con la misma posición de
motores puede adoptar diferentes formas.
|
Mecanismo de los motores
|
|
|||
Detalle en los motores
sin moverse, diferentes posiciones que puede tomar el tentáculo.
|
Esto lo hace un sistema difícil de controlar y más de
simular, pero también resulta interesante, pues quizá no podemos predecir la posición
final que tomara, pero si determinar cómo quedara por los movimientos que haya
hecho. Ya sé que suena extraño, pero cuando lo controlas llega un momento que
eres capaz de llevarlo donde quieres. Ahora bien, lo difícil será hacer que un
algoritmo controle eso. Eso se verá en el futuro.
La placa de control que hemos empleado es “homemade”,
utilizamos el microcontrolador Teensy 3.2 y los drivers
L272M para controlar los motores. Los motores que he empleado son Micro
metal DC con reductora 298:1, son unos motores con muy bajo consuno y un
alto par, para el tamaño que tienen, eso sí son muy lentos. El primer test que
hice con el tentáculo fue con motores 75:1 y la velocidad de movimientos era
considerable.
Planca Teensy 3.2 con Bluetooth, I2c, Motor Driver y RGB control.
El bus “control switch” era para instalar unos finales de
carrera en el tentáculo para evitar que el motor se sobrecargue, que finalmente
no he instalado pues no hubieran resultado útiles, dado la manera de moverse
del tentáculo. Lo mejor sería un sensor
de corriente para controlar el
consumo de los motores y protegerlos de quemarse.
El i2c es para ponerle una IMU
en la cabeza del tentáculo que proporciona información sobre la orientación, aceleración
y brújula.
El “RGB” iba a emplear leds rgb, pero finalmente emplee tira
de leds rgb a 12v que teníamos disponible, El tentáculo se mueve sin problemas
con la tensión de alimentación que le proporciona el usb, pero para encender
los leds necesitábamos de una fuente externa.
|
Esquema
del circuito
|
Para controlar el sistema mediante bluetooth definimos la
trama de mensaje que íbamos a enviar:
Head
|
M
|
M1*
|
M2*
|
Time
|
Tail
|
Head y Tail
son elementos que empleo de control dándoles un valor conocido 0x01
M Indica que vamos a hablar de los motores 0x6D o 109 en decimal
M1, M2 Determina el estado de los motores que viene a ser:
0: parado
1:
sentido horario
2: sentido anti horario
*Nota: si
empleamos motores con una reducción menor podemos jugar con la velocidad de los
motores enviando la información en un byte.
0: parado
1-127: sentido horario
128-255: sentido anti horario
D à
determina la duración del movimiento:
0: 50ms, 1:100ms,
2:200ms, 3:300ms, 4:400ms, 5:500ms, 6:1s, 7:1.5s, 8:2s, 9:3s
El Color se
enviaba en una trama similar
Head
|
C
|
R(0..255)
|
G(0..255)
|
B(0..255)
|
Tail
|
Donde la única
diferencia es en la palabra de control, que en este caso es C ,0x43 o 67 en
decimal. Y el mensaje de los colores son tres bytes.
En definitiva,
la placa que habíamos montado simplemente está montada para controlar el tentáculo,
y recibir instrucciones del exterior. Finalmente, quien controlaría el tentáculo
sería un sistema que correría en un ordenador, o similar. Para la performance,
se optó por realizar un control en Python, un simple control remoto. También se
realizó una aplicación para Android con Mit App inventor 2.
Aplicación de
Python
para conectar serie o bluetooth desde Windows.
Para
procesar esta información desde el teensy o Arduino yo empleo este tipo de
programa
void loop() {
aux=0;
n_bytes=0;
while
(Serial1.available() > 0) {
input[aux]
= Serial1.read();
//Serial1.print(input[aux],
HEX);
aux++;
n_bytes
= aux;
}
if ((input[0] == 0x01)
&& (input[n_bytes - 1] == 0x01)) {//mensaje correcto
Serial1.println("ok");
switch(input[1]){
case
0x6D:
dirM1=int(input[2]);
dirM2=int(input[3]);
timeDelay=int(input[4]);
Motores(dirM1,dirM2,timeDelay);
break;
case
0x43:
Cred=int(input[2]);
Cgreen=int(input[3]);
Cblue=int(input[4]);
led(Cred,Cgreen,Cblue);
break;
}
Clean_input();
} else Serial1.flush();
}
Si empleáis
la placa Arduino y usáis la librería SoftwareSerial funciona igual.
Y ahora os
dejo uno vídeos de los tentáculos.
Jugando con la aplicación de Python
Previo a la performance, con sus primos Dynamixel, aquí controlados con el móvil.
Anakleto.
No hay comentarios:
Publicar un comentario