donderdag 23 februari 2012

Arduino - Experiment 3c - mm:ss teller

Als laatste in deze reeks komt de mm:ss teller.

Omdat er maar 14 uitgangen zijn heb ik de BCD tellers aangepast, de tientallen hoeven immers maar tot 5 te tellen (BCD 101). Hierdoor kon ik voor de tientallen de D uitsparen. Ik hoef dan geen 16 pinnen te hebben, maar 14. (komt dat even mooi uit!)

De code is als volgt:


#define BIT_A1 0
#define BIT_B1 1
#define BIT_C1 2
#define BIT_D1 3
#define BIT_A2 4
#define BIT_B2 5
#define BIT_C2 6
#define BIT_A3 7
#define BIT_B3 8
#define BIT_C3 9
#define BIT_D3 10
#define BIT_A4 11
#define BIT_B4 12
#define BIT_C4 13




int a=0;   // A1
int b=0;   // B1
int c=0;   // C1
int d=0;   // D1
int x=0;   // counter
int a1=0;   // A2
int b1=0;   // B2
int c1=0;   // C2
int x1=0;   // counter
int a2=0;   // A3
int b2=0;   // B3
int c2=0;   // C3
int d2=0;   // D3
int x2=0;   // counter
int a3=0;   // A4
int b3=0;   // B4
int c3=0;   // C4




int new_a=0;
int new_b=0;
int new_c=0;
int new_d=0;
int new_a1=0;
int new_b1=0;
int new_c1=0;
int new_a2=0;
int new_b2=0;
int new_c2=0;
int new_d2=0;
int new_a3=0;
int new_b3=0;
int new_c3=0;




void setup(){
  
  pinMode(BIT_A1,OUTPUT);    //set all pin in OUTPUT mode
  pinMode(BIT_B1,OUTPUT);
  pinMode(BIT_C1,OUTPUT);
  pinMode(BIT_D1,OUTPUT);
  pinMode(BIT_A2,OUTPUT);
  pinMode(BIT_B2,OUTPUT);
  pinMode(BIT_C2,OUTPUT);
  pinMode(BIT_A3,OUTPUT);
  pinMode(BIT_B3,OUTPUT);
  pinMode(BIT_C3,OUTPUT);
  pinMode(BIT_D3,OUTPUT);
  pinMode(BIT_A4,OUTPUT);
  pinMode(BIT_B4,OUTPUT);
  pinMode(BIT_C4,OUTPUT);  
}


void loop(){


do
{
  do
{
do
{


 delay(1000);                
  if  (!a) new_a=1; 
  else new_a=0;
  if ((b && !a) || (!b && a && !d)) new_b=1;
  else new_b=0;
 if ((!c && b && a) || (c && !a) || ( c && !b)) new_c=1;
 else new_c=0;
 if ((!d && c && b && a) || (d && !a)) new_d=1;
 else new_d=0;


  
 a=new_a;
 b=new_b;  
 c=new_c;
 d=new_d; 
  


 if(a==1) digitalWrite(BIT_A1,HIGH);
 else digitalWrite(BIT_A1,LOW);
 if(b==1) digitalWrite(BIT_B1,HIGH);
 else digitalWrite(BIT_B1,LOW);
 if(c==1) digitalWrite(BIT_C1,HIGH);
 else digitalWrite(BIT_C1,LOW);
 if(d==1) digitalWrite(BIT_D1,HIGH);
 else digitalWrite(BIT_D1,LOW);
  
  
 x = x + 1; 


} while (x < 10);
x=0;                
  if  (!a1) new_a1=1; 
  else new_a1=0;
  if ((b1 && !a1) || (!b1 && a1 && !c1)) new_b1=1;
  else new_b1=0;
  if ((!c1 && b1 && a1) || (c1 && !a1 && !b1)) new_c1=1;
  else new_c1=0;
 
  
  a1=new_a1;
  b1=new_b1;  
  c1=new_c1;
  


  if(a1==1) digitalWrite(BIT_A2,HIGH);
  else digitalWrite(BIT_A2,LOW);
  if(b1==1) digitalWrite(BIT_B2,HIGH);
  else digitalWrite(BIT_B2,LOW);
  if(c1==1) digitalWrite(BIT_C2,HIGH);
  else digitalWrite(BIT_C2,LOW);
  
  x1 = x1 + 1;


} while (x1 < 6);

x1=0;
  if  (!a2) new_a2=1; 
  else new_a2=0;
  if ((b2 && !a2) || (!b2 && a2 && !d2)) new_b2=1;
  else new_b2=0;
  if ((!c2 && b2 && a2) || (c2 && !a2) || ( c2 && !b2)) new_c2=1;
  else new_c2=0;
  if ((!d2 && c2 && b2 && a2) || (d2 && !a2)) new_d2=1;
  else new_d2=0;


  
  a2=new_a2;
  b2=new_b2;  
  c2=new_c2;
  d2=new_d2; 
  


  if(a2==1) digitalWrite(BIT_A3,HIGH);
  else digitalWrite(BIT_A3,LOW);
  if(b2==1) digitalWrite(BIT_B3,HIGH);
  else digitalWrite(BIT_B3,LOW);
  if(c2==1) digitalWrite(BIT_C3,HIGH);
  else digitalWrite(BIT_C3,LOW);
  if(d2==1) digitalWrite(BIT_D3,HIGH);
  else digitalWrite(BIT_D3,LOW);
  
  
  x2 = x2 + 1;


} while (x2 < 10);


x2=0;


if  (!a3) new_a3=1; 
else new_a3=0;
if ((b3 && !a3) || (!b3 && a3 && !c3)) new_b3=1;
else new_b3=0;
if ((!c3 && b3 && a3) || (c3 && !a3 && !b3)) new_c3=1;
else new_c3=0;


  
a3=new_a3;
b3=new_b3;  
c3=new_c3;



if(a3==1) digitalWrite(BIT_A4,HIGH);
else digitalWrite(BIT_A4,LOW);
if(b3==1) digitalWrite(BIT_B4,HIGH);
else digitalWrite(BIT_B4,LOW);
if(c3==1) digitalWrite(BIT_C4,HIGH);
else digitalWrite(BIT_C4,LOW);
}


Om het filmpje wat sneller te laten lopen heb ik wat met de delay gespeeld, eerst is delay 100, daarna 10.

Het ziet er dan als volgt uit:


zaterdag 11 februari 2012

Arduino - Experiment 3b - BCD naar 7-segments display

En van experiment 3a is het een kleine stap naar 3b. Wanneer de arduino van 0 t/m 9 telt in BCD code kunnen we een 74LS47 gebruiken om met de BCD code de juiste segmenten aan te sturen van het display.

Onderstaande schema's geven weer hoe h.e.e.a. aangesloten moet worden:

 En dat ziet er dan als volgt uit:



Zoals je misschien opgevallen is gebruikt de 74LS47 voor de 6 en de 9 één segment minder dan in experiment 2b.

donderdag 9 februari 2012

Arduino - Experiment 3a - BCD teller

Het vorige experiment was een beetje omslachtig, dat kan natuurlijk veel beter. Voordat we naar Arduino - Experiment 3b - BCD naar 7-segments display gaan, maken we eerst een BCD teller van 0 t/m 9.


De waarheidstabel hiervoor is:


D
C
B
A
Decimaal
0
0
0
0
0
0
0
0
1
1
0
0
1
0
2
0
0
1
1
3
0
1
0
0
4
0
1
0
1
5
0
1
1
0
6
0
1
1
1
7
1
0
0
0
8
1
0
0
1
9


De code hiervoor is als volgt:

/*
Binary Counter with four LED's

The circuit:
* 4 LED's
       * 1 220ohm resistor
       
Created 09/02/2012
By Reinoud de Lange (reinouddl@gmail.com)
adopted some code from Vito Magnanimo

*/

#define LED1 0    // pin of LED1
#define LED2 1    // pin of LED2
#define LED3 2    // pin of LED3

#define LED4 3    // pin of LED4

int a=0;   // state of LED1
int b=0;   // state of LED2
int c=0;   // state of LED3

int d=0;   // state of LED4

//there are auxiliary variables
int new_a=0;  // used to store new LED1 state
int new_b=0;  // used to store new LED2 state
int new_c=0;  // used to store new LED3 state

int new_d=0;  // used to store new LED4 state

