Top Banner

Click here to load reader

Physical Computing Using Go and Arduino

Aug 17, 2014


Using the Google's Go Programming language on App Engine to capture realtime sensor data from an Arduino over the internet.

  • Go and Get Physical with the Cloud Using Arduino with Google App Engine for Go ! Justin Grammens [email protected]
  • I Want to Build Something! Goal : Track movement using a motion sensor Technology Requirements: Use Go Use Google App Engine Use Arduino Send text message when movement occurs
  • What Well Cover Go Programming Language Deployment on Google App Engine ( using Go ) REST interface on App Engine ( using go-restful ) Reading sensor data on Arduino Sending data to our application on App Engine Send message to 3rd party SMS provider ( Twillio )
  • Block Diagram App Engine ArduinoBrowser SMS Service
  • Go Programming Language Developed by Google in 2007 Statically typed language, loosely derived from C. Automatic memory management FAST compilation and execution! Download at:
  • Go Language Key Points Some dynamic typing ( x:= 0 instead of int x = 0 ) Remote package management ( go get ) Built in mechanisms for concurrency Able to produce statically linked native binaries Strong focus on support for concurrency
  • Go Language Key Points No type inheritance No method overloading Has pointers, but no pointer arithmetic (ie. cant be changed) No generics (a la List in Java for instance) No Exceptions - instead uses an error return type func Open(name string) (le *File, err error)
  • Workspaces Designed from the ground up to work with code in public repositories $GOPATH variable points to your workspace location Put your code in a unique path convention is: $GOPATH/src/github/user/project
  • Example Workspace bin/ hello # command executable pkg/ darwin_amd64/ mydate.a # package object src/ hello/ .git/ # git repository metadata hello.go # package source mydate/ .git/ # git repository metadata mydate.go # package source
  • IDEs / Editors with Plugins Emacs Eclipse - ( GoClipse ) IntelliJ IDEA Sublime Text TextMate Vim
  • Example: hello.go git clone gdev ! package main import "fmt" func main() { fmt.Println("hello world") } !
  • Example: hello-world.go usage: type go on command line $: go run hello.go hello world ! $: go install $: $GOPATH/bin/hello ! $ go build ./hello ( note the size of the executable )
  • Writing a Library package mydate ! import "time" ! func Birthdate() time.Time { d := time.Date(2014, time.May, 6, 0, 0, 0, 0, time.UTC) return d } Return type Capital letter means public access Calling function
  • Publish Library git push to public repository: justingrammens/gdev Access with: import examples/mydate Anyone can install to their workspace with: go get examples/mydate
  • Calling Library package main ! import "fmt" import "" import "time" ! func main() { now := time.Now() birthday := mydate.Birthdate() diff := birthday.YearDay() - now.YearDay() fmt.Printf("There are only %d days to my birthday!n", diff ) }
  • Example: Functions can return multiple values: func AddandSub(x, y int) (sum, difference int) { sum = x + y difference = x - y return } Called with: sum, difference := mydate.AddandSub(10, 11)
  • App Engine Using Go Platform as a Service (PaSS) Run applications in Googles infrastructure Frees you up to develop, not system admin Develop and test locally, deploy globally Beware - Go is Experimental!
  • App Engine Using Go Deployed to [your_app_id] Quotas: Request & Response Size - 32 MB Request Duration - 60 sec Max total les - 10,000 total : 1,000 per directory Max size les - 32 MB
  • App Engine Using Go Run goapp to see commands goapp serve : runs local server goapp deploy : upload to App Engine
  • App Engine Using Go Run Hello World Example cd appengine-examples goapp server Local service: http://localhost:8080 Local datastore viewer: http://localhost:8000
  • App Engine Using Go No standard REST framework out of the box Use go-restful project Easy install and setup with go get command Resources: Events Sms
  • App Engine Using Go Run DevFest App cd devfest goapp server Access swagger for API at http://localhost:8080/apidocs Push update to google app engine at: --oauth2 update my app Manage at:
  • Test Web Service Simple REST Client Verify the values are being stored Toggle values for SMS notications
  • Arduino Open source microcontroller board Started in Italy in 2005 as a college student project Based on a simplied version of C++ ( Wiring ) Allows for adding additional boards via shields WIFI shield is added for our project Many readily available sensors and libraries!
  • Arduino Wi Shield
  • Hardware Parts PIR Motion Sensor - $9.95 Arduino R3 Board - $30.00 Ofcial Arduino WIFI Shield - $70.00
  • Schematic
  • Arduino Basics Only 2 functions are required ! void setup() { // put your setup code here, to run once. } ! void loop() { // put your main code here, to run repeatedly. }
  • Motion Sample Code Motion activated by: Takes an infrared snapshot of the room If anything changes, pin #2 goes LOW Use the digitalRead of values Use WiClient to Post JSON to our web service. Print the status to the serial monitor.
  • Resources Play with Go Code!!forum/google- appengine-go - Local Arduino users group!
  • Thanks! Questions?