Ariadne Headband

Arduino-based heaband that uses haptic feedback to navigate blind people. Controlled via Bluetooth using Android app.

Public Chat
Similar projects worth following
Ariadne Headband is ongoing project that aims to create haptic navigation for blind people (among others). It uses 4 vibration motors placed in set directions on head and connected to Arduino board. Everything is controlled with Android app via Bluetooth.

Ariadne was daughter of the ancient ruler Minos. Her duty was to oversee famous labyrinth where mythical beast Minotaur lived. One of the young people sacrificed to Minotaur was Theseus—a hero from Athens. He planned to kill the beast and save the life of others. Ariadne fell in love with him and wanted to help so he can achieve his goal. She gave Theseus ball of thread and a sword. When he entered the maze, he should unravel the thread so he can follow it on his way out of the labyrinth.

Since then the term Ariadne’s Thread means a way or a tool to find a way through unfortunate situation.

What is project Ariadne Headband?

Ariadne Headband is actively developed project that tries to provide haptic navigation for people who cannot use other ways—either they are unable to use visual navigation, do not have time for it or cannot see at all. Our main goal is to help blind people but Ariadne Headband can be useful in other cases too, e. g. runners or bikers. Our Headband can show these people direction to their selected destination, geographical North of eventually which way they should go on crossroads (work is still in progress).

How does it work?

Project Ariadne Headband is made out of two parts: headband and control app. The common usage flow is following. First, you open Ariadne Headband Android app. Using this app you connect via Bluetooth to your Headband. Next, the app will ask for you current GPS location. Then you open Google Maps integrated into our app and select your destination (place where you want to go).

Our Android app will compute the geographical azimuth from your current location and chosen destination. When you are ready you start navigating by pressing a button that sends computed azimuth to the Headband you put on your head.

Headband consists of Arduino Nano board, GY-271 compass module, HC-06 Bluetooth module (we selected this module only for local availability and will switch to BLE soon) and 4 vibration motors. Compass module allows us to know current azimuth, that is where is the user looking. All components are placed into a small box on back of your head. Our aim in the future will be to make this as small as possible so you will not even feel it. It is also possible to place everything into a hat or helmet for example instead of rubber headband. We are using rubber headband because it is very easy to manipulate.

Vibration motors around your head are placed in set directions so they can signalize where you should head. Your heading is computed by taking your current azimuth and the azimuth sent from android app (that is where you are currently going and where you should go, respectively). See illustration below for Headband overview.

For example, Motor 1 is activated when you should head 45° (this is same for diagonal directions). If you should head straight, both Motor 4 and Motor 1 will be activated. The similar approach applies for left, right and turn back signals. We originally planned to use 8 vibration motors, one for every 45° but have concluded that it would by more complicated and would not be worth it. The motors would be too close together and it would be hard to recognize right direction. Using 4 vibration motors is both cheaper and more robust.

Why is is useful?

As you might seen in a MythBusters scene or in few videos on YouTube, it is hard to walk straight when you cannot see. Blind people who use cane have to find some guideline, pavement for example, or use guiding dog. Otherwise it is not easy for them to keep right direction. For the other cases, some people like runners usually do not want to stop and look on their phone where they should head.

Ariadne Headband aims to solve this problem. When we started working on this project about one month before deadline, we meant it simply as a novel computer...

Read more »

Portable Network Graphics (PNG) - 44.38 kB - 08/26/2018 at 17:42


Portable Network Graphics (PNG) - 35.32 kB - 08/26/2018 at 17:42


Standard Tesselated Geometry - 17.66 kB - 08/24/2018 at 20:38


Standard Tesselated Geometry - 157.60 kB - 08/24/2018 at 15:19


Standard Tesselated Geometry - 67.07 kB - 08/24/2018 at 15:19


View all 6 files

  • 1 × Arduino Nano
  • 1 × HC-06 Bluetooth Module
  • 1 × 03962A Lithium battery charger module
  • 1 × MT3608 step-up converter
  • 1 × Rubber band Atleast 6 cm wide and 50 cm long (depends on your head size)

View all 15 components

  • Switching to Bluetooth Low Energy

    Vojtech Pavlovsky13 hours ago 0 comments


    Since the beginning of our project we have used HC-06 Bluetooth module. This component is based on Bluetooth Classic – a kind of older version of Bluetooth protocol. When you use Bluetooth Classic and connect two devices, a communication channel will be created between them so they can send data to each other. There is only one channel and it is kept open when you are connected. This is very useful when you want to send huge amount of data through it, e. g. sound (like wireless speakers). Keeping connection active at all times means that it will also drain battery a lot (at all times).

    For this reason a new version of Bluetooth protocol was designed: Bluetooth Low Energy or simply BLE (fun fact: in Czech the word “ble” is almost exactly the sound a child make when he doesn’t like food and spits it out). BLE uses so called characteristics instead of single channel. Image characteristics as a row in a data table. Each has its name or more exactly unique identificator (UUID) and some value placeholder. You can either READ characteristic or WRITE some data you want into it. Very useful is also NOTIFY function which will listen and notify you when given characteristic’s data was changed.

    BLE is often used in fitness wearables. These type of devices often track multiple health informations, be it temperature, heart rate, how many meters have you walked and more. Sending all this individual data together would be cumbersome and not very pretty. You might make a byte array and fit every possible data into it (method we use and describe lower why) and send it. But BLE offers far better way.

    You instead write different values to different characteristics on our device that collects it. Then on the mobile phone you simply can read different characteristics and put them into different variables. Fine thing about this is that you can listen for changes on specific characteristics (like heart rate and notify the user that they should calm down) or on the other side completely ignore some values you do not need. So instead of listening to everything that is sent to you as is true in the case of Bluetooth Classic, on BLE you have way more granular control over what data you really want to read from the device and also when you want to read it. This also allows you to improve battery life, sometimes significantly.

    We have HC-06 Bluetooth Classic and HM-10 Bluetooth Low energy modules in our testing. To illustrate you how drastically different power consumption can be, take a look on a graph we have created. When the module is not connected to anything, it is looking for new connection and is discoverable. During this phase, HC-06 energy consumption can vary up to 200 mA, though the average is 92 mA. HM-10 is significantly lower: it consumes only about 9 mA. When the module is connected to other device (mobile phone in our case), using BLE can save up to 50 % of power when compared to old-school HC-06.

    HM-10 Module

    We have bought a HM-10 BLE module for purpose of testing Bluetooth Low Energy. It is one of the cheapest available BLE module (mainly because of the plethora of its clones).

    In the picture above, you can see HC-06 module (left) and HM-10 module (right). They look almost identical.

    There is one (kind of funny) thing to note. While BLE uses characteristics instead of single communication channel. But there is a catch with HM-10: it has only one available characteristic that you can write to. Anything written to this characteristic will be immediately sent to Arduino’s serial port and vice versa. This means that while HM-10 is BLE it pretty much acts like a standard Bluetooth Classic module.

    We are planning to find better BLE module to put into Ariadne Headband. BLE protocol is incompatible with Bluetooth Classic so we had to change our Android’s app inner workings. When we will eventually find an ideal piece of BLE module, we will be ready to go.

    ... Read more »

  • Updating App's GPS Location Usage

    Vojtech Pavlovsky09/18/2018 at 19:18 0 comments

    Hello fellow hackers! We want to say that we are extremely happy that we can be part of Hackaday Prize 2018. It warms our hearts knowing that people are interested in our project and are even willing to like us or follow us. With many new bought hardware upgrades on way to us, I decided to begin new work on our open-sourced Android app in the meanwhile.

    Until now, Ariadne Headband app would query user’s location only when he opened map and tried to select destination. This was suitable for early stages of development, because we did not need to keep GPS active. You would simply select destination, wait until the app would find your location and press Start navigating. App would send the azimuth to the headband and you could go.

    However, this approach is not very good when you move. While selected destination is static, your location will change. This means that azimuth can change too. So it was time to implement location tracking to keep the azimuth updated wherever you go. This change will also move us closer to the real-time navigation that will also need to track your position while you move.

    I added Location Service file that keeps an eye on your location. Right now, the Location Service is started right on app startup. This is because getting your accurate GPS location can take a unpleasant while. From my testing it can vary between 5 seconds to even 2 minutes and it heavily depends where you are (building or under clear sky) and also when you last used location on your phone. While Android has a feature to use last known location that can shorten up this time for first pinpointing, it will reset each time you turn GPS off and on.

    From the technical perspective, we are using FusedLocationProviderClient library. That is official Google’s Android library that should be used over Android’s native GPS location library. Instead of choosing which way you want to get your location (GPS vs Network) you will choose between different levels of accuracy. FLPC will then combine multiple location sources and try to get best available location while optimizing battery usage. For our purposes we use HIGH ACCURACY mode so most of the time, app will use mainly GPS. Precision depends on your phone but is somewhere around few meters.

    It is also worth noting that we use Foreground service to track user’s location. This is special type of Android class that will keep running even when you switch app or lock your phone. So you can start navigation and put phone into pocket and will still keep your location updated. Foreground service requires to show a system notification so user know some process is running on background, because it will probably consume battery life. You can see the fancy notification on screenshot below.

    We are using only phone GPS module because we think that they are on par with dedicated ones you can buy. It will also lower the price of Ariadne Headband because most of the people already own a smartphone.

    I have a lot more improvements planned for our app. New school has just started for me and Tomas so we try to work hard in our free time to make project Ariadne Headband even better. Even though having less time for this project than before, we are now determined more than ever to make Headband fully working and operational. We hope that our project might once help those who are not so fortunate as we are. Or everyone who could possible find a good use of Ariadne Headband.

  • First Real-world Testing

    Vojtech Pavlovsky08/26/2018 at 21:37 0 comments

    With our first working prototype laying on desk in front of us, we decided to go out and do real-world testing. Currently, Ariadne Headband works as follow: you select a destination on your phone, customize vibration motors intensity and press start button. From that moment, motors on Headband will be activated, each time the proper ones that are in the direction where your should look. The motors will be vibrating until you look in the right direction. Then they will turn off until you start navigation again.

    This was our first proper testing, outside of our homes. We found a best place where Ariadne Headband can be the most useful: big and empty field. From the start we quite enjoyed using it. We were happy that there was no loose cable and it worked. Boxing with components inside was designed by Tomas and is very well printed so everything stays on its place. We have yet to improve the rubber band as it was little bit tight for my larger head (Tomas was fine). For now we are holding the motors by ducktape, which is not the prettiest method. Once we choose the most universal length and width of the rubber band we plan to sew it everything together. And we will also omit the LEDs as they are mainly for effect (so we can easily see which motor is activated when it is not on our head).

    The moment of truth

    So we gave it a test. One of us put the Headband on his head and the other opened the mobile app a selected a destination close to our position. We were surprised how well it worked. The one of us with Headband on looked the right way most of the time. For the bystanders our testing may looked a little weird. But is not everything new a little weird? This first version of Ariadne Headband met our expectations. It is nice to finally turn on your project and see it work as it should.

    The only occured problems were mostly software bugs. Android GPS location was sometime stubborn and took a while to find the current location. I believe that it is due to my phone’s privacy settings and should work better on regular phones. We also plan to use Android Services for GPS tracking so we can have location updates even when you do not have maps opened. Right now, GPS is triggered only when you press Select destination and will have to be find every time again. However, when you do not move it does not matter that much, because Android remembers your last position quite accurately.

    Nevermind omnipresent programming bugs we were quite happy with results. We now know that our project is able to navigate you quite nicely. It is certain we will have to invest more time into making it more user friendly and fix troubling bugs.

    When we make it into more advanced version we would like to try it with people that could give us useful feedback. We plan to visit local association of blind people as soon as it looks and works well enough.

  • GY-271 Compass Module

    Tomas Kosicek08/26/2018 at 21:27 0 comments

    Compass module is probably the most important part of the headband. Without it we would not be able to determine azimuth and therefore navigation would be impossible. We went with GY-271 compass module mainly because it was locally available and we could get it in short time. After initial difficulties with getting data from the module we found out that module we got is equipped with QMC5883L IC instead of HMC5883L which we expected. Main difference between these two are different addresses of I2C and registers.

    After sorting this out we started printing data on serial monitor and noticed that something isn’t right. To have a better idea of the output data we decided to plot it into graphs using Python as you can see on the image above.

    Because it is a three axis compass, points are plotted into three planes, in the first column all three planes are shown overlapping and then each plane separately. In the first row are plotted unchanged data from the compass module. As you can clearly see points are forming a circle which center isn't same as zero in the graph. The reason is that values have some offset that makes calculating correct azimuth from these values impossible.

    To get rid of the offset a calibration is needed. It's done by rotating compass ideally in every possible direction and looking for maximum and minimum values for each axis. After calibration is done maximum and minimum values are saved (in present version of software it's not fully functional) and then values read from compass are modified such that there is almost no offset.

    Corrected values are shown in Graph in the second row, as you can see it's much better. Azimuth calculated from these corrected values is quite accurate. Problem is when two axis from whose azimuth is calculated aren't horizontal, if compass module is tilted on side azimuth changes. We plan to address this problem in future by using compass module with accelerometer and then compensate the tilt.

  • Headband Construction

    Tomas Kosicek08/26/2018 at 16:17 0 comments

    Once we finished testing our circuit in breadboard it was time to make it more solid. We considered few options how to connect modules and other components together, namely connecting modules with wires and leave them sort of loose in the box but because there are other components than just modules it wasn’t suitable solution. Another option was to solder everything onto a universal PCB, this would be better and quite easy to make but we planned to use SMD components to save some space and also it would be harder for us to document it properly and for other people to rebuild it, therefore we’ve chosen slightly more difficult approach to make custom single sided 50x50mm PCB which you can see in photo below.

    By far easiest and fastest way to make reasonably good quality PCB at home was using toner transfer method. After ironing toner onto copper we etched it in ferric chloride, drilled holes and soldered all the components. Bottom side of the PCB doesn’t look so pretty because some toner left stuck to it. In the project files you can find image of the PCB in 600DPI and placement of components.

    Power management

    For Headband to be a wireless device as it is, it needs some way to store energy. For this purpose we’ve picked a LiPo battery with dimensions 4x30x40mm and 550mAh capacity. Together with 03962A charger module it lies on the bottom of the box. Charger module takes care not only of charging the battery but also protects it from overdischarge by disconnecting it from the circuit when battery voltage drops under 2.5V and shortcircuit by sensing overcurrent. There is also a micro USB connector on the board of the charging module which serves as easy way to charge the Headband.

    Initially we planned to have electronics in Headband running on 3.3V but when we got all modules together it got more complicated. Arduino Nano board is supposed to be running on 5V and it has its own 5V voltage regulator, on the other hand both HC-06 and GY-271 modules use 3.3V and they are also equipped with onboard voltage regulators. We faced dilemma of either run everything on 3.3V and hope that arduino will keep working properly or somehow get 5V supply. We’ve chosen to play it safe and use MT3608 step-up boost converter to increase voltage from battery one to approximately 6.5V and then run it through Arduino’s voltage regulator to get stable 5V supply. However in future we want to use only 3.3V, it would be possible to use for example Arduino Pro Mini which is intended for this voltage and LDO voltage regulator connected directly to battery.


    Box for the electronics has dimensions of 60x60x30mm, it was 3D printed and consists of three parts: bottom, top and spacer, all STL files are uploaded on this project. Basically bottom part contains everything and top serves as lid. Between these two parts are two gabs where rubber comes through into the box. Top part is firmly held in place by four M3x15mm screws, this and small teeth in gabs ensures that rubber won’t fall out. Between battery and the PCB is placed thin 3D printed sheet which acts as spacer and ensures that sharp leads on the bottom side of the PCB would not damage the battery. PCB is fixed into the box with four standoffs in its corners into which comes screws.

    Box with electronics is only one part of the Headband. The other part is rubber band which comes around your head and in which vibration motors are held. Rubber band is 50cm long and 60mm wide, it is folded in half and inside are placed motors and wires connecting them. Each motor is placed inside 3D printed housing together with LED, its resistor and a diode. We bought vibration motors in local store and in future we may switch to flat ones and omit the whole housing. The only purpose of LEDs is to show in photo or video which motor is currently active and in future we will probably get rid of them.

    Vibration motors can’t be driven...

    Read more »

  • Making of our Android app

    Vojtech Pavlovsky08/24/2018 at 21:07 0 comments

    Hello everybody. My name is Vojtech and together with Tomas we are developing our Ariadne Headband. Our project should serve as a novel approach for navigating people that are in bad conditions. Our Headband uses 4 vibration motors that use haptic feedback to navigate you.

    When you use such a device, you want to choose where you want to go. This is the task of our mobile app. This log should document journey as a novice into mobile development with Ariadne Headband Control app. This app, together with other parts of our projects, is open-sourced on GitLab so you can download it and build it for your own needs.

    What do we need

    Ariadne Headband Control app depends on two important parts: maps and Bluetooth. We need maps so the users of our application can select their destination. While there are open-source options as a OpenStreetMap, they were not suitable for us. We selected Google’s SDKs because it supports both Maps and Location search (you can for example find shop location, not just the address). These SDKs also have good free usage quota and can be freely used to Android apps.

    The second important part is Bluetooth. We need Bluetooth in order to communicate with the Headband so we can control it. Currently, we have HC-06 Bluetooth module because it was available in our country and we needed to start fast (we started working on this project 1 month before deadline). HC-06 is Bluetooth classic module which means that is older version of Bluetooth protocol. It consumes more power and is more suitable for heavy data stream usages (as is streaming of audio). However, newer versions of protocol, Bluetooth Low Energy, would be better for our usage. We plan to switch in near future.

    Choosing the right toolkit

    We wanted to choose the best method possible for making of our app. Currently, there are two possibilities. We could either use Java and make native Android app that could run easily on my phone. This way we can access both Google SDKs and Bluetooth Classic. Second option is multi-platform development, most notably React Native and more recent Flutter. Advantage of this approach is that the same run could possibly run on both Android and iOS devices. The problem is that (in my opinion) React Native targets iOS better and Android performance is not that good. Flutter seemed very nice, developing apps was extremely straightforward and fast. Sadly, Flutter currently has poor support for Maps and does not have any library for Bluetooth Classic.

    The only possibility left was making a native Android app using Java. This was little bit scare business because we would not know if we can finish the app before the deadline. Jumping right into learning by doing was to best possible move. We finished the app in slightly over one week of hard work. And actually, Java seems pretty cool.

    The beta version

    Our app is developed as open-source project and is available on this gitlab repo. We did not published it yet on Google Play so if you want to run it yourself, you will need to build it from source with Android Studio. As we mentioned in repo’s README, you will need your own Google API key to successfully build and run the app.

    On the image above you can see screenshots from our app. It may not be the prettiest thing but it works well for beta version. When you open the app, you see landing page (Screenshot #1) where you can connect to Bluetooth device, open settings, select destination and start navigation. When you click on Select destination, you will see a page with Google Maps. The app will try to get your current GPS location. (Right now, GPS will be used only when you are on this page. In future releases, GPS will be used also in background so you can find your location in less time.) Thanks to Google Place Autocomplete SDK you can click on Search button to find the exact location of almost everything, e. g. shop or street. ...

    Read more »

View all 6 project logs

Enjoy this project?



Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates