project-image

Flutter: Low cost wireless project board with half mile (1km) range.

Created by Flutter Wireless (Address Verification)

Flutter is an open source ARM-powered wireless Arduino with 1000m+ (3200 ft) range and 256-bit AES hardware encryption.

Latest Updates from Our Project:

Flutter Micro Update Sept 24, 2016
over 7 years ago – Sat, Sep 24, 2016 at 07:22:10 PM

Hello humans!

Super brief micro update on where Flutter is at:

Last weekend I updated the Getting Started page with up to date instructions and graphics on how to install Flutter in the latest Arduino IDE. Some Windows users have reported issues with Flutter and the serial monitor so if you experience crashes please comment in the linked thread.

Moving forward the immediate priorities are shipping and tutorials. We need to both get the product out and show people how to use it. It will take some time to ramp up shipping and I won't put much effort into tutorials until shipping is humming along so please expect one month before the first basic tutorial appears.

Thanks and I'm excited to ship you your hardware.

Taylor

Flutter News Sept 2016
over 7 years ago – Mon, Sep 12, 2016 at 12:47:57 AM

Hello Friends,

I'm back for another Flutter update. First a TL;DR:

  • I want to apologize for unfairly characterizing some backer's complaints as "noise" in my last update. Complaints about how I have handled this campaign are valid and I should not try to minimize them. There is no excuse for behaving that way.
  • We're shipping! We've shipped 11 boxes of the highest reward tier, the "It's not -not- Skynet" reward.
  • Each box was packed with 5 Basics, 5 Pros, 4 Explorers, 1 Starter Kit, 12 Breakouts, 10 USB cables, a printed thank you letter, a hand written card, a "Getting Started" document, a bug notice, and a packing list.
  • The Network Shield, Bluetooth Shield, and Shield Shield are back ordered and will ship separately.
  • Now that I've got a handle on how and what exactly to ship, I should be able to ramp up my shipping volume soon.
  • Before I ship any more packages, I've got to spend a little time to document and debug the latest software install procedure. I'll be working on that for the next week.
  • After I get the basic software setup procedure properly documented, I will work on ramping up shipping.
  • I expect shipments to resume in two weeks.
  • There is a bug in the current version of the Flutter hardware. Input voltages above 7v may permanently damage the battery charger circuit, so we have included a 7805 voltage regulator with every board shipped. See this page for more info. This will be fixed in future production runs.
  • I've fixed an issue with our discussion forum's email system, so sign ups and notifications that were broken should work again. Visit community.flutterwireless.com and check it out.

And now the full update:

I wanted to start my update by apologizing for a comment I made in the last update. I've received a healthy dose of criticism for my delivery times, and there have been some members of the community who have made it clear how frustrated they are with how I have handled the campaign. In the last update, I characterized some of those people as "noise", and I think it's clear I was trying to minimize their complaints.

That was a mistake.

I have not handled this campaign as I had promised I would. Complaints about my behavior and the treatment of backers have all been valid, and I apologize for suggesting anything otherwise. I hope you will learn that I am a loving, flawed person. I will do my best to care for each and every one of you. I have learned since the campaign to make fewer promises, and to work harder to make good on the ones I do make. I can't go back to 2014 and deliver Flutter to you when I first promised I would, but I can today and all future days do my very best to be clear what I intend to deliver and then to deliver that.

Thanks for joining me on this journey.

---

Okay! Want to know something cool? A couple of weekends ago, I filled 20 boxes with product from the highest value reward of the campaign - the "It's not -not- Skynet" reward. Each box was packed with 5 Basics, 5 Pros, 4 Explorers, 1 Starter Kit, 12 Breakouts, and 10 USB cables. The Network Shield (AKA Flutter Connect), Bluetooth Shield, and Shield Shield still have some development to do, so they will be coming in a separate shipment.

Packing boxes with product. (Sorry for potato quality)
Packing boxes with product. (Sorry for potato quality)

 

Once the boxes were all packed, I sent about 15 emails triple checking addresses after having already double checked them at the end of May. One person had moved! Thanks to the backers who emphasized the importance of doing that. Responses to the emails started to come in the same night I sent them. It was time to ship.

I still had one more thing to do though: put together the finishing touches for each box. In addition to the product from the pledge, each box gets a few extra items. There's a printed thank you letter, an "About This Shipment/Getting Started" document, a packing list, a notice about a hardware bug I have discovered that affects all current hardware, and a thank you card.

Finalizing some Flutter shipments.
Finalizing some Flutter shipments.

 

Last weekend I finalized those documents, and on Memorial Day I finalized 11 packages with postage and everything needed to drop them off at the post office. Tuesday at lunch I dropped them off. They were on their way!

A few boxes ready for shipment.
A few boxes ready for shipment.

 

Flutters leaving the nest.
Flutters leaving the nest.

 

 I had a few other urgent shipments to finalize, so I spent a couple evenings working those out. All told I shipped 14 packages this week. It's a small start, but I'm getting the little things out of the way (learning where to buy postage from, finalizing documents related to each pledge, etc). It is getting faster for me to ship rewards, which is great because I've got a lot more to send!

This weekend I've been working on some back end issues: our community discussion board was broken - our email provider stopped providing a free service some months back, so it has been unable to send emails. I set up mailgun and reconfigured the site to use that, so it looks like that is fixed. I had also neglected the board, and it became a ghost town. I'm working on clearing out the cobwebs and making it a great place for Flutter fans to discuss all things Flutter.

The next thing I have to do is make the unboxing software experience better. We still have the old instructions for installing Flutter and they're needlessly complex. We've got a new way of doing things now, but it still has some bugs to work out and there are currently no instructions for how to do things. My highest priority at the moment is to make sure that the 120 or so boards that shipped out last week are easy to set up and use. Once that process is solid, I can focus all of my efforts on ramping up shipping.

I expect that next weekend I will still be fighting with software setup issues, but will resume shipping in about two weeks.

I'll keep you posted.

Oh, and if you've made it this far, maybe you could use something to do. Perhaps watch this video on love by Maya Angelou?

I love you,

Taylor

Flutter News Aug 2016
over 7 years ago – Wed, Aug 24, 2016 at 12:18:32 AM

Hi Friends!

Lots of exciting news this update:

  • Calibrated boards are coming back from the local Seeed office. I now have over a thousand calibrated Basic and Pro boards and things look good.
  • With calibrated boards in hand, it's time to ship! I'll start with the highest tiers first and it will take a couple of months to finish the process. I'll have better estimates once I've shipped a few packages.
  • I'm totally frightened to ship, but I think I can get the first couple of packages packed up this weekend and shipped out next week.
  • You can now use the regular 1.6.9 Arduino IDE to program Flutter. It's not documented yet and I got it working last night so there may still be bugs, but if you follow these instructions and use this URL, you can try it out. Make sure to download the latest Flutter library to go with it. You can also get the files from our github.
  • I went to storage and picked up six more boxes of Basic boards to be calibrated. I posted some images here if you want to see what a thousand or so boards looks like.
  • In order to calibrate all these boards I wrote a couple of neat tools I thought you'd want to see, so I put them on github. One tool autoprograms unprogrammed boards when they get plugged in to the computer, and another program automatically runs the calibration routine and saves the data into a database. There are also some linux UDEV rules that make it work, so check it out!
  • The calibration program saves the board's unique CPU ID and the calibration information into a database, so I can always recover a customer's board if anything gets corrupted. I also have data on the distribution of error for the product I'm receiving, which makes cool graphs like this. These boards were done in batches by which crystal they had, so you can see how different crystals have different error characteristics.
  • I got a job! Thanks to everyone for your support. I start tomorrow and I'm excited to get back to a regular schedule. Being unemployed has been nice, but weird.

