Projet de classe probleme

Bonjour a tous

Alors voila j’ai un projet en classe qui me demande de lire des valeur RGB avec un capteur de couleur ( tcs34725 : RGB Color Sensor with IR filter and White LED - TCS34725 : ID 1334 : $7.95 : Adafruit Industries, Unique & fun DIY electronics and kits )
Mais j’ai un probleme : La led de ce capteur est trop puissante et je voudrais la rendre moins puissante, donc j’ai compris grace a mon prof qu’il fallait que j’utilise un port PWM de mon arduino uno pour controler ça mais je sais pas ou la relier sur mon capteur ( peut etre sur le 3.3v port ) mais n plus vu que je suis novice sur le codage arduino je ne sais pas comment faire ça :frowning:

Mon programme :

#include <Wire.h>
#include "Adafruit_TCS34725.h"

#define commonAnode true

byte gammatable[256];

Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_4X);

const int sLED = 3; //Control LED brightness on PWM pin for added calibration

void setup() {
  Serial.begin(9600);
  Serial.println("Color View Test!");

  if (tcs.begin()) {
    Serial.println("Found sensor");
  } else {
    Serial.println("No TCS34725 found ... check your connections");
    while (1); // halt!
  }
  for (int i=0; i<256; i++) {
    float x = i;
    x /= 255;
    x = pow(x, 2.5);
    x *= 255;
      
    if (commonAnode) {
      gammatable[i] = 255 - x;
    } else {
      gammatable[i] = x;      
    }
  }
}


void loop()
{
   uint16_t clear, red, green, blue;

  tcs.setInterrupt(false); 

  delay(6000);
  
  tcs.getRawData(&red, &green, &blue, &clear);

  tcs.setInterrupt(true);
  
  Serial.print("C:\t"); Serial.print(clear);
  Serial.print("\tR:\t"); Serial.print(red);
  Serial.print("\tG:\t"); Serial.print(green);
  Serial.print("\tB:\t"); Serial.print(blue);

  uint32_t sum = clear;
  float r, g, b;
  r = red; r /= sum;
  g = green; g /= sum;
  b = blue; b /= sum;
  r *= 256; g *= 256; b *= 256;
  Serial.println();
  Serial.print("C:\t"); Serial.print(clear);
  Serial.print("\tR255:\t"); Serial.print((int)r);
  Serial.print("\tG255:\t"); Serial.print((int)g);
  Serial.print("\tB255:\t"); Serial.print((int)b);
  Serial.println();
}

En espérant que vous pourrez m’aider, merci :wink:

Salut
Sur UNO, tu as plusieurs sorties PWM.
Le PWM c'est un hachage de tension. C'est une sortie digitale qui "fait clignoter" plus ou moins vite le pin de sortie pour "imiter une sortie analogique".
On commande une sortie PWM avec un byte, de 0 à 255 (5v).
Pour ce faire, mettons nous d'accord, et choisissons le pin 5. Tu vois sur ta carte UNO qu'il y a une petite vague ~ à côté du numéro de pin. Parce que c'est une sortie PWM. Les autres pins avec ce ~ sont aussi PWM.

Mets une led sur ton pin 5.
Tu te fais un code en déclarant le pin 5 comme OUTPUT.
Puis tu crées une ligne avec digitalWrite(5,255);
On va envoyer '150' sur le pin 5
Ta led est à fond, elle brille fort et va finir par cramer 8D yeah
Tu changes pour digitalWrite(5,150);
Oh bah! kiki s'passe?

Ton prof aurait pu aussi t'indiquer qu'une simple résistance faisait le boulot.

Si tu veux aller plus loin, on peut commander le pin 5 avec un potentiomètre, et ça devient la classe américaine.
mais ça c'est seulement si tu arrives déjà à commander ton pin 5 sans me demander de te faire le code 8D

Et n'oublie pas: on se brosse les dents trois fois par jour.

Salut

Je suppose que dans ton programme, la LED dont tu cherches à faire varier la luminosité est celle-ci :

const int sLED = 3; //Control LED brightness on PWM pin for added calibration

Attention Kammo, pas digitalWrite, mais analogWrite.

