Go Down

Topic: Duda Con Servos (Read 1 time) previous topic - next topic

Eduort

Tengo una duda con los servos, hay alguna forma de que el servo este en una posicion inicial y aumente X grados al recibir una señal? porque hasta ahora solo encontre tutoriales para mover el servo a una posicion que se define, pero no para que por medio de un boton vaya moviendose, es todo y gracias de antemano.

ionhs

En frió no veo el problema para no poder hacer eso. Por lo que dices cuando se pulse un botón hay que incrementar x grados su posición actual. Salu2

Eduort


En frió no veo el problema para no poder hacer eso. Por lo que dices cuando se pulse un botón hay que incrementar x grados su posición actual. Salu2

Pero mi problema es que no he encontrado algun ejemplo de codigo de como hacer eso, todos los tutoriales que encuentro o son servos truncados con movimiento que no se detiene o se mueven a la posicion determinada.

fermg

hola yo tambien soy nuevo pero no le veo mucho problema solo tendras que coger dos botones y decirle que cuando pulses uno sume x grados y cuando pulses otro los restes. te creas una variable que lo que hace es guardar el valor de los grados que quieres de 0 a 180.

Code: [Select]
   

#include <Servo.h>
    Servo MiServo;
    int Senal;


    void setup(){
    MiServo.attach(9); Serial.begin(9600);
    }

    void loop() {
    //  Lee la señal del potenciómetro por el pin A0 (Pin 23 del ATMega328).
    Senal = analogRead(A0);
    //  Adapta la lectura de 1024 niveles a 180 niveles para el Servomotor.
    Senal = map(Senal, 0, 1023, 0, 179);
    //  Manda la señal corregida al Servomotor y a la Consola Serial.
    MiServo.write(Senal);
    Serial.println(Senal, DEC);
    //  Pequeño retardo para apreciar mejor las variaciones de la señal.
    delay(30);
    }

    //  Manda la señal corregida al Servomotor y a la Consola Serial.
    MiServo.write(Senal);
    Serial.println(Senal, DEC);
    //  Pequeño retardo para apreciar mejor las variaciones de la señal.
    delay(30);
    }

fermg

perdon que no se uqe he tocado, yo lo haría asi:

te creas una variable

int grados;
int boton+=2;
int boton-=3;

void setup()
{
configuras los puertos
}

void loop()
{
if (digitalRead(boton+)== HIGH){
grados++;
}
if (digitalRead(boton-)==HIGH)
{
grados--;
}

myservo......(grados);
}

yo lo haria algo parecido a esto. espero haberte sido de ayuda.
un saludo a todoso

trescuernos

Hola.

Yo estoy trabajando en un proyecto para hacer eso mismo que buscas tú a través del Ethernet shield para mover remotamente dos servos. El problema es soy novato en processing y me cuesta bastante.

Buscando info encontré un código para hacerlo a través del Serial Monitor que creo te ayudará.

Code: [Select]
/*
* NewSerialServo
* --------------
* Servo control from the Serial port
*
* Alteration of the control interface to use < and > keys
* to slew the servo horn left and right.  Works best with
* the Linux/Mac terminal "screen" program.
*
* Created 10 December 2007
* copyleft 2007 Brian D. Wendt
* http://principialabs.com/
*
* Adapted from code by Tom Igoe
* http://itp.nyu.edu/physcomp/Labs/Servo
*/  
 
/** Adjust these values for your servo and setup, if necessary **/  
int servoPin     =  2;    // control pin for servo motor  
int minPulse     =  600;  // minimum servo position  
int maxPulse     =  2400; // maximum servo position  
int turnRate     =  100;  // servo turn rate increment (larger value, faster rate)  
int refreshTime  =  20;   // time (ms) between pulses (50Hz)  
 
/** The Arduino will calculate these values for you **/  
int centerServo;         // center servo position  
int pulseWidth;          // servo pulse width  
int moveServo;           // raw user input  
long lastPulse   = 0;    // recorded time (ms) of the last pulse  
 
 
void setup() {  
 pinMode(servoPin, OUTPUT);  // Set servo pin as an output pin  
 centerServo = maxPulse - ((maxPulse - minPulse)/2);  
 pulseWidth = centerServo;   // Give the servo a starting point (or it floats)  
 Serial.begin(9600);  
 Serial.println("      Arduino Serial Servo Control");  
 Serial.println("Press < or > to move, spacebar to center");  
 Serial.println();  
}  
 
