< >
Home » Arduino通信模块 » Arduino通讯模块-GPS/GPRS/GSM 扩展板 V3.0

Arduino通讯模块-GPS/GPRS/GSM 扩展板 V3.0

外观

外观

简介

  • 这是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芯片的说明。同时还可以参考我们产品资料库,获得更多的端口示意图和示例代码。

技术规格

  • 供电电源:6-12V
  • 低电量消耗(100mA@7V-GSM模式)
  • 四频 850/900/18001900MHz
  • GPRS multi-slot class 10
  • GPRS mobile station class B
  • 采用GSM phase 2/2+标准
  • CLass4(2 W @ 850/900 MHz)
  • Class 1 (1 W @ 1800/1900MHz)
  • 通过AT指令控制(GSM07.07 ,07.05 和SIMCom加强型AT指令)
  • 支持GPS卫星导航技术
  • 内嵌有GPS&GSM高增益SMD天线
  • 支持4*4按钮垫
  • USB/Arduino控制开关
  • Arduino可编程交换机
  • LED指示灯能显示电源供应状态,网络状态和工作模式
  • 大小:81*70mm

扩展板接口功能

Shield Interface Function

  1. S1、S2开关:

    • S1:编程/通信模式切换,prog:编程模式,comm:通信模式。
    • S2:USB/arduino通信模式切换,USB:扩展板通信通过USB口,arduino:扩展板与arduino通信。
  2. 状态指示灯:

    • PWR:电源指示灯;
    • STAT:模块启动状态指示灯;
    • NET:网络状态指示灯;
      1. 熄灭——模块没有工作,
      2. 64ms亮/800ms熄灭——模块没有找到网络,
      3. 64ms亮/3000ms灭——模块注册到网络,
      4. 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

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

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

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

GPRS_3

userkey:5d3eeec03bc747d7a23ab7d99c9340ea

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

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

  • API地址:http://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串口选择开关拨到中间。

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: gps/gprs/gsm 扩展板 v3.0, gps扩展板, arduino通讯模块, gprs/gsm扩展板