第2步编码和连线
当Becky和我开始这个狗圈项目的时候,Arduino1.01刚刚发布,并支持Arduino Leonardo。我手头上正好有一块Adafruit 32u4开发板,我心想用官方的Leonardo下载器(bootloader)来测试它是一个不错的方法;后面我用USBtinyISP和Arduino软件很轻松的把Leonardo烧入32u4开发板中。
下虚线部是Arduino Leonardo的题外话,高手跳过。
----------------------------------
Arduino Leonardo是基于ATmega32u4一个微控制器板。它有20个数字输入/输出引脚(其中7个可用于PWM输出、12个可用于模拟输入),一个16 MHz的晶体振荡器,一个Micro USB接口,一个DC接口,一个ICSP接口,一个复位按钮。它包含了支持微控制器所需的一切,你可以简单地通过把它连接到计算机的USB接口,或者使用AC-DC适配器,再或者用电池来驱动它。Leonardo不同于之前所有的arduino控制器,他直接使用了ATmega32u4的USB通信功能,取消了USB转UART芯片。这使得Leonardo不仅可以作为一个虚拟的(CDC)串行/ COM端口,还可以作为鼠标或者键盘连接到计算机。它还有很多不同的地方,这里就不多说了。
----------------------------------
我的第一个步骤是获得使小巧精致单色128x32 OLED显示屏和Leonardo工作的软件。
在一下网址下载最新的编码:
最新的:https://github.com/adafruit/GPS-Dog-Collar,当然你可以直接这一步的附件文件中下载。
实际情况是我偶然发现OLED显示屏的示例代所调用的针脚与Atmega32u4引脚匹配问题,最后我建立一个借口参考表,类似于第二张图片(Atmega32u4和OLED的接线图)
代码的头部,我已经声明OLED的针脚匹配32U4开发板脚针地址。
#define OLED_DC 6 //Atmega32u4 Breakout Pin D7 #define OLED_CS 9 //Atmega32u4 Breakout Pin B5 #define OLED_CLK 5 //Atmega32u4 Breakout Pin C6 #define OLED_MOSI 4 //Atmega32u4 Breakout Pin D4 (Pin on OLED labeled DATA) #define OLED_RESET 8 //Atmega32u4 Breakout Pin B4
以下代码备注部分是连接Adafruit旗舰版GPS模块的(图参第三张:连接Adafruit GPS模块的线路图)
//Connect GPS TX to Atmega32u4 Breakout Pin B7 (Leonardo Pin D10) //Connect GPS RX to Atmega32u4 Breakout Pin B6 (Leonardo Pin D11)
接下来你会看到你的狗狗走在一天的总距离。我已经设置了默认的3英里。
//ENTER YOUR DESIRED DISTANCE GOAL (IN MILES) //------------------------------------------------------------------------------- float GOAL = 3; //Distances can include decimal points //-------------------------------------------------------------------------------
我用TinyGPS程序库去做大部分的工作,同时从http://www.adafruit.com/products/652里面获取大部分代码。代码的核心部分是关于恒定距离的测量。代码每次循环的时候,就如你在哪里?你在哪里一样。
unsigned long calc_dist(float flat1, float flon1, float flat2, float flon2) { float dist_calc=0; float dist_calc2=0; float diflat=0; float diflon=0; diflat=radians(flat2-flat1); flat1=radians(flat1); flat2=radians(flat2); diflon=radians((flon2)-(flon1)); dist_calc = (sin(diflat/2.0)*sin(diflat/2.0)); dist_calc2= cos(flat1); dist_calc2*=cos(flat2); dist_calc2*=sin(diflon/2.0); dist_calc2*=sin(diflon/2.0); dist_calc +=dist_calc2; dist_calc=(2*atan2(sqrt(dist_calc),sqrt(1.0-dist_calc))); dist_calc*=6371000.0; //Converting to meters return dist_calc; }
当静止不动时,GPS坐标将会慢慢变动。我不想这影响整体的行走距离。因此我使代码确认你正在移动。如果你移动,它从上面代码中添加距离值到整体距离,测试总行走距离。
if (gps.f_speed_kmph() > 3.9) { if (start == 1) { start = 0; lastFlat = flat; lastFlon = flon; } else { //totalDistance = gps.distance_between(flat, flon, LONDON_LAT, LONDON_LON); totalDistance = totalDistance + calc_dist(flat, flon, lastFlat, lastFlon); lastFlat = flat; lastFlon = flon; } }
在编译整个项目的时候,我最喜欢的部分是在处理那个小型OLED,我将其设置为一眼可以看清楚具体信息。当你初次打开这个设备,我最初将其做成探测卫星动画。之后我弄了一个很酷的滚动条去展示距离目标的程度。上面的进度条是一个工作的里程表。如果需要的话,所有的数字能够转换成相应的公里数。
display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0,0); float fDist = totalDistance; //convert meters to miles fDist *= 0.000621371192; //float fSpeed = gps.f_speed_kmph(); printLCDFloat(fDist, 2); display.print(" Miles ("); float targetDist = fDist / GOAL; printLCDFloat(targetDist*100, 0); display.print("%)"); display.drawLine(0, 12, 0, 31, WHITE); display.drawLine(63, 28, 63, 31, WHITE); display.drawLine(127, 12, 127, 31, WHITE); display.drawLine(31, 28, 31, 31, WHITE); display.drawLine(95, 28, 95, 31, WHITE); display.drawLine(0, 28, 127, 28, WHITE); display.drawLine(0, 12, 127, 12, WHITE); display.fillRect(2, 14, (124 * targetDist), 13, 1); if (gps.hdop() > 2000) { //display.fillRect(2, 14, (124), 13, BLACK); display.fillRect(0, 0, 128, 32, BLACK); display.fillCircle(6, 6, 2, WHITE); display.fillCircle(64, 6, 2, WHITE); display.fillCircle(122, 6, 2, WHITE); display.fillCircle(35, 6, 2, WHITE); display.fillCircle(93, 6, 2, WHITE); if (i==0){ display.drawCircle(6, 6, 4, WHITE); } if (i==1){ display.drawCircle(35, 6, 4, WHITE); } if (i==2){ display.drawCircle(64, 6, 4, WHITE); } if (i==3){ display.drawCircle(93, 6, 4, WHITE); } if (i==4){ display.drawCircle(122, 6, 4, WHITE); i = 0; } else { i++; } display.setTextColor(WHITE); display.setCursor(5,20); display.print("Acquiring Satellites"); } display.display();
关于总结这次代码的主要部分,你们的挑战就是去将我们没提到的东西进行提高,下一个规划就是建立旗舰版GPS模块的数据记录器。同时在你回家之后画出你的狗所经过的路径图。
猜你会喜欢
iPhone控制的简易物联网
这次我尝试制作一个简单的物联网系统,可以...
TEM36温度传感器
非常容易解释什么是模拟温度传感器,它就是...
基于MK802的摄像头自动光源跟踪
基于MK802的摄像头自动光源跟踪,展示...
用Android和Arduino控制门锁
这次我制作一个简易的无线控制门锁,实现用...
Arduino加速度传感器与幻彩立方的互动
这篇文章介绍MM7361三轴加速度传感器...
评 论
选择昵称后请轻按空格键
请勿进行人身攻击,谩骂以及任何违法国家相关法律法规的言论。