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指示灯能显示电源供应状态,网络状态和工作模式
大小:8170mm
扩展板接口功能
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(' ');
}
}
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
}
打开串口助手软件,默认波特率为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
}
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串口选择开关拨到中间。疑难解答
更多问题及有趣的应用,请访问论坛
|link=http://www.dfrobot.com.cn/index.php?route=common/home