Thursday, April 6, 2017

Arduino Multi Function Shield

Intro

The Multi Function Shield is a nice shield with some components to so some experiments with your Arduino. On the shield are two jumpers. It is always the question in what position do you need to put the jumpers. The answer will be in this post.

Before using this shield I added some isolation tape at the bottom as is am not happy with some pins of 7 segment displays close to the metal USB connector. On http://arduinolearning.com/code/multi-function-shield-examples.php i found some easy experiments to start. (using 4 leds, button1, button2, pot1 and the 7 segment display)

Code Examples

Blinking LED

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int led = 13;
void setup()
{
// initialize the digital pin as an output.
pinMode(led, OUTPUT);
}
void loop()
{
digitalWrite(led, HIGH);
delay(1000);
digitalWrite(led, LOW);
delay(1000);
}

All LEDS blinking

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
int led1 = 13;
int led2 = 12;
int led3 = 11;
int led4 = 10;
void setup()
{
// initialize the digital pin as an output.
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
}
void loop()
{
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led4, HIGH);
delay(1000);
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
delay(1000);
}

Switches example

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
const byte LED[] = {13,12,11,10};
#define BUTTON1 A1
#define BUTTON2 A2
void setup()
{
// initialize the digital pin as an output.
/* Set each pin to outputs */
pinMode(LED[0], OUTPUT);
pinMode(LED[1], OUTPUT);
pinMode(LED[2], OUTPUT);
pinMode(LED[3], OUTPUT);
}
void loop()
{
if(!digitalRead(BUTTON1))
{
digitalWrite(LED[0], HIGH);
digitalWrite(LED[1], HIGH);
digitalWrite(LED[2], HIGH);
digitalWrite(LED[3], HIGH);
}
if(!digitalRead(BUTTON2))
{
digitalWrite(LED[0], LOW);
digitalWrite(LED[1], LOW);
digitalWrite(LED[2], LOW);
digitalWrite(LED[3], LOW);
}
}
I discovered that you need add jumper J2 to use the buttons!

Potentiometer 1

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#define Pot1 0
void setup()
{
Serial.begin(9600);
}
/* Main Program */
void loop()
{
Serial.print(“Potentiometer reading: “);
Serial.println(analogRead(Pot1));
/* Wait 0.5 seconds before reading again */
delay(500);
}

Pot and led

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
const byte LED[] = {13,12,11,10};
#define Pot1 0
void setup()
{
Serial.begin(9600);
// initialize the digital pin as an output.
/* Set each pin to outputs */
pinMode(LED[0], OUTPUT);
pinMode(LED[1], OUTPUT);
pinMode(LED[2], OUTPUT);
pinMode(LED[3], OUTPUT);
}
/* Main Program */
void loop()
{
int PotValue;
//Serial.print("Potentiometer reading: ");
PotValue = analogRead(Pot1);
/* Wait 0.5 seconds before reading again */
if(PotValue < 400)
{
digitalWrite(LED[0], LOW);
digitalWrite(LED[1], LOW);
digitalWrite(LED[2], LOW);
digitalWrite(LED[3], LOW);
Serial.print("Potentiometer: ");
Serial.println(PotValue);
}
else
{
digitalWrite(LED[0], HIGH);
digitalWrite(LED[1], HIGH);
digitalWrite(LED[2], HIGH);
digitalWrite(LED[3], HIGH);
Serial.print("Potentiometer: ");
Serial.println(PotValue);
}
delay(500);
}

