GPS/GPRS/GSM 扩展板 V3.0

GPS+GPRS+GSM

目录

1 简介
2 技术规格
3 扩展板接口功能
4 串口选择
5 GPS功能使用介绍

5.1 GPS通信通过USB口
5.2 GPS与Arduino通信

6 GSM功能使用介绍

6.1 GSM通信通过USB口

6.1.1 打电话
6.1.2 发短信

6.2 GSM通信与Arduino

6.2.1 打电话
6.2.2 发短信

7 GPRS功能使用介绍

7.1 相关AT指令介绍
7.2 乐联网TCP服务器通讯协议
7.3 通过USB口通信控制GPRS数据传输
7.4 通过Arduino通信控制GPRS数据传输

8 疑难解答

简介
这是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天线
支持44按钮垫
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:网络状态指示灯;
        
        熄灭——模块没有工作,
        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
服务器后台设置准备工作:
参考文档 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串口选择开关拨到中间。

疑难解答
更多问题及有趣的应用,请访问论坛

Shopping car.png |link=http://www.dfrobot.com.cn/index.php?route=common/home

标签: Arduino传感器