Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Controlar servo desde PC
#1
Buenas a tod@s:

Aprovechando que estos días puedo disfrutar de tiempo libre, los invertiré para aprender un poco más, para así, el día de mañana hacer un proyecto de mayor envergadura.

Tengo pedido por eBay un sensor de ultrasonidos. Y mi idea es ponerlo encima de un servo para que vaya haciendo barridos. Y por ejemplo ponerlo en un robot para evitar obstaculos (eso a largo plazo)

De momento tengo este código hecho, que me serviría perfectamente para el proyeto que tengo, en cuanto al movimiento del servo:

Código:
#include <Servo.h>

Servo servo1;


void setup ()
{
servo1.attach(8);
}

void loop ()
{
servo1.write(0);
delay(2000);
servo1.write(45);
delay(2000);
servo1.write(90);
delay(2000);
servo1.write(135);
delay(2000);
servo1.write(179);
delay(2000);
servo1.write(135);
delay(2000);
servo1.write(90);
delay(2000);
servo1.write(45);
delay(2000);

}

Siempre quiero ir un paso más allá. Y el paso que quiero dar es poder indicar a que grados quiero situar el servo mediante el teclado numérico del PC. O bien, desplazarlo ya sea a derecha o izquierda mediante las flechas del teclado (con pulsos).

La verdad es que aquí es donde estoy encallado, ya que los tutoriales que he visto utilizan una interface (processing), que desconozco y me gustaría hacerlo sin esta interface, simplemente desde el pc.

Supongo que con el monitor serie se podría hacer algo, no?

De momento intentaré probar cositas a ver qué tal.

Muchas gracias de antemano
Citar
#2
Has probado a poner otro valor de angulo aparte de 0?
Citar
#3
Buenas a tod@s:

De momento, con el monitor serie he conseguido añadirle, al codigo anterior, que cuando pulse "1", se mueva al centro el servo. El problema es que lo hace una vez termina el ciclo. Me gustaría que fuese imediato y no tener que esperar a que termine.

Código:
#include <Servo.h>

Servo servo1;


void setup ()
{
servo1.attach(8);
Serial.begin(9600);    // Comienza la comunicación de Arduino con la PC
  delay(1000);
}

void loop ()
{
if (Serial.available()){
  int val = Serial.read();
  if (val =='1'){
    servo1.write(90);
    delay(2000);
  }
}
  else {
servo1.write(0);
delay(2000);
servo1.write(45);
delay(2000);
servo1.write(90);
delay(2000);
servo1.write(135);
delay(2000);
servo1.write(179);
delay(2000);
servo1.write(135);
delay(2000);
servo1.write(90);
delay(2000);
servo1.write(45);
delay(2000);
servo1.write(0);
delay(2000);
  }
}


Como se programaría entonces?
Citar
#4
Una vez que entra en el else, no tene forma de salirse del mismo, hasta que acaba la rutina, entonces ya si que si val == 1, vuelve a la posicion inicial, tendria que preguntar por val a medida que vas ejecutando los giros del servo. Sin contar que cuando estas en un delay, el micro no atiende a nada
Citar
#5
Triggerr escribió:Una vez que entra en el else, no tene forma de salirse del mismo, hasta que acaba la rutina, entonces ya si que si val == 1, vuelve a la posicion inicial, tendria que preguntar por val a medida que vas ejecutando los giros del servo. Sin contar que cuando estas en un delay, el micro no atiende a nada

Buenas a tod@s:

De acuerdo Mola

Muchas gracias
Citar
#6
Buenas a tod@s:

Ahora lo he probado y funciona a la perfección. La verdad es que es una solución simple y eficaz, no sé como no se me habrá ocurrido antes. Facepalm

Ahora solo queda instalarle el sensor encima y configurarlo para que vaya barriendo los 180º y así tener más campo visual.

El problema me imagino que será como decirle donde están los objetos y en qué dirección, ya que si se mueve en un campo de 180º... Bueno... pues ahora a investigar como decirle en qué posición estaba cuando lo detectó y por lo tanto, decidir en qué dirección se tiene que mover....

