Go Down

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

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<br />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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy