Code covered by the BSD License  

Highlights from
Embedded Coder Target for Arduino


4.5 | 13 ratings Rate this file 253 Downloads (last 30 days) File Size: 916 KB File ID: #30277
image thumbnail

Embedded Coder Target for Arduino



03 Feb 2011 (Updated )

Custom target for Arduno and other processors

Editor's Notes:

This file was selected as MATLAB Central Pick of the Week

| Watch this File

File Information

This file exchange submission is an Embedded Coder custom target for Arduino. It uses the Arduino platform as the example hardware, yet the examples it shows can be used to learn and then be applied on any custom target. In an applied way - it shows capabilities and steps that leverage many features of Embedded Coder and creating custom targets. Arduino has been selected since it is widely accessible, has a large DIY community, and is a great platform to explore the varying things that a custom target would need as the various Arduino platforms change.
A custom target author can use this submission to extend/create more Arduino targets, or to simply use this as an example to create your own. An end user that has Embedded Coder can use this submission for their Arduinos.

Some highlights included in this custom target include:
- Shows how to handle dependencies for different Arduino boards (and even non-Arduino boards). Current set includes Uno, Leonardo, Mega2560.
- Options available to drive to minimal footprint and memory
- Processor in the Loop (PIL)
- Numerous scheduling and timing modes explored.
- Overrun detection exposed in the Simulink algorithm directly to allow for algorithmic adjustments when overrun is detected during execution.
- A wealth of examples on how to add/change peripherals blocks/capabilities (LCD, Servo Motor, UART, printf into UART, DIO, Ultrasonic sensor, Async interrupt, I²C Master, I²C Slave, etc, etc).

Additional resources for creating custom targets
- Embedded Coder Product Documentation (account/license required)
- Embedded Coder for Production Code Generation Training Course
- Developing Embedded Targets Advisory Service
- MATLAB Answers: example of developing a custom target


Device Drivers inspired this file.

This file inspired Embedded Coder Arduino Servo Write Block.

Required Products Simulink Coder
Embedded Coder
MATLAB release MATLAB 8.2 (R2013b)
Other requirements - Windows 32/64 only
Tags for This File   Please login to tag files.
Please login to add a comment or rating.
Comments and Ratings (64)
30 Jun 2014 Tomas

When you have message like "... does not exist", it looks that directory "blocks" is not on the MATLAB path. It should be, because it is done in function "setup_customtarget_arduino.m" on first functional line and next this path is saved:
addpath(fullfile(pwd,'arduino_ec'), fullfile(pwd,'blocks'))
result = savepath;
Try to run "setup_customtarget_arduino.m" again.

19 Jun 2014 Kirill

