LoginSignup
10
10

More than 5 years have passed since last update.

intel edisonからkoshian(konashi)のI2Cを動かしてみた

Last updated at Posted at 2015-02-23

インテルEdison + BLEで、konashi/SBBLEを動かしてみた。
こちらの記事を参考にさせていただいてI2Cを動かしてみました。
koshianで動作を確認しましたが、UUIDを変えればkonashiでも動くと思います
(持ってるんだから確認しろよって話ですが…)。

I2Cの通信相手(スレーブ)はUzukiセンサーシールド上のSi7013(温湿度センサ)とし、温度を取得しています。

以下サンプルです(ほぼ初めてのjs)。
15行目くらいまでは、上記のコードそのままです。

サンプルコード

koshian_i2c.js
var noble = require('./index');

const ADDR_Si7013 = 0x40
const CMD_TEMP    = 0xE3

const KOSHIAN_I2C_MODE_ENABLE_100K  = 0x01

const KOSHIAN_I2C_CONDITION_STOP    = 0x00
const KOSHIAN_I2C_CONDITION_START   = 0x01
const KOSHIAN_I2C_CONDITION_RESTART = 0x02

function calculateTemperature(data){
  return (data[0]*256 + data[1])*175.72/65536 - 46.85
}

noble.on('stateChange', function(state){
  if (state === 'poweredOn') noble.startScanning();
  else noble.stopScanning();
});

noble.on('discover', function(peripheral){
  noble.stopScanning();
  console.log('peripheral with UUID ' + peripheral.uuid + ' found');
  var advertisement = peripheral.advertisement;
  var localName = advertisement.localName;
  if (localName){
    console.log('Local Name = ' + localName);
  }

  peripheral.connect(function(error){
    if (error) console.log('connect error: ' + error);
    console.log('connected to ' + peripheral.uuid);

    peripheral.discoverServices(['229bff0003fb40da98a7b0def65c2d4b'], // KONASHI_SERVICE_UUID
      function (error, services){
        if (error) console.log('discoverServices error: ' + error);
        console.log('services.length: ' + services.length);

        var konashiService = services[0];
        konashiService.discoverCharacteristics(
          ['229b300b03fb40da98a7b0def65c2d4b',  // KONASHI_I2C_CONFIG_UUID
           '229b300c03fb40da98a7b0def65c2d4b',  // KONASHI_I2C_START_STOP_UUID
           '229b300d03fb40da98a7b0def65c2d4b',  // KONASHI_I2C_WRITE_UUID 
           '229b300e03fb40da98a7b0def65c2d4b',  // KONASHI_I2C_READ_PARAM_UUID 
           '229b300f03fb40da98a7b0def65c2d4b'], // KONASHI_I2C_READ_UUID
          function(error, characteristics){
            if (error) console.log('discoverCharacteristics error: ' + error);
            console.log('characteristics.length: ' + characteristics.length);

            // enable I2C
            characteristics[0].write(new Buffer([KOSHIAN_I2C_MODE_ENABLE_100K]), false);
            var i = 0;
            setInterval(function(){
              // send StartCondition
              characteristics[1].write(new Buffer([KOSHIAN_I2C_CONDITION_START]), false, function(error){
                // send register-address/command
                characteristics[2].write(new Buffer([2, (ADDR_Si7013 << 1) & 0xFE, CMD_TEMP]), false, function(error){
                  // send RestartCondition
                  characteristics[1].write(new Buffer([KOSHIAN_I2C_CONDITION_RESTART]), false, function(error){
                    // request data read 
                    characteristics[3].write(new Buffer([2, (ADDR_Si7013 << 1) | 0x01]), false, function(error){
                      // send StopCondition
                      characteristics[1].write(new Buffer([KOSHIAN_I2C_CONDITION_STOP]), false);
                      // read received data
                      characteristics[4].read(function(error, data){
                        if (data){
                          console.log( i++ + ' - temperature : ' + calculateTemperature(data) + ' degC');
                        }
                      });
                    });
                  });
                });
              });
            }, 1000);
          }
        );
      }
    );
  });
});

Callback Hell ?

流れとしては、
スタートコンディション→
スレーブアドレス+W+コマンド→
リスタートコンディション→
スレーブアドレス+R→
(データ受信)→
ストップコンディション
という流れになっていますが、
これをコールバックで呼び出さずにツラツラと並べただけでは、
何回かループが回ったところで止まってしまいました。
発行したリクエストが前後してしまうのでしょうかね?

今日は温かい1日でしたね、室温が21度ありました。

10
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
10