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.
main.cpp@0:6895e81fba91, 2017-06-30 (annotated)
- Committer:
- jan_koupil
- Date:
- Fri Jun 30 06:28:12 2017 +0000
- Revision:
- 0:6895e81fba91
Initial commit
Who changed what in which revision?
User | Revision | Line number | New 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 |