Getting Flash and Arduino talking, and problems with AS3

Over the last year, i’ve heard a lot about Arduino, so I was quite gutted when I missed out on both the Arduino talk at BarcampBrighton2, and also on the Arduino session a few days later at FlashBrighton!
Nevertheless, I had to get an Arduino board and start experimenting. Jo had a few Arduino boards, so kindly dropped one round for me.

For me, the most interesting aspect is using the Arduino in conjunction with Flash, sending and recieiving data betwen the two. I realy like the twitter > flash > arduino > LCD display that Mario made. I found it quite inspirational.

Getting Flash and the Arduino talking is initially very, very easy. It takes no time at all to initially write your first “hello world” app - in this case a blinking LED. After that, I turned my attention to reading the output of a potentiometer, and display that in Flash. Again, this is very easy, espically when people have done it already, and you can copy and paste their code! Thanks Beltran, Brett, and Aral for sharing your code!
In no time I had a potentiometer controlling the brightness of an LED, and the Arduino writing the data to the serial port, which Flash was trace()ing to the output window.

Nothing’s that easy though, right? Indeed. I’m expecting values between 0 and 1023, and specifically in this instance, around 1023. This is what I got:

15:37:53:104 = 102
15:37:53:135 = 3
15:37:54:104 = 1023
15:37:55:119 = 1023
15:37:56:135 = 1023
15:37:57:119 = 102
15:37:57:135 = 3
15:37:58:119 = 1023
15:37:59:135 = 1023
15:38:0:151 = 1023
15:38:1:135 = 10
15:38:1:151 = 23
15:38:2:151 = 1023

How strange. As you can see, occasionally the output is split over more than one line. It also does the same on my laptop.
After a lot of hair-pulling, I’ve made a couple of examples, which you can test if you wish. You’ll need to change the port to the one serproxy (or equivalent) is set up to use.

Arduino code:
[code]
void setup()
{
Serial.begin(9600);
}

void loop()
{
Serial.println(”hello”);
delay(100);
}
[/code]

Actionscript 3 code:
[code]
import flash.events.*;
import flash.net.Socket;

trace(”__AS3 Example__”);
var socket:Socket = new Socket(”localhost”,5335);
socket.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
function socketDataHandler(event:ProgressEvent):void {
var now = new Date();
trace(now.getHours()+”:”+now.getMinutes()+”:”+now.getSeconds()+”:”+now.getMilliseconds()+” = “+socket.readUTFBytes(socket.bytesAvailable));
}
[/code]

Actionscript 2 code:
[code]
trace(”__AS2 Example__”);
var socket:XMLSocket = new XMLSocket();
socket.connect(”localhost”,5335);
socket.onData = function (data) {
var now = new Date();
trace(now.getHours()+”:”+now.getMinutes()+”:”+now.getSeconds()+”:”+now.getMilliseconds()+” = “+data);
}

[/code]

AS3 Output:

12:10:43:140 = hello

12:10:43:234 = hel
12:10:43:250 = lo

12:10:43:359 = hello

12:10:43:453 = h
12:10:43:453 = ello

12:10:43:562 = hello

AS2 Output:

12:11:25:406 = hello

12:11:25:515 = hello

12:11:25:625 = hello

12:11:25:718 = hello

12:11:25:812 = hello

12:11:25:921 = hello

AS3 has odd output, and AS2 has the expected output. It’s almost as if ProgressEvent.SOCKET_DATA is called too frequently?
I’ve looked at this, which may be a similar problem. Here’s my post on the Arduino forum which I wrote as I experienced the problem.

In the end I found AS3Glue, which “is an ActionScript 3 library that enables communication between Flash/Flex/AIR applications and Arduino boards”. This changes the way in which AS3 and the Arduino communicate, and fortunately solves the problem described above.

If you use AS3glue, you’ll also need to use the Arduino Firmata firmware. The firmware page also briefly mentions:

It turns out that the USB-serial drivers are optimized for fast bulk data transfer, and those optimizations actually wreak havoc with the timing of the messages over the USB-serial.

Perhaps that’s the problem i’ve experienced? If I can, i’d like to find out exactly what’s going on, but for now, as3glue will suffice :) If you can, please have a test and let me know if you get the same output!

3 Responses to “Getting Flash and Arduino talking, and problems with AS3”

  1. owen Says:

    Hi Iestyn,

    I also had troubles with connecting to the Arduino, but I think for different reasons - there are some issues with serproxy and older intel macbook pros which I solved using this serial socket server instead. It’s worth noting is that the Firmata firmware should be the only thing you need to upload to the Arduino board (until they release an updated version) as using it you can just control the board using Flash. It runs at 57600 baud rate by default.

    Owen

  2. Brett Forsyth Says:

    Thanks for the link(s). What you are running into isn’t a big deal to fix yourself. Relying on a message to show up in one packet can be dangerous. If you look at any of the example serial read scripts in arduino they typically loop over the buffer until an end character is found and then the message is processed. So you can do the same in flash. If you are sending data to flash with the Serial.println() function you can test for the new line character as the end of message at which point you can process it. Hope that helps.

  3. Iestyn Says:

    Hey Brett :)
    Thanks for that, that makes a lot of sense!

    For now, i’ll stick with AS3glue and Firmata, but if I need to go without, i’ll bear in mind what you’ve said.

Leave a Reply