GPS+GPRS+GSM

#简介

这是DFRobot研发的一款GPS/GPRS/GSM Arduino扩展板。它是一款四频GSM/GPRS驱动器,工作频率为EGSM 900MHz/DCS 1800MHz和GSM850 MHz/PCS 1900MHz。它也支持GPS卫星导航技术,能让你的机器人和控制系统来发送信息并使用GSM网络。它是通过AT指令(GSM07.07 ,07.05 和 SIMCom加强型AT指令)来控制的,您能直接通过电脑和Arduino板来启动它的GSM&GPS功能,其中安装有GPS&GSM高增益SMD天线。这款GPS/GPRS/GSM板内嵌有SIMCom公司的SIM908芯片,具有GPS定位功能和一个行业标准界面。这两项技术的完美结合,能让您在任意时间追踪任何地区内的货物,交通工具和人,只要这些地区有信号覆盖。

V3.0与V3.1的差别仅在于复位键旁边的GSM/GPS转换开关。V3.0采用了跳帽的形式,而V3.1采用了3档开关的形式。其他部分完全相同,产品信息和资料都可以共用。

V3.0相比V2.0版本,升级到SIM908芯片,GPS定位精确到2.5m,冷启动时间缩短到30s。接收器的频道由原来的20个升级到42个。新的芯片使得功耗更低,敏感度更高。另外,在扩展板布局方面。V3.0版本移除了SIM908旁边的排针,用户可以自己焊接。Sim卡槽从芯片顶部移到了左上角,为新的芯片方案提供空间。新版本还移除了右边的扬声器。更多的功能升级,请参考SIM908芯片的说明。同时还可以参考我们产品资料库,获得更多的端口示意图和示例代码。

技术规格

扩展板接口功能

Shield Interface Function

1、S1、S2开关

S1:编程/通信模式切换,prog:编程模式,comm:通信模式。

S2:USB/arduino通信模式切换,USB:扩展板通信通过USB口,arduino:扩展板与arduino通信。

2、状态指示灯

PWR:电源指示灯;

STAT:模块启动状态指示灯;

NET:网络状态指示灯;

熄灭——模块没有工作, 64ms亮/800ms熄灭——模块没有找到网络, 64ms亮/3000ms灭——模块注册到网络, 64ms亮/300ms熄灭——GPRS通讯。

3、J10/J11/J12

J10:将D3引脚作为GSM部分串口控制引脚,LOW低电平使能GSM串口,HIGH高电平关闭GSM串口;

J11:将D4引脚作为GPS部分串口控制引脚,LOW低电平使能GPS串口,HIGH高电平关闭GPS串口;

J12:将D5引脚作为GSM开机引脚,控制模块GSM部分开机。

注意:默认短路帽接上即可,如果D3、D4、D5引脚您已经作为其它功能控制引脚,可以将J10/J11/J12相应引脚的短路帽拔掉,与其它空闲引脚相连接。

串口选择

扩展板有两种串口:GSM串口,GPS串口。主控板UNO只有一组串口,同一时间只能与一种串口通信,所以需要两种串口切换使用。

扩展板有两种串口切换选择方式:1、程序控制串口选择,同上面所述,控制D3、D4引脚可以切换两种串口。2、硬件串口选择,在Uart Select处通过切换开关切换串口。

GPS功能使用介绍

GPS通信通过USB口

注意:GPS天线必须置于室外,才可以获得GPS定位数据输出。

1、硬件连接

扩展板接到主控板UNO,USB线连接好。

2、下载程序

扩展板S1开关拨到Prog端,下载下面程序。

    void setup()
    {
        //设置引脚为输出模式
        pinMode(3,OUTPUT);
        pinMode(4,OUTPUT);
        pinMode(5,OUTPUT);
        //GSM开机时序
        digitalWrite(5,HIGH);
        delay(1500);
        digitalWrite(5,LOW);
    }
    void loop()
    {
        //关闭引脚使能切换串口功能,启用硬件短路跳接切换串口功能
        digitalWrite(3,HIGH);//关闭GSM的TX、RX
        digitalWrite(4,HIGH);//关闭GPS的TX、RX
    }

3、打开串口助手软件

S1按键拨到Comm端,S2按键拨到USB端。

Uart Select串口选择开关拨到GSM端

打开串口助手软件,默认波特率为9600bps,勾选发送新行(在Arduino串口中是回车)。此时STAT灯亮,模块启动,如果没有启动可以按下RST复位键,重新开启。

GPS_1

