Pages: [1] 2   Go Down
Author Topic: far muovere un servo un grado alla volta ad ogni pressione  (Read 1077 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Premettendo che non ho molta esperienza con la programmazione, vorrei far muovere il mio servomotore un grado alla volta ogni volta che premo un bottone.
Mi spiego meglio, tutte le volte che premo il bottone deve aumentare di un grado o alla pressione di un secondo bottone diminuire di un grado, però quando lo tengo premuto questo continui ad aggiungere 1 e ad aumentare o diminuire.
Magari se per fare ciò servono due programmi ( uno che ad ogni pressione aumenti di uno, ed un'altro che finchè premo questo ruota) mi piacerebbe che qualche buon anima riuscisse a spiegarmi le differenze.
Io fin ora ho pensato di usare un' if che quando il bottone viene premuto scriva pos = pos + 1 (per posizione intendo la posizione del servo), ma ho visto che non funziona e fa tutt'altro.
Ringrazio in anticipo tutti quelli che si interessano e mi danno una mano!!!
Speranzoso che qualcuno risponda presto!
« Last Edit: February 06, 2013, 11:53:12 am by Ferro » Logged

0
Online Online
Shannon Member
****
Karma: 117
Posts: 10105
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

posta il codice!!!
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
#include <PS2X_lib.h>  //for v1.6
#include <Servo.h>
PS2X ps2x; // create PS2 Controller Class

Servo myservo;
Servo myservo2;
int error = 0;
int pos;


void setup(){
 Serial.begin(57600);

 //CHANGES for v1.6 HERE!!! **************PAY ATTENTION*************
 
  error = ps2x.config_gamepad(6,10,9,11, true, true);   //setup pins and settings:  GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error
  myservo.attach(2);
 
}
 void loop() {
   
   ps2x.read_gamepad();         
     if( ps2x.ButtonPressed(PSB_BLUE)){
       pos = pos + 1;
   myservo.write(pos);
   delay(15);
     }
       if( ps2x.ButtonPressed(PSB_PINK)){
       pos = pos - 1;
   myservo.write(pos);
   delay(15);
       }
 }
     
Lascia perdere i codici del mio joystick  smiley-sweat lo controllo tramite il mio controller wireless della play station 2 ma fai finta che sono 2 bottoni normalissimi! lui li vede come tali! come se dico button = HIGH per intenderci...
il mio problema è che non riesco a fargli fare una cosa come: mettiamo caso che si trova a 20 gradi, io voglio che premendo un bottone aggiunga, che ne so, +10 gradi! e passi a 30 poi ripremendo a 40 e con un'altro bottone invece di fare la somma faccia la sottrazione dei 10!
Logged

0
Online Online
Shannon Member
****
Karma: 117
Posts: 10105
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

il codice va bene ma devi fare attenzione che pos sia sempre compreso tra 0 e 360.

in oltre delay(15); mi sembrano pochi, (15 millisecondi, la reazone umana si aggira sui 100, fai conto che 30ms sono la durata di un frame di un video a 30FPS, ovvero la TV più o meno)
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho fatto varie prove di velocità cambiando il ritardo e ho messo quella più normale che non fosse troppo veloce ma neanche troppo lenta, i miei sono servi che hanno valori da 0 a 180 non sono a giro.
Quote
il codice va bene ma devi fare attenzione che pos sia sempre compreso tra 0 e 360.
Cosa intendi? Che devo scrivergli nel programma che il valore pos è compreso tra 0 e 180 nella parentesi dell'if?
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

aaaah che tu intendessi che se il ritardo è molto basso non ho nemmeno il tempo di premere il bottone?! ok ora ho capito cosa intendevi, il problema è che anche con un ritardo di un secondo mi fa la stessa cosa, cioè: sia che io premo un bottone sia che premo l'altro parte e va a zero, come se gli dicessi di andare al valore zero.
Non riesco a capire il motivo smiley-neutral .
Logged

0
Online Online
Shannon Member
****
Karma: 117
Posts: 10105
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Cosa intendi? Che devo scrivergli nel programma che il valore pos è compreso tra 0 e 180 nella parentesi dell'if?

sì, in realtà esiste una funzione constrain(x, min, max) (vedi il reference: http://arduino.cc/en/Reference/Constrain) che fa tutto con una chiamata sola.

in pratica se non fai questo controllo prima, rischi di dare alla write del servo un valore grandissimo o piccolossimo (compreso tra -32768 e +32766, i limiti della variabile int), e capisci che sia normale che il tuo povero servo non capisca una mazza di cosa deve fare  smiley-grin
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 7
Posts: 2961
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ma il servo come lo alimenti? che servo è?
hai provato a sostituire il tasto "remoto" con un normale tasto? (solo per debug)
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Anche se inserisco il comando che mi hai detto non funziona il risultato é uguale smiley-sad .
É un semplice microservo da 180°, alimentato esternamente a 5V Siccome può lavorare da 4.5V a 6V.
Logged

0
Online Online
Shannon Member
****
Karma: 117
Posts: 10105
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

codice? come alimenti il servo? come alimenti arduino? hai provato a collegare il + e - del servo ad una batteria esterna, e il - della batteria al gnd dell'arduiono? magari arduino non riesce a dare abbatanza potenza e il codice/servo impazzisce
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Il codice è sempre quello che ho già postato però ho cambiato il ritardo e inserito la cosa che mi hai scritto tu.
Il servo viene alimentato da una batteria esterna da 9 V che viene portata con un regolatore a 5V, arduino è indifferente posso alimentarlo da il pc ma anche con una batteria esterna sempre da 9V( un'altra), ho già fatto codici con i servomotori e li so utilizzare perchè con altri codidi funzionano alla perfezione.
Il problema è proprio il codice che non riesco a scrivere correttamente molto probabilmente e non so come uscirne  smiley-confuse .
Io ho pensato di assegnare al valore di pos iniziale un servo.read() così che quando va a fare  pos = pos + 1; il pos nell'operazione sia il valore che legge dal servo, peccato non sappia come scrivere il programma  smiley-roll
Logged

0
Online Online
Shannon Member
****
Karma: 117
Posts: 10105
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

coapisco che hai aggiunto solo quello che ho detto io, ma il punto è anche DOVE lo hai aggiunto smiley

sicuro di aver collegato il GND della batteria all'arduino?
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Messina (Italy)
Offline Offline
Sr. Member
****
Karma: 4
Posts: 276
Ciao a tutti!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hai provato così?

Code:
#include <PS2X_lib.h>  //for v1.6
#include <Servo.h>
PS2X ps2x; // create PS2 Controller Class

Servo myservo;
Servo myservo2;
int error = 0;
int pos;


void setup(){
 Serial.begin(57600);

 //CHANGES for v1.6 HERE!!! **************PAY ATTENTION*************
  
  error = ps2x.config_gamepad(6,10,9,11, true, true);   //setup pins and settings:  GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error
  myservo.attach(2);
  
}
 void loop() {
  
   ps2x.read_gamepad();          
     if( ps2x.ButtonPressed(PSB_BLUE) && pos>=0 && pos <=180){
       pos = pos + 1;
   myservo.write(pos);
   //delay(15);
while(ps2x.ButtonPressed(PSB_BLUE)){}
     }
       if( ps2x.ButtonPressed(PSB_PINK) && pos>=0 && pos <=180){
       pos = pos - 1;
   myservo.write(pos);
   //delay(15);
while(ps2x.ButtonPressed(PSB_PINK)){}
       }
 }
  
« Last Edit: February 07, 2013, 10:40:07 am by Dario Gogliandolo » Logged

Video demonstration of my Dashboard OBDII -> http://goo.gl/m8Pqp

0
Online Online
Shannon Member
****
Karma: 117
Posts: 10105
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

che motivo ha il delay se poi fai while(ps2x.ButtonPressed(PSB_BLUE)){}?

non ti assicuri che val sia un valore valido, vedi qualche messaggio fa

IDENTARE IL CODICE! CTRL+T sull'ide, et voilà... (almeno prima di postare... poi come scrivete per i cavoli vostri sono cavoli vostri)
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Messina (Italy)
Offline Offline
Sr. Member
****
Karma: 4
Posts: 276
Ciao a tutti!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

non ti assicuri che val sia un valore valido, vedi qualche messaggio fa

si me ne sono accorto dopo, l'ho corretto mentre scrivevi...

IDENTARE IL CODICE! CTRL+T sull'ide, et voilà... (almeno prima di postare... poi come scrivete per i cavoli vostri sono cavoli vostri)

l'ho modificato da qua stesso, senza passare dall'ide, in ogni caso non sapevo questa cosa... adesso che lo so starò più attento...  smiley-sweat
Logged

Video demonstration of my Dashboard OBDII -> http://goo.gl/m8Pqp

Pages: [1] 2   Go Up
Jump to: