5

I am looking for a way to listen for received text messages on multiple numbers. When I came across the Arduino and its shields, I thought to myself this might be the perfect way to do just that.

One of the modules / shields I found on the internet by watching a youtube video is the TC 35 GSM.

I have been reading multiple questions here regarding the "stacking" of shields, and the usual reply is "check what pins / if they are using the same pins". Though these questions were not GSM module specific, and did not include stacking the same shields.

So I am very curious if this is possible. Let's say I want to listen to 10 SIM cards at once for received messages, will this be possible by stacking the modules on one Arduino?

Thanks!

3 Answers 3

2

The short answer is, no, you can't just stack them, but yes, it is possible (though not trivial) to connect ten or more of these to a single Arduino board and have it monitor all of them.

Note that the following explanation is simplified, possibly over-simplified, in the interests of brevity and giving you a general idea of what you're in for if you try this. Many of the details (as I mention below) could easily be one or several questions of their own.

You didn't give the datasheet for the board you're considering, so I'll work from the description of a similar board (though not an Arduino shield) using the same chip, the Cytron Technologies TC35 GSM Development Board.

Arduino shields connect various pins of their chips to pins on the Arduino board. In many (perhaps most) cases you can't have two different devices connected to the same Arduino pin, so if you were just going to plop another board on it would have to have special support for changing the pins it's using (often via jumpers) or being able to have several boards communicating on the same pins. The GSM chip you're considering uses two dedicated pins for serial communication transmit and receive; these are the pins you'll need to rewire if you're going to use multiple boards on a single Arduino.

What kind of rewiring you'll need to do depends on how many you really want. The Arduino Uno has 14 digital I/O pins, two of which are usually used for the USB serial interface to the computer, giving you six devices if you dedicate a pair of pins to each device. Since the communication rate with the boards is quite slow (9600 bps, see below) you could multiplex many of these on one pair of Arduino pins via a number of different techniques (such as using shift registers); this alone is complex enough that a different question could be devoted just to considering the possible choices, with further questions on the details of implementing each choice. You should consider, if you're interfacing with a PC, using multiple Arduino microcontrollers each with only one or a few GSM chips talking to them, talking to a PC via USB, and doing further processing on the PC.

If you're using a lot of boards you'll need to make sure you can supply enough power to them; you may need to use a power source outside the Arduino board itself. An Arduino powered from its USB interface can pull no more than 500 milliamps (because that's the USB limit). If you're using a separate power supply and the Arduino's on-board regulator, the limitation will be based on the electrical and thermal limitations of that regulator; this blog post is one detailed discussion of that.

There's also the issue of level shifting; Arduino boards usually do digital I/O at 5 volts or 3.3 V; this chip looks like it talks at 2.65 V and you or the board you're using will need to handle that. If the board you're using doesn't do appropriate level conversion there are other questions (such as this) that discuss the details of particular level-conversion solutions.

Once you have pins connected to the devices you'll need to talk to them; this involves the lower level "framing" parts of the serial protocol and the higher-level command set.

For framing the GSM chip appears to use the low-speed serial protocol framing that's standard in the computer world; aside from the voltage level difference it's the same as used in RS-232 communications between a computer and a modem or other "serial" device. The setting from the data sheet I used is "9600bps, 8-1-N, No Flow Control" which is slow enough that the microcontroller itself can easily communicate with quite a number of these without any extra hardware using bit banging. A 16 MHz Arduino executes something approaching 16 million instructions per second (most instructions are one clock cycle), giving you over 1500 instructions per bit-time to read a bit from every attached device, do the processing to turn the bits into bytes, and process the resulting messages. If you're careful with your programming, and depending on what you're doing, it shouldn't be too hard to deal with even up to a couple of dozen GSM chips, though this is almost certainly not a trivial programming job that you're going to do with standard Arduino libraries.

The higher level command set is also pretty much the same as old-fashioned computer-modem comunication; the GSM chip (and thus pretty much any board that uses it) talks standard PC-style serial protocol at 9600 bps using the AT command set. You'll see messages such as

+CMGR: "REC READ","+60125651453",,"12/07/31,10:0702+32"
Hello

when you receive an SMS and similar ones when you send an SMS.

2

The data sheet for the Siemens TC35 says "The data interface is implemented as a serial asynchronous transmitter and receiver conforming to ITU-T RS-232 Interchange Circuits DCE. It operates at CMOS level (2.65V). All RS-232 signals on the ZIF connector are low active."

this is actually a low-voltage equivalent of "RS232" serial. Real RS232 uses -12V and +12V signalling for binary 0 and 1 but most modern devices work with logic levels, often inverted (e.g. 0V and ~3.3V).

Most Arduinos support in hardware only a single logic-level serial interface. A few Arduinos, like the Arduino Mega, will support up to four logic-level RS232 interfaces.

Using a software library, you can emulate a serial port over the digital IO pins but the Arduino will quickly run out of processing power if you try to emulate several RS232 interfaces.

will this be possible by stacking the modules on one arduino?

Almost certainly not. I doubt the daughterboard ("shield") designers made provision for that. At the least you'd have to re-route the serial interface to nonstandard pins and check that the power requirements don't exceed what the Arduino can supply.

If you can find a module that communicates over I2C or SPI there might be a better chance of getting it to work.

1
  • 1
    I think this should read TTL logic, not low-voltage RS232. See RS-232 vs. TTL Serial Communication. Low-voltage RS232 implies that a low voltage is still a 1 and a high voltage is still a 0, however TTL actually inverts the logic, it isn't just the same logic at a lower voltage.
    – Nick Gammon
    Commented Aug 29, 2015 at 2:46
0

Not directly stacking, no. You could do a dirty trick where you bend the serial pins out sideways, letting the stack handle all the power and ground and wakeup pins and stuff. Then handle the serial communications with each module separately.

The Uno and similar only have a single UART (serial port) each, but you can emulate more with "software serial", aka "bit-bang" techniques. These are full of caveats and I wouldn't wish them on a newbie.

The Mega2560 has four UARTs, so you're getting closer. You'd need to use wires coming off those sideways-bent pins to bring the signals down to the different tx/rx pins per UART, but I could see it working.

You can also add UARTs over SPI/I2C, but that's getting into a good bit of program complexity. Look at the SC16IS750 or the MAX3100 for starters.

(There's also a horrible, horrible hack emerging in my mind: Connect a single transmit line to a demux chip, so you can pick a single TC35 to talk to at any given moment. Bus all the receive lines together with resistors/diodes. Hope you never end up in a situation where two are talking at once.)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.