2
本帖最后由 birdinskyd***sy 于 2016-6-2 18:09 编辑
随着试用的跟进,没见过啊堆诺的童鞋们越来越熟悉,见过的童鞋们都早熟了。今天玩耍下啊堆诺超声测距。
如果只是玩耍超声测距,那就没有意思了,代码也有,超声模块也有,烧上去,分分钟搞定的事情。所以,没有难度就没有乐趣,反正作为一个程序猿,不是被代码玩了,就是玩了代码,没有和平共处的时候。
我们这回的难度在于,没有显示设备,再次说明,C1这个初级班套件,没有液晶屏,显示加强包里才有个OLED屏,估计那个扩展板上的7针的插座就是那个屏的。
不过,咱们有存货,上回整温度的时候,就有一块儿1602c,于是,童鞋们要是热爱嵌入式,就平时多屯点,奇货可居嘛。
下边就开打,先把好打的打了,串口显示的超声测距,好,看代码,童鞋们可以研读下蓝宙提供的pdf啥的,从原理到操作写的都挺清楚的。我们看第七课第一个栗子,挺简洁的,一共32行代码,实现超声测距,串口打印。
由于简单,长话短说,这是硬件连线,这回好,专线专用,没有拆对,嘎嘎
这是串口信息,精度在1cm左右,挺好的,第一个简单步骤胜利完成,下边整难的,好吃的要先吃,好玩的先玩,困难的扔到后边,实在解决不了,自由高人出马,天塌了有高个顶,高个的蹲下了,你可以趴下,嘎嘎嘎嘎嘎嘎
下边弄这个1602,
就是这货,look!我保存得多好,好些年了,连屏的膜都没破 坏,
管脚拍大点,
复习下这16个管脚先,
第1脚:GND接地
第2脚:VDD接5V 电源正极(这东工作在4.5~5.5V最舒适)
第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度,看来我们要用个1KΩ电阻了,这有的是)。
第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。
第6脚:E端为使能端,高电平时读取信息,负跳变时执行指令。
第7~14脚:D0~D7为8位双向数据端。
第15~16脚:背灯电源。15脚背光正极,16脚背光负极。
好吧,我承认,这是我从头到尾看16个管脚头回这么认真。1602这东有8位连接法和4位连接法两种,我们用4位连接法,毕竟这还得用12个脚呢,唉,腿儿多了真费事,还得一条腿一条腿掰扯着看,也不知道研究cpu主板的大牛们咋掰的,是不是有的不用看啊,我这i3的处理器好像是1134条腿儿,听说有I2C的1602c,一共接4根线就行了,
我们用两边的共12条腿儿,管脚定义呢,刚才也复习了,12条腿中,除去固定的电源2个和背光2个,还有对比度1个,需要控制7条腿, 开发板上超声占用了7和8,那我们用扩展板上的12, 11, 5, 4, 3, 2 这六个口,有童鞋说了,7条腿穿六条腿儿的裤子???童鞋们注意,第五脚RW为读写信号线,我们只需接低电平时进行写操作,接GND。
重新梳理下接线啊,
将 1602 的 RS, E, D4, D5, D6, D7 依序接到 12, 11, 5, 4, 3, 2 引脚上
将 LCD 的 GND 接地
RW 接到 GND
Vdd 接到 +5V
LCD 的 V0通过4K电阻接到地
背光两脚一只接到GND,一只+5V 共12条腿
然后就是一顿连线。。。。先用两根6针排线 两头儿插 留出中间4个管脚不用
最终。。。很抽象。。。我把超声波的拔了,以便相对具体点
然后,看看代码,先看看1602显示的部分,大家表忘记,蓝宙是玩搭积木的,既然是积木,肯定有1602这块常用的积木,注意引用头文件,然后,操作相当简单,硬件主要就是初始化RS, E, D4, D5, D6, D7 这几个管脚,然后定义好矩阵行列数,写字符的时候,指定好头一个字符在矩阵中的位置。
为了把hello 1602c显示在中间,可以调整下首字符显示坐标
嗯,挺好,显示成功
下边整合测距代码
- #include
- // 初始化lcd管脚
- LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
- int _ABVAR_1_t1 = 0 ;
- int ardublockUltrasonicSensorCodeAutoGeneratedReturnCM(int trigPin, int echoPin)
- {
- long duration;
- pinMode(trigPin, OUTPUT);
- pinMode(echoPin, INPUT);
- digitalWrite(trigPin, LOW);
- delayMicroseconds(2);
- digitalWrite(trigPin, HIGH);
- delayMicroseconds(20);
- digitalWrite(trigPin, LOW);
- duration = pulseIn(echoPin, HIGH);
- duration = duration / 59;
- if ((duration < 2) || (duration > 300)) return false;
- return duration;
- }
- void setup()
- {
- digitalWrite( 7 , LOW );
- digitalWrite( 8 , LOW );
- //初始化lcd两行16列矩阵以显示文字
- lcd.begin(16, 2);
- }
- void loop()
- {
- _ABVAR_1_t1 = ardublockUltrasonicSensorCodeAutoGeneratedReturnCM( 7 , 8 ) ;
- // 设置光标column 0 line 0
- // 小提示:line 0 是第一行 索引从0开始
- lcd.setCursor(2, 0);
- lcd.print("Hello 1602c");
- // 设置光标column 0 line 1
- lcd.setCursor(0, 1);
- // 从第二行开始打印
- lcd.print("Dis: ");
- lcd.print(_ABVAR_1_t1);
- lcd.print("cm");
- delay(200);
- }
复制代码
烧写测试,成功!
不过,有个问题,在距离变小的时候,小一个数量级,上次的“cm” 的"m"还是被遗留了
lcd函数定义里有一个clear(),显然是清屏用的,
可是编译的时候,ld出问题了,挂了,呜呜呜
也不是没有办法解决,改一句代码,cm后面加几个空格,解决了,甚至这么一来,好像更简洁了。
可是为啥调用clear()会挂ld呢??不得而知啊。好吧,就留着这问题吧,即使用了clear,也是通过发送命令刷屏,效率上并不比打几个空格高,将就着吧。
总结陈词,C1的初级套件没有显示设备,那我们不心甘情愿地用串口显示在电脑上,于是找来了块1602,经过一番折腾,超声测距有显示了,超声测距也不是一个萝卜一个坑儿的效果,你想,声波发出去,再反射回来,反射面多大?多大都行么?前边有个米粒大点的反射面,可以反射么?是不是还有个触发阈值啥的?超声传感器是不是还有个最敏感区啥的,就像人眼,或者鹰眼吧,中间有个最清晰的区域,也不知鲸鱼海豚啥的咋用的声纳系统下辈子当海豚体验体验吧,不能当鲸鱼,会被鬼子吃了。看来,要想成功,就得折腾。
|
评分
-
查看全部评分
|