PINGUINO Seguidor de SOL – OPEN HARDWARE / SOFTWARE / MIND
Menú Close

PINGUINO Seguidor de SOL

Hoy un proyecto fácil de replicar, pero que no encontré nada para PINGUINO por eso decidí hacerlo.

La forma de funcionar es la siguiente:

Los LDRs reciben la intensidad lumínica del SOL y la traducen en niveles lógicos analógicos entre 0 y 1024… en mi caso he creado un umbral en 900…porque de la forma que he conectado los LDRs cuanto más luz, menos valor lógico. Por tal motivo si recibe luz, el valor baja…

Si ambos LDRs poseen cualquier valor por encima o por debajo de 900… entonces el PIC entiende que está perfectamente enfocado o que no posee luz y por tal motivo no cambia el ángulo del servo.

Por otro lado, si el PINGÜINO detecta que algún sensor se diferencia en el rango del otro, esto indica hacia qué lado tiene que moverse el servo.

Por ejemplo…. Si el LDR derecho detecta un valor de 800 y el LDR izquierdo tiene un valor de 950… entonces entiende que la fuente de luz se encuentra del lado derecho y modifica el ángulo del servo hacia ese sentido.

Aquí pueden ver una demostración con una linterna…

El circuito es el siguiente.

Y el código es el siguiente:

[sourcecode language=»py»]

// Serial control 2 servos seguidores
// Walii.es 2010
#define RUNLED PORTAbits.RA4
#define PIC18F4550 // control pin of servo
int counter; // counter used for interrupt
int position0; //pin0 servo vertical
int ir0;//pin 13
int ir1;//pin 14
int ir2;//pin 15
int ir3;//pin 16
int Pot=900; //sensibilidad de los LDRs
int i;
int key;
int pulseWidth = 20;
void setup()
{
T1CON=0x01; // configure timer 1
PIE1bits.TMR1IE=1; // set interrupt for timer 1
INTCON|=0xA0; // enable GIE and PEIE
for (i=0;i<3;i++) { //servos conections
pinMode(i,OUTPUT);
}
Serial.begin(9600);
}
void UserInterrupt()
{
if (PIR1bits.TMR1IF)
{
TMR1H=0xFF; // reload value timer 1
TMR1L=0x9C;
PIR1bits.TMR1IF=0; // clear interrupt flag
if (counter>position0+51) PORTBbits.RB0=0; // position
else PORTBbits.RB0=1;
if (counter==1500) counter=0; // value for ~20 mS
counter++;
}
}
void loop()
{
//En principio utilizo solo dos LDRs pero se pueden usar 4
//I use only two LDRs but you can use 4
//Puedes usar LDR o led Infrarrojos
//You can use Infrared LEDs or LDR
ir0=analogRead(13);
ir1=analogRead(14);
ir2=analogRead(15);
ir3=analogRead(16);
if Serial.available()
{
key=Serial.read();
if (key==’1′) position0=position0+10;
if (key==’2′) position0=position0-10;
}
//control de posicion dependiendo la incidencia del sol
// Control position depending on the incidence of the sun
if ( ir0 < Pot && ir1 < Pot) position0=position0;//quieto sol incide
if ( ir0 < Pot && ir1 > Pot) position0=position0-10;//izquierda
if ( ir0 > Pot && ir1 < Pot) position0=position0+10;//derecha
if ( ir0 > Pot && ir1 > Pot) position0=position0;//sin sol
//control de exceso de posicion de servo
// Position control of servo excess
if (position0<1) position0=1;
if (position0>151) position0=151;
//debug via puerto serie
// Debug via serial port
Serial.print(" Posicion serv0 = ");
Serial.print(position0);
Serial.print("\n\r");
Serial.print("\n\r");
Serial.print(" ir0= ");
Serial.print(ir0);
Serial.print(" ir1= ");
Serial.print(ir1);
}

[/sourcecode]

Nota: he pensado que sería útil incluir en el código y en el circuito un potenciómetro para controlar manualmente el nivel de sensibilidad.

Esto se hace por ejemplo: Agregando en la patilla RA5 (patilla pingüino 17 o del pic 7) el centro de un potenciómetro o resistencia regulable, y los extremos en 5Volts y tierra.

Y modificar el siguiente código.

int Pot=900;

por

int Pot=analogRead(17);

Related Posts