4、发送AT命令控制GPS通信

发送AT命令(进行同步)

发送AT+CGPSIPR=9600 命令(设置GPS通信波特率为9600bps)

发送AT+CGPSPWR=1命令(turn on GPS power supply)

发送AT+CGPSRST=1命令 (reset GPS in autonomy mode)

GPS_2

5、将Uart Select处开关拨到GPS端

GPS_3

如果GPS天线已经放置露天位置,等待几分钟后,会有正确的GPS定位信息数据输出。

GPS_4

当想停止GPS信息输出,需将串口短路帽跳接到GSM(使能GSM串口通信,关闭GPS串口通信),

发送AT+CGPSPWR=0命令(turn off GPS power supply)

发送AT+CPOWD=1,将模块关机。

想重新开机再次按下RST按键。

GPS与Arduino通信

1、硬件连接

将扩展板接到主控板UNO上,插好USB线,Uart Select串口选择开关拨到中间。

2、下载程序

扩展板S1开关拨到Prog端,下载下面程序。

  double Datatransfer(char *data_buf,char num)//数据转换:将字符型数据转换为浮点型数据
  {                                           //*data_buf:要转换的数组;num:小数点的个数
    double temp=0.0;
    unsigned char i,j;

    if(data_buf[0]=='-')//负数的情况
    {
      i=1;
      //数组中的字符型数据转换成整数并累�
      while(data_buf[i]!='.')
        temp=temp*10+(data_buf[i++]-0x30);
      for(j=0;j<num;j++)
        temp=temp*10+(data_buf[++i]-0x30);
      //将转换后的整数转换成浮点数
      for(j=0;j<num;j++)
        temp=temp/10;
      //转换成负数
      temp=0-temp;
    }
    else//正数情况
    {
      i=0;
      while(data_buf[i]!='.')
        temp=temp*10+(data_buf[i++]-0x30);
      for(j=0;j<num;j++)
        temp=temp*10+(data_buf[++i]-0x30);
      for(j=0;j<num;j++)
        temp=temp/10 ;
    }
    return temp;
  }

  char ID()//接收语句的ID
  {
    char i=0;
    char value[6]={
      '$','G','P','G','G','A'  };//要接收的GPS语句的ID内容
    char val[6]={
      '0','0','0','0','0','0'  };

    while(1)
    {
      if(Serial.available())
      {
        val[i] = Serial.read();//接收串口的数据
        if(val[i]==value[i])//对比是否是正确的ID
        {
          i++;
          if(i==6)
          {
            i=0;
            return 1;//接收完毕返回1
          }
        }
        else
          i=0;
      }
    }
  }

  void comma(char num)//接收逗号字符
  {
    char val;
    char count=0;//对接收到的逗号计数

    while(1)
    {
      if(Serial.available())
      {
        val = Serial.read();
        if(val==',')
          count++;
      }
      if(count==num)//数目正确结束接收
        return;
    }

  }
  void UTC()//获取时间信息
  {
    char i;
    char time[9]={
      '0','0','0','0','0','0','0','0','0'
    };
    double t=0.0;

    if( ID())//语句正确
    {
      comma(1);//接收1个逗号
      //读取语句第一个逗号后的数据
      while(1)
      {
        if(Serial.available())
        {
          time[i] = Serial.read();
          i++;
        }
        if(i==9)
        {
          i=0;
          t=Datatransfer(time,2);//转换成浮点型数据
          t=t+80000.00;//将时间转换成北京时间
          Serial.println(t);//输出时间数据
          return;
        }
      }
    }
  }
  void latitude()//获取纬度信息
  {
    char i;
    char lat[10]={
      '0','0','0','0','0','0','0','0','0','0'
    };


    if( ID())
    {
      comma(2);
      //读取语句第二个逗号后的数据
      while(1)
      {
        if(Serial.available())
        {
          lat[i] = Serial.read();
          i++;
        }
        if(i==10)
        {
          i=0;
          Serial.println(Datatransfer(lat,5),5);//输出纬度数据
          return;
        }
      }
    }
  }
  void lat_dir()//获取纬度方向信息
  {
    char i=0,val;

    if( ID())
    {
      comma(3);
      //读取语句第三个逗号后的数据
      while(1)
      {
        if(Serial.available())
        {
          val = Serial.read();
          Serial.write(val);//输出方向信息
          Serial.println();
          i++;
        }
        if(i==1)
        {
          i=0;
          return;
        }
      }
    }
  }
  void longitude()//获取经度信息
  {
    char i;
    char lon[11]={
      '0','0','0','0','0','0','0','0','0','0','0'
    };

    if( ID())
    {
      comma(4);
      //读取语句第四个逗号后的数据
      while(1)
      {
        if(Serial.available())
        {
          lon[i] = Serial.read();
          i++;
        }
        if(i==11)
        {
          i=0;
          Serial.println(Datatransfer(lon,5),5);//输出经度数据
          return;
        }
      }
    }
  }
  void lon_dir()//获取经度方向信息
  {
    char i=0,val;

    if( ID())
    {
      comma(5);
      //读取语句第五个逗号后的数据
      while(1)
      {
        if(Serial.available())
        {
          val = Serial.read();
          Serial.write(val);//输出经度方向
          Serial.println();
          i++;
        }
        if(i==1)
        {
          i=0;
          return;
        }
      }
    }
  }
  void altitude()//获取海拔信息
  {
    char i,flag=0;
    char alt[8]={
      '0','0','0','0','0','0','0','0'
    };

    if( ID())
    {
      comma(9);
      //读取语句第九个逗号后的数据
      while(1)
      {
        if(Serial.available())
        {
          alt[i] = Serial.read();
          if(alt[i]==',')
            flag=1;
          else
            i++;
        }
        if(flag)
        {
          i=0;
          Serial.println(Datatransfer(alt,1),1);//输出海拔数据
          return;
        }
      }
    }
  }
  void setup()
  {
    //设置引脚为输出模式
    pinMode(3,OUTPUT);
    pinMode(4,OUTPUT);
    pinMode(5,OUTPUT);
    //GSM开机时序
    digitalWrite(5,HIGH);
    delay(1500);
    digitalWrite(5,LOW);

    //使能GSM串口
     digitalWrite(3,LOW);
     digitalWrite(4,HIGH);
     delay(2000);
     //设置波特率
     Serial.begin(9600);
     //等待GPS ready
     delay(5000);

     //发送AT命令同步
     Serial.println("AT");
     delay(2000);
     //turn on GPS power supply
     Serial.println("AT+CGPSPWR=1");
     delay(1000);
     //reset GPS in autonomy mode
     Serial.println("AT+CGPSRST=1");
     delay(1000);

     //使能GPS串口
     digitalWrite(4,LOW);
     digitalWrite(3,HIGH);
     delay(2000);

     Serial.println("$GPGGA statement information: ");
  }
  void loop()
  {
    while(1)
    {
      Serial.print("UTC:");
      UTC();
      Serial.print("Lat:");
      latitude();
      Serial.print("Dir:");
      lat_dir();
      Serial.print("Lon:");
      longitude();
      Serial.print("Dir:");
      lon_dir();
      Serial.print("Alt:");
      altitude();
      Serial.println(' ');
      Serial.println(' ');
    }
  }

