Ruelta de Shots!!!!! + Corte Laser [Actualizado]

Hola a todos,
Esto del arduino es muy divertido, en este proyecto pretendo sumar tres cosas que nos encantan;

Arduino + Luces de colores + Bebidas = :sunglasses:

bueno como suena...

La idea es que a veces que me reuno con amigos, tengo una ruleta de shots... el problema es que cuando salimos a alguna fiesta no la llevamos por que se puede perder o romper... entonces me imagino hacerla como sigue;

PARTES;
Servo
Leds
Encoder
Arduino
Bateria
Pantalla LCD

SOFTWARE;
MENWIZ para el menu y configuracion

Quizas en la segunda parte agreguemos unos botones;

Ahora la idea basica;
Supongamos que las personas que quieren juagar... rodean una mesa...
entonces vamos al menu... le decimos cuantos jugadores hay de 1 a 12 digamos...

Despues de eso... usamos el encoder para "capturar" la posicion de cada uno de los participantes
De manera que corresponda con su numero de jugador.

Listo... a jugar!
Se oprime un boton ... la funcion analog read es usada para generar un numero aleatorio y este
se agrega a una o dos vueltas de la ruleta... tadaaaaaaa... Tenemos un ganador.

Bueno, les dejo algunos esquemas que he pensado...

Ire actualizando este post, en cuanto me lleguen las piezas y pueda hacer con exito un menu en menwiz.

Saludos.
-Alex.

No entiendo eso de que vas a usar analogRead() para generar un número aleatorio, es mas lógico usar random() y randomSeed(), supongo que podrías hacer lo siguiente:

#include <Servo.h>
long randNumber;
int   maxPlarers = 12; //Número de jugadores 
int   grados;
int boton = 3;

Servo ruleta;

void setup()

{
 
  randomSeed(analogRead(0));
  ruleta.attach(5);
  pinMode(boton, INPUT);

}

void loop()

{

  while(digitalRead(boton) != HIGH) {} //Espera a que pulses el botón para poner otra posición

  randNumber = random(0, maxPlayers);
  
  grados = map(randNumber, 0, maxPlayers, 0, 360); //Pasa de jugador a grados

  ruleta.write(grados);

}

Hola!
Exactamente!

Por andar a las carreras :open_mouth:

Pero si... El analog read se va a usar para una semilla del random, y es q alguna vez que hice una, sin esa parte de codigo los números son siempre los mismos.

Y si! Tienes todo el código básico ahí arriba.
La verdad no había pensado en usar map...

Supongo que ira bien!

Gracias, no olvides pasar seguido a ver que avances llevamos :smiley:

De nada :smiley:
Para mi es muy entretenido programar.

Supongo que luego le pondrás luces y sonidos y mas cosas.
Me parece un proyecto divertido.

Asi es @migarve55
Incluso ya con el menú de meinwiz se puede hacer dos o tres juegos... Y estaria suave poner un buzzer para q reproduzca un bip que vaya con la velocidad de la ruleta....

:sunglasses:
Los servos me llegan el lunes... Pero puedo ir avanzando lo demás, igual no soy muy avanzado en esto de la programación asi que cualquier sugerencia es bien recibida!!!

Saludos

Alex

Bueno ya llego el servo, es solo que lo compre a la carrera y no me habia fijado que trae una reduccion de 1/64... Y creo q va a ser muy lento para lo que necesito...
Asi que desarme una unidad floppy espero que algo de esto me sirva... estoy por hacer pruebas con estos motores a ver cual me parece mas...

Bueno pues ya encontre un ganador, a pesar de que el servo funciona con 12V corre bien a 5V mientras no se pasen de 50RPM.

Ahora he comenzado a hacer algun sketch, para ver la idea general, se los dejo aqui;

PD: Como me he quedado sin botones y me dio flojera ir a comprar mas, he usado c en el teclado para dar marcha a las funciones...

#include <Stepper.h>

const byte noise = A0; 
const byte led = 13;

int  analog_seed; 
int  random_number = 0; 
int  motor_number = 0; 


const int stepsPerRevolution = 48;  //steps per revolution
Stepper myStepper(stepsPerRevolution, 8,9,10,11);   



void setup(){
  Serial.begin(9600);
  pinMode(led, OUTPUT);     
  pinMode(noise,INPUT);   
  myStepper.setSpeed(50);
}


void loop(){
  if(Serial.available() > 0){
    if(Serial.peek() == 'c'){

      get_number_steps();
      motor_number = map(random_number, 0, 12, 0, 48); 
      myStepper.step(motor_number);      
      
      Serial.print("El paso del motor es "); Serial.println(random_number);      
      
      digitalWrite(led, HIGH); 
      
     }
  Serial.read();  
}

}





int get_number_steps(){
 analog_seed =  analogRead(noise); //gets a value between 0 and 1023
 randomSeed(analog_seed); 
 random_number = random(0,12); 
 Serial.print("El numero aleatorio es "); Serial.println(random_number); 
 return random_number;

}

Aqui la salida serial... como pueden imaginarse, algo anda medio mal... lo investigo y regreso.

El numero aleatorio es 10
El paso del motor es 10
El numero aleatorio es 4
El paso del motor es 4
El numero aleatorio es 11
El paso del motor es 11
El numero aleatorio es 9
El paso del motor es 9
El numero aleatorio es 11
El paso del motor es 11
El numero aleatorio es 6
El paso del motor es 6
El numero aleatorio es 4
El paso del motor es 4
El numero aleatorio es 2
El paso del motor es 2
El numero aleatorio es 8
El paso del motor es 8
El numero aleatorio es 3
El paso del motor es 3

Bueno, poco a poco... por el momento puede quedar asi... ya veremos si puedo agregar el menu y un char para seleccionar los numeros de jugadores.

Tiene que estar lista para este fin de semana. Asi que animo!

Bueno, resulta que nada mal con el codigo simplemente tenia mal la variable que queria imprimir.

Ahora si nos queda algo asi;

#include <Stepper.h>

const byte noise = A0; 
const byte led = 13;

int  analog_seed; 
int  random_number = 0; 
int  motor_number = 0; 


const int stepsPerRevolution = 48;  //steps per revolution
Stepper myStepper(stepsPerRevolution, 8,9,10,11);   



void setup(){
  Serial.begin(9600);
  pinMode(led, OUTPUT);     
  pinMode(noise,INPUT);   
  myStepper.setSpeed(50);
}


void loop(){
  if(Serial.available() > 0){
    if(Serial.peek() == 'c'){

      get_number_steps();
      motor_number = map(random_number, 0, 12, 0, 48); 
      myStepper.step(motor_number);      
      Serial.print("El paso del motor es "); Serial.println(motor_number);      
      digitalWrite(led, HIGH); 
     }
  Serial.read();  
}

}


int get_number_steps(){
 analog_seed =  analogRead(noise); //gets a value between 0 and 1023
 randomSeed(analog_seed); 
 random_number = random(0,12); 
 Serial.print("El numero aleatorio es "); Serial.println(random_number); 
 return random_number;

}

Y la salida del monitor serial es;

El numero aleatorio es 11
El paso del motor es 44
El numero aleatorio es 3
El paso del motor es 12
El numero aleatorio es 5
El paso del motor es 20
El numero aleatorio es 7
El paso del motor es 28
El numero aleatorio es 1
El paso del motor es 4
El numero aleatorio es 5
El paso del motor es 20
El numero aleatorio es 6
El paso del motor es 24
El numero aleatorio es 11
El paso del motor es 44
El numero aleatorio es 2
El paso del motor es 8
El numero aleatorio es 1
El paso del motor es 4
El numero aleatorio es 3
El paso del motor es 12
El numero aleatorio es 9
El paso del motor es 36
El numero aleatorio es 1
El paso del motor es 4
El numero aleatorio es 2
El paso del motor es 8
El numero aleatorio es 3
El paso del motor es 12

