Arduino Projekten

Mon 21-Jan-19
15:46:30




Potmeters en een RGB-Led

Datum: Mon 03 February 2014
Samenvatting: Potmeters die op een RGB-Led in Real Time de kleuren kan mengen.


Het eerste idee waar ik mee speelde is een grote uitbreiding van het aansturen van de RGB-Led met de potmeters. Een combinatie uitbreiding van [CIRC-08] en [CIRC-12]. Het idee is eenvoudig. Lees de waarde van 3 potmeters (op A0, A1 en A2) in en stuur deze waardes rechtstreeks door naar de RGB-Led (D9, D10 en D11). Met de potmeters is zodoende elke kleur in real-time in helderheid te regelen. Eenvoudiger kan niet.

Dat was snel gerealiseerd.

Daarom een uitbreiding om op de 16 Led's, waarop de waarde van de potmeters is af te lezen. Eerst recht toe recht aan. De potmeters geven een 10-bits waarde. Deze wordt eerst naar 8-bits gebracht (vanwege de PWM-uitgangen). Voor de Led's wordt hiervan de hoogste 4-bit's gebruikt. Het vergt wat programmeer werk (goed voor de C++ ervaring), maar geeft in 1 oog opslag een waarde (op de foto $0515).

Echter ik heb meer potmeters. En meer Led's om aan te sturen. Uiteindelijk kom ik tot de volgende indeling (van links naar rechts):

  • 6) Een soort van Selectie-knop, welke waarde er op de 16 Led's moet worden getoond.
  • 5) Helderheid van de 16 schuifregister Led's
  • 4) Helderheid van de Grote Led Links
  • 3) Helderheid van de Rood op de RGB-Led.
  • 2) Helderheid van de Groen op de RGB-Led.
  • 1) Helderheid van de Blauw op de RGB-Led.

Nu zijn 4-bits, maar 4-bits. 8-bits is leuker ... echter het aantal Led's ontbreekt om 3 keer 8-bits te kunnen laten zien (noem het een onvolkomenheid bij het bouwen van het Experimenteer Huis). Wel kan er van elke potmeter afzonderlijk de 8-bits waarde worden getoond. Als er nou een (soort van) selectie-knop is, kan deze op de (linkse 5 Led's van de) 16 LED's ook nog aangeven van welke knop de waarde (in 8-bits) wordt getoond. De linkse potmeter (nummer P6) neemt deze taak op zich en het programmeren van de selectie geschied door een deling door 6. Voor een potmeter-waarde van 0 t/m 255 worden de deelgetallen resp. 43, 85, 128, 170, 213. Hierop wordt getest (met If-Else-If Statements) en een potmeter-waarde wordt (aan het eind van de Void-Functie) naar de 16 Led's doorgeschoven.

Bij het intikken van de source-code viel het volgende op:

  1. De analoge ingangen hoeven blijkbaar niet als INPUT te worden gedefiniëerd. Sterker nog, bij het definiëren als INPUT, vervalt het analoge inlezen. Er komen dan ook geen analoge potmeter-waardes.
  2. Het defini-eren van alls aansluitingen nemen best veel regels in.
  3. De SetUp-Functie is lang, vanwege het setten van de diverse in- en uitgangen.

Het eind-resultaat van de totale uitbreiding is in de programma source-code te zien.


Broncode: [1: Potemeters die de RGB-Led aansturen.]

1: De broncode van Potemeters die de RGB-Led aansturen.

(Mon 03 February 2014) De afzonderlijke kleuren van de RGB-Led kunnen in real-time en afzonderlijk worden geregeld met de potmeters.

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/*

RGB, controled by 3 potentionmeters

*/


// Pin Definitions
int P1     = A0;   // Potmeter 1
int P2     = A1;   // Potmeter 2
int P3     = A2;   // Potmeter 3
int P4     = A3;   // Potmeter 4
int P5     = A4;   // Potmeter 5
int P6     = A5;   // Potmeter 6

int ledR   =  9;   // Led Red
int ledG   = 10;   // Led Green
int ledB   = 11;   // Led Blue
int ledPin =  6;   // Led BigOne

int Data   =  2;   // ShiftReg Data
int Clock  =  3;   // ShiftReg Clock
int Latch  =  4;   // ShiftReg Latch
int Outen  =  5;   // ShiftReg OutEn