I have some trouble when I try to run simulate/build/flash any model from example (Error in S-function 'myarduino_blink/Digital Output': S-Function 'sfunar_digitalOutput' does not exist). But installation was successful (all path saved in matlab (2014/64). What do I do wrong?

26 May 2014 Tomas

This is strictly AVR-based Arduino with IDE version 1.0.5. This cannot be working with Due because of different MCU, different compiler and mainly, different internal structure of IDE 1.5.x.
If there will be more interest, we can consider port for Arduino Due.

25 May 2014 Thomas

I am trying to use the package with my arduino Due.
In the comments I read, the Arduino 1.5.x is not supported. So I installed 1.0.5 and set the path in the setup file correctly. When I try to build the demo "myarduino_blink.slx" I get the following error:

ompiling: C:/Users/thomas/Desktop/arduino_ec_target/blocks/io_wrappers.cpp
Compiling: myarduino_blink.cpp
unknown MCU 'cortex-m3' specified
Known MCU names:
C:/Users/thomas/Desktop/arduino_ec_target/blocks/io_wrappers.cpp:1: error: MCU 'cortex-m3' supported for assembler only
In file included from c:/arduino/hardware/tools/avr/lib/gcc/../../avr/include/avr/pgmspace.h:82,
from C:/Arduino/hardware/arduino/cores/arduino/Arduino.h:8,
from C:/Users/thomas/Desktop/arduino_ec_target/blocks/io_wrappers.cpp:10:
c:/arduino/hardware/tools/avr/lib/gcc/../../avr/include/avr/io.h:330:6: warning: #warning "device type not defined"
In file included from C:/Users/thomas/Desktop/arduino_ec_target/blocks/io_wrappers.cpp:10:
C:/Arduino/hardware/arduino/cores/arduino/Arduino.h:213:26: error: pins_arduino.h: No such file or directory

Did anybody use this package with the Arduino Due? Please help me on that.

07 May 2014 salah tajori  
07 May 2014 salah tajori

it's good

02 May 2014 Tomas

I have never seen before this message. In principal, last task of the makefile (arduino_ec.tmf) is line 248 with this content:
@echo ### Created $(PRODUCT) successfully (or it was already up to date)

The first part of that message is like sign that makefile process went smoothly to the end. There can be stdout flushing problem, e.g. the last part of the text is still in buffer.
Please try following steps:
1. Go to directory with generated code, e.g. it can be like “mymodel_arduino”.
2. Open here DOS command window.
3. Run BAT file like “mymodel.bat” – the name depends on name of the model; there is only one BAT-file. Path to this file cannot be used, DOS window needs to be opened in folder where is the BAT file located.
4. This file was generated and was invoked by Embedded Coder to build the project
5. Observe, if you will see on the last line the messages like “### Created mymodel successfully ...”
6. If you can see that, Simulink is not receiving this part of the message
7. If you not see that, there is issue in template makefile “arduino_ec.tmf”

Anyway, it looks like the HEX file was created, only this message has not arrived to Simulink.

25 Apr 2014 Moataz

Please help on this issue.
### Unable to find build success string.'***Created* in build log.
Can you please help on this

24 Apr 2014 Moataz

Thank you for your reply. I was successful to flash the arduino uno with the myarduino_hc04_test model. However, when I try to build it I get the error message
### Unable to find build success string.'***Created* in build log.
Can you please help on this

24 Apr 2014 Tomas

In my case original model is working, newly created model employing SR04 block from library is working. Problem can appear when original library was manipulated (library itself, S-Function or TLC file). If you want to investigate, look for the file "sfunar_hcsr04.tlc". There is line like:
%assign errTxt = "Unsupported function parameter: %<mode>"
From here you have your error message. You wrote that the message is "untitled_ConstP.HCSR04_p4". This is really strange, because this values is coming from the S-Function as numeric parameter and expected value is between 1 to 3, coming originally from the dialog.
Please check your installation and recompile all S-Functions again.

24 Apr 2014 Moataz

I also want to not that in order to flash my own model to the arduino board, I had to copy and paste the model in the myarduino_hc04_test model and flash it. If I copy the SR04 block into my model, it does not work.

23 Apr 2014 Tomas

The message "Unsupported function parameter" means that Measuring Mode (Raw / Centimeter / Inch) is out of these three values. Please try original model file “myarduino_blink_sr04”.

23 Apr 2014 Moataz

When I try to use the HCSR04 block to download on arduino uno board I get the following error
Error: Simulink Coder Error in block: "untitled/HC-SR04", block type "S-Function": Unsupported function parameter: untitled_ConstP.HCSR04_p4

I'm using 2013b. Please help

16 Apr 2014 Tomas

To Marta: Arduino Version 1.5.x is not supported, you have to use 1.0.5. The reason is that 1.5.x uses different folder structure and header files are on different paths.

16 Apr 2014 Tomas

Most of the new blocks are requiring to use C++ code generation. Please check under "Code Generation" -> "Language" -> "C++".

14 Apr 2014 EDUARDO

I recently downloaded the files and i am trying to use some of the examples included, but on many i get this type of error when trying to deploy on an Arduino Uno board.

Error: Simulink Coder Error in block: "myarduino_LCD_LED/LCD Shield", block type "S-Function": Formated LCD output block requires C++

I am currently using the newest version of MATLAB 2014a.

11 Apr 2014 Marta

I downloaded and did setup for Arduino Mega 2650. I run through README.pdf file. When I tried to run myarduino_blink.slx I got error message when doing build stage.
Please advise.
Below is the error message.


Compiling: myarduino_blink.cpp
Compiling: ert_main.cpp
In file included from myarduino_blink_data.cpp:16:
myarduino_blink.h:21:21: error: Arduino.h: No such file or directory
gmake: *** [myarduino_blink_data.o] Error 1
gmake: *** Waiting for unfinished jobs....


gmake: *** [io_wrappers.o] Error 1
In file included from myarduino_blink.cpp:16:
myarduino_blink.h:21:21: error: Arduino.h: No such file or directory
myarduino_blink.cpp: In function 'void myarduino_blink_step()':
myarduino_blink.cpp:58: error: 'digitalWrite' was not declared in this scope
myarduino_blink.cpp: In function 'void myarduino_blink_initialize()':
myarduino_blink.cpp:87: error: 'OUTPUT' was not declared in this scope
myarduino_blink.cpp:87: error: 'pinMode' was not declared in this scope
gmake: *** [myarduino_blink.o] Error 1
In file included from ert_main.cpp:16:
myarduino_blink.h:21:21: error: Arduino.h: No such file or directory
ert_main.cpp:20: error: 'uint8_t' does not name a type
ert_main.cpp:21: error: 'uint8_t' does not name a type
ert_main.cpp: In function 'int main()':
ert_main.cpp:34: error: 'init' was not declared in this scope
ert_main.cpp:38: error: 'micros' was not declared in this scope
ert_main.cpp:48: error: 'uOverrunCounter' was not declared in this scope
gmake: *** [ert_main.o] Error 1
### Build procedure for model: 'myarduino_blink' aborted due to an error.

24 Oct 2013 Arut

The arduino comunity is growing, so it will be nice to exitend the support also to the OSX platform

10 Oct 2013 Tobias


I'm trying to run these Embedded Coder Plugin on Matlab2011b with Linux Debian 64bit and Arduino 1.0.5.
I followed the instructions given here in the command section and on the linked websites. But when I'm trying to build the "demo_arudino_blink" model Simulink gives the error:
"makeCmd must default to PC Make command".

In the Matlab Command window I could read:

### Writing header file rtwtypes.h
### Writing source file demo_arduino_blink.c
### Writing header file demo_arduino_blink_private.h
### Writing source file demo_arduino_blink_data.c
### Writing source file ert_main.c
### TLC code generation complete.
### Creating project marker file: rtw_proj.tmw
### Processing Template Makefile: /home/testuser/.Programs/Matlab/simulink_support_package_arduino/arduino/arduino.tmf
### Build procedure for model: 'demo_arduino_blink' aborted due to an error.

so I think the error is caused from an wrong arduino.tmf file. I think the coder is trying to compare the pcMakeCmd with the Arduino makeCmd, but where is the arduino makeCmd located in Linux?

I would appreciate if anyone could help me getting these thing to work.


26 Sep 2013 fox tan

@Dan Liuch- thanks for your advice I made a interrupt block after I check out .

17 Sep 2013 Dan Lluch

@fox tan - check out this submission (and contributors taht made other peripherals with it) that may help:

14 Sep 2013 fox tan

this is a good package!
but where can get arduino interrrupt block? or who can tell me how to create this block? thanks for you help!

12 Mar 2013 Nathan Crosty

I've gone ahead and created a tutorial for integrating the new Arduino 1.0.3 libraries in with this support package. There are some directions in this post that I have borrowed from to compose it, but I thought it would be useful to keep everything in once place.

10 Mar 2013 klob


I have a problem using the arduino target.
I am trying to send data via serial communication from a model running on arduino to a model running in my computer.

The problem is that I get wrong values when the data I am about to send are negative (i.e. the transmission is fine when I am sending values 0 or greater but wrong when they are below zero (instead of -4 I receive 252 etc)).
I also tried to send negative values through the example that you have (demo_arduino_serial_communication and demo_arduino_serial_communication_host), by changing the Analog input block with a constant block and once again it works fine when using values zero or greater but I am getting the following error message when I am trying to send negative values through the serial communication.
"Parameter overflow occurred for 'Value'. The parameter's value is outside the range that the run-time data type can represent. The specified value was saturated to the closest representable value. You can control this diagnostic on the Diagnostics pane of the Configuration Parameters dialog."

I thought to try and change something on the Diagnostics pane, but I thought that it would be wiser to ask someone more experienced first.

What do you think?

I have an arduino UNO and MATLAB R2011b.

Thanks in advance,
a desperate student

06 Mar 2013 Fabien

This also works with (at least) Arduino 1.01 on Mac OS Mountain Lion with the fixes by Stefan Disch and at least:

-Set the comport to whatever is stated in Arduino, usually /dev/tty..., the find comport does not work
-Adapt /arduino/+arduino/runAvrDude.m by removing whatever is in between "-P" and "%s" on line 23
-You will get a check for Arduino.exe, which does not exist. Remove it and set the path with arduino.Prefs.setArduinoPath('/Applications/')
-Go to the Arduino folder and copy Arduino.h, name it WProgram.h. (whoever decided this was a good idea..)

Good luck.

01 Oct 2012 Gautam Vallabha

Aditya, the C code for S-functions and corresponding TLC files are in the "blocks" directory. For more info on creating custom blocks: see

01 Oct 2012 Aditya

Is there a tutorial on how to create custom simulink blocks that encode standard arduino libraries, such as the lcd display library? I think you have to create your own s-functions. Also can you expose the s-functions that are behind the included arduino block library - that way other people can build and create new blocks.

02 Jul 2012 Jedediah Frey

This is very trivial to get working on OS X and Linux too.

@Andrey Zagvazdin: The parsing of boards.txt is horrible. I have a new one that I would like to post however the licensing forbids it. I will work on making a patch file.

21 Jun 2012 Mohammad

Has anyone ever try to use the arduino target package on chipkit max32 microcontroller? Or know whether it will support this package?

19 Apr 2012 Gautam Vallabha

@ceverus33 question answered at

15 Apr 2012 cerverus33

What's the diference with the file "Simulink Support Package for Arduino Uno Hardware"? I'm a little confuse about it

30 Mar 2012 MathWorks Classroom Resources Team

General guidelines:
* Please use this FileExchange page to post general comments and ratings on the support package

* If you have questions about using this support package, post your question at (with tag "arduino", and product "Embedded Coder")

30 Mar 2012 Gautam Vallabha

Gerald, it has been tested with R2010b. There are no guarantees whether it will or will not work with R2009a.

If you are working with Mega, take a look at the support in R2012a (it only requires Simulink):

28 Mar 2012 Gerald

I just need to know if this support package also works with Matlab R2009a?

I want to do small models in Simulink and flash it to the Arduino Mega 2560 Board. I can just use R2009a!

28 Mar 2012 Andrey Zagvazdin

Hello! I MatLAB 7.12 (R2011a) 64-bit. OS Windows 7
Fee clone Arduino, Russian assembly Freeduino (, a complete analog Ardruino Uno / Duemilanove w/ATmega328.
My actions:
1 - Connection "Arduino" to MatLAB
* Set ArduinoIO (;
* Unpack the package into C: \ arduinoIO;
* >> Cd c: \ arduinoIO
* >> Install_arduino
* >> Savepath
* Flashed "Arduino" core srv.pde (;
* >> A = arduino ('COM4');
At this point, everything is OK! From the window MatLAB, board responds and takes command.

2 - Connection "Arduino" to SIMULINK
* Downloading the package Simulink Support Package for Arduino (;
* "Simulink Support Package for Arduino" unpacked to C: \ arduino_simulink
* Downloading Wednesday Arduino IDE (arduino-1.0) and extract it to c: \ ArduinoTarget
* >> Cd c: \ arduino_simulink
* >> Addpath (fullfile (pwd, 'arduino'), fullfile (pwd, 'blocks'), fullfile (pwd, 'demos'))
* >> Savepath
* >> Sl_refresh_customizations
* Plug-in board "Arduino" to your computer.
* Indicates the path to the environment Arduino IDE >> arduino.Prefs.setArduinoPath ('c: \ ArduinoTarget')

That's all up to this point NORMALLY PUT.

* Determine the current platform team
>> Arduino.Prefs.setBoard ('atmega328') or >> arduino.Prefs.setMcu ('atmega328')
Throws an error
>> Arduino.Prefs.setBoard ('atmega328')
?? Reference to non-existent element of a cell
Error in ==> Prefs> Prefs.parseBoardsFile at 227
lhs = parsedLines {i} {1} {1}%
can be of the form xx.yy.zz
Error in ==> Prefs> Prefs.setBoard at 66
boards =
arduino.Prefs.parseBoardsFile (boardsFile);
>> Arduino.Prefs.setMcu ('atmega328')
?? Error using ==> Prefs> Prefs.setMcu at 129
This function is deprecated. Use
arduino.Prefs.setBoard instead, e.g.
arduino.Prefs.setBoard ('uno')


16 Mar 2012 Mikhail

Thumbs up MathWorks for providing a more free license on this package (as of 14th March 2012 release), allowing to distribute and share the code!
It's a pity though that the contents itself had not been updated for a long time.

16 Mar 2012 Nils  
14 Mar 2012 Gary

Would like to change the AnalogOut PWM frequency, need to know if changing timer1 & timer2 is safe for integrity of simulink time base (assuming timer0 is used by simulink)?

29 Feb 2012 Mikhail

Here i added the Servo Write block, which works with motor shield:

You are welcome to incorporate this patch into official package.


27 Feb 2012 Nitin

Is it possible to access the I2C pins (SDA/SCL) via the blockset? If not, would appreciate a workaround!!

24 Feb 2012 Mikhail

It would be great to have motor shield support, just like in MATLAB support package for Arduino.

13 Feb 2012 Gary

Excellent package, works great on my Uno

In the block directory there is an LCDOutput 'S' function can this be made functional & if so how?

28 Jan 2012 Raja Rout

I did'nt find any option for accessing the others serial port.

26 Jan 2012 Raja Rout

very very thanks, keep up the good work. It works with 2011a successfully installed. Can we access the extra serial ports of Arduino using this toolbox??.....

19 Jan 2012 Mark

Can this be used to configure pins as interrupts?

09 Jan 2012 Nuri Temurlenk

Do you plan to support Chipkit Max32 kit?

03 Jan 2012 Stefan Disch

I also tried fix 2) (using Arduino 1.0).

With Arduino 1.0 there came some changes in naming and layout of the includes (see for details).

I made the following changes to the current version of the arduino target:

1. Edit boards.txt and delete lines 145 through 181 (as told in a previous post)
2. Substitute every occurence of "WProgram.h" with "Arduino.h".
3. Add an additonal include path in rtwmkcfg.m in order to find the "pins_arduino.h" header file (moved to the new variants dir).
4. Commented out line 33 in arduino_smain.tlc because __cxa_pure_virtual is now defined in the Arduino 1.0 libs (see new.h).

These changes allowed me to compile the blink demo without errors.

30 Dec 2011 Curtis

I tried this fix: 1) Use an older IDE (0023)

And everything worked.

30 Dec 2011 Curtis

I tried this fix (2) Edit boards.txt and delete lines 145 through 181 (inclusive).)

And got this error after.

demo_arduino_blink.h:23:22: error: WProgram.h: No such file or directory
gmake: *** [demo_arduino_blink_data.o] Error 1

22 Dec 2011 MathWorks Classroom Resources Team

There is a problem parsing hardware/arduino/boards.txt for the latest Arduino IDE (Arduino 1.0). For the time being, try one of the following workarounds:

1) Use an older IDE (0023 or 0022), or

2) Edit boards.txt and delete lines 145 through 181 (inclusive).