Bueno, de momento he avanzado el codigo...

Me parece que esta quedando bien... ahora no solo gira hacia un lado, sino hacia los dos...

El siguiente paso es un poco mas complicado;

Quiero definir 12 tragos por ejemplo. //Incio del juego
Digamos que en la primera iteracion, se consume el trago No. 12 ..

Me gustaría quitarlo del juego, para que en la siguiente pasada... no caiga en 12...

Y asi... para que el random... sea entre los tragos que queden...

Bueno, en lo que pienso algo mas, les dejo lo que llevo del codigo;

#include <Stepper.h>

const byte noise = A0; 
const byte led = 13;

byte reverse_direction = 0; 
int  analog_seed; 
int  random_number = 0; 
int  motor_number = 0; 

boolean changue = false; 

const int stepsPerRevolution = 48;                 //steps per revolution
Stepper myStepper(stepsPerRevolution, 8,9,10,11);  //Pins to the stepper 



void setup(){
  Serial.begin(9600);
  pinMode(led, OUTPUT);     
  pinMode(noise,INPUT);   
  myStepper.setSpeed(50);
}


void loop(){
  if(Serial.available() > 0){
    if(Serial.peek() == 'c'){  //chek for c to start code 

      get_number_steps();
      switch_direction();       
      myStepper.step(motor_number);      
      Serial.print("El paso del motor es   "); Serial.println(motor_number);      
      digitalWrite(led, HIGH); 
      Serial.println("_______________________________");    
     }
  Serial.read();  
}

}


int get_number_steps(){
 analog_seed =  analogRead(noise); //gets a value between 0 and 1023
 randomSeed(analog_seed); 
 random_number = random(0,12); 
 Serial.print("El numero aleatorio es "); Serial.println(random_number); 
 motor_number = map(random_number, 0, 12, 0, 48); 

 return motor_number; 
}


int switch_direction(){
  if (changue == false){
     Serial.println("A la derecha ");
     changue = true; 
     return motor_number;  
     }
  
  if(changue == true){
     Serial.println("A la izquierda ");
     changue = false; 
     motor_number =(motor_number) * ( -1); 
     return motor_number; 
}
  
}

Y aqui la salida del serial;
El numero aleatorio es 3
A la derecha
El paso del motor es 12


El numero aleatorio es 0
A la izquierda
El paso del motor es 0


El numero aleatorio es 6
A la derecha
El paso del motor es 24


El numero aleatorio es 8
A la izquierda
El paso del motor es -32


El numero aleatorio es 4
A la derecha
El paso del motor es 16


El numero aleatorio es 5
A la izquierda
El paso del motor es -20


El numero aleatorio es 7
A la derecha
El paso del motor es 28


El numero aleatorio es 6
A la izquierda
El paso del motor es -24


El numero aleatorio es 11
A la derecha
El paso del motor es 44


Bueno, pues que creen mis queridos amigos de la comunidad arduinera (Nadie por aqui :stuck_out_tongue_closed_eyes: )

Pues resulta que despues de pensarlo un rato, decidi preguntar y de esta pregunta, me aparecen dos respuestas en la comunidad en ingles, usar un algoritmo "shuffle"

O usar un random que arroja un resultado entre dos maximo y minimo, que no haya sido previamente dado...

int randNumber;
#define Count 10
int list[Count];
byte i = 0;
boolean found = false;

void setup()
{
  Serial.begin(115200);
  for (byte K = 0; K < 5; K++)
  {
    for (int j = 0; j < Count; j++)
      list[j] = -1;

    randomSeed(K + 1);
    delay(50);
    i = 0;
    found = false;
    while (i < Count)
    {
      randNumber = random(0, Count);
      for (byte L = 0; L < i; L++)
      {
        found = false;
        if (list[L] == randNumber)
        {
          found = true;
          break;
        }
      }
      if (!found)
      {
        list[i] = randNumber;
        Serial.print(list[i]);
        Serial.print(",");
        i++;
      }
    }
    Serial.println();
  }
}