void setup(){
 
 pinMode(LED1,OUTPUT);    //set all pin in OUTPUT mode
 pinMode(LED2,OUTPUT);
 pinMode(LED3,OUTPUT);

 pinMode(LED4,OUTPUT);
 
}
void loop(){
 
 delay(2000);   // wait 2s before to begin every cicle
                // this is useful because if there isnt any
                // delay we will not see anything
               
 if  (!a) new_a=1;
 else new_a=0;
 if( (b && !a) || (!b && a && !d)) new_b=1;
 else new_b=0;
 if( (!c && b && a) || (c && !a) || ( c && !b)) new_c=1;

 else new_c=0;
 if( (!d && c && b && a) || (d && !a)) new_d=1;
 else new_d=0;

 
 a=new_a;   //now new value can be stored in the state variables
 b=new_b;  
 c=new_c;

 d=new_d;
 
 //turn ON or turn OFF  LED 1 2 3 4
 if(a==1) digitalWrite(LED1,HIGH);
 else digitalWrite(LED1,LOW);
 if(b==1) digitalWrite(LED2,HIGH);
 else digitalWrite(LED2,LOW);
 if(c==1) digitalWrite(LED3,HIGH);
 else digitalWrite(LED3,LOW);
 if(d==1) digitalWrite(LED4,HIGH);
 else digitalWrite(LED4,LOW);
}


En dat ziet er dan als volgt uit:



Hierna kunnen we met de BCD to 7-segment driver het display aansturen. Maar dat is voor het volgende experiment: "Arduino - Experiment 3b - BCD naar 7-segments display".

dinsdag 7 februari 2012

Arduino - Experiment 2b - Eenvoudig tellertje

Experiment 2a smaakte naar meer. Nu we weten hoe de display werkt kunnen we ook een eenvoudig tellertje maken.

Gebruikte code:


/*
  Teller van 0 t/m 9 voor de 7 segment led display
 */

