capteur de couleur tcs34725

#4
Merci à l'intérêt que vous portez au post.
J'ai réalisé le câblage suivant (j'espère que cela s'affichera)
tcs34725.jpg

Ensuite pour le programme, j'utilise blockly pour picaxe mais le souci je ne sais pas quelles sont les adresses pour lire les informations sur tcs34725
En fouillant sur le forum j'ai fait cela
symbol var_blanc_bas = w0
symbol var_blanc_haut = w1
symbol var_bleu_bas = w2
symbol var_bleu_haut = w3
symbol var_rouge_bas = w4
symbol var_rouge_haut = w5
symbol var_vert_bas = w6
symbol var_vert_haut = w7

main:
hi2csetup i2cmaster, %01010010, i2cslow, i2cbyte
hi2cout %10100000, ( %00000001 )
pause 3
hi2cout %10100000, ( %00000011 )
pause 3
do
hi2cin %10110100, ( var_blanc_bas , var_blanc_haut )
pause 3
hi2cin %10110110, ( var_rouge_bas , var_rouge_haut )
pause 3
hi2cin %10111001, ( var_vert_bas , var_vert_haut )
pause 3
hi2cin %10111010, ( var_bleu_bas , var_bleu_haut )
debug
loop
stop
Du coup, j'obtiens pour les variables 83 pour les "bas" et 255 pour les "haut"
En fait j'ai mis ces adresses en cherchant sur le forum mais je n'y comprends pas grand chose (même en regardant la datasheet du tcs34725)
Si vous pouviez m'aider ce serait sympa
A bientôt
 

Attachments

PieM

Senior Member
#6
Pour Michel, la puce est effectivement du 3V mais ce module comporte à priori un interface 5V - 3V. Voir https://www.adafruit.com/product/1334

@melcator07:
Oui ça se mélange les pinceaux !
hi2csetup i2cmaster, %01010010, i2cslow, i2cbyte : Ok pour ça, l'adresse est bonne ($29 *2) Vous pouvez utiliser I2Cfast avec ce module.
Si les données sont des bytes, les symboles ne sont pas des word.
ensuite,
hi2cin %10110100, ( var_blanc_bas , var_blanc_haut )
ça veut dire que vous allez lire le registre %10110100, et rapatrier deux données var_blanc_bas et var_blanc_haut
c'est faux; le registre correspondant au blanc est $14 et $15, rouge $16 et$17, vert $18 et $19, bleu $1A et $1B
Je pense que vos haut et bas sont en fait les lowbyte et highbyte de la valeur blanc qui est sur 16bits
Donc pour rester dans cette esprit, votre commande doit être :
hi2cin $14, ( b0 , b1 ) ce qui va lire lowbyte et highbyte de w0 ; le blanc sera donc w0
hi2cin $16, ( b2 , b3 ) ce qui va lire lowbyte et highbyte de w1 ; le rouge sera donc w1
and so on....

pour les symboles ;
symbol var_blanc = w0
symbol var_bleu = w1
symbol var_rouge = w2
symbol var_vert = w3

Quant à vos config avec hi2cout, ça ne correspond à rien.
 
#7
Bonjour et merci,

alors le programme serait ceci ? :
symbol var_blanc = w0
symbol var_bleu = w1
symbol var_rouge = w2
symbol var_vert = w3

main:
hi2csetup i2cmaster, %01010010, i2cfast, i2cbyte
do
hi2cin $14, ( b0 , b1 )
hi2cin $16, ( b2 , b3 )
hi2cin $18, ( b4 , b5 )
hi2cin $1A, ( b6 , b7 )
debug
loop
stop

Ca se mélange encore pour moi, je vois comment le lien entre b0 et var_blanc par exemple.
Et ensuite vous parlez de bytes mais (désolé pour mon inexpérience) je souhaite pouvoir détecter la couleur bleu, vert ou rouge ?
En outre j'utilise pixaxe editor 6.0.9.3
et j'obtiens ceci au niveau des variable
variable.jpg

Merci encore de votre patience et aide
 

PieM

