收到社区寄来的板子,也不枉参加了一次活动,正好从爱板拍了一个颜色传感器,研究了几天,晓有心得分享一下。此帖在爱板也发了,转发到这里赚点币。传感器的资料请去官网下载(DFrobot)/ A! N. t. }( P; e K
1. 硬件准备. P! Z! ?/ M( M
开发板7 |; m+ T, c# r5 ]6 g# `) Z* f
tcs34725 color sensor
- |+ l3 O p& M* V2 N7 q2 @导线 4根: W9 X v, b' i, w4 f5 D( E
2连接方式(兼容ardunio的pin)- r4 D: m1 k: d1 J6 b
. Z: E) I) I1 G" R5 n! E5 q
传感器===》Nucleo
Q( w$ F& | j% U1 o: P, I+ r. GSDA==>SDA/D14* E) }! C6 v( l% r2 C
SCL==》SCL/D15$ ]& ]: }! ~7 V) w1 a4 C
注意不是A4,A5
# a6 P3 T1 j# V0 `5 M
p2 @$ d' p3 D6 V2. 软件开发环境 mbed 在线编译. z: J- M U( ~* x) R
修改一下频率为(100000)原来是200000会报错2 o& o; x6 H( p2 t: d$ y5 [- `
$ L& [7 m3 j. C5 M" T U. R8 E
1 ~6 r! [. \; s& F& O7 S; Q
: h5 u& C4 j, i' m' a# p
" Z9 O% z- j( a! G
- {& h# l3 q* C B附上代码,非常简单1 @% {3 Q2 ~" b; B: Z: T" s/ \
9 {; h' M* }5 ?$ r- // Example program connecting to the TCS34725 Color Sensor to the K64F using I2C
8 L3 ^- I& n: T& L& |& d; r% k. k - ( c) K3 k0 x/ Z
- #include "mbed.h"5 C5 |# V' z. P9 p
; D) A: o2 `9 g, k* @- I2C i2c(I2C_SDA, I2C_SCL); //pins for I2C communication (SDA, SCL)4 X+ O2 q W6 O. ^9 J4 I2 ?
- Serial pc(USBTX, USBRX);
# j) x/ i0 M* T2 ~ - 6 ^( d2 ~0 _* f5 @9 @. B
- int sensor_addr = 41 << 1;: w' ~1 K5 Z. y- G8 r
% }4 L0 V6 w7 E- DigitalOut green(LED1);6 M5 z8 h( }7 P: B' u3 ^
8 w U4 N5 N; G- int main() {* P" R L* R$ i6 @4 z' O
- pc.baud(9600);/ i' x1 D- i+ E2 V3 d8 }, d
- green = 1; // off
& X2 P. |5 m; z0 J! q3 N* m: a% N -
" a# @& @$ ~- L4 S - // Connect to the Color sensor and verify whether we connected to the correct sensor.
( O& l7 m/ D$ i8 d -
7 k8 L9 W: \: ~3 O+ b7 P - i2c.frequency(100000);//修改为100000,否则报错& T" O$ h. y1 `# G
- # c' q2 t9 k, s! [9 U; b
- char id_regval[1] = {146};2 a) y$ o4 V3 o1 a
- char data[1] = {0};2 k5 t# I8 ?: ]! J
- i2c.write(sensor_addr,id_regval,1, true);
i2 q p4 R! V8 d* f - i2c.read(sensor_addr,data,1,false);
" }: g! O) A& K8 d" M o2 K- G -
. R! N* S4 L3 e - if (data[0]==68) {* Y2 ^& ~/ f0 i5 ]! k
- green = 0;
' w5 r% Y; h8 [# b+ R - wait (2); : h4 E1 S# d4 ~) C X
- green = 1;
) m- i" Y0 u$ x8 F( c( T. | - } else {
7 X J+ T6 Q( G, C - green = 1; 7 a* x) I2 y+ u+ {
- }' b8 l; H. X) \
- 3 ?, _+ }' l2 Q, N" G7 ^
- // Initialize color sensor
4 A( c# X1 V9 u8 d: Y) n - - Y5 m6 l5 }0 v0 ?- ?
- char timing_register[2] = {129,0};6 X4 n, w8 @. H/ ^- |# q( V1 e
- i2c.write(sensor_addr,timing_register,2,false);" T( b+ p/ G5 g0 |
-
; ]. k# k% ~ [( ` - char control_register[2] = {143,0};8 ^7 n3 _* X, f0 }* }* U9 Q
- i2c.write(sensor_addr,control_register,2,false);0 g) I* y7 g3 b1 l) C/ E% G
- 5 L0 X4 ?/ o, P- Y( @
- char enable_register[2] = {128,3};8 ?& |9 D O$ z; b4 L: H1 v6 x
- i2c.write(sensor_addr,enable_register,2,false);
9 N8 @- n( I9 | -
4 I/ s3 ]/ i' w - // Read data from color sensor (Clear/Red/Green/Blue)
: ^4 e% k8 n% b5 @5 ]9 x6 v1 T( ^ - , K" {$ n( t3 C' S& i/ r
- while (true) { % \* G$ C7 T3 D: o9 }* U
- char clear_reg[1] = {148};( F- O: H) E, ?4 X$ g
- char clear_data[2] = {0,0};+ k u0 `, x4 L. D0 _+ b
- i2c.write(sensor_addr,clear_reg,1, true);
0 J K1 X4 T% x- K( i/ I* p2 F - i2c.read(sensor_addr,clear_data,2, false);0 g1 I* i } f8 N% r
- \/ x @1 D1 a# J: w4 _
- int clear_value = ((int)clear_data[1] << 8) | clear_data[0];7 M1 o, Z# t) `
- r& \2 l6 z+ Y U; Y
- char red_reg[1] = {150};8 f! \( F# @% t5 m
- char red_data[2] = {0,0};- @' U2 s) m$ U- }' W: ^8 b
- i2c.write(sensor_addr,red_reg,1, true);
$ c; h3 }* b# v( v( b2 E - i2c.read(sensor_addr,red_data,2, false);. ?1 I3 a/ {2 V4 x
-
5 C6 ]$ V" ^. m - int red_value = ((int)red_data[1] << 8) | red_data[0];+ l5 _' p5 s1 g' L: I7 K) V
- 2 }! t3 x9 b, x. B+ V3 \! |
- char green_reg[1] = {152};. c" b/ {9 U8 { Y
- char green_data[2] = {0,0};" T/ l3 n- i f7 j- u- w
- i2c.write(sensor_addr,green_reg,1, true);
# l/ a- s }; s7 d* u - i2c.read(sensor_addr,green_data,2, false);6 C0 J$ U; b( C/ E( z* c
- 7 w( @1 q# m1 v G
- int green_value = ((int)green_data[1] << 8) | green_data[0];
: g# ]5 o7 l" Y* M4 A -
$ w5 }" `' r3 e, g, y - char blue_reg[1] = {154};
( h* R7 u, o8 y. p7 K, M( D! ] - char blue_data[2] = {0,0};& A0 `2 ]+ U o: Z
- i2c.write(sensor_addr,blue_reg,1, true);
( H# h( _+ a7 u! [. A. j - i2c.read(sensor_addr,blue_data,2, false);
5 {3 U+ {0 U% N - & s3 P1 S9 S& m5 N
- int blue_value = ((int)blue_data[1] << 8) | blue_data[0];
8 V4 e0 Z2 `8 W# ` - 5 @; t+ ^( u& q5 h
- // print sensor readings
: X* k4 J, u) ~- A - % T6 p/ {& o2 f9 o3 M0 ]) _* E
- pc.printf("Clear (%d), Red (%d), Green (%d), Blue (%d)\r\n", clear_value, red_value, green_value, blue_value);
' B8 c$ x: u% d3 {" S* Y/ y - wait(0.5);. o9 m: B9 e2 }/ A! P: a
- }
- X( B* c: z/ P% | - & x L5 @ T2 g" z; i
- }
复制代码 ' W& v7 {# @# k+ A) `7 ~5 x
0 [7 J: L& G ~4 p4 ?
下载编译结果,打开串口助手之类的,使用三种颜色来实验,结果如下(传感器不能离的太近,否则数值飙升)' d: h) Y5 e* Z$ C* i
5 Q& M" ]) ]4 `7 m, Z7 e
1 t; D1 r! g) Z* k" L
9 a- ~$ n+ W, }# D. V$ l
. d/ G; V: V& y- m0 _" M3 e+ V; q: m
3 Y6 E2 d+ Y5 I- D( U# q
# A* g# o: M9 O' S" m
# m4 X0 | x: N( D使用红色的时候,红色值偏大,使用蓝色,蓝色值偏大,另外两个值基本固定在100多不到200.. X/ C1 J5 g8 c9 M
$ f* [0 z T: x+ ^* e4 ?* g+ J
# u; C0 F) V v. m8 s
7 E3 |* H4 T4 W# c0 i最后来张合影
& T# b: d, ^# N; I6 t( E7 [" M% G6 ?% C& _( K. s* F$ m* @
# _, K+ u& |& g. M* h
( X r9 p$ W; @! C/ m/ W0 f! L' y% L% }7 E Q+ ^
|
高手都在玩Linux了,
过奖了,我也是初学者刚刚入门,这个传感器确实贵,我是拿金币拍的,拍完就回到解放前了
感谢破总捧场