changeset 80:3f210f7632c6

Use MPU-6050 for accelerometer
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Sat, 11 Oct 2014 14:55:47 +0200
parents c7712053e73e
children 15b840b5b756
files robot.py servo.py trot.py ukubik/accel.ino ukubik/ukubik.ino
diffstat 5 files changed, 56 insertions(+), 52 deletions(-) [+]
line wrap: on
line diff
--- a/robot.py	Wed Oct 01 17:50:29 2014 +0200
+++ b/robot.py	Sat Oct 11 14:55:47 2014 +0200
@@ -59,9 +59,9 @@
     def get_accel(self):
         sensors = self.legs[0].hip.get_sensors()
         return [
-            [v - t for (v, t) in zip(sensors[0:3], self.accel_trim)],  # avg
-            [v - t for (v, t) in zip(sensors[3:6], self.accel_trim)],  # min
-            [v - t for (v, t) in zip(sensors[6:9], self.accel_trim)],  # max
+            sensors[0:3], # accel
+            sensors[3:6], # gyro
+            sensors[6],   # temperature
         ]
 
     def get_battery(self):
--- a/servo.py	Wed Oct 01 17:50:29 2014 +0200
+++ b/servo.py	Sat Oct 11 14:55:47 2014 +0200
@@ -1,6 +1,8 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 
+import struct
+
 
 def _normalize_degrees(angle):
     """Convert an angle to range +-180 degree range."""
@@ -14,6 +16,9 @@
     value = int(value)
     return chr(value & 0xff) + (chr((value & 0xff00) >> 8))
 
+def _read_word(serial):
+    return struct.unpack('>h', serial.read(2))[0]
+
 class Servo(object):
     span = 180
     center = 90
@@ -45,7 +50,7 @@
         self.serial.write(command)
         while self.serial.read(1) != '\xff':
             pass
-        return [ord(c) for c in self.serial.read(9)]
+        return [_read_word(self.serial) for w in range(7)]
 
     def beep(self, frequency, duration):
         command = '\xf1'
--- a/trot.py	Wed Oct 01 17:50:29 2014 +0200
+++ b/trot.py	Sat Oct 11 14:55:47 2014 +0200
@@ -32,7 +32,7 @@
     def _lower_leg(self, leg):
         """Puts the leg on the ground."""
         leg.move_to((None, None, leg.home[2] + 1))
-        for frame in range(2):
+        for frame in range(1):
             yield
         leg.move_to((None, None, leg.home[2]))
         self.on_ground.add(leg)
@@ -52,7 +52,7 @@
             None,
         ))
         leg.rotate_by(self.rotation * leg.x_dir * leg.y_dir * 10)
-        for frame in range(4):
+        for frame in range(3):
             yield
 
     def stomp_anim(self):
@@ -73,7 +73,7 @@
             for frame, frame2 in zip(self._lower_leg(leg),
                                     self._lower_leg(leg2)):
                 yield
-            for frame in range(10):
+            for frame in range(14):
                 yield
 
     def retract_anim(self):
@@ -94,7 +94,7 @@
     import serial
     import kubik
 
-    FPS = 50
+    FPS = 40
 
     robot = kubik.Robot(serial.Serial('/dev/rfcomm0', 115200))
     creep = Creep(robot)
--- a/ukubik/accel.ino	Wed Oct 01 17:50:29 2014 +0200
+++ b/ukubik/accel.ino	Sat Oct 11 14:55:47 2014 +0200
@@ -1,53 +1,51 @@
-// 3.3V maximum for the acceleration sensor.
-#define ACCEL_MAX 676
+#include <Wire.h>
 
-// How many acceleration measurements to cache.
-#define MAX_ACCEL_BUFFER 16
-
-
-int accel_buffer[MAX_ACCEL_BUFFER][3];
+// I2C address of the MPU-6050
+const int MPU = 0x68;
 
 
 void read_accel() {
-    static unsigned char accel_buffer_index = 0;
-    accel_buffer[accel_buffer_index][0] = analogRead(A2);
-    accel_buffer[accel_buffer_index][1] = analogRead(A1);
-    accel_buffer[accel_buffer_index][2] = analogRead(A0);
-    accel_buffer_index += 1;
-    if (accel_buffer_index >= MAX_ACCEL_BUFFER) {
-        accel_buffer_index = 0;
-    }
+}
+
+void accel_setup() {
+  Wire.begin();
+  Wire.beginTransmission(MPU);
+  Wire.write(0x6B);  // PWR_MGMT_1 register
+  Wire.write(0);     // set to zero (wakes up the MPU-6050)
+  Wire.endTransmission(true);
+}
+
+int16_t _wire_read_int16() {
+    return Wire.read() << 8 | Wire.read();
+}
+
+void _serial_write_int16(int16_t what) {
+    Serial.write((what >> 8) & 0xff);
+    Serial.write(what & 0xff);
 }
 
 void do_accel() {
-    /* Report the readings of the acceleration sensor. */
-    int avg_x = 0;
-    int avg_y = 0;
-    int avg_z = 0;
-    int min_x = 676;
-    int min_y = 676;
-    int min_z = 676;
-    int max_x = 0;
-    int max_y = 0;
-    int max_z = 0;
-    for (unsigned char i = 0; i < MAX_ACCEL_BUFFER; i += 1) {
-        for (unsigned char axe = 0; axe < 3; ++axe) {
-            avg_x += accel_buffer[i][axe];
-            min_x = min(min_x, accel_buffer[i][axe]);
-            max_x = max(max_x, accel_buffer[i][axe]);
-        }
-    }
-    avg_x /= MAX_ACCEL_BUFFER;
-    avg_y /= MAX_ACCEL_BUFFER;
-    avg_z /= MAX_ACCEL_BUFFER;
+    int16_t acX, acY, acZ, tmp, gyX, gyY, gyZ;
+
+    Wire.beginTransmission(MPU);
+    Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
+    Wire.endTransmission(false);
+    Wire.requestFrom(MPU, 14, true);  // request a total of 14 registers
+    acX = _wire_read_int16();  // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
+    acY = _wire_read_int16();  // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
+    acZ = _wire_read_int16();  // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
+    tmp = _wire_read_int16();  // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
+    gyX = _wire_read_int16();  // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
+    gyY = _wire_read_int16();  // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
+    gyZ = _wire_read_int16(); // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
+    tmp = tmp / 340.00 + 36.53; // Convert to degrees Celsius.
+
     Serial.write(0xff);
-    Serial.write(map(avg_x, 0, 676, 0, 255));
-    Serial.write(map(avg_y, 0, 676, 0, 255));
-    Serial.write(map(avg_z, 0, 676, 0, 255));
-    Serial.write(map(min_x, 0, 676, 0, 255));
-    Serial.write(map(min_y, 0, 676, 0, 255));
-    Serial.write(map(min_z, 0, 676, 0, 255));
-    Serial.write(map(max_x, 0, 676, 0, 255));
-    Serial.write(map(max_y, 0, 676, 0, 255));
-    Serial.write(map(max_z, 0, 676, 0, 255));
+    _serial_write_int16(acX);
+    _serial_write_int16(acY);
+    _serial_write_int16(acZ);
+    _serial_write_int16(gyX);
+    _serial_write_int16(gyY);
+    _serial_write_int16(gyZ);
+    _serial_write_int16(tmp);
 }
--- a/ukubik/ukubik.ino	Wed Oct 01 17:50:29 2014 +0200
+++ b/ukubik/ukubik.ino	Sat Oct 11 14:55:47 2014 +0200
@@ -63,6 +63,7 @@
 
 void setup() {
     Serial.begin(SERIAL_SPEED);
+    accel_setup();
     servo_setup();
     beep_setup();
 }