How to output on custom device block?
3 次查看(过去 30 天)
显示 更早的评论
Greetings,
I am having trouble with my Device Driver Block.
It never outputs a 1 even though I have confirmed that the device is connecting via the Arduino IDE and a Logic Analyzer. Where am I going wrong?
Have a look at the wrapper code:
#include "C:\Users\Coach\MATLAB Drive\DriverBlocks\RoboClaw\RoboClawDriver.h"
#include <Arduino.h>
#include "RoboClaw.h"
// SerialPins uint8 [2,1] Non tunable
HardwareSerial *hSerial = &Serial1;
RoboClaw myRoboClaw(hSerial, 2000);
void setupFunctionRoboClawDriver(uint8_T * SerialPins,int size_vector__1){
hSerial->begin(38400);
Serial.println("Testing Connection");
char version[32];
if (myRoboClaw.ReadVersion(0x80, version)) {
Serial.println("Connected to the RoboClaw!");
} else {
Serial.println("Failed to read RoboClaw version.");
}
}
void stepFunctionRoboClawDriver(boolean_T *Connected,int size_vector_1){
int retries = 3;
char version[32];
while(retries-- > 0){
if(myRoboClaw.ReadVersion(0x80, version)) {
*Connected = true;
Serial.println(*Connected);
break;
} else {
*Connected = false;
Serial.println("Error");
}
}
if (!*Connected) {
Serial.println("Failed to connect to RoboClaw after retries.");
}
delay(10);
}
In my System Object Code, I am asking it to send the output of the wrapper to the output port on my block. I can see it works in simulation mode. However, it does not work in external mode.
classdef RoboClawDriver < matlab.System ...
& coder.ExternalDependency ...
& matlabshared.sensors.simulink.internal.BlockSampleTime
% RoboClaw Arduino Driver
%#codegen
%#ok<*EMCA>
properties
end
properties(Access = protected)
Logo = 'IO Device Builder';
end
properties (Nontunable)
SerialPins = uint8([10;11]);
end
properties (Access = private)
end
methods
% Constructor
function obj = RoboClawDriver(varargin)
setProperties(obj,nargin,varargin{:});
end
end
methods (Access=protected)
function setupImpl(obj)
if ~coder.target('MATLAB')
coder.cinclude('RoboClawDriver.h');
coder.ceval('setupFunctionRoboClawDriver', (obj.SerialPins),2);
end
end
function validateInputsImpl(obj,varargin)
% Check the input size
if nargin ~=0
end
end
function Connected = stepImpl(obj)
Connected = boolean(zeros(1,1));
if isempty(coder.target)
Connected = true;
else
coder.ceval('stepFunctionRoboClawDriver',coder.ref(Connected),1);
end
end
function releaseImpl(obj)
if isempty(coder.target)
else
end
end
end
methods (Access=protected)
%% Define output properties
function num = getNumInputsImpl(~)
num = 0;
end
function num = getNumOutputsImpl(~)
num = 1;
end
function varargout = getInputNamesImpl(obj)
end
function varargout = getOutputNamesImpl(obj)
varargout{1} = 'Connected';
end
function flag = isOutputSizeLockedImpl(~,~)
flag = true;
end
function varargout = isOutputFixedSizeImpl(~,~)
varargout{1} = true;
end
function varargout = isOutputComplexImpl(~)
varargout{1} = false;
end
function varargout = getOutputSizeImpl(~)
varargout{1} = [1,1];
end
function varargout = getOutputDataTypeImpl(~)
varargout{1} = 'boolean';
end
function maskDisplayCmds = getMaskDisplayImpl(obj)
outport_label = [];
num = getNumOutputsImpl(obj);
if num > 0
outputs = cell(1,num);
[outputs{1:num}] = getOutputNamesImpl(obj);
for i = 1:num
outport_label = [outport_label 'port_label(''output'',' num2str(i) ',''' outputs{i} ''');' ]; %#ok<AGROW>
end
end
inport_label = [];
num = getNumInputsImpl(obj);
if num > 0
inputs = cell(1,num);
[inputs{1:num}] = getInputNamesImpl(obj);
for i = 1:num
inport_label = [inport_label 'port_label(''input'',' num2str(i) ',''' inputs{i} ''');' ]; %#ok<AGROW>
end
end
icon = 'RoboClawDriver';
maskDisplayCmds = [ ...
['color(''white'');',...
'plot([100,100,100,100]*1,[100,100,100,100]*1);',...
'plot([100,100,100,100]*0,[100,100,100,100]*0);',...
'color(''blue'');', ...
['text(38, 92, ','''',obj.Logo,'''',',''horizontalAlignment'', ''right'');',newline],...
'color(''black'');'], ...
['text(52,50,' [''' ' icon ''',''horizontalAlignment'',''center'');' newline]] ...
inport_label ...
outport_label
];
end
function sts = getSampleTimeImpl(obj)
sts = getSampleTimeImpl@matlabshared.sensors.simulink.internal.BlockSampleTime(obj);
end
end
methods (Static, Access=protected)
function simMode = getSimulateUsingImpl(~)
simMode = 'Interpreted execution';
end
function isVisible = showSimulateUsingImpl
isVisible = false;
end
end
methods (Static)
function name = getDescriptiveName(~)
name = 'RoboClawDriver';
end
function tf = isSupportedContext(~)
tf = true;
end
function updateBuildInfo(buildInfo, context)
coder.extrinsic('codertarget.targethardware.getTargetHardware');
hCS = coder.const(getActiveConfigSet(bdroot));
targetInfo = coder.const(codertarget.targethardware.getTargetHardware(hCS));
% Added this env variable to fetch the comm libraries required only for Arduino target.
% The env variable is cleared at the end of
% "GenerateWrapperMakefile.m" file.
if contains(targetInfo.TargetName,'arduinotarget')
setenv('Arduino_ML_Codegen_I2C', 'Y');
end
addDefines(buildInfo, '__AVR__');
addIncludePaths(buildInfo, 'C:\ProgramData\MATLAB\SupportPackages\R2024b\aCLI\data\packages\arduino\hardware\avr\1.8.3\libraries\SoftwareSerial\src');
addSourceFiles(buildInfo, 'SoftwareSerial.cpp', 'C:\ProgramData\MATLAB\SupportPackages\R2024b\aCLI\data\packages\arduino\hardware\avr\1.8.3\libraries\SoftwareSerial\src');
buildInfo.addIncludePaths('C:\Users\Coach\Downloads\arduino\RoboClaw');
buildInfo.addIncludePaths('C:\Users\Coach\MATLAB Drive\DriverBlocks\RoboClaw');
addSourceFiles(buildInfo,'RoboClaw.cpp','C:\Users\Coach\Downloads\arduino\RoboClaw');
addSourceFiles(buildInfo,'RoboClawDriver.cpp','C:\Users\Coach\MATLAB Drive\DriverBlocks\RoboClaw');
end
end
end
4 个评论
采纳的回答
Aditya Shah
2024-11-29
Hello Clayton,
I've noticed that you've included numerous "Serial.println" statements in your code. Note that Simulink interfaces with Arduino in external mode using a serial connection over USB.
Try removing all the serial print statements and see if that resolves the issue.
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Arduino Hardware 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!