【Dfrobot Sim808板卡测试报告】关于无人船开发使用-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5268|回复: 6

【Dfrobot Sim808板卡测试报告】关于无人船开发使用

[复制链接]
发表于 2017-1-3 22:59 | 显示全部楼层 |阅读模式
本帖最后由 费心LE 于 2017-1-3 22:59 编辑

    首先感谢DFRobot给我机会对SIM808板的测试。
    DFRobot SIM808 这块是一款集成了四频段GSM/GPRS和GPS导航技术的Arduino扩展板。可用于物联网、安保、防盗等行业,同时还支持电话通讯、短信收发、DTMF、FTP等功能。是一个多功能实用的好东西。官方提供的库方便我们更快的使用起来,适用于每个学习阶段的创客。
QQ图片20170103214659.jpg QQ图片20170103214711.jpg


      我这次申请的DFRobot SIM808 板子进行无人船的研发,DFRobot SIM808 带有GPS/GPRS等功能方便数据收集同时方便管理。
      无人机和无人船相比,无人机有着续航时间短、信号范围小、操作不当容易发生“炸机”等缺点,对操作者的要求比较高;相对于无人船来说,它不用像无人机那样,长期待在水上,保证安全;有广阔的视野,不怕无人机那样,担心挂在树上,缠在电线上,撞在楼上等潜在危险;就算是没电的状态下,能保证电源的其他来源。
      需要准备的材料:
        arduino uno板
        DFRobot SIM808
        电子罗盘(HMC 5883L)
        两个小型电机
        充电宝(或者18650的电池)
        太阳能电池板
        升压模块
        稳压模块
   


     此次我使用双电机结构来使无人船完成前进、转向等运动(不过还有其他的方式,生活上用的船大部分都是使用舵来控制方向,电机控制前进的组合而成的),同时添加了电子罗盘,因为GPS本身没有方向,想了解前进的方向,有两种方式:一,GPS在一个方向上运动一段距离,在地图上显示出路径,即可判断方向;二,利用电子罗盘来确定方向;我选择第二种省时高效的方法。
     电源方面,为了防止没电的尴尬情况,增加了太阳能电池板,能对整个系统提供供电,保证长期稳定性。
