Blog

A while ago we did a hack where we attached a NeoPixel ring to a Crazyflie. It was just a quick hack to show the concept, but we really liked the results. So we added some more firmware to easily be able to create new effects for the ring and also made it controllable using the Leap Motion. When we started talking about what expansion boards to do for the Crazyflie 2.0, we instantly thought about this hack. It’s fun to play around with the patterns, but it’s also great for lighting up the ground below that Crazyflie. To be able to light up in front of the Crazyflie we also added two strong white LEDs facing forward. Imagine a Sci-Fi movie where an abandoned alien ship is found. To explore it they first send in a small autonomous flying vehicle for exploration that lights up the walls and floor while blinking with some patterns, that’s the look we were going for :-)

To accomplish this we have designed an expansion board with a ring of 12 W2812B RGB modules as well as two strong front facing LEDs (the kind that’s used for LCD backlight). The board is 3cm in diameter and weighs about 3,5g. To make sure the LEDs are lit correctly as the battery voltage changes (especially when it get’s low) we added a DC/DC step-up/down to the board.

Like always, we are looking forward to seeing what fun things our users will do with this board :-)

One of the boards that we have been working on is an inductive charging expansion for the Crazyflie 2.0. Some of you might remember way back when we did an inductive charging hack for the Crazyflie. It’s always been very compelling with wireless charging, we’re not sure why. Maybe it’s because it feels a bit magic :-) For our inductive charging expansion board we choose the Qi standard, which is used in many cellphones today and finding a cheap charger for it is pretty easy. The board is designed around the BQ51013B Qi chip from Texas Instruments. Our initial testing of the board shows that it’s operating at about 65% efficiency and manages to provide an output of around 1A at 5V. The board weights about 5g, but we might be able to improve that  a bit, and is 30x30mm. Now all we need is a dock that we can automatically land on :-)

Here are some images of our current prototype, the final version will look a bit sleeker. The jumper sticking out on the side is for current measurements. It won’t be mounted in the final version, but the pads will still be there. So if you would like to measure the current you can cut the track and solder a jumper for it.

One of the nice new functionality of Crazyflie 2.0 is the Bluetooth 4.0 low energy (BLE) connectivity. In Crazyflie 2.0 we are using a radio microcontroller chip from Nordic semiconductor, the nRF51822. This radio chip allows us to keep compatibility with the existing Crayradio (and future Crazyradio PA), and to support BLE connectivity as well. The radio chip is a bit bigger that the one we used so far, and with the Power amplifier, we end up having the radio taking more space on the PCB:

The extra footprint is offset by the fact that we are now using smaller sensors and that the nRF51 is also handling the power management thus freeing pins on the main CPU.

The main usage of BLE will be to fly Crazyflie from a compatible mobile device like an Android phone or an Iphone. This could be used both to ‘just fly’ or to develop crazyflie control apps using the mobile phones capabilities. For example the phone camera could be used to detect and control Crazyflie autonomously. We have prototyped the BLE communication both on the existing Android client and for IPhone. The plan is to provide basic apps for the Crazyflie 2.0 release so that the copter can be flown from a mobile device out of the box. So far we have got the copter to fly from both Android and IOS:

We are not planning on implementing any BLE support for the PC client, so Crazyradio is still the main way to communicate with Crazyfle. It is possible to have BLE on PC but it would require a major effort to get it to work for Linux, Windows and Mac (there is no cross-platorm Python BLE lib as far as I know. If there is some please tell me in the comments!). Also Crazyradio is lower latency and has an higher datarate which makes it better for flying and communicating with one or many Crazyflie 2.0 from a PC.

We are also implementing BLE in the bootloader. This means that it will be possible update the Crazyflie 2.0 firmware from both a PC or a mobile device.

Technically we are using the Nordic Semiconductor soft device BLE stack. The stack runs a little bit like an operating system, behind and independently of the firmware: the firmware is not linked to the stack. This will make things a little bit easier to have an open-source firmware even though the nordic bluetooth stack is closed. Another nice thing about the nordic chip is that the radio peripheral is well documented so implementing open source stacks in the future is potentially possible.