donc :

analogWrite(sLED, 150);

@+

kammo:
Salut
Sur UNO, tu as plusieurs sorties PWM.
Le PWM c'est un hachage de tension. C'est une sortie digitale qui "fait clignoter" plus ou moins vite le pin de sortie pour "imiter une sortie analogique".
On commande une sortie PWM avec un byte, de 0 à 255 (5v).
Pour ce faire, mettons nous d'accord, et choisissons le pin 5. Tu vois sur ta carte UNO qu'il y a une petite vague ~ à côté du numéro de pin. Parce que c'est une sortie PWM. Les autres pins avec ce ~ sont aussi PWM.

Mets une led sur ton pin 5.
Tu te fais un code en déclarant le pin 5 comme OUTPUT.
Puis tu crées une ligne avec digitalWrite(5,255);
On va envoyer '150' sur le pin 5
Ta led est à fond, elle brille fort et va finir par cramer 8D yeah
Tu changes pour digitalWrite(5,150);
Oh bah! kiki s'passe?

Ton prof aurait pu aussi t'indiquer qu'une simple résistance faisait le boulot.

Si tu veux aller plus loin, on peut commander le pin 5 avec un potentiomètre, et ça devient la classe américaine.
mais ça c'est seulement si tu arrives déjà à commander ton pin 5 sans me demander de te faire le code 8D

Et n'oublie pas: on se brosse les dents trois fois par jour.

Merci beaucoup des conseils, malheureusement je ne pourrais pas tester ce que vous m'avez dis avant mardi car je n'ai pas accés au matériel chez moi et il faut donc que je fasse ça pendant mes heures de projet en cours ...
Je vous tiendrai au courant de tous ça surement mardi soir...

Mais merci beaucoup d'avoir pris le temps de me répondre :slight_smile:

pepe:
Bonjour

La première chose à faire avant d’utiliser un matériel, c’est de lire la documentation qui le concerne afin de savoir comment l’utiliser et chercher à comprendre comment il fonctionne.

La recherche documentaire est rapide. En moins d’une minute, on peut trouver :

