79

Getting Started With Arduino and Go by Agus Kurniawan

Embed Size (px)

DESCRIPTION

Libro de Arduino

Citation preview

  • 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