All pastes #1895153 Raw Edit

Arduino Rulet

public text v1 · immutable
#1895153 ·published 2010-07-05 21:35 UTC
rendered paste body
/*
  Digital Rulet
  
    LEFT       RIGHT
      3          3
     ---        ---
  1 | 4 | 6  1 | 4 | 6
     ---        ---
  2 | 5 | 7  2 | 5 | 7
     ---        ---
    L_LEDx     R_LEDx 
 */

#define LED_BIT0  0
#define LED_BIT1  1
#define LED_BIT2  2
#define LED_BIT3  3

#define LED_CTL   4

#define SW_START  9
#define SW_TEST  10

#define R_LED1  0x0001
#define R_LED2  0x0002
#define R_LED3  0x0004
#define R_LED4  0x0008
#define R_LED5  0x0010
#define R_LED6  0x0020
#define R_LED7  0x0040

#define L_LED1  0x0100
#define L_LED2  0x0200
#define L_LED3  0x0400
#define L_LED4  0x0800
#define L_LED5  0x1000
#define L_LED6  0x2000
#define L_LED7  0x4000

#define LED_READY 0x8000

int rulet_num[38]={37,1,13,36,24,3,15,34,22,5,17,32,20,7,11,30,26,9,28,0,2,14,35,23,4,16,33,21,6,18,31,19,8,12,29,25,10,27};
int current_num = 99; // Store the current rulet ball position, 99 indicates the initial status.

