meta-digi/meta-digi-del/recipes-digi/del-examples/files/accelerometer_test/accelerometer_calibrate

116 lines
3.4 KiB
Bash

#!/bin/sh
#===============================================================================
#
# accelerometer_calibrate
#
# Copyright (C) 2012-2013 by Digi International Inc.
# All rights reserved.
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 as published by
# the Free Software Foundation.
#
# !Description: calibrate CCIMX5X accelerometer
#
# The calibration details for this particular accelerometer (MMA7455L) are in
# Freescale's Application Note AN3745.
#
#===============================================================================
DEL_PLATFORM="$(cat /sys/kernel/machine/name)"
## Per-platform accelerometer data
# <platform> <driver_name> <i2c_address> <invert X-Y axis>
while read _pl _name _i2c _invertXY; do
eval "${_pl}_name=\"${_name}\""
eval "${_pl}_i2c=\"${_i2c}\""
eval "${_pl}_invertXY=\"${_invertXY}\""
done<<-_EOF_
ccimx51 mma7455l 1-001d y
ccimx53 mma7455l 2-001d
_EOF_
eval SYSFS_I2C_PATH="/sys/bus/i2c/drivers/\${${DEL_PLATFORM}_name}/\${${DEL_PLATFORM}_i2c}"
eval INVERTXY="\${${DEL_PLATFORM}_invertXY}"
SYS_ACCEL_MODE="${SYSFS_I2C_PATH}/mode"
SYS_ACCEL_MEASURE="${SYSFS_I2C_PATH}/measure"
SYS_ACCEL_GSELECT="${SYSFS_I2C_PATH}/gSelect"
SYS_ACCEL_CALIBRATION="${SYSFS_I2C_PATH}/calibration"
CALIBRATION_CFG="/etc/accel_calibration"
get_average_samples() {
local NUM_SAMPLES="20"
local x_total="0"
local y_total="0"
local z_total="0"
local _x
local _y
local _z
read _x _y _z < "${SYS_ACCEL_MEASURE}"
for i in $(seq ${NUM_SAMPLES}); do
x_total="$(( x_total + _x ))"
y_total="$(( y_total + _y ))"
z_total="$(( z_total + _z ))"
read _x _y _z < "${SYS_ACCEL_MEASURE}"
done
X="$(( x_total / ${NUM_SAMPLES} ))"
Y="$(( y_total / ${NUM_SAMPLES} ))"
Z="$(( z_total / ${NUM_SAMPLES} ))"
if [ -n "${INVERTXY}" ]; then
X="$(( (-1) * X ))"
Y="$(( (-1) * Y ))"
fi
}
onexit() {
local exit_status=${1:-$?}
echo Exiting $0 with $exit_status
exit $exit_status
}
trap onexit SIGHUP SIGINT SIGQUIT SIGTERM
if [ -f "${SYS_ACCEL_MODE}" -a -f "${SYS_ACCEL_MEASURE}" \
-a -f "${SYS_ACCEL_GSELECT}" -a -f "${SYS_ACCEL_CALIBRATION}" ]; then
: # Accelerometer exists: continue
else
printf "\n[ERROR]Accelerometer not present\n"
exit 1
fi
cat <<_EOF_
************************************
* MMA7455L Accelerometer *
* Calibration Script *
************************************
Please put the module in a flat surface before continuing...
_EOF_
while [ "${gSelect}" != "2" -a "${gSelect}" != "4" -a "${gSelect}" != "8" ]; do
read -p "Enter g sensitivity (2, 4 or 8): " gSelect
done
echo -n "Measurement" > "${SYS_ACCEL_MODE}"
echo -n "${gSelect}" > "${SYS_ACCEL_GSELECT}"
Z_CALIBRATED="-$((128 / gSelect))"
get_average_samples
read X_offset Y_offset Z_offset < "${SYS_ACCEL_CALIBRATION}"
while [ "${X}" != "0" -o "${Y}" != "0" -o "${Z}" != "${Z_CALIBRATED}" ]; do
[ "${X}" != "0" ] && X_offset="$((X_offset + (0 - X) * 2))"
[ "${Y}" != "0" ] && Y_offset="$((Y_offset + (0 - Y) * 2))"
[ "${Z}" != "${Z_CALIBRATED}" ] && Z_offset="$((Z_offset + (Z_CALIBRATED - Z) * 2))"
echo -n ${X_offset} ${Y_offset} ${Z_offset} > "${SYS_ACCEL_CALIBRATION}"
get_average_samples
done
printf "\nDone!. Saving calibration config: ${CALIBRATION_CFG}\n\n"
printf "%s %s %s %s\n" ${gSelect} ${X_offset} ${Y_offset} ${Z_offset} > ${CALIBRATION_CFG}