¿Cómo es eso de mantener el equilibrio con una barra y un potenciómetro?, cuenta, cuenta...
Lo que has resuelto patolinec es lo que se conoce como péndulo invertido y habras utilizado el principio de las calculadores analógicas (solo se utilizan operacionales). De todas formas enhorabuena por el proyecto, ya que es algo que no está al alcance de cualquiera. Por cierto podrias poner un video donde lo veamos funcionando.
Un saludo
.... Por cierto, ahora que lo pienso, jeje, un "tentempié" es lo que me voy a meter entre pecho y espalda en unos minutos, jaja. Supongo que querías decir un "tententieso".
'***************************************************************
' Microcontrolador PIC18F452
' Reloj a 40Mhz en modo HSPLL
' (la función WordToStrWithZeros solo funciona con 18Fxxx)
'***************************************************************
program prueba_lcd
dim j as word
dim i as word
dim pw as word
dim txt as string[6]
main:
delay_ms(100)
Lcd_Config(PORTC,1,0,2,7,6,5,4)
Lcd_cmd(LCD_CURSOR_OFF)
Lcd_cmd(LCD_CLEAR)
j=0
i=0
ADCON1 = 7
PORTA = 0
TRISA = %11111110
PORTB = 0
TRISB = %11111111
bucle:
asm
movlw $00
movwf T1CON
clrf TMR1H
clrf TMR1L
bucle1:
btfsc PORTB,7
goto bucle1
bucle2:
btfss PORTB,7
goto bucle2
movlw $21
movwf T1CON
bucle3:
btfsc PORTB,7
goto bucle3
movlw $00
movwf T1CON
end asm
pw = (TMR1L + (TMR1H * 256))/4
WordToStrWithZeros(i,txt)
Lcd_out(1,1,txt)
WordToStrWithZeros(j,txt)
Lcd_out(1,6,txt)
WordToStrWithZeros(pw,txt)
Lcd_out(2,1,txt)
j=j+1
if j = 0 then
i = i + 1
end if
delay_ms(100)
goto bucle
end.
while(true)
{
output_high(PIN_A0);
delay_us(150);
output_low(PIN_A0);
delay_us(19850);
}
No es que me sienta muy orgulloso de esta soldadura, de hecho la hice hace un par de años, cuando empezaba con esto, y guardé el acelerómetro en el cajón porque no sabía sacarle partido.
En fin, de cobardes es esconderse, ahí va la foto.
(http://img122.imageshack.us/img122/8974/acelerometrovu4.th.jpg) (http://img122.imageshack.us/my.php?image=acelerometrovu4.jpg)
Si te funciona como está, no lo toques ...
compraos el flux... yo tengo aqui un bote en pasata del año de la polca y de la marca carrefour (me venia en un pack) y que aun uso pq es interminable. Y sobre todo para desoldar viene uncreible... el estaño se caliente homogeneamente al instante al igual que los pads y por lo general ayuda a que el estaño no salte de pista y las comunique. No dudadlo.
Ahora y aunque sea algo off topic quiero pedir por favor que alguien me hable del cable wrapping o como se diga... lo vi en unas pistas de una placa de dogflu que trajo a la concentración y que lo ponia en sustitución de las pistas que se habia comido el atacado. Preguntas... suelda eso bien? viene preestañado? tiene aislante? Tenia la sensación de que estaba pegado a la placa... tiene algun tipo de adhesivo o fue mi impresión
1 saludo.
1 saludo.
Otro balancín bastante bien documentado http://coecsl.ece.uiuc.edu/ge423/spring04/group9/index.htmQué movimiento más suave
(http://coecsl.ece.uiuc.edu/ge423/spring04/group9/images/seg.gif)
De hecho hay amigos foreros que eran pesimistas al usarlo, pero
una vez que lo probaron ya no pueden vivir sin el.. :D
Esa no es la técnica de Wire Wrap. La técnica original consiste en enrollar el cable alrededor de las patillas de los componentes, no soldarlos en el circuito impreso. Para ello se emplea esta herramienta:
(http://img179.imageshack.us/img179/3204/180pxwu6.jpg) (http://imageshack.us)
Herramienta que permite: pelar, enrollar y desenrollar el cable.
Estos son los zócalos empleados:
(http://img151.imageshack.us/img151/7517/zrw08fq1.th.jpg) (http://img151.imageshack.us/my.php?image=zrw08fq1.jpg)
Saludos
Muy chulo, PICpegaso. Con las ganas que tengo de terminar el mío; me has puesto los dientes largos.Por aqui a la orden en la medida de mis posibilidades te ayudaré en lo que más pueda amigo Nocturno.
Dudo que seas capaz de ayudarme. Necesitaría que estirases mis días para que tuvieran más de 30 horas. De todas formas, gracias por el ofrecimiento.
Dudo que seas capaz de ayudarme. Necesitaría que estirases mis días para que tuvieran más de 30 horas. De todas formas, gracias por el ofrecimiento.O.k. en ese caso no me queda mas que darte apoyo y servirte de respaldo en lo que requieras, no creo aguantar con un ritmo de 30 Horas!
Hola:Gracias!,
Es un muy buen trabajo, felicidades.
Es muy ilustrativo ese vídeo. A mí me ha enseñado lo siguiente:
- con los acelerómetros se pueden medir movimientos de traslación, que impliquen un desplazamiento
- con los giroscopios se pueden medir movimientos de rotación, que impliquen cambios de ángulo
Con la combinación de ambos, se obtienen 6 grados de libertad.
Hola amigos!!,
por lo que veo ha estado un poco dormido este hilo desde hace unos dias asi que para moverlo un poco traigo algo mas de informacion acerca de la construcción de este robot tan Bacano (lease en terminos generales y no haciendo enfasis en el que he hecho). Una ves más se reciben comentarios o sugerencias, muchas gracias a todos por el interés,
SALUDOS!!!
INFORME (http://www.4shared.com/file/26765166/6b6fed9c/Construccion_robot_equilibristarobot_balancinbalance_robot.html)
Perdonad pero no he podido resistirme a poner el enlace que he encontrado mientras buscaba información del idg-300. Es una aplicación más del giróscopo. Una flipada. http://user.cs.tu-berlin.de/~calle/ufo/index.html :shock:
Impresionante. Coincido con Nocturno, ¿que quieres mejorar? está de lujo.
Joe, macho, pues no sé qué quieres mejorar. Se ve de puta madre.
Por cierto, ¿el control remoto que utilizas es un móvil?, ¿cómo se hace eso?
[...]Estoy usando timers, interrupciones varias, conversores A/D, un bus i2c, un bus spi, un bus usb, un bus rs232, una conexión bluetooth con protocolo serie, una aplicación java para móvil y otra sencilla para el pc, y todo lo relacionado con los cálculos que hay que hacer para mantener el equilibrio, en definitiva, mas completo no se puede pedir :mrgreen:[...]
La verdad es que este proyecto me está permitiendo aprender muchos aspectos del microcontrolador pic (es mi primer proyecto con un pic y mi primer robot). Estoy usando timers, interrupciones varias, conversores A/D, un bus i2c, un bus spi, un bus usb, un bus rs232, una conexión bluetooth con protocolo serie, una aplicación java para móvil y otra sencilla para el pc, y todo lo relacionado con los cálculos que hay que hacer para mantener el equilibrio, en definitiva, mas completo no se puede pedir :mrgreen:
// Variables globales
float P[2][2] = { { 1, 0 }, { 0, 1 }, };
float R_angle = 0.3;
float Q_angle = 0.001;
float Q_gyro = 0.003;
float q_bias, angulo, gyro, tiempo;
void state_update( void )
{
float Pdot[4];
Pdot[0]= Q_angle - P[0][1] - P[1][0];
Pdot[1]= -P[1][1];
Pdot[2]= -P[1][1];
Pdot[3]= Q_gyro;
gyro -= q_bias;
angulo += gyro * tiempo;
P[0][0] += Pdot[0] * tiempo;
P[0][1] += Pdot[1] * tiempo;
P[1][0] += Pdot[2] * tiempo;
P[1][1] += Pdot[3] * tiempo;
}
void kalman_update( float angle_m )
{
float K_0;
float K_1;
K_0 = P[0][0] / (R_angle + P[0][0]);
K_1 = P[1][0] / (R_angle + P[0][0]);
P[0][0] -= K_0 * P[0][0];
P[0][1] -= K_0 * P[0][1];
P[1][0] -= K_1 * P[0][0];
P[1][1] -= K_1 * P[0][1];
angulo += K_0 * (angle_m - angulo);
q_bias += K_1 * (angle_m - angulo);
}
Saludos! Creo que no se ha hablado a lo largo del tema, he visto tambien este tipo de robots con un sensor de infrarrojos sharp GP2D12, que permite medir distancias.
En esta pagina puede verse hecho con un Lego,creo, hecho:
Robot equilibrio Lego (http://sites.google.com/site/enjutorobojuto/Practica3)
Hay mas robots de este tipo hechos con un infrarrojo, pero ahora solo encuentro que permanezcan en equilibrio ¿es posible que un robot de este tipo ande manteniendo el equilibrio? Es que ya no sé si he visto alguno que se pudiera dirigir, o la mente me juega una mala pasada
De todas formas mi interes por este tipo de robots es que si permite controlar el desplazamiento, que no sé si puede...
Claro que puedes controlar su desplazamiento. ¿Has visto este video una página mas atrás? (http://www.todopic.com.ar/foros/index.php?topic=12748.msg202617#msg202617)
Un saludo...
Hola,
Gracias por los comentarios.
Si están interesados en los detalles, en esta web (http://sites.google.com/site/txemafraga/patin-sobre-dos-ruedas) voy poniendo los progresos del proyecto. De todos modos, cualquier detalle que interese lo podemos discutir aquí sin problema.
NANO1985, me alegro que te animes a realizar el proyecto. Motores los puedes encontrar en diferentes lugares, ebay y webs que se dedican a bicis eléctricas, scooters y demas. Como ejemplo te pongo una
http://tncscooters.com/view.php?page=Parts
Un saludo...
Hola,
Perdón, no me dí cuenta.
El tema te lo comenta muy bien gera. El problema es que por si solos ninguno de los dos te dan el ángulo de inclinación correctamente.
El acelerómetro si te da el ángulo directamente pero como te comenta gera es muy propenso al riudo y en condiciones de aceleración y vibración su medida no es correcta.
El giroscopio no te dice el ángulo directamente, solo te dice la velocidad a la que te estás inclinando (velocidad angular) en grados por segundo. Se trata calcular el ángulo con el giroscopio de la siguiente forma:
espacio recorrido = posición anterior + (velocidad * tiempo)
como en nuestro caso el espacio son grados de inclinación sería:
angulo = angulo anterior + (velocidad angular * tiempo)
Esto puesto en el loop del microcontrolador podría ser:
angulo = angulo + (velocidad angular * tiempo de loop)
Evidentemente si solo usaras este método tendrías dos problemas, que no puedes saber en que ángulo te encuentras en el primer ciclo y que a partir de ahí vas a ir acumulando una deriva que puede terminar siendo demasiado grande. Para evitar estos dos problemas tienes el acelerómetro, te da punto de partida y "refresco" del ángulo calculado por el giroscopio.
Un saludo...
Para evitar estos dos problemas tienes el acelerómetro, te da punto de partida y "refresco" del ángulo calculado por el giroscopio.
Hola
NANO1985, el problema de esos gyros es la falta de datos. Me explico, necesitas saber que grados/segundo puede medir como máximo para poder "escalar" el valor que obtienes del ADC, hazte esta pregunta ¿como obtengo grados/segundo de ese giroscopio?
jfmateos2,
Hay diferentes maneras de actuar, una sería dar por sentado que el valor del acelerómetro va a ser siempre algo errático y utilizar solo una parte pequeña de su valor para conformar el ángulo y el resto hacerlo con el giroscopio. Algo así:
angulo = (angulo calculado por giroscopio * 0.95) + (angulo acelerómetro * 0.05)
De esta forma el valor de "angulo" en cada ciclo es un 95% el valor del giroscopio y en un 5% el del acelerómetro. Digamos que angulo se va "refrescando" en cada ciclo del programa. Quizás no es la mejor manera pero funciona.
Existen otras maneras, por ejemplo si tienes encoders en las ruedas puedes saber cuando las aceleraciones son relativamente pequeñas y solo en esos casos "refrescar" angulo, en cambio cuando la aceleración sea mayor calcular el ángulo solo con el giroscopio.
Otra manera de detectar aceleraciones y vibraciones, quizás la mejor, es usando un acelerómetro de dos ejes dispuestos uno hacia el frente y otro hacia el cielo. De esta manera hay que usar trigonometría para calcular el ángulo de inclinación con la lectura de los dos ejes (arco tangente) y se también puede calcular la magnitud del movimiento, de manera que si no se encuentra dentro de unos parámetros que nosotros establecemos no utilizaremos el angulo que hayamos calculado con el acelerómetro.
Si te interesa, esta última parte la podemos ver con mas detalle pero ten en cuenta que mis explicaciones no van a ser las de una persona con grandes conocimientos en matemáticas, lamentablemente no tengo los conocimientos necesarios para ser todo lo correcto que debería (Dejé de estudiar demasiado pronto) Me baso en lo que he leído aquí y allá y en lo que mi cabeza ha entendido o cree que ha entendido.
Un saludo...
¿Es el mismo que este?
http://superrobotica.com/S330100.htm
éste motor que muestran quiero creer que es el del robot pequeño verdad?? (el bot que ven andando por un parque en la web de Safareig)
éste motor que muestran quiero creer que es el del robot pequeño verdad?? (el bot que ven andando por un parque en la web de Safareig)
Si claro, ese motor es el del robot pequeño.
Un saludo...
Otro Segway bastante bien documentado: http://diysegway.blogspot.com/
¿Habéis visto la ristra de números que hay en el cálculo del ángulo? :shock:
// Constantes
#define R_angle = 0.3;
#define Q_angle = 0.001;
#define Q_gyro = 0.003;
#define tiempo = 0.01;
// Variables globales
float P[2][2] = { { 1, 0 }, { 0, 1 }, };
float q_bias, angulo, gyro;
void state_update( void )
{
float Pdot[4];
Pdot[0]= Q_angle - P[0][1] - P[1][0];
Pdot[1]= -P[1][1];
Pdot[2]= -P[1][1];
Pdot[3]= Q_gyro;
gyro -= q_bias;
angulo += gyro * tiempo;
P[0][0] += Pdot[0] * tiempo;
P[0][1] += Pdot[1] * tiempo;
P[1][0] += Pdot[2] * tiempo;
P[1][1] += Pdot[3] * tiempo;
}
void kalman_update( float angle_m )
{
float K_0;
float K_1;
K_0 = P[0][0] / (R_angle + P[0][0]);
K_1 = P[1][0] / (R_angle + P[0][0]);
P[0][0] -= K_0 * P[0][0];
P[0][1] -= K_0 * P[0][1];
P[1][0] -= K_1 * P[0][0];
P[1][1] -= K_1 * P[0][1];
angulo += K_0 * (angle_m - angulo);
q_bias += K_1 * (angle_m - angulo);
}
Hola Gera, me contestaron de Control Comp (Córdoba). Tienen giros Sparfun de 1 eje 75-150-300 gr/seg. Los precios son cercanos a los que manejan en europa.
Saludos
Hola Gera, me contestaron de Control Comp (Córdoba). Tienen giros Sparfun de 1 eje 75-150-300 gr/seg. Los precios son cercanos a los que manejan en europa.
Saludos
Uuu... que mala suerte gera :( Fue mucho gasto para que termine así, los muchachos de sparkfun deberian hacerse cargo de los $ del envío :?
Hola Gera!
Compraste el giroscopio?
Saludos.
alguien pudo comprar el giro??.... yo quiero hacer éste proyecto, primero en pequeña escala.... y si todo marcha bien construirme mi primer segway.....
pero bue.... acelerometros MMA7260QT tengo de sobras.... pero giros nooo :D...
cualquier novedad m chiflan.
Saludos 8)
Muchas gracias!! Les cuento q ya lo estoy manejando por control remoto jeje (bluetooth). Pero todavia no hace equilibrio jeje.
Con q me recomiendan q proteja las placas? Tengo un aerosol q es como una capa de esmalte, supongo q con eso va a andar bien.
saludos!!
yo creo que con flux es mas que suficiente gera.... lo dejas secar bien y queda d lujo...
un abrazo y sigo éste hilo de cerca.
saludos
Gera que modulo bluetooth usaste? A donde lo conseguiste?
Muy bueno Gera y chelitog!!!
Saludos
P/D: Si te trae las pantuflas te encargo uno.. :mrgreen:
Voy a ponerme a investigar ya que conseguirse un giroscopo aca en argentina esta complicado, no?
con tiempo me voy a leer el hilo completo, pero alguien sabe si se puede utilizar algun otro sistema de equilibrio que no sea con giroscopo o acelerómetro?Aca hay uno q usa un sensor infrarrojo para medir la distancia al piso, y asi la inclinacion: http://homepage.mac.com/sigfpe/Robotics/equibot.html
Hola Gera,
Consulte a Electrocomponentes pero me dijeron que no venden giróscopios. No sabía que trabajaban con Sparkfun.
La gente de Córdoba que es representante Sparkfun es Control Comp, http://www.controlcomp.com/
Los llamé por teléfono y me dijeron que tienen algunos componentes, y que traen por pedidos. Quedaron en mandarme un correo hace una semana, pero todavía no lo recibí. En estos días llamaré de nuevo.
El giro que rompí, es el MLX 90609, Conecte Vcc, GND y Rate. Alimente con 5v y las lecturas tienen una pequeña variación contínua aún estando en reposo. Apenas lo alimento, mido 2,2v en la salida rate, y muy lentamente se va incrementando de a 0,1v. Lo raro es que el valor debería ser de 2,5v estando en reposo y alimentando con 5v. Pienso que lo que puede meter ruido es que estoy alimentando con una fuente de PC que entrega 5,15v. Es lo único que por ahora encuentro.
Que defecto tiene tu giro?
Saludos.
Estoy subiendo un pequeño video a youtube, cuando termine lo posteo :wink:
señor GERA, le muestro algunos resultados obtenidos en una prueba,
la respuesta mejoro al anadir pesos en la parte superior. sin embargo no se ha logrado obtener el resultado esperado.
no se si exista una limitacion causada por la holgura de la caja reductora de los motores, y por el tiempo en alcanzar la velocidad final de los mismos, pero espero que alguien me pueda dar una indicacion de como mejorar los resultados.
Muchas gracias por los animos! Ya estoy averiguando para comprarme otro modulo. El bajon es q cuesta mucho traer de estas cosas al pais. Por ahora pienso comprarlo a sparkfun y q me lo envien. Si alguien conoce una alternativa mejor, soy todo oidos.Has contactado a la gente de YEL? son representantes de RS en Argentina.
Saludos!
Has contactado a la gente de YEL? son representantes de RS en Argentina.
YEL S.R.L., Virrey Cevallos 143, C1077AAC Buenos Aires, Argentina
Email, yel@yel.com.ar
Yo le he comprado algunas cosilla y responden bien, ;-)
No se bien que modulo es el que usas, aqui tienes unos
http://es.rs-online.com/web/search/searchBrowseAction.html?method=getProduct&R=0384428
http://es.rs-online.com/web/search/searchBrowseAction.html?method=getProduct&R=0133844
muuuuuy buenaaaaa!!!!!! aplausos!!!! bien!! gera!!!! me estas tentando hermano!! me estas tentandoooooCopate Nano!! Estan muy piola los robotitos estos jeje.
Read_ADC();
medida_0 = (float)(medida_giroscopo *3.3)/4096;
medida_0 = (float)(medida_0 - 1.343042)/0.00067;
//medida_1 = (medida_x - VOFF_X)/S;
medida_2 = (float)(medida_y - VOFF_Y)/S;
medida_3 = (float)(medida_z - VOFF_Z)/S;
// Angulo Calculado con Acelerometro
angle_m = atan2(-medida_2, medida_3); //angulo en radianes entre ejeZ y ejeY
angle_m = angle_m - (3.14159/2.0); //correccion para establecer el centro absoluto
angle_m = (angle_m *180)/3.14159; //en grados
gyro = medida_0; //grados por segundo, lectura del gyroscopio
void state_update() //Prediccion
{
float Pdot[4];
/*
* The predict function. Updates 2 variables:
* our model-state x and the 2x2 matrix P
*
* x = [ angle, bias ]'
*
* = F x + B u
*
* = [ 1 -dt, 0 1 ] [ angle, bias ] + [ dt, 0 ] [ dotAngle 0 ]
*
* => angle = angle + dt (dotAngle - bias)
* bias = bias
*
*
* P = F P transpose(F) + Q
*
* = [ 1 -dt, 0 1 ] * P * [ 1 0, -dt 1 ] + Q
*
* P(0,0) = P(0,0) - dt * ( P(1,0) + P(0,1) ) + dt² * P(1,1) + Q(0,0)
* P(0,1) = P(0,1) - dt * P(1,1) + Q(0,1)
* P(1,0) = P(1,0) - dt * P(1,1) + Q(1,0)
* P(1,1) = P(1,1) + Q(1,1)
*/
Pdot[0] = - P[0][1] - P[1][0];
Pdot[1] = -P[1][1];
//Pdot[2] = -P[1][1];
//Pdot[3] = Q_gyro;
gyro -= q_bias;
gyrograd = gyro;
angulo += gyro * dt ;
P[0][0] += (Pdot[0] * dt) + (P[1][1]*dt*dt) + Q_angle;
P[0][1] += Pdot[1] * dt;
P[1][0] += Pdot[1] * dt;
P[1][1] += Q_gyro;
}
void kalman_update( float angle_m )
{
float K_0=0;
float K_1=0;
/*
* The update function updates our model using
* the information from a 2nd measurement.
* Input angle_m is the angle measured by the accelerometer.
*
* y = z - H x
*
* S = H P transpose(H) + R
* = [ 1 0 ] P [ 1, 0 ] + R
* = P(0,0) + R
*
* K = P transpose(H) S^-1
* = [ P(0,0), P(1,0) ] / S
*
* x = x + K y
*
* P = (I - K H) P
*
* = ( [ 1 0, [ K(0),
* 0 1 ] - K(1) ] * [ 1 0 ] ) P
*
* = [ P(0,0)-P(0,0)*K(0) P(0,1)-P(0,1)*K(0),
* P(1,0)-P(0,0)*K(1) P(1,1)-P(0,1)*K(1) ]
*/
K_0 = P[0][0] / (R_angle + P[0][0]);
K_1 = P[1][0] / (R_angle + P[0][0]);
P[0][0] -= K_0 * P[0][0];
P[0][1] -= K_0 * P[0][1];
P[1][0] -= K_1 * P[0][0];
P[1][1] -= K_1 * P[0][1];
angulo += K_0 * (angle_m - angulo);
q_bias += K_1 * (angle_m - angulo);
}
//float P[2][2] = { { 1, 0 }, { 0, 1 }, }; // se puede iniciar con matriz identica y luego tendra convergencia
//float P[2][2] = { { -0.0005, 0.0015 }, { -1.7829, -1.8521 }, } //estos valores se obtuvieron luego de tener convergencia;
float P[2][2] = { { 0.017326, -0.029120 }, { -0.031015, 1.784845 }, };
float R_angle = 0.6; //valores iniciales filtro de kalman
float Q_angle = 0.001; //R_a=0.3;
float Q_gyro = 0.003; //Q_a=0.001;
float q_bias=0.0; //Q_g=0.003
yo creo que para obtener el resultado final voy a tener que implementar un PID de velocidad para cada motor para igualar sus respuestas y luego un PID de posicion o equilibrio que controle los anteriores PIDs
Se ven muy padres los motores!El motor chiquito es este (http://www.sparkfun.com/commerce/product_info.php?products_id=8910). Es de unas 120rpm
De cuantas rpm son los mas pequeños???
y de curiosidad, donde te pediste esos motores?
No conocias estos http://www.ignis.com.ar/PDF/mr6.pdf
Claro eso es lo que comentaba un poco mas arriba, que al tener unos motores lentos, la capacidad de equilibrarse es menor, si la perturvación es excesiva, la reaccion de los motores no es suficiente.
El peso de toda la estructura no creo que valla a ser mucho, entonces los motores trabajaran casi en vacio, ademas de que casi no soportarian carga al tener la mayor parte el peso en la parte superior del robot.
En ese caso, con que puente H vas a manejar esos motores, veo que tienen una Inom de 3Amp?
Saludos y espero que sigas adelante con este proyecto, yo todavia no me animo a comprar el giroscopo, estuve viendo algunos pero no los he estudiado como para saber cual es mejor.
Hola a todos, yo estoy empezando con un robotito de este estilo, tengo unas dudas tecnicas, espero me puedan ayudar.
Quisiera saber cual es la diferencia entre un acelerometro y un giroscopio, porque se necesitan ambos?. tengo entendido que el giroscopio mide un angulo de giro, si este fuera el caso, el giro tambien se podria medir con un acelerometro, siendo mas especifico utilizando este:
http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=MMA8450Q&webpageId=1084288158625737424209&nodeId=01126911184209&fromPage=tax
en las hojas de aplicaciones viene que se pueden medir varias cosas dependiedno de la configuracion del acelerometro. entonces en lugar de uzar un giroscopio se podria usar uno de estos??
Buenasssss!!! Paso a mostrar mis avances jeje.
(http://img338.imageshack.us/img338/2082/pc214750.th.jpg) (http://img338.imageshack.us/i/pc214750.jpg/) (http://img233.imageshack.us/img233/2545/pc214751.th.jpg) (http://img233.imageshack.us/i/pc214751.jpg/) (http://img24.imageshack.us/img24/8551/pc214752.th.jpg) (http://img24.imageshack.us/i/pc214752.jpg/)
Al final termine usando el mbed en lugar de un pic, hice en una semana lo q me demoro 2 meses con un pic jeje. Las plaquitas de la base son los puente H q diseñe hace poco porque el l298 no se bancaba la corriente q consumen esos motores.
Bueno, mas adelante doy mas detalles.. todavia esta en fase de prueba la cosa jeje.
Saludos!!
Que lastima lo del mbed gera :(
Tengo una pregunta, como pensas aislar la parte de potencia de la de control? con optoacopladores?
Saludos
Excelente dato Suky! Muchas Gracias!! Ya hice el pedido de muestras a TI, ahora a esperar a que lleguen para probarlos! =D
Saludos!
hola gera te hago una consulta... lograste algo con los motores a esa potencia? que relacion tienen los engranages?
Código del PICCódigo: C
#define __PCH__ 1 #define N_SAMPLES 64 #define PRELOAD_TMR1 65043 //10 KHz prescaler=1 ... ... ... void get_samples() { int i; accel_x=0; gyro_rate=0; for(i=0;i<N_SAMPLES;i++) { set_adc_channel(0); delay_us(20); accel_x += read_adc(); set_adc_channel(2); delay_us(20); gyro_rate += read_adc(); } accel_x /= N_SAMPLES; gyro_rate /= N_SAMPLES; }
El mio esta en el cajon jaja. La facu no me da un respiro para dedicarle tiempo.si, se lo que es eso :2]
Hola Gera, acabo de revisar tu codigo y no le encuentro ningun error, deberia de funcionar. me da la impresion de que tu error no esta ahi.
--tu tiempo de muestreo si esta a 20ms?
--como estas viendo la respuesta de tu filtro, talvez al enviarlo a la PC tu muestreo es mas lento.
--como es la medida de tu angulo con tus 2 sensores por separado?.
una pequeña desviación de la vertical implica un mayor momento a contrarrestar,
Externamente, viendo los dos modelos, el de gera parece ser el más difícil de controlar. Me baso en la forma física del robot, una pequeña desviación de la vertical implica un mayor momento a contrarrestar, entonces el controlador tiene que ser mucho más rápido y preciso. Gera, has ido variado el periodo de muestreo y control?Hola suky!!
Saludos!
lindo el bichito,
tal vez seria buena idea poner las baterias más abajo y disminuir así el momento
Externamente, viendo los dos modelos, el de gera parece ser el más difícil de controlar. Me baso en la forma física del robot, una pequeña desviación de la vertical implica un mayor momento a contrarrestar
Gracias! Probe colocando las baterias en la base del robot, pero es mucho mas estable con las baterias arriba. Aunque creo que un peso distribuido mejoraria la estabilidad. Voy a probar distintas distribuciones del peso a ver cual es mejor.
Gera, mira este equilibrista, se parece mucho al tuyo y funciona estupendamente:
http://www.logos-electro.com/blog/2011/9/25/zigroller-project-hardware.html
Aquí el vídeo:
http://www.logos-electro.com/blog/tag/zigroller
Hola Gera!Hola AKENAFAB!! Yo tengo dos pares de estos motores, un par de 430rpm con reduccion de 30:1 y otro par de 120rpm con reduccion de 100:1. Son de muy buena calidad, la verdad que sorprende para el tamaño que tienen. Los use en la version pequeña del gerwey y en un robot seguidor de linea y andan de lujo!
Estoy armando una plataforma pequeña y me han gustado los motorreductores que usaste.
¿Te han salido buenos?
¿Tienen buena calidad?
Son los del GERWAY
Me interesan los de 250 rpm
Saludos!
Gera, si esta bien ubicado tu punto de equilibrio?Esta mas o menos en el cetro, pero de no ser asi creo que no importa, porq vario el setpoint del PID y listo, no? Al menos eso vengo haciendo jeje.
Esta mas o menos en el cetro, pero de no ser asi creo que no importa, porq vario el setpoint del PID y listo, no? Al menos eso vengo haciendo jeje.
Saludos!
CitarEsta mas o menos en el cetro, pero de no ser asi creo que no importa, porq vario el setpoint del PID y listo, no? Al menos eso vengo haciendo jeje.
Saludos!
Tendras bien hecho el ajuste del PID ??
como estas graficando vos?
Para calcular el tiempo de ciclo de programa, uso el timer0 y la función get_timer0.
Con respecto a cambiar el micro, uno de los motivos es tratar de reducir los tiempos y por otro lado, con el PIC16F876A no he conseguido leer los valores actuales de los encoders, tengo la placa MD25 comunicada vía I2C. Los ejemplos que se pueden conseguir están hechos con el PIC18F4550, por lo que vale la pena el intento.
Con ese timer0 solo podes medir 65.536 ms cierto? Utilizas la interrupcion para saber si te excediste de ese tiempo?
Con respecto a los encoders, cual es exactamente el problema? los probaste fuera de la placa con un osciloscopio para ver si funcionan?
angulo = (angulo+ang_giro)*0.9 + ang_acel *0.1;
Con el control proporcional solo podría lograr el equilibrio?
buenisimo, voy a hacer esa prueba con la zona muerta
Lo de la ganancia grande, supongo que con mi robot no funciona porque es pesado, y cuando comienza a balancearse es dificil frenarlo
Gracias por preguntar!
Mi robot esta en stand by por razones academicas. Estoy trabajando en mi tesis que es un proyecto similar: Un control electronico para un bipedestador movil motorizado, utilizando la misma IMU del robot ;) (es para una niña que tiene paralizadas sus extremidades, y sólo puede mover el torso, por lo tanto uso la IMU para sensar ese movimiento)
y me parece que gera hizo algo similar para confirmar la lectura
Otro problema es el periodo de muestreo. Hay dos tecnicas para esto:
1- Utilizar un periodo de muestreo constante con la ayuda de una interrupcion de timer.
2- Tomar muestras y realizar los calculos constantemente, y utilizar el timer para medir el tiempo que demora.
//---------------------------------constantes y variables para el filtro kalman---------------------------------------------
#define dt 0.05//[s]/constante del tiempo de muestreo
#define Qaccel 0.001
#define Qgyro 0.003
#define R 0.6
#define SoA 0.002//sensibilidad del giroscopio 2 mV/°/s
static float Vbias=0,angle=0,gyro=0,accel=0;//gyro-> lectura del giroscopio; accel->lectura del acelerometro
float PK[2][2]={{1,0},{0,1}};
//-----------------------------FILTRO KALMAN--------------------------
void kalman_update()//funcion de actualizacion del filtro kalman
{
float K[2];
float ang_err=0;//angulo de error
ang_err=accel-angle;
K[0]=PK[0][0]/(PK[0][0]+R);
K[1]=PK[1][0]/(PK[0][0]+R);
PK[0][0]-=PK[0][0]*K[0];
PK[0][1]-=PK[0][1]*K[0];
PK[1][0]-=PK[0][0]*K[1];
PK[1][1]-=PK[0][1]*K[1];
angle+=K[0]*ang_err;
Vbias+=K[1]*ang_err;
}
void kalman_prediction()//funcion de prediccion del filtro kalman
{
float Pdot[2];
Pdot[0]=-PK[0][1]-PK[1][0];
Pdot[1]=-PK[1][1];
gyro-=Vbias;
angle+=gyro*dt;
PK[0][0]+=Qaccel+Pdot[0]*dt+PK[1][1]*dt*dt;
PK[0][1]+=Pdot[1]*dt;
PK[1][0]+=Pdot[1]*dt;
PK[1][1]+=Qgyro;
//angle=accel;
}
//-------------------------------------------------------------------
Rivale, estuve probando el filtro que me pasaste. Me funcionó, pero las oscilaciones son mayores que el filtro complementario que estoy usando, en el que actualizo con el 97% de las medicines del giro y 3% del acelerómetro cada 5 mseg.:o a mi me dio muy buenos resultados el filtro, pero creo que probare con tu alternativa
No hice variación de Qaccel, Qgyro ni R. Hay algún método para hacer el ajuste fino?
Saludos a todos...
Quisiera que atudara con un proyecto que tengo actualmente en la escuela... lo que pasa es que tenemos que realizar un medidor de angulos y actualmente eestamos trabajando con un giroscopio IDG300, la verdad no tenemos amplios conocimientos al respecto de ello y unicamente sabemos que mide velocidad angular, hemos visto las señales que nos da con un osciloscopio, pero al momento de integrar la señal con un ampli-op nos da como resultado una señal minima con bastante ruido.. he querido meter esa señal al pic para verlos en una pantalla LCD pero los resultados que aparecen varian desde 0-255 con una frecuencia demasiado alta y no se mantiene estable en el angulo.. la verdad no se bien como tiene que ir conectado si alguien me pudiese orientar se los agradecería bastante, eh visto ya varios temas en internet pero no eh encontrado ningún esquema de como conectarlos.. :8}
Por cierto el pic es el 18F4580 y utilizo MPLAB
antes que nada, debes tomar en cuenta que la lectura del giroscopio es un voltaje proporcional a la velocidad angular, no es la velocidad directamente.
en cuanto a tu lectura desde el pic, dependiendo de tu modelo de micro, tu resolución puede ser de 8 o de 10 bits,(para el 4550 puedes configurarlo a 10 bits) y la frecuencia no se como la estés tomando, pero tu debes definir tu tiempo de muestreo y asi dar el tiempo de integración para calcular tu angulo.
Te recomiendo que subas tu código para poder ayudarte un poco mas
Y alguna otra en cuenta yo andare probando con retro linealizante y Takagi-sugeno, con un prototipo muy similar que construí estaré posteando los resultados para ver si podemos comparar resultados y obtener algo mejor entre los dos.
Saludos :-/
me agrada tu idea, el takagi-sugeno nunca lo había escuchadoEL controlador sugerido por Takagui-Sugeno es un controlador difuso para sistemas no lineales, el cual por medio del modelo no-lineal y las premisas ,linealiza el sistema esto permite implementar una ley de control según el punto donde este operando el sistema. Este y la retro linealizante son controladores no lineales. Pues haber que sale de todo esto. :-/
Hola,
En el código c de la implementación del filtro de kalman hay un error:
La corrección de la matriz de covarianza en la funcion kalman_update debe quedar así:
P[0][0] -= K_0 * P[0][0];
P[0][1] -= K_0 * P[0][1];
P[1][0] -= K_1 * P[1][0];
P[1][1] -= K_1 * P[1][1];
Un saludo.
Pero estoy en duda: no sé si implementarlo con un PIC, plataforma en la que ya tengo experiencia, o montar una Raspberry Pi y aprender desde cero con ella, ya que aún no me he introducido en ese mundo y me apetece un montón.
¿Qué opináis?
Arduino, es muy flojo para estas cosas, y su IDE una castaña.
Yo usaría Arduino. Te ayudo en todo lo que pueda. No es tan difícil.
Lo de los motores paso a paso no lo termino de ver. ¿Por qué no utilizas motores DC?Sí, podría usar los motores DC, ¿pero porqué no los PaP?, con la popularización de las impresoras 3D, están tirados de precio. Y en cuanto al funcionamiento, júzgalo tú mismo:
Este shield es ideal para quitar cables:
https://www.pololu.com/product/2511
Yo usaría un microcontrolador ARM. Tienes buenas opciones para elegir, STM32 de ST, Kinetis MK66 de NXP, Atmel SAM S70, o esperar un poco y para Marzo usar el nuevo NXP i.MX RT1020 un Cortex M7 a 500 Mhz en TQFP100 y 144 pines.Sería una buena oportunidad para hincarle el diente a un bicharraco de esos, aunque es mucha tela para un proyecto tan peque. Pero les echaré un vistazo
Si optas por STM32 o Kinetis, tienes entornos basados en Eclipse, con asistentes gráficos de configuración, Cubemx y MCUExpresso, también el RT1020 estará soportado por MCUExpresso.
Arduino, es muy flojo para estas cosas, y su IDE una castaña. Raspberry yo no lo usaría, salvo que quieras sacar video, que me parece que no es el caso para esta aplicación, y es muy pobre en puertos comparado con un microcontrolador.
Hay alguna discovery que no tenga soldados tantos pines por arriba y abajo?
¿Qué tiene en la espalda, son antenas?