int digit_array[] = {
                                                   R_LED1|R_LED2|R_LED3       |R_LED5|R_LED6|R_LED7, //0
                                                                        R_LED6|R_LED7|R_LED6|R_LED7, //1
                                                          R_LED2|R_LED3|R_LED4|R_LED5|R_LED6       , //2
                                                                 R_LED3|R_LED4|R_LED5|R_LED6|R_LED7, //3
                                                   R_LED1              |R_LED4       |R_LED6|R_LED7, //4
                                                   R_LED1       |R_LED3|R_LED4|R_LED5       |R_LED7, //5
                                                   R_LED1|R_LED2|R_LED3|R_LED4|R_LED5       |R_LED7, //6
                                                   R_LED1       |R_LED3              |R_LED6|R_LED7, //7
                                                   R_LED1|R_LED2|R_LED3|R_LED4|R_LED5|R_LED6|R_LED7, //8
                                                   R_LED1       |R_LED3|R_LED4|R_LED5|R_LED6|R_LED7, //9
                                                   
                       L_LED6|L_LED7|L_LED6|L_LED7|R_LED1|R_LED2|R_LED3       |R_LED5|R_LED6|R_LED7, //10
                       L_LED6|L_LED7|L_LED6|L_LED7                     |R_LED6|R_LED7|R_LED6|R_LED7, //11
                       L_LED6|L_LED7|L_LED6|L_LED7       |R_LED2|R_LED3|R_LED4|R_LED5|R_LED6       , //12
                       L_LED6|L_LED7|L_LED6|L_LED7              |R_LED3|R_LED4|R_LED5|R_LED6|R_LED7, //13
                       L_LED6|L_LED7|L_LED6|L_LED7|R_LED1              |R_LED4       |R_LED6|R_LED7, //14
                       L_LED6|L_LED7|L_LED6|L_LED7|R_LED1       |R_LED3|R_LED4|R_LED5       |R_LED7, //15
                       L_LED6|L_LED7|L_LED6|L_LED7|R_LED1|R_LED2|R_LED3|R_LED4|R_LED5       |R_LED7, //16
                       L_LED6|L_LED7|L_LED6|L_LED7|R_LED1       |R_LED3              |R_LED6|R_LED7, //17
                       L_LED6|L_LED7|L_LED6|L_LED7|R_LED1|R_LED2|R_LED3|R_LED4|R_LED5|R_LED6|R_LED7, //18
                       L_LED6|L_LED7|L_LED6|L_LED7|R_LED1       |R_LED3|R_LED4|R_LED5|R_LED6|R_LED7, //19
 
         L_LED2|L_LED3|L_LED4|L_LED5|L_LED6       |R_LED1|R_LED2|R_LED3       |R_LED5|R_LED6|R_LED7, //20
         L_LED2|L_LED3|L_LED4|L_LED5|L_LED6                            |R_LED6|R_LED7|R_LED6|R_LED7, //21
         L_LED2|L_LED3|L_LED4|L_LED5|L_LED6              |R_LED2|R_LED3|R_LED4|R_LED5|R_LED6       , //22
         L_LED2|L_LED3|L_LED4|L_LED5|L_LED6                     |R_LED3|R_LED4|R_LED5|R_LED6|R_LED7, //23
         L_LED2|L_LED3|L_LED4|L_LED5|L_LED6       |R_LED1              |R_LED4       |R_LED6|R_LED7, //24
         L_LED2|L_LED3|L_LED4|L_LED5|L_LED6       |R_LED1       |R_LED3|R_LED4|R_LED5       |R_LED7, //25
         L_LED2|L_LED3|L_LED4|L_LED5|L_LED6       |R_LED1|R_LED2|R_LED3|R_LED4|R_LED5       |R_LED7, //26
         L_LED2|L_LED3|L_LED4|L_LED5|L_LED6       |R_LED1       |R_LED3              |R_LED6|R_LED7, //27
         L_LED2|L_LED3|L_LED4|L_LED5|L_LED6       |R_LED1|R_LED2|R_LED3|R_LED4|R_LED5|R_LED6|R_LED7, //28
         L_LED2|L_LED3|L_LED4|L_LED5|L_LED6       |R_LED1       |R_LED3|R_LED4|R_LED5|R_LED6|R_LED7, //29

                L_LED3|L_LED4|L_LED5|L_LED6|L_LED7|R_LED1|R_LED2|R_LED3       |R_LED5|R_LED6|R_LED7, //30
                L_LED3|L_LED4|L_LED5|L_LED6|L_LED7                     |R_LED6|R_LED7|R_LED6|R_LED7, //31
                L_LED3|L_LED4|L_LED5|L_LED6|L_LED7       |R_LED2|R_LED3|R_LED4|R_LED5|R_LED6       , //32
                L_LED3|L_LED4|L_LED5|L_LED6|L_LED7              |R_LED3|R_LED4|R_LED5|R_LED6|R_LED7, //33
                L_LED3|L_LED4|L_LED5|L_LED6|L_LED7|R_LED1              |R_LED4       |R_LED6|R_LED7, //34
                L_LED3|L_LED4|L_LED5|L_LED6|L_LED7|R_LED1       |R_LED3|R_LED4|R_LED5       |R_LED7, //35
                L_LED3|L_LED4|L_LED5|L_LED6|L_LED7|R_LED1|R_LED2|R_LED3|R_LED4|R_LED5       |R_LED7, //36
  L_LED1|L_LED2|L_LED3       |L_LED5|L_LED6|L_LED7|R_LED1|R_LED2|R_LED3       |R_LED5|R_LED6|R_LED7  //00
};

// The setup() method runs once, when the sketch starts
void setup()   {                
  // initialize the digital pin as an output:
  pinMode(LED_BIT0, OUTPUT); // for 4bit decorder bit0
  pinMode(LED_BIT1, OUTPUT); // for 4bit decorder bit1
  pinMode(LED_BIT2, OUTPUT); // for 4bit decorder bit2
  pinMode(LED_BIT3, OUTPUT); // for 4bit decorder bit3
  pinMode(LED_CTL,  OUTPUT); // for decorder on/off
  
  pinMode(SW_START, INPUT);   // For tact SW for start rulet
  pinMode(SW_TEST,  INPUT);   // For tact SW for test display
}

// Circulate lights as rulet ball
void rulet_circulate() {
  int delay_base = 200;
  int i, j, k;
  int random_val;
  
  for(i=10; i>0; i-=2) {
    random_val = random(0,i*2) + i; // Random Integer; to define number of slots that a ball moves.
    for(j=0; j<random_val; j++) {
        current_num++;
        if (current_num > 37 ) {
          current_num = 0;
        }
        for(k=0; k<((11-i)*delay_base); k++) { // Ball speed control. Faster to slower.
           led_display(digit_array[rulet_num[current_num]]);
        }
    }
  }
}

// Rulet light test
void rulet_test() {
  int delay_base = 1500;
  int i, k;
  
  for(i=0; i<38; i++) {
        for(k=0; k<delay_base; k++) {
           led_display(digit_array[i]);
        }
  }
}

// the loop() method runs over and over again,
// as long as the Arduino has power
int sw_val; // Global value to keep the switch status of last loop.
void loop()                     
{
  if (current_num == 99) { // This runs only when the first loop
    sw_val = wait_for_start(L_LED1|L_LED2|L_LED5|R_LED5|R_LED7|R_LED6|R_LED3|L_LED3); // initial LED display
  }
  
  if (sw_val == SW_START) {
    rulet_circulate();
    led_display(digit_array[current_num]);
    sw_val = wait_for_start(digit_array[current_num]);
  } else {
    rulet_test();
    sw_val = wait_for_start(L_LED1|L_LED2|L_LED5|R_LED5|R_LED7|R_LED6|R_LED3|L_LED3); // initial LED display
  }
}

// Return when the start or test sw is pushed.
int
wait_for_start(int disp_bit) {
  int sw_start, sw_test;
  
  sw_start = LOW; sw_test = LOW;
  sw_start = digitalRead(SW_START);
  sw_test  = digitalRead(SW_TEST);
  
  while(sw_start == LOW && sw_test == LOW) {
    led_display(disp_bit|LED_READY);  // If either switch is not pushed, display the current value and ready LED.
    sw_start = digitalRead(SW_START);
    sw_test  = digitalRead(SW_TEST);
  }

  if(sw_test == HIGH) {
    return SW_TEST; 
  } else {  
    return SW_START;
  }
}

