Control y verificación de Servo

Un diseño facil pero muy útil, para probar nuestros servos, y verificar el recorrido de cada uno.

Las conexiones son simples: el servo conectado a la salida 0(cero) RB0

Y el potenciometro de mas de 47k entre positivo y negativo y el centro a la puerta 13…

 

 

He incluido dos codigos, uno con la libreria de servo, y otro de la forma tradicional sin libreria.

Con libreria de servos
[sourcecode language="py"]
// Control de servo tradicional con libreria
// Walii.es 2011
//Pinguino.walii.es
//   +-----+
//   |servo|--------- PWM Servo control ---> to pinguino pin.
//   |     |--------- +5V
//   |  o  |--------- GND
//   |     | 
//   +-----+

uchar position=1;
int i;
void setup(void)
{
servo.attach(0);
}

void loop(void)
{
i=analogRead(13);
position=i/4;
servo.write(0,position);
delay(100);
}

[/sourcecode]

 Sin libreria de servo, pueden observar que el recorrido es mucho mayor que con la librería, esto es porque de esta forma no tenemos un limite preestablecido en él tamaño de pulso. Y si nos pasamos con esto, puede generar un reset por consumo elevado en el PINGUINO.     [sourcecode language="py"]
// Control de servo tradicional sin libreria
// Walii.es 2011
//Pinguino.walii.es
#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 i;
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);
}
//Con la siguiente rutina controlamos la señal al servo RB0.
//Leemos en cada pasada el valor de position0
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()
{
ir0=analogRead(13);
position0=ir0/6;
if (position0<1) position0=1; if (position0>151) position0=151;

}
[/sourcecode]

