obnizのフォーラムは新しいシステムに移行しております。
新しいフォーラムはこちらになりますカラーセンサ
-
初めて投稿いたします。
よろしくお願いいたします。
現在、obnizを使用してカラーセンサ(ローム製BH1749NUC)を動作させようとしているのですが、動作できておりません。
プログラム内容を下記に示しますので、アドバイスをお願いいたします。
プログラムは各色の値を読み取る内容になります。
プルアップ抵抗には4.7kΩを使用しています。
現状動作は各色の値は0のみとなります。
ご回答をよろしくお願いいたします。<!-- HTML Example -->
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="https://obniz.io/js/jquery-3.2.1.min.js"></script>
<script src="https://unpkg.com/obniz@2.0.3/obniz.js"></script>
</head>
<body><script> var obniz = new Obniz("********"); class SS { constructor() { this.keys = ['vcc', 'sda', 'scl', 'i2c', 'gnd']; this.requiredKeys = []; this.address = 0x38; this.regAdrs = {}; this.regAdrs.ctrl = 0x40; this.regAdrs.modectrl1 = 0x41; this.regAdrs.modectrl2 = 0x42; this.regAdrs.interrupt = 0x60; this.regAdrs.persistence = 0x61; this.regAdrs.sensorRed = 0x50; this.regAdrs.sensorGreen = 0x52; this.regAdrs.sensorBlue = 0x54; this.regAdrs.sensorClear = 0x58; } static info() { return { name: 'SS', }; } async wired(obniz) { this.obniz = obniz; obniz.setVccGnd(this.params.vcc, this.params.gnd, '3v'); await this.obniz.wait(100); this.params.clock = 100000; this.params.pull = '3v'; this.params.mode = 'master'; this.i2c = obniz.getI2CWithConfig(this.params); await this.obniz.wait(100); } async init() { obniz.i2c0.start({mode:"master", sda:1, scl:2, clock:100000, pull:"3v"}); obniz.i2c0.write(this.address, [this.regAdrs.ctrl, 0x8D]); obniz.i2c0.write(this.address, [this.regAdrs.modectrl1, 0x2D]); obniz.i2c0.write(this.address, [this.regAdrs.modectrl2, 0x10]); } async getVal() { obniz.i2c0.start({mode:"master", sda:1, scl:2, clock:100000, pull:"3v"}); obniz.i2c0.write(this.address, [this.regAdrs.sensorRed]); let ret = await obniz.i2c0.readWait(this.address, 12); let level = [0, 0, 0, 0]; level[0] = (ret[1] << 8) | ret[0]; level[1] = (ret[3] << 8) | ret[2]; level[2] = (ret[5] << 8) | ret[4]; level[3] = (ret[9] << 8) | ret[8]; return level; } } if (typeof module === 'object') { module.exports = SS; } obniz.onconnect = async function() { Obniz.PartsRegistrate(SS); var colorSens = obniz.wired("SS", {vcc:0, sda:1, scl:2, gnd:3}); colorSens.init(); var ret = await colorSens.getVal(); console.log("getVal:"+ ret); var red = ret[0]; var green = ret[1]; var blue = ret[2]; var ir = ret[3]; console.log("Red:"+ red); console.log("Green:"+ green); console.log("Blue:"+ blue); console.log("IR:"+ ir); } </script>
</body>
</html>
-
@Inventor-1m こんにちは。
i2cで通信する場合にエラーが出るとobnizの場合はエラーが表示されますので、それがでていないということはi2cの通信自体は正常にできてそうです。(仮に部品を繋がないで動かすとエラーが出るかと思います。)
なにか、必要な初期化処理が行われていないなど無いでしょうか。
BH1749NUCを使ったことはないのですが、ここを読むとこの値が返ってくるというアドレスがあれば、それを読み取ることで通信が正常であることを確認できるのですがどうでしょうか。
-
ご回答をありがとうございます。
ご連絡が遅くなり、大変申し訳ありません。
ご返信が来るまでの間、色々と調べた所、初期化等の信号を送る前に
読込もしくは書込動作をさせる信号を送ることで一応、動作いたしました。
しかし、スマホ上で実行すると、動作はしているみたいですが
no more I2C Available.max=1というエラーが出るのですが
どのように修正すればよいのでしょうか?また、全然話が変わってしまいますが
オブナイズ自体の3Dデータはあるのでしょうか?ご確認をお願いいたします。
-
色々とご回答いただき、ありがとうございます。
19年5月末にご質問いたしましたが
進捗はいかがでしょうか?ご確認をお願いいたします。
質問内容は
PC上で実行すると、エラーは表示されないのですが
スマホ上で行うと no more I2C Available.max=1
やno more i2c Availableというエラーが表示されます。プログラムは下記のようになります。
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="https://obniz.io/js/jquery-3.2.1.min.js"></script>
<script src="https://unpkg.com/obniz@2.0.3/obniz.js"></script>
</head>
<body><script> var obniz = new Obniz("aaaaaaaa");
class SS {
constructor() {
this.keys = ['vcc', 'sda', 'scl', 'i2c', 'gnd'];
this.requiredKeys = [];this.address = 0x38; this.regAdrs = {}; this.regAdrs.ctrl = 0x40; this.regAdrs.modectrl1 = 0x41; this.regAdrs.modectrl2 = 0x42; this.regAdrs.interrupt = 0x60; this.regAdrs.persistence = 0x61; this.regAdrs.sensorRed = 0x50; this.regAdrs.sensorGreen = 0x52; this.regAdrs.sensorBlue = 0x54; this.regAdrs.sensorClear = 0x58; } static info() { return { name: 'SS', }; } async wired(obniz) { this.obniz = obniz; obniz.setVccGnd(this.params.vcc, this.params.gnd, '3v'); await this.obniz.wait(100); this.params.clock = 100000; this.params.pull = '3v'; this.params.mode = 'master'; this.i2c = obniz.getI2CWithConfig(this.params); await this.obniz.wait(100); } async init() { obniz.i2c0.start({mode:"master", sda:1, scl:2, clock:100000, pull:"3v"}); obniz.i2c0.write(this.address, [this.regAdrs.ctrl, 0x70,0x8D]); obniz.i2c0.write(this.address, [this.regAdrs.modectrl1, 0x70,0x2D]); obniz.i2c0.write(this.address, [this.regAdrs.modectrl2, 0x70,0x10]); } async getVal() { obniz.i2c0.start({mode:"master", sda:1, scl:2, clock:100000, pull:"3v"}); obniz.i2c0.write(this.address, [this.regAdrs.sensorRed,0x71]); let ret = await obniz.i2c0.readWait(this.address, 12); let level = [0, 0, 0, 0]; level[0] = (ret[1] << 8) | ret[0]; level[1] = (ret[3] << 8) | ret[2]; level[2] = (ret[5] << 8) | ret[4]; level[3] = (ret[9] << 8) | ret[8]; return level; }
}
if (typeof module === 'object') {
module.exports = SS;
}obniz.onconnect = async function() {
for(var i=0;i<100;i++){
Obniz.PartsRegistrate(SS);
var colorSens = obniz.wired("SS", {vcc:0, sda:1, scl:2, gnd:3});
colorSens.init();
var ret = await colorSens.getVal();
console.log("getVal:"+ ret);
var red = ret[0];
var green = ret[1];
var blue = ret[2];
var ir = ret[3];console.log("Red:"+ red); console.log("Green:"+ green); console.log("Blue:"+ blue); console.log("IR:"+ ir); await obniz.wait(1000); }
}
</script>
</body>
</html>
-
@Inventor-1m こんにちは。コード拝見しました
obniz.onconnect = async function() { for(var i=0;i<100;i++){ Obniz.PartsRegistrate(SS); var colorSens = obniz.wired("SS", {vcc:0, sda:1, scl:2, gnd:3}); colorSens.init(); var ret = await colorSens.getVal();
この部分ですが、センサーの接続と設定を100繰り返すことになりますが、ここでi2cを100本開こうとしてエラーになっているものと思われます。
obniz.onconnect = async function() { Obniz.PartsRegistrate(SS); var colorSens = obniz.wired("SS", {vcc:0, sda:1, scl:2, gnd:3}); colorSens.init(); for(var i=0;i<100;i++){ var ret = await colorSens.getVal();
このようにすれば問題は起きないかと思いますがいかがでしょう。
-
ご回答いただき、ありがとうございます。
早速、試してみましたが、解決されませんでした。
複数回同じエラーが出ておりましたが
1回になりました。最初は測定毎にエラーが出ており
アドバイス頂いたfor文の外に出すことで
最初の1回目のエラーのみになったと思います。他におかしなところはないでしょうか?
よろしくお願いいたします。
-
this.i2c = obniz.getI2CWithConfig(this.params);
こちらですが、this.i2cは使われていないのではないでしょうか。
obniz.i2c0.start({mode:"master", sda:1, scl:2, clock:100000, pull:"3v"});
と書かれてますので、そうではないかと。
その場合、obniz.getI2CWithConfig(this.params); またはobniz.i2c0.start のどちらもi2c0を使用中状態に変更するため、どちらかを実行したあとにもう一方を実行するとi2c1はないためエラーとなります。また、残念ながらobnizの3Dデータはありません。
-
ご回答いただき、ありがとうございます。
this.i2c = obniz.getI2CWithConfig(this.params);の行を消したら
エラーが出なくなりました。
しかし、PC上でプログラムをはしらせると
エラーが出ないのが不思議です。
理由がわかれば教えていただきたいです。オブナイズの3Dデータの件は承知いたしました。
ご確認いただき、ありがとうございます。以上、よろしくお願いいたします。