Dado da gioco virtuale

Salve a tutti,

vorrei realizzare un dado da gioco con arduino.

Sto utilizzando Arduino Uno con un magnetometro(HMC5883L), quando il sistema sarà funzionante, utilizzerò arduino mini in modo da avere dimensioni meno ingombranti e metterò il tutto all'interno di un dado da gioco stampato in 3D.

L'idea è quella di lanciare il sistema Arduino+magnetometro e leggere dal serial monitor il numero che esce.

Qualcuno sa aiutarmi?

vin89: Salve a tutti,

vorrei realizzare un dado da gioco con arduino.

Sto utilizzando Arduino Uno con un magnetometro(HMC5883L), quando il sistema sarà funzionante, utilizzerò arduino mini in modo da avere dimensioni meno ingombranti e metterò il tutto all'interno di un dado da gioco stampato in 3D.

L'idea è quella di lanciare il sistema Arduino+magnetometro e leggere dal serial monitor il numero che esce.

Qualcuno sa aiutarmi?

vedrei meglio del magnetometro un aceleromettro a 3 assi. è meno influenzato da campi magentici e percui piú affidabile nel riconoscimento della posizione. Non ho capito come vuoi spedire la posizione al PC. Tieni un cavo attacato? Sappi anche che il dado deve essere ben equilibrato per non far uscire certi numeri piú spesso di altri.

Ciao Uwe

Non comprendo perché vuoi usare un sensore magnetico al posto di un più semplice ed economico sensore di movimento: https://www.futurashop.it/index.php?route=product/product&path=4009_921&product_id=1373

uwefed, hai perfettamente ragione! Seguendo il tuo consiglio sono passato ad utilizzare un accelerometro+giroscopio a tre assi
" MPU6050 ".

La posizione del mio dado, in questa fase iniziale, vorrei vederla attraverso il serial monitor. Più avanti vorrei inviarla tramite bluetooth ad un altro Arduino con shield ethernet che mi twitta il numero della faccia del dado (da 1 a 6 )che è uscito.

Nella fase iniziale di questa mia idea vorrei concentrarmi soltanto sul riuscire, grazie all’aiuto dell’ MPU6050 ad individuare la posizione del mio dado e quindi a visualizzare sul serial monitor il numero della faccia del dado, dopo che è stato lanciato ed è perfettamente fermo su un tavolo.

Cercando in rete ho trovato qualche sketch che potrebbe essermi utile facendo un paio di modifiche ma viene usata la libreria
I2Cdev.h” che mi da qualche problema, come vedete dalla schermata che vi ho allegato.
Leggendo in giro ho capito che è un problema dovuto alla mia versione di Arduino 1.0.5 ma passando alla 1.0.1 il risultato non cambia.

La libreria I2Cdev.h l’ ho reperita all’indirizzo :i2cdevlib/Arduino/MPU6050 at master · jrowberg/i2cdevlib · GitHub

Vi ringrazio per la vostra cortese attenzione!

Ho abbandonato l'accelerometro e sono passato ai sensori di tilt. Con un solo sensore tilt non ho problemi. I problemi arrivano quando utilizzo tre sensori di tilt ogniuno per ogni asse(x,y,z)

Il mio setup è: Aruino Uno Tre sensori di tilt (inclinati ogniuno secondo un asse)

Ecco il codice:

/* Tilt Sensor
 *Vincenzo Motta  
 *
 */

int inPin1 = 5;         // the number of the input pin
int inPin2 = 6;
int inPin3 = 7;

int outPin1 = 13;
int outPin2 = 12;
int outPin3 = 11;

int LEDstate1 = HIGH;      // the current state of the output pin
int LEDstate2 = HIGH;
int LEDstate3 = HIGH;

int reading1;           // the current reading from the input pin
int previous1 = LOW;    // the previous reading from the input pin

int reading2;
int previous2 = LOW;

int reading3;
int previous3 = LOW;


// the follow variables are long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long time1 = 0;         // the last time the output pin was toggled
long debounce1 = 50;   // the debounce time, increase if the output flickers

