#概要
赤外線測距センサで障害物までの距離を振動の強弱で伝える帽子を作りました。
#使用したもの
・obniz
・距離センサ(HC-SR04)
・振動モータ
以下、補助的なもの
・モバイルバッテリー
・ダイソー帽子(黒)
#コード
CapDis2Vib.js
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="https://obniz.io/js/jquery-3.2.1.min.js"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" integrity="sha384-WskhaSGFgHYWDcbwN70/dfYBj47jz9qbsMId/iRN3ewGhXQFZCSftd1LZCfmhktB" crossorigin="anonymous">
<script src="https://unpkg.com/obniz@latest/obniz.js" crossorigin="anonymous"></script>
<script src="https://unpkg.com/obniz-parts-kits@0.11.2/iothome/index.js"></script>
<script src="https://unpkg.com/obniz-parts-kits@0.11.2/ai/index.js"></script>
<script src="https://unpkg.com/obniz-parts-kits@0.11.2/airobot/index.js"></script>
<script src="https://unpkg.com/obniz-parts-kits@0.11.2/ui/index.js"></script>
<script src="https://unpkg.com/obniz-parts-kits@0.11.2/ai/opencv3.4/opencv.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@0.13.5"> </script>
<script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/mobilenet@0.2.2"> </script>
</head>
<body>
Program running...
<div id="OBNIZ_OUTPUT"></div><br/>
<script>
(async function(){
var obniz, distSens, dcmotor;
obniz = new Obniz('★Your ID is HERE★');
await obniz.connectWait();
obniz.display.clear();
obniz.display.print('CapDisVib')
dcmotor = obniz.wired("DCMotor",{"forward":10, "back":11});
dcmotor.power(52);
dcmotor.move(true);
await obniz.wait(2000);
dcmotor.stop();
const hcsr04 = obniz.wired("HC-SR04", {gnd:0, echo:1, trigger:2, vcc:3});
while(true) {
let avg = 0;
let count = 0;
for (let i=0; i<3; i++) { // measure three time. and calculate average
const val = await hcsr04.measureWait();
if (val) {
count++;
avg += val;
}
}
if (count > 1) {
avg /= count;
}
console.log(Math.round(avg/10) + " cm");
obniz.display.clear();
obniz.display.print(Math.round(avg/10) + " cm")
if (avg <= 2000) {
console.log(2000/avg*20);
dcmotor.power((2000/avg*20));
dcmotor.move(true);
obniz.display.print("In Range")
await obniz.wait(1000);
} else {
dcmotor.stop();
}
await obniz.wait(100);
}
})();
</script>
</body>
</html>
#2019/2/18 追加
超音波は温度により進む速度が違います
デフォルトで15度で計算していますが、変更して正しい値にすることでより精度の高い結果が欲しい>場合はtempから調整します。
との事なので、より正確な距離を求められるように温度センサーを追加して、室温をセットできるようにしました。
##コード
CapDis2VibWithTEMP.js
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="https://obniz.io/js/jquery-3.2.1.min.js"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" integrity="sha384-WskhaSGFgHYWDcbwN70/dfYBj47jz9qbsMId/iRN3ewGhXQFZCSftd1LZCfmhktB" crossorigin="anonymous">
<script src="https://unpkg.com/obniz@latest/obniz.js" crossorigin="anonymous"></script>
<script src="https://unpkg.com/obniz-parts-kits@0.11.2/iothome/index.js"></script>
<script src="https://unpkg.com/obniz-parts-kits@0.11.2/ai/index.js"></script>
<script src="https://unpkg.com/obniz-parts-kits@0.11.2/airobot/index.js"></script>
<script src="https://unpkg.com/obniz-parts-kits@0.11.2/ui/index.js"></script>
<script src="https://unpkg.com/obniz-parts-kits@0.11.2/ai/opencv3.4/opencv.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@0.13.5"> </script>
<script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/mobilenet@0.2.2"> </script>
</head>
<body>
Program running...
<div id="OBNIZ_OUTPUT"></div><br/>
<script>
(async function(){
var obniz, distSens, dcmotor;
/*https://obniz.io/sdk/parts/HC-SR04/README.md?iframe=false*/
obniz = new Obniz('XXXXXXXXX');
await obniz.connectWait();
obniz.display.clear();
obniz.display.print('CapDisVib')
dcmotor = obniz.wired("DCMotor",{"forward":10, "back":11});
dcmotor.power(30);
dcmotor.move(true);
await obniz.wait(1000);
dcmotor.stop();
/*温度計 789で接続(Onchangeでは取得出来ている)*/
var tempsens = obniz.wired("LM35DZ", { gnd:7 , output:8, vcc:9});
var temp = await tempsens.getWait();
console.log(temp + " CEL");
/*距離センサ*/
const hcsr04 = obniz.wired("HC-SR04", {gnd:0, echo:1, trigger:2, vcc:3});
/*hcsr04.temp = 23; 温度を23度で設定。距離精度に影響*/
hcsr04.temp = temp;
while(true) {
let avg = 0;
let count = 0;
for (let i=0; i<3; i++) { // measure three time. and calculate average
const val = await hcsr04.measureWait();
if (val) {
count++;
avg += val;
}
}
if (count > 1) {
avg /= count;
}
console.log(Math.round(avg/10) + " cm");
obniz.display.clear();
obniz.display.print(Math.round(avg/10) + " cm")
if (avg <= 3000 && avg >= 500) {
console.log(Math.round(3000/avg*20+10));
dcmotor.power((3000/avg*20+10));
dcmotor.move(true);
obniz.display.print("In Range")
await obniz.wait(500);
dcmotor.stop();
} else {
dcmotor.stop();
}
await obniz.wait(100);
}
})();
</script>
</body>
</html>
#参考ページ