void setup() {
  pinMode(0, OUTPUT);  
  pinMode(1, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
}

void loop() {
  digitalWrite(0, HIGH);   // A
  digitalWrite(1, LOW);   // B
  digitalWrite(2, LOW);   // C
  digitalWrite(3, HIGH);   // D    EEN
  digitalWrite(4, HIGH);   // E
  digitalWrite(5, HIGH);   // F
  digitalWrite(6, HIGH);   // G
  delay(1000);              // wait for 1000 ms
  digitalWrite(0, LOW);   // A
  digitalWrite(1, LOW);   // B
  digitalWrite(2, HIGH);   // C
  digitalWrite(3, LOW);   // D     TWEE
  digitalWrite(4, LOW);   // E
  digitalWrite(5, HIGH);   // F
  digitalWrite(6, LOW);   // G
  delay(1000);              // wait for 1000 ms
  digitalWrite(0, LOW);   // A
  digitalWrite(1, LOW);   // B
  digitalWrite(2, LOW);   // C
  digitalWrite(3, LOW);   // D     DRIE
  digitalWrite(4, HIGH);   // E
  digitalWrite(5, HIGH);   // F
  digitalWrite(6, LOW);   // G
  delay(1000);              // wait for 1000 ms
  digitalWrite(0, HIGH);   // A
  digitalWrite(1, LOW);   // B
  digitalWrite(2, LOW);   // C
  digitalWrite(3, HIGH);   // D    VIER
  digitalWrite(4, HIGH);   // E
  digitalWrite(5, LOW);   // F
  digitalWrite(6, LOW);   // G
  delay(1000);              // wait for 1000 ms
  digitalWrite(0, LOW);   // A
  digitalWrite(1, HIGH);   // B
  digitalWrite(2, LOW);   // C
  digitalWrite(3, LOW);   // D     VIJF
  digitalWrite(4, HIGH);   // E
  digitalWrite(5, LOW);   // F
  digitalWrite(6, LOW);   // G
  delay(1000);              // wait for 1000 ms
  digitalWrite(0, LOW);   // A
  digitalWrite(1, HIGH);   // B
  digitalWrite(2, LOW);   // C
  digitalWrite(3, LOW);   // D     ZES
  digitalWrite(4, LOW);   // E
  digitalWrite(5, LOW);   // F
  digitalWrite(6, LOW);   // G
  delay(1000);              // wait for 1000 ms
  digitalWrite(0, LOW);   // A
  digitalWrite(1, LOW);   // B
  digitalWrite(2, LOW);   // C
  digitalWrite(3, HIGH);   // D     ZEVEN
  digitalWrite(4, HIGH);   // E
  digitalWrite(5, HIGH);   // F
  digitalWrite(6, HIGH);   // G
  delay(1000);              // wait for 1000 ms
  digitalWrite(0, LOW);   // A
  digitalWrite(1, LOW);   // B
  digitalWrite(2, LOW);   // C
  digitalWrite(3, LOW);   // D     ACHT
  digitalWrite(4, LOW);   // E
  digitalWrite(5, LOW);   // F
  digitalWrite(6, LOW);   // G
  delay(1000);              // wait for 1000 ms
  digitalWrite(0, LOW);   // A
  digitalWrite(1, LOW);   // B
  digitalWrite(2, LOW);   // C
  digitalWrite(3, LOW);   // D     NEGEN
  digitalWrite(4, HIGH);   // E
  digitalWrite(5, LOW);   // F
  digitalWrite(6, LOW);   // G
  delay(1000);              // wait for 1000 ms
  digitalWrite(0, LOW);   // A
  digitalWrite(1, LOW);   // B
  digitalWrite(2, LOW);   // C
  digitalWrite(3, LOW);   // D     NUL
  digitalWrite(4, LOW);   // E
  digitalWrite(5, LOW);   // F
  digitalWrite(6, HIGH);   // G
  delay(1000);              // wait for 1000 ms
}

Resultaat:


Arduino - Experiment 2a - Test voor de 7 segment led display

Weer verder getest met de Arduino, ik had nog ergens een 7-segmentsdisplay liggen:


Het gaat hier om een Common Anode, om een segment te laten branden moet de desbetreffende pin 'laag' zijn.

Om een testje te doen heb ik de volgende code gebruikt:

/*
  Test voor de 7 segment led display
 */

void setup() {
  pinMode(0, OUTPUT);     
  pinMode(1, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
}

void loop() {
  digitalWrite(0, HIGH);   // A
  delay(50);              // wait for 50 ms
  digitalWrite(1, HIGH);   // B
  delay(50);              // wait for 50 ms
  digitalWrite(2, HIGH);   // C
  delay(50);              // wait for 50 ms
  digitalWrite(3, HIGH);   // D
  delay(50);              // wait for 50 ms
  digitalWrite(4, HIGH);   // E
  delay(50);              // wait for 50 ms
  digitalWrite(5, HIGH);   // F
  delay(50);              // wait for 50 ms
  digitalWrite(0, LOW);   // A
  delay(50);              // wait for 50 ms
  digitalWrite(1, LOW);   // B
  delay(50);              // wait for 50 ms
  digitalWrite(2, LOW);   // C
  delay(50);              // wait for 50 ms
  digitalWrite(3, LOW);   // D
  delay(50);              // wait for 50 ms
  digitalWrite(4, LOW);   // E
  delay(50);              // wait for 50 ms
  digitalWrite(5, LOW);   // F
  delay(50);              // wait for 50 ms

}

En dat ziet er als volgt uit:

(voor de oplettenden onder jullie, één segment licht niet op...)

maandag 6 februari 2012

Arduino - Experiment 1 - Blink

Gisteren besteld, vandaag al binnen! Goed bezig die mensen van iprototype.nl! Dus we moeten toch even kijken of ie het doet, die Arduino!

Simpel stukje code:

Arduino - Experiment 1 - Blink

Simpel stukje code:

void setup() {
pinMode(13, OUTPUT);
}

void loop() {
digitalWrite(13, HIGH);
delay(50);
digitalWrite(13, LOW);
delay(1000);
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000);
}
En ja hoor! Het werkt!

zondag 5 februari 2012

Het Arduino - de Lange programma... wat is dat eigenlijk?

Kort nadat ik besloten had om mijn interesse voor elektronica meer vorm te geven (niet teveel hoor!) stuitte ik op de Arduino Uno. Een programmeerbare microprocessor met in- en uitgangen. Wat kun je er mee? Wat niet? Ik besloot er een te kopen en aan de slag te gaan met de experimenten...

Een niet nader te noemen collega - hij heet Rob - vergeleek het met de ruimtevaart (wat natuurlijk totaal nergens op slaat) en zo ontstond de naam: Het Arduino - de Lange programma.

In deze blogs kun je de resultaten van de experimenten lezen en bekijken... en wie weet waar het toe leidt...