# HG changeset patch # User Paul Boddie # Date 1418753228 0 # Node ID e7c0bbc0a71e6fe4ad28bdbe818b837f81b12346 # Parent 2001f688df48ab8874fc82f07a9f513b4e14fc46 Added a magnetometer test program and updated the Makefile. diff -r 2001f688df48 -r e7c0bbc0a71e Makefile --- a/Makefile Tue Dec 16 18:04:56 2014 +0000 +++ b/Makefile Tue Dec 16 18:07:08 2014 +0000 @@ -18,9 +18,10 @@ LDFLAGS = -lm -lubb -L$(LIBUBB) $(shell $(SYSROOT)/usr/bin/sdl-config --libs) -Wl,-rpath-link,$(SYSROOT)/usr/lib -lSDL_gfx IMU = imu -TEST = itest +ITEST = itest +MTEST = mtest CALIBRATE = calibrate -TARGETS = $(IMU) $(TEST) $(CALIBRATE) +TARGETS = $(IMU) $(ITEST) $(MTEST) $(CALIBRATE) BASICSRC = imu.c i2c.c shutdown.c geo.c UISRC = measure.c ui.c gui.c @@ -28,13 +29,16 @@ IMUSRC = $(BASICSRC) $(UISRC) main.c IMUOBJ = $(IMUSRC:.c=.o) -TESTSRC = $(BASICSRC) $(UISRC) itest.c -TESTOBJ = $(TESTSRC:.c=.o) +ITESTSRC = $(BASICSRC) $(UISRC) itest.c +ITESTOBJ = $(ITESTSRC:.c=.o) + +MTESTSRC = $(BASICSRC) $(UISRC) mtest.c +MTESTOBJ = $(MTESTSRC:.c=.o) CALIBRATESRC = $(BASICSRC) calibrate.c CALIBRATEOBJ = $(CALIBRATESRC:.c=.o) -ALLSRC = $(BASICSRC) $(UISRC) main.c itest.c calibrate.c +ALLSRC = $(BASICSRC) $(UISRC) main.c itest.c mtest.c calibrate.c ALLOBJ = $(ALLSRC:.c=.o) .PHONY: all clean distclean @@ -50,8 +54,11 @@ $(IMU): $(IMUOBJ) $(CC) $(LDFLAGS) $(IMUOBJ) -o $@ -$(TEST): $(TESTOBJ) - $(CC) $(LDFLAGS) $(TESTOBJ) -o $@ +$(ITEST): $(ITESTOBJ) + $(CC) $(LDFLAGS) $(ITESTOBJ) -o $@ + +$(MTEST): $(MTESTOBJ) + $(CC) $(LDFLAGS) $(MTESTOBJ) -o $@ $(CALIBRATE): $(CALIBRATEOBJ) $(CC) $(LDFLAGS) $(CALIBRATEOBJ) -o $@ diff -r 2001f688df48 -r e7c0bbc0a71e mtest.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mtest.c Tue Dec 16 18:07:08 2014 +0000 @@ -0,0 +1,123 @@ +/* + * Sample Pololu MinIMU-9 measurements. + * + * Copyright (C) 2013, 2014 Paul Boddie + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +#include +#include +#include +#include +#include +#include "imu.h" +#include "shutdown.h" +#include "geo.h" +#include "measure.h" + +vectorf xymax = {{0, 0, 0}}, + yzmax = {{0, 0, 0}}, + xzmax = {{0, 0, 0}}; + +void mtest_shutdown(int signum) +{ + printf("\n%-6.4f %-6.4f %-6.4f %-6.4f %-6.4f %-6.4f\n", + xymax.x, xymax.y, yzmax.y, yzmax.z, xzmax.x, xzmax.z); + init_shutdown(signum); +} + +/* Main program. */ + +int main(int argc, char *argv[]) +{ + uint8_t result[6]; + vectorf value; + double xymag, yzmag, xzmag; + double xymagmax = 0, yzmagmax = 0, xzmagmax = 0; + + signal(SIGINT, mtest_shutdown); + + /* Access the 8:10 port. */ + + if (ubb_open(0) < 0) { + perror("ubb_open"); + return 1; + } + + ubb_power(1); + printf("Power on.\n"); + + /* Bring the IMU up. */ + + imu_init(); + + imu_sendone(IMU_MAGNET_ADDRESS, IMU_MAGNET_CRA_REG_M, IMU_MAGNET_FREQ); + imu_sendone(IMU_MAGNET_ADDRESS, IMU_MAGNET_CRB_REG_M, IMU_MAGNET_SCALE); + imu_sendone(IMU_MAGNET_ADDRESS, IMU_MAGNET_MR_REG_M, IMU_MAGNET_MR_REG_CONT); + + if (imu_recv(IMU_GYRO_ADDRESS, IMU_GYRO_WHO_AM_I, result, 1)) + printf("Who am I? %x\n", result[0]); + + if (imu_recv(IMU_MAGNET_ADDRESS, IMU_MAGNET_WHO_AM_I_M, result, 1)) + printf("Who am I? %x\n", result[0]); + + if (imu_recv(IMU_MAGNET_ADDRESS, IMU_MAGNET_IRA_REG_M, result, 1)) + printf("Identification A? %x\n", result[0]); + + if (imu_recv(IMU_MAGNET_ADDRESS, IMU_MAGNET_IRB_REG_M, result, 1)) + printf("Identification B? %x\n", result[0]); + + if (imu_recv(IMU_MAGNET_ADDRESS, IMU_MAGNET_IRC_REG_M, result, 1)) + printf("Identification C? %x\n", result[0]); + + /* Initialise the recorded magnetometer limits. */ + + mag_calibrate(); + + while (1) + { + imu_read_vector_xzy(IMU_MAGNET_ADDRESS, IMU_MAGNET_OUT_X_H_M, &value, convertBE12L); + normalise(&value, &fieldmin, &fieldmax, &value); + + xymag = sqrt(pow(value.x, 2) + pow(value.y, 2)); + yzmag = sqrt(pow(value.y, 2) + pow(value.z, 2)); + xzmag = sqrt(pow(value.x, 2) + pow(value.z, 2)); + + if (xymag > xymagmax) + { + xymagmax = xymag; + xymax.x = value.x; xymax.y = value.y; + } + + if (yzmag > yzmagmax) + { + yzmagmax = yzmag; + yzmax.y = value.y; yzmax.z = value.z; + } + + if (xzmag > xzmagmax) + { + xzmagmax = xzmag; + xzmax.x = value.x; xzmax.z = value.z; + } + + printf("V: % 6.4f, % 6.4f, % 6.4f " + "XY: % 6.4f " + "YZ: % 6.4f " + "XZ: % 6.4f\n", + value.x, value.y, value.z, + xymag, yzmag, xzmag + ); + + usleep(IMU_MAGNET_UPDATE_PERIOD); + } + + /* This should be unreachable. */ + + ubb_close(0); + return 0; +}