Skip to content

Instantly share code, notes, and snippets.

@satakagi
Last active November 2, 2018 07:54
Show Gist options
  • Save satakagi/857a0ed952a088636bdc00cee3b02c74 to your computer and use it in GitHub Desktop.
Save satakagi/857a0ed952a088636bdc00cee3b02c74 to your computer and use it in GitHub Desktop.
MPU-6050 driver for CHIRIMEN
// MPU-6050 Driver for CHIRIMEN WebI2C
// based on http://www.widesnow.com/entry/2015/09/10/061128
// https://www.invensense.com/wp-content/uploads/2015/02/MPU-6000-Register-Map1.pdf
// by Satoru Takagi
var MPU6050 = function(i2cPort,slaveAddress){
this.i2cPort = i2cPort;
this.i2cSlave = null;
if ( slaveAddress ){
this.slaveAddress = slaveAddress;
} else {
this.slaveAddress = 0x68;
}
};
MPU6050.prototype = {
init: function(){
return new Promise((resolve, reject)=>{
this.i2cPort.open(this.slaveAddress).then(async (i2cSlave)=>{
this.i2cSlave = i2cSlave;
// console.log("init ok:"+this.i2cSlave);
await this.i2cSlave.write8(0x6b,0x00);
console.log("init ok:"+this.i2cSlave);
resolve();
},(err)=>{
reject(err);
});
});
},
readTemp: function(){
return new Promise(async (resolve, reject)=>{
if(this.i2cSlave == null){
reject("i2cSlave Address does'nt yet open!");
}else{
var ans = await this.i2cSlave.read16(0x41);
console.log(ans);
// var data = ((MSB << 8) + LSB)/128.0;
var temp = ans / 340 + 36.53;
resolve(temp);
}
});
},
readAll: function(){
return new Promise(async (resolve, reject)=>{
if(this.i2cSlave == null){
reject("i2cSlave Address does'nt yet open!");
}else{
var ans = await this.i2cSlave.read16(0x41);
console.log("tmpW:",ans);
var temp = this.getVal(ans) / 340 + 36.53;
ans = await this.i2cSlave.read16(0x43);
var rx = this.getVal(ans) / 131;
ans = await this.i2cSlave.read16(0x45);
var ry = this.getVal(ans) / 131;
ans = await this.i2cSlave.read16(0x47);
var rz = this.getVal(ans) / 131;
ans = await this.i2cSlave.read16(0x3b);
var gx = this.getVal(ans) / 16384;
ans = await this.i2cSlave.read16(0x3d);
var gy = this.getVal(ans) / 16384;
ans = await this.i2cSlave.read16(0x3f);
var gz = this.getVal(ans) / 16384;
// console.log("t:",temp," rxyz:",rz,ry,rz," gxyz:",gx,gy,gz);
resolve({
temperature: temp,
gx: gx,
gy: gy,
gz: gz,
rx: rx,
ry: ry,
rz: rz
});
}
});
},
wake: function(){
return new Promise(async (resolve, reject)=>{
if(this.i2cSlave == null){
reject("i2cSlave Address does'nt yet open!");
}else{
await this.i2cSlave.write8(0x6b,0x00);
resolve();
}
});
},
reset: function(){ // deep sleep?
return new Promise(async (resolve, reject)=>{
if(this.i2cSlave == null){
reject("i2cSlave Address does'nt yet open!");
}else{
await this.i2cSlave.write8(0x6b,0x80);
resolve();
}
});
},
getVal: function( w ){
var l = w >>> 8;
var b = w & 0xff;
var v = l + ( b << 8 );
// console.log("Val:",w.toString(16),b.toString(16),l.toString(16),v.toString(16),b,l,v);
if ( v >= 0x8000 ){
return ( - ((65535 - v ) + 1 ) );
} else {
return(v);
}
}
};
<!doctype html>
<html>
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1">
<title>i2c-DHT12</title>
<script src="../../polyfill/polyfill.js"></script>
<script src="../../driversD/i2c-MPU6050.js"></script>
<script src="./mainMpu.js"></script>
<style>
table,p {
color: blue;
text-align: center;
font-size: 24px;
}
img {
display: block;
margin-left: auto;
margin-right: auto;
}
</style>
</head>
<body>
<p id="head">MPU-6050</p>
<table>
<tr><td>temp</td><td id="temp"></td></tr>
<tr><td>Gx</td><td id="gx"></td></tr>
<tr><td>Gy</td><td id="gy"></td></tr>
<tr><td>Gz</td><td id="gz"></td></tr>
<tr><td>Rx</td><td id="rx"></td></tr>
<tr><td>Ry</td><td id="ry"></td></tr>
<tr><td>Rz</td><td id="rz"></td></tr>
</table>
</body>
</html>
"use strict";
var head;
window.addEventListener(
"load",
function() {
head = document.querySelector("#head");
mainFunction();
},
false
);
async function mainFunction() {
try {
var i2cAccess = await navigator.requestI2CAccess();
var port = i2cAccess.ports.get(1);
var mpu6050 = new MPU6050(port, 0x68);
await mpu6050.init();
while (1) {
var val = await mpu6050.readAll();
// console.log('value:', value);
temp.innerHTML=val.temperature;
gx.innerHTML=val.gx;
gy.innerHTML=val.gy;
gz.innerHTML=val.gz;
rx.innerHTML=val.rx;
ry.innerHTML=val.ry;
rz.innerHTML=val.rz;
await sleep(1000);
}
} catch (error) {
console.error("error", error);
}
}
function sleep(ms) {
return new Promise(function(resolve) {
setTimeout(resolve, ms);
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment