Friday, September 23, 2011

Counter 0-9 Using Arduino Microcontroller

Things were really starting to look up for Morgan State Company. The high-tech credit card has been nicknamed "microcontroller super card" because of all the great improvement ideas. Morgan State Company has pitched my card design to the company I suggested and have received a lot of positive feedback. Several of the companies have requested a demonstration, now the pressure is on to produce samples that can be shown to potential customers. The company already has the hardware for the 7-segment display microcontroller super card but no software.
Because I did such a great job completing the LED software for my mentor I have been selected to write the code for the 7-segment display. In two weeks my mentor has several meetings scheduled with some major corporations to demonstrate this design. It is very important I meet this deadline.
Fig 1: Credit Card Fig 2: Arduino Board Schematic


Syntax/Instructions Used
digitalWrite(PIN, );                - sends digital value to  PIN
pinMode(PIN, MODE);                 - assigns I/O operation/MODE to PIN
delay(time);                        - delays by time in milliseconds
void setup(){}                      - operation to be executed only once
void loop(){}                       - operation to be executed repeatedly
Design


void setup()
{
  pinMode(1, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(13, OUTPUT);
 
  digitalWrite(13, HIGH);
}

void loop()
{
  //Number 0
  digitalWrite(1, LOW);
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  delay(1000);
 
  //Number 1
  digitalWrite(1, HIGH);
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  delay(1000);
 
  //Number 2
  digitalWrite(1, LOW);
  digitalWrite(2, HIGH);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  delay(1000);
 
  //Number 3
  digitalWrite(1, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  delay(1000);
 
  //Number 4
  digitalWrite(4, LOW);
  digitalWrite(3, HIGH);
  digitalWrite(2, LOW);
  digitalWrite(1, LOW);
  delay(1000);
 
  //Number 5
  digitalWrite(4, LOW);
  digitalWrite(3, HIGH);
  digitalWrite(2, LOW);
  digitalWrite(1, HIGH);
  delay(1000);
 
  //Number 6
  digitalWrite(4, LOW);
  digitalWrite(3, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(1, LOW);
  delay(1000);
 
  //Number 7
  digitalWrite(4, LOW);
  digitalWrite(3, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(1, HIGH);
  delay(1000);
 
  //Number 8
  digitalWrite(4, HIGH);
  digitalWrite(3, LOW);
  digitalWrite(2, LOW);
  digitalWrite(1, LOW);
  delay(1000);
 
  //Number 9
  digitalWrite(4, HIGH);
  digitalWrite(3, LOW);
  digitalWrite(2, LOW);
  digitalWrite(1, HIGH);
  delay(1000);
}

On the Circuit Board
Equipments Used: 7-Segment display, decoder driver, and dual inline resistor

Fig: Counter Circuit Schematic





INPUTS
PIN ON ARDUINO BOARD
A
Pin 1
B
Pin 2
C
Pin 3
D
Pin 4
Vcc
Pin 13
Table: Pin Configuration




BCD inputs
segment outputs
display
D
C
B
A
a
b
c
d
e
f
g
0
0
0
0
1
1
1
1
1
1
0
0
0
0
0
1
0
1
1
0
0
0
0
1
0
0
1
0
1
1
0
1
1
0
1
2
0
0
1
1
1
1
1
1
0
0
1
3
0
1
0
0
0
1
1
0
0
1
1
4
0
1
0
1
1
0
1
1
0
1
1
5
0
1
1
0
0
0
1
1
1
1
1
6
0
1
1
1
1
1
1
0
0
0
0
7
1
0
0
0
1
1
1
1
1
1
1
8
1
0
0
1
1
1
1
0
0
1
1
9
Table: BCD Decoder Outputs




Demos/Results

I demonstrated my knowledge and approach during the demo of the lab. I showed how to first verify the code, and then upload on to the arduino board. I then wrote a code for the counter to go from 0 to 9 using a time delay of 1000ms (1s) after each digit. I ran through an error at some point related to the port I used but after troubleshooting I changed ports from the tools menu. I was able to get the seven segment display counting from 0 to 9 again. I put a video of this on YouTube.



I was also able to dial my telephone number making the digit and LEDs blink that number of times using the code below. I also put a demo of this on YouTube.

My Number: (395)602-0044

int x = 0;

void setup()
{
  pinMode(1, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(7, OUTPUT);
}

void loop()
{

  //Number 4
  for(x=0; x<4; x++)
  {
  digitalWrite(13, HIGH);
  digitalWrite(4, LOW);
  digitalWrite(3, HIGH);
  digitalWrite(2, LOW);
  digitalWrite(1, LOW);
  digitalWrite(7, HIGH);
  delay(300);
  digitalWrite(7, LOW);
  digitalWrite(13, LOW);
  delay(300);
  }
  delay(1000);
 
  //Number 4
 for(x=0; x<4; x++)
  {
  digitalWrite(13, HIGH);
  digitalWrite(4, LOW);
  digitalWrite(3, HIGH);
  digitalWrite(2, LOW);
  digitalWrite(1, LOW);
  digitalWrite(7, HIGH);
  delay(300);
  digitalWrite(7, LOW);
  digitalWrite(13, LOW);
  delay(300);
  }
  delay(1000);
 
   //Number 3
   for(x=0; x<3; x++)
  {
  digitalWrite(13, HIGH);
  digitalWrite(1, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(7, HIGH);
  delay(300);
  digitalWrite(7, LOW);
  digitalWrite(13, LOW);
  delay(300);
  }
  delay(1000);
 
 
  //Number 9
  for(x=0; x<9; x++)
  {
  digitalWrite(13, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(3, LOW);
  digitalWrite(2, LOW);
  digitalWrite(1, HIGH);
  digitalWrite(7, HIGH);
  delay(300);
  digitalWrite(7, LOW);
  digitalWrite(13, LOW);
  delay(300);
  }
  delay(1000);
 
   //Number 5
   for(x=0; x<5; x++)
  {
  digitalWrite(13, HIGH);
  digitalWrite(4, LOW);
  digitalWrite(3, HIGH);
  digitalWrite(2, LOW);
  digitalWrite(1, HIGH);
  digitalWrite(7, HIGH);
  delay(300);
  digitalWrite(7, LOW);
  digitalWrite(13, LOW);
  delay(300);
  }
  delay(1000);
 
  //Number 6
  for(x=0; x<6; x++)
  {
  digitalWrite(13, HIGH);
  digitalWrite(4, LOW);
  digitalWrite(3, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(1, LOW);
  digitalWrite(7, HIGH);
  delay(300);
  digitalWrite(7, LOW);
  digitalWrite(13, LOW);
  delay(300);
  }
  delay(1000);
 
  //Number 0
  digitalWrite(13, HIGH);
  digitalWrite(1, LOW);
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  delay(2000);
  digitalWrite(13, LOW);
 
  //Number 2
  for(x=0; x<2; x++)
  {
  digitalWrite(13, HIGH);
  digitalWrite(1, LOW);
  digitalWrite(2, HIGH);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(7, HIGH);
  delay(300);
  digitalWrite(7, LOW);
  digitalWrite(13, LOW);
  delay(300);
  }
  delay(1000);
 
  //Number 0
  digitalWrite(13, HIGH);
  digitalWrite(1, LOW);
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  delay(300);
  digitalWrite(13, LOW);
  delay(1000);
 
  //Number 0
  digitalWrite(13, HIGH);
  digitalWrite(1, LOW);
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  delay(300);
  digitalWrite(13, LOW);
  delay(1000);
}



Conclusion

The first thing I did was to develop a design solution and then a pseudocode which I later converted to a flowchart and then finally to an actual Arduino code. I immediately identified the pins to be used on the Arduino board and assigned them to Output digital in the setup section of my Arduino code. For my design, I first configured out how to light up the LEDs on the 7 segment display, then I was able to get it working but I ended up using more bits than was necessary. I used up to 8 bits as opposed to 4 bits which I later used. I finally decided to use a BCD decoder which converted a 4 bit binary number to its decimal equivalent. This final design was more efficient and easier to troubleshoot. For the demo, I initially dialed my number without using a loop, but that made my code longer so I created a better algorithm with 4 bits making the program more efficient.