• 1.jpg
  • 1-1.jpg
  • 1-1.gif

第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模块的数据记录器。同时在你回家之后画出你的狗所经过的路径图。

下一步上一步

评 论

e

选择昵称后请轻按空格键

    提 交

    请勿进行人身攻击,谩骂以及任何违法国家相关法律法规的言论。

    信息

    30396

    浏览
    0
    oydean

    作者:oydean

    分享:42

    高骚不止.>>

    关键词:atmegagpsusbtinyisparduino

    猜你会喜欢

    iPhone控制的简易物联网

    这次我尝试制作一个简单的物联网系统,可以...

    TEM36温度传感器

    非常容易解释什么是模拟温度传感器,它就是...

    基于MK802的摄像头自动光源跟踪

    基于MK802的摄像头自动光源跟踪,展示...

    用Android和Arduino控制门锁

    这次我制作一个简易的无线控制门锁,实现用...

    Arduino加速度传感器与幻彩立方的互动

    这篇文章介绍MM7361三轴加速度传感器...