摘要:最近在做FPGA视觉机器人,考虑到晚上机器人视线不好,萌发了给机器人做一个小型灯补光的想法。咱是机器人肯定要整点智能的对不对,思来想去觉得环境光传感器是个不错的选择。

嘿嘿,行动派往往都是说做就做,从不拖拉。

首先查阅资料:
AP3216C是一个能够测量环境光强度和距离的整合型光感测距传感器。因其功耗低、控制简单、封装小而广泛应用于智能手机、电容式触摸屏、数码相机等领域。例如应用于智能手机上面检测环境光强度,用来实现自动背光控制,以及接近开关控制(听筒靠近耳朵,手机自动灭屏功能)。

:因为它是一种整合型多功能传感器,这种类型的传感器一般都会多种有不同的工作模式(AP3216C内部有一些寄存器,这些寄存器可以控制AP3216C的工作模式、中断方式以及采集数据等。):

这么多模式,我们选择ALS+PS+IR模式,在该模式下AP3216C连续采集环境光照强度和距离值。上表中,地址0X00对应的是一个系统模式控制寄存器,我们在初始化的时候将它配置为011,这样就能开启ALS+PS+IR模式。其他6个寄存器我们用来存储采集到的数据(红外光强度、环境光强度、以及距离值)。AP3216C采用I2C总线协议与控制器(FPGA)进行通信,因此我们通过I2C协议实现对AP3216C
相关寄存器的配置和采集数据的读取。

接下来上某宝淘材料:

L298N驱动模块一个,LED灯若干,洞洞板一块,焊接成3*3的电灯板,建议焊接成并联电路,这样就不需要为电压不足而烦恼啦:

电路连接:将电灯板的正极接到驱动模块的OUT2,负极接到OUT1,驱动模块使能端口以及IN2接到开发板的两个排针(想用哪个排针在程序定义就好),通过改变这两个端口的逻辑,我们可以实现对LED进行亮灭。在这里有个点要提一下,驱动模块只有与开发板共地才能使用,很多初学的朋友会问,怎么共地,一般的驱动模块都是会有一个模块用电输入,和一个开发板供电的(5v的正负极,你只要把这个端口的GND接到开发板的GND就行了)。但是也有特殊情况,就是一些比较小的驱动模块是没有一个独立的开发板供电端口的,像我这个模块,比较小,所以他的用电输入与开发板供电是在一起的(3个口,+5V,GND,+12V),像我图片中圈中这样,这个时候你就要从GND这个口中多分出一条线,接到开发板上,另一条接电源的GND:


AP3216C环境光传感器:因为我的开发板自带了一个环境光传感器,所以无需另接。传感器里面集成了数字环境光传感器(Ambilent Light Sensor,ALS)、距离传感器(Proximity Sensor,PS)和一个红外LED(Infrared Radiation LED,IR LED)。

接下来就是程序设计
FPGA通过IIC总线读取AP3216C采集的环境光,通过判断环境光光照强度值(als_data)控制LED灯亮灭。从而实现白天夜晚LED灯自动开关的功能。(另外通过ps_data的值可以测试感光器与物体距离远近) 注:(想看Robei程序代码的点这个链接,我已经将整个Robei生成的工程上传!!!)

在上面的工程中,我并没有设计测距效果模块,如果需要想要看看测距效果如何的朋友,new一个模块就好了。代码如下:

//led灯亮灭个数(4个)显示数据大小(距离的远近),这里的led灯不是焊接板的灯,而是开发板上的灯,可自调
always @(posedge clk or negedge rst_n) beginif(rst_n == 1'b0) beginled <=  4'd0;endelse if(data < 10'd16)   //这里的data例化的时候连接ap3216c模块的PS_data端口就行led <= 4'b0001;else if(data < 10'd128)led <= 4'b0011;else if(data < 10'd512)led <= 4'b0111;else     led <= 4'b1111;
end

考虑到下载文件不方便,我将核心模块ap3216c模块Verilog代码放在这里:

module ap3216c(    clk,         //ap3216c模块主要用来测量环境光照强度和距离值rst_n,i2c_data_r,i2c_done,i2c_rh_wl,i2c_exec,i2c_addr,i2c_data_w,als_data,ps_data);//---Ports declearation: generated by Robei---input clk;input rst_n;input [7:0] i2c_data_r;input i2c_done;output i2c_rh_wl;output i2c_exec;output [15:0] i2c_addr;output [7:0] i2c_data_w;output [15:0] als_data;output [9:0] ps_data;wire clk;wire rst_n;wire [7:0] i2c_data_r;wire i2c_done;reg i2c_rh_wl;reg i2c_exec;reg [15:0] i2c_addr;reg [7:0] i2c_data_w;reg [15:0] als_data;reg [9:0] ps_data;//----Code starts here: integrated by Robei-----parameter      TIME_PS   = 14'd12_500  ;  // PS转换时间为12.5ms(clk = 1MHz)parameter      TIME_ALS  = 17'd100_000 ;  // ALS转换时间为100ms(clk = 1MHz)parameter      TIME_REST =  8'd2       ;  // 停止后重新开始的时间间隔控制//reg definereg   [ 3:0]   flow_cnt   ;               // 状态流控制reg   [18:0]   wait_cnt   ;               // 计数等待reg   [15:0]   als_data_t ;               // ALS的临时数据reg            als_done   ;               // 环境光照强度值采集完成信号reg   [ 9:0]   ps_data_t  ;               // PS的临时数据reg            ir_of      ;               // 溢出标志(判断ps_data是否有效)reg            obj        ;               // 物体状态标志(0远离1靠近)//配置AP3216C并读取数据always @(posedge clk or negedge rst_n) beginif(!rst_n) begini2c_exec   <=  1'b0;i2c_addr   <=  8'd0;i2c_rh_wl  <=  1'b0;i2c_data_w <=  8'h0;flow_cnt   <=  4'd0;wait_cnt   <= 18'd0;ps_data    <= 10'd0;ps_data_t  <= 10'd0;ir_of      <=  1'b0;obj        <=  1'b0;als_done   <=  1'b0;als_data_t <= 16'd0;endelse begini2c_exec <= 1'b0;case(flow_cnt)//初始化AP3216C4'd0: beginif(wait_cnt == 18'd100) beginwait_cnt <= 18'd0;flow_cnt <= flow_cnt + 1'b1;endelsewait_cnt <= wait_cnt +1'b1;end//配置AP3216C的功能模式4'd1: begini2c_exec   <= 1'b1 ;i2c_rh_wl  <= 1'b0 ;i2c_addr   <= 8'h00;               // 配置系统寄存器i2c_data_w <= 8'h03;               // 激活ALS+PS+IR 功能flow_cnt   <= flow_cnt + 1'b1;end//配置完成4'd2: beginif(i2c_done)flow_cnt <= flow_cnt + 1'b1;end//等待PS转换完成(12.5ms)4'd3: beginif(wait_cnt  == TIME_PS) beginwait_cnt <= 18'd0;flow_cnt <= flow_cnt + 1'd1;endelsewait_cnt <= wait_cnt + 1'b1;end//预读PS Data Register(0x0E)4'd4: begini2c_exec <= 1'b1;i2c_rh_wl<= 1'b1;i2c_addr <= 8'h0E;flow_cnt <= flow_cnt + 1'b1;end//读PS Data Register(0x0E)4'd5: beginif(i2c_done) beginflow_cnt     <= flow_cnt + 1'b1;ps_data_t[3:0] <= i2c_data_r[3:0];ir_of        <= i2c_data_r[6]  ;obj          <= i2c_data_r[7]  ;endend//等待一段时间以进行下一次读写4'd6: beginif(wait_cnt == TIME_REST) begin//TIME_RESTwait_cnt <= 18'd0;flow_cnt <= flow_cnt + 1'b1;endelsewait_cnt <= wait_cnt +1'b1;end//预读PS Data Register(0x0F)4'd7: begini2c_exec <= 1'b1;i2c_rh_wl<= 1'b1;i2c_addr <= 8'h0F;flow_cnt <= flow_cnt + 1'b1;end//读PS Data Register(0x0F)4'd8: beginif(i2c_done) beginflow_cnt     <= flow_cnt + 1'b1;ps_data_t[9:4] <= i2c_data_r[5:0];ir_of        <= i2c_data_r[6]  ;obj          <= i2c_data_r[7]  ;endend//等待ALS转换完成(100ms)4'd9: beginif(wait_cnt  ==  TIME_ALS) beginwait_cnt <= 18'd0;flow_cnt <= flow_cnt + 1'd1;ps_data  <= ps_data_t;endelsewait_cnt <= wait_cnt + 1'b1;end//预读ALS Data Register(0x0C)4'd10: begini2c_exec <= 1'b1;i2c_rh_wl<= 1'b1;i2c_addr <= 8'h0C;flow_cnt <= flow_cnt + 1'b1;end//读ALS Data Register(0x0C)4'd11: beginif(i2c_done) beginals_done        <= 1'b0;als_data_t[7:0] <= i2c_data_r;flow_cnt        <= flow_cnt + 1'b1;endend//等待一段时间以进行下一次读写4'd12: beginif(wait_cnt == TIME_REST) beginwait_cnt <= 18'd0;flow_cnt <= flow_cnt + 1'b1;endelsewait_cnt <= wait_cnt +1'b1;end//预读ALS Data Register(0x0D)4'd13: begini2c_exec <= 1'b1;i2c_rh_wl<= 1'b1;i2c_addr <= 8'h0D;flow_cnt <= flow_cnt + 1'b1;end//读ALS Data Register(0x0D)4'd14: beginif(i2c_done) beginals_done         <= 1'b1;als_data_t[15:8] <= i2c_data_r;flow_cnt         <= 4'd3;             //跳转到状态3重新读取数据endendendcaseendend//当采集的环境光转换成光照强度(单位:lux)always @ (*) beginif(als_done)als_data = als_data_t * 6'd35 / 7'd100;end
endmodule    //ap3216c

接下来将程序下载到开发板上来看一下实验效果:
注:因为我是在白天做这个实验,没有黑暗环境做实验条件,所以将开发板放抽屉里面,用手遮住传感器上方,这样模拟一下夜晚环境。

FPGA环境光传感器实验

基于Robei:环境光传感器实验设计(及L298N模块控制LED灯板)相关推荐

  1. 使用超声波测距模块控制LED灯

    本文章为你介绍如何使用Arduino开发板和超声波测距模块来控制LED灯的明灭. 所需硬件 -Arduino开发板 -LED -超声波测距模块 下面主要为大家说明一下超声波模块. 超声波传感器通过采用 ...

  2. 基于Arduino IDE平台开发ESP8266天猫精灵控制LED灯

    Arduino教程传送门

  3. Mixly----利用超声波传感器控制LED灯

    米思齐作为简单快捷的开发软件在我们生活中的作用逐渐增大,今天我们利用超声波传感器来测量距离来控制LED灯. 测量原理:超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途 ...

  4. 利用声音传感器控制led灯功能_云中树莓派(4):利用声音传感器控制Led灯

    1. 声音传感器及其配置 声音传感器如下图所示: 将 VCC 引脚接入树莓派 5V 引脚,将 GND 引脚接入树莓派 GND 引脚,将 OUT 引脚接入树莓派 GPIO20. 要注意,模块在环境声音强 ...

  5. HC-05蓝牙模块与STM32控制led灯亮详解

    HC-05蓝牙模块与STM32控制led灯亮 一.HC-05蓝牙模块解析 1.简介 2.HC-05原理 3.HC-05实物图 二.使用AT指令进行配置 1.进入命令响应工作模式 2.配置串口 3.进行 ...

  6. 利用声音传感器控制led灯功能_利用光敏电阻加声音传感器制作声控灯

    视频演示https://www.zhihu.com/video/1145029294962020352 光敏电阻传感器模块 模块参数: 工作电压:3.3V-5V 光敏电阻模块对环境光线敏感,一般用来检 ...

  7. 安卓手机与蓝牙模块联合调试(二)—— 单片机蓝牙控制LED灯亮灭(上)

    系列博文: (1)安卓手机与蓝牙模块联合调试(一)--蓝牙模块的串口通讯 (2)安卓手机与蓝牙模块联合调试(二)-- 单片机蓝牙控制LED灯亮灭(上) (3)安卓手机与蓝牙模块联合调试(三)-- 单片 ...

  8. 【STM32】ESP8266 WiFi模块实时上报温湿度及控制LED灯项目笔记

    ESP8266 WiFi模块实时上报温湿度及控制LED灯项目笔记 一.ESP8266模块 1.模块介绍 2.AT指令介绍 2.硬件连接 二.串口转发及调试 1.串口转发流程 2.串口转发程序实现 ST ...

  9. Android Studio设计APP实现与51单片机通过WIFI模块(ESP8266-01S)通讯控制LED灯亮灭的设计源码【详解】

    目录 一.前言 二.效果展示 1.APP界面展示 2.C51硬件展示 三.Android Studio APP源代码 1.AndroidManifest.xml 1.请求联网: 2.开放明文传输: 2 ...

  10. 51单片机通过WIFI模块ESP8266控制LED灯

    完整源码下载地址:https://download.csdn.net/download/tongxin082/21440621 一.系统方案 手机APP通过ESP8266 WIFI模块与51单片机通信 ...

最新文章

  1. LeetCode Count Primes
  2. 【项目管理】记第一次出差到客户现场推进项目验收感悟-后续1
  3. MYSQL [ERROR] InnoDB: Unable to lock ./ibdata1 error: 11
  4. MFC主线程使用WaitForSingleObject阻塞的问题
  5. ASP.NET Core中借助CSRedis实现安全高效的分布式锁
  6. 【ArcGIS遇上Python】Python批量将多个文件夹下的多个影像数据镶嵌至新栅格
  7. windows下有趣的小玩意
  8. selenium——元素的定位
  9. 越做越好的adobe acrobat
  10. FFT,NTT 专题
  11. Java 面试——字符串操作、值传递、重载与重写
  12. layer使用心得3
  13. pr如何跳到关键帧_必收藏的PR常用快捷键大全
  14. LabWindows图表显示
  15. 【BP数据预测】基于matlab斑点鬣狗算法优化BP神经网络数据预测【含Matlab 219期】
  16. 资料共享库 | ApacheCN(apache中文网)
  17. Portainer安装配置
  18. chrome cookies cookie 解密 写入(80+版本)
  19. 采集日志实践-ELK以及filebeat配置解析
  20. solidworks正版多少钱_SOLIDWORKS 2020、2021正版软件价格是多少钱?SW官方报价_专业版和白金版...

热门文章

  1. 【论文阅读】Image Super-Resolution Using Deep Convolutional Networks
  2. mysql远程主机强迫关闭了_channal经常关闭
  3. 201919102004张雪婷(第七次作业)
  4. oracle统计个数函数,oracle中字符串统计的函数
  5. 数据预处理(一):无量纲化
  6. 基于vue的图片上传预览插件
  7. Linux键盘输入读取
  8. 【Ubuntu】查询显卡型号
  9. html 页面数据显示不全,解决了一个Web网页显示不全的BUG
  10. 3dmax修改器堆栈的妙用