3、设置扩展板与Arduino通信

S1按键拨到Comm端,S2按键拨到Arduino端。

GSM功能使用介绍

注意:在使用扩展板GSM功能时,需要接外接电源6-12V,因为GSM模式下电流需要在200mA左右。

GSM通信通过USB口

1、硬件连接

扩展板接到主控板UNO,SIM卡、麦克、耳机插好。

USB线、外接电源接好。

2、下载程序

扩展板S1开关拨到Prog端,下载下面程序。

  void setup()
 {
    //设置引脚为输出模式
    pinMode(3,OUTPUT);
    pinMode(4,OUTPUT);
    pinMode(5,OUTPUT);
    //GSM开机时序
    digitalWrite(5,HIGH);
    delay(1500);
    digitalWrite(5,LOW);
 }
 void loop()
 {
    digitalWrite(3,LOW);//使能GSM的TX、RX
    digitalWrite(4,HIGH);//关闭GPS的TX、RX
 }

3、打开串口助手软件

S1按键拨到Comm端,S2按键拨到USB端,S3按键拨到中间。

打开串口助手软件,默认波特率为9600bps,勾选发送新行。此时STAT灯亮,模块启动,如果没有启动可以按下RST复位键,重新开启。

GSM_1

打电话

步骤:

AT 同步

ATDXXXXXXX; 拨号

GSM_2

相关指令:

ATH 挂机命令 ATA 接电话

其它指令可参见扩展板销售网页所附链接:AT指令文档。

发短信

步骤:

AT 同步

AT+CMGF=1 (设置短消息的格式为文本格式)

AT+CMGS="XXXXX" (xxxx为目的地的电话号码)

出现“>”

