[NON RESOLU...] Capteur couleur colorpal Parallax et Arduino

Bonjour à tous ! Après le capteur de son je m'attaque au capteur de couleur :smiley: La c'est un peu plus important car je souhaite l'intégrer dans un de mes projets d'étude.

J'ai acheter un capteur couleur colorPal Parallax RobotShop | Robot Store | Robots | Robot Parts | Robot Kits | Robot Toys Et je souhaiterai pouvoir l'utiliser sur un arduino Uno. J'ai fait quelque recherche sur google avant de poster et je dois dire que je suis un peu perdu... Je suis tombé sur ce post http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1276173955

Ils donnent un exemple de code pour son utilisation, mais ou je capte pas c'est que le colorpal à une sortie Sig, une pour le 5V et une pour le GND et là... / Connect ColorPAL SIG signal to Arduino pin 2 and 3.

Une idée ? Suis-je à coté de la plaque ? pas le bon code ?

Woot !! Ça marche ! enfin presque :smiley:

En faite le capteur à juste un Sig mais les informations sont envoyé et reçus par le même "connecteur" Donc il suffit juste de branché en série 2 et 3 :slight_smile:

Maintenant je suis capable de récupérer la couleur de l'élément qui ce retrouve devant le capteur grâce à ce bout de code :

void loop()
{
  //lecture de l'état du bouton 
  buttonState = digitalRead(buttonPin);
  
  char rByte[9];
  
    
      Color90.begin(4800);
      Color90.print("= (00 $ m)!");
      pinMode(3,INPUT);
    
      rByte[0] = Color90.read();
      if( rByte[0] == '

le code couleur ressort en Hexadecimal un peu tranché : 01D05F03A Ceci est en faite une couleur verte (0)1D(0)5F(0)3A : 1D5F3A

Mon but maintenant est de transformer le code Hexa en RGB. Pour ce faire en cherchant je suis tombé sur ceci :

void loop()  { 

    char s[] = "db b9 87";
    int xx;
    int yy;
    int zz;
    sscanf(s, "%x %x %x", &xx, &yy, &zz);
    Serial.print(xx);
    Serial.print(" ");
    Serial.print(yy);
    Serial.print(" ");
    Serial.print(zz);
    Serial.print("\n");
    Serial.print(s[2]);
    Serial.print("\n");

Ça fonctionne parfaitement... Mais je me heurte à compiler les deux codes. Comme ont peut le voir au dessus le code qu'il me faut pour transformer convenablement l'exa en RGB est dans ce format "1D 5F 3A" Mais ce que je récupère depuis le capteur est comme ceci 01D05F03A. Pour le moment je n'arrive pas à faire une chose toute simple, c'est à dire, supprimer le caractère zéro et remplacer le 3 et 6 par un espace pour ainsi retomber dans le format "1D 5F 3A" qui permettra ensuite d'être transformer en RGB.

Une petite idée ? Je suppose que cela ne doit pas être bien compliquer...
Je vous remercie d'avance de votre aide :slight_smile:

) {
       
        for(int i=0; i<9; i++) {
     
            rByte[i] = Color90.read();
         
         
          Serial.print(rByte[i]);

}
        Serial.println();
     
   
  }

}


le code couleur ressort en Hexadecimal un peu tranché : 01D05F03A Ceci est en faite une couleur verte (0)1D(0)5F(0)3A : 1D5F3A 

Mon but maintenant est de transformer le code Hexa en RGB. Pour ce faire en cherchant je suis tombé sur ceci : 

§DISCOURSE_HOISTED_CODE_1§


Ça fonctionne parfaitement... Mais je me heurte à compiler les deux codes. Comme ont peut le voir au dessus le code qu'il me faut pour transformer convenablement l'exa en RGB est dans ce format "1D 5F 3A" Mais ce que je récupère depuis le capteur est comme ceci 01D05F03A. Pour le moment je n'arrive pas à faire une chose toute simple, c'est à dire, supprimer le caractère zéro et remplacer le 3 et 6 par un espace pour ainsi retomber dans le format "1D 5F 3A" qui permettra ensuite d'être transformer en RGB. 

Une petite idée ? Je suppose que cela ne doit pas être bien compliquer... 
Je vous remercie d'avance de votre aide :)

Bon et bien je n'ai pas lâché l'affaire :slight_smile: et j'ai réussi ! J'ai trouvé comment changer le char en const char :slight_smile: c'est des trucs tout bête mais qui peuvent prendre du temps à un débutant..

Je suis maintenant capable d'allumer une LED RGB de la même couleur que l'objet qui ce trouve devant le détecteur ! Enfin même couleur, je me trouve quand même pas mal limité dans la gamme de couleur et la led tire un peu trop sur le bleu. en tout cas voici mon code : (il est sujet à être améliorer selon moi... et n'hésitez à donner votre avis pour que je puisse l'améliorer)

#include <SoftwareSerial.h>

SoftwareSerial Color90(2, 3);
const int buttonPin = 7;
int buttonState = 0;
int range = 0;
char rByte[9];

int Red = 9;                  
int Green = 11;                
int Blue = 10;

//valeur RGB de la led
int r = 0;                  
int g = 0;                  
int b = 0;

int xx ;
int yy ;
int zz ; 

/*====================================================
 / Connect ColorPAL SIG signal to Arduino pin 2 and 3
 / Baud Rate = 9600 kbps
 /
 /====================================================*/

void setup()
{

  
  Serial.begin(9600);
  Color90.begin(4800);
  
  pinMode(Red,OUTPUT);
  pinMode(Green,OUTPUT);        
  pinMode(Blue,OUTPUT);


  pinMode(2,INPUT);
  pinMode(3,INPUT);
  digitalWrite(2,HIGH); // Enable the pull-up resistor
  digitalWrite(3,HIGH); // Enable the pull-up resistor

  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);
  digitalWrite(2,LOW);
  digitalWrite(3,LOW);
  
  pinMode(2,INPUT);
  pinMode(3,INPUT);
  
  Serial.println("Pass 1");
  
  while( digitalRead(2) != HIGH || digitalRead(3) != HIGH ) {
    Serial.println("In the loop");
    delay(50);
  }
  
  Serial.println("Pass 2");

  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);
  digitalWrite(2,LOW);
  digitalWrite(3,LOW);
  delay(80);
  
  pinMode(2,INPUT);
  pinMode(3,OUTPUT);
  delay(100);  
}