On peut tout d’abord constater que la seule entrée susceptible de faire varier la luminosité de la led est la broche LED_EN (#7).

Toutefois, une commande directe par PWM ne semble pas convenir. En effet, comme celle-ci se contente d’allumer et d’éteindre la led très rapidement avec un rapport cyclique réglable, il faut s’attendre à ce que la led se retrouve complètement allumée ou bien complètement éteinte, aléatoirement, chaque fois que le capteur fait une mesure. Quand bien même ce clignotement mènerait à réduire l’amplitude des mesures finales, cette réduction ne peut pas être finement contrôlée du fait de la désynchronisation entre le signal PWM et le processus de mesure, et cela ne règle pas le problème d’éblouissement instantané du capteur. Bref, au mieux, les mesures risquent d’être faussées en partie.

Il me semble qu’une commande par une tension continue serait plus indiquée. Ceci pourrait être réalisé à l’aide d’un signal PWM suivi d’un filtre passe-bas (avec une résistance et condensateur, par exemple).

Mais on peut également lire dans la datasheet du TCS34725 que la sensibilité du capteur peut être réglée logiciellement, en agissant sur le temps d’intégration (de 2,4 ms à 700 ms) et le gain (x1, x4, x16 ou x60).

Ces deux paramètres sont accessibles dans ton programme au moment de l’instanciation de Adafruit_TCS34725 :

  [size=9pt]  Adafruit_TCS34725 tcs = Adafruit_TCS34725([color=#b00000]TCS34725_INTEGRATIONTIME_[b]50MS[/b][/color], [color=#0000b0]TCS34725_GAIN_[b]4X[/b][/color]);  [/size] 

Un réglage correct de ces paramètres pourrait peut-être déjà résoudre le problème de trop forte sensibilité du capteur.

Une fois l’instanciation réalisée, on peut encore modifier les deux paramètres, séparément, à l’aide des méthodes setIntegrationTime() et setGain() :

void     setIntegrationTime(tcs34725IntegrationTime_t it);

void    setGain(tcs34725Gain_t gain);




Les valeurs à leur passer en paramètre sont des nombres entiers, définis comme suit :



typedef enum
{
  TCS34725_INTEGRATIONTIME_2_4MS  = 0xFF,  /<  2.4ms - 1 cycle    - Max Count: 1024  */
  TCS34725_INTEGRATIONTIME_24MS  = 0xF6,  /
<  24ms  - 10 cycles  - Max Count: 10240 */
  TCS34725_INTEGRATIONTIME_50MS  = 0xEB,  /<  50ms  - 20 cycles  - Max Count: 20480 */
  TCS34725_INTEGRATIONTIME_101MS  = 0xD5,  /
<  101ms - 42 cycles  - Max Count: 43008 */
  TCS34725_INTEGRATIONTIME_154MS  = 0xC0,  /<  154ms - 64 cycles  - Max Count: 65535 */
  TCS34725_INTEGRATIONTIME_700MS  = 0x00    /
<  700ms - 256 cycles - Max Count: 65535 */
}
tcs34725IntegrationTime_t;






typedef enum
{
  TCS34725_GAIN_1X                = 0x00,  /<  No gain  */
  TCS34725_GAIN_4X                = 0x01,  /
<  4x gain  */
  TCS34725_GAIN_16X              = 0x02,  /<  16x gain */
  TCS34725_GAIN_60X              = 0x03    /
<  60x gain */
}
tcs34725Gain_t;




La sensibilité minimale peut donc être obtenue dès le départ en écrivant :



Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_2_4MS, TCS34725_GAIN_1X);



ou par la suite en écrivant :



tcs.setIntegrationTime(TCS34725_INTEGRATIONTIME_2_4MS);



et :



tcs.setGain(TCS34725_GAIN_1X);

Oui j’avais lu la doc sur ce capteur mais j’avais rien trouvé comme port pouvant faire varier l’intensité de cette Led

En plus mon prof nous a donné aucune formation sur arduino qui est pourtant super interréssant je trouve mais mon code ne vient meme pas de moi et meme si je sais expliquer les differentes fonctions que j’utilise je ne connait pas toutes les autres fonctions il va falloir que je me trouve un moment pour apprendre tous ça …

Merci beaucoup des conseils, malheureusement je ne pourrais pas tester ce que vous m’avez dis avant mardi car je n’ai pas accés au matériel chez moi et il faut donc que je fasse ça pendant mes heures de projet en cours …
Je vous tiendrai au courant de tous ça surement mardi soir…

Mais merci beaucoup d’avoir pris le temps de me répondre :slight_smile:

hbachetti:
Salut

Je suppose que dans ton programme, la LED dont tu cherches à faire varier la luminosité est celle-ci :

const int sLED = 3; //Control LED brightness on PWM pin for added calibration

Attention Kammo, pas digitalWrite, mais analogWrite.

donc :

analogWrite(sLED, 150);

@+

Oui c'est une fonction que j'ai trouvé dans un programme sur internet ( car notre prof nous demande de chercher des exemples sur internet pour les utiliser dans notre projet car nous n'avons pas reçu de formation sur arduino) mais le problème c'est que je ne sais pas utiliser cette fonction et comment relier physiquement le capteur et la carte arduino pour faire fonctionner cette fonction meme si je présume qu'il va falloir relier le port "led" du capteur a un pin PWM de la carte ...

En plus je n'est pas accès a mon matériel chez moi, donc je ne pourrai que modifier cela mardi lors de mon cour de SI :frowning:

je n'avais pas lu toute la réponse :

Il me semble qu'une commande par une tension continue serait plus indiquée. Ceci pourrait être réalisé à l'aide d'un signal PWM suivi d'un filtre passe-bas (avec une résistance et condensateur, par exemple).

A mon avis, pepe t'a donné la solution.

@+

hbachetti:
je n'avais pas lu toute la réponse :

A mon avis, pepe t'a donné la solution.

@+

Ok je testerai ça avec mon prof alors :wink:

Merci à tous d'avoir pris le temps de lire et de comprendre mon probleme c'est super sympa :wink: