This project serves as a template for work with the Freescale FRDM-KL46 board. Support will be added to all on-board peripherals, sensors and I/O.
Dependencies: FRDM_MMA8451Q MAG3110 TSI mbed
Fork of FRDM-KL46-Template by
Project Information:
Theory
This project has been created to serve as a template for those who wish to use the Freescale Freedom FRDM-KL46Z board. Existing drivers within mbed have been brought together and board specific configurations for certain inputs and outputs have included.
Libraries
- TSI (source: http://mbed.org/users/emilmont/code/TSI/ ) Capacitive Touch library to support the on-board Touch-Slider
- FRDM_MMA8451Q (source: http://mbed.org/users/clemente/code/FRDM_MMA8451Q/ ) Freescale MMA8451 Accelerometer connected on I2C0
- MAG3110 (source: http://mbed.org/users/mmaas/code/MAG3110/) (based on: http://mbed.org/users/SomeRandomBloke/code/MAG3110/)
TODOs
- Add support for Segment LCD - intend to use driver in example code: http://cache.freescale.com/files/32bit/software/KL46_SC.exe
Hardware Information:
FRDM-KL46Z Information
- User Guide Guide: http://cache.freescale.com/files/microcontrollers/doc/user_guide/FRDM-KL46Z_UM.pdf
- Schematics: http://cache.freescale.com/files/microcontrollers/hardware_tools/schematics/FRDM-KL46Z_SCH.pdf
Freescale Kinetis L-Series Microcontroller Information
- Kinetis KL46 Drop Page: http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=KL4x
- Kinetis KL46 Fact Sheet: http://cache.freescale.com/files/microcontrollers/doc/fact_sheet/LSERIESKL4FS.pdf
- Kinetis KL46 Reference Manual: http://cache.freescale.com/files/microcontrollers/doc/ref_manual/KL46P121M48SF4RM.pdf
- Kinetis KL46 Data Sheet: http://cache.freescale.com/files/microcontrollers/doc/data_sheet/KL46P121M48SF4.pdf
Freescale Sensor Information
MMA8451Q
MAG3110
Diff: main.cpp
- Revision:
- 3:1e85b49a3e18
- Parent:
- 2:48ac01f5024d
- Child:
- 4:6cb640167538
--- a/main.cpp Thu Dec 19 15:39:52 2013 +0000 +++ b/main.cpp Thu Dec 19 20:05:17 2013 +0000 @@ -1,26 +1,100 @@ #include "mbed.h" +#include "MMA8451Q.h" +#include "MAG3110.h" + +// This project has been created to bring together the libraries required to support +// the hardware and sensors found on the Freescale FRDM-KL46Z board. The following +// libraries are included and exercised in this project: +// +// mbed (source: official mbed library) +// Serial: +// Serial console routed through the mbed interface +// PTA2 / UART0_TX = TX Signal - also on Arduino pin D1 +// PTA1 / UART0_RX = RX Signal - also on Arduino pin D0 +// +// DigitalOut: +// GPIO to drive onboard LEDs +// PTD5 / GPIO = LED1 - drive low to turn on LED - also on Arduino pin D13 +// PTE29 / GPIO = LED2 - drive low to turn on LED +// +// DigitalIn: +// GPIO to monitor the two onboard push buttons +// PTC3 / GPIO = SW1 - low input = button pressed +// PTC12 / GPIO = SW3 - low input = button pressed +// +// TSI (source: http://mbed.org/users/emilmont/code/TSI/ ) +// Capacitive Touch library to support the onboard Touch-Slider +// +// FRDM_MMA8451Q (source: http://mbed.org/users/clemente/code/FRDM_MMA8451Q/ ) +// Freescale MMA8451 Accelerometer connected on I2C0 +// PTE24 / I2C0_SCL = I2C bus for communication (shared with MAG3110) +// PTE25 / I2C0_SDA = I2C bus for communication (shared with MAG3110) +// PTC5 / INT1_ACCEL = INT1 output of MMA8451Q +// PTD1 / INT2_ACCEL = INT2 output of MMA8451Q (shared with MAG3110) +// +// MAG3110 +// Freescale MAG3110 Magnetomoter connected on I2C0 +// PTE24 / I2C0_SCL = I2C bus for communication (shared with MMA8451) +// PTE25 / I2C0_SDA = I2C bus for communication (shared with MMA8451) +// PTD1 / INT1_MAG / INT2_ACCEL = INT1 output of MAG3110 (shared with MMA8451) +// +// FRDM_LightSensor +// Ambient light sensor (Q1) +// PTE22 / ADC +// +// FRDM_LCD +// 4 Digit Segment LCD +// TempSensor - KL46 + + +////////////////////////////////////////////////////////////////////// // Include support for USB Serial console Serial pc(USBTX, USBRX); + +////////////////////////////////////////////////////////////////////// // Include support for on-board green and red LEDs +#define LED_ON 0 +#define LED_OFF 1 DigitalOut greenLED(LED_GREEN); DigitalOut redLED(LED_RED); -// Definitions for LED states (logic inverted output value 0 = O) -#define LED_ON 0 -#define LED_OFF 1 + +////////////////////////////////////////////////////////////////////// +// Include support for onboard pushbuttons +DigitalIn sw1(PTC3); +DigitalIn sw3(PTC12); + -int main() { +///////////////////////////////////////////////////////////////////// +// Include support for MMA8451Q Acceleromoter +#define MMA8451_I2C_ADDRESS (0x1d<<1) +MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS); + + +///////////////////////////////////////////////////////////////////// +// Include support for MAG3110 Magnetometer +void calXY(); //magnetometer calibration: finding max and min of X, Y axis +MAG3110 mag(PTE25, PTE24); + + + +int main() +{ // Ensure LEDs are off greenLED = LED_OFF; redLED = LED_OFF; - + // Set Serial Port data rate and say Hello pc.baud( 230400 ); pc.printf("Hello World\r\n"); + // Turn on pull up resistors on pushbutton inputs + sw1.mode(PullUp); + sw3.mode(PullUp); + // Quick blink LEDs redLED = LED_ON; wait(.05); @@ -28,22 +102,100 @@ wait(.05); greenLED = LED_OFF; redLED = LED_OFF; - + wait(1); + + // Get some values + printf("DR_STATUS %X\r\n", mag.readReg( MAG_DR_STATUS )); + printf("WHO_AM_I %X\r\n", mag.readReg( MAG_WHO_AM_I )); + printf("SYSMOD %X\r\n", mag.readReg( MAG_SYSMOD )); + printf("DIE_TEMP %d\r\n", mag.readReg( MAG_DIE_TEMP )); + + printf("OFF_X %d\r\n", mag.readVal( MAG_OFF_X_MSB )); + printf("OFF_Y %d\r\n", mag.readVal( MAG_OFF_Y_MSB )); + printf("OFF_Z %d\r\n", mag.readVal( MAG_OFF_Z_MSB )); + + printf("CTRL_REG1 %X\r\n", mag.readReg( MAG_CTRL_REG1 )); + printf("CTRL_REG2 %X\r\n", mag.readReg( MAG_CTRL_REG2 )); - // Blink LEDs - green first + // Calibrate the magnetomoter + calXY(); + + + // Loop: Blink LEDs, report pushbutton status, mag data, accel data while(1) { + + // Get Magnetometer data + int xVal = mag.readVal(MAG_OUT_X_MSB); + int yVal = mag.readVal(MAG_OUT_Y_MSB); + float heading = mag.getHeading(); + + // Do something with heading - display direction + printf("Heading: "); + if (abs(heading) <= 22.5) printf("N "); + if (abs(heading) >= 157.5) printf("S "); + if (heading >= 67.5 && heading <= 112.5) printf("E "); + if (heading <= -67.5 && heading >= -112.5) printf("W "); + if (heading > 22.5 && heading < 67.5) printf("NE "); + if (heading < -22.5 && heading > -67.5) printf("NW "); + if (heading > 112.5 && heading < 157.5) printf("SE "); + if (heading < -112.5 && heading > -157.5) printf("SW "); + if (heading < 0) heading += 360.0; + printf("%f\r\n", heading); + + greenLED = LED_ON; redLED = LED_OFF; - - wait(1); - + + printf("SW1 = %d, SW3 = %d, X = %f, Y = %f, Z = %f\r\n\n", sw1.read(), sw3.read(), acc.getAccX(), acc.getAccY(), acc.getAccZ()); + wait(0.25); + greenLED = LED_OFF; redLED = LED_ON; - wait(1); + wait(0.25); } } + + +void calXY() //magnetometer calibration: finding max and min of X, Y axis +{ + int tempXmax, tempXmin, tempYmax, tempYmin, newX, newY; + + + printf("Press and release SW1 to Initiate Mag Calibration\r\n"); + // Wait for SW1 press and release + while( sw1 == 1 ) { + } + while( sw1 == 0 ) { + } + + printf("Rotate the board 360 degrees on a level plane then press and release SW1\r\n"); + + tempXmax = tempXmin = mag.readVal(MAG_OUT_X_MSB); + tempYmax = tempYmin = mag.readVal(MAG_OUT_Y_MSB); + + while(sw1 == 1) { + + newX = mag.readVal(MAG_OUT_X_MSB); + newY = mag.readVal(MAG_OUT_Y_MSB); + if (newX > tempXmax) tempXmax = newX; + if (newX < tempXmin) tempXmin = newX; + if (newY > tempYmax) tempYmax = newY; + if (newY < tempYmin) tempYmin = newY; + } + + mag.setCalibration( tempXmin, tempXmax, tempYmin, tempYmax ); + + // Wait for release + while( sw1 == 0 ) { + } + + printf("Calibration complete.\r\n"); + +} + +