void loop() {
}

Mientras me leo estos codigos e intento ponerme al dia con algunos libros que me he bajado, (Dado que soy un atodidacta en esto del arduino) ...

Regresare cuando tenga algun otro avance.
8)

Bueno, dos leves modificaciones, ahora el codigo corre cada vez que detecta una 'c' en el puerto serial,
tambien usamos el puerto analogico para cambiar la semilla del numero random.

int randNumber;
#define Count 12
int list[Count];
byte i = 0;
boolean found = false;

const byte noise = A0; 
int  analog_seed; 


void setup(){
   Serial.begin(115200);
   pinMode(noise,INPUT);
}


void loop(){
  if(Serial.available() > 0){
    if(Serial.peek() == 'c'){  //chek for c to start code 
      Serial.println("Code starts");    
      randomize();   
   }
  Serial.read();  
}
 

}



void randomize(){
  
   for (byte K = 0; K < 5; K++)
  {
    for (int j = 0; j < Count; j++)
      list[j] = -1;

   analog_seed = analogRead(noise);
   randomSeed(analog_seed); 
   
    delay(50);
    i = 0;
    found = false;
    while (i < Count)
    {
      randNumber = random(0, Count);
      for (byte L = 0; L < i; L++)
      {
        found = false;
        if (list[L] == randNumber)
        {
          found = true;
          break;
        }
      }
      if (!found)
      {
        list[i] = randNumber;
        Serial.print(list[i]);
        Serial.print(",");
        i++;
      }
    }
    Serial.println();
  }
}

Los resultados;

Code starts
9,10,1,3,11,2,5,6,8,0,4,7,
11,9,10,0,7,8,4,6,2,1,3,5,
4,0,2,6,1,3,5,11,7,10,9,8,
1,8,0,2,3,7,9,10,6,5,11,4,
9,8,10,4,5,2,1,3,11,0,7,6,
Code starts
5,2,0,1,8,3,6,11,10,7,9,4,
0,11,1,4,2,8,10,3,9,7,6,5,
5,7,2,11,10,9,4,0,6,8,3,1,
11,8,7,4,6,2,1,3,9,0,5,10,
6,4,8,5,0,11,2,9,3,1,7,10,
Code starts
10,8,7,11,2,0,3,6,5,4,1,9,
0,1,4,11,5,9,3,10,8,2,7,6,
9,6,11,7,2,5,1,0,4,10,8,3,
2,3,7,8,6,5,11,9,1,10,4,0,
5,2,0,1,8,3,6,11,10,7,9,4,
Code starts
11,10,5,6,1,3,0,4,7,8,2,9,
6,3,0,4,1,7,9,11,2,10,5,8,
3,9,7,11,2,4,1,8,5,6,0,10,
7,3,5,2,1,4,0,9,10,8,11,6,
8,2,4,1,7,9,11,6,5,0,10,3,
Code starts
11,7,6,5,8,2,3,4,1,10,9,0,
7,2,1,3,9,11,4,0,6,8,10,5,
9,5,8,2,11,10,1,3,6,7,4,0,
4,3,0,6,1,11,8,2,7,10,9,5,
8,1,11,10,5,7,3,9,4,6,0,2,

Bueno, parece que vamos avanzando, logre adaptar el codigo a mis necesidades, se que no es la manera mas elegante de hacerlo, pero el tiempo apremia...
Lo modifique levemente para que;
Se inicia, el programa genera los 12 números aleatorios, y una variable lleva la cuenta... si es cero... genera un nuevo set de numeros, si no... va recorriendo el array en orden de 1 a 12... y regresa el valor del numero aleatorio al programa...

Les dejo el codiguin;

int randNumber;
#define count 12
int list[count];
byte i = 0;
boolean found = false;

byte getNumber = 0;                //var to see if we need a new randomize 

const byte noise = A0; 
int  analog_seed; 


