How to output on custom device block?
5 次查看(过去 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 个)
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!