在后面输入短信内容,输入完后 点击发送; 然后再勾选“HEX发送” 发送“1A”。(不区分大小写)

GSM_4

GSM通信与Arduino

硬件连接:

扩展板接到主控板UNO,SIM卡、麦克、耳机插好。

USB线、外接电源接好。

打电话

扩展板S1开关拨到Prog端,下载下面程序。

    void setup()
  {
      //端口模式设置
      pinMode(3,OUTPUT);
      pinMode(4,OUTPUT);
      pinMode(5,OUTPUT);
     //GSM开机时序
     digitalWrite(5,HIGH);
     delay(1500);
     digitalWrite(5,LOW);

     //使能GSM串口
     digitalWrite(3,LOW);
     digitalWrite(4,HIGH);
     delay(2000);
     //设置波特率
     Serial.begin(9600);
     //等待call ready
     delay(5000);delay(5000);delay(5000);
  }
  void loop()
  {
     //发送AT命令同步
     Serial.println("AT");
     delay(2000);
     Serial.println("AT");
     delay(2000);

     //打电话
     Serial.println("ATDXXXXXXXXXXX;");//对方电话号码

     while(1);
  }

将S1开关拨到Comm,S2开关拨到Arduino,Uart Select串口选择开关拨到中间。

发短信

扩展板S1开关拨到Prog端,下载下面程序。

    void setup()
  {
      //端口模式设置
      pinMode(3,OUTPUT);
      pinMode(4,OUTPUT);
      pinMode(5,OUTPUT);
     //GSM开机时序
     digitalWrite(5,HIGH);
     delay(1500);
     digitalWrite(5,LOW);

     //使能GSM串口
     digitalWrite(3,LOW);
     digitalWrite(4,HIGH);
     delay(2000);
     //设置波特率
     Serial.begin(9600);
     //等待call ready
     delay(5000);
     delay(5000);
     delay(5000);
  }
  void loop()
  {
     //发送AT命令同步
     Serial.println("AT");
     delay(2000);
     Serial.println("AT");
     delay(2000);

     //发送短信
     Serial.println("AT+CMGF=1");
     delay(1000);
     Serial.println("AT+CMGS=\"xxxxxxxxxxx\"");//xxx为电话号码
     delay(1000);
     Serial.print("TEST");
     delay(1000);
     Serial.write(26);

     while(1);
  }

将S1开关拨到Comm,S2开关拨到Arduino,Uart Select串口选择开关拨到中间。

GPRS功能使用介绍

这里做了个简单的例子,模块建立TCP连接,传输数据到乐联网平台。首先需要在乐联网平台免费注册账号,添加自己的网关和设备,具体步骤参考乐联网使用详细手册

传输数据时会产生流量,所以最好保证你的SIM卡有GPRS流量套餐。

例子看懂之后大家就可以根据自己的需要,将自己的数据传到相应的平台。

相关AT指令介绍

GPRS_1 GPRS_2

选择三个步骤完成初始化过程,在初始化失败的情况可以知道失败在哪一步骤。AT+CIPSTART一步骤完成就是方便快捷。

GPRS_6 GPRS_7 GPRS_8 GPRS_9 GPRS_10 GPRS_11

乐联网TCP服务器通讯协议

服务器信息

1、服务器域名tcp.lewei50.com

2、服务器IP:42.121.128.216

3、服务器端口号:9960

服务器后台设置准备工作:

参考文档 https://www.lewei50.com/dev/doc/126

1、注册并登录乐联网后台,记住你的userkey用户编号,图片黑体字部分。

GPRS_3

userkey:5d3eeec03bc747d7a23ab7d99c9340ea

2、添加网关设备名称,记住网关标识编号,比如02。

GPRS_4

如果你LED、继电器之类的需要服务器来控制的设备,可勾选“是否可控”。否则可不选。

API地址:https://tcp.lewei50.com:9965/?method=send\&gatewayNo=02

完全复制上面的链接文字段,文字段前后不要有空格等隐含多余字符,02部分对应网关标识编号。

公网IP:tcp.lewei50.com

完全复制上面的链接文字段,文字段前后不要有空格等隐含多余字符

3、添加测量设备,比如我添加了1个温度传感器,标识为T1。

GPRS_5

客户端主动向服务器上传数据过程

该方法主要用于测量类型设备,比如有1个温度传感器,测到温度25度。

客户端主动上传数据步骤:

1、连接tcp.lewei50.com 或者IP:42.121.128.216 端口号:9960

