immer mal wieder versuche ich mich an Rust und den Mikrokontroller (ESP32 C3) und vorgestern habe ich einen Beschleunigungssensor entdeckt mit dem ich mal eine kleine Drohne bauen wollte. Naja und irgendwie muss ich auch mal was anderes, als die Brechnungsprogramme machen und da dachte ich mir, ich schaue mal, ob ich den Sensor mit Rust, so hardwarenah wie möglich auslesen kann. Ich habe dann viel gelesen und bin jetzt am umsetzen.
Das Sensor um den es geht, ist der MPU6050.
In MicroPython sieht das Auslesen bzw. das Ansprechen und Lesen der Werte so aus:
Code: Alles auswählen
class MPU6050:
def __init__(self, i2c, address=0x68):
self.i2c = i2c
self.address = address
self.buffer = bytearray(14)
self.i2c.start()
self.i2c.writeto(self.address, b"\x6b\0")
self.i2c.stop()
def fill_buffer(self):
self.i2c.start()
self.i2c.readfrom_mem_into(self.address, 0x3B, self.buffer)
self.i2c.stop()
def get_values(self):
self.fill_buffer()
return dict(zip(
["AcX", "AcY", "AcZ", "Tmp", "GyX", "GyY", "GyZ"],
struct.unpack('<7h', self.buffer)))
Wenn ich jetzt Werte will, dann wieder Start-Konfiguration, und beginnend von der Speicheradresse `0x3B` lesen und in einen Buffer schreiben, danach wieder Stopp.
In der Rust Doku finde ich kein Start/Stopp. Es gibt da aber `transaction` und ich denke, dass das das ist, was ich benötige. Mir ist allerdings die Anwendung nicht klar. Zum einen weis ich nicht wie ich die Speicheradresse angebe, von der ich lesen soll und allgemein weis ich einfach nicht, ob das so richtig ist.
Mein Versuch:
Code: Alles auswählen
#![no_std]
#![no_main]
use esp_hal::clock::CpuClock;
use esp_hal::i2c::master::{I2c, Config, Operation};
use esp_hal::prelude::*;
use esp_backtrace as _;
use esp_println::println;
#[entry]
fn main() -> ! {
let peripherals = esp_hal::init({
let mut config = esp_hal::Config::default();
config.cpu_clock = CpuClock::Clock160MHz;
config
});
let mut i2c = I2c::new(
peripherals.I2C0,
Config::default(),
)
.with_sda(peripherals.GPIO3)
.with_scl(peripherals.GPIO2);
let mut data = [0u8; 14];
i2c.transaction(0x68, &mut [
Operation::Write(&[0x6B]),
]).ok();
loop {
let results = i2c.transaction(0x68, &mut [
Operation::Read(&mut data)
]).and(Ok(data));
println!("{:#?}", results);
}
}
Code: Alles auswählen
Ok(
[
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
],
)
Ok(
[
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
64,
],
)
Ok(
[
0,
0,
0,
0,
0,
0,
0,
0,
104,
0,
0,
0,
0,
0,
],
)
Ok(
[
0,
0,
0,
0,
133,
3,
2,
162,
107,
190,
246,
134,
254,
213,
],
)
Ok(
[
120,
40,
141,
110,
143,
74,
0,
0,
0,
0,
0,
0,
0,
0,
],
)
Danke für eure Hilfe!
Grüße
Dennis