The data is saved in a spreadsheet dataGPS.csv, the format of which corresponds to the requirements of the service Google My Maps.

    Programming language: Arduino (C++)

Video instruction

What you need

How to assemble

gps-tracker.ino // library for working with devices via SPI#include // library for working with SD card#include // library for working with a GPS device#include // create an object of the GPS class and pass the Serial1 object to it GPS gps(Serial1) ; // LED pin#define LED_PIN A0 // button pin #define BUTTON_PIN 13 // pin CS micro-sd card#define CHIP_SELECT_PIN 9 // time interval for writing data to the card#define INTERVAL 5000 // set the array size for time, date, latitude and longitude#define MAX_SIZE_MASS 16 // array to store the current time char time[MAX_SIZE_MASS]; // record state bool stateRec = false ; // remembers the current time long startMillis = millis() ; void setup() ( // open the serial port to monitor actions in the program Serial.begin(115200); // wait until the serial port monitor opens // in order to track all events in the program// while (!Serial) ( // ) Serial.print ("Serial init OK \r\n") ; // open a Serial connection with the GPS module Serial1.begin(115200); // set the LED to output mode pinMode(LED_PIN, OUTPUT) ; // set the button to login mode pinMode(BUTTON_PIN, INPUT_PULLUP) ; // output information about initialization to the Serial port Serial.println("Initializing SD card...") ; // initialize the SD card while (! SD.begin (CHIP_SELECT_PIN) ) ( Serial.println ("Card failed, or not present" ) ; delay(1000 ) ; ) // output information to the Serial port Serial.println("Card initialized"); // create a dataFile object of the File class to work with files File dataFile = SD.open("dataGPS.csv" , FILE_WRITE) ; // if the file exists if (dataFile) ( // write the name of the future data to the memory card dataFile.println("Time, Coordinates, Speed"); // close the file dataFile.close(); Serial.println("Save OK"); ) else ( Serial.println ("Error opening test.csv" ) ; ) ) void loop() ( // Record the button press if (! digitalRead(BUTTON_PIN) ) ( // change the state “recording” / “not writing” to the memory card stateRec = ! stateRec; // change the state of the indication LED digitalWrite(LED_PIN, stateRec) ; ) // if data came from the GPS module if (gps.available()) ( // read data and parse gps.readParsing(); // check the status of the GPS module switch (gps.getState () ) ( // everything is OK case GPS_OK: Serial.println ("GPS is OK" ) ; // if the specified time interval has passed if (millis() - startMillis > INTERVAL && stateRec) ( // save data to memory card saveSD() ; // remember the current time startMillis = millis() ; ) break ; // data error case GPS_ERROR_DATA: Serial.println ("GPS error data" ) ; break ; // no connection with satellites case GPS_ERROR_SAT: Serial.println ( "GPS no connect to satellites") ; break ; ) ) ) // function of saving data to a memory card void saveSD() ( File dataFile = SD.open("dataGPS.csv" , FILE_WRITE) ; // if the file exists and has been opened if (dataFile) ( // reads the current time gps.getTime(time, MAX_SIZE_MASS); // write the time to the memory card dataFile.print(" \" " ) ; dataFile.print(time); dataFile.print(" \" " ) ; dataFile.print ("," ) ; dataFile.print(" \" " ) ; // read and write latitude and longitude coordinates to the memory card dataFile.print(gps.getLatitudeBase10(), 6); dataFile.print ("," ) ; dataFile.print(gps.getLongitudeBase10(), 6); dataFile.print(" \" " ) ; dataFile.print ("," ) ; dataFile.print(gps.getSpeedKm()); dataFile.println("km/h"); dataFile.close(); Serial.println("Save OK"); ) else ( Serial.println ("Error opening test.csv" ) ; ) )

The GPS global positioning system has already become a part of our lives. Today it is difficult to imagine a mobile phone without a built-in GPS module. This satellite navigation system allows you to track any objects, determine their coordinates and speed of movement. Now GPS is available not only to companies developing the corresponding equipment, but also to ordinary radio amateurs who already use the popular Arduino boards to their full potential. This material will discuss connecting a miniature GPS tracker to the Arduino Pro Mini board. The PG03 MiniGPS tracker is used as a test subject.



This tracker, in addition to direct geographic coordinates, shows the direction of movement, the distance traveled and the speed of movement. Unfortunately, it does not record information, so by connecting it to the Arduino, you can access this data and do whatever you want with it.


First, the tracker needs to be disassembled. Below are images of a disassembled GPS tracker.




The heart of the tracker is the Venus638FLP GPS chip. Its 44th pin is the output of the UART interface (TxD). You can solder a wire directly to this pin, or you can find a testing pin on the board to which this pin is also connected. Below are images of the pin locations of the microcircuit and how to connect to the desired pin.





Now let's take a compact Arduino Pro Mini board and an SD card module to record NMEA protocol data. The connection diagram for the Arduino Pro Mini and the SD card module is as follows:



Connecting module pins for SD cards:


GND to GND
VCC to 3.3V
MISO to pin 12
MOSI to pin 11
SCK to pin 13
CS to pin 10

Connecting the GPS tracker pins:


GND to GND
Pin 2 (Arduino) to Pin 44 (GPS)

It is better to take power from the GPS tracker (3.7 V). Since its battery has low energy capacity, it is preferable to connect an external battery, for example, from a 1400 mAh mobile phone, as shown in one of the pictures above.


Now you need to download the TinyGPS library, you will also need a library for working with SD cards and the SoftwareSerial library, which can be found in Arduino\libraries.



In the following piece of code you can choose what data to write:


void gpsdump(TinyGPS &gps) ( float flat, flon; // Lat, Long float fkmph = gps.f_speed_kmph(); // Speed ​​in km/hr float falt = gps.f_altitude(); // +/- altitude in meters (seem to be elevation, in fact) float fc = gps.f_course(); // Course in degrees unsigned long age; gps.f_get_position(&flat, &flon, &age); (flat, 4); Serial.print(" lon "); Serial.print(" kms "); .print(fc); Serial.print(" elevation "); ///////////////////////// //////////////////////////////////////////////// ///////////////

Upload the sketch to the Arduino, insert an SD card formatted according to FAT32 and having a log.txt file in the root. Launch Serial Monitor and you will see the data being written to the SD card.



After several experiments with Arduino, I decided to make a simple and not very expensive GPS tracker with coordinates sent via GPRS to the server.
Used Arduino Mega 2560 (Arduino Uno), SIM900 - GSM/GPRS module (for sending information to the server), GPS receiver SKM53 GPS.

Everything was purchased on ebay.com, for a total of about 1500 rubles (about 500 rubles for the arduino, a little less for the GSM module, a little more for the GPS).

GPS receiver

First you need to understand how to work with GPS. The selected module is one of the cheapest and simplest. However, the manufacturer promises a battery to save satellite data. According to the datasheet, a cold start should take 36 seconds, however, in my conditions (10th floor from the windowsill, no buildings close by) it took as much as 20 minutes. The next start, however, is already 2 minutes.

An important parameter of devices connected to the Arduino is power consumption. If you overload the Arduino converter, it may burn out. For the receiver used, the maximum power consumption is 45mA @ 3.3v. Why the specification should indicate the current strength at a voltage other than the required one (5V) is a mystery to me. However, the Arduino converter will withstand 45 mA.

Connection
GPS is not controlled, although it has an RX pin. For what purpose is unknown. The main thing you can do with this receiver is to read data via the NMEA protocol from the TX pin. Levels - 5V, just for Arduino, speed - 9600 baud. I connect VIN to VCC of the arduino, GND to GND, TX to RX of the corresponding serial. I read the data first manually, then using the TinyGPS library. Surprisingly, everything is readable. After switching to Uno, I had to use SoftwareSerial, and then problems began - some of the message characters were lost. This is not very critical, since TinyGPS cuts off invalid messages, but it is quite unpleasant: you can forget about the 1Hz frequency.

A quick note about SoftwareSerial: there are no hardware ports on the Uno (other than the one connected to USB Serial), so you have to use software. So, it can only receive data on a pin on which the board supports interrupts. In the case of Uno, these are 2 and 3. Moreover, only one such port can receive data at a time.

This is what the “test bench” looks like.

GSM receiver/transmitter


Now comes the more interesting part. GSM module - SIM900. It supports GSM and GPRS. Neither EDGE, nor especially 3G, are supported. For transmitting coordinate data, this is probably good - there will be no delays or problems when switching between modes, plus GPRS is now available almost everywhere. However, for some more complex applications this may not be enough.

Connection
The module is also controlled via the serial port, with the same level - 5V. And here we will need both RX and TX. The module is shield, that is, it is installed on the Arduino. Moreover, it is compatible with both mega and uno. The default speed is 115200.

We assemble it on Mega, and here the first unpleasant surprise awaits us: the TX pin of the module falls on the 7th pin of Mega. Interrupts are not available on the 7th pin of the mega, which means you will have to connect the 7th pin, say, to the 6th pin, on which interruptions are possible. Thus, we will waste one Arduino pin. Well, for a mega it’s not very scary - after all, there are enough pins. But for Uno this is already more complicated (I remind you that there are only 2 pins that support interrupts - 2 and 3). As a solution to this problem, we can suggest not installing the module on the Arduino, but connecting it with wires. Then you can use Serial1.

After connecting, we try to “talk” to the module (don’t forget to turn it on). We select the port speed - 115200, and it is good if all the built-in serial ports (4 on mega, 1 on uno) and all software ports work at the same speed. This way you can achieve more stable data transfer. I don’t know why, although I can guess.

So, we write primitive code for forwarding data between serial ports, send atz, and receive silence in response. What's happened? Ah, case sensitive. ATZ, we get OK. Hurray, the module can hear us. Should you give us a call out of curiosity? ATD +7499... The landline phone rings, smoke comes out of the arduino, the laptop turns off. The Arduino converter burned out. It was a bad idea to feed it 19 volts, although it is written that it can operate from 6 to 20V, they recommend 7-12V. The datasheet for the GSM module does not say anywhere about power consumption under load. Well, Mega goes to the spare parts warehouse. With bated breath, I turn on the laptop, which received +19V via the +5V line from USB. It works, and even the USB didn't burn out. Thanks Lenovo for protecting us.

After the converter burned out, I looked for current consumption. So, peak - 2A, typical - 0.5A. This is clearly beyond the capabilities of the Arduino converter. Requires separate food.

Programming
The module provides extensive data transfer capabilities. Starting from voice calls and SMS and ending with GPRS itself. Moreover, for the latter it is possible to execute an HTTP request using AT commands. You'll have to send several, but it's worth it: you don't really want to create a request manually. There are a couple of nuances with opening a data transmission channel via GPRS - remember the classic AT+CGDCONT=1, “IP”, “apn”? So, the same thing is needed here, but a little more cunning.

To get a page at a specific URL, you need to send the following commands:
AT+SAPBR=1,1 //Open carrier (Carrier) AT+SAPBR=3,1,"CONTYPE","GPRS" //connection type - GPRS AT+SAPBR=3,1,"APN","internet" //APN, for Megafon - internet AT+HTTPINIT //Initialize HTTP AT+HTTPPARA="CID",1 //Carrier ID to use. AT+HTTPPARA="URL","http://www.example.com/GpsTracking/record.php?Lat=%ld&Lng=%ld" //The actual URL, after sprintf with coordinates AT+HTTPACTION=0 //Request data using the GET method //wait for response AT+HTTPTERM //stop HTTP

As a result, if there is a connection, we will receive a response from the server. That is, in fact, we already know how to send coordinate data if the server receives it via GET.

Nutrition
Since powering the GSM module from an Arduino converter, as I found out, is a bad idea, it was decided to buy a 12v->5v, 3A converter on the same ebay. However, the module does not like 5V power supply. Let's go for a hack: connect 5V to the pin from which 5V comes from the arduino. Then the built-in converter of the module (much more powerful than the Arduino converter, MIC 29302WU) will make from 5V what the module needs.

Server

The server wrote a primitive one - storing coordinates and drawing on Yandex.maps. In the future, it is possible to add various features, including support for many users, “armed/unarmed” status, the state of the vehicle systems (ignition, headlights, etc.), and possibly even control of the vehicle systems. Of course, with appropriate support for the tracker, which smoothly turns into a full-fledged alarm system.

Field tests

This is what the assembled device looks like, without the case:

After installing the power converter and placing it in the case from a dead DSL modem, the system looks like this:

I soldered the wires and removed several contacts from the Arduino blocks. They look like this:

I connected 12V in the car, drove around Moscow, and got the track:


The track points are quite far from each other. The reason is that sending data via GPRS takes a relatively long time, and during this time the coordinates are not read. This is clearly a programming error. It is treated, firstly, by immediately sending a packet of coordinates over time, and secondly, by asynchronously working with the GPRS module.

The search time for satellites in the passenger seat of a car is a couple of minutes.

conclusions

Creating a GPS tracker on Arduino with your own hands is possible, although not a trivial task. The main question now is how to hide the device in the car so that it is not exposed to harmful factors (water, temperature), is not covered with metal (GPS and GPRS will be shielded) and is not particularly noticeable. For now it just lies in the cabin and connects to the cigarette lighter socket.

Well, we also need to correct the code for a smoother track, although the tracker already performs the main task.

Used devices

  • Arduino Mega 2560
  • Arduino Uno
  • GPS SkyLab SKM53
  • SIM900 based GSM/GPRS Shield
  • DC-DC 12v->5v 3A converter

After several experiments with Arduino, I decided to make a simple and not very expensive GPS tracker with coordinates sent via GPRS to the server.
Used Arduino Mega 2560 (Arduino Uno), SIM900 - GSM/GPRS module (for sending information to the server), GPS receiver SKM53 GPS.

Everything was purchased on ebay.com, for a total of about 1500 rubles (about 500 rubles for the arduino, a little less for the GSM module, a little more for the GPS).

GPS receiver

First you need to understand how to work with GPS. The selected module is one of the cheapest and simplest. However, the manufacturer promises a battery to save satellite data. According to the datasheet, a cold start should take 36 seconds, however, in my conditions (10th floor from the windowsill, no buildings close by) it took as much as 20 minutes. The next start, however, is already 2 minutes.

An important parameter of devices connected to the Arduino is power consumption. If you overload the Arduino converter, it may burn out. For the receiver used, the maximum power consumption is 45mA @ 3.3v. Why the specification should indicate the current strength at a voltage other than the required one (5V) is a mystery to me. However, the Arduino converter will withstand 45 mA.

Connection

GPS is not controlled, although it has an RX pin. For what purpose is unknown. The main thing you can do with this receiver is to read data via the NMEA protocol from the TX pin. Levels - 5V, just for Arduino, speed - 9600 baud. I connect VIN to VCC of the arduino, GND to GND, TX to RX of the corresponding serial. I read the data first manually, then using the TinyGPS library. Surprisingly, everything is readable. After switching to Uno, I had to use SoftwareSerial, and then problems began - some of the message characters were lost. This is not very critical, since TinyGPS cuts off invalid messages, but it is quite unpleasant: you can forget about the 1Hz frequency.

A quick note about SoftwareSerial: there are no hardware ports on the Uno, so you have to use the software one. So, it can only receive data on a pin on which the board supports interrupts. In the case of Uno, these are 2 and 3. Moreover, only one such port can receive data at a time.

This is what the “test bench” looks like.


GSM receiver/transmitter


Now comes the more interesting part. GSM module - SIM900. It supports GSM and GPRS. Neither EDGE, nor especially 3G, are supported. For transmitting coordinate data, this is probably good - there will be no delays or problems when switching between modes, plus GPRS is now available almost everywhere. However, for some more complex applications this may not be enough.

Connection

The module is also controlled via the serial port, with the same level - 5V. And here we will need both RX and TX. The module is shield, that is, it is installed on the Arduino. Moreover, it is compatible with both mega and uno. The default speed is 115200.

We assemble it on Mega, and here the first unpleasant surprise awaits us: the TX pin of the module falls on the 7th pin of Mega. Interrupts are not available on the 7th pin of the mega, which means you will have to connect the 7th pin, say, to the 6th pin, on which interruptions are possible. Thus, we will waste one Arduino pin. Well, for a mega it’s not very scary - after all, there are enough pins. But for Uno this is already more complicated (I remind you that there are only 2 pins that support interrupts - 2 and 3). As a solution to this problem, we can suggest not installing the module on the Arduino, but connecting it with wires. Then you can use Serial1.

After connecting, we try to “talk” to the module (don’t forget to turn it on). We select the port speed - 115200, and it is good if all the built-in serial ports (4 on mega, 1 on uno) and all software ports work at the same speed. This way you can achieve more stable data transfer. I don’t know why, although I can guess.

So, we write primitive code for forwarding data between serial ports, send atz, and receive silence in response. What's happened? Ah, case sensitive. ATZ, we get OK. Hurray, the module can hear us. Should you give us a call out of curiosity? ATD +7499... The landline phone rings, smoke comes out of the arduino, the laptop turns off. The Arduino converter burned out. It was a bad idea to feed it 19 volts, although it is written that it can operate from 6 to 20V, they recommend 7-12V. The datasheet for the GSM module does not say anywhere about power consumption under load. Well, Mega goes to the spare parts warehouse. With bated breath, I turn on the laptop, which received +19V via the +5V line from USB. It works, and even the USB didn't burn out. Thanks Lenovo for protecting us.


After the converter burned out, I looked for current consumption. So, peak - 2A, typical - 0.5A. This is clearly beyond the capabilities of the Arduino converter. Requires separate food.

Programming

The module provides extensive data transfer capabilities. Starting from voice calls and SMS and ending with GPRS itself. Moreover, for the latter it is possible to execute an HTTP request using AT commands. You'll have to send several, but it's worth it: you don't really want to create a request manually. There are a couple of nuances with opening a data transmission channel via GPRS - remember the classic AT+CGDCONT=1, “IP”, “apn”? So, the same thing is needed here, but a little more cunning.

To get a page at a specific URL, you need to send the following commands:

AT+SAPBR=1,1 //Open carrier (Carrier) AT+SAPBR=3,1,"CONTYPE","GPRS" //connection type - GPRS AT+SAPBR=3,1,"APN","internet" //APN, for Megafon - internet AT+HTTPINIT //Initialize HTTP AT+HTTPPARA="CID",1 //Carrier ID to use. AT+HTTPPARA="URL","http://www.example.com/GpsTracking/record.php?Lat=%ld&Lng=%ld" //The actual URL, after sprintf with coordinates AT+HTTPACTION=0 //Request data using the GET method //wait for response AT+HTTPTERM //stop HTTP

As a result, if there is a connection, we will receive a response from the server. That is, in fact, we already know how to send coordinate data if the server receives it via GET.

Nutrition

Since powering the GSM module from an Arduino converter, as I found out, is a bad idea, it was decided to buy a 12v->5v, 3A converter on the same ebay. However, the module does not like 5V power supply. Let's go for a hack: connect 5V to the pin from which 5V comes from the Arduino. Then the built-in converter of the module (much more powerful than the Arduino converter, MIC 29302WU) will make from 5V what the module needs.

Server

The server wrote a primitive one - storing coordinates and drawing on Yandex.maps. In the future, it is possible to add various features, including support for many users, “armed/unarmed” status, the state of the vehicle systems (ignition, headlights, etc.), and possibly even control of the vehicle systems. Of course, with appropriate support for the tracker, which smoothly turns into a full-fledged alarm system.

Field tests

This is what the assembled device looks like, without the case:


After installing the power converter and placing it in the case from a dead DSL modem, the system looks like this:

I soldered the wires and removed several contacts from the Arduino blocks. They look like this:

I connected 12V in the car, drove around Moscow, and got the track:


The track turns out to be torn. The reason is that sending data via GPRS takes a relatively long time, and during this time the coordinates are not read. This is clearly a programming error. It is treated, firstly, by immediately sending a packet of coordinates over time, and secondly, by asynchronously working with the GPRS module.

Personal GPS transmitters

Today, progress is proceeding at such a pace that devices that were previously bulky, expensive and highly specialized are quickly losing size, weight and price, but gaining many new functions.

This is how devices based on GPS technology reached pocket gadgets and firmly settled there, giving people new opportunities. It is especially worth highlighting individual GPS transmitters.

Essentially, these are the same GPS trackers, only designed for use not on a vehicle, but by a person in everyday life.

Depending on the model, several different devices can be combined in one housing. In its simplest form, it is simply a small box without a display, which allows you to control the movements of children, animals or some other objects, on which it is fixed.

Inside it is a GPS module that determines coordinates on the ground, a GSM/GPRS module that transmits information and receives control commands, as well as a power source that ensures autonomous operation for a long time.

Functionality of GPS transmitters

As the functionality increases, the following capabilities of the device appear:


Options for GPS transmitters

Depending on the configuration, transmitter housings may differ significantly. Various models are available in the form of cell phones, classic navigators, or even wristwatches.

The colorful design of special versions and useful additions allow children to treat these devices not as “parental spies”, but as fashionable and practical gadgets.

As an advantage, it is worth mentioning the fact that many versions of the device work well without subscription fees for the services of specialized operators, and all the necessary information is sent to the client directly via the Internet or SMS messages, which allows significant savings on the maintenance of such equipment.

Articles about GPS trackers

In this article I will show how to use a gsm module with arduino using the sim800L as an example. The same instructions are quite suitable for using any other gsm modules, for example, sim900, etc., because all modules work in approximately the same way - this is the exchange of AT commands through the port.

I will show the use of the module with arduino using the example of an SMS relay, which can be used to control the device remotely via SMS commands. This can be used in conjunction with car alarms, etc.

The module is connected to Arduino via the UART interface of a software serial port operating on 2 and 3 digital pins of Arduino nano.

Working Arduino with GSM modules

To power the module, a voltage in the range from 3.6V to 4.2V is required, this means that you will have to use an additional voltage stabilizer, since the Arduino has a 3.3 volt stabilizer installed, which is not suitable for powering the module, the second reason to install an additional stabilizer is that the GSM module is serious load, since it has a weak transmitter that provides stable communication with the cellular station. Power for the Arduino nano is supplied to the VIN pin - this is a stabilizer built into the Arduino that ensures the module operates over a wide voltage range (6-10V). The relay module is connected according to the given program text to pin 10 of the Arduino nano and can easily be changed to any other that works as a digital output.

It works like this: we install a SIM card in the GSM module, turn on the power and send an SMS with the text “1” to the SIM card number in order to turn on our relay, to turn it off we send an SMS with the text “0”.

#include
SoftwareSerial gprsSerial(2, 3); // set pins 2 and 3 for software port
int LedPin = 10; // for relay

void setup()
{
gprsSerial.begin(4800);
pinMode(LedPin, OUTPUT);

// setting up message reception

gprsSerial.print("AT+CMGF=1\r");
gprsSerial.print("AT+IFC=1, 1\r");
delay(500);
gprsSerial.print("AT+CPBS=\"SM\"\r");
delay(500); // delay for command processing
gprsSerial.print("AT+CNMI=1,2,2,1,0\r");
delay(700);
}

String currStr = "";
// if this line is a message, then the variable will take the value True
boolean isStringMessage = false;

void loop()
{
if (!gprsSerial.available())
return;

char currSymb = gprsSerial.read();
if ('\r' == currSymb) (
if (isStringMessage) (
// if the current line is a message, then...
if (!currStr.compareTo("1")) (
digitalWrite(LedPin, HIGH);
) else if (!currStr.compareTo("0")) (
digitalWrite(LedPin, LOW);
}
isStringMessage = false;
) else (
if (currStr.startsWith("+CMT")) (
// if the current line begins with “+CMT”, then the next message
isStringMessage = true;
}
}
currStr = "";
) else if (‘\n’ != currSymb) (
currStr += String(currSymb);
}
}

Video version of the article:

Tags: #Arduino, #SIM800L

Your mark:

Products used in this article:

← GPS logger on arduino | Relay control via COM port →

GSM scanner on RTL-SDR

| home| English | Development | FAQ |

Main characteristics of the scanner

The GSM scanner scans downstream GSM channels and displays information about the signal level and whether the channel belongs to one of the three main cellular operators MTS, Beeline and Megafon. Based on the results of its work, the scanner allows you to save a list of MCC, MNC, LAC and CI base station identifiers for all scanned channels.
A GSM scanner can be used to assess the level of a GSM signal, compare the signal quality of different operators, assess radio coverage, when deciding on installing cellular signal amplifiers and adjusting their parameters, for educational purposes, etc.
The scanner runs under Windows and uses a simple and cheap receiver - RTL-SDR. You can read about RTL-SDR at:
RTL-SDR (RTL2832U) and software defined radio news and projects,
RTL-SDR – OsmoSDR,
RTL-SDR in Russian.
The RTL-SDR parameters determine the main characteristics of the scanner. Of course, a GSM scanner is not a replacement for normal measuring equipment.
The scanner is distributed free of charge, without any restrictions on use.
The current version supports the GSM 900 band and does not support GSM 1800. This is determined by the fact that the operating frequency of the RTL-SDR with the R820T tuner is limited to 1760 MHz. There is hope that the use of the experimental RTL-SDR driver will allow operation in at least part of the 1800 MHz range.

Launching the scanner

The latest version of the scanner can be downloaded from this link. Simply unzip the file to a convenient location and run gsmscan.exe.
Previous versions of the scanner, a link to the repository with sources and other information related to the development are located on the development page.
For the scanner to operate, the installation of RTL-SDR drivers is required; if they have not already been installed, this can be conveniently done using the Zadig program to describe the installation procedure.

Using the Scanner

Below is a view of the scanner program window:

The horizontal axis displays the GSM channel number in the form of ARFCN or in MHz, and the vertical axis shows the signal level in dBm. The height of the line shows the signal strength.

GSM module NEOWAY M590 communication with Arduino

If the BS identifiers have been decoded successfully and they correspond to the identifiers of the three major telecom operators, the lines are painted in the corresponding colors.
The drop-down lists at the top of the screen allow you to select the SDR receiver, if several are connected, the operating range GSM 900 or GSM 1800 and the units of measurement along the horizontal axis ARFCN or MHz.
The buttons allow you to save a report on the scanner’s operation in the form of a list of decoded base stations, clear the results of BS decoding and obtain information about the program.

Principles and features of work.

During operation, the program scans the operating frequency range with a step of 2.0 MHz (10 GSM channels) and digitizes the signal with a sampling frequency of 2.4 MHz. The scanning process consists of a fast pass through the entire range to measure signal strength and a slow pass to decode the BS identifiers.

One decoding step is performed after traversing the entire range to measure power. Thus, in the GSM 900 range, the signal level is updated approximately once every 2 s, and a complete decoding pass takes about 1 minute.
Due to the poor quality of the signal received from RTL-SDR, the probability of correctly decoding system information (SI) of the BS broadcast control channel (BCCH) is not high. Signal level fluctuations as a result of multipath propagation also reduce the likelihood of decoding system information. For these reasons, to obtain BS identifiers, it is necessary for the scanner to accumulate information over a period of about 10 minutes. But even in this case, not all channels provide sufficient signal level and quality in a given location for decoding even by the most ideal receiver. In addition, not all GSM channels are used to work according to the GSM standard, as can be seen in the figure above, channels 975 - 1000 are occupied by Megafon to work according to the UMTS standard.
During operation, the scanner adds system information about new decoded channels to the general array of information on channels. But information about previously decoded channels is not erased when system information is not decoded at this step, and remains in the array. To clear this information, use the button to clear the BS decoding results.
When you click on the save report button, the accumulated results are saved into a text file with a name made up of the name of the program, the date and time the data was saved. Below is an example of part of the report file:
The scanner is designed to work under Windows 7, 8.1 and 10. The work was tested with three copies of the RTL-SDR with the R820T tuner; other types of tuners were not tested.
A special version of the program has been compiled to work under Windows XP; it runs several times slower than the standard version.

Development.

The scanner program is supplied as is, without any warranties or liability. If you have reasonable ideas on how to expand the functionality or improve the performance of the scanner, we are ready to discuss the possibility of their implementation.
You can take part in the development of the scanner; to do this, visit the development page.
Further development of the GSM scanner is planned, possibly with your participation.