Sera a tutti...
negli ultimi giorni anche io ho smanacciato un po' con dei led rgb a catodo comune, quindi devo pilotare i tre colori dal polo positivo.
avevo in casa dei uln2004 e uln2803 ma vanno bene per led ad anodo comune.
Ho testato un circuito di pilotaggio con degli IRF9540, che pero' mi sono sembrati esagerati per il lavoro che gli richiedevo (i led che ho al momento in casa sono da 1W - 150mA per colore).
Ho ordinato dei transistor PNP, i bd140 e sto aspettando che mi arrivino.
nel frattempo ho costruito un circuito (con dei 2n3906) per poter giocare con il sw mentre aspetto i bd140
ho collegato anche un ricevitore IR per poter controllare la futura lampada in produzione con un telecomando.
qui trovate il circuito di pilotaggio con IRF9540:
http://blog.lampugnani.org/arduino/pilotare-elevati-correnti/
e questo è il codice a cui sto lavorando:
#include <IRremote.h>
//#include <avr/pgmspace.h>
#include "ir_rgb.h"
#include <util/delay.h>
#define LEDPP 13 //LED POWER PIN
int gnd_pin = 16;
int vcc_pin = 17;
int RECV_PIN = 19;
char cmd[] = {
0, 0, 0};
char arg[]= {
0,0};
int incomingByte = 0;
//store value of any color
int r=0;
int g=0;
int b=0;
//store status of dev
//0 = static color
//1 = rand_col function
//2 = flash function
int system_stat = 0;
IRrecv irrecv(RECV_PIN);
decode_results results;
unsigned long decode(unsigned long value){
unsigned int b0 = (value&0xff00)>>8;
unsigned int b1 = (value&0x00ff);
// Serial.println(b0, HEX);
// Serial.println(b1, HEX);
unsigned int ret = -1;
for (int i=0; i < 24; i++) {
if(b0 == myBtn[i][0] && b1 == myBtn[i][1]){
if (myBtn[i][5] <= 3 || myBtn[i][5] == 11 || myBtn[i][5] == 15 || myBtn[i][5] == 19 || myBtn[i][5] == 23) {
switch(myBtn[i][5]){
case 0:
{
r=r+10;
g=g+10;
b=b+10;
rgb();
break;
}
case 1:
{
r=r-10;
g=g-10;
b=b-10;
rgb();
break;
}
case 2:
{
analogWrite(9,0);
analogWrite(10,0);
analogWrite(5,0);
break;
}
case 3:
{
rgb();
break;
}
case 11: //FUNCION flash button
{
system_stat = 2;
break;
}
case 19: //FUNCION fade button
{
system_stat = 1;
break;
}
}
}
else {
r=myBtn[i][2];
g=myBtn[i][3];
b=myBtn[i][4];
rgb();
//rgb(myBtn[i][2], myBtn[i][3], myBtn[i][4]);
}
ret = myBtn[i][5];
continue;
//ret = i;
}
}
return ret;
//return value;
}
void rgb() {
analogWrite(9,r);
analogWrite(10,g);
analogWrite(5,b);
}
void rand_col() {
randomSeed(analogRead(0));
// randomSeed((r+0)*(g+0)*(b+0));
int color,i,value,time=10; // how long does it take each step
color=random(1,4); // which color to dim now
value=random(0,256); // new value of that color
switch(color) {
case 1:
if(r>value) for(i=r;i>value;i--) {
r = i;
rgb();
delay(time);
}
else for(i=r;i<value;i++) {
r = i;
rgb();
delay(time);
}
r=value;
break;
case 2:
if(g>value) for(i=g;i>value;i--) {
g = i;
rgb();
delay(time);
}
else for(i=g;i<value;i++) {
g = i;
rgb();
delay(time);
}
g=value;
break;
case 3:
if(b>value) for(i=b;i>value;i--) {
b = i;
rgb();
delay(time);
}
else for(i=b;i<value;i++) {
b = i;
rgb();
delay(time);
}
b=value;
break;
}
// delay(3000); // some time before next change
}
void bedazzle(int ledmax, int pulselensec, int freqmin, int freqmax) {
long pulses;
r=0;
g=0;
b=0;
rgb();
// analogWrite(redpin1, 0);
// analogWrite(redpin2, 0);
// analogWrite(greenpin1, 0);
// analogWrite(greenpin2, 0);
// analogWrite(bluepin1, 0);
// analogWrite(bluepin2, 0);
//
// note we dont use red LEDs in this
int freq = random(freqmin, freqmax+1);
int pulsedelay = 1000/freq;
pulsedelay /= 2;
pulses = pulselensec;
pulses *= 100;
pulses /= 2*pulsedelay;
// Serial.print("pulsing at ");
// Serial.print(freq, DEC);
// Serial.print(" Hz (");
// Serial.print(pulsedelay, DEC);
// Serial.println(" ms on/off)");
// Serial.print(pulses);
// Serial.println(" pulses");
while (pulses--) {
r=random(0,ledmax);
g=random(0,ledmax);
b=random(0,ledmax);
rgb();
_delay_ms(pulsedelay);
r=0;
g=0;
b=0;
rgb();
//_delay_ms(pulsedelay);
if (system_stat != 2) return;
}
}
void setup()
{
pinMode(gnd_pin, OUTPUT);
digitalWrite(gnd_pin, LOW);
pinMode(vcc_pin, OUTPUT);
digitalWrite(vcc_pin, HIGH);
Serial.begin(9600);
Serial.print("enabling IR ");
irrecv.enableIRIn(); // Start the receiver
pinMode(LEDPP, OUTPUT);
digitalWrite(LEDPP,HIGH);
// rgb(0,0,255);
//delay(3000);
// Serial.begin(9600);
}
void loop()
{
if (irrecv.decode(&results)) {
Serial.print("Pressed button: ");
//Serial.println(results.value, HEX);
int result = decode(results.value);
if (result != -1 && result != 11 && result != 15 && result != 19 && result != 23){
system_stat = 0;
}
Serial.println(result);
irrecv.resume(); // Receive the next value
}
if (system_stat == 1) {
rand_col();
}
if (system_stat == 2) {
bedazzle(255, 10, 7, 11);
}
if (Serial.available() > 0) {
incomingByte = Serial.read();
for (int i=0; i < 3; i++){
cmd[i] = cmd[i+1];
cmd[3] = '\0';
}
cmd[2] = incomingByte;
if(cmd[0] == 's' && cmd[1] == 'e' && cmd[2] == 't'){
Serial.println("setting");
if (Serial.available() > 0) {
for(int i=0; i<2;i++){
arg[i]=Serial.read();
}
}
if(arg[1] == '1') {
r=255;
g=255;
b=255;
rgb();
}
if(arg[1] == '0') {
r=0;
g=0;
b=0;
rgb();
}
}
if(cmd[0] == 't' && cmd[1] == 'r' && cmd[2] == 'i'){
Serial.println("tricolor");
if (Serial.available() > 0) {
for(int i=0; i<2;i++){
arg[i]=Serial.read();
}
}
if(arg[1] == 'r') {
r=255;
g=0;
b=0;
rgb();
}
if(arg[1] == 'g') {
r=0;
g=255;
b=0;
rgb();
}
if(arg[1] == 'b') {
r=0;
g=0;
b=255;
rgb();
}
if(arg[1] == 'w') {
r=255;
g=255;
b=255;
rgb();
}
}
}
}
il file ir_rgb.h contiene i codici dei tasti del mio telecomando...
se interessa posto anche quello...
sempre se interessa prossimamente posto foto del prototipo già funzionante.