long time2 = 0;         
long debounce2 = 50; 

long time3 = 0;         
long debounce3 = 50;   



void setup()
{
  
  Serial.begin(9600); 
  
  pinMode(inPin1, INPUT);
  digitalWrite(inPin1, HIGH);   // turn on the built in pull-up resistor
  pinMode(inPin2, INPUT);
  digitalWrite(inPin2, HIGH);   // turn on the built in pull-up resistor
  pinMode(inPin3, INPUT);
  digitalWrite(inPin3, HIGH);   // turn on the built in pull-up resistor
  
  pinMode(outPin1, OUTPUT);
  pinMode(outPin2, OUTPUT);
  pinMode(outPin3, OUTPUT);



}

void loop()
{
 int detect_a=digitalRead(inPin2);
 int detect_b=digitalRead(inPin3);
 int detect_c=digitalRead(inPin1);
 int detect_d=digitalRead(inPin3);
 int detect_e=digitalRead(inPin1);
 int detect_f=digitalRead(inPin2);

  if(  detect_a==LOW  &&   detect_b==LOW ) { unosei(); }
  if(  detect_c==LOW  &&   detect_d==LOW ) { duecinque(); }
  if(  detect_e==LOW  &&   detect_f==LOW ) { trequattro(); }
  
/***decommentare per controllo***/ 

//unosei();
//duecinque();
//trequattro();

/****************************/
}

void unosei()
{
  int switchstate1;
  reading1 = digitalRead(inPin1);

  // If the switch changed, due to bounce or pressing...
  if (reading1 != previous1) {
    // reset the debouncing timer
    time1 = millis();
  } 

  if ((millis() - time1) > debounce1) {
     // whatever the switch is at, its been there for a long time
     // so lets settle on it!
     switchstate1 = reading1;

     // Now invert the output on the pin13 LED
    if (switchstate1 == HIGH){
      LEDstate1 = LOW;
      Serial.println("1");
      //Serial.print("Not Tilted\n "); 
  }
    else{
      LEDstate1 = HIGH;
      Serial.println("6");
      //Serial.print("Tilted\n"); 
  }
  }
  digitalWrite(outPin1, LEDstate1);

  // Save the last reading so we keep a running tally
  previous1 = reading1;
}

void duecinque()
{
  int switchstate3;
  reading3 = digitalRead(inPin3);

  // If the switch changed, due to bounce or pressing...
  if (reading3 != previous3) {
    // reset the debouncing timer
    time3 = millis();
  } 

  if ((millis() - time3) > debounce3) {
     // whatever the switch is at, its been there for a long time
     // so lets settle on it!
     switchstate3 = reading3;

     // Now invert the output on the pin13 LED
    if (switchstate3 == HIGH){
      LEDstate3 = LOW;
      Serial.println("2");
      //Serial.print("Not Tilted\n "); 
  }
    else{
      LEDstate3 = HIGH;
      Serial.println("5");
      //Serial.print("Tilted\n"); 
  }
  }
  digitalWrite(outPin3, LEDstate3);

  // Save the last reading so we keep a running tally
  previous3 = reading3;
  
}

void trequattro()
{
  int switchstate2;
  reading2 = digitalRead(inPin2);

  // If the switch changed, due to bounce or pressing...
  if (reading2 != previous2) {
    // reset the debouncing timer
    time2 = millis();
  } 

  if ((millis() - time2) > debounce2) {
     // whatever the switch is at, its been there for a long time
     // so lets settle on it!
     switchstate2 = reading2;

     // Now invert the output on the pin13 LED
    if (switchstate2 == HIGH){
      LEDstate2 = LOW;
      Serial.println("3");
      //Serial.print("Not Tilted\n "); 
  }
    else{
      LEDstate2 = HIGH;
      Serial.println("4");
      //Serial.print("Tilted\n"); 
  }
  }
  digitalWrite(outPin2, LEDstate2);

  // Save the last reading so we keep a running tally
  previous2 = reading2;
  
}