Poco a poco.
Citar
#7
Usa un for por ejemplo o un If que le vas sumando valores a una variable "Angulo" y cuando detecte algo, paras y lees esa variable, asi sabes el angulo.

Dale caña a ese ardu¡¡
Citar
#8
Como ayudan esos delay en nuestros inicios, y que malos son a la hora de hacer cosas un poco más complejas.... xD

Escapa de los delay! es como si congelaras el procesador ese tiempo, es de lo peor que puedes hacer Mola

Revisa el ejemplo swipe de la librería servo, y verás una forma de moverlo mucho más fluida. Hay veces que no queda más remedio que un delay, por ej si tienes que esperar para iniciar una comunicación, aunque practicamente el 99% de los casos se puede resolver con milis

Código:
#include <Servo.h>

Servo myservo;  // create servo object to control a servo
                // twelve servo objects can be created on most boards

int pos = 0;    // variable to store the servo position

void setup()
{
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}

void loop()
{
  for(pos = 0; pos <= 180; pos += 1) // goes from 0 degrees to 180 degrees
  {                                  // in steps of 1 degree
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
  for(pos = 180; pos>=0; pos-=1)     // goes from 180 degrees to 0 degrees
  {                                
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
}
Citar
#9
+∞ a lo de los delays que dice BIKE, procura no usarlos

Cuando aprendes a manejarte con millis(), no tienes problema.

Los delays() suelen estar implementados con NOP, que tiene parado el micro en un while.....
Citar
#10
revisa este proyecto, te puede dar algunas ideas Guiño

http://www.instructables.com/id/How-To-M.../?ALLSTEPS

http://forum.arduino.cc/index.php/topic,196387.0.html

o una búsqueda por sweep servo ping también te devolverá muchos resultados con ayuda, ya que es uno de los abc en la robótica.

Suerte con el proyecto y esperamos avances!
Citar
#11
Revisando el evernote que tengo guardados varios ejemplo te dejo este Guiño
Código:
#include <Servo.h>

Servo myservo;

int pos = 0;
int a;


void setup() {
  Serial.begin(9600);
  myservo.attach(31);

}

char cadena[24];
byte contador=0;
int valor = 0;
void loop(){






  for(a; a<1; a++){
    Serial.print("Introduzca posicion de servo :");
  }


  if(Serial.available()){
    memset(cadena, 0, sizeof(cadena));




    while (Serial.available()>0){
      delay(5);
      cadena[contador]=Serial.read();
      contador++;

    }
    valor=atoi(cadena);
    valor = min(valor, 180);       //establece valor maximo
    valor = max(valor, 0);          //establece valor minimo
    Serial.print(valor);               //imprime en pantalla el valor introducido
    Serial.println(" grados");
    myservo.write(valor);           //establece el valor como posicion myservo
    a=0;                                    //reiniciamos a para volver a mostrar aviso para introduccion de datos
    contador=0;


    delay(100);    
  }
}
Citar


Temas similares...
Tema Autor Respuestas Vistas Último mensaje
  Controlar dos o tres cartuchos calefactores Shikva 1 415 23-09-2019, 07:23 AM
Último mensaje: bertonic
  CONTROLAR CUATRO TIRAS LED WS2812B CON ARDUINO NAVIDADES MAFALDA74 10 1,018 28-03-2019, 08:44 AM
Último mensaje: shiryou
  CONSULTA Controlar bucle con un final de carrera polu2 10 467 15-03-2019, 10:16 PM
Último mensaje: Triangulo
  CONSULTA Re: Arduino Mega, 1 servo ,1 nema, 3 motor DC carlos hop 8 867 26-09-2018, 01:30 PM
Último mensaje: Shellmer
  CONSULTA Controlar 3000 leds, ¿cual es la mejor opcion? the_feti 2 556 13-08-2018, 10:00 PM
Último mensaje: the_feti