That's all for the update, gotta keep this one short as I've got a busy day today. I love you all and thank you so much for your support.

The final thing I wanted to address was some of the unhappy backers we've had making comments here. It's expected that this may happen with the number of backers we have and the delays I've had in getting you your product. I've decided to issue a couple of refunds to people who have been making the most noise. I can't really refund everyone who wants it right now, but if you really don't want to receive your Flutter shipment please email me at [email protected] and let me know. I probably won't issue any more refunds right now, but I can add you to a list and refund you as soon as I can.

I'll leave you with some of the pics I linked to above:

Just some of the boards that we're calibrating now.
Just some of the boards that we're calibrating now.

 

Overflowing Flutters
Overflowing Flutters

 

Calibration data for over 1000 boards
Calibration data for over 1000 boards

 

July 31rd 2016 Flutter Update
almost 8 years ago – Sun, Jul 31, 2016 at 07:11:19 PM

Greetings backers!

I'm writing today to update you on all the latest goings ons with Flutter, as is the point here.

I'm looking for a robotics position

Before we get to Flutter, a quick personal request. The project that had been funding my day job recently got canceled, we've been asked to accept a major pay cut, and my future at that company is uncertain. I am looking at other employment options in case things don't change soon at my current job.

If you know anyone who needs a multidisciplinary engineer for electromechanical or robotics product development, preferably in the electronics or software engineering space with strong skills in mechanical engineering and manufacturing, please let me know. If the product and team are cool, I'm open to non-robotics work too. I'm located in Silicon Valley.

For more details on who I am, please see my website at tlalexander.com. My email address is on the site.

Having a day job provides me the financial support I need to keep working on Flutter (and eating), so if you can help me find something cool I can maintain my focus on making Flutter better.

And now the update

Tl;DR:

  • We're on track to do the factory calibration of boards soon. That was planned for this coming week, but it has been pushed back a few weeks.
  • I'm looking for work. If you know some cool places, please get me in touch with them. tlalexander.com
  • We've calibrated 5 boards against some high quality radio equipment to serve as a master/factory calibration reference.
  • The calibration routine looks good. Last step is to write an application that will save the values into a database.
  • As soon as boards are done with calibration, we'll start shipping.
  • For a fun change of pace one night, I got Flutter working with the latest Arduino IDE. It isn't ready to ship yet, but expect soon to have a massively improved out of box experience when setting up Flutter.

And now, story time.

It has been three weeks since my last update.

When you last heard, I had just brought up the on board memory chip on Flutter. I could read and write arbitrary data to it, but had not yet tied that functionality to the board calibration.

Two weekends ago, I worked on integrating the calibration routine with the Flutter library, so that calibration data is automatically loaded at startup. You can now take a Flutter board with a wonky crystal, calibrate it once, and have it transmit at the correct frequencies within a small and very acceptable margin of error.

To test this theory, I reached out to my incredible RF advisor, Earl McCune. I met up with Earl on Friday the 22nd to test my calibration software. Earl has some of the nicest RF equipment you can get your hands on, with some very high accuracy frequency references.

I took 5 Flutter boards - three Pros and 2 Basics, and set them, uncalibrated, to transmit a constant square wave at what they thought was exactly 915MHz.

He then fired up his Cushman Radio System Analyzer, set it to listen at 915MHz, and observed the dials.

Cushman Radio System Analyzer showing the signal from a calibrated board. Interesting fact: Earl was the Chief Engineer on this instrument.
Cushman Radio System Analyzer showing the signal from a calibrated board. Interesting fact: Earl was the Chief Engineer on this instrument.

 

The first board was a Pro and showed an error of +3000 Hz. Not bad.

Next, another Pro. +6000hz. Still in spec (max allowed error is 9150 Hz at 915MHz, or +/- 10ppm).

Another Pro: +3200 Hz.

A Basic, +3000 Hz.

And one more Basic: +24000 Hz!

That last one was a bit of a surprise. When I had Seeed run my error analysis program on the batch of boards I sent to them, we seemed to mostly get a max offset measurement of about 15000 Hz. I later found that I needed to expand the range of my offset calculation, as that board showed up as having 12000Hz with my software. That is now fixed.

It was clear that the error on that board was 24000 Hz though. I checked it and it has a counterfeit crystal. I specified and paid for a crystal with +/- 10ppm (part per million) error, but we were seeing worse than 26ppm error. Not cool.

Still, I wanted to try my calibration routine. I manually entered -24000 Hz into the offset value in my test program, and reflashed the board. This is what we saw with the Cushman set to 915Mhz:

Dial indicating approx 300 Hz error after calibration. Board originally had 24000 Hz error.
Dial indicating approx 300 Hz error after calibration. Board originally had 24000 Hz error.

That was a little under 300Hz error.

The boards have a digital band pass filter that blocks reception of signals outside the desired frequency. The programmed frequency bandwidth is 23000 Hz, and the filter bandwidth is, recalling from memory, about 30000 Hz. The radio will automatically lock on to the center frequency of any radio transmission that it finds, so a little error is totally cool. Too much error though, and the board will never receive the signal.

Remember that the allowable error by design is +/- 9150 Hz. We found a board with an error of +24000 Hz, and then with our calibration routine we reduced the error to 300 Hz.

Basically, we've experimentally verified that the software offset fixes the frequency error on the boards.

Technically, there are other concerns. How stable is the frequency on these counterfeit crystals? Will they have frequency drift as they age? How are they affected by temperature? We have a plan for how to understand how time will affect the crystals, but first an aside about crystals and oscillators.

Time to learn about timing

Earl pointed out that I am not using what is called a TCXO, or Temperature Compensated Crystal Oscillator. I didn't even know what that meant - we used the crystal that Texas Instruments recommends in the CC1200 reference design. Truly, when I started, I was just happy everything worked. As I get more comfortable with the platform, I am beginning to learn more about the bits and pieces.

In this case, I learned that crystals drift when their temperature changes. We shot a Flutter board with some freezing air from a can and the frequency drifted maybe 500 Hz. Earl tells me a TCXO wouldn't do that.

He also told me about a near part called an OCXO, or Oven Controlled Crystal Oscillator. The OCXO actively heats the crystal up to some temperature high above ambient, and then regulates the temperature precisely. While Flutter's crystal is specified as having +/- 10ppm accuracy, an OCXO can be accurate to +/- 1 ppb (part per billion), or 10,000 times better than Flutter's crystal. An OCXO also draws lots of power, is large, and costs well over $100 so we'd never put one on Flutter, but we could wire up a frankenstein Flutter unit with an OCXO for the bench that would be extremely accurate.

However, Earl mentioned that in my case, a TCXO would still be a major improvement. We looked on digikey and found a TCXO that is $65 and gives +/- 50 ppb, or one that is $35 for +/- 200 ppb. He advised that I could hand solder one Flutter board with such a reference and use that as a master calibration unit, so I don't need to borrow his tech to check my master calibrations (as gracious as he is to let me drop in from time to time). So next digikey order, I'll drop one of those in the cart and give it a shot.

He also suggested I look at a VCXO, or Voltage Controlled Crystal Oscillator. Those can be adjusted with a potentiometer for extremely accurate calibrations. In our case though, we're fortunate that we can calibrate the boards in software - that's the beauty of digital radio systems.

I thought it was really cool how he was able to bring so much clarity to the situation for me. When I started all this I had no idea what the difference was between a crystal or an oscillator, or a TCXO, VCXO, OCXO, etc. Once you know how it works, you can build better systems. You can go ultra long range with ultra narrow signals for example. That's how Flutter pushes 1km out of a small, unamplified radio chip - a somewhat narrow band signal. And that's why the crystal's frequency error was so important - narrow band means long range, but also requires accurate timing.


Next steps

