Arduino GPRS Shield
Arduino GPRS Shield
Contents
[hide]
1 Introduction
2 Features
3 Application Ideas
4 Cautions
5 Hardware Diagram
6 Getting Started
o 6.1 Indicator LEDs
o 6.2 Power Up and Power Down the GPRS Shield
7 Schematics
8 Resources
9 How to buy
Introduction
The GPRS Shield is based on SIM900 module from SIMCOM and compatible with
Arduino and its clones. The GPRS Shield provides you a way to communicate using the
GSM cell phone network. The shield allows you to achieve SMS, MMS, GPRS and Audio
via UART by sending AT commands (GSM 07.07 ,07.05 and SIMCOM enhanced AT
Commands). The shield also has the 12 GPIOs, 2 PWMs and an ADC of the SIM900
module(They are all 2V8 logic) present onboard.
Features
Quad-Band 850 / 900/ 1800 / 1900 MHz - would work on GSM networks in all
countries across the world.
Control via AT commands - Standard Commands: GSM 07.07 & 07.05 | Enhanced
Commands: SIMCOM AT Commands.
Short Message Service - so that you can send small amounts of data over the
network (ASCII or raw hexadecimal).
RTC supported.
Specifications
Application Ideas
Cautions
The factory default setting for the GPRS Shield UART is 19200 bps 8-N-1. (Can be
changed using AT commands).
Hardware Diagram
Power select - select the power supply for GPRS shield(external power or 5v of
arduino)
Serial port select - select either software serial port or hareware serial port to be
connected to GPRS Shield
Net light - tell the status about SIM900 linking to the net
GPIO,PWM and ADC of SIM900 - GPIO,PWM and ADC pins breakout of SIM900
D0 - Unused if you select software serial port to communicate with GPRS Shield
D1 - Unused if you select software serial port to communicate with GPRS Shield
D2 - Unused
D3 - Unused
D4 - Unused
D5 - Unused
D6 - Unused
D7 - Used if you select software serial port to communicate with GPRS Shield
D8 - Used if you select software serial port to communicate with GPRS Shield
D10 - Unused
D11 - Unused
D12 - Unused
D13 - Unused
D14(A0) - Unused
D15(A1) - Unused
D16(A2) - Unused
D17(A3) - Unused
D18(A4) - Unused
D19(A5) - Unused
Note: A4 and A5 are connected to the I2C pins on the SIM900. The SIM900
however cannot be accessed via the I2C .
Getting Started
Indicator LEDs
There are three indicator LEDs(PWR(Green), Staus(Blue), Netlight(Red)) on the GPRS
Shield, users can know about the working state of the shield based on the three indicator
LEDs. Detailed information please refer to the following table:
1, Hardware Triger; Press the ON/OFF Button about two seconds.The power up
scenarios illustrates as following figure:
2, Software Triger; If use this way to power up the GPRS Shield, JP need to be
soldered, then Digital Pin 9 of the Arduino will act as Software Triger port and
Digital Pin 9 can not be use as other purpose. Then give Digital Pin 9 a Turn on
Impulse can power up the GPRS Shield. The power up scenarios illustrates as
following figure:
The following code is power up subroutine for Arduino if using software triger:
void powerUp()
{
pinMode(9, OUTPUT);
digitalWrite(9,LOW);
delay(1000);
digitalWrite(9,HIGH);
delay(2000);
digitalWrite(9,LOW);
delay(3000);
}
When power on procedure completes, the SIM900 will send out following result code to
indicate the GPRS shield is ready to operate; When set as fixed baud rate, the SIM900 will
send out result code: RDY This result code does not appear when auto baud rate is active.
Power Down the GPRS Shield
The GPRS Shield can be turned off by following ways:
1, Normal power down procedure: Turn off the GPRS shield by using Hardware
Triger; Press the ON/OFF Button about two seconds.
2, Normal power down procedure: If JP is soldered, then give Digital Pin 9 of the
Arduino(act as Software Triger) a Turn off Impulse can turn off the GPRS Shield. The
power down scenarios illustrates as following figure:
The following code is power down subroutine for Arduino if using software triger:
void powerDown()
{
pinMode(9, OUTPUT);
digitalWrite(9,LOW);
delay(1000);
digitalWrite(9,HIGH);
delay(2000);
digitalWrite(9,LOW);
delay(3000);
}
When GPRS Shield power dowm in Normal power down procedure, the procedure lets the
SIM900 log off from the network and allows the software to enter into a secure state and
save data before completely disconnecting the power supply. Before the completion of the
power down procedure the SIM900 will send out result code: NORMAL POWER DOWN
To monitor the temperature, users can use the AT+CMTE command to read
the temperature when GPRS Shield is powered on.
To monitor the supply voltage, users can use the AT+CBC command which
includes a parameter: voltage value(in mV) when GPRS Shield is powered on.
Note:
Not all Arduino boards support software serial on D7 and D8, For example Arduino
Mega and Mega 2560 only support the following pins for RX: 10, 11, 12, 13, 50,
51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69. So Arduino Mega doesn't support soft
serial on Pin D7 and D8. If using GPRS shield with Ardiuno Mega, please use the
hardware serial or use the jumper wires wiring GPRS TX and RX to the pins
support interrupt on Ardiuno Mega. And not all pins on the Leonardo support
change interrupts, so only the following can be used for RX: 8, 9, 10, 11, 14
(MISO), 15 (SCK), 16 (MOSI). More information about Softserial library please
visit http://arduino.cc/en/Reference/SoftwareSerial
Users can use AT+IPR=? command to see supported baudrate, it will response a
list of supported baudrate.
Users can use AT+IPR=x(x is value of supported baudrate) to set a fixed baud
rate and save the configuration to non-volatile flash memory.
The following sketch configures Arduino/Arduino clone as serial link between PC and the
GPRS Shield(Jumpers on SWserial side). PC would need a serial terminal software to
communicate with it - Window's built-in HyperTerminal, Arduino IDE's Serial Monitor,
Serial Terminals(sscom32) or Bray++ Terminal.
The GPRS Shield comes with all the accessories that you need to get started with sending
data over the GSM network except an Arduino board and a GSM SIM Card. If you want to
make voice calls, you would also require a headset with microphone.
Step 1: Creating a test setup for the GPRS Shield
AT Commands are simple textual commands sent to the GPRS modem over its serial
interface (UART), so you can use any serial terminal software to communicate with it.
Note: Almost all the AT commands should be sent followed by carriage return and you
need to select the "+CR"option in the serial port terminal.To experiment with AT
commands, you would require a way to power up and communicate with your GPRS
Shield. The best way to do this using an Arduino Duemilanove board.
1. Follow the previously described hardware installation steps to set up the hardware
system;
2. Make sure the GPRS_TX & GPRS_RX jumpers on the GPRS Shield are mounted
in SWSerial position - that is we want GPRS_TX to be connected to D7(RX) and
GPRS_RX to D8(TX).
3. Connect the Arduino Duemilanove to your computer using a USB cable.
4. The ATmega328P microcontroller on Duemilanove board has only one UART
which is used for communicating with the PC. What we need is an Arduino Sketch
running inside the ATmega328P that would emulate a second serial port (UART)
using software on the digital pins D8 and D7 and patch through all the
communication between this second software serial port and the actual hardware
serial port. By doing this, all the data coming from the computer (connected to the
actual hardware UART) would be routed to the GPRS Shield (connected to software
UART) then, we would be able to issue AT commands to control the GPRS Shield.
The block diagram outlining this scheme is shown below.
For developing such a program, we require to use the SoftwareSerial library included in the
libraries of Arduino 1.0 already and the demo code below.
//Serial Relay - Arduino will patch a
//serial link between the computer and the GPRS Shield
//at 19200 bps 8-N-1
//Computer is connected to Hardware UART
//GPRS Shield is connected to the Software UART
#include <SoftwareSerial.h>
SoftwareSerial GPRS(7, 8);
unsigned char buffer[64]; // buffer array for data recieve over serial
port
int count=0;
// counter for buffer array
void setup()
{
GPRS.begin(19200);
// the GPRS baud rate
Serial.begin(19200);
// the Serial port of Arduino baud
rate.
}
void loop()
{
if (GPRS.available())
// if date is comming from
softwareserial port ==> data is comming from gprs shield
{
while(GPRS.available())
// reading data into char array
{
buffer[count++]=GPRS.read();
// writing data into array
if(count == 64)break;
}
Serial.write(buffer,count);
// if no data transmission
ends, write buffer to hardware serial port
clearBufferArray();
// call clearBufferArray function to
clear the storaged data from the array
count = 0;
// set counter of while loop to zero
}
if (Serial.available())
// if data is available on
hardwareserial port ==> data is comming from PC or notebook
GPRS.write(Serial.read());
// write it to the GPRS shield
}
void clearBufferArray()
// function to clear buffer array
{
for (int i=0; i<count;i++)
{ buffer[i]=NULL;}
// clear all index of array with
command NULL
}
Now that our test setup is ready, let's play around with some AT Commands manually
before moving on to programming the Arduino to do this. Let's try sending an SMS to start.
1. .Create the setup as described in Step 1 above.
2. .Through your serial terminal software, send AT+CMGF=1 and press the Enter key.
The GPRS Shield can send SMSes in two modes: Text mode and PDU (or binary)
mode. Since we want to send out a human readable message, we will select the text
mode. The GPRS Shield will respond with an OK.
3. .Click "send new" option and send AT+CMGS="+918446043032". This will
instruct the GPRS Shield to start accepting text for a new message meant for the
phone number specified (replace the number with the phone number of the target
phone). The GPRS Shield will send a > to remind you typing the message.
1. .Start typing your message and when you are done, and click "send hex" option and
then send a hex: 1A. The modem will accept the message and respond with an OK.
A few moments later, the message should be received on the handset whose number
you had specified.You can refer to the picture below.
NOTE: If, in spite of following the steps as specified above, you aren't able to receive the
message on the target handset, then it might be that you need to set the SMS Message
Center number. Send the command AT+CSCA="+919032055002" and press the Enter Key.
Send this command in between the AT+CMGF and AT+CMGS commands. Replace the
phone number specified in the command above with the SMS Center number of your GSM
Service Provider. The message center number is specific to each service provider (for
example +919032055002 is the message center number for Tata DoCoMo, Pune, India).
You can get the message center number by calling up the customer care center of the GSM
Service Provider and asking them for it.
SoftwareSerial library Notes
With Arduino 1.0 you should be able to use the SoftwareSerial library included with the
distribution (instead of NewSoftSerial). However, you must be aware that the buffer
reserved for incoming messages are hardcoded to 64 bytes in the library header,
"SoftwareSerial.h": 1.define _SS_MAX_RX_BUFF 64 // RX buffer size
This means that if the GPRS module responds with more data than that, you are likely to
loose it with a buffer overflow! For instance, reading out an SMS from the module with
"AT+CMGR=xx" (xx is the message index), you might not even see the message part
because the preceding header information (like telephone number and time) takes up a lot
of space. The fix seems to be to manually change _SS_MAX_RX_BUFF to a higher value
(but reasonable so you don't use all you precious memory!)
The Softwareserial library has the following limitations (taken from arduino page) If using
multiple software serial ports, only one can receive data at a time.
http://arduino.cc/hu/Reference/SoftwareSerial This means that if you try to add another
serial device ie grove serial LCD you may get communication errors unless you craft your
code carefully.
7. .Type command in the terminal to execute different function, threr are 4 functions in
the demo:
1. .If you input 't', the demo will send a SMS message to another cellphone
which you set(you need set the number in the code);
2. .If you input 'd', the program will dial a call to the other cellphone that you
set(it is also need you set in the code );
3. .If you input 'h', it will submit a http request to a web that you want to
access(it need you set the web adress in the code), it will return a string from
the website if it goes correctly;
4. .If you input 's', it will upload the datas to the pachube(for detail you can
refer to the explanation in the code). I strongly recommend you input 'h'
before input 's', because uploading datas to the pachube need do some
setting, after execute the function of submit a http request, the setting will be
set.
8. .If the program returns error in the terminal after you typed the command, don't
worry, just try input the command again.
/*Note: this code is a demo for how to using gprs shield to send sms
message, dial a voice call and
send a http request to the website, upload data to pachube.com by TCP
connection,
The microcontrollers Digital Pin 7 and hence allow unhindered
communication with GPRS Shield using SoftSerial Library.
IDE: Arduino 1.0 or later
Replace the following items in the code:
1.Phone number, don't forget add the country code
2.Replace the Access Point Name
3. Replace the Pachube API Key with your personal ones assigned
to your account at cosm.com
*/
#include <SoftwareSerial.h>
#include <String.h>
SoftwareSerial mySerial(7, 8);
void setup()
{
mySerial.begin(19200);
// the GPRS baud rate
Serial.begin(19200);
// the GPRS baud rate
delay(500);
}
void loop()
{
//after start up the program, you can using terminal to connect the
serial of gprs shield,
//if you input 't' in the terminal, the program will execute
SendTextMessage(), it will show how to send a sms message,
//if input 'd' in the terminal, it will execute DialVoiceCall(), etc.
if (Serial.available())
switch(Serial.read())
{
case 't':
SendTextMessage();
break;
case 'd':
DialVoiceCall();
break;
case 'h':
SubmitHttpRequest();
break;
case 's':
Send2Pachube();
break;
}
if (mySerial.available())
Serial.write(mySerial.read());
}
///SendTextMessage()
///this function is to send a sms message
void SendTextMessage()
{
mySerial.print("AT+CMGF=1\r");
//Because we want to send the SMS in
text mode
delay(100);
mySerial.println("AT + CMGS = \"+86138xxxxx615\"");//send sms message,
be careful need to add a country code before the cellphone number
delay(100);
mySerial.println("A test message!");//the content of the message
delay(100);
mySerial.println((char)26);//the ASCII code of the ctrl+z is 26
delay(100);
mySerial.println();
}
///DialVoiceCall
///this function is to dial a voice call
void DialVoiceCall()
{
mySerial.println("ATD + +86138xxxxx615;");//dial the number
delay(100);
mySerial.println();
}
///SubmitHttpRequest()
///this function is submit a http request
///attention:the time of delay is very important, it must be set enough
void SubmitHttpRequest()
{
mySerial.println("AT+CSQ");
delay(100);
ShowSerialData();// this code is to show the data from gprs shield, in
order to easily see the process of how the gprs shield submit a http
request, and the following is for this purpose too.
mySerial.println("AT+CGATT?");
delay(100);
ShowSerialData();
mySerial.println("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"");//setting the
SAPBR, the connection type is using gprs
delay(1000);
ShowSerialData();
mySerial.println("AT+SAPBR=3,1,\"APN\",\"CMNET\"");//setting the APN,
the second need you fill in your local apn server
delay(4000);
ShowSerialData();
mySerial.println("AT+SAPBR=1,1");//setting the SAPBR, for detail you can
refer to the AT command mamual
delay(2000);
ShowSerialData();
mySerial.println("AT+HTTPINIT"); //init the HTTP request
delay(2000);
ShowSerialData();
mySerial.println("AT+HTTPPARA=\"URL\",\"www.google.com.hk\"");// setting
the httppara, the second parameter is the website you want to access
delay(1000);
ShowSerialData();
mySerial.println("AT+HTTPACTION=0");//submit the request
delay(10000);//the delay is very important, the delay time is base on
the return from the website, if the return datas are very large, the time
required longer.
//while(!mySerial.available());
ShowSerialData();
mySerial.println("AT+HTTPREAD");// read the data from the website you
access
delay(300);
ShowSerialData();
mySerial.println("");
delay(100);
}
///send2Pachube()///
///this function is to send the sensor data to the pachube, you can see
the new value in the pachube after execute this function///
void Send2Pachube()
{
mySerial.println("AT+CGATT?");
delay(100);
ShowSerialData();
mySerial.println("AT+CSTT=\"CMNET\"");//start task and setting the APN,
delay(1000);
ShowSerialData();
mySerial.println("AT+CIICR");//bring up wireless connection
delay(300);
ShowSerialData();
mySerial.println("AT+CIFSR");//get local IP adress
delay(2000);
ShowSerialData();
mySerial.println("AT+CIPSPRT=0");
delay(3000);
ShowSerialData();
mySerial.println("AT+CIPSTART=\"tcp\",\"api.cosm.com\",\"8081\"");//start
up the connection
delay(2000);
ShowSerialData();
mySerial.println("AT+CIPSEND");//begin send data
delay(4000);
ShowSerialData();
String humidity = "1031";//these 4 line code are
data, because the demo did't add other sensor, so
to replace.
String moisture = "1242";//you can replace these
real sensor data in your project
String temperature = "30";//
String barometer = "60.56";//
to remote server
imitate the real sensor
using 4 string variable
four variable to the
delay(100);
ShowSerialData();
}
void ShowSerialData()
{
while(mySerial.available()!=0)
Serial.write(mySerial.read());
}
Schematics
File:GPRSshield_sch.pdf
Resources
SIM900 AT Commands Manual v1.03.pdf
SIM900_hd_v1.06.pdf
SIM900_TCP/IP Application Note
Si5902BDC - Dual N-Channel 30 V (D-S) MOSFETs (used for 2.8V <> 5.0V translation
for Serial Interface)
How to buy
Click here to buy Arduino GPRS Shield
Log in
Page
Discussion
Read
View source
View history
Navigation
Main page
product
Experiment
Tutorials
Friendly ARM
Mini2440
Micro2440
Mini6410
Tiny6410
Mini210
Mini210s
Tiny210
Links
Forum
Bazzar
Blog
Contact us
Toolbox
Related changes
Special pages
Printable version
Permanent link