22 Dec 2011 Sean

I'm getting an error when trying to execute arduino.Prefs.setBoard:

??? Reference to non-existent element of a cell array.

Error in ==> Prefs>Prefs.parseBoardsFile at 227
lhs = parsedLines{i}{1}{1}; % can be of the form xx.yy.zz

Error in ==> Prefs>Prefs.setBoard at 66
boards = arduino.Prefs.parseBoardsFile(boardsFile);

Anyone know why this is?

19 Dec 2011 Stephen Williams

Just found the PWM block - it is labeled "Analog Output"

19 Dec 2011 Stephen Williams

Please add PWM block

09 Dec 2011 Stefan Disch

Has anyone used it with Arduino version 1.0 so far?

08 Dec 2011 Marcell  
30 Nov 2011 Frazer

Great, thank you for that.

30 Nov 2011 MathWorks Classroom Resources Team

The Nov 22, 2011 update is the same as the Nov 29 update (the earlier date is when the file was submitted to FileExchange, the later date is when it got approved and published).

29 Nov 2011 Frazer

Is there a direct link for the Nov 29, 2011 update? I can only find the Nov 22, 2011 update.

29 Nov 2011 MathWorks Classroom Resources Team

Note: the latest version of the support package (released Nov 29, 2011) should address the above issues with Uno.

