วันอังคารที่ 5 มิถุนายน พ.ศ. 2555

IOIO Board over Bluetooth


IOIO Board over Bluetooth (ภาษาไทย ด้านล่าง )

IOIO Basic
With a firmware upgrade on the IOIO, it now supports connecting a standard Bluetooth dongle into its USB jack and is able to establish its connection to the Android phone wirelessly! This actually makes IOIO one of the cheapest, simplest and most powerful Bluetooth-enabled prototyping platforms out there. And some more good news: your application code stays exactly the same. That's the way it should be as far as I'm concerned. End-users should care about what they want to do with their hardware for their project, not about how the heck (or how the hack) to communicate with it. So you only need to write the application-specific code (the source code for the application demonstrated above takes less than 30 lines of Java for the IOIO-related stuff), and it seamlessly works on any kind of connection and can even switch from one to another while running. I don't know of any existing platforms that will let you do that so easily and cheaply. The closest one probably being Amarino. Keep in mind that IOIO is also capable of USB connectivity to Android of course (ADB or OpenAccessory), giving superior reliability latency and bandwidth compared to Bluetooth. You do the comparison. 

IOIO Bluetooth Development
Although I think there is some real kick-ass little revolution here, this post is going to be more of a story than my usual bunch of technical specs. I'm just in this kind of mood more than the check-out-this-awesome-stuff mood.
Back when I published my original announcement on IOIO, one of the commenters (Inopia, thanks, man!) cleverly noted that since IOIO is a USB host, using a standard Bluetooth dongle in order to make the connection wireless is just a matter of writing the right firmware. He was right! And I immediately fell in love with the idea and with the challenge it presented. I felt that from all the million features I could develop next, this one will be the real killer. Just imagine: a couple of bucks (cheapest dongle I found is $1.80 including shipping from DealExtreme) and you have yourself a whole new range of possibilities: home automation, R/C toys, and much more.

Slowly I began to realize some really cool side-effects that this will have. First, the current inability (or more precisely, complexity) to use IOIO and debug your Android at the same time would go away. Second, we're no longer limited to an Android - control IOIO from any Bluetooth-enabled device: IOIOLib is just a bunch of Java code that can easily be ported to other platforms (or rewritten if need be). Third, we're no longer limited to just one IOIO controlled by a single host application.
You get the point. I just had to do it. One problem: I don't know Jack about Bluetooth. Only know enough to know that it's definitely doable. That's where the second key actor in this story comes in. I'm digging the Web for open-source Bluetooth stack implementations. Pretty soon I come across btstack, developed by Matthias Ringwald. I also found other options, and at that point, I was not completely sure which one to choose. So I contact Matthias and I start checking out the code of several projects, and throw some of them away for lack of maintenance and others for having Spaghetti code. But btstack turns out to be just perfect. Easy to port, very clean code, doesn't use the memory heap (embedded heaven), active maintenance and great discussion and support forum. Matthias really got it right (at least my idea of getting this sort of things right). Two nights later (mostly struggling with implementing the USB driver for the dongle), and I'm able to open an end-to-end connection from my phone to the IOIO. Then a few weeks of finding these tiny, cruel bugs and getting everything nicely packaged and documented, etc.
And as I said, not a moment too soon! I got to Android Open two days after having a working demo. There I met Aaron Weiss from SparkFun face-to-face for the first time. Aaron is the engineer from SparkFun's side that worked on IOIO from day one. Meeting him and having him stand next to me while presenting was really great!
At the conference, I attended a keynote by Massimo Banzi, one of the two founders of Arduino. I really admire his work, especially after having taught a course on Arduino that enabled non-techie designers build the most awesome stuff. Quite a great keynote he gave, and a little later I've had the honor of presenting myself and inviting him to see my demo. And he came, and was so kind and positive and that really meant a lot to me.

The moment I came home after the conference I fell ill for a few days. Totally exhausted. Haven't had a decent sleep in a few weeks. I took a few days off, and then back to work: a demo is nice, but I gotta get this thing released. Fortunately, when preparing the demo I wasn't playing quick 'n' dirty. So I just needed some polish, but no throw-away code. And finally, I'm happy with it and feel confident enough releasing it. It's not perfect-perfect, as multi-device support still needs some care. But it's reliable and definitely useful as-is. I made a video explaining users how to upgrade their IOIO to the new feature, building on top of the firmware upgrade capabilities that I previously enabled. Some have already reported success.

More information (and the instructional video) can be found here.
IOIO can be purchased from SparkFun (about $50) here.
The cheapest ($1.80 incl. shipping) Bluetooth dongle I found and tested is here.
Questions are happily answered on the ioio-users discussion group.

What's next?
There are several possible directions I'm considering (your comments welcome):
  • Supporting the multi-IOIO use-case properly.
  • Supporting WiFi dongle (imagine that!).
  • Releasing OpenAccessory support in non-Beta mode (now the ground is properly laid, with new bootloader and connection abstraction layers).
  • Adding long overdue features that users requested such as infrared remote control protocol, synchronous parallel I/O, quadrature encoder, PPM output, etc. 


IOIO Board over Bluetooth (ภาษาไทย)

ด้วยอัพเกรดเฟิร์มแวร์ กับ IOIO แต่จะสนับสนุนการใช้งานผ่านบลูทูธดองเกิลมาตรฐานในช่องต่อ USB และสามารถที่จะสร้างการเชื่อมต่อกับโทรศัพท์ Android แบบไร้สาย! ที่ง่ายและมีประสิทธิภาพที่สุด ในราคาประหยัด การงานใช้ Bluetooth แพลตฟอร์มต้นแบบ ออกแบบให้ใช้ code โปรแกรมที่สามารถใช้ code เดิมได้ด้วย ส่วนมากผู้ใช้งานจะกังวลเรื่องการใช้ควบคุมและสื่อสารกับ Hardware ในงานที่ทำของเขา ส่วนการใช้งานกับ IOIO Board นั้นง่ายมากเพียงเขียนโค้ดโปรแกรมประยุกต์เฉพาะ (สำหรับแอพลิเคชันดังกล่าวในตัวอย่าง code ใช้ JAVA code น้อยกว่า 30 บรรทัดในการควบคุม IOIO ) และสามารถเลือกการเชื่อมต่ออัติโนมัติ ได้ทั้งแบบไร้สาย ( Bluetooth )และแบบใช้สาย (แบบเดิม) และยังสามารถเปลี่ยนจากแบบหนึ่งไปยังอีกแบบได้ ในขณะที่ทำงาน ผมไม่ทราบว่าของแพลตฟอร์มใดๆ ที่มีอยู่ขณะนี้ ที่จะช่วยให้คุณใช้งานได้อย่างง่ายดายและราคาประหยัดแบบนี้ ที่ใกล้เคียงอาจจะเป็น Amarino  ข้อสำคัญ IOIO ยังสามารถเชื่อมต่อ USB กับ Android ในรูปแบบ (ADB หรือ OpenAccessory) ให้ความน่าใช้งานมากขึ้นในการเชื่อมต่อกับ Bluetooth ได้ด้วย คุณลองเปรียบเทียบพิจารณาดู

ถึงแม้ว่าผมจะคิดว่า สิ่งนี้เป็นการพัฒนาเพียง เล็ก ๆ น้อย ๆ  ในข้อความตอนนี้เป็นเรื่องราวมากขึ้นเกี่ยวกับ รายละเอียดทางเทคนิคที่นอกเหนือจากข้อมูลทั่วไป  ผมชอบที่อธิบายแบบนี้มากกว่าใน แบบที่เป็นแง่เทคนิค ย้อนกลับไปในช่วงที่เผยแพร่ข้อมูล IOIO Board  ผู้แสดงความคิดเห็นคนหนึ่ง (ชื่อ Inopia ขอบคุณมาก) ได้ตั้งข้อสังเกตว่า IOIO เป็น USB Host ดังนั้นจะสามารถใช้ ใช้บลูทูธดองเกิลมาตรฐานเพื่อที่จะทำให้การเชื่อมต่อแบบไร้สายได้ เพียงแค่ทำ firmware เพิ่มขึ้นมา เขาพูดถูกต้อง! และผมก็ชอบจริงๆกับความคิดนี้และมีความท้าทายอย่างมาก ผมรู้สึกว่าเราสามารถจะพัฒนาได้เป็นล้านๆ คุณสมบัติแต่ ความคิด Bluetooth นี้ยอดเยี่ยมที่สุด  ลองจินตนาการดูว่า : อุปกรณ์ แค่ ตัว (Bluetooth dongle ที่ถูกที่สุด คือ $ 1.80 รวมค่าจัดส่งจาก DealExtreme) และ IOIO Board คุณสามารถสร้างการใช้งานได้หลากหลายที่เป็นไปได้ เช่น ควบคุมบ้าน ควบคุมของเล่น  R / C  และอื่น ๆ อีกมากมาย

ผมอยากจะได้เห็นถึงผลกระทบ ถ้างานนี้สำเร็จจริงๆ  อย่างแรกเพิ่มความสามารถ(หรือเพิ่มประสิทธิ หรือซับซ้อน) เพื่อใช้ IOIO และ ใช้งาน Debug โปรแกรม Android ได้ในเวลาเดียวกัน ประการที่สอง ไม่ข้อจำกัด ในการใช้ Android ในการควบคุม IOIO จากอุปกรณ์ใด ๆ ที่ใช้ Bluetooth: IOIOLib เป็น Library ที่สามารถจะนำไปใช้กับแพลตฟอร์มอื่น ๆ ได้(หรือเขียนใหม่เองก็ได้) ประการที่สาม เราไม่จำกัด เพียงหนึ่ง IOIO Board ควบคุมโดยใช้งาน เพียงแบบโฮสต์เดียว

Android Developer

Android example code