Nuvoton / Mbed OS NuMaker-mbed-I2C_LCD_IMU_movingpointer
Committer:
ccli8
Date:
Tue Jul 11 13:39:41 2017 +0800
Revision:
2:eaffcbc62780
Parent:
1:b63d48f46e57
Update mbed-os to mbed-os-5.5.2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rkuo2000 1:b63d48f46e57 1 // NuMaker-PFM-NUC472 : I2C LCD+IMU control the direction of moving pointer
rkuo2000 0:aad987efa134 2 #include "mbed.h"
rkuo2000 0:aad987efa134 3 #include "math.h"
rkuo2000 0:aad987efa134 4 #include "mpu6500.h"
rkuo2000 0:aad987efa134 5 #include "ssd1306.h"
rkuo2000 0:aad987efa134 6 #include "draw2D.h"
rkuo2000 0:aad987efa134 7
rkuo2000 0:aad987efa134 8 #define PI 3.1415926535
rkuo2000 0:aad987efa134 9
rkuo2000 0:aad987efa134 10 #define X0 64 // initial point
rkuo2000 0:aad987efa134 11 #define Y0 32 // initial point
rkuo2000 0:aad987efa134 12
rkuo2000 0:aad987efa134 13 I2C i2c0(PC_9 , PA_15); // I2C0_SDA, I2C0_SCL
rkuo2000 0:aad987efa134 14 I2C i2c1(PD_12, PD_10); // I2C1_SDA, I2C1_SCL
rkuo2000 0:aad987efa134 15
rkuo2000 0:aad987efa134 16 MPU6500 IMU; // IMU connected on I2C0 (on-board MPU6500)
rkuo2000 0:aad987efa134 17 SSD1306 LCD; // LCD connected on I2C1
rkuo2000 0:aad987efa134 18 Draw2D D2D; // Draw2D library
rkuo2000 0:aad987efa134 19
rkuo2000 0:aad987efa134 20 int main() {
rkuo2000 0:aad987efa134 21 int accX, accY, accZ;
rkuo2000 0:aad987efa134 22 float theta, psi;
rkuo2000 0:aad987efa134 23
rkuo2000 0:aad987efa134 24 int dirX, dirY;
rkuo2000 0:aad987efa134 25 int movX, movY;
rkuo2000 0:aad987efa134 26 int x, y, r;
rkuo2000 0:aad987efa134 27
rkuo2000 0:aad987efa134 28 i2c0.frequency(400000);
rkuo2000 0:aad987efa134 29 i2c1.frequency(400000);
rkuo2000 0:aad987efa134 30
rkuo2000 0:aad987efa134 31 IMU.initialize();
rkuo2000 0:aad987efa134 32 LCD.initialize();
rkuo2000 0:aad987efa134 33 LCD.clearscreen();
rkuo2000 0:aad987efa134 34
rkuo2000 0:aad987efa134 35 x = X0; // cross center x
rkuo2000 0:aad987efa134 36 y = Y0; // cross center y
rkuo2000 0:aad987efa134 37 r = 2; // cross length
rkuo2000 0:aad987efa134 38
rkuo2000 0:aad987efa134 39 movX = 2; // x movement
rkuo2000 0:aad987efa134 40 movY = 2; // y movement
rkuo2000 0:aad987efa134 41 dirX = 1; // x direction
rkuo2000 0:aad987efa134 42 dirY = 1; // y direction
rkuo2000 0:aad987efa134 43
rkuo2000 0:aad987efa134 44 while(true) {
rkuo2000 0:aad987efa134 45 D2D.drawLine(x-2, y, x+2, y, FG_COLOR, BG_COLOR); // draw a line
rkuo2000 0:aad987efa134 46 D2D.drawLine(x, y-2, x, y+2, FG_COLOR, BG_COLOR); // draw a line
rkuo2000 0:aad987efa134 47
rkuo2000 0:aad987efa134 48 Thread::wait(10);
rkuo2000 0:aad987efa134 49
rkuo2000 0:aad987efa134 50 D2D.drawLine(x-2, y, x+2, y, BG_COLOR, BG_COLOR); // draw a line
rkuo2000 0:aad987efa134 51 D2D.drawLine(x, y-2, x, y+2, BG_COLOR, BG_COLOR); // draw a line
rkuo2000 0:aad987efa134 52
rkuo2000 0:aad987efa134 53 // read Accelerometer to calculate tilt angle
rkuo2000 0:aad987efa134 54 accX = IMU.getAccelXvalue();
rkuo2000 0:aad987efa134 55 accY = IMU.getAccelYvalue();
rkuo2000 0:aad987efa134 56 accZ = IMU.getAccelZvalue();
rkuo2000 0:aad987efa134 57 theta = atan(accX / sqrt(pow(accY,2.0) + pow(accZ,2.0))) *180 /PI;
rkuo2000 0:aad987efa134 58 psi = atan(accY / sqrt(pow(accZ,2.0) + pow(accX,2.0))) *180 /PI;
rkuo2000 0:aad987efa134 59
rkuo2000 0:aad987efa134 60 if (theta<-20) dirX= 1;
rkuo2000 0:aad987efa134 61 else if (theta> 20) dirX=-1;
rkuo2000 0:aad987efa134 62 else dirX= 0;
rkuo2000 0:aad987efa134 63 if (psi <-20) dirY= 1;
rkuo2000 0:aad987efa134 64 else if (psi > 20) dirY=-1;
rkuo2000 0:aad987efa134 65 else dirY= 0;
rkuo2000 0:aad987efa134 66
rkuo2000 0:aad987efa134 67 x = x + dirX * movX; // change x of circle center
rkuo2000 0:aad987efa134 68 y = y + dirY * movY; // change y of circle center
rkuo2000 0:aad987efa134 69
rkuo2000 0:aad987efa134 70 // boundary check for changing direction
rkuo2000 0:aad987efa134 71 if ((x-r) <=0) {dirX= 1; x= x + dirX*movX;}
rkuo2000 0:aad987efa134 72 else if ((x+r) >=LCD_Xmax) {dirX=-1; x= x + dirX*movX;}
rkuo2000 0:aad987efa134 73
rkuo2000 0:aad987efa134 74 if ((y-r) <=0) {dirY= 1; y= y + dirY*movY;}
rkuo2000 0:aad987efa134 75 else if ((y+r) >=LCD_Ymax) {dirY=-1; y= y + dirY*movY;}
rkuo2000 0:aad987efa134 76 }
rkuo2000 0:aad987efa134 77 }