28 Nov 2011 Frazer

Hey guys,

Has anyone had an issue with "multiple main errors, i.e.

main.o: In function `main':
main.cpp:(.text+0x0): multiple definition of `main'

I've followed all the instructions and I've not had any problems using eclipse to compile for my Arduino UNO.

Thanks Frazer

20 Nov 2011 Guillaume MARTIN

Thank you Stefan.

I did as you said (but I corrected the baudrate at 155200 in Prefs.m), and it ran.

Thank you very much,

18 Nov 2011 Stefan Disch

I needed two changes to get it working in my environment (Win 7, Matlab 2011b, Arduino-0023 Software, Arduino Uno):

- In Prefs.m I changed in the function searchForComPort the string of the device name to '\\Device\\USBSER000'
(Have a look in your registry at HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM to identify the correct string)

- In runAvrDude.m I removed the baudrate option from the avrdude call. (Before it was set to 57600 and it doesn't work)

Best regards

11 Nov 2011 Guillaume MARTIN

The baud rate is configured at 57600, but my baud rate is 115200. (So, the upload don't works)

Do you know how to configure the baud rate in :
c:/AARDUI~1/hardware/tools/avr/bin/avrdude -V -F -C c:/AARDUI~1/hardware/tools/avr/etc/avrdude.conf -p atmega328p -P //./COM4 -c stk500v1 -b 57600 -U flash:w:demo_arduino_blink.hex ?

Bests regads,

03 Nov 2011 Suleman Shafqat  
22 Nov 2011

Version 1.2.
* Simplified workflow to specify Arduino boards (no need to set MCU and upload rate)
* Support for Arduino Uno & newer boards
* Miscellaneous bug and usability fixes

14 Mar 2012

Updated title and description

20 Aug 2013

updated other requirements

28 Mar 2014

Version 2.0
* complete update to Arduino Embedded Coder target (that can be used to create even other custom targets)
* updated to support more I/O and Arduino platforms
* many examples included

28 May 2014

- removed Due reference - target doesn't support Due yet.
- added acknowledgement to Device Driver File Exchange submission - as a means to add more peripheral blocks to any target, including this one.

Contact us