//---------------------------------

void loop()
{
  //lecture de l'état du bouton 
  buttonState = digitalRead(buttonPin);

  
   analogWrite(Red,xx);         
   analogWrite(Green,yy);
   analogWrite(Blue,zz);
     
 if(buttonState == HIGH){
   range = 1;
 }
  
 if(range == 1){
 
   //Serial.print("etat: 1\n");
   Color90.begin(4800);
   Color90.print("= (00 $ m)!");
   pinMode(3,INPUT);
      
   rByte[0] = Color90.read();
   if( rByte[0] == '

Et vous pouvez voir ce que ça donne sur youtube :slight_smile:

) {
         
    for(int i=0; i<9; i++) {
       
      rByte[i] = Color90.read();
     
              rByte[0] = *" ";         
              rByte[3] = *" ";
              rByte[6] = *" ";
             
             
      Serial.print(rByte[i]);
     
     
      if(i == 8){
        range = 2;
        Serial.print("\n");
      }
      }
      //Serial.println();
    }
}

if(range == 2){
 
    sscanf(rByte, "%x %x %x", &xx, &yy, &zz);

Serial.print(xx);
    Serial.print(" ");
    Serial.print(yy);
    Serial.print(" ");
    Serial.print(zz);
    Serial.print("\n");
   
    range = 0;

}

}


Et vous pouvez voir ce que ça donne sur youtube :) 

http://www.youtube.com/watch?v=ckiKDRLtdks

Joli projet. Bravo !

churchill

Cela peut être sympas pour un "ambilight" home-made :smiley:

juste une petite question

