José Juan Sánchez Hernández

Lifelong Learner

About me
Research
Phd Thesis
Teaching
Android
Experiments
NanoPlayBoard
SQL Playground
Talks
Blog

Bluetooth Low Energy remote control for Spotify

August 20, 2018


Bluetooth Low Energy remote control for Spotify on macOS with Node.js and AppleScript.

Diagram

Description

This project allows you to configure your micro:bit to work as a Bluetooth Low Energy (BLE) remote control to control an instance of Spotify running on macOS with Node.js and AppleScript. Users can use micro:bit to perform several actions like play or pause tracks, turn volume up or down and go to next or previous track. To carry out this actions, a custom event with a specific value for each action is raised over BLE when the micro:bit buttons are pressed by the user. The events raised by the micro:bit are catched by a Node.js script that is running on a computer with macOS.

The project is composed by two pieces of software:

  • the remote control, that is the software that runs on the micro:bit.
  • the event listener, that is the software that runs on your computer.

Video

How it works

Diagram

  1. In this diagram the micro:bit is ready in the Play state, this is known because the micro:bit is showing the letter P on the LED screen. An user press the A button and then a custom event is raised over BLE, with an specific value to indicate that we want to play or pause a track on Spotify.

  2. The event listener is a Node.js script that is running on the computer and is waiting for the events raised over BLE by the micro:bit device.

  3. When a custom event is catched by the Node.js script it uses the API of the spotify-node-applescript package in order to control the instance of Spotify running on the computer.

Remote Control details

States

The micro:bit device can be in one of a finite number of states at any given time. The list of available states are the following:

micro:bit’s LED screen State Description
Disconnected State Disconnected The micro:bit device is not connected with the computer via BLE.
Connected State Connected The micro:bit device is connected with the computer via BLE.
Play State Play The micro:bit device is ready to play or pause a track.
Volume State Volume The micro:bit device is ready to turn volume up or down.
Next State Next The micro:bit device is ready to go to next or previous track.

Inputs

The state machine can change from one state to another in response to external inputs. In our project there are two possible inputs:

Input Description
BLE When the micro:bit establishes a BLE connection with a computer.
AB When the micro:bit buttons A and B are pressed together.

Transitions

The change from one state to another is called a transition.

State machine diagram

The state diagram for the project can be modeled as follows:

State Machine

Where each state is represented by a node (circle) and the edges (arrows) show the transitions from one state to another. Each arrow is labeled with the input that triggers that transition.

Actions

The actions that users can perform to control Spotify via BLE are:

  • Play or pause tracks.
  • Turn volume up or down.
  • Go to next or previous track.

To run these actions the micro:bit device needs to be in one of these states:

  • P (Play).
  • V (Volume).
  • N (Next).

When the micro:bit is in one of these states the user can press the A or B buttons in order to raise a custom event to control Spotify. This table shows what are the different possibilities that an user can perform.

Input \ State P V N
Press A button Play or pause track Turn volume up Go previous track
Press B button   Turn volume down Go next track

No pairing security

Although this script is using BLE there is no need to pair your micro:bit with your computer. In order to get this, the pxt.json file has been configured as follows. The property of the bluetooth json object called open has been configured with a value of 1 which means no security.

"yotta": {
    "config": {
        "microbit-dal": {
            "bluetooth": {
                "open": 1
            }
        }
    }
}

How to build and deploy the remote control

npm install -g pxt
  • Clone this repository to your computer.
git clone https://github.com/josejuansanchez/microbit-ble-spotify.git
cd microbit-ble-spotify
cd ble-remote-control
  • Install the micro:bit target for PXT. This target allows you to program a micro:bit using PXT.
pxt target microbit
  • Install the required PXT packages for this project (core and bluetooth). The dependencies of the project are defined in pxt.json.
pxt install
  • Connect the micro:bit to your computer via USB.

  • To build and deploy the project, execute pxt with no arguments or run make. Doing this, PXT will compile and link the code into an .hex file and will deploy it into your connected micro:bit.

pxt

When you run the pxt command, you will see a similar message to this:

Using target PXT/microbit with build engine yotta
  Target dir:   /microbit-ble-rc-spotify/node_modules/pxt-microbit
  PXT Core dir: /microbit-ble-rc-spotify/node_modules/pxt-core
running 'pxt deploy' (run 'pxt help' for usage)
Package built; written to binary.hex; size: 605847
copying binary.hex to /Volumes/MICROBIT/
   wrote hex file to /Volumes/MICROBIT/

Now, your micro:bit device is ready to work as a remote control for Spotify on macOS with Node.js and AppleScript. The next step is to run the ble-event-listener script to listen to the custom events raised by the BBC micro:bit over BLE.

Compiled Firmware

The compiled firmware is available in the resources/firmware folder of the project. If your want you can avoid the build process and copy the .hex file to micro:bit disk drive.

How to run the event listener

  • Go to ble-event-listener directory.
cd ble-event-listener
node index.js

When you run the script, you will see a similar message to this:

Scanning for micro:bit...

Now, your event listener is ready to accept BLE connections from a micro:bit device.

GitHub

The source code of the project is available in GitHub.

Hackster.io

This post is also available in Hackster.io.

Packages used in this project

References