收到社区寄来的板子,也不枉参加了一次活动,正好从爱板拍了一个颜色传感器,研究了几天,晓有心得分享一下。此帖在爱板也发了,转发到这里赚点币。传感器的资料请去官网下载(DFrobot)
" V5 b$ J' d# V5 S1. 硬件准备
; |# o& `: h! l' `7 |开发板
" C: f7 v! l1 z# X9 t( ?2 rtcs34725 color sensor5 G: q. {8 {6 v p" V# r- w4 Z
导线 4根1 P0 H) w$ B% Q5 X$ I6 d2 R& \
2连接方式(兼容ardunio的pin)
: s6 ]+ T" N7 E9 k( s. G4 _9 ^" Y! \9 j7 F- K8 {1 ]
传感器===》Nucleo
5 d _& M4 q3 T. m/ y* aSDA==>SDA/D14
4 p7 r+ f4 T; M' ?$ ySCL==》SCL/D15
- r. x- l$ o C. {4 d ]注意不是A4,A5/ G0 O$ D% ~+ a7 x. ^
' p1 h7 \! y0 u/ _5 u2. 软件开发环境 mbed 在线编译) t5 P% Y. Z7 C( Y3 q+ r
修改一下频率为(100000)原来是200000会报错) F6 a9 N. ?5 @& ?0 z3 l- h8 v! p' Z0 V
* P) G6 w5 l, z6 a/ L
5 q, A4 V, j* S4 t/ |, y* h
. c2 N8 v) h. I1 F, ~# E g
! Q$ r1 ^* g* k# ^+ n4 ?
# R- m8 H( L+ L) b2 P& {
附上代码,非常简单
5 E0 z% o3 h7 h4 V& S
" Z1 \+ G" Y) c- // Example program connecting to the TCS34725 Color Sensor to the K64F using I2C
4 w; C4 R9 Z! o1 Q: J8 j! U1 e$ v - 0 u8 t$ `* P6 D
- #include "mbed.h"
+ a5 U h3 \2 k F) m* ]6 S
+ e3 ^( ~% w5 Q3 x1 V- I2C i2c(I2C_SDA, I2C_SCL); //pins for I2C communication (SDA, SCL)1 O Q+ P' I6 O; n
- Serial pc(USBTX, USBRX);1 Y3 @* V% o4 b7 R8 h
- ; O( q* b$ P% V
- int sensor_addr = 41 << 1;
. |! i @8 r( H
+ l0 w- a7 P% q- DigitalOut green(LED1);
: O4 J+ X. W) w! i
( K) H: o1 j" ^( ?; A# }- int main() {$ F+ |- i/ u. I. R2 D7 }; e
- pc.baud(9600);% A0 u4 v2 p- y: n& `1 k7 ?
- green = 1; // off$ `( h& E4 k# v/ j5 J3 p# d
-
- E9 v, a' ^" ^, M - // Connect to the Color sensor and verify whether we connected to the correct sensor. 6 [+ X9 K. e3 N% Y+ q
-
/ W5 p7 g7 ~7 [6 x9 i - i2c.frequency(100000);//修改为100000,否则报错$ D4 k/ j( Z0 ~$ c, S4 S
- @7 x. D/ X, }/ u
- char id_regval[1] = {146};- N: F) J# K( j9 m6 @8 O. x' i
- char data[1] = {0};
; C8 b5 a, [7 o3 U, s - i2c.write(sensor_addr,id_regval,1, true);
C8 n& v6 p: y) p - i2c.read(sensor_addr,data,1,false);+ n5 N1 \% F- x$ j* E
-
) Z$ K8 T( A+ k' n - if (data[0]==68) {$ l- w! G3 T( i* x
- green = 0;/ Q k2 B( _! U; s2 w" X) ]# h
- wait (2);
- _% O( ?' z) U) @# w - green = 1;5 m% B! w, F) ~( [0 ~- @- K5 p
- } else {
+ X2 B: I$ M5 y/ I2 n4 r - green = 1; % A5 ]: ?$ `7 F8 l
- }
- m8 K( T* U( R7 ~9 ~, N: u -
, u" v r+ E6 H+ f; R e7 b - // Initialize color sensor
5 H o3 ?* F0 I# v/ E0 T - $ B6 t) e1 q+ t) \0 u" E
- char timing_register[2] = {129,0};
3 r6 N4 @; F. G \1 ] - i2c.write(sensor_addr,timing_register,2,false);8 k& D) K9 |9 b- [* R8 w- V h/ {
-
?. C5 g. Y4 m. H0 W7 M - char control_register[2] = {143,0};
: o. M$ ?5 L# ]) G# b9 Q - i2c.write(sensor_addr,control_register,2,false);
$ D S: l. G, _# r |8 R/ | -
) c+ Z6 O, ^2 ] - char enable_register[2] = {128,3};3 p+ z, {/ ~: }. ?; D! C
- i2c.write(sensor_addr,enable_register,2,false);
5 i& R0 W3 i" ^) p - 1 D( @3 m3 s3 g- ~, ^1 Z
- // Read data from color sensor (Clear/Red/Green/Blue)& }8 s- P& v$ S
- 4 Y5 p$ K* h, j* U; Y! M
- while (true) {
! O/ S6 r% r4 _. D - char clear_reg[1] = {148};( B2 X( V( H; s+ {
- char clear_data[2] = {0,0};
a l* A7 z" w! K+ d$ M4 X - i2c.write(sensor_addr,clear_reg,1, true);3 ?/ N- b2 x# b" P; h
- i2c.read(sensor_addr,clear_data,2, false);! Z8 s+ K+ G w
-
7 z/ Z3 E1 E& y2 m1 | - int clear_value = ((int)clear_data[1] << 8) | clear_data[0];
_$ l/ w: e$ G* d: f0 ] -
2 n( A8 \+ T+ t1 d7 H - char red_reg[1] = {150};+ C5 S7 l+ w# d7 x1 p+ y* D# n
- char red_data[2] = {0,0};
/ H+ ?, B! n/ b0 I% M7 \# |: p) ^ - i2c.write(sensor_addr,red_reg,1, true);
# _" s% @. V4 { O' J% k - i2c.read(sensor_addr,red_data,2, false);1 @9 V; g% P ?+ _( V5 Z
- 4 m( B Z! ?6 Q& n. [. n
- int red_value = ((int)red_data[1] << 8) | red_data[0];- W6 K9 n3 G# h2 k5 L; k4 N7 h- E
-
, u, E" \8 }% L( J9 ^+ [ - char green_reg[1] = {152};
9 {# Y4 [ s6 y) o) O - char green_data[2] = {0,0};# n1 t$ r% C, \4 G- ?9 ~
- i2c.write(sensor_addr,green_reg,1, true);
/ J" U& F. j: x( H - i2c.read(sensor_addr,green_data,2, false);/ Z/ w. D, g6 O5 b
-
F* u2 x8 z* b3 l7 B9 t - int green_value = ((int)green_data[1] << 8) | green_data[0];1 Q( Y+ e- h( i5 u1 z
- 2 `; z: ?5 Y: W# |
- char blue_reg[1] = {154};- [8 x! h0 f' E3 [# U/ H
- char blue_data[2] = {0,0};
5 F+ P5 ^/ K0 L/ f2 z - i2c.write(sensor_addr,blue_reg,1, true);2 v6 l% m+ E3 `4 T' l. u* d
- i2c.read(sensor_addr,blue_data,2, false);
. y7 [; A2 F" j1 w8 C0 r -
s7 M$ j' Y1 O" i0 D/ V6 n - int blue_value = ((int)blue_data[1] << 8) | blue_data[0];
# ?8 S2 ?; M1 K) b* \ -
$ h. }. `) R4 ^1 Y* k x6 j - // print sensor readings2 }7 o" W7 o! J; t0 w, y5 U
-
; T7 A; Z) e& ^, t6 b d% b - pc.printf("Clear (%d), Red (%d), Green (%d), Blue (%d)\r\n", clear_value, red_value, green_value, blue_value);9 p+ j. W* D: `
- wait(0.5);, b0 v3 V- h0 e
- }0 G) o" s1 G( g/ b+ q0 M8 B
- * r/ T: A; w* b. N; k; f
- }
复制代码
1 ~2 y6 i& K. i* R% \
f( I$ O3 S7 a下载编译结果,打开串口助手之类的,使用三种颜色来实验,结果如下(传感器不能离的太近,否则数值飙升)
, y4 H4 z8 m9 R, @5 E
! s6 X5 o# ?( `# a1 x# o Q
; K0 U4 f! {9 y5 u
* Z# q0 o) l$ c+ E3 t
' T: C T8 O9 Y; l2 Z& Y4 F, n0 V1 D$ K$ j2 B: i
! e9 ?5 e* u5 s
& i& B: [- }1 _( s7 x' C( F使用红色的时候,红色值偏大,使用蓝色,蓝色值偏大,另外两个值基本固定在100多不到200.
* O( m2 [" v0 r
. h. U8 `+ }+ G. L* v8 u4 o* g F4 o* o; M: z# |
% @. a# k9 g1 O+ J- W% ^最后来张合影
( j, \/ `1 x2 o# ~, j: C. A( q& K7 G& L
[/ K" O `4 ~2 f1 x& K- {
' R/ {) V6 F! l
0 b% W1 P( M" H- N* W
|
高手都在玩Linux了,
过奖了,我也是初学者刚刚入门,这个传感器确实贵,我是拿金币拍的,拍完就回到解放前了
感谢破总捧场