QQ图片20170103214646.jpg QQ图片20170103214655.jpg


      这是我做的实物图,比较简陋,为测试板,后期会逐渐加强。
      太阳能电池板考虑到,船的方向的不确定性,保证机动性,采用平铺结构,能保证极大的采光面积。整部船一共增加了四个塑料瓶(还有两个在底部),左右两边的可增加船的扩展面积,保证船在海上不会翻,底部的就是增加浮力;

     然后就是控制部分了:
   
  1. ///////////////lat代表经度 (latitude)  /////lon代表纬度(longitude)//////

  2. ////////////////调用SIM808关于GPS部分
  3. #include <DFRobot_sim808.h>
  4. #include <SoftwareSerial.h>

  5. //#define PIN_TX    10
  6. //#define PIN_RX    11
  7. //SoftwareSerial mySerial(PIN_TX,PIN_RX);
  8. //DFRobot_SIM808 sim808(&mySerial);//Connect RX,TX,PWR,

  9. DFRobot_SIM808 sim808(&Serial);


  10. /////////////////罗盘部分

  11. #include <Wire.h>
  12. #include <HMC5883L.h>

  13. HMC5883L compass;

  14. /////设置
  15.      /////罗盘设置
  16. float heading;
  17. float declinationAngle;
  18. float headingDegrees;

  19. //////////////坐标定义
  20.               ///起始坐标
  21. float beginlon;//设置起始坐标经度
  22. float beginlat;//设置起始坐标纬度
  23.              ////目的坐标
  24. float goallon;//设置目的坐标经度
  25. float goallat;//设置目的坐标纬度
  26.           //////实时坐标
  27. float actuallon;///设置实时坐标经度
  28. float actuallat;///设置实时坐标经度
  29.         /////罗盘指向
  30. float pointlon;//// 罗盘目标经度指向
  31. float pointlat;////罗盘目标纬度指向

  32. float comparelon;////设置经度比较值
  33. float comparelat;////设置纬度比较值
  34. float scopelon;///设置经度范围
  35. float scopelat;///设置纬度范围
  36. int ls= 7;///设置低速(low speed)
  37. int hs = 8 ;///设置高速(high speed)
  38. int motor1 = 9;///1号电机
  39. int motor2 = 10;///2号电机





  40. void setup() {
  41.   //mySerial.begin(9600);
  42.   Serial.begin(9600);

  43.   //******** Initialize sim808 module *************
  44.   while(!sim808.init()) {
  45.       delay(1000);
  46.       Serial.print("Sim808 init error\r\n");
  47.   }

  48.   //************* Turn on the GPS power************
  49.   if( sim808.attachGPS())
  50.       Serial.println("Open the GPS power success");
  51.   else
  52.       Serial.println("Open the GPS power failure");


  53.       ////////////罗盘
  54.        // Initialize Initialize HMC5883L
  55.   /*Serial.println("Initialize HMC5883L");
  56.   while (!compass.begin())
  57.   {
  58.     Serial.println("Could not find a valid HMC5883L sensor, check wiring!");
  59.     delay(500);
  60.   }/*==*/

  61.   // Set measurement range
  62.   compass.setRange(HMC5883L_RANGE_1_3GA);

  63.   // Set measurement mode
  64.   compass.setMeasurementMode(HMC5883L_CONTINOUS);

  65.   // Set data rate
  66.   compass.setDataRate(HMC5883L_DATARATE_30HZ);

  67.   // Set number of samples averaged
  68.   compass.setSamples(HMC5883L_SAMPLES_8);

  69.   // Set calibration offset. See HMC5883L_calibration.ino
  70.   compass.setOffset(0, 0);


  71.   //////
  72.    pinMode (ls,OUTPUT);
  73.    pinMode (hs,OUTPUT);
  74.    pinMode (motor1,OUTPUT);
  75.    pinMode (motor2,OUTPUT);


  76. /////////////////////////////////输入///////////////////////////
  77.    beginlon = 120.88;//////////////////输入起始坐标经度
  78.    beginlat = 25.69;///////////////// 输入起始坐标纬度

  79.    goallon =135.45;///////////////////////////////输入目的坐标经度
  80.    goallat = 27.22;//////////////////////////////输入目的坐标纬度
  81. }

  82. void getGPS() {
  83.    //************** Get GPS data *******************
  84.    /*if (sim808.getGPS()) {
  85.     Serial.print(sim808.GPSdata.year);
  86.     Serial.print("/");
  87.     Serial.print(sim808.GPSdata.month);
  88.     Serial.print("/");
  89.     Serial.print(sim808.GPSdata.day);
  90.     Serial.print(" ");
  91.     Serial.print(sim808.GPSdata.hour);
  92.     Serial.print(":");
  93.     Serial.print(sim808.GPSdata.minute);
  94.     Serial.print(":");
  95.     Serial.print(sim808.GPSdata.second);
  96.     Serial.print(":");
  97.     Serial.println(sim808.GPSdata.centisecond);
  98.     Serial.print("latitude :");
  99.     Serial.println(sim808.GPSdata.lat);
  100.     Serial.print("longitude :");
  101.     Serial.println(sim808.GPSdata.lon);
  102.     Serial.print("speed_kph :");
  103.     Serial.println(sim808.GPSdata.speed_kph);
  104.     Serial.print("heading :");
  105.     Serial.println(sim808.GPSdata.heading);
  106.     Serial.println();

  107.     //************* Turn off the GPS power ************
  108.     sim808.detachGPS();
  109.   }  */
  110. }

  111. void luopan()
  112. {
  113.   Vector norm = compass.readNormalize();

  114.   // Calculate heading
  115.   float heading = atan2(norm.YAxis, norm.XAxis);

  116.   // Set declination angle on your location and fix heading
  117.   // You can find your declination on: [url]http://magnetic-declination.com/[/url]
  118.   // (+) Positive or (-) for negative
  119.   // For Bytom / Poland declination angle is 4'26E (positive)
  120.   // Formula: (deg + (min / 60.0)) / (180 / M_PI);
  121.   float declinationAngle = (4.0 + (26.0 / 60.0)) / (180 / M_PI);
  122.   heading += declinationAngle;

  123.   // Correct for heading < 0deg and heading > 360deg
  124.   if (heading < 0)
  125.   {
  126.     heading += 2 * PI;
  127.   }

  128.   if (heading > 2 * PI)
  129.   {
  130.     heading -= 2 * PI;
  131.   }

  132.   // Convert to degrees
  133.   float headingDegrees = heading * 180/M_PI;

  134.   // Output
  135. /* Serial.print(" Heading = ");
  136.   Serial.print(heading);
  137.   Serial.print(" Degress = ");
  138.   Serial.print(headingDegrees);
  139.   Serial.println();
  140.   delay(500);*/


  141. }



  142. void lon()
  143. {
  144.    comparelon = goallon - beginlon;////比较目的地与出发地方经度位置(目前只针对同个东经内或者同个西经内的运算)
  145.    if(goallon > 0)  {  ///判断是否东经
  146.       if(comparelon > 0)
  147.       {
  148.         pointlon = 270 ; ///船指向东
  149.       }
  150.       if(comparelon < 0)
  151.       {
  152.         pointlon = 90; ///船指向西
  153.       }
  154.    }

  155.    if(goallon < 0)  {  ///判断是否西经
  156.       if(comparelon < 0)
  157.       {
  158.          pointlon = 270; ///船指向东
  159.       }
  160.       if(comparelon > 0)
  161.       {
  162.         pointlon = 90; ///船指向西
  163.       }
  164.    }

  165.    if(pointlon != headingDegrees )///方向不正确时,开启单电机转向
  166.   {
  167.      digitalWrite (ls, HIGH);////启动低速
  168.      digitalWrite (hs, LOW);
  169.      digitalWrite (motor1, HIGH);/////只开启一个电机,用于转向
  170.      digitalWrite (motor2, LOW);
  171.   }

  172.    if(pointlon == headingDegrees  )////方向正确时,全速前进
  173.   {
  174.      digitalWrite (ls, LOW);
  175.      digitalWrite (hs, HIGH);////启动高速
  176.      digitalWrite (motor1, HIGH);/////双电机开启
  177.      digitalWrite (motor2, HIGH);
  178.   }

  179.   if(abs(goallon - actuallon) < 0.2)///接近目的附近,低速运行
  180.   {
  181.     digitalWrite (ls, HIGH);
  182.     digitalWrite (hs, LOW);
  183.   }
  184.    if(abs(goallon - actuallon) < 0.02)///到达目的地附近,停止运行
  185.   {
  186.     digitalWrite (ls, LOW);
  187.     digitalWrite (hs, LOW);
  188.     digitalWrite (motor1, LOW);
  189.     digitalWrite (motor2, LOW);
  190.   }
  191. }


  192. void lat()
  193. {
  194.   if(abs(goallon - actuallon) < 0.2)////再符合经度的条件下,执行纬度方向
  195.   {
  196.    comparelat = goallat - beginlat;////比较目的地与出发地方纬度位置(目前只针对同个北纬内或者同个南纬内的运算)
  197.    if(goallat > 0)  {  ///判断是否北经
  198.       if(comparelat > 0)
  199.       {
  200.          pointlat = 0; ///船指向北
  201.       }
  202.       if(comparelat < 0)
  203.       {
  204.         pointlat = 180; ///船指向西
  205.       }
  206.    }

  207.    if(goallat < 0)  {  ///判断是否南纬
  208.       if(comparelat < 0)
  209.       {
  210.          pointlat = 180; ///船指向南
  211.       }
  212.       if(comparelon > 0)
  213.       {
  214.         pointlon = 0; ///船指向北
  215.       }
  216.    }

  217.    if(headingDegrees != pointlat)///方向不正确时
  218.   {
  219.      digitalWrite (ls, HIGH);////启动低速
  220.      digitalWrite (hs, LOW);
  221.      digitalWrite (motor1, HIGH);/////只开启一个电机,用于转向
  222.      digitalWrite (motor2, LOW);
  223.   }

  224.    if(headingDegrees == pointlat)////方向正确时,全速前进
  225.   {
  226.      digitalWrite (ls, LOW);
  227.      digitalWrite (hs, HIGH);////启动高速
  228.      digitalWrite (motor1, HIGH);/////双电机开启
  229.      digitalWrite (motor2, HIGH);
  230.   }

  231.   if(abs(goallat - actuallat) <2)///接近目的附近,低速运行
  232.   {
  233.     digitalWrite (ls, HIGH);
  234.     digitalWrite (hs, LOW);
  235.   }
  236.    if(abs(goallat - actuallat) < 0.2)///到达目的地,停止运行
  237.   {
  238.     digitalWrite (ls, LOW);
  239.     digitalWrite (hs, LOW);
  240.     digitalWrite (motor1, LOW);
  241.     digitalWrite (motor2, LOW);
  242.   }
  243.   }
  244.   }

  245. void loop()  {
  246.   getGPS();
  247.   luopan();
  248.   lon();
  249.   lat();
  250.    }

复制代码



   可从程序中看出,我使用航行的方式是如下图所示的第一种;比较低级但比较便捷,少误差;有兴趣的朋友可以自己开发第二种算法来航行;
          QQ图片20170103215051.jpg


小结:
      此开发只完成小部分,有兴趣的朋友可添加数据采集的方式,如温湿度,水温,水质调查;也可用于海平面安保,鱼群跟踪等功能拓展,推荐使用SIM808拓展版,官方提供的库方便我们开发;
     在实践使用中,必须格外注意整套系统的防护,在保证不翻船的情况下,可保证整个设备的完整性。同时感谢DFRobot给我这次测评机会。
     本人水平有限,如果有何问题没发现或者没考虑清楚的麻烦帮我改正,谢谢



IMG_4730.JPG
QQ图片20170103214703.jpg
QQ图片20170103214707.jpg
发表于 2017-1-4 14:23 | 显示全部楼层
能放到水里游游吗
发表于 2017-1-4 16:24 | 显示全部楼层
厉害厉害,,,期待楼主的作品                     
发表于 2017-1-5 11:58 | 显示全部楼层
感谢分享,电机驱动、调速方面怎么考虑的,没见电机驱动板
 楼主| 发表于 2017-1-5 15:50 | 显示全部楼层

放水里没问题的,后期我改进后,发视频出来
发表于 2017-1-5 17:06 | 显示全部楼层
费心LE 发表于 2017-1-5 15:50
放水里没问题的,后期我改进后,发视频出来

很好  期待楼主的表现哈哈
发表于 2017-2-4 18:01 | 显示全部楼层
好期待啊~ 感觉可以看到会游泳的SIM808
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-1 00:58 , Processed in 0.130329 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表