From 4e295b63c502ada8cf02b4269c69e5ea14d909d7 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Paul=20H=C3=A4nsch?= Date: Sun, 10 Mar 2019 15:51:23 +0100 Subject: [PATCH] service for reading mpu6050 data --- files_gyro/opt/gyro/mpu6050.sh | 78 ++++++++++++++++++++++++++++++++++ gyro.mk | 7 ++- 2 files changed, 83 insertions(+), 2 deletions(-) create mode 100755 files_gyro/opt/gyro/mpu6050.sh diff --git a/files_gyro/opt/gyro/mpu6050.sh b/files_gyro/opt/gyro/mpu6050.sh new file mode 100755 index 0000000..7184bff --- /dev/null +++ b/files_gyro/opt/gyro/mpu6050.sh @@ -0,0 +1,78 @@ +#!/bin/sh + +CR="$(printf \\r)" + +i2cset -y 1 0x68 0x1b 0x08 # Set gyroscope to +/- 500º/sec (1º/s = 65.5) +i2cset -y 1 0x68 0x1c 0x08 # Set accelerometer to +/- 4g (1g = 8192) + +read METHOD LOCATION PROTOCOL +while read name value; do + [ ! "${name%$CR}" ] && break +done + +printf 'HTTP/1.1 200 OK\r\n' +printf '%s: %s\r\n' \ + Connection close \ + Access-Control-Allow-Origin '*' \ + Content-Type text/event-stream +printf '\r\n' + +da=0 db=0 dc=0 dn=0 dm=50 +aa=0 ab=0 ac=0 + +while sleep .1; do + i2cdump -y 1 0x68 i || break +done \ +| sed -uEn ' + # pick Hex values, pair them and generate decimal calculations + /^[3]0:/{ + N; + s;^.{37}(.{15}).{24}(.{26}).{41}$; \1\2;; + s;(..) (..);\1\2;g; + s; (.)(.)(.)(.); 4096*\1+256*\2+16*\3+\4;g; + s;a;10;g; s;b;11;g; s;c;12;g; s;d;13;g; s;e;14;g; s;f;15;g; + p;}' \ +| while read x y z t a b c; do + # convert to decimal + x=$(($x)) y=$(($y)) z=$(($z)) t=$(($t)) a=$(($a)) b=$(($b)) c=$(($c)) + # convert from unsigned to signed + x=$((x - (x/32768 * 65536))) y=$((y - (y/32768 * 65536))) z=$((z - (z/32768 * 65536))) + a=$((a - (a/32768 * 65536))) b=$((b - (b/32768 * 65536))) c=$((c - (c/32768 * 65536))) + t=$((t - (t/32768 * 65536))) + + # measure gyroscope drift + if [ $dn -lt $dm ]; then + dn=$((dn + 1)) + da=$((da + a)) db=$((db + b)) dc=$((dc + c)) + elif [ $dn -eq $dm ]; then + dn=$((dn + 1)) + da=$((da / dm)) db=$((db / dm )) dc=$((dc / dm)) + aa=0 ab=0 ac=0 + fi + + # scale to proper range + x=$((x * 9810 / 8192)) y=$((y * 9810 / 8192)) z=$((z * 9810 / 8192)) + a=$(((a - da) * 125000 / 8192)) b=$(((b - db) * 125000 / 8192)) c=$(((c - dc) * 125000 / 8192)) + t=$((t * 1000 / 256)) + + # derive bearing from rotation + aa=$((aa + a / 10)) ab=$((ab + b / 10)) ac=$((ac + c / 10)) + + printf 'event: motion + data: %04i %04i %04i + + event: rotation + data: %04i %04i %04i + + event: bearing + data: %04i %04i %04i + + event: temperature + data: %04i + \n' $x $y $z \ + $a $b $c \ + $((aa * 12500 / 8192)) $((ab * 12500 / 8192)) $((ac * 12500 / 8192)) \ + $t \ + || break +done \ +| sed -uE 's;^ +;;; s;[0-9]{3} ;.&;g; s;[0-9]{3}$;.&;; s;-\.;-0.;g;' diff --git a/gyro.mk b/gyro.mk index 268cc87..bc480e0 100644 --- a/gyro.mk +++ b/gyro.mk @@ -1,6 +1,9 @@ -PACKAGES := ${PACKAGES} i2c-tools +PACKAGES := ${PACKAGES} i2c-tools openbsd-inetd .PHONY: gyro ${IMGFILE}: gyro -gyro: imgmount root_copy +gyro: imgmount root_copy files_gyro/ + cp -a files_gyro/. "$<" printf 'i2c-dev\n' >>"$>"$