Senior Member
#8
Ce capteur semble plus compliqué à adresser que ses homologues.
Il lui faut en effet une initialisation, bizarre, car par défaut l'oscillateur interne n'est pas actif.
et l'adresse des registres doit être sur 8 bits comprenant une partie de l'adresse.
Donc votre programme initial (sais pas où vous l'avez trouvé...) n'est peut être pas mauvais.

Par contre, avez vous mis les résistance de tirage sur scl et sda ?

programme


symbol var_blanc = w0 'w0 est formé de b0 et b1
symbol var_rouge = w1
symbol var_vert = w2
symbol var_bleu = w3

'init
hi2csetup i2cmaster, %01010010, i2cslow, i2cbyte

hi2cout %10100000,(%00000001) 'correspondrait au registre 0 soit enable et envoyer un 1 = power ON
pause 3
hi2cout %10100000,(%00000011) ' ...011 = power ON et RGB conversion ON
pause 3

main:
do
hi2cin %10110100,(b0,b1) , 10100 = $14, l'adresse du registre du blanc
hi2cin %10110110,(b2,b3) , ........
hi2cin %10111000,(b4,b5)
hi2cin %10111010,(b6,b7)
debug
loop






 
#10
Effectivement je n'ai pas mis de résistances de tirage... je ne pourrai le faire que demain mais je vous tiendrai au courant (car pour l'instant avec le nouveau programme pas de changement sur les variables)

J'apprécie votre aide précieuse.
 

PieM

Senior Member
#11
Michel, j'ai failli écrire la même chose que toi ! C'est en voyant la photo du bidule que j'ai eu un doute...

Melcator, suivez le conseil de Michel (MGU) il a fait un site sur le Picaxe absolument remarquable. Une référence pour les Picaxiens.
Concernant le programme, tester celui en #8, et sans R de tirage à V+, ça ne peut pas marcher !!
 
#12
Bonjour,

Ca marche (trop content), il manquait les résistances de tirage (10 kohms).
Merci pour le site de MGU, je n'avais pas saisi la notion des b0,b1 etc.. car j'utilisais blockly pour picaxe et il ne gère pas cela (ni la déclaration directe de variable).
Bref il me reste plus qu'à fouiller un peu car les valeurs (avec debug) ne sont pas super stables ... peut être voir dans les paramètres scales... je suis au début.
En tout cas merci

Ps : pour la petite histoire je suis prof de technologie en collège et on participe à un concours robotique qui doit gérer du vert, les autres concurrents utilisent du makeblock ou du lego ... ce serait sympa si picaxe tirait son épingle du jeu
 

PieM

Senior Member
#13
Bonjour,

Ca marche (trop content), il manquait les résistances de tirage (10 kohms).
Merci pour le site de MGU, je n'avais pas saisi la notion des b0,b1 etc.. car j'utilisais blockly pour picaxe et il ne gère pas cela (ni la déclaration directe de variable).
Bref il me reste plus qu'à fouiller un peu car les valeurs (avec debug) ne sont pas super stables ... peut être voir dans les paramètres scales... je suis au début.
En tout cas merci

Ps : pour la petite histoire je suis prof de technologie en collège et on participe à un concours robotique qui doit gérer du vert, les autres concurrents utilisent du makeblock ou du lego ... ce serait sympa si picaxe tirait son épingle du jeu
Super!
Le problème de blockly est sa limitation dans les fonctions. Travailler en Basic picaxe est à conseiller.
Oui, visiblement il y a certains paramètres qui doivent permettre de stabiliser la lecture. Vais regarder.
Sinon , il est possible de lisser les valeurs par soft de façon simple. Je vous dirai comment faire si vous êtes intéressé.

L'utilisation du makeblock est sans doute plus simple, car c'est une base arduino, qui a déjà les bibliothèques du tcs34725. Mais pas certain que cela permette de modifier les paramètres...
Makeblock et lego ont l'inconvénient d'être des solutions captives ...
 

PieM

