Top Banner
79

Getting Started With Arduino and Go by Agus Kurniawan

Nov 18, 2015

Download

Documents

edujulian

Libro de Arduino
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
  • 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