public
Last active

droneduino

  • Download Gist
helloworld.js
JavaScript
1 2 3 4 5 6 7 8 9 10
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)
})
helloworld.pde
Processing
1 2 3 4 5 6 7 8 9 10
void setup()
{
Serial.begin(9600);
}
 
void loop()
{
Serial.println("hello");
delay(10);
}
readme.md
Markdown

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
  • also I found out that since the serial port on the drone is intended as a debug console you will get a bunch of debug data spewing out at you from the boards Tx pin. I don't know how to turn it off at this time. what this means is you can send data into the drone over serial but you can't (to my knowledge -- someone should hack this) send data from the drone over serial to a device yet

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 has pins for TTL serial communication¬†and USB serial communication. this awesome post by jazzomaniak is where I figured this out
  • here is a pinout from jazzomaniak:

  • ** it has come to my attention that the serial console tx/rx pins on the AR Drone 2 run at 1.8v which means you'll need a level converter to talk to the arduino. here is a schematic from the mirumod project that shows where the level converter should be installed **
  • without a level converter i still was able to receive and transmit serial data from arduino to drone but it was flaky. i believe (but have not yet tested) that after fixing the voltage mismatch that communication will be much more reliable
  • 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
  • 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

This is so full of awesome!!

BTW, where you say " if you hook them up to a barrel power jack thingy ", you can also use Vin and Gnd pins for exactly the same effect.

wat! this is rad!!!

@luismreis OHH thanks!

Just got this working - awesome work @maxogden.

For other people playing - my drone would give a red light in the motherboard when it booted with the arduino attached - this meant that the boot up had failed and thus wifi wasn't going to start up.

The solution is to simply attach the arduino after the drone has booted up.

I also powered the arduino from the USB+GND (8) and USB+5 (9) and just wired them in to the GND and Vin connectors respectively on my arduino and the power runs through.

One thing to note (IIRC) - when I tested the helloword.pde file from my machine to the arduino, the RX+TX lights were flashing away. Once connected to the drone, this didn't happen - and I initially assumed it wasn't working. But lo and behold, connect using node.js - and you get your "hello world" pumped down the serial connection.

I should also add that my baud rate remained at 115200 - but my sketch and node.js code used 9600. Not sure how it changed, but it just seemed to work (when I checked the baud rate after running the node.js script - it was showing 9600).

Awesome work Max. My next plans: Plan A - upload a sketch to read proximity data. Plan B: wire up a USB female connector (already on it way to me) so I can use @rwldrn's Johnny-five :)

Do you know offhand if this would (be expected to) work on a "1.0" ardrone? I might have access to one shortly...

@rklancer there will be differences in the drone serial pinout as well as processor architecture so you may need to cross compile node and node-serialport against a different target.

This is so cool

Hi
Does anybody know what kind of chip is on the AR drone main board?
It is marked U1600, having the following inscription on it:
YE 06
(It is placed near the double LED and nav board connector)

So having node onboard you are able to program flight control? Does this take away the ability to use the highlevel APIs provided by the manufacture to control the drone via wifi?

@prozachj the firmware is closed source so you still have to interface with the drones flight control but being able to run node on the drone allows for autonomous control rather than having to rely on wifi range

Why would you want to do this? Is the idea to write flight control code in JS?

I want to get my GPS(uBlox Lea6) running. The problem is, I only receive the first 16 ASCII caracters. For those who are interested in it, it is an NMEA GGA message. Is it normal, or did I do anything wrong. Or is there a way to fix it. I am trying to avoid an extra arduino which would convert the message.

Thank you!!
I can get 'hello' from arduino via ARDrone console by following this page.

I was beginning to open the serial port rxtx, today I connect my arduino to the ar drone and I get the data from the ardrone (port ttyO3) through of telnet, I want to do a control program the ardrone and I can get the dato from the serial port, do you know, How I can get the data from the serial port in a program?
thanks

Hi,
is this the correct way to wire the level shifter?
http://img822.imageshack.us/img822/1589/je6e.jpg

When connected to the Arduino, is it be possible to send the emergency landing command (client._ref.emergency = true) with a wireless device like a mobile or a pc?

Thanks in advance!

can i connect 3 sensors with this? tnx.

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.