View
458
Download
42
Category
Preview:
Citation preview
Copyright
ArduinoProgrammingusingMATLAB
AgusKurniawan
1stEdition,2015
Copyright©2015AgusKurniawan
TableofContentsCopyright
Preface
1.PreparingDevelopmentEnvironment
1.1Arduino
1.1.1ArduinoUno
1.1.2ArduinoLeonardo
1.1.3ArduinoMega2560
1.1.4ArduinoDue
1.2ElectronicComponents
1.2.1ArduinoStarterKit
1.2.2Fritzing
1.2.3Cooking-Hacks:ArduinoStarterKit
1.2.4ArduinoSidekickBasickit
1.3Matlab
1.4Testing
2.SettingArduinoDevelopmentforMATLAB
2.1GettingStarted
2.2SettingupArduinoDevelopmentforMATLAB
2.3ConnectingArduinoBoardtoComputer
2.4HelloArduino:BlinkingLED
3.WorkingwithDigitalI/O
3.1GettingStarted
3.2Demo:LEDandPushbutton
3.2.1Wiring
3.2.2WritingaProgram
3.2.3Testing
4.WorkingwithPWMandAnalogInput
4.1GettingStarted
4.2DemoAnalogOutput(PWM):RGBLED
4.2.1Wiring
4.2.2WritingProgram
4.2.3Testing
4.3DemoAnalogOutputVoltage:LEDBrightness
4.3.1Wiring
4.3.2WritingaProgram
4.3.3Testing
4.4DemoAnalogInput:WorkingwithPotentiometer
4.4.1Wiring
4.4.2WritingProgram
4.4.3Testing
5.WorkingwithI2C
5.1GettingStarted
5.2WritingProgram
5.3Demo1:ScanningI2C
5.4Demo2:ReadingDatafromSensorBasedI2C
6.WorkingwithSPI
6.1GettingStarted
6.2Demo:SPILoopback
7.WorkingwithServoMotor
7.1GettingStarted
7.2Wiring
7.3WritingaMatlabProgram
7.4Testing
8.MeasuringandPlottingSensorDatainReal-Time
8.1GettingStarted
8.2Wiring
8.3WritingaProgram
8.4Testing
SourceCode
Contact
Preface
ThisbookwaswrittentohelpanyonewanttodevelopArduinoboardusingMATLABwithArduinosupported.ItdescribesthebasicelementsofArduinodevelopmentusingMATLAB.
AgusKurniawan
Depok,September2015
1.PreparingDevelopmentEnvironment
1.1Arduino
Arduinoisanopen-sourceelectronicsprototypingplatformbasedonflexible,easy-to-usehardwareandsoftware.ThisboardusesAtmelmicrocontrollerseries.TherearemanyArduinohardwaremodelsthatyoucanuse.FurtherinformationaboutArduinoproducts,youcanvisitonwebsitehttp://arduino.cc/en/.
YoumustoneArduinohardwaretofollowpracticesinthisbook.IrecommendtoobtainoneofthefollowingArduinohardware:
ArduinoUnoArduinoLeonardoArduinoMega2560ArduinoDue
Youcanbuythisproductonyourlocalelectronicstore.Youalsocanorderitbyonline.Finditonhttp://arduino.cc/en/Main/Buy.ThefollowingisthelistofArduinostoreyoucanbuy
Arduinostore,http://store.arduino.cc/Amazon,http://www.amazon.comCooking-hacks,http://www.cooking-hacks.com/index.php/shop/arduino.htmlRSComponents,http://www.rs-components.comElement14,http://www.element14.comEXP-Tech,http://www.exp-tech.de
BecauseArduinoisanopen-sourcehardware,peoplecanbuildit.It’scalledArduinocompatible.Generallyit’ssoldinlowprices.
1.1.1ArduinoUno
TheArduinoUnoisamicrocontrollerboardbasedontheATmega328.Youcandownloadthedatasheetfile,http://www.atmel.com/dyn/resources/prod_documents/doc8161.pdf.
FurtherinformationaboutArduinoUno,youcanreaditonhttp://arduino.cc/en/Main/ArduinoBoardUno.
1.1.2ArduinoLeonardo
TheArduinoLeonardoisamicrocontrollerboardbasedontheATmega32u4.Downloaddatasheetforthisproductonhttp://www.atmel.com/dyn/resources/prod_documents/7766S.pdf.
Visitthisproducttogetthefurtherinformationonhttp://arduino.cc/en/Main/ArduinoBoardLeonardo.
1.1.3ArduinoMega2560
TheArduinoMega2560isamicrocontrollerboardbasedontheATmega2560.Youcandownloadthedatasheetfileonhttp://www.atmel.com/dyn/resources/prod_documents/doc2549.PDF.
FurtherinformationaboutArduinoMega2560,youcanvisiton
http://arduino.cc/en/Main/ArduinoBoardMega2560.
1.1.4ArduinoDue
TheArduinoDueisamicrocontrollerboardbasedontheAtmelSAM3X8EARMCortex-M3CPU.Youcandownloadthedatasheet,http://www.atmel.com/Images/doc11057.pdf.
IfyouwanttoknowaboutArduinoDue,Irecommendtovisitthiswebsite,http://arduino.cc/en/Main/ArduinoBoardDue.
1.2ElectronicComponents
Weneedelectroniccomponentstobuildourtesting,forinstance,Resistor,LED,sensordevicesandetc.Irecommendyoucanbuyelectroniccomponentkit.
1.2.1ArduinoStarterKit
Storewebsite:http://arduino.cc/en/Main/ArduinoStarterKit
1.2.2Fritzing
Storewebsite:http://shop.fritzing.org/.
YoucanbuyFritzingStarterKitwithArduinoUNOorFritzingStarterKitwithArduinoMega.
1.2.3Cooking-Hacks:ArduinoStarterKit
Storewebsite:http://www.cooking-hacks.com/index.php/shop/arduino/starter-kits/arduino-starter-kit.html
1.2.4ArduinoSidekickBasickit
Storewebsite:http://www.seeedstudio.com/depot/arduino-sidekick-basic-kit-p-775.html
Alternativeonlinestore
http://www.amazon.com/Arduino-Sidekick-Basic-Kit-Version/dp/B007B14HM8/
http://www.exp-tech.de/Zubehoer/Arduino-Sidekick-Basic-Kit.html
1.3Matlab
MATLABSupportPackageforArduinohardwareenablesyoutouseMATLAB®tocommunicatewiththeArduino®boardoveraUSBcable.Thispackageisbasedonaserverprogramrunningontheboard,whichlistenstocommandsarrivingviaserialport,executesthecommands,and,ifneeded,returnsaresult.
ThissupportpackageisavailableforR2014aandlaterreleases.It’savailableon32-bitand64-bitMicrosoft®Windows®,64-bitMacOS,and64-bitLinux®.
IwillexplainhowtosetupMatlabforArduinodevelopmentonchapter2.
1.4Testing
Fortesting,IusedArduinoUnoR3andArduinoMega2560onOSXandWindows10platformswithMatlab2015b.
IalsousedArduinoSidekickBasickitforelectroniccomponents.
2.SettingArduinoDevelopmentforMATLAB
ThischapterexplainshowtoworkonsettingupArduinoboardonacomputerandthen,accessitfromMATLAB.
2.1GettingStarted
Inthischapter,wesetupArduinoboarddevelopmentusingMATLABsupportpackageforArduinohardware.Tosetupthisdevelopment,youmusthaveMATLAB2014aorlaterandMATLABaccounttoverifywhileinstalling.
2.2SettingupArduinoDevelopmentforMATLAB
Inthissection,wetrytosetupArduinodevelopmentforMATLAB.YoucanconfigureMATLABSupportPackageforArduinohardwareusingMATLAB2014aorlater.Wealsoneedinternetconnectiontodownloadthispackage.
Let’sstart.
RunMATLABapplication.ClickGetHardwareSupportPackagesonAdd-Onsiconontoolbox.
Then,yougetadialog.SelectInstallfromInternet.
Ifdone,clickNext>button.
SelectArduinoonSupportfor.YoushouldseetwoArduinosupportpackages.Youcanselectboth.
Ifdone,clickNext>button.
YouwillbeaskedtologonwithyourMATLABaccount.YoushouldhaveMATLABlicense.ClickLogInbutton.
Youshouldtheauthenticationdialog.Fillyouraccount.Afterthat,clickLogInbutton.
Ifsuccess,youshouldgetasoftwarelicenseagreement.CheckedIacceptandthenclickNext>button.
Youwillgetconfirmation.ClickNext>button.
ClickInstallbuttontostartinstallation.
Afterdone,youwillbeaskedtoconfigureArduinoboard.SelectArduinoandthen,clickNext>button.
Confirmationformwillbeshown.ClickContinue>button.
TheprogramwillcheckifyourplatformneedsArduinodriverornot.Ifyou’reworkingonLinuxandMac,youdon’tneedadriver.YouneedtoinstallArduinodriverifyou’reworkingonWindowsplatform.ClickNext>buttonifdone.
Installationisover.ClickFinishbuttontocloseinstallation.
2.3ConnectingArduinoBoardtoComputer
NowyoucanconnectArduinoboardtocomputer.Then,verifywhichserialportisusedforArduinoboard.OnMacplatform,youtypethiscommand.
$ls/dev/cu*
OnLinuxplatform,youtypethiscommand.$ls/dev/tty*
YoucanuseDeviceManageronWindowsplatform.
Afterthat,youshouldseeserialportofArduinoboardwhichisattachedonthecomputer.
MyOSXdetectedmyArduinoboardused/dev/cu.usbmodem1421serialport.
OnMATLABcommandWindows,typethiscommand>>a=arduino
MATLABwilldetectyourArduinoboard.YoushoulddetectedArduinoboardinformationonMaltabCommandWindow.
2.4HelloArduino:BlinkingLED
Inthissection,webuildablinkingLEDprogramusingMATLAB.ArduinoUno/Mega/LeonardoboardsprovidesonboardLEDwhichisconnectedonpin13.
Let’sstarttowriteourBlinkprogram.
Firstly,yousetworkingfolderonMATLAB.YoucanchangeitonMATLABIDE,seearedarrow.
Then,clickNewScripticontocreateanewscriptfile.
Afterthat,youcangetascripteditor,showninFigurebelow.
board=arduino();
led='D13';
fork=1:10
disp('turnonLED');
writeDigitalPin(board,led,1);
pause(1);
disp('turnoffLED');
writeDigitalPin(board,led,0);
pause(1);
end
disp('closeArduinoboard');
clearboard;
Savethosescriptsintoafile,calledblinking.m.Nowyoucanrunit.>>blinking
Youmaygeterrormessage,showninFigurebelow.
Thiserroroccursbecausewecreatearduinoobjectwhilethereisexistingarduinoobject.Wecan’tusemultiplearduinoobject.DeleteexistingarduinoonWorkspaceWindow.SeearedarrowonaboveFigure.
Wecanclearourarduinoobjectusageusingclearsyntax.
Nowyoucanruntheprogramagain.Thefollowingisasampleoutputofblinkingprogram.
YoushouldseeblinkingLEDonArduinoboard.
3.WorkingwithDigitalI/O
InthischapterI’mgoingtoexplainhowtoworkwithdigitalI/OonArduinoboardandwriteaprogramfordemo.
3.1GettingStarted
MATLABsupportforArduinoboardprovidesthreefunctionswhichwecanuseondigitalI/Oprocessing.Thefollowingisthefunctions:
configurePin()isusedtodefinepinmodeeitherasinputoroutput.Reference:http://www.mathworks.com/help/supportpkg/arduinoio/ref/configurepin.htmlwriteDigitalPin()isusedtowritedigitaldataintoaspecificdigitalpin.Reference:http://www.mathworks.com/help/supportpkg/arduinoio/ref/writedigitalpin.htmlreadDigitalPin()isusedtoreaddigitalinputonspecificdigitalpin.Reference:http://www.mathworks.com/help/supportpkg/arduinoio/ref/readdigitalpin.html
ToillustratehowtoworkwithdigitalI/O,webuildasimpleprogrambyutilizingLEDandpushbutton.
3.2Demo:LEDandPushbutton
webuildaprogramusingLEDandpushbutton.Whenwepressapushbutton,LEDwilllighting.It’sasimple;).
3.2.1Wiring
Thefollowingishardwarewiring:
LEDisconnectedtoArduinodigitalpin9PushbuttonisconnectedtoArduinodigitalpin8
AsampleofhardwareimplementationisshowninFigurebelow.
3.2.2WritingaProgram
Nowyoucanwritethesescripts.function[]=led_pushbutton()
pushbutton='D8';
led='D9';
board=arduino();
finishup=onCleanup(@()exitprogram(board));
configurePin(board,pushbutton,'DigitalInput');
disp('pressCtr-Ctoexit');
while1
state=readDigitalPin(board,pushbutton);
writeDigitalPin(board,led,state);
disp(state);
pause(0.5);
end
end
functionexitprogram(b)
clearb;
disp('programhasexit');
end
WeuseonCleanup(),http://www.mathworks.com/help/matlab/ref/oncleanup.html,tocatchCTRL+Cforquitingtheprogram.
Savethisprogramintofile,calledled_pushbutton.m.
3.2.3Testing
RunthisprogrambytypingthiscommandonCommandWindowonMatlab.>>led_pushbutton
Presspushbutton.Then,youshouldseelightingLED.PressCTRL+Ctoexitprogram.
Programoutput:
LEDislightingwhileapushbuttonispressed.
4.WorkingwithPWMandAnalogInput
ThischapterexplainshowtoworkwithArduinoAnalogI/OusingMATLAB.
4.1GettingStarted
MATLABsupportforArduinoboardprovidesfivefunctionswhichwecanuseonanalogI/Oprocessing.Thefollowingisthefunctions:
configurePin()isusedtodefinepinmodeeitherasinputoroutput.Reference:http://www.mathworks.com/help/supportpkg/arduinoio/ref/configurepin.htmlwritePWMVoltage()isusedtowritePWMvoltageondigitalpin.Reference:http://www.mathworks.com/help/supportpkg/arduinoio/ref/writepwmvoltage.htmlwritePWMDutyCycle()isusedtosetPWMdutycycleondigitalpin.Reference:http://www.mathworks.com/help/supportpkg/arduinoio/ref/writepwmdutycycle.htmlreadVoltage()toreadanaloginputonAnalogpin.Reference:http://www.mathworks.com/help/supportpkg/arduinoio/ref/readvoltage.html
Inthischapter,wetrytoaccessArduinoAnalogI/OusingMATLAB.Therearethreescenariosforourcases:
ControllingRGBLEDControllingLEDbrightnessReadingAnaloginputusingPotentiometer
Let’sstart.
4.2DemoAnalogOutput(PWM):RGBLED
InthisscenariowebuildaprogramtocontrolRGBLEDcolorusingArduinoAnalogoutput(PWM).
PleasebecarefulifyouwanttoworkwithArduinoPWM.IfyouhaveArduinoMega,youwillseePWMlabelsoyouobtainPWMpinseasilybutifyouhaveArduinoUno,itwritesDIGITAL(PWM~).ItmeansyourPWMpinscanbefoundonDIGITALpinswhichpinwith~,forinstance,~3,~5,~6,~9,~10,~11.
ForArduinoMega2560,youcanseePWMpinsonpicturebelow(seeredarrow).
ForArduinoUnoR3,youcanseePWMpinsasbelow.
RGBLEDhas4pinsthatyoucanseeitonFigurebelow.
Tounderstandthesepins,youcanseethefollowingFigure.
Note:
Pin1:RedPin2:CommonpinPin3:Green
Pin4:Blue
Nowwecanstarttobuildaprogramandhardwareimplementation.
4.2.1Wiring
FirstlyweimplementRGBLEDhardware.Thefollowingisahardwareschema.
Forourtesting,weconfigurethefollowingPWMpins.
ArduinoMega2560:
RGBLEDpin1(red)isconnectedtoArduinoPWMpin3RGBLEDpin2isconnectedtoArduinoVCC5VRGBLEDpin3(green)isconnectedtoArduinoPWMpin5RGBLEDpin4(blue)isconnectedtoArduinoPWMpin6
ArduinoUnoR3:
RGBLEDpin1(red)isconnectedtoArduinoPWMpin3
RGBLEDpin2isconnectedtoArduinoVCC5VRGBLEDpin3(green)isconnectedtoArduinoPWMpin5RGBLEDpin4(blue)isconnectedtoArduinoPWMpin6
HereisasampleimplementationwithArduinoUnoR3.
4.2.2WritingProgram
Todisplayacertaincolor,wemustcombinecolorsfromred,green,blue.MATLABprovidesAPIforPWMlikeArduinoAPIsuchaswritePWMDutyCycle()withanalogvaluefrom0to1.
Let”sstarttobuildaprogram.Firstly,openMATLAB.Then,writethesescripts.function[]=led_rgb()
board=arduino();
finishup=onCleanup(@()exitprogram(board));
configurePin(board,'D3','PWM');
configurePin(board,'D5','PWM');
configurePin(board,'D6','PWM');
disp('pressCtr-Ctoexit');
while1
disp('red');
write_rgb(board,0,1,1);%red
pause(1);
disp('green');
write_rgb(board,1,0,1);%green
pause(1);
disp('blue');
write_rgb(board,1,1,0);%blue
pause(1);
disp('yellow');
write_rgb(board,0,0,1);%yellow
pause(1);
disp('purple');
write_rgb(board,0.3,1,0.3);%purple
pause(1);
disp('aqua');
write_rgb(board,1,0,0);%aqua
pause(1);
end
end
%testingforArduinoUno
functionwrite_rgb(board,r,g,b)
writePWMDutyCycle(board,'D3',r);
writePWMDutyCycle(board,'D5',g);
writePWMDutyCycle(board,'D6',b);
end
functionexitprogram(b)
clearb;
disp('programhasexit');
end
Savethisprogramasled_rgb.m.
Thisprogramwillgeneratesixcolors:red,green,blue,yellow,purple,andaqua.
4.2.3Testing
Uploadandruntheprogram.YoushouldseeseveralcoloronRGBLED.>>led_rgb
ThefollowingisasampledemoonCommandWindowonMATLAB.
Thefollowingisasampledemoonhardware.
4.3DemoAnalogOutputVoltage:LEDBrightness
Inthisdemo,wetrytocontrolLEDbrightnessbycontrollingvoltageonLED.MATLABforArduinosupportprovideswritePWMVoltage()functiontosetvoltageonPWMpins.Wecansetavoltagevaluefrom0to5forArduinoUno/Megaand0-3.3forArduinoDue.
Let’sbuild.
4.3.1Wiring
WeconnectaLEDonPWMpinondigitalpin3.Thefollowingismyhardwarewiring.
4.3.2WritingaProgram
NowyoucanopenMATLABandwritethesescripts.function[]=led_brightness()
board=arduino();
finishup=onCleanup(@()exitprogram(board));
configurePin(board,'D3','PWM');
disp('pressCtr-Ctoexit');
while1
fork=0:5
writePWMVoltage(board,'D3',k);
pause(1);
end
fork=5:-1:0
writePWMVoltage(board,'D3',k);
pause(1);
end
end
end
functionexitprogram(b)
clearb;
disp('programhasexit');
end
Savethesescriptsintoafile,calledled_brightness.m.
ThisprogramwillsetvoltagevalueonPWMpinondigitalpin3from0to5andthensetavaluefrom5to0too.
4.3.3Testing
MakesureArduinoboardalreadyconnectedtoyourcomputer.Youcanruntheprogrambytypingthiscommand.
>>led_brightness
Onhardwareside,youshouldseeLEDbrightnesschanginggradually.
4.4DemoAnalogInput:WorkingwithPotentiometer
Inthissection,welearnhowtoreadanaloginputonArduinoboard.Forillustration,IusePotentiometerasanaloginputsource.OurscenarioistoreadanalogvaluefromPotentiometer.Then,displayitonconsole.
Let’sstart!.
4.4.1Wiring
TounderstandPotentiometer,youseeitsschemeinFigurebelow.
YoucanconnectVCCtoArduinoboardonVCC+5Vpin.VouttoArduinoboardAnaloginputA0.Inaddition,GNDtoArduinoboardGND.Thefollowingishardwareimplementation.Iuseslidepotentiometer.
4.4.2WritingProgram
Firstly,createaprogramviaMATLAB.Toreadanaloginput,wecanusereadVoltage()function.Ok,Let’swritethesescripts.
function[]=potentiometer()
board=arduino();
finishup=onCleanup(@()exitprogram(board));
disp('pressCtr-Ctoexit');
while1
analog=readVoltage(board,'A0');
disp(['analog=',num2str(analog)]);
pause(1);
end
end
functionexitprogram(b)
clearb;
disp('programhasexit');
end
Savethiscodeaspotentiometer.m
4.4.3Testing
Toruntheprogram,youcantypethiscommand.>>potentiometer
YoushouldseeanalogvalueonCommandWindow.
5.WorkingwithI2C
InthischapterwelearnhowtoworkwithI2ConArduinoboardusingMATLAB.
5.1GettingStarted
TheI2C(Inter-IntegratedCircuit)buswasdesignedbyPhilipsintheearly’80stoalloweasycommunicationbetweencomponentswhichresideonthesamecircuitboard.TWIstandsforTwoWireInterfaceandformostmartsthisbusisidenticaltoI²C.ThenameTWIwasintroducedbyAtmelandothercompaniestoavoidconflictswithtrademarkissuesrelatedtoI²C.
I2Cbusconsistsoftwowires,SDA(SerialDataLine)andSCL(SerialClockLine).YoucanseeI2CpinsonArduinoboardasfollows:
ArduinoUno:A4pinasSDAandA5asSCLpinArduinoMega2560:Digitalpin20asSDAandDigitalpin21asSCL
MATLABforArduinosupportprovidesseveralfunctionstoaccessI2Cprotocol.Youcanreaditonhttp://www.mathworks.com/help/supportpkg/arduinoio/i2c-sensors.html.
Fortesting,IusedPCF8591AD/DAConvertermodulewithsensorandactuatordevices.Youcanfinditonthefollowingonlinestore:
Amazon,http://www.amazon.com/PCF8591-Converter-Module-Digital-Conversion/dp/B00BXX4UWC/eBay,http://www.ebay.comDealextreme,http://www.dx.com/p/pcf8591-ad-da-analog-to-digital-digital-to-analog-converter-module-w-dupont-cable-deep-blue-336384Aliexpress,http://www.aliexpress.com/
Inaddition,youcanfindthisdeviceonyourlocalelectronicsstore/onlinestore.
Thismodulehasminiformmodeltoo,forinstance,youcanfinditonAmazon,http://www.amazon.com/WaveShare-PCF8591T-Converter-Evaluation-Development/dp/B00KM6X2OI/.
ThismoduleusePCF8591ICandyoucanreadthedatasheetonthefollowingURLs.
http://www.electrodragon.com/w/images/e/ed/PCF8591.pdfhttp://www.nxp.com/documents/data_sheet/PCF8591.pdf
Inthischapter,webuildaprogramtoaccesssensorviaI2CusingArduinosoftwareonArduinoboard.
5.2WritingProgram
WeusePCF8591AD/DAConverterasI2Csource.YoucanconnectPCF8591AD/DAConvertertoArduinoboarddirectly.Inthisdemo,IuseArduinoUno.
Thefollowingisourwiringlab
PCF8591AD/DAConverterSDA—>ArduinoSDA(A4)PCF8591AD/DAConverterSCL—>ArduinoCLK(A5)PCF8591AD/DAConverterVCC—>ArduinoVCC+5VPCF8591AD/DAConverterGND—>ArduinoGND
HardwareimplementationcanbeshowninFigurebelow.
5.3Demo1:ScanningI2C
AfterattachedoursensortoArduino,wecanscanourI2CaddressusingscanI2CBus()function.OnArduinoUno,weuse0forI2C.
Writethesescripts.board=arduino();
address=scanI2CBus(board,0);%uno=0
disp(['i2caddress:',address]);
clearboard;
Savetheprogramintoafile,calledi2c_scan.m.
Runtheprogram.>>i2c_scan
OnCommandWindow,youshouldseeI2Caddressofsensordevice.Forinstance,mysensorwasdetectedon0x48.
I2Caddresswillbeusedonthenextdemo.
5.4Demo2:ReadingDatafromSensorBasedI2C
WeuseI2ConArduinoboardusingi2cobject,seehttp://www.mathworks.com/help/supportpkg/arduinoio/i2c-sensors.html.PCF8591AD/DAConvertermodulehasthreesensordevices:Thermistor,Photo-voltaiccellandPotentiometer.ThismodulerunsonI2Cbuswithaddress0x48.Inthiscase,wereadallsensordata.
Writethesescripts.function[]=i2c_sensor()
board=arduino();
finishup=onCleanup(@()exitprogram(board));
disp('pressCtr-Ctoexit');
PCF8591='0x48';
PCF8591_ADC_CH0='40';%thermistor
PCF8591_ADC_CH1='41';%photo-voltaic
PCF8591_ADC_CH3='43';%potentiometer
i2c=i2cdev(board,PCF8591);
disp(['thermistor','photo','potentiometer']);
while1
thermistor=read_adc(i2c,hex2dec(PCF8591_ADC_CH0));
pause(0.5);
photo=read_adc(i2c,hex2dec(PCF8591_ADC_CH1));
pause(0.5);
potentiometer=read_adc(i2c,hex2dec(PCF8591_ADC_CH3));
pause(0.5);
disp([thermistor,photo,potentiometer]);
end
end
functionadc=read_adc(dev,config)
write(dev,config);
read(dev,1);
out=read(dev,1);
adc=out;
end
functionexitprogram(b)
clearb;
disp('programhasexit');
end
Savethesescriptsintoafile,calledi2c_sensor.m.
Runtheprogram.>>i2c_sensor
Ifsuccess,youshouldseevaluesforThermistor,Photo-voltaic,andpotentiometer.
6.WorkingwithSPI
InthischapterI’mgoingtoexplainhowtoworkwithSPIonArduinoboardusingMATLAB.
6.1GettingStarted
TheSerialPeripheralInterface(SPI)isacommunicationbusthatisusedtointerfaceoneormoreslaveperipheralintegratedcircuits(ICs)toasinglemasterSPIdevice;usuallyamicrocontrollerormicroprocessorofsomesort.
SPIinArduinoUnoboardcanbedefinedonthefollowingpins:
MOSIonDigitalpin11MISOonDigitalpin12SCKonDigitalpin13SSonDigitalpin10
IfyouhaveArduinoMega,thefollowingisitsSPIpins:
MOSIonDigitalpin51MISOonDigitalpin50SCKonDigitalpin52SSonDigitalpin53
Ingeneral,youlearnSPIusingMATLABonthisdocument,http://www.mathworks.com/help/supportpkg/arduinoio/spi-sensors.html.ToaccessSPIonArduinoboardfromMATLAB,wecandothefollowingsteps:
OpenArduinocommunicationbycreatingarduinoobjectOpenSPIconnectionbycallingspidevwithpassingSSpin,http://www.mathworks.com/help/supportpkg/arduinoio/ref/spidev.htmlTowriteandreadSPIdata,wecanusewriteReadwithpassingspidevobject,http://www.mathworks.com/help/supportpkg/arduinoio/ref/writeread.html
Inthischapter,webuildaSPILoopbackapp.Let’sstart!.
6.2Demo:SPILoopback
TodevelopSPIloopback,wecanconnectMOSIpintoMISOpin.Thismeansyouconnectpin11topin12usingcable.
Thefollowingisasampleofwiring.
OnMATLAB,youcanwritethsesscripts.function[]=spi_loopback()
board=arduino();
finishup=onCleanup(@()exitprogram(board));
spi=spidev(board,10);
k=3;
m=10;
n=30;
disp('pressCtr-Ctoexit');
while1
disp('datain:');
dataIn=[kmn];
disp(dataIn);
dataOut=writeRead(spi,dataIn);
disp('dataout:');
disp(dataOut);
pause(1.5);
k=k+1;
m=m+1;
n=n+1;
end
end
functionexitprogram(b)
clearb;
disp('programhasexit');
end
Savethesescriptsintoafile,callsedspi_loopback.m.Then,runthisprogramonCommandWindowsofMATLAB.
>>spi_loopback
AsampleoutputprogramcanbeseeninFigurebelow.
7.WorkingwithServoMotor
InthischapterI’mgoingtoexplainhowtoworkwithservomotoronArduinoboardusingMATLAB.
7.1GettingStarted
Servomotorprovidesashaftmovement360degree.Wecancontrolthismovementbasedonitsdegree.Inthisscenario,youcanuseanyDCmotor(servo)thatwillbeconnectedtoArduino.IusedaminiservofromArduinoSidekickBasickit.
Thefollowingisapictureofmyminiservomotor.
Tounderstandservo’scables,youcanidentifyasfollows:
Redcableisbeconnectedto5VBlackorbrowncableisbeconnectedtoGNDTherest(yellowororangecable)isbeconnectedtoArduinoPWMpin
ThenextstepwearegoingtobuildaMATLABprogramwithArduinoandservomotor.
7.2Wiring
Tobuildhardwareimplementation,youcanconnectservomotortoArduinobyfollowingconfiguration:
Redcableisbeconnectedto5VBlackorbrowncableisbeconnectedtoGNDTherest(yellowororangecable)isbeconnectedtoArduinoPWMpin.Iusedpin10forArduinoUnoR3orArduinoMega2560
Thefollowingisasampleofhardwareimplementation.
7.3WritingaMatlabProgram
Wecanuseservoobjecttocontrolservermotor.Youcanreaditonhttp://www.mathworks.com/help/supportpkg/arduinoio/servo-motors.html.Webuildaprogramtorunaservomotorfromposition0to1usingwritePosition()function.
Writethesescripts.function[]=servo_motor()
board=arduino();
finishup=onCleanup(@()exitprogram(board));
motor=servo(board,'D10');
disp('pressCtr-Ctoexit');
while1
forpos=0:0.25:1
disp(['position:',num2str(pos)]);
writePosition(motor,pos);
pause(1);
end
forpos=1:-0.25:0
disp(['position:',num2str(pos)]);
writePosition(motor,pos);
pause(1);
end
end
end
functionexitprogram(b)
clearb;
disp('programhasexit');
end
Savethesescritpsintoafile,servo_motor.m.
7.4Testing
NowyoucanruntheprogramonCommandWindowfromMATLAB.>>servo_motor
Youshouldseeservormotorisrunningfromdegree0to180andthenbackagainfromdegree180to0.
AsampleoutputprogramcanbeseeninFigurebelow.
8.MeasuringandPlottingSensorDatainReal-Time
InthischapterI’mgoingtoexplainhowtoreaddatafromsensordevicesandplotitongraphinreal-time.
8.1GettingStarted
Thissectionhasanobjectivetoshowhowtoworkwithareal-timeonmeasurement.Wereaddatafromsensordevicesanddisplayitongraph.
Let’sstart!.
8.2Wiring
Weusethesamewiringfromsection5.2
8.3WritingaProgram
NowyourunMATLABandwritethesescripts.function[]=sensing()
board=arduino();
disp('pressCtr-Ctoexit');
h=figure(1);
finishup=onCleanup(@()exitprogram(board,h));
PCF8591='0x48';
PCF8591_ADC_CH0='40';%thermistor
PCF8591_ADC_CH1='41';%photo-voltaic
PCF8591_ADC_CH3='43';%potentiometer
i2c=i2cdev(board,PCF8591);
hLine1=line(nan,nan,'Color','red');
hLine2=line(nan,nan,'Color','blue');
hLine3=line(nan,nan,'Color','black');
i=0;
while1
thermistor=read_adc(i2c,hex2dec(PCF8591_ADC_CH0));
pause(0.5);
photo=read_adc(i2c,hex2dec(PCF8591_ADC_CH1));
pause(0.5);
potentiometer=read_adc(i2c,hex2dec(PCF8591_ADC_CH3));
pause(0.5);
x1=get(hLine1,'XData');
y1=get(hLine1,'YData');
x2=get(hLine2,'XData');
y2=get(hLine2,'YData');
x3=get(hLine3,'XData');
y3=get(hLine3,'YData');
x1=[x1i];
y1=[y1thermistor];
x2=[x2i];
y2=[y2photo];
x3=[x3i];
y3=[y3potentiometer];
set(hLine1,'XData',x1,'YData',y1);
set(hLine2,'XData',x2,'YData',y2);
set(hLine3,'XData',x3,'YData',y3);
i=i+1;
pause(1);
end
end
functionadc=read_adc(dev,config)
write(dev,config);
read(dev,1);
out=read(dev,1);
adc=out;
end
functionexitprogram(b,h)
clearb;
close(h);
disp('programhasexit');
end
Savetheprogramintoafile,calledsensing.m.
Basically,theprogramissimilartoprogramfromsection5.4.Afterreadsensordata,wedisplayitusinglineobjectfromMATLAB.
8.4Testing
Youcanruntheprogrambytypingthiscommand.>>sensing
YoushouldseesensordataonFigure.
SourceCode
Youcandownloadsourcecodeonhttp://www.aguskurniawan.net/book/matprog_120x15.zip.
Contact
Ifyouhavequestionrelatedtothisbook,pleasecontactmeataguskur@hotmail.com.Myblog:http://blog.aguskurniawan.net
Recommended