Senior Member
#15
Merci PieM,
ton aide est précieuse et je suis preneur...
Avec toi, j'avance et tes conseils sont judicieux.
A bientôt
Merci,
rapidement, tu as un paramètre temps d'intégration : ATIME dans le registre $01.
par défaut il semble être à la valeur $FF soit 256.
son calcul est :
ATIME = 256 - tps d'intégration /2.54 en ms
donc à priori le temps d'intégration de base est 0 ms
Avec ATIME= $00 le tps d'intégration sera donc de 256 * 2.54 soit 650 ms

pour tester :
ajouter aux hi2cout:
hi2cout %10100001,(%00000000) ' ...00 = ATIME dans le registre 1

Si ça ne donne rien, on passera à une solution soft.

Il est évident que jouer sur ce temps va influer sur le temps de réponse de ton robot. A voir donc en fonction de ce qu'il doit faire...

Si tu ne dois lire que le vert, inutile de lire les autres couleurs , non ?
Le piège aurait été de demander à lire le jaune ! pas sûr que les élèves connaissent la synthèse additive des couleurs...
 
#16
Bonsoir,
J'ai mis du temps car en lisant la documentation page 9 et 17, j'ai vu qu'on pouvait placer des seuils (AILTL...) mais j'ai pas réussi du coup j'ai mis des seuil sur la variable "var_blanc". Puis après avec comparaison j'allume une del rouge, verte ou bleu (pour essai car pour mon robot il suffira de détecter le vert).
Code:
symbol var_blanc = w0 'w0 est forme de b0 et b1
symbol var_rouge = w1
symbol var_vert = w2
symbol var_bleu = w3

'init
hi2csetup i2cmaster, %01010010, i2cfast, i2cbyte

hi2cout %10100000,(%00000001) 'correspondrait au registre 0 soit enable et envoyer un 1 = power ON
pause 3
hi2cout %10100000,(%00000011) ' ...011 = power ON et RGB conversion ON
pause 3
'hi2cout %10100001,(%00000000) ' ...00 = ATIME dans le registre 1

main:
do
hi2cin %10110100,(b0,b1)
pause 3
hi2cin %10110110,(b2,b3)
pause 3
hi2cin %10111000,(b4,b5)
pause 3
hi2cin %10111010,(b6,b7)
pause 3
if var_blanc > 3000 and var_blanc < 14000 then 'seuil noir et blanc pour déclencher
if var_rouge > var_vert and var_rouge > var_bleu then
    	high B.3 ' lumière rouge
else
	low B.3
endif
if var_bleu > var_vert and var_bleu > var_rouge then
    	high B.4 'lumière bleu
else
	low B.4
endif
if var_vert > var_bleu and var_vert > var_rouge then
    	high B.7 'lumière bleu
else
	low B.7
endif
else
low B.3
low B.4
low B.7
endif
debug
loop
Du coup ça fonctionne correctement et c'est cool.
Merci aux solutions de PieM et le site de MGU est super

Ps : j'utilise une carte axe020 pour mon robot
 

PieM

Senior Member
#17
Bonsoir,
J'ai mis du temps car en lisant la documentation page 9 et 17, j'ai vu qu'on pouvait placer des seuils (AILTL...) mais j'ai pas réussi du coup j'ai mis des seuil sur la variable "var_blanc". Puis après avec comparaison j'allume une del rouge, verte ou bleu (pour essai car pour mon robot il suffira de détecter le vert).
Rich (BB code):
symbol var_blanc = w0 'w0 est forme de b0 et b1
symbol var_rouge = w1
symbol var_vert = w2
symbol var_vert = w3

'init
hi2csetup i2cmaster, %01010010, i2cfast, i2cbyte

hi2cout %10100000,(%00000001) 'correspondrait au registre 0 soit enable et envoyer un 1 = power ON
pause 3
hi2cout %10100000,(%00000011) ' ...011 = power ON et RGB conversion ON
pause 3
'hi2cout %10100001,(%00000000) ' ...00 = ATIME dans le registre 1

main:
do
hi2cin %10110100,(b0,b1)
pause 3
hi2cin %10110110,(b2,b3)
pause 3
hi2cin %10111000,(b4,b5)
pause 3
hi2cin %10111010,(b6,b7)
pause 3
if var_blanc > 3000 and var_blanc < 14000 then 'seuil noir et blanc pour déclencher
if var_rouge > var_vert and var_rouge > var_bleu then
        high B.3 ' lumière rouge