segment display

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/* Define shift register pins used for seven segment display */
#define LATCH_DIO 4
#define CLK_DIO 7
#define DATA_DIO 8
/* Segment byte maps for numbers 0 to 9 */
const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};
/* Byte maps to select digit 1 to 4 */
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};
void setup ()
{
/* Set DIO pins to outputs */
pinMode(LATCH_DIO,OUTPUT);
pinMode(CLK_DIO,OUTPUT);
pinMode(DATA_DIO,OUTPUT);
}
/* Main program */
void loop()
{
/* Update the display with the current counter value */
WriteNumberToSegment(0 , 0);
WriteNumberToSegment(1 , 1);
WriteNumberToSegment(2 , 2);
WriteNumberToSegment(3 , 3);
}
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */
void WriteNumberToSegment(byte Segment, byte Value)
{
digitalWrite(LATCH_DIO,LOW);
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );
digitalWrite(LATCH_DIO,HIGH);
}

Read pot and display value on display

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/* Define shift register pins used for seven segment display */
#define LATCH_DIO 4
#define CLK_DIO 7
#define DATA_DIO 8
#define Pot1 0
/* Segment byte maps for numbers 0 to 9 */
const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};
/* Byte maps to select digit 1 to 4 */
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};
void setup ()
{
Serial.begin(9600);
/* Set DIO pins to outputs */
pinMode(LATCH_DIO,OUTPUT);
pinMode(CLK_DIO,OUTPUT);
pinMode(DATA_DIO,OUTPUT);
}
/* Main program */
void loop()
{
int PotValue;
PotValue = analogRead(Pot1);
Serial.print(“Potentiometer: “);
Serial.println(PotValue);
/* Update the display with the current counter value */
WriteNumberToSegment(0 , PotValue / 1000);
WriteNumberToSegment(1 , (PotValue / 100) % 10);
WriteNumberToSegment(2 , (PotValue / 10) % 10);
WriteNumberToSegment(3 , PotValue % 10);
}
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */
void WriteNumberToSegment(byte Segment, byte Value)
{
digitalWrite(LATCH_DIO,LOW);
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );
digitalWrite(LATCH_DIO,HIGH);
}
When i tried this program i noticed that the most significant digit looks more bright than others !

Schematic diagram

On http://www.baaqii.com/promanage/manual/A1010.zip i found a zip file with a schematic diagram and about 28 lessons / experiments (in Chinese!).
In the schematic diagram

you can see the jumpers:

J1 is used for a 10 k pull up resistor to pin 2 of U5  (to connect a DS1820 temperature sensor [not included with the shield]) (Arduino Pin A4 ?)  {Location C4 in the picture} 

J2 is needed if you want to use the switches S1 S2 and S3 (connected to A1 A2 and A3 of the Arduino. {Location C1 in picture}

A SFH506-38 IR receiver (Pin D2) {Location C3 in picture} is also not included with this shield and can be connected to U4

I expect the 7 pin header {Location B/C1 in picture} with the Chinese characters is the header 7 pin header marked on the shield with "APC220 Bluetooth Voice Recognition Module". (Pin D0 and D1 ?)

Pin D5 D6 D9 and A5 are accessible by 4 3 pin header connectors next to +5V and GND

D3 is connected to the Buzzer using a transistor! {Location D3 in picture}

 The 4 * 7segement displays are connected using two MC74HC595AD shift registers
D4 7segment Latch
D7 7segment CLK
D8 7segment Data

D10 Led4 {Location A2 in picture}
D11 Led3
D12 Led2
D13 Led1

A0 Pot1 (potentiometer) {Location B/C1 in picture}

A1 Button1 {Location C/D1 in picture}
A2 Button2
A3 Button3

IMPORTANT ADDITIONAL INFO (Oct 2019)

October 2019 i was contacted by Kashif Baig. The link to his document was changed
 to https://files.cohesivecomputing.co.uk/Hackatronics-Arduino-Multi-function-Shield.pdf

Other references

Some other info on the internet about this shield:

https://www.mpja.com/download/hackatronics-arduino-multi-function-shield.pdf
Document with several examples using a nice library

http://www.cohesivecomputing.co.uk/hackatronics/arduino-multi-function-shield/
Tutorial with  real world examples (Metronome bonus can be found on Youtube)
(I tried the Metronome, it worked. The sound was not as loud as i expected from the Youtube movie.)
 

No comments: