Go Down

Topic: Problema Arduino uno R3 e sensori di flessione (Read 14587 times) previous topic - next topic

PaoloP

Quote
252
Pollice --> Min: 244  Max: 252
233
Indice --> Min: 233  Max: 330
166
Medio --> Min: 105  Max: 255
298
Anulare --> Min: 153  Max: 326
309
Mignolo --> Min: 271  Max: 312
309


Da questi valori non che l'escursione è molto piccola.
Hai esteso e richiuso completamente la mano mentre scorrevano i numeri?

Comunque, se quei valori sono giusti, li devi usare per la funzione map.
per ogni dito avrai
Code: [Select]
gradi = map(val, minimo valore registrato, massimo valore registrato, 0, 180);
servo1.write(gradi);


ovvero
Code: [Select]
gradi = map(val, 244, 252, 0, 180);
servo1.write(gradi);


Una volta sistemati il minimo e massimo dei sensori nella funzione map, devi sistemare il minimo e il massimo dei servi.
I servi che escursione hanno in gradi (non ho potuto vedere il filmato perche non ho il codec giusto, stanotte a casa lo guardo) 90°, 120° o 180°

Dai che passo passo risolviamo.  :smiley-mr-green:



Etemenanki

Giusto per curiosita', a livello hardware che sensori usi ?
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

-DATA-

il range è di 180 gradi. spero di risolvere in fretta domani ho un video musicale da girare te ne sarei grato  :smiley-mr-green:

-DATA-


Giusto per curiosita', a livello hardware che sensori usi ?

http://www.robot-italy.com/it/flex-sensor-2-2.html utilizzo questi
XD

PaoloP

I sensori li hai collegati direttamente o sono amplificati come consiglia il datasheet?

Puoi riprovare il mio sketch (quello senza i servo) per vedere il massimo e i minimi che ricavi.
Apri prima il serial monitor e muovi un paio di volte la mano estentendola al massimo e poi richiudendola.
Poi sul serial monitor blocca lo scorrimento automatico e copia gli ultimi valori.

Se l'escursione dei sevi è di 180, i parametri per map sono 0 e 180, quindi bisogna solo stabilire i limiti dei sensori.

Etemenanki

#20
Sep 03, 2013, 07:38 pm Last Edit: Sep 03, 2013, 07:50 pm by Etemenanki Reason: 1
Quelli vanno bene ... mi era venuto il dubbio che stessi usando delle strip piezoplastiche, che non sarebbero state adeguate ;)

Collegandoli, a che valori fai riferimento ? ... secondo il datasheet, la resistenza dovrebbe andare da 45K a 125K (massimo), quindi per avere la massima escursione possibile senza amplificarli, la resistenza di riferimento dovrebbe essere intorno ai 75K, o il valore piu vicino disponibile (supponendo che tu li usi connessi ad un pin analogico, sensore verso massa e riferimento verso il +5V ... oppure sensore verso il +5V e riferimento a massa)

Se hai un tester, puoi anche fare una prova per vedere se vanno ... collega una strip in serie ad una resistenza (anche 68K o simile) e collega la serie ad un'alimentatore da 5V (resistenza al +5V, strip a massa), poi leggi con il tester la tensione fra la massa ed il punto centrale della serie (ai capi della strip, in pratica) ... in teoria, dovrebbe darti valori simili a 2V (circa, disteso) e 3.3V (circa, flesso) ... oppure collegando la resistenza a massa e la strip al +5V, e misurando ai capi della resistenza, dovrebbe andare da 3V (circa, disteso) a 1,8 (circa, flesso) ... valori comunque sufficenti per essere letti comodamente da un'ingresso da 100Mohm come quelli analogici di arduino senza problemi ...
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

-DATA-

grazie a tutti per i suggerimeti sto cercando di ricostruire il guanto con sensori per il semplice motivo che chiudere il medio senza chiudere le altre dita mi rusulta un po difficile con il tipo di guanto che ho creato  e potrebbe essere anche il gaunto a flettere i sensori involontariamente .

credo di avere creato un circuito ulito, senza  errori anche perhè priam di fare tutto ciò ho testato il tutto con una breadboard e il risultato era dei piu puliti, spero che rifacendo il guanto sistemerò un po di cose....


piu tardi, una volta finito vi informerò di come prosegue il progetto. grazie ancora

MrJacko

#22
Sep 03, 2013, 08:39 pm Last Edit: Sep 03, 2013, 09:21 pm by MrJacko Reason: 1
Io farei che appena avviato l'Arduino si avvia una funzione per determinare i valori Min e Max di ogni sensore e quindi di ogni dito, in automatico.
Basta aggiungere un pulsante e fare una sequenza del genere:
-Avvio Arduino.
-Posizioni il primo dito scelto (Es. il pollice) alla apertura massima.
-Premi il pulsante.
-Posizioni il primo dito scelto (Es. il pollice) alla chiusura massima.
-Premi il pulsante.
E così via per ogni dito, almeno hai la certezza che la mano robotica si muova precisamente rispetto alla mano reale :)