Practically we where originally planning to have two modes for the firmware: one Crazyradio and one bluetooth mode. However the new release of the Nordic BLE stack allow to mix BLE and Crazyradio at the same time. So we are working on having a seamless connection procedure between Crazyradio and BLE: when starting Crazyflie 2.0 it will be accessible both via BLE and with the Crazyradio. When connected the unused mode will be disabled until disconnection. Also the name of the copter will be communicated both in BLE and Crazyradio mode and can be changed by the user. This will help a lot people having more than one Crazyflie (us first!) to differentiate them.

As we said in previous post, with Crazyflie 2.0 one of the focus has been on enhancing the current Crazyflie platform. The radio range and power is one of these things that is good enough on the current Crazyflie but that could be made much better. So on Crazyflie 2.0 we added a +20dB power amplifier that increase the output power up to +20dBm.

The logical move was to add a similar amplifier on the Crazyradio dongle and that is what we did. We made Crazyradio PA (power amplifier) and we intend to release it with Crazyflie 2.0

The output power is now of 20dBm for Crazyradio PA, which will dramatically increase the control range. Even though Crazyflie was originally intended for indoor use, Crazyflie 2.0 is pretty capable outside, mostly with the expansion capability that could allow to add things like GPS, so the extra range could be put to use. But maybe the biggest advantage is indoor where Crazyradio is now playing equal with Wifi in term of TX power. This increases the link robustness and allows for flying in other rooms (could be useful with a powerful FPV for example).

Preliminary tests show much better performance compared to the first Crazyradio and Crazyflie both indoor and outdoor. So far, we mesured a stable link two floors down about 20m away indoor and about 150m outside range (the uplink has been tested up to 450m). Of course we are continuing to work on it and final specs will come later.

As for the radio dongle mechanic we have changed nothing: the connectors and LEDs are still at the same place. This was made possible by using smaller SMD components and so existing 3D-printed cases for Crazyradio still work for Crazyradio PA.

One feature of the new Crazyflie 2.0 that we are especially happy about is the new expansion port. We have attached a lot of hardware to the current Crazyflie and we have also seen lots of users attaching their hardware, but it’s not very easy. The current connector is small, you will need to solder and it’s not mechanically stable once you attach something. For the Crazyflie 2.0 we wanted to improve this, making it easier to attach new hardware and to expand the functionality of the platform. When we started looking at this we quickly realized that the small size of our platform limits what kind of interface we can have. We wanted something very small and light, but still it couldn’t be too expensive. While looking for a solution we found some of good alternatives, until you start measuring them and bringing them into our design in KiCad (again, it’s like parking a minivan in your bedroom). Something that didn’t make the selection easier was that we wanted lots of flexibility. We wanted users to be able to add multiple boards, both on the bottom and on the top of the platform. This might sound crazy for a small platform like the Crazyflie, but with the new motors we are able to carry more weight than before. Adding expansion boards will of course effect performance (like flight time) but to the extent that it’s possible, we want to give users the possibility to do as much crazy things as possible with their Crazyflies :-)

After months of searching (it’s pretty hard finding connectors…) we finally found a solutions that fulfilled all of our requirements. The connectors we found allows users to place multiple boards on the Crazyflie, both on the top and the bottom, and without pre-defined vertical spacing. We only place female connectors on the expansion boards, which means that if you crash and bend the male pins, you just have to exchange them and not any expansion boards. Below are some images showing the expansion connector, the pins and some examples on how you can connect boards. It also shows two of the expansion boards that we have designed, a prototype board and a breakout board for breadboards. In the images we use the breadboard and the breakout board to connect to a pressure sensor from ST and the prototype board to build a flying traffic light :-) The idea of the pattern for the prototype board is taken from ElecFreaks. It allows for easily using both though-hole components and SMD components.

All the boards and the Crazyflie 2.0 with the 3D printed motor mounts are still just prototypes.

Detecting boards

