收到社区寄来的板子,也不枉参加了一次活动,正好从爱板拍了一个颜色传感器,研究了几天,晓有心得分享一下。此帖在爱板也发了,转发到这里赚点币。传感器的资料请去官网下载(DFrobot)
9 I- B. N* Q) \$ Z% `0 P3 P1 g1. 硬件准备
$ l0 s6 S- G1 M9 W开发板3 g( h3 [! ], `3 L1 F
tcs34725 color sensor
! l; d, @& m# S. M4 C" r导线 4根
: ~* t, i/ X' Y8 R) A5 I( O; c2连接方式(兼容ardunio的pin) D5 x2 P/ ^- o f
7 d4 T, H6 W- N! i/ k8 A
传感器===》Nucleo: e& q& q3 d! A
SDA==>SDA/D14, L1 l1 V; `9 u! A! p
SCL==》SCL/D15; h% ]( k& r2 W+ y1 f: O! X) a$ `6 H- [
注意不是A4,A51 A G; i/ u9 U! [8 V+ p
& i+ u" ~5 K) O6 R2. 软件开发环境 mbed 在线编译
" X1 f, A, ^/ l' W修改一下频率为(100000)原来是200000会报错' `2 n1 \( K# ^% b
& \ R' v: E2 d3 D* @
7 Q* P& O7 s2 `) ?8 N
S: }! d& x6 \. Y6 f- Y: _$ A7 m D. p6 w! E5 J
# V; {% e, \* b+ m$ K j" J3 `
附上代码,非常简单
' p" l) f1 G- [/ J% {
: B* O, {0 W/ J: Y& `. ^6 j- // Example program connecting to the TCS34725 Color Sensor to the K64F using I2C0 R" s) J# q+ z* g2 O
; y7 I7 E: o! K2 A3 V0 w- #include "mbed.h"
& M( [# K7 P4 V" V- W2 w* P7 T( h: ` - ! T$ O$ [3 X6 i5 ^- m
- I2C i2c(I2C_SDA, I2C_SCL); //pins for I2C communication (SDA, SCL)$ Q4 X- @6 \# W
- Serial pc(USBTX, USBRX);; f. E2 l, L" ^/ w
- 8 ~! T; W. e z) _+ Z
- int sensor_addr = 41 << 1;
6 i0 F _# B4 q# m - - \4 ` f/ ?% f0 f1 ] @1 W- b
- DigitalOut green(LED1);
]9 R4 D3 W* e/ i
( {7 p& [( G O$ L v: H" W- int main() {
5 w% \3 K# b% Q/ O8 V - pc.baud(9600);6 ^( n; w0 |$ h
- green = 1; // off: Z( m" O" U; C# ?' l
- ; g8 V& t- }* S. ~8 P. I
- // Connect to the Color sensor and verify whether we connected to the correct sensor. + j7 Y3 Q# u" z! X; t$ B5 }
-
( P8 Z/ W0 {# Y1 K# B* l - i2c.frequency(100000);//修改为100000,否则报错
8 C" R( p H; @3 J& G$ ]* C - ; l" x) S2 q( q* A+ N5 W
- char id_regval[1] = {146};
: m3 z% |+ D* L N - char data[1] = {0};
6 r1 s/ H( B7 X1 b/ d& P - i2c.write(sensor_addr,id_regval,1, true);% ^3 I/ _7 G0 q; n# ^# `: v6 [0 L1 d
- i2c.read(sensor_addr,data,1,false);
8 _7 Y7 V, y3 q: Y$ h) e -
6 ~; N7 g) }. y: I. ]+ ` - if (data[0]==68) {. m( Q5 Y5 q; B) t
- green = 0;- e3 q: S! a3 U! b
- wait (2); " g- S/ l+ y& Z# Y) Z
- green = 1;
& x- N9 w9 E2 _8 j - } else {7 N; ]7 V3 b: V% ?
- green = 1;
# J9 H2 @4 c2 g% O# ^# J - }
7 }4 K+ ]2 ~9 }; S( @ -
$ n) }4 B; G+ ^ D7 c. U8 S8 P - // Initialize color sensor
' z( _1 X, h6 ]* U* Q' I - * |8 ^3 a, ^) O
- char timing_register[2] = {129,0};% P! {- v8 F: O1 i h
- i2c.write(sensor_addr,timing_register,2,false);5 i& l+ Q' e2 S5 u ~7 v& ]0 v
- 3 i) |5 t- K, `' U% k( R7 s
- char control_register[2] = {143,0};/ ?' r4 v" d# ~. Z5 [! C
- i2c.write(sensor_addr,control_register,2,false);
* O( [; U! B! G( W& | G -
1 B l/ I* e6 m - char enable_register[2] = {128,3};
: E7 S/ J7 U! B2 D - i2c.write(sensor_addr,enable_register,2,false);) L1 Z) o$ x! I: {) T' G5 n ~
- " C9 R- r; L- O# E# w1 W+ \3 u
- // Read data from color sensor (Clear/Red/Green/Blue)! _$ v L! g" R
- 4 i3 x+ Y. T0 A5 w# g
- while (true) { 6 {* S- A/ D+ t j3 l0 {! d
- char clear_reg[1] = {148};
+ M6 L. a1 s5 N' o3 o! J: W - char clear_data[2] = {0,0};
+ M/ d6 G! ^9 a9 N- G - i2c.write(sensor_addr,clear_reg,1, true);
6 e# a) J0 p8 ~0 K/ V9 m \$ z - i2c.read(sensor_addr,clear_data,2, false);
7 A; x9 ^7 G( D* a# { e' l -
, `, d d6 h t+ J' [. M - int clear_value = ((int)clear_data[1] << 8) | clear_data[0];
/ l. I! u- U/ S$ e$ }) D - ! J: Y# I. C- K' B3 Q+ o& V
- char red_reg[1] = {150};% o6 a0 S$ W0 L- h( p9 b. C
- char red_data[2] = {0,0};# i! k& }0 X/ ?& c! I
- i2c.write(sensor_addr,red_reg,1, true);
% f W9 L1 v6 V - i2c.read(sensor_addr,red_data,2, false);" O; o8 \& d% e. R2 d4 d* f ?
- ; U& _8 K) j9 s
- int red_value = ((int)red_data[1] << 8) | red_data[0];. q7 E0 ? z3 w6 ]2 i4 o; ]% u
-
$ v) R- m& y5 E- d$ u7 q( s X - char green_reg[1] = {152};5 x! r/ F y# {; v4 B; j
- char green_data[2] = {0,0};
! H4 f/ k" D. S - i2c.write(sensor_addr,green_reg,1, true);
" V9 u+ y: a& x9 g U4 _7 A - i2c.read(sensor_addr,green_data,2, false);
6 T) R5 d5 k. Q; j -
% T' k" f8 d$ n* `9 p+ o! j - int green_value = ((int)green_data[1] << 8) | green_data[0];1 U- ?: f7 r& F4 w9 S7 \' {
- 5 a$ I. O& r6 o
- char blue_reg[1] = {154};7 q& S1 N0 {: k3 B3 M9 D
- char blue_data[2] = {0,0};* D. a6 J, R. u5 d( k+ m
- i2c.write(sensor_addr,blue_reg,1, true);; W3 k3 e" W/ C1 v9 x# y+ K
- i2c.read(sensor_addr,blue_data,2, false);' V7 _) |: y1 C1 `
-
4 @) T% a# a- C( v' p6 q - int blue_value = ((int)blue_data[1] << 8) | blue_data[0];
0 a! H/ S/ b" g! `7 c( L4 t; J -
# l# \' c; M- \: |3 E" V - // print sensor readings# f3 r# Z8 W! e/ X
-
4 q5 }8 e$ H$ L - pc.printf("Clear (%d), Red (%d), Green (%d), Blue (%d)\r\n", clear_value, red_value, green_value, blue_value);+ J6 S; d2 a4 x- e% S
- wait(0.5);/ h4 u; k+ v! Y7 j6 C! U3 a5 Z3 I
- }, x6 l1 D+ z" A% r: s& W
-
% d p/ c5 d# Z' ~; X: U) A - }
复制代码
* J2 b* y% ]% q U9 q" ~2 g
: a: y( s0 l. A+ v, U9 X/ x; |下载编译结果,打开串口助手之类的,使用三种颜色来实验,结果如下(传感器不能离的太近,否则数值飙升)# }( P1 D S( Y' n) Z5 w
* }, ~! R9 ` K8 e3 }
! |8 j: o' S, H' V' S/ H P* B9 _* d3 Y$ A
7 O2 n* ^5 ~7 q% m
' X; p% s: R( m# K! f, t
/ i( ^/ X y- u8 e
5 G& Z* W1 M* O, I& O4 a Y使用红色的时候,红色值偏大,使用蓝色,蓝色值偏大,另外两个值基本固定在100多不到200.9 R: u! c# {* r! W
# |3 z% t6 _/ a% A
) _* G5 N3 X0 U! K
; {. i: M$ k! C; E+ v. H+ S, \
最后来张合影8 a( A$ C& f- F3 J
, {& a5 p* A0 M5 c5 Z
1 L, z- e! `5 s7 l
$ b; @& `' }& ^# R0 H: V, x6 C7 [$ |6 Q, v7 R$ Y/ t
|
高手都在玩Linux了,
过奖了,我也是初学者刚刚入门,这个传感器确实贵,我是拿金币拍的,拍完就回到解放前了
感谢破总捧场