It was just over a week ago that I met with Earl to do the master calibration. I then spent last weekend running tests against those boards. I made a few tweaks to the calibration routine that improved the speed and accuracy of the calibration test. The results of the auto-calibration test will vary by a few kilohertz so it could be improved, but for Flutter's normal signal it works well. I will release info on calibration for those that want to improve it further for specialized applications (only radio nerds will ever want to do this).

You saw above the error of about 300 Hz for one of the boards after calibration. Here's how the auto-calibration program measures up on that board after it has been calibrated once.

Measured auto calibration error after manually calibrating board with 24000Hz original error.
Measured auto calibration error after manually calibrating board with 24000Hz original error.

 

The instantaneous offset measurements (blue) vary a lot, so we average the readings over time (orange). You can see how the estimate stabilized with enough averages.

In this case after manually offsetting the board by 24000 Hz, the remaining error is about 300 Hz, which is what we saw on Earl's equipment.

The auto calibration routine does converge on a reasonable estimate of error and properly saves that into on board memory. We could go take this today and run it on all the boards and they'd be ready to ship.

However, it's clear to me that is is valuable to save the calibration data into a database before shipping out the boards. I've decided to reserve a little more time to make a simple python database application that will store the unique CPU ID and the calibration value. This will help in a lot of ways. Currently the calibration data is not write protected, and could be erased. With a database, I can help a customer quickly restore the information. With a database of crystal errors, I can also see exactly what our manufacturer gave us, to see the extent of their error. Finally, it will make it easier to track any possible frequency drift over time that the crystals may have.

I mentioned that we still have some outstanding questions about how the crystals will behave over time. That said, I think the best thing to do is to proceed with calibration and start shipping. We'll keep an eye and an ear out for any systematic errors, and offer an easy exchange for any devices that aren't performing appropriately.

I had hoped to do the python database application this weekend and I did briefly start it, but I've owed you all an update for a couple of weeks now and wanted to make sure I didn't rush it.

It may take one or two weekends to write that program but it will avoid a lot of headaches down the road.

That's all I have for now. As always please share your thoughts and feelings below.

And if you've made it this far, you may enjoy my personal website, which I have been updating lately.

Taylor

Micro update - it works!
almost 8 years ago – Sun, Jul 10, 2016 at 04:54:39 PM

Super micro update:

Yesterday I brought up the memory chip on Flutter and showed I can read and write arbitrary data to it. That means we can definitely do a factory calibration and save it onto permanent memory on the board. Yay!

It's pretty nice actually, as the ATAES132[1] secure storage chip we are using provides 32Kb (4KB) of storage for arbitrary data in addition to room for sixteen 128-bit encryption keys. You'll be able to use that in your sketches for whatever you'd like.

Most of yesterday was fought fighting weird I2C stuff. The Arduino Due that Flutter is based on has it's own quirks for I2C[2] and it took a while to get it sorted out. Now that we can read and write arbitrary data to the memory chip the next step is to make a proof of concept program that writes calibration data and then add a step at start up to read that data.

Once that works, I'll determine a good production ready plan for storing that data that will hopefully include locking it somehow so it doesn't get accidentally overwritten.

That's all for now.

Love,

Taylor

[1] We're using the ATAES132. It's been superseded by the ATAES132A, which we will move to in future production runs. http://www.atmel.com/devices/ATAES132.aspx http://www.atmel.com/devices/ATAES132A.aspx For fans of asymmetric encryption, every Flutter Breakout board that everyone gets includes a footprint for other Atmel crypto chips including the ATECC508A http://www.atmel.com/devices/ATECC508A.aspx If someone wanted to write some code to support asymmetric encryption on Flutter, I'd send them a couple of boards with the ATECC508A stuffed for testing.

[2] Like the one where the program compiled and worked great, and then I went to dinner with a friend and when I came home, without any code changes, the compiler started telling me it can't find one of the functions being used... That's actually not an I2C error, it's something weird with Arduino. But yeah... good times.