We think that being able to attach different boards is great, but how do we use them in the firmware/software? Well, there are two different use-cases for that. The first one is “pre-made” boards. Aside from the two boards above (prototype and breakout) we have a bunch of ideas and also a few working prototypes that we will write a bit more about later. Let’s use the GPS-expansion that we are working on as an example. When you attach this board you want extra functionality to be available without re-compiling and configuring things. You still want the possibility to hack around in the firmware/software, but you want the hardware to be initialized properly so you don’t have to worry about that. To accomplish this we needed some way to identify the different boards. Again, this needed to be done is a cost-efficient way and without using up too many of the pins in the expansion port. The solution we found is 1-wire memories. So what’s so great about them? Well, they have some nifty features. First of all each produced IC has an unique address, so placing multiple memories on the same buss is no issue. Using a search algorithm you are able to find and identify all the connected memories so that you can address them individually. Secondly they only use, like the name suggest, one wire for communication. This wire is also used for parasitically powering the memory. That means all you need to connect is the one wire and ground. Last, but not least, they are fairly small. The ones we use are in a SOT23 package.

So how are we using these memories? We are placing a memory on every board we design (except for boards like the prototype and breakout boards). The memory is very small, but it’s enough to contain some information about the board. So during production each memory will be programmed with things like what board it is, which revision and what resources (i.e what pins in the expansion port) the board uses. At start-up the 1-wire bus will be scanned and all the memories will be read to detect what boards are attached. Why store what pins the expansion boards use? Well, the nice thing is that the 1-wire bus is connected to the nRF51 (here’s some info on the system architecture). Since the nRF51 is responsible for power management (i.e switching on power for the STM32F4) it’s possible to scan all the memories and detect conflicts in resources before powering on the main system and the expansion boards. Let’s say you attach two boards that use the same UART. This will result in issues when the systems starts running. To protect against this the nRF51 will check if there are any conflicts and won’t power on the system if there is.

The second use-case for expansion boards are the ones you make yourself. Then you might not be interested in using the 1-wire to detect your board. Therefore it’s in no way mandatory to use that feature, it’s just something that we think will make working with our platform easier for our users. But in case you are interested in detecting your own boards, the firmware will support programming the memory and we will link to the correct parts at suppliers.

The pinout of the expansion port

The expansion connector consists of 2 rows of 10 pins each with the spacing of 2mm and has the following pinout:

Crazyflie 2.0 expansion port

Crazyflie 2.0 expansion port

P6

  • VCC – 3V0 regulated supply (max ~50 mA consumption). Only powered when the STM32F4 is powered.
  • STM32F4 UART 1 (RX/TX)
  • STM32F4 I2C bus (400kHz)
  • STM32F4 4xGPIO (can be used as chip select for SPI)
  • GND – platform signal ground

P7

  • STM32F4 UART 2 (RX/TX)
  • STM32F4 SPI (SCK, MISO, MOSI)
  • nRF51 2xGPIO that could be used for GPIO but will have the following reserved:
    • nRF51 wakeup – allows waking up from an expansion board
    • nRF51 external power indication – will indicate if an expansion board is powering the system or not
    • nRF51 1-wire memory access
  • VCOM – unregulated direct access to power after charger (max 1 A consumption). The voltage is VUSB if a charger is connected and VBAT otherwise. Currently this power supply is always on (even when the system is powered off) witch allow for making always-on expansion board. However we are looking at inserting a high-side switch which would allow also switching this supply off if needed, making prototyping and design of expansion boards a bit simpler.
  • VUSB – unregulated direct access to uUSB power. This can either be used to get uUSB power or to supply uUSB power to the platform (like an external charging board that powers and charges the system).

The pins that are connected to the STM32F4 can be used as GPIO or for other functionality that they are multiplexed with, like timers.

Making expansion boards

As many of you probably know, we strive after using open source tool for our development. So for electronics design we use KiCad, an open source EDA suite that works on Linux/Windows/Mac. To make it easier for users to design and make their own expansion boards we have created a template for the design. It contains the initial schematics as well as layout. The connectors are added in the correct positions and the memory is also in. To make things even easier, the layout contains drawings of the Crazyflie 2.0 board outline and connectors, to easily see how the board will fit. As with everything else this needs some cleanup when the final design is in place, but then it will be released under the CC-BY-SA 4.0 license. Looping back to the 1-wire memories, if you make your own board will it be possible to get in on the automatic detection? Sure, the more the merrier. But we still haven’t specified exactly how this will work technically, so we will have to get back on the specifics. If you are interested in hacking something together a great way to go is first to try out the design on a breadboard, then solder it together on the prototype board and finally do the layout in KiCad and order it at a batch-PCB service.