void setup(){
   Serial.begin(115200);
   pinMode(noise,INPUT);
}


void loop(){
  if(Serial.available() > 0){
    if(Serial.peek() == 'c'){  //chek for 1 to start code 
      Serial.println("Code starts");      
      
    if(getNumber == 0){
      Serial.print("K =");  Serial.println(getNumber);
      randomize();    
      Serial.print("El numero es "); Serial.println( list[getNumber] );
       getNumber++;
      }      
    else if (getNumber <= count){ 
      Serial.print("K =");  Serial.println(getNumber);
      Serial.print("El numero es "); 
      Serial.println( list[getNumber] ); 
      getNumber++ ;
     }
    else{
      getNumber = 0; 
    }
    
  Serial.read();  
}
 

}

}

void randomize(){
    for (int j = 0; j < count; j++)
      list[j] = -1;

   analog_seed = analogRead(noise);
   randomSeed(analog_seed); 
   
    delay(50);
    i = 0;
    found = false;
    while (i < count)
    {
      randNumber = random(0, count);
      for (byte L = 0; L < i; L++)
      {
        found = false;
        if (list[L] == randNumber)
        {
          found = true;
          break;
        }
      }
      if (!found)
      {
        list[i] = randNumber;
        Serial.print(list[i]);
        Serial.print(",");
        i++;
      }
    }
    Serial.println();
  
    Serial.println();
}

Y algo de la salida serial, para que puedan comprobar que funciona como debe;

Code starts
K =0
9,7,8,6,1,0,2,5,4,11,3,10,

El numero es 9
Code starts
K =1
El numero es 7
Code starts
K =2
El numero es 8
Code starts
K =3
El numero es 6
Code starts
K =4
El numero es 1
Code starts
K =5
El numero es 0
Code starts
K =6
El numero es 2
Code starts
K =7
El numero es 5
Code starts
K =8
El numero es 4
Code starts
K =9
El numero es 11
Code starts
K =10
El numero es 3
Code starts
K =11
El numero es 10
Code starts
Code starts
K =0

Buenas noches, como les comente,m el codigo ha quedado listo...

Por el momento esta conectado al serial read, por que no tengo botones, pero mañana o pasado cambiare eso.

Ahora bien. Presionamos el boton, el codigo se fija si el contador = 0, entonces crea un juego de numeros random ordenados dentro de un char, list... Despues el codigo mueve el servo de acuerdo a este numero...

Le he agregado una partecin que permite mover el servo de acuerdo a su posicion relativa.

Les dejo el codigo hasta ahora;

#include <Stepper.h>

const byte noise = A0; 
const byte led = 13;

byte reverse_direction = 0; 
int  analog_seed; 
int  random_number = 0; 
int  motor_number = 0; 
boolean changue = false;          //var to changue direction of stepper
                      
                              //VARIABLES FOR THE RANDOMIZE ROUTINE  
byte getNumber = 0;                //var to see if we need a new randomize 
boolean found = false;
byte i = 0;
#define count 12
int list[count];

                              //VARIABLES FOR THE STEP ROUTINE 
int  relative_position = 0;
int  actual_position = 0; 
int  number_steps = 0;                              //var to save te equivalent number in steps 
const int stepsPerRevolution = 48;                 //steps per revolution
Stepper myStepper(stepsPerRevolution, 8,9,10,11);  //Pins to the stepper 

void setup(){
  Serial.begin(9600);
  pinMode(led, OUTPUT);     
  pinMode(noise,INPUT);   
  myStepper.setSpeed(50);
}


void loop(){
  if(Serial.available() > 0){
      if(Serial.peek() == 'c'){  //chek for c to start code 
         Serial.println("Code starts");      
         if(getNumber == 0){
            Serial.print("K =");  Serial.println(getNumber);
            randomize();    
            Serial.print("El numero es          "); Serial.println( list[getNumber] );
            }      
    else if (getNumber <= count){ 
      Serial.print("K =");  Serial.println(getNumber);
      Serial.print("El numero es           "); 
      Serial.println( list[getNumber] ); 
      
     }
    else{
      getNumber = 0; 
    } 
  Serial.read();                             //wipe the c byte from the serial port 
 
  move_steps(); 
  
}           
}
}   
      

