Controllo servo da tastiera Processing/Arduino

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. :blush:

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);

}
}

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.

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

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

funziona benissimo!

Adesso studierò come velocizzare il movimento....

Grazie ancora, ciao

Credevo di aver risolto tutto..... ma mi sbagliavo. :cold_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 :slight_smile:

Arduino:

#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:

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

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.

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... :zipper_mouth_face: segui i suggerimenti e vedrai che quando funzionerà tutto ti sentirai più soddisfatto

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

Grazie per i suggerimenti, vi farò sapere XD

Ciao

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.

>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