unfinished
Dependents: WRS_mechanamu_test WRS2019_master mbed_2018 mbed_2019_rx3 ... more
JY901.cpp
- Committer:
- sgrsn
- Date:
- 2018-11-14
- Revision:
- 6:7e7dd6184774
- Parent:
- 5:a492cfb18242
File content as of revision 6:7e7dd6184774:
#include "JY901.h" JY901::JY901(I2C *i2c) { _i2c = i2c; } JY901::JY901(I2C *i2c, Timer *timer) { _i2c = i2c; _timer = timer; angleZ = 0; for(int i = 0; i < 3; i++) gyroZ[i] = 0; _timer->start(); last_time = 0; time = _timer->read(); } float JY901::calculateAngleOnlyGyro() { last_time = time; time = _timer->read(); for(int i = 2; i > 0; i--) { gyroZ[i] = gyroZ[i-1]; } gyroZ[0] = getZaxisAngularVelocity(); dt = time - last_time; if( gyroZ[0] + gyroZ[2] != 0 ) angleZ += gyroZ[1] * dt; return angleZ; } void JY901::reset() { time = _timer->read(); for(int i = 0; i > 2; i++) { gyroZ[i] = 0; } } void JY901::calibrateGyroAccel() { _i2c->start(); _i2c->write(IICADDR); _i2c->write(CALSW); _i2c->write(0x01); _i2c->write(0x00); _i2c->stop(); } void JY901::calibrateMagnetic() { _i2c->start(); _i2c->write(IICADDR); _i2c->write(CALSW); _i2c->write(0x02); _i2c->write(0x00); _i2c->stop(); } void JY901::calibrateHeight() { _i2c->start(); _i2c->write(IICADDR); _i2c->write(CALSW); _i2c->write(0x03); _i2c->write(0x00); _i2c->stop(); } void JY901::endCalibrate() { _i2c->start(); _i2c->write(IICADDR); _i2c->write(CALSW); _i2c->write(0x00); _i2c->write(0x00); _i2c->stop(); } void JY901::calibrateAll(int time_ms) { calibrateGyroAccel(); calibrateMagnetic(); calibrateHeight(); wait_ms(time_ms); endCalibrate(); } int JY901::getYear() { char *data = getdata(YYMM); return (int)(*data); } int JY901::getMonth() { char *data = getdata(YYMM); return (int)(*(data+1)); } int JY901::getDay() { char *data = getdata(DDHH); return (int)(*data); } int JY901::getHour() { char *data = getdata(DDHH); return (int)(*(data+1)); } int JY901::getMinute() { char *data = getdata(MMSS); return (int)(*data); } int JY901::getSecond() { char *data = getdata(MMSS); return (int)(*(data+1)); } int JY901::getMillisecond() { char *data = getdata(MS); return (int)((*(data+1) << 8) | *data); } float JY901::getXaxisAcceleration() { char *data = getdata(AX); return (float)((*(data+1) << 8) | *data) / 32768 * 16 * g; } float JY901::getYaxisAcceleration() { char *data = getdata(AY); return (float)((*(data+1) << 8) | *data) / 32768 * 16 * g; } float JY901::getZaxisAcceleration() { char *data = getdata(AZ); return (float)((*(data+1) << 8) | *data) / 32768 * 16 * g; } float JY901::getXaxisAngularVelocity() { char *data = getdata(GX); return (float)((*(data+1) << 8 ) | *data) / 32768 * 2000; } float JY901::getYaxisAngularVelocity() { char *data = getdata(GY); return (float)((*(data+1) << 8 ) | *data) / 32768 * 2000; } float JY901::getZaxisAngularVelocity() { char *data = getdata(GZ); //return (float)((*(data+1) << 8 ) | *data) / 32768 * 2000; return s16(*data, *(data+1)) / 32768 * 2000; } float JY901::getXaxisMagnetic() { char *data = getdata(HX); return (float)((*(data+1) << 8) | *data); } float JY901::getYaxisMagnetic() { char *data = getdata(HY); return (float)((*(data+1) << 8) | *data); } float JY901::getZaxisMagnetic() { char *data = getdata(HZ); return (float)((*(data+1) << 8) | *data); } float JY901::getXaxisAngle() { char *data = getdata(Roll); return (float)((*(data+1) << 8) | *data) / 32768 * 180; } float JY901::getYaxisAngle() { char *data = getdata(Pitch); return (float)((*(data+1) << 8) | *data) / 32768 * 180; } float JY901::getZaxisAngle() { char *data = getdata(Yaw); return (float)((*(data+1) << 8) | *data) / 32768 * 180; } float JY901::getTemperature() { char *data = getdata(TEMP); return (float)((*(data+1) << 8) | *data) / 100; } float JY901::getD0Status() { char *data = getdata(D0Status); return (float)((*(data+1) << 8) | *data) / 4095; } float JY901::getD1Status() { char *data = getdata(D1Status); return (float)((*(data+1) << 8) | *data) / 4095; } float JY901::getD2Status() { char *data = getdata(D2Status); return (float)((*(data+1) << 8) | *data) / 4095; } float JY901::getD3Status() { char *data = getdata(D3Status); return (float)((*(data+1) << 8) | *data) / 4095; } float JY901::getPressure() //not use { char *dataL = getdata(PressureL); char *dataH = getdata(PressureH); return (float)((*(dataH+1) << 24) | (*dataH << 16) | (*(dataL+1) << 8) | *dataL); } float JY901::getHeight() //not use { char *dataL = getdata(HeightL); char *dataH = getdata(HeightH); return (float)( ( *(dataH+1) << 24) | (*dataH << 16) | (*(dataL+1) << 8) | *dataL ); } float JY901::getLongitude() //not use { char *dataL = getdata(LonL); char *dataH = getdata(LonH); return (float)( ( *(dataH+1) << 24) | (*dataH << 16) | (*(dataL+1) << 8) | *dataL ); } float JY901::getLatitude() //not use { char *dataL = getdata(LatL); char *dataH = getdata(LatH); return (float)( ( *(dataH+1) << 24) | (*dataH << 16) | (*(dataL+1) << 8) | *dataL ); } float JY901::getGPSHeight() { char *data = getdata(GPSHeight); return (float)((*(data+1) << 8) | *data); } float JY901::getGPSYaw() { char *data = getdata(GPSYaw); return (float)((*(data+1) << 8) | *data); } float JY901::getGPSspeed() { char *dataL = getdata(GPSVL); char *dataH = getdata(GPSVH); return (float)( ( *(dataH+1) << 24) | (*dataH << 16) | (*(dataL+1) << 8) | *dataL ); } char *JY901::getdata(char registar) { char data[2] = {}; _i2c->start(); _i2c->write(IICADDR); _i2c->write(registar); _i2c->read(IICADDR, data, 2); _i2c->stop(); return data; } float JY901::s16(int dataL, int dataH) { int value = (dataH << 8) | dataL; return -(value & 0b1000000000000000) | (value & 0b0111111111111111); }