void randomize(){
  for (int j = 0; j <= count+1 ; j++)
      list[j] = -1;

   analog_seed = analogRead(noise);
   randomSeed(analog_seed); 
   
    delay(50);
    i = 0;
    found = false;
    while (i < count)
    {
      random_number = random(0, count);
      for (byte L = 0; L < i; L++)
      {
        found = false;
        if (list[L] == random_number)
        {
          found = true;
          break;
        }
      }
      if (!found)
      {
        list[i] = random_number;
        Serial.print(list[i]);
        Serial.print(",");
        i++;
      }
    }
    Serial.println();
    Serial.println();
}

void move_steps(){
      number_steps = map(list[getNumber],0,12,0,48); 
   
          relative_position = number_steps - actual_position; 
          actual_position   = number_steps;     
      
      getNumber++;
      
      Serial.print("El paso absoluto es   "); Serial.println(number_steps);      
      Serial.print("El paso relativo es   "); Serial.println(relative_position);      
      digitalWrite(led, HIGH); 
      Serial.println("_______________________________");    
      myStepper.step(relative_position);
}

Espero poder hacer algo del hardware mañana mismo, y se los vengo a mostrar.

-Alex.
:sunglasses:

Bueno, pues ya tengo armada la primera prueba beta de esto, solo que no me dio tiempor probarla este fin de semana ya que hubo otro juego y despues, se nos olvido.

Les dejo un pequeño video de como va quedando la cosa, espero sus comentarios ... Nadie comenta nada y se ha leido unos 241 veces... :zipper_mouth_face:

Cosas que voy a agregar;

Que de mas vueltas, por que es muy directo el resultado

Conte los pines y puedo poner 1 led debajo de cada numero y hacer
que brillar con el giro del motor... creo

Una base de acrilico para que se vea mejor y mas pro...

Estos botones no me gustan mucho la verdad, pero igual y le pongo otro.

Les dejo un videin. Y unas fotos del diseño de la caja.
En vimeo

Espero sus comentarios XD ..

-Alex.

Bueno, supongo que nadie comenta nada, porque vemos que la cosa te va saliendo bien.

Yo le añadiría una cosa. Para darle más emoción la juego, haría que la ruleta diese un par o tres vueltas completas, antes de parase en un sitio. Me parece un poco "soso" que se pare tan rápido, sobre todo, cuando se para en el de al lado.

Es una sugerencia, pero creo que le daría más "vidilla" al asunto.

Carmelocome quitaste las palabras de los "dedos".

Estaba por comentar lo mismo a AlexLPD.

Dale mad emocion que de varias vueltas rapidas y se detenga poco a poco.

max_saeta:
Carmelocome quitaste las palabras de los "dedos".

Estaba por comentar lo mismo a AlexLPD.

Dale mad emocion que de varias vueltas rapidas y se detenga poco a poco.

Yo dije lo de dar varias vueltas, pero que se pare poco a poco, ya sería la leche!!!

Gracias máx, gracias carmeloco...

Pies si lo de dar varias vueltas creo q esta fácil, ahora que lo de la aceleración, eso si que me agarra desprevenido de momento, supongo q si se puede hacer.... Ahmmm.

Como ven?... Si del 1 al 4 agrego 3 vueltas
Del 2 al 8 2vueltas y del 8 al 12 1 vuelta..... Aunque claro.... Siempre de podria usar otro random para agregar vueltas.

De mover la aceleración nunca he hecho nada cn un stepper, pero creo q lei que tengo que cambiar de librería a una que soporte aceleración verdad?

Saludos!
Alex.

Yo dejaría fijo el número de vueltas. creo que con eso, ya le das intriga al asunto, jejeje

Bueno... Ideas de la aceleracion?

Gracias.

-Alex