void led_display(int parm) {
  if (parm & R_LED1) {
    digitalWrite(LED_CTL,  HIGH);
    digitalWrite(LED_BIT0,  LOW);
    digitalWrite(LED_BIT1,  LOW);
    digitalWrite(LED_BIT2,  LOW);
    digitalWrite(LED_BIT3,  LOW);
    digitalWrite(LED_CTL,   LOW);
  }
  if (parm & R_LED2) {
    digitalWrite(LED_CTL,  HIGH);
    digitalWrite(LED_BIT0, HIGH);
    digitalWrite(LED_BIT1,  LOW);
    digitalWrite(LED_BIT2,  LOW);
    digitalWrite(LED_BIT3,  LOW);
    digitalWrite(LED_CTL,   LOW);
  }
  if (parm & R_LED3) {
    digitalWrite(LED_CTL,  HIGH);
    digitalWrite(LED_BIT0,  LOW);
    digitalWrite(LED_BIT1, HIGH);
    digitalWrite(LED_BIT2,  LOW);
    digitalWrite(LED_BIT3,  LOW);
    digitalWrite(LED_CTL,   LOW);
  }
  if (parm & R_LED4) {
    digitalWrite(LED_CTL,  HIGH);
    digitalWrite(LED_BIT0, HIGH);
    digitalWrite(LED_BIT1, HIGH);
    digitalWrite(LED_BIT2,  LOW);
    digitalWrite(LED_BIT3,  LOW);
    digitalWrite(LED_CTL,   LOW);
  }
  if (parm & R_LED5) {
    digitalWrite(LED_CTL,  HIGH);
    digitalWrite(LED_BIT0,  LOW);
    digitalWrite(LED_BIT1,  LOW);
    digitalWrite(LED_BIT2, HIGH);
    digitalWrite(LED_BIT3,  LOW);
    digitalWrite(LED_CTL,   LOW);
  }
  if (parm & R_LED6) {
    digitalWrite(LED_CTL,  HIGH);
    digitalWrite(LED_BIT0, HIGH);
    digitalWrite(LED_BIT1,  LOW);
    digitalWrite(LED_BIT2, HIGH);
    digitalWrite(LED_BIT3,  LOW);
    digitalWrite(LED_CTL,   LOW);
  }
  if (parm & R_LED7) {
    digitalWrite(LED_CTL,  HIGH);
    digitalWrite(LED_BIT0,  LOW);
    digitalWrite(LED_BIT1, HIGH);
    digitalWrite(LED_BIT2, HIGH);
    digitalWrite(LED_BIT3,  LOW);
    digitalWrite(LED_CTL,   LOW);
  }

  if (parm & L_LED1) {
    digitalWrite(LED_CTL,  HIGH);
    digitalWrite(LED_BIT0,  LOW);
    digitalWrite(LED_BIT1,  LOW);
    digitalWrite(LED_BIT2,  LOW);
    digitalWrite(LED_BIT3, HIGH);
    digitalWrite(LED_CTL,   LOW);
  }
  if (parm & L_LED2) {
    digitalWrite(LED_CTL,  HIGH);
    digitalWrite(LED_BIT0, HIGH);   // set the LED on
    digitalWrite(LED_BIT1,  LOW);   // set the LED on
    digitalWrite(LED_BIT2,  LOW);   // set the LED on
    digitalWrite(LED_BIT3, HIGH);   // set the LED on
    digitalWrite(LED_CTL,   LOW);
  }
  if (parm & L_LED3) {
    digitalWrite(LED_CTL,  HIGH);
    digitalWrite(LED_BIT0,  LOW);   // set the LED on
    digitalWrite(LED_BIT1, HIGH);   // set the LED on
    digitalWrite(LED_BIT2,  LOW);   // set the LED on
    digitalWrite(LED_BIT3, HIGH);   // set the LED on
    digitalWrite(LED_CTL,   LOW);
  }
  if (parm & L_LED4) {
    digitalWrite(LED_CTL,  HIGH);
    digitalWrite(LED_BIT0, HIGH);   // set the LED on
    digitalWrite(LED_BIT1, HIGH);   // set the LED on
    digitalWrite(LED_BIT2,  LOW);   // set the LED on
    digitalWrite(LED_BIT3, HIGH);   // set the LED on
    digitalWrite(LED_CTL,   LOW);
  }
  if (parm & L_LED5) {
    digitalWrite(LED_CTL,  HIGH);
    digitalWrite(LED_BIT0,  LOW);   // set the LED on
    digitalWrite(LED_BIT1,  LOW);   // set the LED on
    digitalWrite(LED_BIT2, HIGH);   // set the LED on
    digitalWrite(LED_BIT3, HIGH);   // set the LED on
    digitalWrite(LED_CTL,   LOW);
  }
  if (parm & L_LED6) {
    digitalWrite(LED_CTL,  HIGH);
    digitalWrite(LED_BIT0, HIGH);   // set the LED on
    digitalWrite(LED_BIT1,  LOW);   // set the LED on
    digitalWrite(LED_BIT2, HIGH);   // set the LED on
    digitalWrite(LED_BIT3, HIGH);   // set the LED on
    digitalWrite(LED_CTL,   LOW);
  }
  if (parm & L_LED7) {
    digitalWrite(LED_CTL,  HIGH);
    digitalWrite(LED_BIT0,  LOW);   // set the LED on
    digitalWrite(LED_BIT1, HIGH);   // set the LED on
    digitalWrite(LED_BIT2, HIGH);   // set the LED on
    digitalWrite(LED_BIT3, HIGH);   // set the LED on
    digitalWrite(LED_CTL,   LOW);
  }
  
  if (parm & LED_READY) {
    digitalWrite(LED_CTL,  HIGH);
    digitalWrite(LED_BIT0, HIGH);   // set the LED on
    digitalWrite(LED_BIT1, HIGH);   // set the LED on
    digitalWrite(LED_BIT2, HIGH);   // set the LED on
    digitalWrite(LED_BIT3, HIGH);   // set the LED on
    digitalWrite(LED_CTL,   LOW);
  }
}