Better With Friends: Android+NFC+Arduino


Published on

Published in: Technology

Better With Friends: Android+NFC+Arduino

  1. 1. NFC Bluetooth Open Accessory Better with Friends(Or "Android: The Loveable Mobile Platform That Plays Well with External Devices") Pearl Chen Google+: Twitter: @PearlChen
  2. 2. The future is already here— its just not very evenly distributed. William Gibson
  3. 3. About meSome Comp Sci classes back there too ( Illustration created using modified output from and my LinkedIn profile. )
  4. 4. Some of my web projects
  5. 5. Some of non-web my projects
  6. 6. What inspires me A-Nerve by CuteCircuit
  7. 7. The Third Industrial Revolution From The Economist, April 2012A number of remarkable technologies are converging: clever software, novel materials, more dexterous robots, new processes (notably 3Dprinting) and a whole range of web-based services. The factory of the past was based on cranking out zillions of identical products. The factory of the future will focus on mass customisation.
  8. 8. Microcontrollers Arduino MaKey MaKey Basic Stamp1975: Microchip PIC
  9. 9. Hardware startups becoming viable Pebble Kickstarter campaign as of June 2012 [The founder] also shared a photo of the first Pebble prototype using an Arduino and some similarly cobbled-together hardware. That was four years ago. via Slashgear
  10. 10. Looking at the hardware trends• Small, yet mighty• Multi-screen• Always on• $$$ ⇾ $ Project Glass by Google Steve Mann - world’s first cyborg
  11. 11. ...and the software trends Location, location, location. Context, context, context.
  12. 12. And how is this related to Android?This talk will cover:• External hardware integration with Android Open Accessory• NFC for low-friction interactions (not related to mobile payments)• Combining with Bluetooth
  13. 13. Professional Android Sensor Programming Disclaimer: I authored chapter 11 (NFC) & co-authored 10 (AOA) (more info here)
  14. 14. Android Open Accessory
  15. 15. Android Open Accessory - Demo!
  16. 16. Android Development Kit (ADK) Arduino Mega ADK
  17. 17. More Android Development Kits! SparkFun IOIO Microchip PIC24F ADK ODroid ADK
  18. 18. Basic firmware/sketch on Arduino ADKNote: You can get a fully working but barebones Arduino ADK sketch here: <Max3421e.h> USB and USB host libraries#include <Usb.h>#include <AndroidAccessory.h> Google-supplied C++ library Create a new instance of the AndroidAccessoryAndroidAccessory acc("Manufacturer", "Model",                     "Description", "1.0",                     "",                     "0000000012345678");void setup() { Convenience method that simply calls the acc.powerOn(); powerOn() method in the Max3421e library.}void loop() { byte msg[0]; Continually check for connection to Android app  if (acc.isConnected()) {    //send something to the Android app acc.write(msg, 1); Create data that the Android app can read    //or read something int len =, sizeof(msg), 1); Read data from Android app into msg variable  }}
  19. 19. Accessory Filter ResourceIn xml/accessory_filter.xml:<resources> <usb-accessory manufacturer="Manufacturer" model="Model" Needs to match the Arduino sketch exactly version="1.0" /></resources>
  20. 20. Android ManifestIn AndroidManifest.xml (3.1+):<manifest ...> <uses-sdk android:minSdkVersion="12" /> <uses-feature android:name="android.hardware.usb.accessory" /> <application ...> <activity ...> <meta-data android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" android:resource="@xml/accessory_filter" /> From previous slide <intent-filter> <action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"/> </intent-filter> Use intent filter to launch this activity when ADK is plugged in </activity> </application></manifest>
  21. 21. ActivityIn the .java file for your Activity (3.1+):import;import;//...UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);UsbAccessory accessory = (UsbAccessory) intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);ParcelFileDescriptor fileDescriptor = manager.openAccessory(accessory);FileDescriptor fd = fileDescriptor.getFileDescriptor();FileInputStream inputStream = new FileInputStream(fd);byte[] buffer = new byte[16384]; Read data from the Arduinoint ret =; via a FileInputStreamFileOutputStream outputStream = new FileOutputStream(fd);mOutputStream.write(buffer); Write data to the Arduino via a FileOutputStream
  22. 22. Project ideasSo what can you make with the Open Accessory APIsand an Arduino? Things already 1+1=3 available Super on your phone awesome stuff! Electronics components you can add
  23. 23. Things already available on your phone accelerometer touch screen GPS camera wifi/3G mass storage proximity/light temperature sensor sensors microphone NFC
  24. 24. Electronics components you can add Electronics inputs and outputs using LittleBits as an example of various components
  25. 25. Super awesome stuff! Music Beta: “Now Playing” by Chris Juergen  Aerogarden Monitor by Sam Steele  Space Spheres by NASA Floating Sensor Project by UC Berkeley
  26. 26. Why Open Accessories are “open”• iOS developer fees: $99/yr. • Fill out zero forms to start developing.• Approval required to be in MFi program; must sign NDAs. • Pay nothing to Google -- now or ever.• Additional Apple licensing fees and 3rd party certification. • No approval process from Google to go to market.• Final product needs to be approved by Apple • USB connectors and drivers are readily available.• One supplier (Avent) produces the connectors.
  27. 27. Speaking of connectors...
  28. 28. Are there wireless ADKs? Bluetooth Shields IOIO w/USB Bluetooth dongle Coming soon? Wifi Shield w/ integrated chip Coming soon? ADK2012
  29. 29. NFC(near field communications)
  30. 30. What is NFC? NFC Scanner Radiowaves NFC Sticker: antenna and flash storage
  31. 31. How is it different than RFID? Low frequency radio waves can travel far distances. 13.56MHz = NFC High frequency waves cannot. NFC works within 10cm only.
  32. 32. How is it different than RFID?Storage with RFID is also limited to simple IDsversus the complex data NFC tags can hold.NFC Forum Popular Products Operations Rewrite Capabilities Available Memory Communication Price RangeType of This Type Specifications Speed (price per unit)1 Broadcom Topaz ISO 14443A User rewritable; can be 96 bytes, expandable to 2KB 106kbit/s Low marked as read-only by (~$1-2 USD) user2 MIFARE ISO 14443A User rewritable; can be 48 bytes, 144 bytes is 106kbit/s Low UltraLight marked as read-only by common, expandable to 2KB (~$1-2 USD) user3 Sony FeliCa JIS X 6319-4 Manufacture pre- variable, theoretical 1MB 212kbit/s or High configured to be read- 424kbit/s (~$8-10 USD or only or re-writable. higher)4 NXP DESFire, NXP ISO 14443A, Manufacture pre- 4KBfor DESFire, up to Up to 424kbit/s Medium-High SmartFX ISO 14443B configured to be read- 32KBfor SmartFX (~$3-4 USD) only or rewritable.MIFARE Operations Specifications Rewrite Capabilities Available Memory Communicatio Price RangeType n Speed (price per unit)Classic 1K ISO 14443A compatible, but NDEF User rewritable; only 752 bytes 106kbit/s Low is formatted using a proprietary manufacturer can mark (~$1 USD) protocol as read-onlyClassic 4K ISO 14443A compatible, but NDEF User rewritable; only 3440 bytes 106kbit/s Low-Medium is formatted using a proprietary manufacturer can mark (~$2 USD) protocol as read-only
  33. 33. NFC - Demo!
  34. 34. Android ManifestIn AndroidManifest.xml (4.0+):<manifest ...> <uses-sdk android:minSdkVersion="10" /> <uses-feature android:name="android.hardware.nfc" android:required="true" /> <uses-permission android:name="android.permission.NFC" /> <application ...> <activity ...> <intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED"/> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> Could be custom MIME Type like: </intent-filter> application/root.gast.playground.nfc </activity> </application></manifest>
  35. 35. Activity - Reacting to NFC scansIn the .java file for your Activity:import android.nfc.NfcAdapter;import android.nfc.NfcAdapter.CreateNdefMessageCallback;import android.nfc.NfcEvent;//...NfcAdapter mNfcAdapter = NfcAdapter.getDefaultAdapter(this);Boolean nfcEnabled = mNfcAdapter.isEnabled(); Give priority to the foregroundmNfcAdapter.enableForegroundDispatch(this, activity to receive NFC scan intents. mNfcPendingIntent, mReadTagFilters, null); Enable Android Beam for peer-to-peermNfcAdapter.setNdefPushMessageCallback(this,this);
  36. 36. Activity - Formatting to NDEF FormatIn the .java file for your Activity:import android.nfc.NdefMessage;import android.nfc.NdefRecord;import;import;//...// get the values from the forms text fields:Editable nameField = mName.getText();JSONObject computerSpecs = new JSONObject(); JSON for readability, not performancecomputerSpecs.put("name", nameField);String data = computerSpecs.toString();// create a new NDEF record w/ NDEF message using the apps custom MIME type:String mimeType = "application/root.gast.playground.nfc"; Unique to your appbyte[] mimeBytes = mimeType.getBytes(Charset.forName("UTF-8"));byte[] dataBytes = data.getBytes(Charset.forName("UTF-8"));byte[] id = new byte[0];NdefRecord record = new NdefRecord(NdefRecord.TNF_MIME_MEDIA, mimeBytes, id, dataBytes); Not hard at all!NdefMessage m = new NdefMessage(new NdefRecord[] { record });
  37. 37. Activity - Reading NDEF FormatIn the .java file for your Activity:import android.nfc.Tag;//...Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);NdefMessage[] msgs = new NdefMessage[rawMsgs.length];for (int i = 0; i < rawMsgs.length; i++) { msgs[i] = (NdefMessage) rawMsgs[i];}NdefRecord record = msgs[0].getRecords()[0]; The info you wanted.byte[] payload = record.getPayload(); (e.g. string or json)
  38. 38. A case for NFC• Create low friction interactions• Augment physical objects (even offline)• Make your software app more tangible• Engage others to share and connect• Increase the viralness of your app• Possibility to be platform agnostic
  39. 39. Mobile OS support for NFC Chart updated for Sept 27, 2012
  40. 40. Don’t worry, this isn’t Apple bashing... Hey! What By touchingdid you just do phones? there? Oh, I just sent him a playlist.
  41. 41. Thank you! Oh, and check out some upcoming Arduino workshops! Sign up for mailing list on Pearl Chen Google+: Twitter: @PearlChen