Go Down

Topic: Lampe Pantone (lampe qui reconnait les couleurs) (Read 2312 times) previous topic - next topic

shinework

Mar 09, 2013, 12:16 am Last Edit: Mar 09, 2013, 11:22 am by shinework Reason: 1
Hello !
Voici mon dernier projet: une lampe Pantone. Le concept est simple: on insère unecarte postale Pantone de la couleur désirée et la lampe la reconnait et la retransmet aussitôt via ses leds RGB :) Voici une vidéo présentant ma lampe https://vimeo.com/61349578




Matériels



  • Un Arduino

  • Un capteur de couleurs TCS230D (10€ sur eBay)

  • 4 Leds RGB avec 12 résistances

  • Fils électrique

  • 2 Shift Register (74HC595)

  • Cartes postales Pantone (15$ sur Amazon)

  • Une boite en bois pour le support (5€ chez Loisirs & Création)

  • Tubes à essai avec support (6€ chez Loisirs & Création)



Montage





Code source


Code: [Select]
#include <rgbconverter.h>
#include <timerone.h>
#define _useTimer1
#include <shiftpwm.h>

/* Color Sensor Pins */
#define S0     6
#define S1     4
#define S2     7
#define S3     5
#define OUT    2

/* LED Pins  */
#define LEDROUGE   5
#define LEDVERT    6
#define LEDBLEU    3

int   g_count = 0;    // Count the frequecy
int   g_array[3];     // Store the RGB value
int   g_flag = 0;     // Filter of RGB queue
float g_SF[3];        // Save the RGB Scale factor

/* ShiftPWM Config */
const int ShiftPWM_latchPin=8;
const bool ShiftPWM_invertOutputs = false;
const bool ShiftPWM_balanceLoad = false;
unsigned char maxBrightness = 255;
unsigned char pwmFrequency = 75;
int numRegisters = 2;
int numRGBleds = numRegisters*8/3;

// Init TSC230 and setting Frequency.
void TSC_Init()
{
 // Set output pin
 pinMode (LEDVERT,OUTPUT);
 pinMode (LEDROUGE,OUTPUT);
 pinMode (LEDBLEU,OUTPUT);
 pinMode(S0, OUTPUT);
 pinMode(S1, OUTPUT);
 pinMode(S2, OUTPUT);
 pinMode(S3, OUTPUT);
 pinMode(OUT, INPUT);
 
 // Output frequency scaling 2%
 digitalWrite(S0, LOW);  
 digitalWrite(S1, HIGH);
}
 
// Select the filter color
void TSC_FilterColor(int Level01, int Level02)
{
 if(Level01 != 0)
   Level01 = HIGH;
 
 if(Level02 != 0)
   Level02 = HIGH;
 
 digitalWrite(S2, Level01);
 digitalWrite(S3, Level02);
}
 
void TSC_Count()
{
 g_count ++ ;
}
 
void TSC_Callback()
{
 switch(g_flag)
 {
   case 0:
        Serial.println("->WB Start");
        TSC_WB(LOW, LOW); //Filter without Red
        break;
   case 1:
        Serial.print("->Frequency R=");
        Serial.println(g_count);
        g_array[0] = g_count;
        TSC_WB(HIGH, HIGH); //Filter without Green
        break;
   case 2:
        Serial.print("->Frequency G=");
        Serial.println(g_count);
        g_array[1] = g_count;
        TSC_WB(LOW, HIGH); //Filter without Blue
        break;
 
   case 3:
        Serial.print("->Frequency B=");
        Serial.println(g_count);
        Serial.println("->WB End");
        g_array[2] = g_count;
        TSC_WB(HIGH, LOW); //Clear(no filter)  
        break;
  default:
        g_count = 0;
        break;
 }
}
 
void TSC_WB(int Level0, int Level1)      //White Balance
{
 g_count = 0;
 g_flag ++;
 TSC_FilterColor(Level0, Level1);
 Timer1.setPeriod(1000000);             // Set 1s period
}
 
void setup()
{
 TSC_Init();
 Serial.begin(9600);
 Timer1.initialize(1000);
 Timer1.attachInterrupt(TSC_Callback);  
 attachInterrupt(0, TSC_Count, RISING);
 delay(5000);
 g_SF[0] = 255.0/ g_array[0];     //R Scale factor
 g_SF[1] = 255.0/ g_array[1];    //G Scale factor
 g_SF[2] = 255.0/ g_array[2];    //B Scale factor
 
 ShiftPWM.SetAmountOfRegisters(numRegisters);
 ShiftPWM.SetPinGrouping(1);
 ShiftPWM.Start(pwmFrequency,maxBrightness);
}
 
void loop()
{
  ShiftPWM.SetAll(0);
  g_flag = 0;
  int valR = int(g_array[0] * g_SF[0]);
  int valG = int(g_array[1] * g_SF[1]);
  int valB = int(g_array[2] * g_SF[2]);
  ledRVBpwm(valR,valG,valB);
  delay(5000);
}


void ledRVBpwm(int pwmRed, int pwmGreen, int pwmBlue) {
if(pwmRed > 255)
  pwmRed = 255;
if(pwmGreen > 255)
  pwmGreen = 255;
if(pwmBlue > 255)
  pwmBlue = 255;
   
  // RGB to HSV conversion
  byte r = pwmRed;
  byte g = pwmGreen;
  byte b = pwmBlue;
  double hsv[3];
  byte rgb[3];
  RGBConverter color;
  color.rgbToHsv(r,g,b,hsv);
   
  // Saturate the color thanks to HSV
  color.hsvToRgb(hsv[0],1,1,rgb);
  ShiftPWM.SetAllRGB(rgb[0],rgb[1],rgb[2]);
}


Pour quelques détails sur le projet c'est ici:
http://www.adrienbaptiste.com/developpement/lampe-pantone-arduino-capteur-de-couleurs-rgb-leds/1005








Jean-François

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Buxi

Bonjour

Pour améliorer l'effet de lumière dans les tubes, tu pourrais les remplir d'eau.

Go Up