ImagenImagenImagenImagen
Hazte Socio (El Foro siempre Gratis)
Paga con Tarjetas+ Info www.arde.cc/socios

Pinguino, servos y salidas digitales.

Postea aqui toda la parte de programación del lenguaje C, C++, C#...

Moderador: Junta Directiva

Responder
Bastian
Usuario Avanzado
Usuario Avanzado
Mensajes: 384
Registrado: Mié Feb 13, 2008 9:29 pm
Nombre: David Carmona
Ubicación: Utiel
Contactar:

Pinguino, servos y salidas digitales.

Mensaje por Bastian » Mar Feb 22, 2011 1:07 pm

Hola!

Estoy teniendo problemas con las salidas digitales cuando utilizo la libreria de servos. Lo achaco a esto, por que no encuentro otra explicación a lo que me pasa.
Vereis, tengo un robot impulsado por dos servos trucados, que controlo con las funciones que implementa pinguino (gracias sphinx). Por otro lado tengo dos bumpers que por motivos que no vienen al caso los conecto a 4 pines E/S del pinguino (pines 13 a 16). Los pines 14 y 15 los configuro como salida, escribo un HIGH y los conecto al común de los bumper... luego los contactos NA los conecto a los pines 13 y 16 configurados como entradas digitales... mi sorpresa es que cuando mido tension en los pines que he configurado como salidas tengo 0v.... he probado a escribir el uno en las salidas dentro del loop.... a configurar la E/S utilizando los registros en lugar de pinMode() y digitalWrite()... con el mismo resultado.... solo me falta hacer la prueba de los finales de carrera sin usar la libreria de servos para ver si es eso...

Os dejo el código a ver si alguien ve algo raro...

Código: Seleccionar todo

#define PIC18F2550

//Constantes para el control del servo derecho
    //Modificar este valor hasta parar el servo
#define        STOP_D        125        
#define        AVANCE_D        STOP_D-30
#define        ATRAS_D        STOP_D+30
#define         MOTOR_D        4

//Constantes para el control del servo Izquierdo
    //Modificar este valor hasta parar el servo
#define        STOP_I        125        
#define        AVANCE_I        STOP_D+30
#define        ATRAS_I        STOP_D-30
#define        MOTOR_I        5

//Constantes para los sensores
#define         BLANCO        TRUE
#define        NEGRO            FALSE

//Entradas sensores digitales
    //ED=Exterior Derecho
    //EI=Exterior Izquierdo
    //II=Interior Izquierdo
    //ID=Interior Derecho
#define     CNY_ED         9            
#define     CNY_EI         11        
#define     CNY_II        12            
#define     CNY_ID        8            

//Definiciones para finales de carrera

#define     FC_D PORTAbits.RA3
#define     FC_I PORTAbits.RA0
#define     COMD PORTAbits.RA2
#define     COMI PORTAbits.RA1

//Varibles auxiliares
unsigned char i;

 //Configuración de E/S
 void setup ()
    {
    //Configuramos como entradas digitales los  pines del 9 al 12
    for (i=9;i<13;i++)
        {
        pinMode(i,INPUT);
        }   
    //Configuramos como driver de servos los pines 4 a 5
    for (i=4;i<6;i++)
        {
        servo.attach(i);
        }
    //Paramos los motores
    servo.write(MOTOR_D,STOP_D);
    servo.write(MOTOR_I,STOP_I);
    
    //configuramos E-S para Finales de carrera. Pin 13 y 16 como entradas; 14 y 15 como salidas.
    TRISAbits.TRISA0=0;
    TRISAbits.TRISA1=1;
    TRISAbits.TRISA2=1;
    TRISAbits.TRISA3=0;
    }    

