Code covered by the BSD License  

Highlights from
RC Receive Driver Block for Arduino

4.3 | 4 ratings Rate this file 98 Downloads (last 30 days) File Size: 2.23 MB File ID: #45541 Version: 15.2.01
image thumbnail

RC Receive Driver Block for Arduino


Sergio Biagioni (view profile)


13 Feb 2014 (Updated )

Control an Arduino robot using an RC Transmitter and Receiver with Simulink

| Watch this File

File Information

With this block, a user can use Simulink to generate code for an Arduino which receives signals from an RC Transmitter.
When the output of an RC Receiver is connected to an Arduino, this custom driver block outputs the length of the RC signal's pulse in microseconds, which corresponds directly to the signal's value.
This material is meant to support the MakerZone article "How to use an RC Controller with Arduino and Simulink".

For examples and documentation showing how to use block, see the "Supplemental Software" section of the main doc page. There will be link to the "Arduino RC Receive Toolbox".

Legacy Code:
To access the old version, type the following command after installation:

This driver block was tested with the Cirrus-DPR-4FM Transmitter and Receiver. All Receivers output servo protocol so the block will work with all RC Transmitter/Receivers.
The block works with the Arduino Uno, Mega 2560, and Due. The maximum channels supported is 6.


Device Drivers inspired this file.

Required Products Simulink
MATLAB release MATLAB 8.6 (R2015b)
MATLAB Search Path
Other requirements The Arduino Support Package must be installed which can be found by typing >> supportPackageInstaller at the MATLAB Command Window. R2015a and above required. If using R2014b, send me a personal message and I will send it to you directly.
Tags for This File   Please login to tag files.

No tags are associated with this file.

Please login to add a comment or rating.
Comments and Ratings (12)
06 Oct 2015 Thomas Wegele

Hi Sergio,
I´m using an Atmega328. I tried now the atmega2560 as used in the example and that one works fine.
Do you have another idea why it shouldn't work with an arduino nano?
By the way in the future i'm looking into the arduino micro due to four possible interrupt pins.
Is the block working with the micro as well?
Thanks a lot

just in case the reply might be longer .-)

Comment only
11 Sep 2015 Sergio Biagioni

Sergio Biagioni (view profile)

Hi Thomas,
Does your Arduino Nano have an ATmega168 or ATmega328 processor?


Comment only
05 Sep 2015 Thomas Wegele

Hi Sergio,

i was just wondering whether the block works with an arduino nano as well;
All my test on the INT-Channel Pin3 and the PWM Pin6 didn't work fine.
Maybe you have a small advice to look at.


Comment only
12 Mar 2015 Sergio Biagioni

Sergio Biagioni (view profile)

Hi Sean,
Great to hear. Since you are using the Arduino Uno, you should specify only two pins in the block, 2 and 3.


Comment only
12 Mar 2015 sean cleary

Hey Sergio,

Thanks for your help previously, all working fine now.

Just wondering, I'm going to use an arduino uno with this block which only has 2 pins available compared to the 4 for the arduino mega. If I use just 2 pins, do I need to modify the code at all? should i just input 2 pins or input 4 pins(where the last 2 are random)


07 Mar 2015 sean cleary

Thanks very much for that Sergio

Comment only
06 Mar 2015 Sergio Biagioni

Sergio Biagioni (view profile)

Hi Sean,
Windows SDK 7.1 should work for Windows XP Service Pack 3. If you can't get it to work, any other MathWorks Supported Compiler will work.

You can find the list of supported compilers for R2014b here:

The list of supported compilers depends on the version of MATLAB you are using, your OS (32 or 64-bit windows), and whether you are using it for MATLAB or Simulink. In this case, you are using it for Simulink.

Let me know if you can't find a suitable compiler for your configuration and we will find a solution.


Comment only
06 Mar 2015 sean cleary

Hi Sergio,

Thanks very much for this.

Though I am stuck on windows XP at the moment and am having trouble getting Window SDK for it for use with the rc reciever block. Any advice*?


29 Oct 2014 Sergio Biagioni

Sergio Biagioni (view profile)

Hi Andrea,
You could just copy everything I did with channels 0-4 and expand necessary arrays. I would do it for you but I don't have a 6 channel tx/rx on hand at the moment to test. The specific steps are as follows;

1. Open RC Receive Driver Block
2. Change Data Properties->Output ports "Rows" to 6
3. In Libraries, change definition for rcc to:
volatile rcChannel rcc[6] = {{0,1,0,0}, {0,2,0,0}, {0,3,0,0}, {0,4,0,0}, {0,5,0,0}, {0,6,0,0}};
4. In Libraries, add void calc4 and calc5 interrupt service routines, just as calc0-4 were defined
5. In Outputs, change duration vector to the following:
static uint16_t duration[6] = {0,0,0,0,0,0};
6. In Outputs, add updateflag "if statements" for channels 4 and 5
7. In Outputs, add out[4] = duration[4] and out[5] = duration[5]
8. In Discrete Update, add attach interrupts for calc4 and calc5
9. Build the S-Function builder block
10. Run modify('sfcn_rcreceive')

Comment only
29 Oct 2014 Andrea

Andrea (view profile)

Great work Sergio! At now I'm working with four channels, how can I upgrade your block to six channels?



27 May 2014 Sergio Biagioni

Sergio Biagioni (view profile)

The test model was built in R2013b. If you're using a previous version of MATLAB (i.e. R2013a), you could receive an error if you try to run the model in external mode.

Error Message Example:
Error occurred while executing External Mode MEX-file 'ext_comm':
Expected 1xN string array for host name

To resolve this, create a new model and copy the RC Receive block into it.


Comment only
19 May 2014 Akeel

Akeel (view profile)

05 Mar 2014 1.1

Removed mex files, updated required products.

07 Mar 2014 1.2

adjusted copyright

13 Mar 2014 1.3

Updated required toolboxes, only MATLAB and Simulink necessary.

13 Aug 2014 1.4

Added support for Arduino Due

20 Aug 2015 15.1.01

- Upgraded block to use MATLAB System Object instead of S-Function Builder to make installation quicker
- Block expanded from 4 to 6 channels
- Added status outport from block to indicate when data is received on a channel

05 Oct 2015 15.2.01

Added support for R2015b

Contact us