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

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/



#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