EDIT: ecco un probabile sketch, non sono certo al 100% del funzionamento poichè in questi giorni sto facendo una grande confusione tra linguaggi di programmazione differenti..XD
Code: [Select]
#include <Servo.h>
unsigned const int buttonPin = 7;
unsigned const int flexPin[5] = {
  A5, A4, A3, A2, A1};
unsigned int flexMin[5];
unsigned int flexMax[5];
String flexName[5] = {
  "Pollice", "Indice", "Medio", "Anulare", "Mignolo"};
Servo servo[5];
unsigned const int servoPin[5] = {
  6, 5, 4, 3, 2};
unsigned int val;

void setup()
{
  Serial.begin(9600);
  for(unsigned int x=0; x<5; x++){
    servo[x].attach(servoPin[x]);
  }
  setThreshold();
}

void loop()
{
  for(unsigned int  x=0; x<5; x++){
    val = analogRead(flexPin[x]);
    val = constrain(val, flexMin[x], flexMax[x]);
    val = map(val, flexMin[x], flexMax[x], 0, 180);
    servo[x].write(val);
  }   
}

void setThreshold(){
  for(int x=0; x<5; x++){
    Serial.print("Scansione soglie valori per: ");
    Serial.println(flexName[x]);
    Serial.print("Soglia minima sensore: ");
    while(digitalRead(buttonPin)!=HIGH){
      flexMin[x] = analogRead(flexPin[x]);
    }
    Serial.println(flexMin[x]);
    Serial.print("Soglia massima sensore: ");
    delay(750);
    while(digitalRead(buttonPin)!=HIGH){
      flexMax[x] = analogRead(flexPin[x]);
    }
    Serial.println(flexMax[x]);
    delay(1000);
  }
  Serial.println();
  Serial.println("Soglie valori registrate con successo.");
  Serial.println();
}

Che ne dite?

PaoloP

#23
Sep 03, 2013, 09:41 pm Last Edit: Sep 03, 2013, 09:44 pm by PaoloP Reason: 1
Buona idea Jacko.  ;)
Però in quel modo li devi registrare ogni volta che accendi o resetti l'arduino.

MrJacko

#24
Sep 03, 2013, 09:54 pm Last Edit: Sep 03, 2013, 09:58 pm by MrJacko Reason: 1

Buona idea Jacko.  ;)
Però in quel modo li devi registrare ogni volta che accendi o resetti l'arduino.

Almeno elimini tutti i probabili errori..
Metti caso che i sensori di flessione non siano ancorati saldamente al guanto: se si usasse un valore preimpostato e un sensore si spostasse, anche di poco, influenzerebbe il risultato totale.
Potremmo ottenere una via di mezzo scrivendo i valori nella EEPROM, in questo modo i valori rimangono fino a quando non li vuoi reimpostare manualmente, ma non ho mai utilizzato quella libreria per il momento XD
EDIT: ora che ci penso si potrebbe fare che registri tutte le soglie minime insieme, lo stesso per quelle massime..bisogna sentire prima il parere del diretto interessato XD

-DATA-

ringrazio tutti per il tepo dedicatomi siete fantastici e l'idea  di jako mi piace molto magari potrei utilizzarla in una rev 2 del mio progetto :smiley-mr-green: con il nuovo guanto sono riuscito a sistemare un bel po' di cose e il movimento risulta molto piu fluido e preciso.
l'unica pecca è che spesso perde la connessione e crasha, un bel po' fastidioso. se qualcuno magari riuscisse a dedicarsi escovasse una soluzione a questo ne sarei molto grato   ;) :smiley-yell:

ciaooooooo  :D :D :D :D :D

PaoloP

Il motivo dei crash può essere dovuto ad una eccessiva richiesta di corrente dai servo.
Non ricordo se hai detto se l'alimentazione dei servi è esterna o è prelevata da Arduino.

Potresti postare lo sketch che stai utilizzando adesso?

-DATA-


Il motivo dei crash può essere dovuto ad una eccessiva richiesta di corrente dai servo.
Non ricordo se hai detto se l'alimentazione dei servi è esterna o è prelevata da Arduino.

Potresti postare lo sketch che stai utilizzando adesso?


il mio sketch attuale:
Code: [Select]
#include <Servo.h>

// Dichiarazione servo
Servo servo1; 
Servo servo2; 
Servo servo3;
Servo servo4;
Servo servo5;
int flex1 = 5;  // ingresso analogico per sensori di flessione
int flex2 = 4;
int flex3 = 3;
int flex4 = 2;
int flex5 = 1;
int val;         // lettura valori sensori
void setup()
{
  Serial.begin(9600);  //connessione pc e arduino
  servo1.attach(6);  //  pollice
  servo2.attach(5);  // indice
  servo3.attach(3);  //medio
  servo4.attach(4);  //anulare
  servo5.attach(2); //mignolo
}