void loop() {  
 // wait for serial input  
 if (Serial.available() > 0) {  
   // read the incoming byte:  
   moveServo = Serial.read();  
 
   // ASCII '<' is 44, ASCII '>' is 46 (comma and period, really)  
   if (moveServo == 44) { pulseWidth = pulseWidth - turnRate; }  
   if (moveServo == 46) { pulseWidth = pulseWidth + turnRate; }  
   if (moveServo == 32) { pulseWidth = centerServo; }  
 
   // stop servo pulse at min and max  
   if (pulseWidth > maxPulse) { pulseWidth = maxPulse; }  
   if (pulseWidth < minPulse) { pulseWidth = minPulse; }  
 
   // print pulseWidth back to the Serial Monitor (uncomment to debug)  
   // Serial.print("Pulse Width: ");  
   // Serial.print(pulseWidth);  
   // Serial.println("us");   // microseconds  
 }  
 
 // pulse the servo every 20 ms (refreshTime) with current pulseWidth  
 // this will hold the servo's position if unchanged, or move it if changed  
 if (millis() - lastPulse >= refreshTime) {  
   digitalWrite(servoPin, HIGH);   // start the pulse  
   delayMicroseconds(pulseWidth);  // pulse width  
   digitalWrite(servoPin, LOW);    // stop the pulse  
   lastPulse = millis();           // save the time of the last pulse  
 }  
}  


Extraído de: http://principialabs.com/arduino-serial-servo-control/



trescuernos

#6
Oct 10, 2012, 11:00 am Last Edit: Oct 10, 2012, 11:03 am by trescuernos Reason: 1
Aprovecho a ver si alguien puede ayudarme con ideas de en que me puedo estar equivocando al adaptar el anterior código para funcionar a través del ethernet shield. Mi código es este:


Code: [Select]
/*
 Web Server
Proyecto de controlador web para camara
*/

#include  <SPI.h>
#include  <Ethernet.h>
#include  <Servo.h>  // Incluimos la libreria servo

//mac, IP
byte mac[] = { 0x00, 0x02, 0x0A, 0x0D, 0x06, 0x01 };
byte ip[] = { 192, 168, 1, 177 }; //IPAddress ip(192,168,1,177);
byte gateway[] = { 192, 168, 1, 1 }; // ip router
byte subnet[] = { 255, 255, 255, 0 }; // mascara subnet
EthernetServer server(80); // puerto ethernet

//pines out Trans
int zoom1 = 7;
int zoom2 = 8;
int foco1 = 2;
int foco2 = 3;
Servo servohor;  // creando el objeto servo para control
Servo servover;  // otro

int servoPinh     =  6;    // control pin for servo motor  
int minPulseh     =  600;  // minimum servo position  
int maxPulseh     =  2400; // maximum servo position  
int turnRateh     =  50;  // servo turn rate increment (larger value, faster rate)  
int refreshTimeh  =  100;   // time (ms) between pulses (50Hz)  
int centerServoh;         // center servo position  
int pulseWidthh;          // servo pulse width  
int moveServoh;           // raw user input  
long lastPulseh   = 0;    // recorded time (ms) of the last pulse

int servoPinv     =  5;    // control pin for servo motor  
int minPulsev     =  1400;  // minimum servo position  
int maxPulsev     =  2000; // maximum servo position  
int turnRatev     =  50;  // servo turn rate increment (larger value, faster rate)  
int refreshTimev  =  100;   // time (ms) between pulses (50Hz)  
int centerServov;         // center servo position  
int pulseWidthv;          // servo pulse width  
int moveServov;           // raw user input  
long lastPulsev   = 0;    // recorded time (ms) of the last pulse  

boolean reading = false;
String readString;

