Actualización 6 Enero

Hola!

Al llegar navidades he tenido un poco más de tiempo para poder mejorar a a DIMER, las mejoras han sido principalmente dos; por una parte unos drivers mejores y por otra unos potenciometros para saber su posición y poder programarlo.

Drivers: 

En la maker faire de Bilbao otro maker me comentó que acababa de encontrar unos drivers para motores que aguantaban mucha potencia y se podían controlar desde el Arduino directamente.

Resulta que eran los IBT-2, estos drivers los puedes encontrar en muchas webs y los puedes conseguir por 9 $ aproximadamente.

Según la ficha técnica aguantan hasta 30 amperios y 27 voltios, haciendo también el cambio de sentido de giro del motor, todo ello directamente desde PWM. 20160106_011612_Richtone(HDR).jpg

Así que los compré y busqué algún código para poder moverlos. resulta que es muy fácil ya que simplemente le envías valores de 0 a 255 por un canal de PWM mientras el otro lo pones a 0. Así que rapidamente sustituí los drivers antiguos, que eran mucho peores, además así me ahorro lo de los servos moviendo el potenciometro del driver más las placas de relés para el cambio de sentido. De modo que ahora la base está más despejada.

20151115_235210.jpg(antes y después del cambio de drivers)20160106_011624.jpg

Potenciometros:

Obviamente necesito que DIMER se pueda programar, para que haga tareas repetitivas o ciertas acciones, así que necesitaba saber su posición en todo momento. Para ello coloqué unos potenciometros en los ángulos de hombro y codo, utilizo potenciometros porque son muy sencillos de utilizar y además ninguno de mis ángulos es mayor de 180 grados.

Así que coloqué los dos que necesitaba, el del codo está mucho mas accesible que el del hombro, ya que se puede amarrar directamente al eje como se ve en la imagen.

20160106_011643.jpg

El del hombro fue un poco más complicado, al final tuve que ceder y ponerle una lámina de aluminio y cola caliente para fijarlo al eje, esto es porque no tenia ninguna pieza a mano para engancharlo, pero en cuanto pueda le haré una pieza en 3d para que quede seguro.

20160106_011635.jpg

Aquí os dejo el primer vídeo que hice comprobando como se mueve hasta la posiciono que le indico.

El código es muy sencillo, le indicas los ángulos y que articulación quieres mover, con un par de bucles sencillos DIMER sabe cuanto tiene que moverse y en que dirección.

Aquí os lo dejo, seguramente se os ocurra otra manera de hacerlo de manera más eficiente, pero de momento funciona y la parte de depuración de código ya la haré al acabarlo del todo.

Con esto queda actualizada el desarrollo de DIMER.

Un saludo!

// Solamente esta subido la  parte correspondiente del Void loop, el setup es simplemente declarar las variables y arrancar el Serial a 9600.

//lectura posicion codo
posicion2 = map(analogRead(A4), 0, 1023, 180, 0);
posicion3 = map(analogRead(A7), 0, 1023, 0, 180);
Serial.print(” H “);
Serial.print(posicion3, DEC);
Serial.print(” C “);
Serial.println(posicion2, DEC);

//programacion movimientos:
if(Serial.available() >= 1)
{
/*
1- Leer un numero entero por serial
2- Calculamos su modulo por 10 (sera el numero del motor)
3- Dividir el entero inicial por 10
4- Lo que quede, sera la posicion del motor
*/
enviado = Serial.parseInt();
num = enviado%10;
enviado = enviado/10;
posicion = enviado;

//aqui bajamos el codo hasta que llega al angulo correcto

if(num == 1) //quiere decir que queremos mover el codo
{
if(posicion>posicion2){
do{
analogWrite(LPWM_Output, 0);
analogWrite(RPWM_Output, 50);
posicion2 = map(analogRead(A4), 0, 1023, 180, 0);
Serial.print(“bajando hombro “);
Serial.println(posicion2, DEC);
}
while(posicion2 < posicion);
}

//aqui subimos el codo hasta que llega al angulo correcto
if(posicion<posicion2){
do{
analogWrite(LPWM_Output, 50);
analogWrite(RPWM_Output, 0);
posicion2 = map(analogRead(A4), 0, 1023, 180, 0);
Serial.print(“subiendo codo “);
Serial.println(posicion2, DEC);
}
while(posicion2 > posicion);
}

//aqui paramos los motores al llegar al angulo correcto
analogWrite(LPWM_Output, 0);
analogWrite(RPWM_Output, 0);
}

if(num == 2)//quiere decir que qeuremos mover el hombro
{

//aqui bajamos el hombro hasta que llega al angulo correcto
if(posicion>posicion3){
do{
analogWrite(LPWM_Output2, 0);
analogWrite(RPWM_Output2, 50);
posicion3 = map(analogRead(A7), 0, 1023, 180, 0);
Serial.print(“bajando hombro “);
Serial.println(posicion3, DEC);
}
while(posicion3-5 < posicion);
}

//aqui subimos el hombro hasta que llega al angulo correcto
if(posicion<posicion3){
do{
analogWrite(LPWM_Output2, 50);
analogWrite(RPWM_Output2, 0);
posicion3 = map(analogRead(A7), 0, 1023, 180, 0);
Serial.print(“subiendo hombro “);
Serial.println(posicion3, DEC);
}
while(posicion3-5 > posicion);
}
//aqui paramos los motores al llegar al angulo correcto
analogWrite(LPWM_Output2, 0);
analogWrite(RPWM_Output2, 0);
}

//aqui paramos en caso de emergencia
if(num == 3) // parar todo
{
analogWrite(LPWM_Output, 0);
analogWrite(RPWM_Output, 0);
analogWrite(LPWM_Output2, 0);
analogWrite(RPWM_Output2, 0);
}

}