void loop()
{
  val = analogRead(flex1);              // valore sensore letto e appreso                  POLLICE
  Serial.println(val);                           // elaorazione valore sensore
  val = map(val, 50, 600, -150, 600);     // scala parametri sensori servo
  servo1.write(val);                        // lettura parametri
  delay(15);                           
  val = analogRead(flex2);             
  Serial.println(val);                     
  val = map(val,50, 300, -300, 200);                                                      //INDICE   
  servo2.write(val);                       
  delay(15);       
  val = analogRead(flex3);               
  Serial.println(val);                 
  val = map(val, 50, 100, 0, 800); //.................................................  MEDIO
  servo3.write(val);                   
  delay(15); 
  val = analogRead(flex4);             
  Serial.println(val);                 
  val = map(val, 50, 500, -250, 600);                                                      //ANULARE
  servo4.write(val);                   
  delay(15); 
  val = analogRead(flex5); 
  Serial.println(val);                 
  val = map(val, 50, 300, -150, 600); //.................................................  MIGNOLO
  servo5.write(val);                   
  delay(15); 
}


utilizzo un alimentatore da 12v che è inserito nel l'arduino + cavo usb inserito anch'esso nell'arduino. questo lo faccio perchè alimentando tutto tramite solo alimetatore esterno mi crasha subito alimentando il tutto tramite usb mi crasha ancora prima hahahhahaha penso che insieme, usb e alimntatre riescano a generarmi energia sufficente per muovere tutto in maniera quasi pulita pur essendoci qualche crash.

PaoloP

Ho visto il filmato, bella la manina  :smiley-mr-green:
Il limite minimo e massimo dei servi sono 0 e 180, li puoi limitare anche con la funzione costrain.
Devi stabilire con lo sketch che ti ho proposto il minimo e il massimo di ogni dito (valori del sensore) da mettere nella funzione map e li inserisci in questo sketch modificando i valori attuali.

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

// Dichiarazione servo
Servo servo1;  
Servo servo2;  
Servo servo3;
Servo servo4;
Servo servo5;

int flex1 = 5;  // ingresso analogico per sensori di flessione
int flex2 = 4;
int flex3 = 3;
int flex4 = 2;
int flex5 = 1;
int val;         // lettura valori sensori

void setup()
{
 Serial.begin(9600);  //connessione pc e arduino
 servo1.attach(6);  //  pollice
 servo2.attach(5);  // indice
 servo3.attach(3);  //medio
 servo4.attach(4);  //anulare
 servo5.attach(2); //mignolo
}

void loop()
{
 val = analogRead(flex1);                // valore sensore letto e appreso                  POLLICE
 Serial.println(val);                        // elaorazione valore sensore
 val = map(val, 50, 600, 0, 180);     // Verificare minimo e massimo del sensore del dito POLLICE
 val = costrain(val, 0, 180);            // impedisce fuoricorsa  
 servo1.write(val);                        // lettura parametri
 delay(15);                          
 
 val = analogRead(flex2);              
 Serial.println(val);                      
 val = map(val,50, 300, 0, 180);    // Verificare minimo e massimo del sensore del dito INDICE    
 val = costrain(val, 0, 180);          // impedisce fuoricorsa    
 servo2.write(val);                      
 delay(15);      
 
 val = analogRead(flex3);              
 Serial.println(val);                  
 val = map(val, 50, 100, 0, 180);  // Verificare minimo e massimo del sensore del dito  MEDIO
 val = costrain(val, 0, 180);         // impedisce fuoricorsa      
 servo3.write(val);                    
 delay(15);  
 
 val = analogRead(flex4);              
 Serial.println(val);                
 val = map(val, 50, 500, 0, 180);       // Verificare minimo e massimo del sensore del dito ANULARE
 val = costrain(val, 0, 180);              // impedisce fuoricorsa        
 servo4.write(val);                    
 delay(15);  
 
 val = analogRead(flex5);  
 Serial.println(val);                
 val = map(val, 50, 300, 0, 180); // Verificare minimo e massimo del sensore del dito  MIGNOLO
 val = costrain(val, 0, 180);             // impedisce fuoricorsa    
 servo5.write(val);                    
 delay(15);  
}



MrJacko

#29
Sep 04, 2013, 10:59 am Last Edit: Sep 04, 2013, 11:00 am by MrJacko Reason: 1
Senza che gli si riempie il monitor seriale di valori può utilizzare lo sketch che ho scritto che è più "user-friendly" :)
P.S. per collegare un pushbutton al pin 7 non ci vuole molto :D
EDIT: perchè non usate degli array? D:

Go Up