1回答

1收藏

I2C颜色识别传感器+STM32 F091 nucleo

STMCU STMCU 4210 人阅读 | 1 人回复 | 2018-01-16

本帖最后由 leo121_3006061 于 2018-1-17 00:15 编辑

正好前几天收到了stm32F091 nucleo开发板,试试这款Dfrobot的颜色传感器。

1. 硬件准备
开发板
tcs34725 color sensor
导线 4根
2连接方式(兼容ardunio的pin)

传感器===》Nucleo
SDA==>SDA/D14
SCL==》SCL/D15
注意不是A4,A5

2. 软件开发环境 mbed 在线编译
修改一下频率为(100000)原来是200000会报错


附上代码,非常简单
  1. // Example program connecting to the TCS34725 Color Sensor to the K64F using I2C

  2. #include "mbed.h"

  3. I2C i2c(I2C_SDA, I2C_SCL); //pins for I2C communication (SDA, SCL)
  4. Serial pc(USBTX, USBRX);

  5. int sensor_addr = 41 << 1;

  6. DigitalOut green(LED1);

  7. int main() {
  8.     pc.baud(9600);
  9.     green = 1; // off
  10.    
  11.     // Connect to the Color sensor and verify whether we connected to the correct sensor.
  12.    
  13.     i2c.frequency(100000);//修改为100000,否则报错
  14.    
  15.     char id_regval[1] = {146};
  16.     char data[1] = {0};
  17.     i2c.write(sensor_addr,id_regval,1, true);
  18.     i2c.read(sensor_addr,data,1,false);
  19.    
  20.     if (data[0]==68) {
  21.         green = 0;
  22.         wait (2);
  23.         green = 1;
  24.         } else {
  25.         green = 1;
  26.     }
  27.    
  28.     // Initialize color sensor
  29.    
  30.     char timing_register[2] = {129,0};
  31.     i2c.write(sensor_addr,timing_register,2,false);
  32.    
  33.     char control_register[2] = {143,0};
  34.     i2c.write(sensor_addr,control_register,2,false);
  35.    
  36.     char enable_register[2] = {128,3};
  37.     i2c.write(sensor_addr,enable_register,2,false);
  38.    
  39.     // Read data from color sensor (Clear/Red/Green/Blue)
  40.    
  41.     while (true) {
  42.         char clear_reg[1] = {148};
  43.         char clear_data[2] = {0,0};
  44.         i2c.write(sensor_addr,clear_reg,1, true);
  45.         i2c.read(sensor_addr,clear_data,2, false);
  46.         
  47.         int clear_value = ((int)clear_data[1] << 8) | clear_data[0];
  48.         
  49.         char red_reg[1] = {150};
  50.         char red_data[2] = {0,0};
  51.         i2c.write(sensor_addr,red_reg,1, true);
  52.         i2c.read(sensor_addr,red_data,2, false);
  53.         
  54.         int red_value = ((int)red_data[1] << 8) | red_data[0];
  55.         
  56.         char green_reg[1] = {152};
  57.         char green_data[2] = {0,0};
  58.         i2c.write(sensor_addr,green_reg,1, true);
  59.         i2c.read(sensor_addr,green_data,2, false);
  60.         
  61.         int green_value = ((int)green_data[1] << 8) | green_data[0];
  62.         
  63.         char blue_reg[1] = {154};
  64.         char blue_data[2] = {0,0};
  65.         i2c.write(sensor_addr,blue_reg,1, true);
  66.         i2c.read(sensor_addr,blue_data,2, false);
  67.         
  68.         int blue_value = ((int)blue_data[1] << 8) | blue_data[0];
  69.         
  70.         // print sensor readings
  71.         
  72.         pc.printf("Clear (%d), Red (%d), Green (%d), Blue (%d)\r\n", clear_value, red_value, green_value, blue_value);
  73.         wait(0.5);
  74.     }
  75.    
  76. }
复制代码
下载编译结果,打开串口助手之类的,使用三种颜色来实验,结果如下(传感器不能离的太近,否则数值飙升)





使用红色的时候,红色值偏大,使用蓝色,蓝色值偏大,另外两个值基本固定在100多不到200.



最后来张合影



分享到:
回复

使用道具 举报

回答|共 1 个

倒序浏览

沙发

你与时光皆薄凉

发表于 2018-2-22 18:40:02 | 只看该作者

学习学习最近在学习当中
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条