Skip to content

Instantly share code, notes, and snippets.

@rwaldron
Forked from max-mapper/helloworld.js
Created November 29, 2012 01:06
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rwaldron/4166018 to your computer and use it in GitHub Desktop.
Save rwaldron/4166018 to your computer and use it in GitHub Desktop.
droneduino

droneduino

parrot ar drone 2.0 arduino communication with node

possible other names: ardrono, dronenodeuino, ardronenodeuino, arnodedroneduino ahahahah

above shot is from @rem

getting node on the drone

  • download node and node-serialport from https://github.com/felixge/node-cross-compiler/downloads
  • untar node-serialport and put node and the node-serialport folder onto a usb thumbstick thingy
  • put the thumbstick thingy into the drone (like in the above photo)
  • telnet into drone, telnet 192.168.1.1
  • cd /data/video
  • cp usb/node . (it might be usb1)
  • chmod +x node
  • mkdir node_modules
  • cp -r usb/node-serialport/ node_modules/
  • note: you can use node-serialport to get data from arduino but you can't use johnny-five because it depends on firmata which doesn't support Tx/Rx serial communication
  • this last point means you have to write actual arduino sketches and upload them to the arduino directly, but you can still write node code that runs on the drone to reads the serial data

here is where things get tricky

  • be very careful that you don't eff up your drone! proceed with caution
  • the drone has a female USB port exposed next to the battery connector but unfortunately it is hardcoded into host mode so it can only be used with mass storage devices :(
  • that last point is based on my naive understanding of electronics. prove me wrong and fork these instructions!
  • there is another serial console on the drone motherboard
  • open up the bottom of the drone under the little piece of black tape to expose a buncha plastic hole thingies:

  • turns out this is a 3.3v TTL serial port. this awesome post by jazzomaniak is where I figured this out
  • here is a pinout from jazzomaniak:

  • you'll wanna get some thinnish gauge wire (around AWG 16 I reckon, AWG 22 is for most breadboards and my 22 wire didn't fit into the drone serial ports)
  • get an arduino uno which provides 5v or 3.3v TTL serial via digital ports (Rx and Tx). due and uno have this, not sure about others
  • hook up a wire from the Tx of the drone to the Rx of the arduino and Rx drone to Tx arduino. also hook up arduino GND to drone GND (#10)
  • here is a shot from @rem of drone with the entire bottom cover removed

  • you can also theoretically power the arduino from #8 and #9 on the drone if you hook them up to a barrel power jack thingy for the arduino (or use the Vin and GND pins for the same effect). I haven't hooked this up yet cause I ran out of cables. @rem in the comments below said he got it working
  • you can also use the other USB port on the drone to power the arduino, but I don't have a short enough USB cable for this
  • upload the sketch in this gist called helloworld.pde to the arduino
  • in a telnet shell on the drone type cat /proc/cmdline and find out which tty device the 'console' is set to. on my drone it was ttyO3
  • set the tty socket to raw mode: stty -F /dev/ttyO3 -raw
  • verify the baud rate of the socket: stty -F /dev/ttyO3. mine originally said 115200 but after messing with it it seems to change to 9600. the arduino sketch and the node code running on the drone need to both contain whatever stty tells you the baud rate is for communication to work.

  • the Input/output error above is because I was sending serial data from the arduino into the drone. I unplugged the serial cables from the arduino and tried the command again and it worked. I think it was around this time that the drone decided to switch baud rates to 9600

  • go into a node repl (./node) and copy paste in helloworld.js from this gist

var serialport = require('node-serialport')
var sp = new serialport.SerialPort("/dev/ttyO3", {
parser: serialport.parsers.raw,
baud: 9600
})
sp.on('data', function(chunk) {
console.log(chunk.toString('hex'), chunk.toString(), chunk)
})
void setup()
{
Serial.begin(9600);
}
void loop()
{
Serial.println("hello");
delay(10);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment