Pages: [1]   Go Down
Author Topic: Duda Con Servos  (Read 1471 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 44
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Donostia
Offline Offline
God Member
*****
Karma: 3
Posts: 743
elektronikadonbosco
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 44
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 40
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
   

#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);
    }
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 40
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
/*
 * 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/


Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
/*
  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
« Last Edit: October 10, 2012, 04:03:01 am by trescuernos » Logged

Pages: [1]   Go Up
Jump to: