<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="http://organizeseries.com/"
	>

<channel>
	<title>菅原のびすけ &#8211; HTML5Experts.jp</title>
	<atom:link href="/n0bisuke/feed/" rel="self" type="application/rss+xml" />
	<link>https://html5experts.jp</link>
	<description>日本に、もっとエキスパートを。</description>
	<lastBuildDate>Sat, 07 Jul 2018 03:14:05 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.7.19</generator>
	<item>
		<title>Web制作者にもチャレンジできるIoT入門～Tesselの基礎～</title>
		<link>/n0bisuke/13562/</link>
		<pubDate>Thu, 12 Mar 2015 04:00:51 +0000</pubDate>
		<dc:creator><![CDATA[菅原のびすけ]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>

		<guid isPermaLink="false">/?p=13562</guid>
		<description><![CDATA[連載： IoTxWeb (7)2015年はIoT元年と言われるくらい、IoTやWoTという単語がバズワード化してきました。2014年頃からArduinoやRaspberryPi、Galileo、Edisonといったマイコ...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/iot_web/" class="series-240" title="IoTxWeb" data-wpel-link="internal">IoTxWeb</a> (7)</div><p>2015年はIoT元年と言われるくらい、IoTやWoTという単語がバズワード化してきました。2014年頃から<a href="http://www.arduino.cc/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Arduino</a>や<a href="http://www.raspberrypi.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">RaspberryPi</a>、<a href="http://www.intel.co.jp/content/www/jp/ja/do-it-yourself/galileo-maker-quark-board.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Galileo</a>、<a href="http://www.intel.co.jp/content/www/jp/ja/do-it-yourself/edison.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Edison</a>といったマイコンボードが急激に人気になってきましたね。Web開発者がハードウェア領域に進出しやすくなりました。ただ、センサーの利用など応用的なことをしようとすると、<a href="http://ja.wikipedia.org/wiki/GPIO" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">GPIO</a>や電流などの知識をある程度は知っておく必要があります。</p>

<p>今回は、Webの知識だけでほぼ操作でき、初心者向けのTesselというマイコンボードを紹介します。具体的には、Tesselの開発環境整備から環境センサを扱うところまでを紹介したいと思います。Webエンジニア向けに説明を書きましたが、Webデザイナーやディレクターなど、非エンジニアの方でもチャレンジしていただけたら幸いです。</p>

<h2>Web制作者向けマイコンボードTesselとは</h2>

<p><img src="http://i.gyazo.com/39898dc789e7424e98da46f17692b0e0.png" alt="" /></p>

<ul>
<li>参考リンク <a href="http://gigazine.net/news/20130821-tessel-javascript-hardware/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">次世代マイコン「Tessel」はJavaScriptとNode.jsをサポートし、Wi-Fiからアップデート可能</a></li>
<li>参考リンク <a href="http://tips.hecomi.com/entry/2014/07/06/235056" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">JavaScript（Node.js）で色々なハードウェアモジュールが動くマイコンボードTesselを手に入れたので詳しく調べてみた</a></li>
</ul>

<p>&gt;「Tessel は、Node.jsベースのJavaScript環境を利用してハードウェア制御可能なマイコンボードです。 スタンドアロンで WiFi接続可能で、USBによる電源供給のみで動作します。 本体にはモジュール拡張用に4つのポートがついており、ここにSDカード読み込みモジュールやオーディオ入出力モジュール、加速度や温度・照度などのセンサモジュールなどの様々なモジュールを差し込むことで拡張が可能です。</p>

<p>そしてこの一つひとつのハードウェアモジュールを操作するためのNodeモジュールがnpmで公開されており、バグ修正も含めて Node.js のプラットフォームの上に乗っかっている形でトキメキます」</p>

<p><small>※この説明は<a href="https://twitter.com/hecomi" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">hecomiさん</a>のサイトより抜粋です。</small></p>

<h3>JavaScript(Node.js)で開発可能</h3>

<p><a href="https://tessel.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Tessel</a>はJavaScript(Node.js)で操作可能なプログラムを書けるマイコンボードです。<strong>JavaScriptで記述できる</strong>ので、Web制作者でも比較的とっつきやすい仕様となっています。Webエンジニアやデザイナーにとっては慣れ親しんでいる言語を使って開発ができるので、数分でセンサーを扱うことができるようになります。</p>

<h3>センサーの使いやすさも抜群</h3>

<p>またセンサーを使った拡張も簡単で、専用モジュールを購入し、パズルのように組み立てるだけでセンサーを扱うことができます。GPIOや電流は全く意識しなくていいので、<strong>初めてマイコンボードを使ってセンサーを扱う人にはオススメ</strong>です。</p>

<p><img src="http://i.gyazo.com/084a27f05655824df551b30ec2abeb4d.gif" alt="" /></p>

<ul>
<li>公式サイト <a href="https://tessel.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">https://tessel.io/</a></li>
<li>公式チュートリアル <a href="http://start.tessel.io/install]" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">http://start.tessel.io/install</a></li>
<li>公式チュートリアル日本語 <a href="http://start.tessel.io/ja/install" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">http://start.tessel.io/ja/install</a></li>
</ul>

<h2>Tesselの購入</h2>

<p>Tesselは<a href="https://www.switch-science.com/pressrelease/20141204_tessel/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">スイッチサイエンスのサイト</a>から購入できます。<br />
今回は本体と一緒に環境センサの購入もしました。ArduinoやRaspberryPiと比べると比較的値段は高めですが、迷わずに作業できるため時間はかからないと思います。入門にはぴったりです。</p>

<ul>
<li><a href="https://www.switch-science.com/catalog/1942/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Tessel メインボード</a> 9,720円(2015年3月時点)…Tesselの本体です。</li>
<li><a href="https://www.switch-science.com/catalog/1944/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Tessel 環境センサ</a> 3,240円(2015年3月時点)…明るさや音の大きさを感知します。</li>
</ul>

<p>注文してから2~3日で届きました。
本体、USBケーブル、Tesselのシールが1セットです。今回は環境センサも注文したので別の袋に入って環境センサが届きました。
<img src="http://i.gyazo.com/a6de5d26361da3f9767b08e5f1d06f4a.png" alt="" /></p>

<p>本体は結構小さいです。名刺の2/3〜3/4くらいの大きさです。</p>

<p><img src="http://i.gyazo.com/378dff42b2d10a565317954051f775b7.png" alt="" /></p>

<p>環境センサはさらに小さいです。
<img src="http://i.gyazo.com/6042a787a89bd42f7b40e5ecd5ee48b0.png" alt="" /></p>

<h2>開発環境準備</h2>

<p>今回はMac(Yosemite)での開発をしていきます。MacとTesselをUSBケーブルで接続して、Macで書いたプログラムをTesselで実行することができます。まずは、開発環境を整えましょう。</p>

<h3>バージョン</h3>

<ul>
<li>Mac OS X 10.10 Yosemite</li>
<li>Node.js 0.12</li>
<li>Tessel CLI v0.3.21</li>
</ul>

<h3>Node.jsのインストール</h3>

<p><small>すでにNode.jsが利用できる環境の方は、読み飛ばしてください。</small></p>

<p>Node.jsのインストールはこちらの記事を参考にしましょう。
<a href="http://liginc.co.jp/web/programming/node-js/85318" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">いまアツいJavaScript！ゼロから始めるNode.js入門〜5分で環境構築編〜</a></p>

<p>NVMが利用可能になったら</p>

<p></p><pre class="crayon-plain-tag">$ nvm install v0.12</pre><p></p>

<p>とするとNode.jsの0.12をインストールできます。</p>

<p></p><pre class="crayon-plain-tag">$ node -v
v0.12.0</pre><p></p>

<p>Node.jsのバージョンが、最新の0.12になっていることを確認できました。</p>

<h3>Tessel CLI(コマンドラインインターフェイス)のインストール</h3>

<p>Node.jsをインストールすると、NPM (Node Package Manager)コマンドが使えるようになります。 NPMはNode.jsのいろいろなモジュールの依存関係を解決して、簡単に利用できるようにしてくれるNode.jsのパッケージマネージャーです。</p>

<p>Tesselの開発環境であるTessel CLIは、NPMでインストールすることができます。</p>

<p>上記の手順でNode.jsをインストールした時点で、NPMは利用可能になっているはずです。以下のコマンドを実行しましょう。</p>

<p></p><pre class="crayon-plain-tag">$ npm install -g tessel</pre><p></p>

<p>特にエラーがなければ、<code>tessel</code>コマンドが使えるようになります。<code>tessel</code>と入力するとコマンド一覧を見ることができます。</p>

<p></p><pre class="crayon-plain-tag">$ tessel

Tessel CLI
Usage:
   tessel list
   tessel logs
   tessel run  [args...]
          run a script temporarily without writing it to flash
          -s push the specified file only (rather than associated files and modules)
   tessel push  [options]
          see 'tessel push --help' for options list
   tessel erase
          erases saved usercode (JavaScript) on Tessel
   tessel repl
          interactive JavaScript shell
   tessel wifi -n  -p  -s 
   tessel wifi -n 
          connects to a wifi network without a password
   tessel wifi -l
          see current wifi status
   tessel stop
          stop the current script
   tessel check 
          dumps the tessel binary code
   tessel blink
          uploads test blinky script
   tessel update [--list]
          updates tessel to the newest released firmware. Optionally can list all builds/revert to older builds.
   tessel debug [script]
          runs through debug script and uploads logs
   tessel version [--board]
          show version of tessel cli. If --board is specified, shows version of the connected Tessel</pre><p></p>

<p>例えば、Tessel CLIのバージョン確認をするときは<code>tessel version</code>となります。</p>

<p></p><pre class="crayon-plain-tag">$ tessel version
INFO v0.3.21</pre><p></p>

<h3>Tesselのファームウェアアップデート</h3>

<p>これもコマンド一つで実行できます。<code>tessel update</code>コマンドでTesselのファームウェアを更新しましょう。ファームウェアの更新がMac経由で簡単に行えるのはいいですね。</p>

<p><strong>ここからTesselとMacをUSBケーブルで接続しての作業になります。</strong></p>

<p></p><pre class="crayon-plain-tag">$ tessel update

TESSEL! Connected to TM-00-04-f000da30-006a434c-328965c2.
INFO Checking for latest firmware...
INFO Wifi version is also outdated.
INFO Downloading remote file https://builds.tessel.io/wifi/1.28.bin
INFO Wifi patch uploaded... waiting for it to apply (10s)
INFO ...
INFO ...
INFO ...
INFO ...
INFO ...
INFO ...
INFO
INFO Downloading remote file https://builds.tessel.io/firmware/tessel-firmware-current.bin
INFO Updating firmware... please wait. Tessel will reset itself after the update
INFO Complete  1175988 /1175988</pre><p></p>

<h2>何はともあれ、Hello World(Lチカ)</h2>

<p>プログラミングの最初は、<a href="http://ja.wikipedia.org/wiki/Hello_world" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Hello World</a>ですね。
電子工作界隈だとHello WorldにあたるのがLチカ(LEDをチカチカさせること)です。</p>

<p>まずは<a href="http://start.tessel.io/ja/blinky" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">公式サイトの手順</a>を実行してみましょう。</p>

<p>まずプロジェクトフォルダを作成します。</p>

<p></p><pre class="crayon-plain-tag">$ mkdir tessel-code
$ cd tessel-code</pre><p></p>

<p>package.jsonを作成します。いろいろと質問が出てきますが、とりあえず今回は全てEnterで大丈夫です。</p>

<p></p><pre class="crayon-plain-tag">$ npm init</pre><p></p>

<p></p><pre class="crayon-plain-tag">$  cat package.json

{
  "name": "tessel-code",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" &amp;&amp; exit 1"
  },
  "author": "",
  "license": "ISC"
}</pre><p></p>

<p>では実際にblinky.jsを描いてみたいと思います。エディタは慣れ親しんだものを使いましょう。
JavaScriptのコードなので、大抵のエディタがシンタックスハイライトしてくれるはずです。
ちなみに、私は最近Atomで書いています。</p>

<p></p><pre class="crayon-plain-tag">$ atom blinky.js</pre><p></p>

<p>以下のコードをコピペして、blinky.jsを作成しましょう。</p>

<p></p><pre class="crayon-plain-tag">// Import the interface to Tessel hardware
var tessel = require('tessel');

// Set the led pins as outputs with initial states
// Truthy initial state sets the pin high
// Falsy sets it low.
var led1 = tessel.led[0].output(1);
var led2 = tessel.led[1].output(0);

setInterval(function () {
    console.log("I'm blinking! (Press CTRL + C to stop)");
    // Toggle the led states
    led1.toggle();
    led2.toggle();
}, 100);</pre><p></p>

<p><img src="http://i.gyazo.com/f80165e29b5a7e9d5374d7249a2c9e87.gif" alt="" /></p>

<h3>実行</h3>

<p>↑のjsファイルを作成したら、同じフォルダ内で以下のコマンドを実行しましょう。</p>

<p></p><pre class="crayon-plain-tag">$ tessel run blinky.js</pre><p></p>

<p>MacからTesselにプログラムが送られて、Tessel内で実行されます。成功するとLEDがチカチカ光ります。</p>

<p>ちなみにLEDはTesselのモジュールの中でもハードウェアモジュールに位置付けられていて、ドキュメントが他のモジュールとは別のページになっているので注意しましょう。
 <a href="https://tessel.io/docs/hardwareAPI#tessel" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">https://tessel.io/docs/hardwareAPI#tessel</a></p>

<h3>エラーが出ても焦らずに対応しましょう。その１</h3>

<p>筆者が開発中に遭遇したエラーを簡単にまとめてみます。</p>

<h4>ファームウェアアップデートをしていない状態で実行</h4>

<p>ちなみに、私は<code>tessel update</code>を行わずに実行しようとしたら、以下のエラーが出ました。</p>

<p></p><pre class="crayon-plain-tag">$ tessel run blinky.js

TESSEL! Connected to TM-00-04-f000da30-006a434c-328965c2.
WARN There is a newer version of firmware available. You should run "tessel update".
INFO Bundling directory /Users/sugawara_nobisuke/n0bisuke/lab/tessel-code
INFO Deploying bundle (4.50 KB)...
INFO Running script...
/app/blinky.js:9: attempt to index field '?' (a nil value)</pre><p></p>

<p><code>tessel update</code>コマンドを実行したら解消されましたが、参考までに載せておきます。</p>

<h2>環境センサー(Ambient)で音と光を取得</h2>

<p>Lチカが終わったら、次はいよいよセンサーを使ってみたいと思います。今回は汎用的に使えていろいろと応用が効きそうな環境センサー(Ambient)を使います。</p>

<p>環境センサーを使うことで音の大きさと明るさの値を取得することができます。
環境センサーの使い方は <a href="http://start.tessel.io/ja/modules/ambient" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">こちらのページ</a>に書いてあります。また、Tesselのセンサーモジュールは別売りになっているので注意しましょう。</p>

<p>開発にあたりモジュールを追加します。</p>

<p></p><pre class="crayon-plain-tag">$ npm install --save ambient-attx4</pre><p></p>

<p>環境センサーをポートに差し込みましょう。</p>

<p>画像の向きにTesselを置いた時の左下が、ポートAになります。ポートはA,B,C,Dがあり、どのポートに差し込んでも動作しますが、プログラムでポートを指定する際は適宜接続しているポート名に変更して下さい。
<img src="https://s3.amazonaws.com/technicalmachine-assets/fre+assets/tessel-ports.jpg" alt="" /></p>

<p>以下の写真は、ポートAに環境センサーをポートBに<a href="http://start.tessel.io/ja/modules/audio" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">オーディオモジュール</a>(別売り)を接続した例です。
<img src="http://i.gyazo.com/59f6689c45877c979bd37fd062e9efab.png" alt="" /></p>

<p>blinky.jsの時と同様に、以下のコードをコピペしてambient.jsを作成しましょう。</p>

<p></p><pre class="crayon-plain-tag">var tessel = require('tessel');
var ambientlib = require('ambient-attx4’); //ドキュメントのコードから書き換え

var ambient = ambientlib.use(tessel.port['A']); //ポートBにセンサーを取り付ける場合はBを指定

ambient.on('ready', function () {
  // Get points of light and sound data.
  setInterval( function () {
    ambient.getLightLevel( function(err, ldata) {
      ambient.getSoundLevel( function(err, sdata) {
        console.log("Light level:", ldata.toFixed(8), " ", "Sound Level:", sdata.toFixed(8));
      });
    })
  }, 500); // The readings will happen every .5 seconds unless the trigger is hit

  ambient.setLightTrigger(0.5);

  // Set a light level trigger
  // The trigger is a float between 0 and 1
  ambient.on('light-trigger', function(data) {
    console.log("Our light trigger was hit:", data);

    // Clear the trigger so it stops firing
    ambient.clearLightTrigger();
    //After 1.5 seconds reset light trigger
    setTimeout(function () {
      ambient.setLightTrigger(0.5);
    },1500);
  });

  // Set a sound level trigger
  // The trigger is a float between 0 and 1
  ambient.setSoundTrigger(0.1);

  ambient.on('sound-trigger', function(data) {
    console.log("Something happened with sound: ", data);
    // Clear it
    ambient.clearSoundTrigger();
    //After 1.5 seconds reset sound trigger
    setTimeout(function () {
      ambient.setSoundTrigger(0.1);
    },1500);
  });
});

ambient.on('error', function (err) {
  console.log(err)
});</pre><p></p>

<p>実行してみます。</p>

<p></p><pre class="crayon-plain-tag">$ tessel run ambient.js

TESSEL! Connected to TM-00-04-f000da30-006a434c-328965c2.
INFO Bundling directory /Users/sugawara_nobisuke/n0bisuke/lab/tessel-code
INFO Deploying bundle (439.50 KB)...
INFO Running script...
Old module firmware detected. Updating...
Uploading new firmware...
Update finished!
Light level: 0.08105469   Sound Level: 0.02148438
Light level: 0.08105469   Sound Level: 0.01660156
・
・
・</pre><p></p>

<p>センサーが取得した明るさと、音の大きさがコンソールに表示されます。試しに、センサの上に手をかざして暗くしてみたり、指ぱっちんなどで音を立ててみて、値が変化するのを確認してみましょう。
<img src="http://i.gyazo.com/f2867ffc4d7d34c4b47591933e4e12d8.gif" alt="" /></p>

<p>Ambientの詳細なメソッドは<a href="https://github.com/tessel/ambient-attx4" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">こちら</a>になります。</p>

<p>先ほどのLEDと組み合わせれば、<strong>夜になって暗くなったらLEDを自動的に光らせる</strong>といったことも簡単にできそうですね。</p>

<h3>エラーが出ても焦らずに対応しましょう。その2</h3>

<p>この時点で、筆者が開発中に遭遇したエラーを簡単にまとめてみます。</p>

<h4>実行はnodeコマンドではなくtessel run</h4>

<p><strong>いつものくせでnodeコマンドで実行しようとするとこうなります</strong></p>

<p>これはNode.jsでの開発を普段行っている人にありがちな現象かもしれません。通常Node.jsでは<code>nodeコマンド</code>でプログラムを実行しますが、Tesselでは<code>tessel runコマンド</code>を使います。
間違えると、以下のようなエラーに遭遇しますので注意しましょう。</p>

<p></p><pre class="crayon-plain-tag">$ node ambient.js

module.js:338
    throw err;
          ^
Error: Cannot find module 'tessel'
    at Function.Module._resolveFilename (module.js:336:15)
    at Function.Module._load (module.js:278:25)
    at Module.require (module.js:365:17)
    at require (module.js:384:17)
    at Object. (/Users/sugawara_nobisuke/n0bisuke/lab/tessel-code/ambient.js:10:14)
    at Module._compile (module.js:460:26)
    at Object.Module._extensions..js (module.js:478:10)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Function.Module.runMain (module.js:501:10)</pre><p></p>

<h4>モジュールの接続が不安定な時もあります。</h4>

<p>特に問題なくコードを書いていても、実行時にこんなエラーが起きることがあります。</p>

<p></p><pre class="crayon-plain-tag">$ tessel run ambient.js

Error: Improperly specified Tessel port.
...es/ambient-attx4/node_modules/attiny-common/lib/index.js:24: attempt to index local 'hardware' (a nil value)</pre><p></p>

<p>これはどうやらモジュールが上手く接続できてなかったみたいです。
センサモジュールを繋ぎ直して再実行したら、うまくいきました。</p>

<h2>Tessel 2</h2>

<p>この記事執筆途中でTessel 2がアナウンスされました。
<img src="http://i.gyazo.com/d6cd8628bd9188e4850d5e4953c6c4d8.png" alt="" />
Tessel 2ではNode.jsだけではなく、PythonやRustでも処理を記述できるようになったみたいです。USBポートやEthernetポートが新設されたり、Wifiやその他モジュールも一新されているみたいです。現時点でプレオーダーできるみたいなので、興味のある方は注文してみてはいかがでしょうか？</p>

<h2>まとめ</h2>

<p>いかがでしたでしょうか？
想像以上に簡単にセンサーを扱うことができたのではないかと思います。</p>

<p>TesselはWeb開発者にとってIoTの入り口になってくれるデバイスなので、Web開発者でハードウェア知識はないけどIoT領域に触れてみたいと考えている方々にはぴったりなのではないでしょうか。</p>

<p>今回はIoTと言いつつも、I(Internet)の部分には全く触れませんでした。次回はTesselをWifiネットワークに接続してWebサービスと連携して応用的なものを作ってみようと考えています。</p>

<p>興味を持った方は、ぜひTesselを使った開発にチャレンジしてみましょう！</p>
]]></content:encoded>
		
		<series:name><![CDATA[IoTxWeb]]></series:name>
	</item>
	</channel>
</rss>
