From 58370b79b3a1d174e9b21b03449702b782223fed Mon Sep 17 00:00:00 2001 From: Julian Gaal Date: Mon, 8 Apr 2019 10:11:36 +0200 Subject: [PATCH] first commit --- .cargo/config | 2 + .gitignore | 3 ++ Cargo.toml | 10 ++++ README.md | 1 + src/.lib.rs.swp | Bin 0 -> 12288 bytes src/bin/.linux.rs.swp | Bin 0 -> 12288 bytes src/bin/linux.rs | 14 ++++++ src/lib.rs | 109 ++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 139 insertions(+) create mode 100644 .cargo/config create mode 100644 .gitignore create mode 100644 Cargo.toml create mode 100644 README.md create mode 100644 src/.lib.rs.swp create mode 100644 src/bin/.linux.rs.swp create mode 100644 src/bin/linux.rs create mode 100644 src/lib.rs diff --git a/.cargo/config b/.cargo/config new file mode 100644 index 0000000..112515e --- /dev/null +++ b/.cargo/config @@ -0,0 +1,2 @@ +[target.arm-unknown-linux-gnueabihf] +linker = "arm-linux-gnueabihf-gcc" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2f88dba --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/target +**/*.rs.bk +Cargo.lock \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..cfadaa1 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "mpu6050" +version = "0.1.0" +authors = ["Julian Gaal "] +edition = "2018" + +[dependencies] +i2cdev = "0.4.1" +embedded-hal = "0.2.2" +linux-embedded-hal = "0.2.2" diff --git a/README.md b/README.md new file mode 100644 index 0000000..971d973 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# mpu6050 diff --git a/src/.lib.rs.swp b/src/.lib.rs.swp new file mode 100644 index 0000000000000000000000000000000000000000..9775e8c8424f27fd653fd20d909324cc74a9a8eb GIT binary patch literal 12288 zcmeI2TWB0r7{^bwt(Uf5sp6F{4U}2j>^*crHdS>SdxxNci_4gM4tp@2|8C?FIN3J3*+ z0zv_yfKWgvAQTV^2n8-d1r&|3UoU6u{T*-~|Nn1&|NrG$#(oB$g7?5#@C>K`6_mj+ zxE!3}(PI*a5!X&Dh7_b#NBE0Or79@cS;t zegmI?cff1lIq(E{9Gn7^-~n(98~_8LAKU_N1~-8VS2Ok__!@i(z5wrnH^Gx&1uTL4 zz(F8^y?5qu6l1J8mL5CyxzF7ORvb{?DqZv0*aZvb%!1%v|sD+Sj4 zgAtB3@9f@9EK21@rNS-0X@du|vAIyYd)?Aa$1wY(ePa_-v??E7+ZU$&zJ<^s*6!z; zj#QO;iCdPGx2&2a%Y}p*I((?z#pXsOq9@eIvZXt`WN}54#{Hjkl_rm7r}L$3E?0#0 zSw+(+G8YXz`Pg8G{sbZ36+8gT58K%IVOpQ#421cmJ?S|nD zH8NrHTph}fjL@pTm>xl-P)7;ReT^GRGvb{~Ra=V3V6n5pwucbopQ*9A5Me4e9Uep_ zSfeMRwDBVS{_B@3g|=F5vF0d_UNdQxR%D7t!qk*0fy-%`k`Y?-#RwdjZ(6mIrZ`H+ ziEeRQwuUOn#K=|?ckA5AxFBq_>gHVVM|aM3Lgnghai?LKZa~}lXD%s*u8l6}^@1j~ z40Odyue8ik-!NUAi^vJrvU|8W*YanWyj;F%*6+3`Xv-2;i1xTRN`8|$-mG`dCE zIQjhSW1fRJd7XkeT~B%+_z81tVkTcKjgO5_mEvKFt#ep6b?0BX+ZzgRe}vo9yZ&L{ zcNzkv19=0nOuj6kmrR8)c?M+4c?mU%J&dk?EOKad_u#mV?TftfCMn1?0KguAY>?aeXe)g6DrLQlG)u=r-8(I^FvNJT1BAxF!K?G-sc#D#<^ z<-2<)Mo}|u;%*uCrsZa%+AekQwSQJaYA$gp$IFfR&>V9o$r=XLYqqVI4epP%NjJ$^ z&}~vJ#o_oAUo&loviDAwCi6#Sk}By`n0ihjs4vCS$xI4mBNIR9R*zKdU>cW1ER~61 z_jz-vDmS=Qt8#~1G|5d{cl0IQX$DhlIYZK|PU*qOV3?AL2nu;T9Z3bo$55GiYz9WV zazEh~N4OeWNvns*bE#m$6;m-tHEQbO#Y5tqA?095kyEmxv6TnAt&}&l0v!xS>&%RuC{CA#l#!eICEQiEF{-78Hcw=lTUV{n~|{#&6Pzyt8k z-$Jbjbw2mBJEb$I+-v@ain5!ENE%so3y{3(R<63D!F<{9}`98|w^=&V3jwJLOT9w&PQqtTaVMXv2GTPraYt~A(qs_5D0bxu> A1^@s6 literal 0 HcmV?d00001 diff --git a/src/bin/.linux.rs.swp b/src/bin/.linux.rs.swp new file mode 100644 index 0000000000000000000000000000000000000000..b0fb9dcca118d88597196710f45f78def0bf3326 GIT binary patch literal 12288 zcmeI&zi-n(6bJB^?v$#~f$f?uHj3l?pjC7U=>Q!fwL(H_C#1-UFXF(yT8^DkRVn`r zO#Bs0l@L4s0waF{FK2^jh76gA^gZdxvG3i>nI;M(od-(>rM zQ(rD7%IAVdJr0tgN>k?~O)pa^2d(kH-@(Or5kKTc_o95&_Pp!%*lSi@nivrW+BmN8 z`r@^k=26yj+?ue}dZ&vv`a$c3z3cbI4N*Q-f{WU6wozWnds$tZVP}Ra9;q-?;qYw` WNqJN3qE`Hbd68K5-b?wkOTPhwRE}x@ literal 0 HcmV?d00001 diff --git a/src/bin/linux.rs b/src/bin/linux.rs new file mode 100644 index 0000000..cf941dd --- /dev/null +++ b/src/bin/linux.rs @@ -0,0 +1,14 @@ +use mpu6050::*; +use linux_embedded_hal::{I2cdev, Delay}; +use i2cdev::linux::LinuxI2CError; + +fn main() -> Result<(), Error> { + let i2c = I2cdev::new("/dev/i2c-1") + .map_err(Error::I2c)?; + + let delay = Delay; + + let mut mpu = Mpu6050::new(i2c, delay); + mpu.init()?; + Ok(()) +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..ef7c44e --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,109 @@ +//#![no_std] + +///! Mpu6050 sensor driver. +///! Datasheet: +use embedded_hal::{ + blocking::delay::DelayMs, + blocking::i2c::{Read, Write, WriteRead}, +}; + +const Mpu6050_SLAVE_ADDR: u8 = 0x68; +const Mpu6050_WHOAMI: u8 = 0x75; + +/// High Bytle Register Gyro x orientation +const Mpu6050_GYRO_REGX_H: u8 = 0x43; +/// High Bytle Register Gyro y orientation +const Mpu6050_GYRO_REGY_H: u8 = 0x45; +/// High Bytle Register Gyro z orientation +const Mpu6050_GYRO_REGZ_H: u8 = 0x47; + +/// High Byte Register Acc roll +const Mpu6050_ACC_REGX_H: u8 = 0x3b; +/// High Byte Register Acc pitch +const Mpu6050_ACC_REGY_H: u8 = 0x3d; +/// High Byte Register Acc yaw +const Mpu6050_ACC_REGZ_H: u8 = 0x3f; + +/// Register to control chip waking from sleep, enabling sensors, default: sleep +const POWER_MGMT_1: u8 = 0x6b; +/// Internal clock +const POWER_MGMT_2: u8 = 0x6c; + +/// Gyro Sensitivity +const FS_SEL: (f64, f64, f64, f64) = (131., 65.5, 32.8, 16.4); +/// Accelerometer Sensitivity +const AFS_SEL: (f64, f64, f64, f64) = (16384., 8192., 4096., 2048.); + +/// All possible errors in this crate +#[derive(Debug)] +pub enum Error { + /// I2C bus error + I2c(E), + + /// Invalid chip ID was read + InvalidChipId(u8), +} + +pub struct Rotation { + x: T, + y: T, + z: T, +} + +pub struct Mpu6050 { + i2c: I, + delay: D +} + +impl Mpu6050 +where + I: Write + WriteRead, + D: DelayMs, +{ + pub fn new(i2c: I, delay: D) -> Self { + Mpu6050 { + i2c, + delay, + } + } + + pub fn init(&mut self) -> Result<(), Error> { + self.write(POWER_MGMT_1, 0)?; + + self.verify()?; + + self.delay.delay_ms(100u8); + Ok(()) + } + + pub fn verify(&mut self) -> Result<(), Error> { + let address = self.read(Mpu6050_WHOAMI)?; + if address != Mpu6050_SLAVE_ADDR { + return Err(Error::InvalidChipId(address)); + } + + println!("address {}", address); + Ok(()) + } + + pub fn gyro_data(&mut self) -> Result, Error> { + Ok(Rotation { x: 1., y: 2., z: 3. }) + } + + pub fn write(&mut self, address: u8, byte: u8) -> Result<(), Error> { + self.i2c.write(Mpu6050_SLAVE_ADDR, &[address, byte]) + .map_err(Error::I2c)?; + + self.delay.delay_ms(10u8); + Ok(()) + } + + pub fn read(&mut self, address: u8) -> Result> { + let mut buffer = [0]; + self.i2c.write_read(Mpu6050_SLAVE_ADDR, &[address], &mut buffer) + .map_err(Error::I2c)?; + + println!("GOT {:?}", &buffer); + Ok(buffer[0]) + } +}