//programa principal
void loop (void)
    {
    //Ponemos comun del FC a 1
    COMD=1;
    COMI=1;
    if (FC_D == 1) 
        {
        servo.write(MOTOR_D,ATRAS_D);
        servo.write(MOTOR_I,ATRAS_I);
        delay (500);
        servo.write(MOTOR_D,AVANCE_D);
        servo.write(MOTOR_I,ATRAS_I);
        delay (500);
        }
    else    if (FC_I == 1) 
        {
        servo.write(MOTOR_D,ATRAS_D);
        servo.write(MOTOR_I,ATRAS_I);
        delay (500);
        servo.write(MOTOR_D,AVANCE_I);
        servo.write(MOTOR_I,ATRAS_D);
        delay (500);
        }
    else 
        {
        servo.write(MOTOR_D,AVANCE_D);
        servo.write(MOTOR_I,AVANCE_I);
        }
    }


Existen 10 tipos de personas...
los que saben binario y los que no.

El conocimiento es un arma poderosa... Aprende!!!


Mi blog: Robotica Lúdica Pingubot

FJ_Sanchez
Usuario Desarrollador
Usuario Desarrollador
Mensajes: 1082
Registrado: Mié Jun 07, 2006 11:09 pm
Nombre: Francisco Javier Sánchez
Ubicación: Vejer de la Frontera
Contactar:

Re: Pinguino, servos y salidas digitales.

Mensaje por FJ_Sanchez » Mar Feb 22, 2011 6:51 pm

Un par de cosas a revisar:

- ¿A dónde está conectado el pin NC de los bumpers? Si alguno de los contactos NC del bumper toca con tierra pueda que sea el motivo por el que ves los 0v...

- ¿Usas resistencias de pull-down en las entradas digitales? Importante si vas a usar la salida NA del bumper.

A ver si fuese algo de eso.
¡Un saludo!
_ _ _ _ _ _ _ _ _ _

Hack your mind \\ F.J. Sánchez

Okupa tu mente. \\ _ _ _ _ _ _ _ _ _ _ _ _

Avatar de Usuario
Sphinx
Usuario Experto
Usuario Experto
Mensajes: 639
Registrado: Jue Abr 03, 2008 4:45 pm
Ubicación: Madrid
Contactar:

Re: Pinguino, servos y salidas digitales.

Mensaje por Sphinx » Mar Feb 22, 2011 9:45 pm

Hola Bastian,

Efectivamente, me inclino más por pensar que te pasa lo que dice FJ_Sanchez.
Yo miraría si poner pull down en esos pines.

De todos modos, no veo lo de utilizar pines para los NC de los bumpers.

Saludos,
Sphinx.
Tanto si piensas que puedes, como si piensas que no puedes, estás en lo cierto.- Henry Ford
>> Mis experiencias y proyectos robóticos: http://linuxdroids.com

FJ_Sanchez
Usuario Desarrollador
Usuario Desarrollador
Mensajes: 1082
Registrado: Mié Jun 07, 2006 11:09 pm
Nombre: Francisco Javier Sánchez
Ubicación: Vejer de la Frontera
Contactar:

Re: Pinguino, servos y salidas digitales.

Mensaje por FJ_Sanchez » Mar Feb 22, 2011 10:10 pm

Lo de los NC me refiero a que si ese nodo hace contacto con alguna parte del circuito que tenga 0V hace un cortocircuito o en el mejor de los casos si hay alguna resistencia por ahí, simplemente lo pone a 0V. Si está aislado de todo no pasa nada.
_ _ _ _ _ _ _ _ _ _

Hack your mind \\ F.J. Sánchez

Okupa tu mente. \\ _ _ _ _ _ _ _ _ _ _ _ _

Bastian
Usuario Avanzado
Usuario Avanzado
Mensajes: 384
Registrado: Mié Feb 13, 2008 9:29 pm
Nombre: David Carmona
Ubicación: Utiel
Contactar:

Re: Pinguino, servos y salidas digitales.

Mensaje por Bastian » Mié Feb 23, 2011 10:35 am

Hola!

Soy consciente de que el tema de la conexion de los bumpers es un chapuza :oops: :oops: :oops: :oops: Era una prueba rápida en la que no queria enmarañar el cableado con resistencias de pull-up/down... y lo primero que quité cuando vi que no funcionaba, por lo que está descartado que sea problema de la conexión de los bumpers.
Teniendo los pines al aire, los configuro como salida, escribo un uno en el pin y cuando mido tensión en el pin tengo cero voltios y es problema software por que todo está desconectado... motores, sensores, bumpers... todos los pines están al aire.

Aun no he tenido tiempo de probar lo que comente en el post anterior... cuando lo pruebe os comento. Gracias!

Salu2!
Existen 10 tipos de personas...
los que saben binario y los que no.

El conocimiento es un arma poderosa... Aprende!!!


Mi blog: Robotica Lúdica Pingubot

Bastian
Usuario Avanzado
Usuario Avanzado
Mensajes: 384
Registrado: Mié Feb 13, 2008 9:29 pm
Nombre: David Carmona
Ubicación: Utiel
Contactar:

Re: Pinguino, servos y salidas digitales.

Mensaje por Bastian » Mié Feb 23, 2011 10:27 pm

Hola!

Esto empieza a tener tintes de fenomeno paranormal... me explico. Esto hace algunas cosas raras. he probado el siguiente código y funciona correctamente... los pines 14 y 15 me dan los 5V esperados y el programa funciona correctamente a pesar de que las entradas están al aire.

Código: Seleccionar todo

#define RUNLED PORTAbits.RA4

void setup ()
{
pinMode(13,INPUT);
pinMode(16,INPUT);
pinMode(15,OUTPUT);
pinMode(14,OUTPUT);
digitalWrite(15,HIGH);
digitalWrite(14,HIGH);
}

void loop()
{
if (digitalRead(13)||digitalRead(16))
	{
	RUNLED=0;
	delay(100);
	RUNLED=1;
	delay(100);
	}
else
	{
	RUNLED=0;
	delay(500);
	RUNLED=1;
	delay(500);
	}
}
Hasta aquí bien... ahora cambiamos el parapdeo del led por un movimiento de servo y ya no funciona... de hecho los pines 14 y 15 no me dan los 5V, se quedan a 0. 8O 8O

Código: Seleccionar todo

#define RUNLED PORTAbits.RA4

void setup ()
{
pinMode(13,INPUT);
pinMode(16,INPUT);
pinMode(15,OUTPUT);
pinMode(14,OUTPUT);
digitalWrite(15,HIGH);
digitalWrite(14,HIGH);
servo.attach(4);
}

void loop()
{
if (digitalRead(13)||digitalRead(16))
	{
	servo.write(4,1);
	RUNLED=0;
	}
else
	{
	RUNLED=1;
	servo.write(4,250);
	}
}
En cambio, si paso lso digitalWrite al loop, vuelvo a tener los 5 voltios en las salidas.

Código: Seleccionar todo

#define RUNLED PORTAbits.RA4

void setup ()
{
pinMode(13,INPUT);
pinMode(16,INPUT);
pinMode(15,OUTPUT);
pinMode(14,OUTPUT);
servo.attach(4);
}

void loop()
{
digitalWrite(15,HIGH);
digitalWrite(14,HIGH);
if (digitalRead(13)||digitalRead(16))
	{
	servo.write(4,1);
	RUNLED=0;
	}
else
	{
	RUNLED=1;
	servo.write(4,250);
	}
}
Si las entradas se quedan al aire, el ruido de los motores afecta pero nada que no solucione un par de resistencias de pull-down. Lo que me mosquea es que el digitalWrite solo funcione dentro de la función setup "a veces"
Existen 10 tipos de personas...
los que saben binario y los que no.

El conocimiento es un arma poderosa... Aprende!!!


Mi blog: Robotica Lúdica Pingubot

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 invitados