8 Replies to “Control y verificación de Servo”

  1. Hola, estuve probando el servo con el código del burbujometro pero no funciono llegue a la conclusión de que no funcionaba, voy a probar con estos códigos para ya así confirmar si funciona o no. Gracias por publicar estos códigos son de mucha a ayuda para probar los servos.

    Saludos.

  2. Hola!!! Excelente pagina!!

    Necesito su ayuda!!!

    Estoy intentando con una placa pinguino (pic18f2550) obtener datos de un potenciometro y cargarlos en una tabla excel.
    Probe con una placa Arduino y funciona bien, pero quería hacerlo con la pinguino y el problema es que la comunicación entre excel y arduino era mediante netcomm que lee un Puerto COM. y con pinguino no puedo conectarlo como un COM.

    ESPERO QUE PUEDAN AYUDARME. GRACIAS!!!!

    Este es el código que utilice con Arduino, un potenciometro y un botón.

    /*

    Reads from an analog input, calculatin a distance in mm
    and returning in to the computer.

    The circuit:
    * Analog sensor with a potentiometer attached to analog input 0

    Created 21/06/2011
    By Javier Cavallo

    */

    /*Variable declarations*/
    int baudRate = 9600;
    int zero = 524; //Diference from reading input when milimiter is at 0 position.
    float ratio = 3;
    float distance = 0;

    int analogInputPin = 0;
    int digitalInputPin = 7;
    //int analogOutPutPin = 1;
    int timeSleep = 150;
    int inByte;
    int buttonValue = 0;

    /*Input ASCII values*/
    int request = 82;

    // initialize serial communication with computer:
    void setup()
    {
    //Set INPUT Pins
    pinMode(analogInputPin, INPUT);
    pinMode(digitalInputPin, INPUT);

    Serial.begin(baudRate);
    }

    int calculateDistance(int inputValue)
    {
    //Transform the distance into mm.
    int result = inputValue / ratio;
    result = result * 10/20;

    return result;
    }

    void readDistance()
    {
    //Read distance from potentiometer
    int inputValue = (analogRead(analogInputPin))- zero;

    distance = calculateDistance(inputValue);

    //Return the distance to the Computer.
    //Serial.println(“Lectura = “);
    Serial.println(distance, DEC);
    //Serial.print(” mm”);
    }

    void loop() {

    if(Serial.available() > 0)
    {
    buttonValue = digitalRead(digitalInputPin);

    if(buttonValue == LOW)
    {
    readDistance();
    }

    //Code to use with excel buttons
    /*
    inByte = Serial.read();

    if(inByte == request)
    {
    readDistance();
    }
    */

    delay(timeSleep);
    }
    }

  3. Lo primero, en el mundo pinguino no nos gusta la frase, lo he probado con arduino y funciona, y con pinguino no… porque es una forma muy burda de pedir ayuda… ya que podría decirte… “¿para que quieres pinguino si ya te funciona con arduino.???”
    Después, aunque parezca, pinguino no es 100% compatible con el código de arduino. el código que me pasas es de Arduino y posee incompatibilidades, por favor controla todo el código… yo “hoy” no tengo tiempo para traducirlo pero te doy una ayuda… Serial.println() no lo soportamos.
    Saludos.

  4. Gracias!!
    A pesar de haber comenzado con Arduino, prefiero sin dudas mi placa Pinguino (porque la hice yo) y es por eso que hace ya un tiempo vengo intentando esto. (lamentablemente no tengo los conocimientos necesarios, debido a que mis estudios han sido dirigidos a otras áreas). El código me lo pasó un amigo. Pero tampoco el me pudo ayudar con algunas cosas (como lo de conectarlo como puerto COM), por eso recurro a ustedes, su conocimiento y buena predisposición.

    Muchas Gracias.
    Saludos.

  5. no te preocupes… intentaré mirar el código, pero por lo menos intenta leer la config, y probar con proyectos fáciles primero, no intentes algo tan complicado si no sabes nada de pinguino. Tienes muchos ejemplos en el GUI, intenta con esos… yo trabajo de esto y lo que me pides se suele cobrar.

  6. Hola, probé el código agregando el CDC como me habías dicho y logré que detecte la placa como puerto COM. y la comunicación con Excel. Solo falta que envíe la medida, porque hasta el momento envía unos códigos raros.

  7. Comparte el código y me fijo si puedo ayudarte… que seguro es tema de CDC.PRINT seguro no concuerda el tipo de impresión con el tipo de variable.

    saludos.

  8. Muchas gracias por tu tiempo, este es el código.

    /*

    Reads from an analog input, calculatin a distance in mm
    and returning in to the computer.

    The circuit:
    * Analog sensor with a potentiometer attached to analog input 0

    Created 21/06/2011
    By Javier Cavallo

    */

    /*Variable declarations*/
    int baudRate = 9600;
    int zero = 474; //Diference from reading input when milimiter is at 0 position.
    float ratio = 1;
    float distance = 0;

    int analogInputPin = 8;
    int digitalInputPin = 9;

    //int analogOutPutPin = 1;
    int timeSleep = 10;
    int inByte;
    int buttonValue;

    /*Input ASCII values*/
    int request = 82;

    // initialize serial communication with computer:
    void setup()
    {
    //Set INPUT Pins
    pinMode(analogInputPin, INPUT);
    pinMode(digitalInputPin, INPUT);

    Serial.begin(baudRate);
    }

    void calculateDistance(int inputValue)
    {
    //Transform the distance into mm.
    float result = inputValue / ratio;

    distance = result * 10 / 68;
    }

    void readDistance()
    {
    //Read distance from potentiometer
    int inputValue = (analogRead(analogInputPin)) – zero;

    calculateDistance(inputValue);

    //Return the distance to the Computer.
    if (CONTROL_LINE) CDC.print(“%f\n”,distance);
    //Serial.printf(“%f\n”, distance);
    CONTROL_LINE=1;
    }

    void loop()
    {
    if(Serial.available())
    {
    buttonValue = digitalRead(digitalInputPin);
    inByte = Serial.read(); //Read Request

    if((buttonValue == LOW) || (inByte == request))
    {
    readDistance();
    }

    delay(timeSleep);
    }
    }

Leave a Reply

Your email address will not be published. Required fields are marked *