While designing the Crazyflie 2.0 one of our focuses has been enhancing the current Crazyflie functionality. As a flying development kit the current Crazyflie already has a JTAG debug port that allows to flash and debug the STM32F1 microcontroller. The design uses a standard ARM 10-pins cortex debug connector. The connector is shipped with the Crazyflie control board, but it is not soldered. So before doing any advanced debugging with the Crazyflie the user will have to solder the debug connector (it is always possible to flash new firmware using the radio bootloader).

With Crazyflie 2.0 we wanted to make it easier to debug it out-of-the-box, without needing to solder. But the issue is that standard debug-connectors tend to be fairly large, so to fit the connector on the board we used a different connector that connects to an adapter board.

Aside from having a reset button, the adapter board will have 3 JTAG/SWD connectors:

  • 20-Pins HE10 ARM JTAG with 2.54mm spacing: The most commonly used connector
  • 10-Pins ARM Cortex with 1.27mm spacing: Used in some modern ARM board, the same as the current Crazyflie
  • 6-Pins SWV with 2.54mm spacing: Compatible with the connector present on ST Discovery boards

The smaller 6-pin connector connects to the Crazyflie 2.0 for flashing and debugging of its 2 MCUs: The STM32F405 and nRF51822. The connector for debugging the STM32F4 is mounted on the Crazyflie 2.0. For the nRF51 we are still working to get a solder-free solution using the same cable/connector on the debug-adapter. Why not just put two connectors, or one big with all the signals on the Crazyflie? There’s just no more space on the board. The connector looks very small, but when you bring the footprint into KiCad it’s like parking a minivan in your bedroom :-)

Since all the connectors are wired together the board can also be used in a number of other combinations, like using it as a 20-pin to 10-pin Cortex JTAG adapter or any other combination of its connectors.

With the help of our new intern Mattias we finally got around to shooting a short video and taking photos of the Crazyflie 2.0 prototypes. We are really excited to finally show the new version and we are looking forward to getting some feedback from our readers. We are currently finalizing the design of the motor mounts, so for the video and photos we are using 3D printed prototypes printed in our Ultimaker. The design used in the photos is pretty close to the final design, which will also be transparent. The Crazyflies shown doesn’t have any expansion boards attached, instead there’s just a PCB that holds the battery.

 

 

[pe2-gallery album=”http://picasaweb.google.com/data/feed/base/user/115721472821530986219/albumid/6038515743776561441?alt=rss&hl=en_US&kind=photo” ]

 




 

When working with hardware there’s always a very intensive phase when you do the initial design, find the correct parts and finally order your prototype. Then you sit around waiting for a month or two until the board shows up with the mail. For a first prototype there are always errors, so you want to minimize the time before you do another round of prototypes. Already during the work with the initial hardware design we use various development boards to check that we won’t run into any problems. Normally there’s something you didn’t think about and there’s always something ugly that shows up in the errata. To test some of the hardware you might need a lot of firmware, like how well do the sensors work when flying. To speed things up we normally continue the development using our hackish set-up of development boards even after the prototype is ordered. This way we have made lots of progress with the firmware until the first prototypes show up.

Since we did a lot of changes for the Crazyflie 2.0 we verified many things already before ordering the fist prototype, but for others we needed more firmware and we didn’t have the time do finish it all. So after ordering we continued the development using our initial set-up. It contains roughly the same sensors we use in the final design and also the two MCUs (STM32F405/7 and nRF51822), everything is wired up using roughly the same pins and buses we have in our design. While we were doing more work on the firmware we found a couple of errors we made in the hardware that we needed to fix when the prototype arrived. Finally we had the old firmware ported and running on the STM32F4 and some new firmware for the nRF51. Together this built up almost a complete system which we could connect the client to and log data from the sensors. Obviously there was one thing we couldn’t really test, the actual flying :-)

Prototyping the Crazyflie 2.0

Prototyping the Crazyflie 2.0

Finally the new prototypes arrive. If you have been in this situation before you recognize the feeling, it’s great! Even though we had the firmware working we didn’t want to start trying to flash it, there was probably other issues we haven’t found. So we had also prepared a blinky program which just starts the oscillator and blinks the LEDs. While taking small steps it’s a lot easier to find out what went wrong. After successfully blinking the LEDs we got a bit more confident and flashed the full firmware, and it was working! But then we already knew about the error that kept the STM32F4 in reset and had patched it :-) After attaching the 3D printed motor-mounts for the new 7mm motors and fixing the PWM we gave it a try. Crash! A bit too optimistic.. we fixed the sensor orientation and it was finally in the air. After a quick glance at the clock we realized that it had only taken 8 hours from ripping the package open (yes, ripping) until we had the first prototype of the Crazyflie 2.0 in the air. After a couple of days all the hardware was tested, the changes were made and a new prototype was ordered (which coincidentally showed up today).

So where’s the video of it flying? It’s still in the making. This fall we are very happy to have the help of Mattias that is doing an internship at Bitcraze. He’s worked with media and graphical design before, so you can expect images and video with better quality than we normally manage to produce :-)

Early on in the Crazyflie 2.0 design we decided on using a double-MCU architecture. The main reason for this was to add Bluetooth low energy (BLE) to the platform to permit new use-cases like controlling the Crazyflie 2.0 directly from a mobile device. It just so happens that Nordic semiconductor some time ago released a chip that perfectly matched our requirement: the nRF51822 can run a BLE stack and is still compatible with the nRF24Lx1 that we are using in the current Crazyflie and Crazyradio. This nRF51 chip contains an ARM Cortex-M0 microcontroller, powerful enough to implement the radio functionality and power management, but not powerful enough to run a fully featured Crazyflie. The resulting system architecture can be seen here:

Crazyflie 2.0 system architecture


The nRF51822

The two main tasks for the nRF51 is to handle the radio communication and the power management. We use the radio for both CRTP and BLE, but the hardware also supports other protocols like ANT. The CRTP mode is compatible with the Crazyradio USB dongle and it provides a 2Mbit/seconds data link with low latency. Our initial tests of the Crazyflie 2.0 implementation shows that the latency of the radio link is between 360us and 1.26ms, at 2Mbps without retry and a packet size of respectively 1 and 32 bytes. The main benefit of the CRTP link with the Crazyradio is that it’s easily implemented on any system that supports USB host which, makes it the first choice to hack and experiment with the Crazyflie. To that we have added BLE, mostly with the use case of controlling the Crazyflie 2.0 from a mobile device. The idea is of course to be able to fly easily and on the go with BLE, but we also see lots of opportunities for fun hacks and experimentation with mobile devices. One idea we came up with is to be able to place the mobile device up-side-down on a table and to autonomously hover the Crazyflie above it using the camera on the back.

One of the other particularities of the nRF51 chip is that it was designed to run from a coin battery, which means that it is pretty well suited for low energy operation. So we decided to give the nRF51 the responsibility for power management as well. In the current version of the Crazyflie we have a small chip handling the ON/OFF button and cutting power to the complete board. On Crazyflie 2.0 the button is connected to one GPIO pin on the nRF51 and power to it will never be cut, it just goes in “power down” mode. This permits to reproduce the current ON/OFF functionality and the button can be used for more function like long press and double click. We have also added the possibility to wake up the system from one of the pins in the expansion connector, which allows wake-up by an external source. It also adds more possibilities like waking up the system at regular time-intervals to perform some function.

The STM32F405

We also updated the main MCU to a fast Cortex-M4 with a lot of memory. The CPU power is not a big limitation in the current Crazyflie, but the memory could become a limitation if users would like to implement new functionality that needs a lot more memory. We ran into this problem when we were trying to implement SD-card support for logging, as this required too big buffers. The new MCU has 196kB of RAM which should be enough for anyone (famous last words…). The MCU power will also allow for more computationally intensive algorithms, the first that comes in mind is sensor fusion between inertial sensors and the GPS data.

This amount of memory and computational power also open the doors for new things: the STM32F4 has a Memory Protection Unit, which allow to run tasks in a protected environment and intercept bugs before they can crash the full Crazyflie control firmware (like what  happens on PC operating system). One use of this could be to to allow for “user code” that runs in a protected environment to allow easier development of advanced behavior. As always this kind of functionality spawns lots of crazy ideas :-) The leading one is to run a Lua interpreter in such a protected task. If there was a good API that could be used from Lua you could imagine lots of fun stuff to do. Like adding a new board with sensors, reading them and then controlling the Crazyflie from that, without having to go into the actual control algorithms or risking to crash the firmware. This is of course still a dream but at some point in the future we will definitely give it a try (when we have the time for it that is :-) ).

Inter-MCU communication

Working with a system with multiple MPU is hard. As embedded system developer we know that, so we designed the Crazyflie 2.0 with at least some idea of how to limit the problems related to debugging two inter-dependent MCUs. We have defined as precisely as possible the responsibility of each MCU, which permits to develop and test things independently:

  • The nRF51 is responsible for
    • ON/OFF logic
    • Enabling power to the rest of the system (STM32, sensors and expansion board)
    • Battery charging management and voltage measurement
    • Master radio bootloader
    • Radio and BLE communication
    • Detect and check installed expansion boards
  • The STM32 is responsible for all the rest, among other things:
    • Sensor reading and motor control
    • Flight control
    • Telemetry (including the battery voltage)
    • Additional user development

The nRF51 will act as slave and the STM32 as master. Using a radio bootloader it will be possible to wirelessly update the firmware for both MCUs.

We will write more details and post photos in the following weeks. Do not hesitate to tell us what you think about it, we appreciate all the feedback we get and we already have a couple of verification that we made after previous feedback (ie. radio latency and magnetometer usability).

At Bitcraze we often get into discussions about crazy ideas that we would like to test out. Most of them are just that, crazy ideas, that are hard to realize or that we never have time for and the discussion ends (and a new one begins). But one of these discussions have been popping up time and time again, the idea of a flying sensor array based on the Crazyflie. Imagine a situation where you would need to distribute a large number of sensors over an area that you don’t have access to. You could also imagine a situation where you would like the measurement points to move over time. In these cases manually placing sensors at different points might not be a feasible solution.

During the initial design of the new Crazyflie we tried coming up with different use-cases for the new platform. We are not designing a “end-user” product that is intended for a specific end-use, instead we are designing a platform that is aimed at giving us and other users as much flexibility as possible to define the end-use themselves. But we still needed something to aim for, to try out our design on, and see if it could be done. One of these use-cases ended up being a flying sensor node. This might seem like a very specific usage, but we thought that if we come up with a design that would fulfill our basic idea and also a few far fetched ideas, then we would have something good. Hopefully this will be the case :-)

But we don’t only want to use the sensor array as a use-case, we want to build it! But as always time is in short supply. What’s the second best thing after doing something yourself? Seeing someone else do it! So we thought that this would be a great opportunity for a master thesis, where there would be room for both a theoretical part and a practical implementation part. Therefore we are hosting a thesis together with the consultant-company DevPort and the faculty of engineering at Lund University this fall semester. The theoretical part of the thesis includes investigating mesh-algorithms that could be used for a flying sensor array to relay commands to the nodes and to relay back sensor data. The goal is not to relay direct control commands though the mesh, but instead relay target positions for sensors or area that the array should cover. The goal of the practical part of the thesis is to implement basic functionality of the selected design using our new Crazyflie. The radio used in our new design is the nRF51822 from Nordic Semiconductor, we will go into more detail on the new radio in upcoming posts. We realize that this is a huge task, but we will do our best to help out. Between the three of us we cover mesh, radio, embedded systems and of course lots of knowledge about of the new Crazyflie and the nRF51822.

The thesis will be based on location in Lund/Malmö in Sweden, but we will of course share the progress and results on our blog. If this sounds like something that is interesting and you are looking for a thesis, then check out the description here (PDF here). Contact information for questions and applications can be found in the description.

So how did using this use-case when designing the Crazyflie effect the result? Well, one thing is that one of the pins in the expansion connector can be used for charging and powering the system. Think solar-cell, inductive charging or any other alternative source of power. It also sparked lots of discussions that effected the complexity of the power-management system, something that is now handled by the new radio MCU.