Go Down

Topic: Controllo servo da tastiera Processing/Arduino (Read 7089 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

Cannizzofra

Ciao io sono Francesco e ho 16 anni. Ti volevo dire se mi potresti aiutare. Io devo Controllare 4 Servo motori con una Tastiera 4 per 4. Ed esempio premo il numero uno e gira il servo A. Se perfavore mi potresti aiutare mi sarebbe utlie.

gpb01

#8
Jun 06, 2018, 09:11 pm Last Edit: Jun 07, 2018, 06:50 am by gpb01
>Cannizzofra:

1. ultimo avvertimento prima del BAN ... devi fare quello che ti ho chiesto più volte, la prima volta  QUI.

2. Ti ho già detto di NON continare a spargere la stessa domanada su più thread, dato che, in conformità al REGOLAMENTO, punto 13, il cross-posting è proibito (anche tra lingue diverse).
Stesso avvetimento, alla prossima applico il BAN.

3. Anche questo tuo post è in violazione del REGOLAMENTO, punto 16.9. Ma non lo vedi che ti sei collegato ad un thread del 2012 e che l'utente a cui poni domande NON esiste più (Guest) ? ? ?

Attento perché NON tollererò altre violazioni al regolamento.

Guglielmo
Search is Your friend ... or I am Your enemy !

Go Up