Copyright
GettingStartedwithArduinoandGo
AgusKurniawan
1stEdition,2015
Copyright2015AgusKurniawan
*CoverphotoiscredittoFajarRamadhany,Bataviasoft,http://bataviasoft.com/.
**Arduinologoistakenfromhttp://www.arduino.cc/.
http://bataviasoft.com/http://www.arduino.cc/
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.3Go
1.4ArduinoSoftware
1.5Testing
2.HelloWorld:ArduinoandGo
2.1ArduinoWorld
2.1.1ArduinoHardwareDriveronWindows8/8.1
2.1.2SimpleTesting
2.2ArduinoandGo
2.3TestingSerialPortusingGo
2.4TestingforArduinoandGo
3.ExploringGoPackagesforArduino
3.1GettingStarted
3.2Gobot
3.3go-firmata
3.4ReadingDigitalInput
3.4.1gobot
3.4.2go-firmata
4.AnalogSensor
4.1SensorDevices
4.2ReadingSensor
4.3RunningProgram
5.RGBLED
5.1RGBLED
5.1.1ArduinoAnalogoutput(PWM)
5.1.2ControllingRGBLEDColor
5.2ArduinoImplementation
5.3GoImplementation
SourceCode
Contact
Preface
ThisbookwaswrittentohelpanyonewanttogetstartedwithArduinoandGo.ItdescribesthebasicelementsoftheintegrationofArduinoandGo.
AgusKurniawan
Depok,March2015
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.ItscalledArduinocompatible.Generallyitssoldinlowprices.
1.1.1ArduinoUno
TheArduinoUnoisamicrocontrollerboardbasedontheATmega328.Youcandownloadthedatasheetfile,http://www.atmel.com/dyn/resources/prod_documents/doc8161.pdf.
FurtherinformationaboutArduinoUno,youcanreaditonhttp://arduino.cc/en/Main/ArduinoBoardUno.
http://arduino.cc/en/http://arduino.cc/en/Main/Buyhttp://store.arduino.cc/http://www.amazon.comhttp://www.cooking-hacks.com/index.php/shop/arduino.htmlhttp://www.rs-components.comhttp://www.element14.comhttp://www.exp-tech.dehttp://www.atmel.com/dyn/resources/prod_documents/doc8161.pdfhttp://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://www.atmel.com/dyn/resources/prod_documents/7766S.pdfhttp://arduino.cc/en/Main/ArduinoBoardLeonardohttp://www.atmel.com/dyn/resources/prod_documents/doc2549.PDF
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.
http://arduino.cc/en/Main/ArduinoBoardMega2560http://www.atmel.com/Images/doc11057.pdfhttp://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.
http://arduino.cc/en/Main/ArduinoStarterKithttp://shop.fritzing.org/
1.2.3Cooking-Hacks:ArduinoStarterKit
Storewebsite:http://www.cooking-hacks.com/index.php/shop/arduino/starter-kits/arduino-starter-kit.html
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
http://www.seeedstudio.com/depot/arduino-sidekick-basic-kit-p-775.htmlhttp://www.amazon.com/Arduino-Sidekick-Basic-Kit-Version/dp/B007B14HM8/http://www.exp-tech.de/Zubehoer/Arduino-Sidekick-Basic-Kit.html
1.3Go
TheofficialwebofGocouldbefoundonhttps://golang.org/.WhatisGo?Basedoninformationfromwebsite,wecouldknowwhatitis.Goisanopensourceprogramminglanguagethatmakesiteasytobuildsimple,reliable,andefficientsoftware.
InstallationofGoapplicationiseasy.ForWindowsandMacPlatform,youdownloadsetupfilefromGowebsite,http://golang.org/doc/install.Runitandfollowinstallationcommands.
ThenextstepistoconfigureGOROOTpath.ForWindowsplatform,youcanaddGOROOTvariableonEnvironmentVariables.ForMac/Linux,youcanitonyourbashprofile.
https://golang.org/.http://golang.org/doc/install
ForWindowsplatform,youcanaddGOinstallationpath,forinstancemyGoinstallationpathisc:/go/bin,intoPATHvariableonEnvironmentVariables.
Afterconfigured,youcanverifyGoversionbytypingthiscommandonyourTerminalorCMDforWindows.
$goversion
AsampleoutputcanbeseeninFigurebelow,Macplatform.
TheoutputofprogramonWindowsplatform.
Inthisbook,IdontexploreallprogramminglanguageforGo.Youcanreaditonseveralbookorwebsite.IhavealreadywrittenabookaboutGoProgrammingbyExample.Youcangetthisbookonthislink,http://blog.aguskurniawan.net/post/Go-Programming-by-Example.aspx.
http://blog.aguskurniawan.net/post/Go-Programming-by-Example.aspx
1.4ArduinoSoftware
TodevelopapplicationbasedonArduinoboard,weneedArduinosoftware.Youcanobtainitonhttp://arduino.cc/en/Main/Software.Pleaseinstallbasedonyourplatform.
IfyourplatformisUbuntu,youcaninstallbywritingthisscriptsudoapt-getinstallarduino
ForWindowsplatform,youcandownloadsetupfileandinstallit.
ThefollowingisascreenshotofArduinosoftwareonUbuntuplatform.
HereisArduinosoftwareonWindows8platform.
http://arduino.cc/en/Main/Software
IfyourunArduinosoftwareonWindowsplatform,youshouldconfigurearduino.exerunningasAdministrator.Youcanchangeitbyeditingfileproperty.ClickCompatibilityandthencheckedRunthisprogramasanadministrator.
1.5Testing
Fortesting,IusedArduinoUnoR3andArduinoMega2560onUbuntuandWindows8.1platforms.
IalsousedArduinoSidekickBasickitforelectroniccomponents.
2.HelloWorld:ArduinoandGo
ThischapterexplainshowtoworkwithArduinoandGoforgettingstarted.
2.1ArduinoWorld
AfteryouinstalledArduinosoftware,youcanpluginArduinohardwareintocomputerviaUSB.
ThenyouexecuteArduinosoftware.IngeneralitwilldetectArduinohardwareincludeArduinotypeandmodel.
2.1.1ArduinoHardwareDriveronWindows8/8.1
OnWindowsplatform,youmaygetaproblemaboutArduinohardwaredriver.ItdoesntberecognizedonWindowsDeviceManagerasbelow.
YoucanupdatethisdevicedriverbynavigatinghardwaredriveronthedriverfolderofArduinosoftwareinstallationfolder,forinstanceE:\arduino-1.0.2\drivers.
Sometimeyoumaygetaproblemespeciallyforx64editionaboutdigitalsignatureofArduinodriver,showninFigurebelow.
ConfiguretoignorethedigitalsignaturesettingsonyourWindows.NormallyyoucandoitbypressingF8keyonrestartingWindows.ThenchooseDisableDriversignatureEnforcement.
ForWindows8,youcandobyclickingRestartmenuandpressingSHIFTkey.SelectTroubleshoot.ThenselectAdvancedoptions.
OnAdvancedoptionsdisplay,selectStartupsettings,showninFigurebelow.
ClickRestartbutton.ThenWindows8willrestart.Afterthat,selectDisabledriversignatureenforcement.
NowyoucaninstallArduinodriveronyourWindows.
Ifsuccess,youcanseeArduinohardwareonTheDeviceManagerasbelow.
YoucanseeyourArduinohardwarerunningonCOM8.
2.1.2SimpleTesting
Nowyourereadytogetstarted.Forillustration,IusethesamplecodefromArduino,Blink.Youcanvisitonhttp://arduino.cc/en/Tutorial/Blinkforconfiguration.
Forthisscenario,youneedLEDandresistor.Attachresistortopin13.NegativepinofLEDisattachedtopinGND.Youcanseethehardwareconfigurationasbelow.
http://arduino.cc/en/Tutorial/Blink
OnArduinosoftware,ClickFile->Examples->01.Basics->Blink.
ThenyouwillgetasamplecodeofBlinkapp.
NowtrytoconnectyourArduinointocomputer.
CompileanduploadBlinkapptoArduinohardware.Ifsuccess,youcanseetheLEDwillbeon/offeverysecond.
2.2ArduinoandGo
TocommunicatebetweenArduinoandcomputer,wecanuseaserialcommunication.ItmeansGogivescommandandreceivesdataviaserialport.
OnGo,wecanuseseveralGopackages.ThefollowingisalistofGopackageforcommunicatingwithserialport:
GoSerial,https://code.google.com/p/goserial/go-serial,https://github.com/jacobsa/go-serial
Inthissection,IjustshowyouhowtouseGoSerialtocommunicatewithserialport.
https://code.google.com/p/goserial/https://github.com/jacobsa/go-serial
2.3TestingSerialPortusingGo
NowyoucanconnectyourArduinotocomputer.ForWindowsplatform,youcanverifybyopeningDeviceManagerandexpandPorts(COM&LPT).YoucanseeCOMyourArduinoused.
ForDebian/Ubuntu/Mac,youcancheckitbytypingonterminalls/dev/ttyACM*
YoucanseeArduinoserialport.Hereisasampleoutput./dev/ttyACM0
Nowwecreateprojectcalledserialtestbycreatingafolder,serialtest.$mkdirserialtest
$cdserialtest
Createafile,calledmain.go.Writethefollowingcode.packagemain
import("github.com/tarm/goserial""fmt")
funcmain(){c:=&serial.Config{Name:"COM6",Baud:9600}s,err:=serial.OpenPort(c)iferr!=nil{panic(err)}defers.Close()fmt.Println("connected")}
Note:changeyourserialport.Inthissection,myArduinoisconnectedtoCOM6inWindowsplatform.
BecauseweuseexternalpackagefromGithub,youmustinstallgitruntime.
ToinstallGolibraryfromGithub,youmustinstalgit,http://git-scm.com/.Downloaditbasedonyourplatform.IfyouuseWindowsplatform,dontforgettosetitonPATHonEnvironmentVariables.
http://git-scm.com/
ThenextstepistoconfigureGOPATH.Itrepresentsourworkspacepath,forinstance,myworkspacepathisD:\PE_PRESS\eBook\arduino_go\codes.InLinux/Mac,youcandefineyourownworkspacepathinunderyouraccounthomepath,forinstance.Furtherinformation,youcanreaditonhttps://golang.org/doc/code.html.
IfyouuseLinux/Mac,youcandefineGOPATHusingexportcommandoryouadditonyourprofilefile.
$mkdir$HOME/go$exportGOPATH=$HOME/go
IfyouuseWindowsplatform,youopenEnvironmentVariables.YoucanopenitfromAdvancedsystemsettings.Then,clickEnvironmentVariablesbutton.AddGOPATHonyouruserandSystemvariables.
https://golang.org/doc/code.html
NowwecaninstallgoseriallibraryfromGithub.Typethefollowingcommand.$gogetgithub.com/tarm/goserial
Savethiscodeonmain.gofile.
Nowyoucanbuildandrunthisprogram.DontforgettoconnectyourArduinointoPCviaUSB.
$gobuild$gorunmain.go
AprogramoutputcanbeseeninFigurebelow.
2.4TestingforArduinoandGo
NowwetestforcommunicatingbetweenArduinoandGo.Inthisscenario,webuildArduinoapptosenddatatoserialport.Then,Goappwillreceivethismessagebylisteningonserialport.
ThefirststepistocreateArduinoapp.FromBlinkArduinoapp,youcanmodifythiscode.Writethiscode:
intled=13;
voidsetup(){pinMode(led,OUTPUT);Serial.begin(9600);}
voidloop(){digitalWrite(led,HIGH);Serial.write("LEADisHIGH\n");delay(1000);digitalWrite(led,LOW);Serial.write("LEADisLOW\n");delay(1000);}
Explanation
Onsetup(),weactivateserialporton9600baudrateandLEDonpin13Onloop(),wewriteHIGHonpin13andthensendamessageLEADisHIGH\ntoserialportWealsodoitagain.ItwritesLOWvalueandsendsamessageLEADisLOW\ntoserialport
Savethiscodeasblinked.CompileanduploadthiscodetoArduinohardware.
MakesureyoualreadyconfigureArduinoboardandserialportofArduinoboard.
YoucancompilebyclickingiconcheckedanddeploytoArduinobyclickingiconarrow.
YoucanchecktheserialportresponseusingSerialMonitor.ClickmenuTools->SerialMonitor.YouwillseemessagesfromArduinohardware.
Onthenextstep,wecreateGoapp.BasicallywecreateaGoapptolistenincomingmessagesfromserialport.Createaproject,calledserialdemo,bycreatingfolder,serialdemo.
$mkdirserialdemo$cdserialdemo
Createafile,calledmain.go.Writethefollowingcode.packagemain
import("github.com/tarm/goserial""fmt""strings")
funcmain(){//openserialportArduino//changeportvaluebasedonyourplatformc:=&serial.Config{Name:"COM6",Baud:9600}s,err:=serial.OpenPort(c)iferr!=nil{panic(err)}defers.Close()
//readdatainbackgroundgofunc(){buf:=make([]byte,128)str:=""for{n,err:=s.Read(buf)iferr!=nil{panic(err)}str=fmt.Sprintf("%s%s",str,string(buf[:n]))ifstrings.Index(str,"\n")>=0{ind:=strings.Index(str,"\n")temp:=str[:ind+1]str=fmt.Sprintf("%s",str[ind+1:])fmt.Printf("%s",temp)}
}}()
//pressENTERtoexitfmt.Println("pressEntertoexit..")varinputstringfmt.Scanln(&input)fmt.Println("done")
}
Note:changeyourArduinoserialport.
Savethiscodeonmain.gofile.
Nowyoucanbuildandrunthisprogram.DontforgettoconnectyourArduinointoPCviaUSB.
$gobuild$gorunmain.go
Hereisasampleofprogramoutput.
YoucanseetheincomingmessagefromserialportofArduino.Toexitfromprogram,youpressENTERfromyourPCkeyboard.
3.ExploringGoPackagesforArduino
InthischapterImgoingtoexplainhowtouseexternalGopackagestoaccessArduinodirectly.
3.1GettingStarted
ToaccessArduino,wecandoinmanyways.OneofthemistouseFirmataprotocol,http://firmata.org/.YoufindmanyGopackageswhichimplementFirmataprotocol.ThefollowingisalistofGopackagetoimplementFirmataprotocol.
Gobot,http://gobot.io/go-firmata,https://github.com/kraman/go-firmatagofirmata,https://github.com/choffee/gofirmata
TouseArduinowithFirmataprotocolonArduino,wemustloadFirmataprotocolmoduleonArduino.FirstlywemustloadFirmataprotocolonyourArduinoboard.OpenArduinosoftwareandclickmenuFile->Examples->Firmata->StandardFirmata.
http://firmata.org/http://gobot.io/https://github.com/kraman/go-firmatahttps://github.com/choffee/gofirmata
ThenyouobtainFirmatacodes.
NowyoucancompileanddeployFirmataProtocolcodeintoyourArduinoboard.DontforgettoselectyourArduinoboardmodelandserialport.
Thenextstepistobuildasimpleapp,blinkingled,usingGowithGobotandgo-firmatapackages.
3.2Gobot
Gobotisaframeworkforrobotics,physicalcomputing,andtheInternetofThings,writtenintheGoprogramminglanguage.Furtherinformationaboutgobot,youcanvisittheofficialwebsiteonhttp://gobot.io/.
Inthissection,wetrytoaccessArduinoviagobot.Toinstallgobotpackage,youmustinstallthefollowingruntime:
git,http://git-scm.com/mercurial,http://mercurial.selenic.com/wiki/Download
Nowyoucaninstallgobotpackagewiththefollowingcommand$goget-d-ugithub.com/hybridgroup/gobot/...
YoualsoinstallFirmataforGobotpackage.Typethiscommand.$gogetgithub.com/hybridgroup/gobot&&goinstallgithub.com/hybridgroup/gobot/platforms/firmata
http://gobot.io/http://git-scm.com/http://mercurial.selenic.com/wiki/Download
Forillustration,webuildasimpleapp,blinkingled.WeuseLEDontheboard,LEDonpin13.
Nowwecreateprojectcalledledgobotbycreatingafolder,ledgobot.$mkdirledgobot$cdledgobot
Createafile,calledmain.go.Writethefollowingcode.packagemain
import("fmt""time""github.com/hybridgroup/gobot""github.com/hybridgroup/gobot/platforms/firmata""github.com/hybridgroup/gobot/platforms/gpio")
funcmain(){gbot:=gobot.NewGobot()
//changeArduinoport,windowsCOMx.Linux/dev/ttyACMxfirmataAdaptor:=firmata.NewFirmataAdaptor("arduino","COM6")led:=gpio.NewLedDriver(firmataAdaptor,"led","13")
//functiontorunledblinkingwork:=func(){gobot.Every(1*time.Second,func(){fmt.Println("ledtoggling..")led.Toggle()})}
gbot.AddRobot(gobot.NewRobot("bot",[]gobot.Connection{firmataAdaptor},[]gobot.Device{led},work,))
gbot.Start()}
Savethiscodeandrunit.
Nowyoucanbuildandrunthisprogram.DontforgettoconnectyourArduinointoPCviaUSB.
$gobuild
$gorunmain.go
Onconsole,youcanseetheoutputasbelow.
Then,youcanseeLEDisblinkingontheArduinoboard.
3.3go-firmata
ThesecondFirmatapackageforGoisgo-firmata.Youcanreaditonhttps://github.com/kraman/go-firmata.Youcaninstallthispackagebytypingthiscommand.
$gogetgithub.com/kraman/go-firmata
Forillustration,webuildasimpleapp,blinkingled.WeuseLEDontheboard,LEDonpin13.
Nowwecreateprojectcalledfirmataclientbycreatingafolder,firmataclient.$mkdirfirmataclient$cdfirmataclient
Createafile,calledmain.go.Writethefollowingcode.packagemain
import("fmt""time""github.com/kraman/go-firmata"
)
funcmain(){board,err:=firmata.NewClient("COM6",57600)iferr!=nil{panic(err)}deferboard.Close()fmt.Println("SetPinMode")board.SetPinMode(13,firmata.Output)
gofunc(){fmt.Println("gorun")for{fmt.Println("LEDON")board.DigitalWrite(13,true)time.Sleep(1*time.Second)fmt.Println("LEDOFF")board.DigitalWrite(13,false)time.Sleep(1*time.Second)}}()
//pressENTERtoexitfmt.Println("pressEntertoexit..")
https://github.com/kraman/go-firmata
varinputstringfmt.Scanln(&input)fmt.Println("done")}
Savethiscodeandrunit.
Nowyoucanbuildandrunthisprogram.DontforgettoconnectyourArduinointoPCviaUSB.
$gobuild$gorunmain.go
Onconsole,youcanseetheoutputasbelow.
3.4ReadingDigitalInput
Aftercreatedablinkingled,wecancontinuetobuildappwhichreadsdigitalinput.Weneedaswitch/buttonandaLED.ConnectyourdigitalswitchonArduinodigitalpin6andLEDonArduinodigital9.
3.4.1gobot
Youcreateprojectcalledgobuttonbycreatingafolder,gobutton.$mkdirgobutton$cdgobutton
Createafile,calledmain.go.Writethefollowingcode.packagemain
import("fmt""time""github.com/hybridgroup/gobot""github.com/hybridgroup/gobot/platforms/firmata""github.com/hybridgroup/gobot/platforms/gpio")
funcmain(){
gbot:=gobot.NewGobot()
//changeArduinoport,windowsCOMx.Linux/dev/ttyACMxfirmataAdaptor:=firmata.NewFirmataAdaptor("myFirmata","COM6")
//createabuttonondigitalpin6andaledondigitalpin9button:=gpio.NewButtonDriver(firmataAdaptor,"myButton","6")led:=gpio.NewLedDriver(firmataAdaptor,"led","9")
work:=func(){gobot.On(button.Event("push"),func(datainterface{}){fmt.Println("buttonispressed")led.On()})gobot.On(button.Event("release"),func(datainterface{}){fmt.Println("buttonisreleased")led.Off()})}
gbot.AddRobot(gobot.NewRobot("bot",
[]gobot.Connection{firmataAdaptor},[]gobot.Device{button,led},work,))
gbot.Start()
}
Savethiscodeandrunit.
Nowyoucanbuildandrunthisprogram.DontforgettoconnectyourArduinointoPCviaUSB.
$gobuild$gorunmain.go
PressthebuttonsoyoucanseeLEDisON.
Onconsole,youcanseetheoutputasbelow.
Asampleoutputonhardwareschema.
3.4.2go-firmata
Createprojectcalledfirmatabuttonbycreatingafolder,firmatabutton.$mkdirfirmatabutton$cdfirmatabutton
Createafile,calledmain.go.Writethefollowingcode.packagemain
import("fmt""time""github.com/kraman/go-firmata"
)
funcmain(){board,err:=firmata.NewClient("COM6",57600)iferr!=nil{panic(err)}deferboard.Close()//LEDondigitalpin9board.SetPinMode(9,firmata.Output)//buttonondigitalpin6board.SetPinMode(6,firmata.Input)board.EnableDigitalInput(6,true)
gofunc(){
forbuttonVal:=rangeboard.GetValues(){_,val,_:=firmata.FirmataValue(buttonVal).GetDigitalValue()
ifval[6]==true{fmt.Println("LEDON")board.DigitalWrite(9,true)}else{fmt.Println("LEDOFF")board.DigitalWrite(9,false)}
time.Sleep(700*time.Millisecond)}
}()
//pressENTERtoexitfmt.Println("pressEntertoexit..")varinputstringfmt.Scanln(&input)fmt.Println("done")}
Savethiscodeandrunit.
Nowyoucanbuildandrunthisprogram.DontforgettoconnectyourArduinointoPCviaUSB.
$gobuild
$gorunmain.go
PressthebuttonsoyoucanseeLEDisON.
Onconsole,youcanseetheoutputasbelow.
4.AnalogSensor
InthischapterImgoingtoexplainhowtoaccesssensordataonArduinowithsensordevice.Inthissection,Iusego-firmata,https://github.com/kraman/go-firmatatodevelopGoapplicationtoaccesssensordeviceonArduino.
https://github.com/kraman/go-firmata
4.1SensorDevices
Arduinocanbeinterfacedwithsensordevices.Youcanseethelistofsensorinterfaceonhttp://playground.arduino.cc/Main/InterfacingWithHardware.
Inthisscenario,weusecheapsensordevices,ThemistorsandLDR(LightDependentResistors).ThermistorcanbeusedtomeasuretemperatureandLDRcanbeusedtomeasurelightanddarkbasedonillumination.
IhaveThermistor503andLDRfromArduinoSidekickBasickit.
Forbuildingsensorhardware,weneed2resistors,50kohmand10kohm.Ifyourthermistoris10kohm,youshouldusearesistorwith10kohm.
ThefollowingisacircuitschemaforThermistorandLDRsensors.
http://playground.arduino.cc/Main/InterfacingWithHardware
Oneofsensorpinisconnectedto5VArduinopin.Weuseadividerapproach.Thermistor503isattachedtotheAnalogInofArduino,A0.Otherwise,LDRisattachedtoA2.
YoumayattachLEDastheindicatorforsensorreadingstate.Youcanuseasolutiononchapter2,Blinkapp.
Hereisasampleofhardwareimplementation.
YoualsocanuseArduinoshieldwhichsensordevicesarebeconnected,forinstance,IuseLinkerkitfromhttp://store.linksprite.com/linker-kit/withthefollowingsensoritems:
LDR,http://store.linksprite.com/ldr-ambient-light-module-of-linker-kit-for-pcduino-arduino/Temperaturesensor,http://store.linksprite.com/thermal-module-of-linker-kit-for-pcduino-arduino/
HardwareimplementationcanbeseeninFigurebelow.
http://store.linksprite.com/linker-kit/http://store.linksprite.com/ldr-ambient-light-module-of-linker-kit-for-pcduino-arduino/http://store.linksprite.com/thermal-module-of-linker-kit-for-pcduino-arduino/
4.2ReadingSensor
HowtoreadthesensordatafromArduino?.Weusego-firmata,https://github.com/kraman/go-firmata.ToaccessArduinoAnalogfromFirmata,wecanconvertthefollowingpin:
ArduinoanalogA0>Firmatapin14ArduinoanalogA1>Firmatapin15ArduinoanalogA2>Firmatapin16ArduinoanalogA3>Firmatapin17
Firstly,wecreateprojectcalledsensordemobycreatingafolder,sensordemo.$mkdirsensordemo$cdsensordemo
Createafile,calledmain.go.Writethefollowingcode.packagemain
import("fmt""math""time"arduino"github.com/kraman/go-firmata"
)
funcmain(){board,err:=arduino.NewClient("COM6",57600)iferr!=nil{panic(err)}deferboard.Close()
//LDRonA0=Pin14err1:=board.EnableAnalogInput(14,true)iferr1!=nil{panic(err1)}//TemperatureonA2=Pin16err2:=board.EnableAnalogInput(16,true)iferr2!=nil{panic(err2)}gofunc(){
for{
https://github.com/kraman/go-firmata
forsensorVal:=rangeboard.GetValues(){pin,val,_:=arduino.FirmataValue(sensorVal).GetAnalogValue()fmt.Println(pin,":",val)
ifpin==16{//linkerkittemperatureC:=CalculateTempLinkerKit(float64(val))//Thermistor//temperatureC:=CalculateThermistor(float64(val))fmt.Println("Temperature:",temperatureC,"degreesC"}
ifpin==14{
//ifyouuseLDR//ldr:=val//ifyouuseLDRfromlinkerkitldr:=CalculateLDR(float64(val))ifldr