void setup()
{
 
Serial.begin(9600);
//iniciar conexion
Ethernet.begin(mac, ip, gateway, gateway, subnet);
server.begin();

 pinMode(2, OUTPUT); //pin selected to control
 pinMode(3, OUTPUT); //pin selected to control
 pinMode(7, OUTPUT); //pin selected to control
 pinMode(8, OUTPUT); //pin selected to control
 pinMode(5, OUTPUT);  // Set servo pin as an output pin  
 centerServoh = maxPulseh - ((maxPulseh - minPulseh)/2);  
 pulseWidthh = centerServoh;   // Give the servo a starting point (or it floats)
 pinMode(6, OUTPUT);  // Set servo pin as an output pin  
 centerServov = maxPulsev - ((maxPulsev - minPulsev)/2);  
 pulseWidthv = centerServov;   // Give the servo a starting point (or it floats)




}

void loop()
{

EthernetClient client = server.available();
if (client)
{
 while (client.connected())
 {
   if (client.available())
   {
     char c = client.read();
     if(readString.length() < 100)
     {
     readString += c;
     Serial.print(c);
     }
   if (c == '\n')
     {
     

    //HTML creacion de formulario
         Serial.println(readString);

         client.println("HTTP/1.1 200 OK");
         client.println("Content-Type: text/html");
         client.println();

         client.println("<HTML>");
         client.println("<HEAD>");
         client.println("<TITLE>Control Camara posicion zoom y foco</TITLE>");
         client.println("</HEAD>");
         client.println("<BODY>");

         client.println("<H1>Arduino, Control Camara posicion zoom y foco</H1>");
       
        //Servohor
         client.println("<a href=\"/?right\"\">DERECHA</a>");
         client.println("<a href=\"/?center\"\">CENTRO</a>");
         client.println("<a href=\"/?left\"\">IZQUIERDA</a>");
         
         //servover
         client.println("<a href=\"/?up\"\">ARRIBA</a>");
         client.println("<a href=\"/?mid\"\">CENTRO</a>");
         client.println("<a href=\"/?down\"\">ABAJO</a>");
         
         // zoom y foco
         client.println("<a href=\"/?zoom1\"\">ZOOM+</a>");
         client.println("<a href=\"/?zoom2\"\">ZOOM-</a>");
         client.println("<a href=\"/?foco1\"\">FOCO+</a>");
         client.println("<a href=\"/?foco2\"\">FOCO-</a>");

         client.println("</BODY>");
         client.println("</HTML>");

         delay(100);
         //stopping client
         client.stop();
 
 
 

         ///////////////////// control arduino pin

   
         if(readString.indexOf("up") >0)  { pulseWidthv = pulseWidthv - turnRatev; }
         if(readString.indexOf("mid") >0)   { pulseWidthv = centerServov; }
         if(readString.indexOf("down") >0)  { pulseWidthv = pulseWidthv + turnRatev; }
         
           if (pulseWidthv > maxPulsev) { pulseWidthv = maxPulsev; }
           if (pulseWidthv < minPulsev) { pulseWidthv = minPulsev; }
       
           if (millis() - lastPulsev >= refreshTimev)
           {  
           digitalWrite(5, HIGH);   // start the pulse  
           delayMicroseconds(pulseWidthv);  // pulse width  
           digitalWrite(5, LOW);    // stop the pulse  
           lastPulsev = millis();
         }         // save the time of the last pulse  
       
       
         if(readString.indexOf("zoom1") >0)
         {
           digitalWrite(7, HIGH);
           delay (300);
           digitalWrite (7, LOW);                
           Serial.println("Zoom+");
         }
                   
         if(readString.indexOf("zoom2") >0)
         {
           digitalWrite(8, HIGH);
           delay (300);
           digitalWrite (8, LOW);            
           Serial.println("Zoom-");
         }
         
         if(readString.indexOf("foco1") >0)
         {
           digitalWrite(2, HIGH);
           delay (300);
           digitalWrite (2, LOW);            
           Serial.println("Foco+");
         }
         
         if(readString.indexOf("foco2") >0)
         {
           digitalWrite(3, HIGH);
           delay (300);
           digitalWrite (3, LOW);          
           Serial.println("Foco-");
         }
         
         //clearing string for next read
         readString="";


//break;
         }
     }
  }
}
}    


Gracias y un saludo

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy