Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
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...
#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);
}
}
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.
#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. 😯 😯
#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.
#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"