18 Comments

  1. geragts

    felicitaciones buen proyecto, me podras pasar el archivo .hex o decirme en que programa hiciste el codigo

  2. walterleonardo

    Esta realizado en PINGUINO, basicamente C++… Ahora busco el programa… pero no puedes cargar el HEX… ya que esto no es un microcontrolador normal… este funciona con un BootLoader…
    hecha un vistazo mas abajo… donde dice comienza con PINGUINO…
    saludos.

  3. geragts_9

    Ya estube un buen rato investigando sobre PUNGUINO me parece muy interesante de hecho ya tengo todo el material para el modelo con 18f4550 lo habia estado usando en practicas anteriores lo armare en la protoboard y lo probare si me funciona y espero que si lo pasare a placa, soy algo nuevo en esto pero estoy muy interesado en realizar tu seguidor de sol. Gracias
    saludos

  4. walterleonardo

    ok… perfecto, si tienes algún inconveniente me dices… asegúrate que este correctamente en cuanto a polaridad y capacidad.. el capacitor de la patilla USB, es critico… muchos han tenido problemas por eso.

  5. geragts_9

    ya empezaron a salir las dudas je, el capacitor para el usb lo tienes de 220uF pero en el diagrama de PINGUINO con 4550 viene uno de 220nF, para este proyecto se tiene que poner el de 220uF???

  6. walterleonardo

    Si… es un error de la tipografia… lo siento es de 220nf…. pero según mis experiencias… te recomiendo poner uno de 470nf… es mejor…. funciona mejor en todos los sistemas operativos.

    saludos.

  7. geragts_9

    ok, le pondre el de 470nF. Gracias si salen mas dudas pues por aqui estare molestando.
    Saludos

  8. walterleonardo

    no te preocupes… no molestas… todo lo contrario, hoy día hay poca gente interesada en esto… y la verdad que cuanto mas seamos mejor… y ayudaros a iniciarse es algo que me ayuda a pensar que somos mas cada día.

    Igual disculpa si hay veces que no contesto tan rápido, es que estoy haciendo muchos cursos y no tengo tanto tiempo libre como antes… … es que estoy en el paro y aprovecho para hacer cursos de todo… ingles, C++, POO, PM, ETC… y hay veces que no chequeo correo por varias horas.

    Saludos.

  9. geragts_9

    Pues si hay pocos que les gusta, de hecho en mi grupo somos como 3 de 25 a los que le gusta esto, yo estudio ingeniería en sistemas y es el ultimo semestre de 3 que nos dan de electrónica, este ultimo es de interfaces, pero aunque ya no me den electrónica me gustaría seguir en esto por mi cuenta ya que me llama mucho la atención.

    Oye que bien te estas preparando echale ganas, pocos como tu, pues yo en la carrera estoy llevando ingles, POO con Java, C++ lo e visto poco, bases de datos con SQL, Cisco, etc..

    Ya hice las pruebas de principiantes las de encender un led con PINGUINO y funciono a la perfección ahora si voy a hacer la placa y el seguidor de sol je.

    y por lo de si te tardas no te preocupes soy paciente y entiendo lo ocupado que has de estar, antes yo soy el que esta agradecido por que te tomas la molestia de contestarme.

    Saludos

  10. walterleonardo

    estamos al habla… si ves que tardo mucho… me vuelve a preguntar… porque se me van las cosas…. es defecto de la edad. 🙂
    un saludo.

  11. geragts_9

    hola, disculpa la molestia pero tengo un problema bueno por fin tengo el material pero el caso es que no me quiere funcionar, como que no me lee los datos de los ldr o no se por que no hace nada cuando le pongo la luz, ya le agregue el potenciometro pero sigue igual, el código lo estuve también checando pero creo que esta bien no le ayo algún error de lógica,espero me orientes un poco sobre que puedo hacer. Gracias

    Saludos

  12. walterleonardo

    Ok.. no te preocupes… muy probable has equivocado los pines… es normal… dime algunas cosas.
    dime que procesador usas… 18f2550 o 4550
    copiame el programa… codigo que usas.
    y donde has conectado (en que pines reales del procesador…)…
    y no te preocupes.. al principio siempre es complicado… hasta entender la logica de todo esto.
    Saludos.

  13. walterleonardo

    Intenta modificar los resistores de 1k de los LDRs por unos de 47k… la experiencia me enseñó que es mejor … y luego puedes medir en la patilla analogica de entrada del LDR que valores tienes con luz y sin luz… esto con un Voltimetro. tienes que ver variaciones entre 2 y 5volts.
    Saludos.

  14. geragts_9

    Hola, ya estuve checando lo de las resistencias y con el voltimetro si me da entre 2 y 5v, los pines de los ldr los tengo conectados al 2 y 3 (pines reales), el servo al pin 15 pero aun no me funciona, tambien otro detalle es que tarda como 2 minutos en encender el led indicador de conexion lo que con otros codigos que e probado no pasa (enseguida de conectarlo a la pc enciende el led y funciona perfecto).

    Saludos.

    El codigo que estoy usando es este:

    // Serial control 2 servos seguidores
    // Walii.es 2010
    #define RUNLED PORTAbits.RA4
    #define PIC18F4550 // control pin of servo
    int counter; // counter used for interrupt
    int position0; //pin0 servo vertical
    int ir0;//pin 13
    int ir1;//pin 14
    int Pot=900; //sensibilidad de los LDRs
    int i;
    int key;
    int pulseWidth = 20;
    void setup()
    {
    T1CON=0x01; // configure timer 1
    PIE1bits.TMR1IE=1; // set interrupt for timer 1
    INTCON|=0xA0; // enable GIE and PEIE
    pinMode(0,OUTPUT);
    Serial.begin(9600);
    }
    void UserInterrupt()
    {
    if (PIR1bits.TMR1IF)
    {
    TMR1H=0xFF; // reload value timer 1
    TMR1L=0x9C;
    PIR1bits.TMR1IF=0; // clear interrupt flag
    if (counter>position0+51) PORTBbits.RB0=0; // position
    else PORTBbits.RB0=1;
    if (counter==1500) counter=0; // value for ~20 mS
    counter++;
    }
    }
    void loop()
    {
    //En principio utilizo solo dos LDRs pero se pueden usar 4
    //I use only two LDRs but you can use 4
    //Puedes usar LDR o led Infrarrojos
    //You can use Infrared LEDs or LDR
    ir0=analogRead(13);
    ir1=analogRead(14);
    if (Serial.available())
    {
    key=Serial.read();
    if (key==’1′) position0=position0+10;
    if (key==’2′) position0=position0-10;
    }
    //control de posicion dependiendo la incidencia del sol
    // Control position depending on the incidence of the sun
    if ( ir0 < Pot && ir1 < Pot) position0=position0;//quieto sol incide
    if ( ir0 Pot) position0=position0-10;//izquierda
    if ( ir0 > Pot && ir1 Pot && ir1 > Pot) position0=position0;//sin sol
    //control de exceso de posicion de servo
    // Position control of servo excess
    if (position0151) position0=151;
    //debug via puerto serie
    // Debug via serial port
    Serial.print(» Posicion serv0 = «);
    Serial.print(position0);
    Serial.print(«\n\r»);
    Serial.print(«\n\r»);
    Serial.print(» ir0= «);
    Serial.print(ir0);
    Serial.print(» ir1= «);
    Serial.print(ir1);
    }

  15. geragts_9

    Se me olvidaba uso el 4550.
    Espero y puedas ayudarme no entiendo por que no funciona. Gracias
    Saludos

  16. walterleonardo

    Hola… no te preocupes… por lo que veo lo tienes bien armado…lo que si puede ser es que cuando he realizado este código no existía el driver controlador de servos y fue en una versión previa de IDE…. ahora me pongo a ver si lo realizo para la versión nueva. Porque ese es el único inconveniente que vi en pinguino… que las nuevas versiones pierden funciones antiguas… y puede ser el problema que vemos acá…
    En cuanto lo reproduzca lo pongo en el blog.

    saludos.

  17. geragts_9

    Ok ya entiendo pues si podría ser eso, ya estuve checando el driver de servos en otro post (burbujometro, por cierto genial) voy a hacer unas pruebas para ver si anda el servo, pero si te agradeceria que publicaras el codigo. Disculpa por darte tantas molestias. Gracias

    Saludos.

  18. felloz

    Hola, tengo algunas dudas, estoy tratando de programar el código que pusiste en C++ en MPLAB, pero me marca errores ya que yo programo en C18 y en este tipo de programación se utiliza la confuguracion de bits y en el programa que pusiste no lo veo, si me pudieras ayudar con la programación en C18 te lo agradecería muchisimo

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.