ce capteur pourrait il être adapter pour en faire un suiveur de ligne (déplacement d'un véhicule mobile le long d'une ligne rouge sur un fond noir

Salutations et beau projet

Phil

chicotore:
Cela peut être sympas pour un "ambilight" home-made :smiley:

Et bien en faite c'est un peu ce que je suis entrain de faire pour mon projet final d'université :slight_smile: Je vous montrerais le résultat.

Pour le suiveur de ligne je suis pas certain car le capteur parallax permet de grâce au senseur de savoir les présences des couleurs RVB, retourne une valeur au format Hexadecimal. Je ne vois pas trop comment il pourrait faire être utiliser pour un suiveur de ligne. Après je ne suis que novice :stuck_out_tongue:

Bon je ne sais pour qu'elle raison je me suis retrouver avec un capteur qui ne fonctionnais plus... Je suis reparti sur le code de base pour trouver l'erreur

#include <SoftwareSerial.h>

SoftwareSerial Color90(2, 3);

/*====================================================
 / Connect ColorPAL SIG signal to Arduino pin 2 and 3
 / Baud Rate = 9600 kbps
 /
 /====================================================*/

void setup()
{
  Serial.begin(9600);
  Color90.begin(9600);

  pinMode(2,INPUT);
  pinMode(3,INPUT);
  digitalWrite(2,HIGH); // Enable the pull-up resistor
  digitalWrite(3,HIGH); // Enable the pull-up resistor

  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);
  digitalWrite(2,LOW);
  digitalWrite(3,LOW);
  
  pinMode(2,INPUT);
  pinMode(3,INPUT);
  
  Serial.println("Pass 1");
  
  while( digitalRead(2) != HIGH || digitalRead(3) != HIGH ) {
    Serial.println("In the loop");
    delay(50);
  }
  
  Serial.println("Pass 2");

  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);
  digitalWrite(2,LOW);
  digitalWrite(3,LOW);
  delay(80);
  
  pinMode(2,INPUT);
  pinMode(3,OUTPUT);
  delay(100);  
}

//---------------------------------

void loop()
{
  char rByte[9];

  Color90.begin(9600);
  Serial.print("123456"); 
  Color90.print("= (00 $ m) !");
   
  pinMode(3,INPUT);

  rByte[0] = Color90.read();
  if( rByte[0] == '

Vous voyez dans le void loop, j'ai ajouté Serial.print("123456"); juste avant le Color90.print("= (00 $ m) !"); et la le capteur refonctionne... si j'enlève le Serial.print ou si je met juste 5 caractère Serial.print("12345"); Le capteur ne fonctionnne plus... De plus, si je met le Serial.print après le Color90.print ça ne fonctionne plus non plus.

Par déduction je comprend que le nombre de caractère dans le Serial.print influence le Color90.print Mais je ne comprend vraiment pas pourquoi..
) {
    for(int i=0; i<9; i++) {
      rByte[i] = Color90.read();
      Serial.print(rByte[i]);
    }
    Serial.println();
  }

}


Vous voyez dans le void loop, j'ai ajouté Serial.print("123456"); juste avant le Color90.print("= (00 $ m) !"); et la le capteur refonctionne... si j'enlève le Serial.print ou si je met juste 5 caractère Serial.print("12345"); Le capteur ne fonctionnne plus... De plus, si je met le Serial.print après le Color90.print ça ne fonctionne plus non plus. 