2、发送登录注册信息

{"method": "update","gatewayNo": "02","userkey": "5d3eeec03bc747d7a23ab7d99c9340ea"}&^!

完全复制上面的完整数据,02部分替换成你网关的编号,5d3eeec03bc747d7a23ab7d99c9340ea部分替换成你自己的userkey用户编号。

注意:发送后服务器不会有反馈响应。

3、发送具体数据

{"method": "upload","data":[{"Name":"T1","Value":"25"}]}&^!

完全复制上面的完整数据,T1部分替换成你设备的标识,25部分替换成对应的设备数据。

注意:发送后服务器不会有反馈响应。

4、客户端数据发送完毕可以主动断开链接。

通过USB口通信控制GPRS数据传输

1、硬件连接

扩展板接到主控板UNO,SIM卡插好。

USB线、外接电源接好。

2、下载程序

扩展板S1开关拨到Prog端,下载下面程序。

   void setup()
 {
    //设置引脚为输出模式
    pinMode(3,OUTPUT);
    pinMode(4,OUTPUT);
    pinMode(5,OUTPUT);
    //GSM开机时序
    digitalWrite(5,HIGH);
    delay(1500);
    digitalWrite(5,LOW);
 }
 void loop()
 {
    digitalWrite(3,LOW);//使能GSM的TX、RX
    digitalWrite(4,HIGH);//关闭GPS的TX、RX
 }

3、打开串口助手软件

S1按键拨到Comm端,S2按键拨到USB端。

Uart Select串口选择开关拨到中间。

打开串口助手软件,默认波特率为9600bps,勾选发送新行。此时STAT灯亮,模块启动,如果没有启动可以按下RST复位键,重新开启。

4、上传数据

步骤:

AT 同步

AT+CSTT 设置APN

AT+CIICR 激活移动场景

AT+CIFSR 获得本地IP地址

AT+CIPSTART="TCP","tcp.lewei50.com",9960 建立TCP连接

AT+CIPSEND 发送数据

出现“>” ,发送下面数据

{"method": "update","gatewayNo": "02","userkey": "5d3eeec03bc747d7a23ab7d99c9340ea"}&^!

输入完后按‘ctrl+z’即可

AT+CIPSEND 发送数据

出现“>” ,发送下面数据

{"method": "upload","data":[{"Name":"T1","Value":"25"}]}&^!

输入完后按‘ctrl+z’即可

GPRS_13

GPRS_14

GPRS_15

此时可以在乐联网平台看到传输的数据

GPRS_5

通过Arduino通信控制GPRS数据传输

1、硬件连接

扩展板接到主控板UNO,SIM卡插好。

USB线、外接电源接好。

2、下载程序

扩展板S1开关拨到Prog端,下载下面程序。

    void setup()
 {
    //设置引脚为输出模式
    pinMode(3,OUTPUT);
    pinMode(4,OUTPUT);
    pinMode(5,OUTPUT);
    //GSM开机时序
    digitalWrite(5,HIGH);
    delay(1500);
    digitalWrite(5,LOW);

    digitalWrite(3,LOW);//使能GSM的TX、RX
    digitalWrite(4,HIGH);//关闭GPS的TX、RX
     //设置波特率
     Serial.begin(9600);
     //等待call ready
     delay(5000);
     delay(5000);
     delay(5000);
 }
 void loop()
 {
     unsigned char t=25;

     //发送AT命令同步
     Serial.println("AT");
     delay(2000);
     Serial.println("AT");
     delay(5000);


     Serial.println("AT+CIPSTART=\"TCP\",\"tcp.lewei50.com\",9960");
     delay(5000);
     Serial.println("AT+CIPSEND");
     delay(2000);
     Serial.print("{\"method\": \"update\",\"gatewayNo\": \"02\",\"userkey\": \"5d3eeec03bc747d7a23ab7d99c9340ea\"}&^!");
     delay(2000);
     Serial.write(26);
     delay(5000);
     Serial.println("AT+CIPSEND");
     delay(2000);
     Serial.print("{\"method\": \"upload\",\"data\":[{\"Name\":\"T1\",\"Value\":\"");
     Serial.print(t);
     Serial.print("\"}]}&^!");
     delay(2000);
     Serial.write(26);
     delay(5000);
     while(1);
 }

将S1开关拨到Comm,S2开关拨到Arduino,Uart Select串口选择开关拨到中间。

疑难解答

更多问题及有趣的应用,请访问论坛

<File:shopping_car.png> DFRobot商城购买链接