else
    low B.3
endif
if var_bleu > var_vert and var_bleu > var_rouge then
        high B.4 'lumière bleu
else
    low B.4
endif
if var_vert > var_bleu and var_vert > var_rouge then
        high B.7 'lumière bleu
else
    low B.7
endif
else
low B.3
low B.4
low B.7
endif
debug
loop
Du coup ça fonctionne correctement et c'est cool.
Merci aux solutions de PieM et le site de MGU est super

Ps : j'utilise une carte axe020 pour mon robot
Une autre façon de programmer pour la sélection:

Rich (BB code):
if var_blanc > 3000 and var_blanc < 14000 then 'seuil noir et blanc pour déclencher
      w4 = var_rouge min var_vert min var_bleu ' w4 sera le maxi des 3 valeurs
      select w4
            case var_rouge : high B.3 ' lumière rouge
            case var_vert : high B.7 ' lumière verte
            case var_bleu : high B.4 'lumière bleue
      end select
            low B.3, B.4, B.7
endif
Pour fixer des seuils, il te faut les définir dans les registres $04, $05,$06,$07 en entrant les low bytes et highbytes:
soit w10 = seuil haut 'donc formé de b20 et b21
soit w11 = seuil bas 'donc formé de b22 et b23
w10 = 14000
w11 = 3000
les instructions devraient être:

hi2cout %10100100,(b22,b23) 'seuil bas
hi2cout %10100110,(b20,b21) 'seuil haut
 
Last edited:
#18
Bonjour,

Super la modification de programme... je vois que je dois faire des progrès en basic (et d'autres choses d'ailleurs)
Je vais recevoir des capteurs de couleur tcs3200. Il semble plus simple à programmer. Je pense pouvoir le faire avec blockly pour picaxe (brique "compter pulsation en ..." ). Ce serait mieux pour l'utiliser avec mes élèves de collège.
A voir...
Merci en tout cas pour ton aide apportée.
A bientôt
 
#19
Bonsoir à l'équipe,
Je programme mes Picaxes, avec le Picaxe Editor, et avec les commandes BASIC Picaxe usuelles.

Dans divers posts du forum je vois des codes alourdis avec de multiples commandes [COLOR ...]
(voir PieM, ci-dessus)

Si je mets ce code dans l'éditeur, il me donne des erreurs de synthaxe au niveau de ces lignes [COLOR ...] pour ce mode d'écriture que je ne connais pas.

De quoi s'agit-il ???

Merci
 
Last edited:

PieM

Senior Member
#20
Bonjour,

Ces codes sont des BBcodes, des balises HTML de mise en forme du texte, que l'ancien forum savait décoder, mais le nouveau demande une astuce pour ça. Je réédite mon post pour que ça passe ...
 
#23
Bonjour,

Faire un copié du programme du forum.
Ouvrir un nouveau fil dans le bac à sable du forum par exemple; lui donner un titre.
Cliquer sur insérer </> code
Dans la fenêtre qui s'ouvre, sélectionner Avancé (BBcode) au lieu de Général.
copier le programme.
il est décodé et peut s'importer dans PE6, en couleur.

par exemple ce programme
Rich (BB code):
     'Initialise serial uplink
      hSerSetup B9600_8, %00001  '9600 baud @ 8MHz, Background, no invertion (receive or transmit)
      '                  %abcde where, for X2 chips:
      '              Bit a (bit 4): disable hserin       a=0*enable;     a=1 disable
      '              Bit b (bit 3): disable hserout      b=0*enable;     b=1 disable
      '              Bit c (bit 2): Receive  mode -      c=0*No invert;  c=1 Invert receive
      '              Bit d (bit 1): Transmit mode -      d=0*No invert;  d=1 Invert transmit
      '              Bit e (bit 0): Foregrd/Backgrd mode e=0 foreground; e=1*background
      '
Impressionnant le translateur Browserling ! merci ...
 
Last edited:
Top