word P1val  = 0;    // P1 Value
word P2val  = 0;    // P2 Value
word P3val  = 0;    // P3 Value
word P4val  = 0;    // P4 Value
word P5val  = 0;    // P5 Value
word P6val  = 0;    // P6 Value
word Shift =  0;    // Shift-Led Value

void setup()    // The Setup-routine runs once ... when you press reset.
{ // Initialize the Potmeter pins as analog input.
  //  pinMode(P1   , INPUT );
  //  pinMode(P2   , INPUT );
  //  pinMode(P3   , INPUT );
  //  pinMode(P4   , INPUT );
  //  pinMode(P5   , INPUT );
  //  pinMode(P6   , INPUT );

  // Initialize the RGB-Led pins as an digital output.
  pinMode(ledPin, OUTPUT);
  pinMode(ledR  , OUTPUT);
  pinMode(ledG  , OUTPUT);
  pinMode(ledB  , OUTPUT);
  analogWrite(ledPin,255);
  analogWrite(ledR,255);
  analogWrite(ledG,255);
  analogWrite(ledB,255);

  // Initialize the shift register pins as digital output.
  pinMode(Data , OUTPUT);
  pinMode(Clock, OUTPUT);
  pinMode(Latch, OUTPUT);
  pinMode(Outen, OUTPUT);
  UpdateShiftLEDs(0x0000);
  analogWrite(Outen,  0);
}

void loop()   // The Loop-routine runs over and over again ... Forever.
{ P1val = analogRead(P1) >> 2 ;
  P2val = analogRead(P2) >> 2 ;
  P3val = analogRead(P3) >> 2 ;
  P4val = analogRead(P4) >> 2 ;
  P5val = analogRead(P5) >> 2 ;
  P6val = analogRead(P6) >> 2 ;

  analogWrite (ledB  , 255 - P1val );
  analogWrite (ledG  , 255 - P2val );
  analogWrite (ledR  , 255 - P3val );
  analogWrite (ledPin,       P4val );
  analogWrite (Outen , 255 - P5val );

  Shift = 0;
  if      ( P6val <  43 ) { Shift = 4096*(P4val >> 4) + 256*(P3val >> 4) + 16*(P2val >> 4) + (P1val >> 4) ; }
  else if ( P6val <  85 ) { Shift = 0x8000 + P5val ; }
  else if ( P6val < 128 ) { Shift = 0x4000 + P4val ; }
  else if ( P6val < 170 ) { Shift = 0x2000 + P3val ; }
  else if ( P6val < 213 ) { Shift = 0x1000 + P2val ; }
  else                    { Shift = 0x0800 + P1val ; }
  UpdateShiftLEDs(Shift);
}

void UpdateShiftLEDs(word value)
{ digitalWrite(Latch, LOW);
  shiftOut(Data, Clock, MSBFIRST, value >> 8);
  shiftOut(Data, Clock, MSBFIRST, value);
  digitalWrite(Latch, HIGH);
}



Broncode: [1: Potemeters die de RGB-Led aansturen.]

Afbeeldingen

potmeter_rgb_1.jpg
1/4: potmeter_rgb_1.jpg.
potmeter_rgb_2.jpg
2/4: potmeter_rgb_2.jpg.
potmeter_rgb_3.jpg
3/4: potmeter_rgb_3.jpg.
potmeter_rgb_4.jpg
4/4: potmeter_rgb_4.jpg.

De aansluitingen van Aansluitingen.

Aansluitingen van de Potmeters en (vele Led's)

Arduino Uno

Pwr USB ?
 
?
aref
gnd Gnd (3x)
? d13
ioreff d12
reset d11 RGB Blauw
+3.3v d10 RGB Groen
+5V (3x) +5v d9 RGB Rood
Gnd (3x) gnd d8
Gnd (3x) gnd
Vin d7
d6 Grote Led
Potmeter 1 a0 d5 Sh OutEn
Potmeter 2 a1 d4 Sh Latch
Potmeter 3 a2 d3 Sh Clock
Potmeter 4 a3 d2 Sh Data
Potmeter 5 a4 d1
Potmeter 6 a5 d0