A simple compass using the BBC Micro:Bit. Uses a point-line distance calculation to light the LEDs instead of commonly used pre-calculated LED Matrix which gives nicer representation of the direction.

Dependencies:   microbit

Committer:
jan_koupil
Date:
Fri Jun 30 06:28:12 2017 +0000
Revision:
0:6895e81fba91
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jan_koupil 0:6895e81fba91 1 /* See
jan_koupil 0:6895e81fba91 2 * http://lancaster-university.github.io/microbit-docs/advanced/
jan_koupil 0:6895e81fba91 3 * for docs about using the micro:bit library
jan_koupil 0:6895e81fba91 4 */
jan_koupil 0:6895e81fba91 5 #ifndef M_PI
jan_koupil 0:6895e81fba91 6 #define M_PI 3.14159265358979323846
jan_koupil 0:6895e81fba91 7 #endif
jan_koupil 0:6895e81fba91 8
jan_koupil 0:6895e81fba91 9 #include "MicroBit.h"
jan_koupil 0:6895e81fba91 10
jan_koupil 0:6895e81fba91 11 // a,b line normal vector coordinates, should be normalized, a^2 + b^2 = 1
jan_koupil 0:6895e81fba91 12 // returns if distance of point at coordinates x, y and vector line does not
jan_koupil 0:6895e81fba91 13 // exceed given range
jan_koupil 0:6895e81fba91 14 bool inRange(float a, float b, float x, float y, float range = 0.5)
jan_koupil 0:6895e81fba91 15 {
jan_koupil 0:6895e81fba91 16 return abs(a*x + b*y) < range;
jan_koupil 0:6895e81fba91 17 }
jan_koupil 0:6895e81fba91 18 // answer if the LED in row, column should be lit or turned off
jan_koupil 0:6895e81fba91 19 bool isLit(float a, float b, int row, int column)
jan_koupil 0:6895e81fba91 20 {
jan_koupil 0:6895e81fba91 21 float x = column - 2;
jan_koupil 0:6895e81fba91 22 float y = 2 - row;
jan_koupil 0:6895e81fba91 23 return inRange(a,b,x,y);
jan_koupil 0:6895e81fba91 24 }
jan_koupil 0:6895e81fba91 25
jan_koupil 0:6895e81fba91 26 float deg2rad(int deg)
jan_koupil 0:6895e81fba91 27 {
jan_koupil 0:6895e81fba91 28 return (float) deg * M_PI / 180;
jan_koupil 0:6895e81fba91 29 }
jan_koupil 0:6895e81fba91 30
jan_koupil 0:6895e81fba91 31 MicroBit uBit;
jan_koupil 0:6895e81fba91 32
jan_koupil 0:6895e81fba91 33 int main()
jan_koupil 0:6895e81fba91 34 {
jan_koupil 0:6895e81fba91 35
jan_koupil 0:6895e81fba91 36
jan_koupil 0:6895e81fba91 37 uBit.init();
jan_koupil 0:6895e81fba91 38
jan_koupil 0:6895e81fba91 39 while (true) {
jan_koupil 0:6895e81fba91 40 int heading = uBit.compass.heading();
jan_koupil 0:6895e81fba91 41 //uBit.serial.printf("%d\r\n", heading);
jan_koupil 0:6895e81fba91 42
jan_koupil 0:6895e81fba91 43 float angle = M_PI / 2 - deg2rad(heading); //calculate angle of displayed line
jan_koupil 0:6895e81fba91 44 float a = sin(angle); //calculate line normal vector parameters a, b
jan_koupil 0:6895e81fba91 45 float b = cos(angle);
jan_koupil 0:6895e81fba91 46
jan_koupil 0:6895e81fba91 47 for (int row = 0; row < 5; row++) {
jan_koupil 0:6895e81fba91 48 for (int col = 0; col < 5; col++) {
jan_koupil 0:6895e81fba91 49 uBit.display.image.setPixelValue(col,row,isLit(a, b, row, col) ? 255 : 0);
jan_koupil 0:6895e81fba91 50 }
jan_koupil 0:6895e81fba91 51 }
jan_koupil 0:6895e81fba91 52
jan_koupil 0:6895e81fba91 53 uBit.sleep (100);
jan_koupil 0:6895e81fba91 54 }
jan_koupil 0:6895e81fba91 55 }
jan_koupil 0:6895e81fba91 56