Change MPU to interface to allow RY835AI or RY836AI (or ....)

pull/578/head
Eric Westphal 2016-07-13 18:42:25 -04:00
rodzic c3c49b7c36
commit 7ee7a83a87
4 zmienionych plików z 44 dodań i 19 usunięć

Wyświetl plik

@ -86,10 +86,14 @@ type SituationData struct {
Pressure_alt float64 Pressure_alt float64
LastTempPressTime time.Time LastTempPressTime time.Time
// From MPU6050 accel/gyro. // From MPU6050 or MPU9250 accel/gyro.
Pitch float64 Pitch float64
Roll float64 Roll float64
Gyro_heading float64 Gyro_heading float64
Mag_heading float64
SlipSkid float64
RateOfTurn float64
GLoad float64
LastAttitudeTime time.Time LastAttitudeTime time.Time
} }
@ -428,10 +432,11 @@ func validateNMEAChecksum(s string) (string, bool) {
// changes while on the ground and "movement" is really only changes in GPS fix as it settles down. // changes while on the ground and "movement" is really only changes in GPS fix as it settles down.
//TODO: Some more robust checking above current and last speed. //TODO: Some more robust checking above current and last speed.
//TODO: Dynamic adjust for gain based on groundspeed //TODO: Dynamic adjust for gain based on groundspeed
//westphae: Do I need to do anything here?
func setTrueCourse(groundSpeed uint16, trueCourse float64) { func setTrueCourse(groundSpeed uint16, trueCourse float64) {
if myMPU6050 != nil && globalStatus.RY835AI_connected && globalSettings.AHRS_Enabled { if myMPU != nil && globalStatus.RY835AI_connected && globalSettings.AHRS_Enabled {
if mySituation.GroundSpeed >= 7 && groundSpeed >= 7 { if mySituation.GroundSpeed >= 7 && groundSpeed >= 7 {
myMPU6050.ResetHeading(trueCourse, 0.10) myMPU.ResetHeading(trueCourse, 0.10)
} }
} }
} }
@ -1338,7 +1343,7 @@ func gpsSerialReader() {
var i2cbus embd.I2CBus var i2cbus embd.I2CBus
var myBMP180 *bmp180.BMP180 var myBMP180 *bmp180.BMP180
var myMPU6050 *mpu6050.MPU6050 var myMPU mpu.MPU
func readBMP180() (float64, float64, error) { // ºCelsius, Meters func readBMP180() (float64, float64, error) { // ºCelsius, Meters
temp, err := myBMP180.Temperature() temp, err := myBMP180.Temperature()
@ -1358,8 +1363,9 @@ func initBMP180() error {
return nil return nil
} }
func initMPU6050() error { //TODO westphae: set up myMPU as MPU6050 or MPU9250, depending on which exists
myMPU6050 = mpu6050.New() //TODO: error checking. func initMPU() error {
myMPU = mpu.NewMPU6050() //TODO: error checking.
return nil return nil
} }
@ -1404,9 +1410,9 @@ func makeAHRSGDL90Report() {
pitch := int16(float64(mySituation.Pitch) * float64(10.0)) pitch := int16(float64(mySituation.Pitch) * float64(10.0))
roll := int16(float64(mySituation.Roll) * float64(10.0)) roll := int16(float64(mySituation.Roll) * float64(10.0))
hdg := uint16(float64(mySituation.Gyro_heading) * float64(10.0)) hdg := uint16(float64(mySituation.Gyro_heading) * float64(10.0))
slip_skid := int16(float64(0) * float64(10.0)) slip_skid := int16(float64(mySituation.SlipSkid) * float64(10.0))
yaw_rate := int16(float64(0) * float64(10.0)) turn_rate := int16(float64(mySituation.RateOfTurn) * float64(10.0))
g := int16(float64(1.0) * float64(10.0)) g := int16(float64(mySituation.GLoad) * float64(10.0))
// Roll. // Roll.
msg[4] = byte((roll >> 8) & 0xFF) msg[4] = byte((roll >> 8) & 0xFF)
@ -1425,8 +1431,8 @@ func makeAHRSGDL90Report() {
msg[11] = byte(slip_skid & 0xFF) msg[11] = byte(slip_skid & 0xFF)
// Yaw rate. // Yaw rate.
msg[12] = byte((yaw_rate >> 8) & 0xFF) msg[12] = byte((turn_rate >> 8) & 0xFF)
msg[13] = byte(yaw_rate & 0xFF) msg[13] = byte(turn_rate & 0xFF)
// "G". // "G".
msg[14] = byte((g >> 8) & 0xFF) msg[14] = byte((g >> 8) & 0xFF)
@ -1440,14 +1446,14 @@ func attitudeReaderSender() {
for globalStatus.RY835AI_connected && globalSettings.AHRS_Enabled { for globalStatus.RY835AI_connected && globalSettings.AHRS_Enabled {
<-timer.C <-timer.C
// Read pitch and roll. // Read pitch and roll.
pitch, err_pitch := myMPU6050.Pitch() pitch, err_pitch := myMPU.Pitch()
if err_pitch != nil { if err_pitch != nil {
log.Printf("readMPU6050(): %s\n", err_pitch.Error()) log.Printf("readMPU6050(): %s\n", err_pitch.Error())
globalStatus.RY835AI_connected = false globalStatus.RY835AI_connected = false
break break
} }
roll, err_roll := myMPU6050.Roll() roll, err_roll := myMPU.Roll()
if err_roll != nil { if err_roll != nil {
log.Printf("readMPU6050(): %s\n", err_roll.Error()) log.Printf("readMPU6050(): %s\n", err_roll.Error())
@ -1455,7 +1461,7 @@ func attitudeReaderSender() {
break break
} }
heading, err_heading := myMPU6050.Heading() //FIXME. Experimental. heading, err_heading := myMPU.Heading() //FIXME. Experimental.
if err_heading != nil { if err_heading != nil {
log.Printf("readMPU6050(): %s\n", err_heading.Error()) log.Printf("readMPU6050(): %s\n", err_heading.Error())
globalStatus.RY835AI_connected = false globalStatus.RY835AI_connected = false
@ -1559,7 +1565,8 @@ func initAHRS() error {
i2cbus.Close() i2cbus.Close()
return err return err
} }
if err := initMPU6050(); err != nil { // I2C accel/gyro. // TODO westphae: Initialize MPU9250 here
if err := initMPU(); err != nil { // I2C accel/gyro.
i2cbus.Close() i2cbus.Close()
myBMP180.Close() myBMP180.Close()
return err return err

13
mpu/mpu.go 100644
Wyświetl plik

@ -0,0 +1,13 @@
package mpu
type MPU interface {
Close()
ResetHeading(float64, float64)
Pitch() (float64, error)
Roll() (float64, error)
Heading() (float64, error)
MagHeading() (float64, error)
SlipSkid() (float64, error)
RateOfTurn() (float64, error)
GLoad() (float64, error)
}

Wyświetl plik

@ -1,6 +1,6 @@
// Package mpu6050 allows interfacing with InvenSense mpu6050 barometric pressure sensor. This sensor // Package mpu6050 allows interfacing with InvenSense mpu6050 barometric pressure sensor. This sensor
// has the ability to provided compensated temperature and pressure readings. // has the ability to provided compensated temperature and pressure readings.
package mpu6050 package mpu
import ( import (
"../linux-mpu9150/mpu" "../linux-mpu9150/mpu"
@ -40,7 +40,7 @@ type MPU6050 struct {
} }
// New returns a handle to a MPU6050 sensor. // New returns a handle to a MPU6050 sensor.
func New() *MPU6050 { func NewMPU6050() *MPU6050 {
n := &MPU6050{poll: pollDelay} n := &MPU6050{poll: pollDelay}
n.startUp() n.startUp()
return n return n
@ -185,3 +185,8 @@ func (d *MPU6050) Close() {
d.quit <- struct{}{} d.quit <- struct{}{}
} }
} }
func (d *MPU6050) MagHeading() (float64, error) {return 0, nil}
func (d *MPU6050) SlipSkid() (float64, error) {return 0, nil}
func (d *MPU6050) RateOfTurn() (float64, error) {return 0, nil}
func (d *MPU6050) GLoad() (float64, error) {return 0, nil}

Wyświetl plik

@ -7,7 +7,7 @@ import (
"time" "time"
) )
var attSensor *mpu6050.MPU6050 var attSensor mpu.MPU
func readMPU6050() (float64, float64) { func readMPU6050() (float64, float64) {
pitch, _ := attSensor.Pitch() pitch, _ := attSensor.Pitch()
@ -17,7 +17,7 @@ func readMPU6050() (float64, float64) {
} }
func initMPU6050() { func initMPU6050() {
attSensor = mpu6050.New() attSensor = mpu.NewMPU6050()
} }
func main() { func main() {