基于Robei:环境光传感器实验设计(及L298N模块控制LED灯板)
摘要:最近在做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灯板)相关推荐
- 使用超声波测距模块控制LED灯
本文章为你介绍如何使用Arduino开发板和超声波测距模块来控制LED灯的明灭. 所需硬件 -Arduino开发板 -LED -超声波测距模块 下面主要为大家说明一下超声波模块. 超声波传感器通过采用 ...
- 基于Arduino IDE平台开发ESP8266天猫精灵控制LED灯
Arduino教程传送门
- Mixly----利用超声波传感器控制LED灯
米思齐作为简单快捷的开发软件在我们生活中的作用逐渐增大,今天我们利用超声波传感器来测量距离来控制LED灯. 测量原理:超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途 ...
- 利用声音传感器控制led灯功能_云中树莓派(4):利用声音传感器控制Led灯
1. 声音传感器及其配置 声音传感器如下图所示: 将 VCC 引脚接入树莓派 5V 引脚,将 GND 引脚接入树莓派 GND 引脚,将 OUT 引脚接入树莓派 GPIO20. 要注意,模块在环境声音强 ...
- HC-05蓝牙模块与STM32控制led灯亮详解
HC-05蓝牙模块与STM32控制led灯亮 一.HC-05蓝牙模块解析 1.简介 2.HC-05原理 3.HC-05实物图 二.使用AT指令进行配置 1.进入命令响应工作模式 2.配置串口 3.进行 ...
- 利用声音传感器控制led灯功能_利用光敏电阻加声音传感器制作声控灯
视频演示https://www.zhihu.com/video/1145029294962020352 光敏电阻传感器模块 模块参数: 工作电压:3.3V-5V 光敏电阻模块对环境光线敏感,一般用来检 ...
- 安卓手机与蓝牙模块联合调试(二)—— 单片机蓝牙控制LED灯亮灭(上)
系列博文: (1)安卓手机与蓝牙模块联合调试(一)--蓝牙模块的串口通讯 (2)安卓手机与蓝牙模块联合调试(二)-- 单片机蓝牙控制LED灯亮灭(上) (3)安卓手机与蓝牙模块联合调试(三)-- 单片 ...
- 【STM32】ESP8266 WiFi模块实时上报温湿度及控制LED灯项目笔记
ESP8266 WiFi模块实时上报温湿度及控制LED灯项目笔记 一.ESP8266模块 1.模块介绍 2.AT指令介绍 2.硬件连接 二.串口转发及调试 1.串口转发流程 2.串口转发程序实现 ST ...
- Android Studio设计APP实现与51单片机通过WIFI模块(ESP8266-01S)通讯控制LED灯亮灭的设计源码【详解】
目录 一.前言 二.效果展示 1.APP界面展示 2.C51硬件展示 三.Android Studio APP源代码 1.AndroidManifest.xml 1.请求联网: 2.开放明文传输: 2 ...
- 51单片机通过WIFI模块ESP8266控制LED灯
完整源码下载地址:https://download.csdn.net/download/tongxin082/21440621 一.系统方案 手机APP通过ESP8266 WIFI模块与51单片机通信 ...
最新文章
- LeetCode Count Primes
- 【项目管理】记第一次出差到客户现场推进项目验收感悟-后续1
- MYSQL [ERROR] InnoDB: Unable to lock ./ibdata1 error: 11
- MFC主线程使用WaitForSingleObject阻塞的问题
- ASP.NET Core中借助CSRedis实现安全高效的分布式锁
- 【ArcGIS遇上Python】Python批量将多个文件夹下的多个影像数据镶嵌至新栅格
- windows下有趣的小玩意
- selenium——元素的定位
- 越做越好的adobe acrobat
- FFT,NTT 专题
- Java 面试——字符串操作、值传递、重载与重写
- layer使用心得3
- pr如何跳到关键帧_必收藏的PR常用快捷键大全
- LabWindows图表显示
- 【BP数据预测】基于matlab斑点鬣狗算法优化BP神经网络数据预测【含Matlab 219期】
- 资料共享库 | ApacheCN(apache中文网)
- Portainer安装配置
- chrome cookies cookie 解密 写入(80+版本)
- 采集日志实践-ELK以及filebeat配置解析
- solidworks正版多少钱_SOLIDWORKS 2020、2021正版软件价格是多少钱?SW官方报价_专业版和白金版...