Pages: [1]   Go Down
Author Topic: Controllo servo da tastiera Processing/Arduino  (Read 2289 times)
0 Members and 1 Guest are viewing this topic.
The world
Offline Offline
Newbie
*
Karma: 1
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Marche
Offline Offline
Edison Member
*
Karma: 34
Posts: 2276
azioni semplici per risultati complessi
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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
« Last Edit: September 06, 2012, 02:12:39 pm by Pelletta » Logged

The world
Offline Offline
Newbie
*
Karma: 1
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie mille, sei stato illuminante!!!!  smiley

funziona benissimo!

Adesso studierò come velocizzare il movimento....

Grazie ancora,  ciao
                       
Logged

The world
Offline Offline
Newbie
*
Karma: 1
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley

Arduino:
Code:
#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:
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
Logged

Torino
Offline Offline
God Member
*****
Karma: 3
Posts: 766
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Marche
Offline Offline
Edison Member
*
Karma: 34
Posts: 2276
azioni semplici per risultati complessi
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

The world
Offline Offline
Newbie
*
Karma: 1
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Grazie per i suggerimenti, vi farò sapere  smiley-lol

Ciao
Logged

Pages: [1]   Go Up
Jump to: