Overview

While practicing Yoga on your own, it can be helpful to use an interval timer to let you know when you have completed a certain pose. While there are myriad apps that offer this functionality that play a sound when the time is right, there is something wonderful about the sound of a physical gong being struck.

This project uses a CLUE board to display poses, proximity control to start your pose timer with the wave of a hand, and a solenoid striker to chime a singing bowl.

Parts

Adafruit CLUE - nRF52840 Express with Bluetooth LE

PRODUCT ID: 4500
Do you feel like you just don't have a CLUE? Well, we can help with that - get a CLUE here at Adafruit by picking up this sensor-packed development board. We wanted to build some...
$39.95
IN STOCK

Adafruit DragonTail for micro:bit - Fully Assembled

PRODUCT ID: 3695
Sometimes I dream of having a miniature pet dragon that would sit on my shoulder, while I write code and build projects. Maybe its little snorts of fire could even heat up my soldering...
$7.50
IN STOCK

Mini Push-Pull Solenoid - 5V

PRODUCT ID: 2776
Solenoids are basically electromagnets: they are made of a coil of copper wire with an armature (a slug of metal) in the middle. When the coil is energized, the slug is pulled into the...
OUT OF STOCK

Half-Size Breadboard with Mounting Holes

PRODUCT ID: 4539
This cute 3.2″ × 2.1″ (82 × 53mm) solderless half-size breadboard has four bus lines and 30 rows of pins, our favorite size of solderless breadboard for...
$5.00
IN STOCK

N-channel power MOSFET

PRODUCT ID: 355
When you need to switch a lot of power, N channel MOSFETs are best for the job. These FETs can switch over 60A and 30V and are TO-220 package so they fit nicely into any breadboard or...
OUT OF STOCK

1N4001 Diode - 10 pack

PRODUCT ID: 755
This here is a 10 pack of the classic 1N4001 power blocking diode. These are good for reverse polarity protection (put it between your DC power jack and circuitry to avoid a...
OUT OF STOCK

3 x AAA Battery Holder with On/Off Switch and 2-Pin JST

PRODUCT ID: 727
This battery holder connects 3 AAA batteries together in series for powering all kinds of projects. We spec'd these out because the box is slim, and 3 AAA's add up to about...
OUT OF STOCK

4 x AA Battery Holder with On/Off Switch

PRODUCT ID: 830
Make a nice portable power pack with this 4 x AA battery holder. It fits any alkaline or rechargeable AA batteries in series. There's a snap on cover and an on/off switch which can...
$2.95
IN STOCK

Premium Silicone Covered Male-Male Jumper Wires - 200mm x 40

PRODUCT ID: 4482
These premium male-male jumper wires are handy for making wire harnesses or jumpering between headers on PCBs. They're 200mm (~7.8") long and come loose as a pack of...
$9.95
IN STOCK

Alkaline AAA batteries - 3 pack

PRODUCT ID: 3520
Battery power for your portable project! These batteries are good quality at a good price, and work fantastic with any of the kits or projects in the shop that use AAA's. This is a...
$1.50
IN STOCK

Alkaline AA batteries (LR6) - 4 pack

PRODUCT ID: 3349
Battery power for your portable project! These batteries are good quality at a good price, and work fantastic with any of the kits or projects in the shop that use AAs. This is a...
$2.95
IN STOCK

Hook-up Wire Spool Set - 22AWG Solid Core - 6 x 25 ft

PRODUCT ID: 1311
Perfect for bread-boarding, free wiring, etc. This box contains 6 spools of solid-core wire. The wire is easy to solder to and when bent it keeps its shape pretty well. We like to have...
OUT OF STOCK

Little Rubber Bumper Feet - Pack of 4

PRODUCT ID: 550
Keep your electronics from going barefoot, give them little rubber feet! These small sticky bumpers are our favorite accessory for any electronic kit or device. They are sticky, but...
$0.95
IN STOCK

Singing Bowl

You'll also need a metal singing bowl for the solenoid to strike, such as this one.

Assemble the Pose Chime

The Yoga Pose Chime uses the CLUE to keep track of time spent in a pose, and to trigger the solenoid to ring the pleasant chime when it is complete. The solenoid draws more current at a higher voltage than the CLUE is meant to provide directly, so we'll create a transistor-based circuit to drive the solenoid.

The way the driver circuit works is that a small signal current tells the transistor to open up the flow of a larger current. When it's time to chime, the CLUE will send a 3V signal over pin 2 to the transistor, which opens the floodgate of the full 6V of the four AA batteries, at the much higher amperage needed to drive the solenoid.

For much more info on transistors, check out this excellent guide, Transistors 101.

Breadboarding

Carefully place the Dragon Tail breakout into the breadboard as shown. Pay special attention that the 3V pins are aligned with the left side power rail.

Use jumper wires and the components to build the circuit as shown in the circuit diagram above and the photos here.

You can use two male/male jumper wires to extend and connect the solenoid cable to the board.

NOTE: We're using the right side power rail for the 6V 4xAA battery pack and must connect only the black ground rails. DO NOT connect the right side red rail's +6V to the left side's +3V red rail!

Attach Solenoid

One tricky part of this type of build can be how to mount the solenoid to strike the bowl or gong. We're going to use the weight of the battery pack to hold it in place, and it's height for positioning.

Use double-stick foam tape to attach the solenoid to the battery pack as shown. You will want to check the height against the singing bowl for height positioning.

Add CLUE

If you haven't already, plug the CLUE into the Dragon Tail.

Breadboard Mount

Breadboards come with double-stick foam tape already attached to their bottoms. We'll use this to attach the breadboard and the rest of the circuit/CLUE to the battery case as shown.

Remove the protective backing and align the board with the battery pack so they can stand freely, then press and hold them together for ten seconds or so to allow the adhesive to set.

Add Feet

Add the four rubber bumper feet to the bottom as shown. This will give the device some needed friction to prevent it from moving when the solenoid strikes the bowl.

CLUE Power

The 3x AAA battery pack will power the CLUE itself (the 4x AA being used only for the solenoid). Adhere it to the breadboard's double-stick foam tap as shown and then plug it into the JST battery connector on the CLUE.

We'll use the on/off switches on the battery cases to turn on and off the entire device.

Next we'll code the CLUE in CircuitPython.

CircuitPython on CLUE

CircuitPython is a derivative of MicroPython designed to simplify experimentation and education on low-cost microcontrollers. It makes it easier than ever to get prototyping by requiring no upfront desktop software downloads. Simply copy and edit files on the CIRCUITPY flash drive to iterate.

The following instructions will show you how to install CircuitPython. If you've already installed CircuitPython but are looking to update it or reinstall it, the same steps work for that as well!

Set up CircuitPython Quick Start!

Follow this quick step-by-step for super-fast Python power :)

Click the link above to download the latest version of CircuitPython for the CLUE.

Download and save it to your desktop (or wherever is handy).

Plug your CLUE into your computer using a known-good USB cable.

A lot of people end up using charge-only USB cables and it is very frustrating! So make sure you have a USB cable you know is good for data sync.

Double-click the Reset button on the top (magenta arrow) on your board, and you will see the NeoPixel RGB LED (green arrow) turn green. If it turns red, check the USB cable, try another USB port, etc. Note: The little red LED next to the USB connector will pulse red. That's ok!

If double-clicking doesn't work the first time, try again. Sometimes it can take a few tries to get the rhythm right!

You will see a new disk drive appear called CLUEBOOT.

Drag the adafruit-circuitpython-clue-etc.uf2 file to CLUEBOOT.

The LED will flash. Then, the CLUEBOOT drive will disappear and a new disk drive called CIRCUITPY will appear.

If this is the first time you're installing CircuitPython or you're doing a completely fresh install after erasing the filesystem, you will have two files - boot_out.txt, and code.py, and one folder - lib on your CIRCUITPY drive.

If CircuitPython was already installed, the files present before reloading CircuitPython should still be present on your CIRCUITPY drive. Loading CircuitPython will not create new files if there was already a CircuitPython filesystem present.

That's it, you're done! :)

CLUE CircuitPython Libraries

The CLUE is packed full of features like a display and a ton of sensors. Now that you have CircuitPython installed on your CLUE, you'll need to install a base set of CircuitPython libraries to use the features of the board with CircuitPython.

Follow these steps to get the necessary libraries installed.

Installing CircuitPython Libraries on your CLUE

If you do not already have a lib folder on your CIRCUITPY drive, create one now.

Then, download the CircuitPython library bundle that matches your version of CircuitPython from CircuitPython.org.

The bundle downloads as a .zip file. Extract the file. Open the resulting folder.

Open the lib folder found within.

Once inside, you'll find a lengthy list of folders and .mpy files. To install a CircuitPython library, you drag the file or folder from the bundle lib folder to the lib folder on your CIRCUITPY drive.

Copy the following folders and files from the bundle lib folder to the lib folder on your CIRCUITPY drive:

  • adafruit_apds9960
  • adafruit_bmp280.mpy
  • adafruit_bus_device
  • adafruit_clue.mpy
  • adafruit_display_shapes
  • adafruit_display_text
  • adafruit_lis3mdl.mpy
  • adafruit_lsm6ds.mpy
  • adafruit_register
  • adafruit_sht31d.mpy
  • adafruit_slideshow.mpy
  • neopixel.mpy

Your lib folder should look like the image on the left. These libraries will let you run the demos in the CLUE guide.

Code the Yoga Pose Chime in CircuitPython

Libraries

With all of the necessary libraries installed, your CLUE should look like this.

  • adafruit_apds9960
  • adafruit_bmp280.mpy
  • adafruit_bus_device
  • adafruit_clue.mpy
  • adafruit_display_shapes
  • adafruit_display_text
  • adafruit_lis3mdl.mpy
  • adafruit_lsm6ds.mpy
  • adafruit_register
  • adafruit_sht31d.mpy
  • adafruit_slideshow.mpy
  • neopixel.mpy

Pose Bitmaps

You'll need to load some compatible bitmap files onto your CIRCUITPY drive. We've included a series of Yoga pose icons from svgrepo.com that are Creative Commons licensed.

To use them, first download the .zip file linked below, and uncompress it. Create a directory on the CLUE's root level called icons. Then, copy a few pose .bmp files into the icons folder.

For information on how to create your own compatible bitmaps, check out the Customization section of the Notifcation Icons page in this guide.

Text Editor

Adafruit recommends using the Mu editor for editing your CircuitPython code. You can get more info in this guide.

Alternatively, you can use any text editor that saves files.

Code

Copy the code from the code-block below and paste it into the Mu editor and save it to your CLUE as code.py (or copy code.py from the zip file and place on the CIRCUITPY drive).

# Yoga pose timer
# Requires CLUE with solenoid transistor driver circuit

import time
import board
from digitalio import DigitalInOut, Direction
from adafruit_clue import clue
from adafruit_slideshow import SlideShow, PlayBackDirection

pose_time = 30  # choose the time to hold each pose in seconds

solenoid = DigitalInOut(board.D2)  # pad #2 on CLUE driving a MOSFET
solenoid.direction = Direction.OUTPUT
solenoid.value = False

def chime(repeat):
    for _ in range(repeat):
        solenoid.value = True
        time.sleep(0.03)
        solenoid.value = False
        time.sleep(0.25)

slideshow = SlideShow(clue.display, None, folder="/icons", auto_advance=False)

while True:
    if clue.proximity > 10:
        time.sleep(1)
        chime(1)
        time.sleep(pose_time)
        chime(2)
        slideshow.direction = PlayBackDirection.FORWARD
        slideshow.advance()

    if clue.button_b:  # skip ahead
        slideshow.direction = PlayBackDirection.FORWARD
        slideshow.advance()

    if clue.button_a:  # skip back
        slideshow.direction = PlayBackDirection.BACKWARD
        slideshow.advance()

How to use the Yoga Pose Chime

  • Turn on both battery packs first, so the CLUE turns on and the solenoid can be triggered
  • You'll begin the first pose timer by waving your hand close to the CLUE's proximity sensor which is mounted right above the screen
  • The solenoid triggers once to chime the bowl, signaling the pose can begin
  • After 30 seconds (or your chosen interval time) the solenoid will chime twice, signaling the end of the pose
  • You can press the B button on the CLUE to skip ahead to a different pose, the A button to go back to a pose
This guide was first published on May 20, 2020. It was last updated on May 20, 2020.