License

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
www.mathworks.com/help/ecoder/index.html (account/license required)
- Developing Embedded Targets Advisory Service
www.mathworks.com/services/consulting/proven-solutions/developing-embedded-targets.html- MATLAB Answers: example of developing a custom target
www.mathworks.com/matlabcentral/answers/93884Note: Only Arduino IDE version 1.0.5 is supported and this submission is not maintained to support new IDEs.
For additional Arduino support, see www.mathworks.com/hardware-support/arduino-simulink.html.

Comments and Ratings (94)

my Matlab is 18b and it shows the error below... if anybody is able to figure out the reason for the error and how to solve it, I will really appreciate your help :)
"Error: Simulink Coder Error in block: "untitled/LCD Shield", block type "S-Function": Formated LCD output block requires C++"

Hello.
Thanks for this support package.
I have problems with the PIL Simulation (myarduino_blink2_PIL). I'm working with IDE v1.6.5.
I have performed the fix described by Tomas and doesn't work. Also I modify the fix as below, and it doesn't work:

if ~strcmp(arduino_ec.Prefs.getBoard, 'leonardo')
% Reset the board; this is needed for PIL to start it properly!
ResetArduino(avrdude_port);
% Very often Arduino "eats" first byte after flashing
sendDummy(avrdude_port);
end

The message I get is:

### Starting the PIL simulation
Warning: NARGCHK will be removed in a future release. Use NARGINCHK or NARGOUTCHK instead.
### Stopping PIL simulation
The timeout of 5 seconds for receiving data from the rtiostream interface has been exceeded. There might be multiple reasons for this failure.
You should:

(a) Check that the target hardware configuration is correct, for example, check that the byte ordering is correct.
(b) Confirm that the target is running.
(c) Consider the possibility of application run-time failures (e.g. divide by zero exceptions, incorrect custom code integration, etc.).

Note (c): To identify possible reasons for the run-time failure, consider using SIL, which supports signal handlers and debugging.

If you cannot find a solution, consider using the method setTimeoutRecvSecs of rtw.connectivity.RtIOStreamHostCommunicator to increase the timeout value.

hello ! I have a question.
The arduino path is unspecified or invalid with OS X 10.11.6 ,and my matlab version is 2016b,
set as follows:
arduino_ec.Prefs.setArduinoPath('/Users/home/Downloads/Arduino')
Thanks

Error using arduino_ec.Prefs.setBoard (line 75)
Unable to find board specification file. Ensure that
the path to the Arduino IDE is set correctly, e.g.
arduino_ec.Prefs.setArduinoPath('c:rduino-1.0.5')

The reason for hanging PIL is the fact, that Arduino "eats" first byte from UART after reset. So we need to modify function "runAvrDude.m". Look for line ~80 and modify it as follows:

if ~strcmp(arduino_ec.Prefs.getBoard, 'leonardo')
% Reset the board; this is needed for PIL to start it properly!
ResetArduino(avrdude_port);
else
% Very often Arduino "eats" first byte after flashing
sendDummy(avrdude_port);
end

Hi, My board is mega2560. I get the following error message when I run the PIL Simulation (myarduino_blink2_PIL), although the code generation has been completed successfully.
"The timeout of 5 seconds for receiving data from the rtiostream interface has been exceed....". I changed the receiving data time several times but did not solve the issue. Can someone help me?

@ Saad - make sure you work through the README.PDF when you first install. The setup script also runs a "build all s-functions" - which generate the required s-functions that are distributed with the target. From the error - it seems that you may not have built them, or added to the path. both of those things are handled via the set up script. good luck.

I've been able to get the embedded support package to work with the latest IDE (1.6.5). What you have to do is find the target_tools.mk under the '\arduino_ec' path. Edit this to include the correct file paths within the ARDUINO_INC_LIBS, TARGET_INC_DIR, and TARGET_SRC_DIR variables.The final step is to comment out the lines within the EXTRA_SRCS variables (the new IDE does not use malloc.c, and realloc.c)

I was able to use this target for the Zumo32U4, which is an Arduino Leonardo-like board. In fact, I can treat it as a Leonardo within the Arduino IDE without any issues. However, the Simulink support package for Arduino has trouble communicating with the Zumo32U4.

One outstanding problem I have was that part of the board support code does not work with Arduino 1.0.5, and I could not get the Embedded Coder target for Arduino to work with Arduino 1.6.5.

Is there any interest in the Embedded Coder Team in helping me make the target work with Arduino 1.6.5?

Is there any plan to update the Simulink support package for arduino, or this coder target, for Arduino 1.6.5?

Finally, what would it take to add the A-star/Zumo32U4 target to the Simulink support package for Arduino?

Anyone know!
I wonder what are the different among Embedded coder target for arduino, ArduinoIO, and Simulink support package for arduino?
Right now, i am confusing with these package, Can anyone here explain me about that please?
Thanks in advance!

The message "S-Function 'sfunar_digitalOutput' does not exist" means that S-Funtions were not created (compiled) during the setup. Please check/pick-up the C-compiler running of:
mex -setup
Then re-compile the S-Functions via script:
build_all_sfunctions

After that, in the directory "blocks" should be files with extension ".mexw32" resp. ".mexw64", depending on MATLAB version.

My MATLAB version is R2015a, and I am using an Arduino Uno. I ran the file setup_custom_target_arduino.m after changing the relevant directory listing and the arduino version in the m file, and I got the output of Arduino on COM 3, which was correct.

After this, I checked the Simulink Library Browser and I had the Custom C/C++ Target Arduino Library will all its modules. Now when I simulate the model, I get the following error:

Error in S-function 'myarduino_blink/Digital Output': S-Function 'sfunar_digitalOutput' does not exist

Hello every one , i have a simple model that integrates an input signal and it works fine in PIL mode where the integrator part only is coded to arduino , now i want to use the output signal to drive some electronics (servo ,LED) , but i couldn't do that , thanks

thank you Mikhail for your answer , i realized it the hard way , but i have another question :
now my simulation is running "Model block PIL" for some controller on UNO ,i need to output the control action to a servo using "servo block" in the arduino_lib , when i try to add this little part to the "Model block PIL" i end up with an error in the building stage.

Scopes only work in simulation part of the model. If you are doing "Top model PIL", scopes will not work, because the whole model is running on target. You should do "Model block PIL" with scopes in higher level model (running in simulation) to observe signals in scopes.

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.

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?

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.
Thanks

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:

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.

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
Thanks

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.

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.

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 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.

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.

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".

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.

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/Arduino.app/Contents/Resources/Java/')
-Go to the Arduino folder and copy Arduino.h, name it WProgram.h. (whoever decided this was a good idea..)

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.

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.

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).

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)

Updates

21 Apr 2017

1.7.0.1

-fixed typo in 'summary'

1 Sep 2016

1.7.0.1

Updated license

1 Sep 2016

1.7.0.1

Updated license

27 May 2014

1.7.0.0

- 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.

28 Mar 2014

1.6.0.0

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