Par déduction je comprend que le nombre de caractère dans le Serial.print influence le Color90.print Mais je ne comprend vraiment pas pourquoi..
void loop()
{
  char rByte[9];

  Color90.begin(9600);            <------------------- ?????
  Serial.print("123456"); 
  Color90.print("= (00 $ m) !");
   
  pinMode(3,INPUT);               <------------------- ?????

Je ne vois pas l'intérêt de ces deux lignes dans le loop. Normalement on le fait une fois pendant le setup et on ne le touche plus. D'autant que ni la vitesse ni la direction de la broche ne semblent changées ensuite. Peut être que ce Color90.begin est la cause de ton problème en réinitialisant l'objet Color90.

Je ne sais pas pourquoi mais la ligne Color90.begin(4800); présent dans le loop est nécessaire. Si je la retire le capteur ne fonctionne plus. Par contre je viens de voir que commme ceci

Color90.begin(4800);
Serial.print("------- ");
Color90.println("= (00 $ m) !");

Ça marche, et comme ceci :

Color90.begin(4800);
Color90.println("= (00 $ m) !");
Serial.print("------- ");

Ça ne marche plus, juste en passant le Serial.print après le println

Par contre le pinMode est aussi nécessaire, peut être pour aussi réinitialiser...

Je n'avais jamais trop regardé SoftwareSerial.
En cherchant sur le forum il semblerait qu'elle ne soit pas très performante comme librairie. On parle de problèmes d'initialisation (qui expliquerait la nécessité du pinMode).
Elle a l'air d'être remplacée par NewSoftSerial qui corrige pas mal de bug et qui fonctionne sous interruption ce qui n'impose pas d'être à l'écoute pour lire les caractères NewSoftSerial | Arduiniana.
Peut être une piste à explorer.

Pour le moment avec Newsoft j'ai juste réussi à allumer les petites DELs qui sont dans le capteur de couleur... mais je n'arrive pas à récupérer les informations. Je pense qu'il faudrait déjà que je comprenne mieux le code que j'utilise !

#include <NewSoftSerial.h>



NewSoftSerial Color90(4, 5);


int ledR = 9;
int ledG = 10;
int ledB = 11;


char rByte[9];


void setup()
{


  Serial.begin(9600);
  Color90.begin(9600);

  pinMode(4,INPUT);
  pinMode(5,INPUT);
  
  digitalWrite(4,HIGH); // Enable the pull-up resistor
  digitalWrite(5,HIGH); // Enable the pull-up resistor


  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  
  digitalWrite(4,LOW);
  digitalWrite(5,LOW);
  delay(80);

  pinMode(4,INPUT);
  pinMode(5,OUTPUT);
  

}

//---------------------------------

void loop()
{

    Color90.println("= (00 $ m) !");
   
    Serial.print(Color90.read(), BYTE);
 
    Serial.println();
    
  


}

j'ai simplifié au maximum le code pour mieux comprendre le fonctionnement.

Au début dans le setup le pinMode pour 4 et 5 et en INPUT et on active la resistance pull-up "manuellement avec le digitaWrite HIGH. Ensuite on repasse le pinMode 4 et 5 en OUTPUT afin de transmettre l'information d'allumer les DELs nécessaire dans le capteur et ensuite PinMode 4 en INPUT et le 5 en OUTPUT je ne comprend pas pourquoi. de plus, ce qui est dans le SETUP n'est pas sensé s'exécuté une seul fois ? Je serais ravi de quelques explications pour m'éclairer sur tout ceci.

Juste pour info le capteur couleur à 3 broches, la masse, le 5Volt et la troisième à les sortie 4 et 5 dessus.

Ensuite dans le void loop Color90.println("= (00 $ m) !"); permet, si je dis pas d'anerie, d'allumer les trois couleur dans le capteur.
Je tente de lire le Color90 mais sans succès, il me retourne un caractère "rien à voir" => ÿ

Edit : J'ai laisser tourner le capteur...et au bout d'un certains temps il ce coupe tout seul !

Juste pour info le capteur couleur à 3 broches, la masse, le 5Volt et la troisième à les sortie 4 et 5 dessus

Je viens de relire le post depuis le début et quelque chose m'avait échappé. L'interface de ton capteur serait une espèce de RS485.
Si les broches 4 et 5 sont branchées toutes les deux sur une broche du capteur il doit y avoir des conflits lorsque le capteur passe en émission. Lorsque tu veux mettre l'arduino en écoute du capteur il faut mettre le TX de l'arduino en INPUT. Ce qui explique le pinMode (,INPUT) qu'il y avait dans le code cité en exemple.

Donc selon toi je devrais laisser déclarer le broche 5 en input dans le loop pour la reception de donner ? Mais sinon le TX n'est-ce pas la sortie 1 sur l'arduino ? Je ne l'utilise pas :S

NewSoftSerial Color90(4, 5);

Quand tu crées l'objet Color90 tu déclares une broche comme étant une entrée et l'autre une sortie.
La broche en sortie, pouvant être en conflit avec la sortie de ton capteur, doit être mise en entrée lorsque tu écoutes le capteur et doit être remise en sortie lorsque tu veux envoyer une commande.

fdufnews:

NewSoftSerial Color90(4, 5);

Quand tu crées l'objet Color90 tu déclares une broche comme étant une entrée et l'autre une sortie.
La broche en sortie, pouvant être en conflit avec la sortie de ton capteur, doit être mise en entrée lorsque tu écoutes le capteur et doit être remise en sortie lorsque tu veux envoyer une commande.

Tout à fait est c'est bien ce qui est fait avec le code que j'ai présenté. Il est en transmetteur, envoi l'info pour allumer les DELs puis il passe en récepteur pour récupérer les informations que capte le senseur. La ou ça ne fonctionne pas c'est au niveau de la réception, je n'ai pas l'air de réussir a interpréter ce que je reçois.

:slight_smile: Hello chesnel

I've been trying the colorpal but not having much luck with it!

:slight_smile: Basically, I've been playing with the code you posted here but it doesn't seem to work at all for me!
Have you modified your existing code in anyway and could you possibly share it?
Thanks....