Go Down

Topic: Controllo servo da tastiera Processing/Arduino (Read 2521 times) previous topic - next topic

-Simone-

Ciao a tutti, chi avrà letto la mia presentazione saprà che da poco ho incominciato a utilizzare Arduino, perciò mi scuso fin da subito per errori magari stupidi o linguaggio poco tecnico.

Detto brevemente, il mio progetto consiste nella costruzione di un braccio meccanico a 5 gradi di libertà, con 5 servomotori comandati da pc (2 con il mouse e tre da tastiera) tramite Processing e Arduino.
Con il controllo da mouse tutto ok, il problema è il controllo da tastiera, che funziona,sì, ma non come dovrebbe.

In pratica se premo 'a' il servo svolge una rotazione completa e se premo 'd' torna indietro di 180°.
Capite anche voi che per un braccio meccanico è necessario una rotazione controllabile a seconda del tempo di premuta del pulsante. Non so se mi sono spiegato.

Ho cercato su Internet e su questo sito, ma non ho trovato niente a proposito dell'interfacciamento processing/arduino per il controllo dei servi (in modo graduale) da tastiera.

Posto qui sotto i due codici (che ho compilato io, e si vede!!! scusate gli errori...), per comodità con solo un servo controllato da 'a' e 'd'.  Credo che il problema sia nella sequenza di comandi per myservo.write in arduino....

Spero davvero possiate capire dove sto sbagliando, per me sarebbe davvero importante, grazie.  :smiley-red:

Il codice processing:

import processing.serial.*;
Serial myPort;


void setup(){
println(Serial.list());
myPort = new Serial(this, Serial.list()[0],
9600);}

void draw(){
if(keyPressed){
if(key=='a'){
myPort.write(97);
}
else{
if(key=='d'){
myPort.write(100);
}}}}


Arduino:

#include <Servo.h>

Servo myservo;
int pos = 0;

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

void loop(){
  pos=Serial.read();
  if (pos =='a'){
    myservo.write (10);
  }
  if (pos =='d'){
    myservo.write (170);

}
}

pelletta

#1
Sep 06, 2012, 09:10 pm Last Edit: Sep 06, 2012, 09:12 pm by Pelletta Reason: 1
Quando premi 'a' gli passi direttamente la posizione 97 e ovviamente il servo va soltanto a quella posizione.
Potresti usare una variabile per indicare la posizione del servo e la aumenti o decrementi ad ogni pressione dei tasti.

Code: [Select]

Arduino:

#include <Servo.h>

Servo myservo;

byte posizione = 90;// la variabile per la posizione

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

void loop()
{
 if(Serial.available())
 {
   byte pos=Serial.read();
   if (pos =='a')// se premi 'a' decrementi la variabile, sempre se non ha raggiunto il valore minimo 10
   {
     if(posizione > 10) // non deve diminuire se è 10
     {
       posizione--;
     }
   }
   else if (pos =='d')// premendo 'd' aumenti la variabile fino al valore massimo 170
   {
     if(posizione < 170) // non deve aumentare se è 170
     {
       posizione++;
     }
   }
 }
 myservo.write (posizione);
}

E' solo un'idea, non l'ho provata ma è un punto di partenza.
Ciao

-Simone-

Grazie mille, sei stato illuminante!!!!  :)

funziona benissimo!

Adesso studierò come velocizzare il movimento....

Grazie ancora,  ciao
                       

-Simone-

Credevo di aver risolto tutto..... ma mi sbagliavo. :smiley-roll-sweat:

Con un servo funziona tutto alla grande, ma poi ho provato ad aggiungere il secondo, che dovrebbe essere comandato da 'q' ed 'e'.
Il fatto è che i due servi si muovono assieme, indipendentemente dai tasti premuti, siano essi 'a','d','q' o 'e'....

Penso sia colpa del codice Arduino, devo avere sbagliato qualche connettore logico, o, più probabilmente, la variabile posizione, che non credo possa rimanere la stessa.

Sono giorni che sto studiando le guide di Arduino, ma proprio non so dove sbattere la testa!

Se qualcuno potesse individuare il problema, gliene sarei molto grato  :)

Arduino:
Code: [Select]
#include <Servo.h>

Servo myservo;
Servo myservo2;

byte posizione = 90;// la variabile per la posizione

void setup ()
{
  myservo.attach(9);
  myservo2.attach(8);
  Serial.begin(9600);
}

void loop()
{
  if(Serial.available())
  {
    byte pos=Serial.read();
    if (pos =='a')// se premi 'a' decrementi la variabile, sempre se non ha raggiunto il valore minimo 10
    {
      if(posizione > 10) // non deve diminuire se è 10
      {
        posizione--;
      }
    }
    else if (pos =='d')// premendo 'd' aumenti la variabile fino al valore massimo 170
    {
      if(posizione < 170) // non deve aumentare se è 170
      {
        posizione++;
      }
    }
  }
  myservo.write (posizione);
{
  if(Serial.available())
{ byte pos=Serial.read();
    if (pos =='q')// se premi 'a' decrementi la variabile, sempre se non ha raggiunto il valore minimo 10
    {
      if(posizione > 10) // non deve diminuire se è 10
      {
        posizione--;
      }
    }
    else if (pos =='e')// premendo 'd' aumenti la variabile fino al valore massimo 170
    {
      if(posizione < 170) // non deve aumentare se è 170
      {
        posizione++;
      }
    }
  }
  myservo2.write (posizione);
}}



Processing:

Code: [Select]
import processing.serial.*;
Serial myPort;

void setup(){
println(Serial.list());
myPort = new Serial(this, Serial.list()[0],
9600);}

void draw(){
if(keyPressed){
if(key=='a'){
myPort.write(97);
}
else{
if(key=='d'){
myPort.write(100);
}}}
if(keyPressed) {
if (key == 'q'){
myPort.write(113);
}
else {
if(key== 'e') {
myPort.write(101);
}}}}


Grazie                          Simone

tonid

Ciao,ho dato uno sguardo al codice ed ho visto che hai solo una variabile posizione ed è normale che ,visto che usi solo quella,i due servo si muovano contemporaneamente..........devi usarne due,una per il primo servo ed un'altra per il secondo servo. Poi sinceramente darei una risistemata al codice ed,io,userei lo switch case perchè secondo me il codice rimane più pulito.

pelletta

Non sempre è utile fare copia e incolla di tutto, in questo caso la seconda istruzione
if(Serial.available())
non è necessaria, idem per
if(keyPressed)
su processing.
Studiati come ti è stato suggerito la funzione switch case.
Aggiungi anche un'altra variabile per la posizione del secondo servo.
Ti ho indicato dove intervenire, stavolta niente codice... :smiley-zipper: segui i suggerimenti e vedrai che quando funzionerà tutto ti sentirai più soddisfatto

-Simone-

Ok, in questi giorni mi metterò d'impegno a studiare lo switch case!

Grazie per i suggerimenti, vi farò sapere  XD

Ciao

Go Up