Blog

Home  >>  Blog

hollywis's diary (はりうすブログ)

はりうすの活動日記です

こんにちは。さいぞうです。最近このブログもすっかりサボってますが、IOT的な活動は続いてはいます。

ところで、話題のRaspberry Pi3買いました。 発表直後は手に入りにくいんじゃないかといわれていたけど、普通に買えました。 それだけの記事です。

Amazonで普通に買えた

購入したのはこれ。

プライムで注文して次の日くらいに届いた。

開封の儀

パッケージはこんなの。

何やら特徴が書いてある。ケース付きのセットだ。

はいっている物の説明が書いてある。

  • ラズパイ3
  • ケース
  • GPIOアサイメントカード ?
  • GPIOアサイメントシール ?
  • クッション ?
  • ネジセット

開けたらこんな感じ。入っているのはこれで全部です。

袋に入ったケース入りラズパイ

アサインメントカードって、GPIO端子の対応表か。

最初と同じ写真。

microUSBとHDMI端子。

LANとUSB✕4。

これで遊んでやろう。

以上です。

Posted: April 16, 2016, 2:21 am

こんにちは、のすけです。

かなり間が空いてしましました。

今回は、お手軽にIoTをやろうということで、wifiモジュールを利用せずに Johnny-fiveを利用してLEDの制御をやってみようと思います。

https://github.com/rwaldron/johnny-five/raw/master/assets/sgier-johnny-five.png

GitHub - rwaldron/johnny-five: JavaScript Robotics and IoT programming framework, developed at Bocoup.

よくJohnny-fiveを利用してArduinoを制御する記事などは見かけるのですがネット越しで制御する例は まだ少ないようですので、ここでご紹介したいと思います。

記事中で利用しているArduinoArduino R3になります。

Johnny-fiveをインストール

Johnny-fiveはオープンソースのFirmataというプロトコルを利用したIoTプログラミングフレームワークです。

Johnny-fiveを利用すればArduinoなどのハードウェアの制御を行えるだけでなく、node.jsの機能を利用してインターネット接続し様々なことができるようになります。

なお、今までのようにArduinoIDEはほとんど利用しません。

Arduino言語もFirmataの部分のみしか使いません。

全てJavascriptで記述しますのでJavascript用のテキストエディタを利用して記述しましょう。

MacならSublimeText2WebStorm,Vim

WindowsならさくらエディタTerapad,VisualStudio

などが良いでしょう。

プロジェクトフォルダの作成

次のコマンドを打って、プロジェクトフォルダを作成します。 Macならターミナルを起動し、Windowsならコマンドプロンプトを起動して以下のコマンドを叩いてください。

mkdir NodeProjects
cd NodeProjects
mkdir johnny-test001
cd johnny-test001

node.jsのインストール

http://mdlab.jp/project/node_js/images/node01.png

PCにnode.jsをインストールする必要があります。 しかし、すでに入っている場合もありますので次のコマンドを叩いて確認しましょう。

$ node -v
v5.0.0
$ npm -v
3.3.9

nodeが入っていればバージョンが表示されます。入っていなければ「そんなコマンドはない!」みたいなことを言われると思います。 同じくnpmも確認しましょう。

もし入っていなければ以下のサイトからダンロードしてインストールしましょう。 Node.js nodeには様々なバージョンがありますが、最新の5系のStableを入れておけば良いでしょう。 インストールが完了したら、先ほどのnode -vなどを叩いてnodeコマンドが使えるようになっていることを確認してください。

node.jsについての説明

node.jsはJavascript(ジャバスクリプト)でできたサーバになります。

Javascriptは主にHTMLなどと一緒に利用するイメージですが、その言語を利用してサーバを立てられてしまうのが node.jsです。

通常のサーバに比べて次のような点があると思っています。

  • 簡単にサーバが立てられる

  • 非同期処理が楽

  • 軽量

  • Javascriptで記述できるので、クライアントサイドも、サーバサイドも同じようにコードが書ける。

よくわからんぞ!!という方は、とりあえずスルーでOKです。

jhonny-fiveモジュールをnode.jsにインストール

実はjhonny-fiveはnode.jsのモジュールの一種です。

そのため、node.jsの関連モジュールを管理するコマンドnpmで簡単に入れることができます。

次の1行を実行してください。モジュールが大きいため多少ダウンロードに時間がかかります。

npm install johnny-five

さぁこれで準備は完了しました。 次はコードを書いていきましょう!

まずはnodeからArduinoの接続テスト

f:id:hollywis:20160325185857j:plain photo by fliker 紅色死神

ArduinoにFirmataプログラムを書き込む

ArduinoIDEから次のスケッチを選択して ファイル > スケッチの例 > Firmata > StandardFirmata

を選択して、Arduinoに書き込みます。

以上で終了です。ArduinoIDEの出番も、Arduino言語もこれでおしまいです。

f:id:hollywis:20160325192110p:plain

jonny-fiveを利用した接続テストプログラムを書く

先ほど作成したjohnny-test001というフォルダの下に次のファイル名でjsファイルを作成してください。 led-blink.js

中身は次のように記述します。

var five = require("johnny-five");
var board = new five.Board();

board.on("ready", function() {

  var led = new five.Led(13);

  // "blink" the led in 500ms on-off phase periods
  led.blink(500);
});

そして、PCとArduinoを接続した後に次のコマンドを実行します

node led-blink.js

ArduinoのLEDが点滅すれば成功です。

f:id:hollywis:20160325172825j:plain

これだけでも楽しいのですが、これはIoTではないです。

ただnodeを利用してArduinoを制御しただけですので、永遠点滅してしまいますし、止める方法もありません。

ネットからの指示だしして制御してこそIoTですよね!

nodeのサーバ機能を実装してIoTする

f:id:hollywis:20160325185411j:plain photo by flickr[PROFumi Yamazaki]

実はここから若干難しくなります。nodeでサーバ機能を作らなくてはいけないためです。

だた、node.jsは他のサーバサイドプログラムと比較してもかなり少量のコードで動きます。

server.jsの作成

先ほど作成したjohnny-test001というフォルダの下に次のファイル名で新しくjsファイルを作成してください。

server.js

そして中には次の内容を記述しましょう。

var http = require('http');
var querystring = require('querystring');
var util = require('util');
var fs = require('fs');
var form = fs.readFileSync('./public/form.html');

var five = require('johnny-five');
var board = new five.Board();

cmd_ledon = 'echo "LED ON!!"';
cmd_ledoff = 'echo "LED OFF!!"';

var led;

board.on('ready', function() {
    led = new five.Led(13);
});

http.createServer(function (req, res){
    if(req.method === 'GET'){
        res.writeHead(200,{'Content-Type': 'text/html'});
        res.end(form);
    }
    if(req.method==='POST'){
        var postData = '';
        req.setEncoding('utf8');
        req.on('data',function (chunk){
            // per request
            postData += chunk;
        }).on('end',function(){
            // response data
            var respose_data = '';

            // end request
            if(!postData){
                res.end();
                return;
            } // if postData is empty.
            var postDataObject = querystring.parse(postData);
            console.log('user posted following data:' + postData);
            console.log(postDataObject.userinput1);
            respose_data += 'your poted data is:\n' + util.inspect(postDataObject)+'\n';

            if(postDataObject.userinput1 == '1'){
                led.on();
                respose_data += 'LED ON !!';
                respose_data += '<style type="text/css">.ledon{background-color: #34A7C1;}</style>';
            } // if userinput1で1がPOSTされたならledon
            if(postDataObject.userinput1 == '0'){
                led.off();
                respose_data += 'LED OFF !!';
                respose_data += '<style type="text/css">.ledoff{background-color: #34A7C1;}</style>';
            } // if userinput1で0がPOSTされたならledoff

            res.writeHead(200,{'Content-Type': 'text/html'});
            res.end(form + respose_data,"utf8");
        });
    }
}).listen(8000);

実はこれは、別連載の「node.jsをやってみる」のサーバサイドコードとjhonny-fiveの記述を合体しただけです。 hollywis.hatenablog.com

前半の5行が利用するweb系のモジュールの記載。

var http = require('http');
var querystring = require('querystring');
var util = require('util');
var fs = require('fs');
var form = fs.readFileSync('./public/form.html');

次の2行がJohnny-fiveの記載です。

var five = require('johnny-five');
var board = new five.Board();
board.on('ready', function() {
    led = new five.Led(13);
});

この部分で13番PINをjhonny-fiveと関連付けて、グローバル変数であるledに入れています。

そしてhttp.createServerでサーバ機能を作り、POSTリクエストが来た時に次の部分でled.on()led.off()でLEDを付けたり消したりします。

           if(postDataObject.userinput1 == '1'){
                led.on();
                respose_data += 'LED ON !!';
                respose_data += '<style type="text/css">.ledon{background-color: #34A7C1;}</style>';
            } // if userinput1で1がPOSTされたならledon
            if(postDataObject.userinput1 == '0'){
                led.off();
                respose_data += 'LED OFF !!';
                respose_data += '<style type="text/css">.ledoff{background-color: #34A7C1;}</style>';
            } // if userinput1で0がPOSTされたならledoff

なお、付けたり消したりはuserinput1という変数の値で判断しています。

制御するためのHTMLの作成

HTMLファイルを作成しますので、格納するフォルダpublicを作ってからform.htmlファイルを作成します。 フォルダを作るには次のコマンドを実行してください。

 mkdir public

その下にform.htmlファイルを作ります。

ファイル構成はこんな形になっているはずです。 f:id:hollywis:20160325182856p:plain

form.htmlには次のように記述してください。

<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no">
<form name="form" method="post">
    <button class="ledon" style="width: 150px;height: 150px;" onclick="document.form.userinput1.value = 1">ON</button>
    <button class="ledoff" style="width: 150px;height: 150px;" onclick="document.form.userinput1.value = 0">OFF</button>
    <input type="hidden" name="userinput1"><br><br>
</form>

ボタンledonをクリックしたらhiddenのuserinput1の値に1をセットして送信

ボタンledoffをクリックしたらhiddenのuserinput1の値に0をセットして送信しています。

なお、これは先ほどのコードにvar form = fs.readFileSync('./public/form.html');という部分に関連しています。

PCで実行!

次のコマンドを実行してサーバを起動です。 node server.js

起動できたら、ブラウザでlocalhost:8000にアクセスしてください

f:id:hollywis:20160325183216p:plain

このようにボタンが表示されるはずです。

ONボタンを押すとLEDが点灯し、OFFボタンを押すとLEDが消灯するかと思います。

スマホから実行!

IoTらしくスマホから実行してみましょう。

まず、PCとスマホは同じWifiに接続します。

そしてPCで次のコマンドを叩いてPCのIPアドレスを確認しましょう。

Macならifconfig

Windowsならipconfig

f:id:hollywis:20160325184111j:plain

次に、スマホのブラウザで

xxx.xxx.xxx.xxx:8000と入力します。xxxは確認したIPアドレスです。

f:id:hollywis:20160325184515p:plain

f:id:hollywis:20160325184539p:plain

OKボタンを押すと

f:id:hollywis:20160325184554p:plain

このように命令が実行され,ArduinoのLEDが点灯します。

f:id:hollywis:20160325172825j:plain

OFFボタンを押すとLEDが消灯します。

f:id:hollywis:20160325184701j:plain

まとめ

オープンソースIoTフレームワークJohnny-fiveを利用して、インターネット接続機能が無いArduino R3でIoTしてみました。

PCからだけでなく、同じネットワーク内のスマホからでも簡単に制御できることがわかりました。

本当にインターネット越しに制御するには固定IPを取得するなどして、中継サーバ(ルータなど)が必要ですが 家庭内利用でしたらこの構成でも良いのでは無いかと思います。

最近はスティックPCなども出ていますので、スティックPCとArduinoを接続してしまえば簡単にIoTプラットフォームが 作れてしまうのではないでしょうか。有用そうなのでスティックPC連携は今度試してみたいと思います。

Posted: March 25, 2016, 10:11 am

こんにちは、のすけです。

最近は毎週朝に、カフェでもくもく作業しています。

そんなもくもくの成果を一つ書いておきます。

NodeでLEDを遠隔チカチカさせる(仮想編)

やってみたいじゃないですか。遠隔チカチカ。

最近はクラウドのIoTサービスなんかもあって便利なんですが、その前に自分でサーバを作ってやってみないことには IoTサービスの便利さを体感できないと思います。

というわけで、最近はまっているNodeを利用してサクッとサーバを立てて、それからLEDチカチカへ移りたいと思います。 チカチカさせるマイコンとしては、Rasberry pi2を利用します。

POSTデータを受け取るサーバ作成

まず、POSTデータを受け取るサーバプログラムはこちら

var http = require('http');
var querystring = require('querystring');
var util = require('util');
var fs = require('fs');
var form = fs.readFileSync('./public/form.html');

http.createServer(function (req, res){
    if(req.method === 'GET'){
        res.writeHead(200,{'Content-Type': 'text/html'});
        res.end(form);
    }
    if(req.method='POST'){
        var postData = '';
        req.setEncoding('utf8');
        req.on('data',function (chunk){
            // per request
            postData += chunk;

        }).on('end',function(){
            // response data
            var respose_data = '';

            // end request
            if(!postData){
                res.end();
                return;
            } // if postData is empty.

            var postDataObject = querystring.parse(postData);
            console.log('user posted following data:' + postData);
            console.log(postDataObject.userinput1);
            respose_data += 'your poted data is:\n' + util.inspect(postDataObject)+'\n';

            res.end(respose_data,"utf8");
        });
    }
}).listen(8080);

基本的なサーバ機能を提供するhttp、クエリストリングをいい感じに読んでくれるquerystring、POSTデータを簡単に文字列に変えることができるutil、ファイルを読み込めるfsのライブラリを使っています。

form用のHTMLは別ファイル./public/form.htmlに置いておいて。それをfsで読み込みます。 f:id:hollywis:20160218085231p:plain

<form method="post">
    <input type="text" name="userinput1"><br><br>
    <input type="text" name="userinput2"><br><br>
    <input type="submit">
</form>

単純にHTMLでform作ってmethodをpostにします。 input要素を2つくらいとsubmitをつけただけ。

サーバの方に戻ります。 req.methodがGETの時はform.htmlを表示させ、POSTの時は処理を挟みます。

req.setEncoding('utf8'); を入れているのは近年のブラウザはutf8で処理しているのですが、これの設定入れないと違うエンコーディングで読んだりして文字化ける可能性があるそうです。

req.on('data',function (chunk){
            // per request
            postData += chunk;

        }

リクエストのデータは複数回に分かれて細切れに飛んできます。dataイベントが複数回発生しますので、これを結合して一つのデータにしています。

on('end',function()

データの受信が終わったらendイベントが発生するため、ここから主処理を開始できます。

querystring.parseでpostDataを扱いやすいようにオブジェクトに変換しています。

util.inspect(postDataObject)でオブジェクトを文字列に変換しています。

res.end(respose_data,"utf8");ではレスポンスに文字列response_dataを返却しています。ここでエンコーディングタイプutf8を指定しないと、日本語を返した場合にブラウザがどんなエンコーディングタイプで読めば良いかわからないため文字化けします。

LED点灯できるコマンド実行できるようにする

nodeではコンソールで実行するようなコマンドを発行することができます。

具体的にはrequire('child_process').execを利用します。

var exec = require('child_process').exec, cmd;

cmd_ledon = 'echo "LED ON!!"';
cmd_ledoff = 'echo "LED OFF!!"';

led_onoff = function(cmd) {
    return exec(cmd, {timeout: 1000},
        function(error, stdout, stderr) {
            console.log('stdout: '+(stdout||'none')); // 標準出力
            console.log('stderr: '+(stderr||'none')); // 標準エラー出力
            if(error !== null) {
                console.log('exec error: '+error);
            } // errorの時
            else{
                console.log('exec: '+cmd);
            } // errorなしの時
        }
    )
};
led_onoff(cmd_ledon);
led_onoff(cmd_ledoff);

最後の2行でLED点灯、LED消灯を実行しています。led_onoff関数を作成し、そこにコマンドを渡してあげると実行してくれます。

今回は(仮想編)ですので実際にLEDを点灯するコマンドではなくecho "LED ON!!"echo "LED OFF!!でLEDが点灯、消灯したということにします。

上記プログラムを合体して、POSTデータによってLEDの点灯、消灯を切り替える

var http = require('http');
var querystring = require('querystring');
var util = require('util');
var fs = require('fs');
var form = fs.readFileSync('./public/form.html');

var exec = require('child_process').exec, cmd;

cmd_ledon = 'echo "LED ON!!"';
cmd_ledoff = 'echo "LED OFF!!"';

led_onoff = function(cmd) {
    return exec(cmd, {timeout: 1000},
        function(error, stdout, stderr) {
            console.log('stdout: '+(stdout||'none')); // 標準出力
            console.log('stderr: '+(stderr||'none')); // 標準エラー出力
            if(error !== null) {
                console.log('exec error: '+error);
            } // errorの時
            else{
                console.log('exec: '+cmd);
            } // errorなしの時
        }
    )
};

http.createServer(function (req, res){
    if(req.method === 'GET'){
        res.writeHead(200,{'Content-Type': 'text/html'});
        res.end(form);
    }
    if(req.method='POST'){
        var postData = '';
        req.setEncoding('utf8');
        req.on('data',function (chunk){
            // per request
            postData += chunk;
        }).on('end',function(){
            // response data
            var respose_data = '';

            // end request
            if(!postData){
                res.end();
                return;
            } // if postData is empty.
            var postDataObject = querystring.parse(postData);
            console.log('user posted following data:' + postData);
            console.log(postDataObject.userinput1);
            respose_data += 'your poted data is:\n' + util.inspect(postDataObject)+'\n';

            if(postDataObject.userinput1 == '1'){
                led_onoff(cmd_ledon);
                respose_data += 'LEDが点灯しました !!';
            } // if userinput1で1がPOSTされたならledon
            if(postDataObject.userinput1 == '2'){
                led_onoff(cmd_ledoff);
                respose_data += 'LEDが消灯しました!!';
            } // if userinput1で2がPOSTされたならledoff

            res.end(respose_data,"utf8");
        });
    }
}).listen(8080);

LEDの点灯、消灯はpostDataObject.userinput1のみを見て判断しています。

1がPOSTされれば点灯、2がPOSTされれば消灯です。それ以外ならPOSTされた値が表示されるだけです。なお、postDataObject.userinput2は何も意味がありません。飾りです。

やってみる

まず、formに1を入力して送信すると・・・

f:id:hollywis:20160218093731p:plain

f:id:hollywis:20160218093738p:plain

LEDが点灯!!と表示され、コンソールを見てみると

f:id:hollywis:20160218094140p:plain

次に、formに2を入力して送信すると・・・

f:id:hollywis:20160218093549p:plain

f:id:hollywis:20160218093557p:plain

LEDが消灯!!と表示され、コンソールを見てみると

f:id:hollywis:20160218094205p:plain

実際にコマンドが発行されているのが確認出来ました。これでLEDを点灯させる準備が出来たとこになります。

まとめ

Nodeを利用してPOSTデータを受け取り、送信されるデータに従ってLEDを点灯・消灯させることが出来ました。

今回は仮想的にやりましたので、次回はRasberry pi上にNodeサーバを立ち上げて実際に遠隔からLEDをチカチカ制御してみたいと思います。

ではまた!

Posted: February 18, 2016, 12:28 am

f:id:hollywis:20160210162058j:plain

さいぞうです。

さいきんはりうすでは電子工作とかIoT的なことをやってますが、その流れで、再来週 (2016 2/22(月))に、気軽にIoTを始められる初心者向けの超入門勉強会やります。

会の名前は「IoTやりてぃー」。

ちょっと前からよくきくIoT?、あるでぃーの?、よくわからないけど面白そう、という方ぜひどうぞ。

  

参加費1300円で、Arduino互換機がもらえるので、パソコンさえあれば参加できます!

connpass.com

 
 

IoTを気軽にはじめてみる!!

当日は、IoTのど定番ツール、手軽に使えるマイコンボード「Arduino」と、これをネットにつなげることができるWi-Fiモジュール「ESP8266」について、何に使えるの?どうやって使うの?といった話からはじめます。

なので、そもそものところがよくわからない、という人でも大丈夫です。

その後はハンズオン。

1時間くらいかけて、実際にArduinoを動かしてみます!!

 

会場

イベントをやるのは、渋谷の道玄坂をあがりきったところにあるカフェ「FabCafe」の2階!!!

FabCafe Tokyo

FabCafeさんは、3Dプリンタとかレーザーカッターとか、店内でいろんなデジタル工作機械が動いている、おしゃれなものづくりカフェです。

 

会場は、その2階に新しくオープンするコワーキングスペース「FabCafe MTRL」です。

mtrl.net

 

参加してみよう!(先着10名です)

参加登録はConnpassというサービスをつかっています。

こちらからどうぞ。

connpass.com

Posted: February 10, 2016, 7:52 am

Arudinoのチュートリアルをやる連載の8回目です。

f:id:hollywis:20160204085013j:plain今回から完成したものを見せる本編と、作業中のいろいろを書くメモをわけてみます。

コンテンツの水増し。

こちらは技術者、実際にやってみたい人向けの作業メモです。

内容

Arudinoチュートリアル的にはここでやるのは、複数のLEDをついでの信号機ということになっています。

ただし、あまり面白くないので、実際の渋谷のスクランブル交差点信号機に同期して動くLED信号機を作ってみたいと思います。

方法

公開されているライブカメラの映像を使います。

渋谷のスクランブル交差点のリアルタイムな映像は、ネット上で公開されています。 そこで、それを利用して、以下の流れでできると思いました。

  1. ブラウザ等で映像を開く(PC側の処理)

  2. スクリーンショットとる(PC側の処理)

  3. 画像処理(ってほどじゃないけど)で信号の色か、人の流れを見て、赤、青、できたら黄色信号を判別(PC側の処理)

  4. Arduinoにシリアル通信でその情報を送る(PC側の処理)

  5. LED光らせる(Arduinoの処理)

例によって面白いところはほとんどパソコン側のプログラミングです。

Arduinoの方のチュートリアルが進んでないので、こうなっちゃいます。

早く先に進みたい!

前回までは、パソコン側はRubyでいろいろ処理してました。

hollywis.hatenablog.com

でもこれも飽きてきたので、最近いじってるSwiftで作るOSXアプリでやってみたいとおもいます。

ソースコード

PC側(Swift)はこちら

https://bitbucket.org/aoyagikwansei/traficsignalsyncaruino

Arudinoスケッチはこちら

<まだない>

作業

SwiftArduinoのシリアル通信

最初にやり方だけ調査。

適当にググると、IOKITというライブラリを使えばいいらしい。じゃあこれでいいや。

実は今手元にArduinoがないので次に進む。

参考 Mac OS X Drivers for CH340 / CH341 / PL2303 USB to RS-232 Devices

Macと色々なものをつなげる話。2014 - Qiita

ライブカメラ

適当にググってください。

渋谷駅前の交差点ので、ちょど利用できそうなやつがあったので、この記事はそれをつかいます。

しかし、そのサイトは映像の2次利用をしつこく禁止しています。

なので、この記事では一般的なライブカメラ映像を使う、という体でかきます。

Swiftで画面キャプチャ

ググると、iOSのやつはたくさんでてくるけど、OSXのやつはあまりない。

これとか 画面スクリーンキャプチャ取得 - Swiftサラリーマン

 
参考になりそうなの

WKWebViewの使い方 SwiftでWKWebViewを使ってみた - Qiita

WKWebView(WebKit)とSwiftでウェブページを表示 | EasyRamble

GitHub - ShingoFukuyama/WKWebViewTips: WKWebView Tips (iOS 8.1.0)

なんか上記のとおりつくっても表示されないなーと2時間くらいハマったけど、 この記事のようにNSAppTransportSecurityの設定をしたらできた。 SwiftでWebView(1) - リハビリエンジニア

WKWebViewのなかみを保存 swift - WKWebView Screenshots - Stack Overflow

GitHub - lemonmojo/WKWebView-Screenshot: WKWebView+Screenshot provides simple methods that use private(!) APIs of the WebKit framework to capture a screenshot of a WKWebView running on OS X.

ここにのっている方法は、OSXのプライベートなAPI?を使っているとのことで、AppStore公開申請を出しても通らない。 個人的に使うだけのアプリにはこれでいいらしいので、やってみる。

SwiftからObjective-Cのコードを使う方法 Objective-CベースのプロジェクトからSwiftのクラスを呼び出す - Qiita

WKWebView-Screenshotで使ってたdispatch_timeのswiftでの書き方 Swiftでdispatch_afterを使う - Qiita

なんと、上記の方法では、動画のスクショがとれない? iframeがダメなのか? media要素がだめなのか?

WKWebViewではなく、画面全体のスクリーンショットを取るアプローチに変更する。

GitHub - Arasthel/SayCheese: A screenshot taking app written in Swift

うごかそうとしたらこれになった

初めてのCocoaPodsでLinker command failed with exit code 1でハマる | 生きる

SayCheeseのコードを細かく追っていくと、こんなのが!

 system("screencapture -c -x");
 let imageFromClipboard = NSImage(pasteboard: NSPasteboard.generalPasteboard())

これだけの事だったのか.. osxにscreencaptureというコマンドがあるんだろう。 これでとったスクショはクリップボードに保存されるから、この内容を取得する。

できた!!!!

繰り返し&タイマー

Webサイトを開いた画面を繰り返しキャプチャするのに、タイマー処理が必要。

swiftで、タイマー(Timer)を使ってみる - Three.jsを使って、作ってみた

画像処理

執筆途中...

宣伝

こういう感じでArduinoでいろんな物が作れる、初心者用つめあわせキットがこちら。

作ってみたいな、と思った人は買ってください。

 
このキットと私がアップしたコードの組み合わせで作れます。

こういう有名ドコロのでも可。

みんなのArduino入門:基本キット

みんなのArduino入門:基本キット

これまでの記事など

前回

hollywis.hatenablog.com

総合もくじ

hollywis.hatenablog.com

Posted: February 4, 2016, 2:28 am

こんにちは、のすけです。

Node.jsのWebフレームワークであるExpressを入れてみました。

以前紹介したようにhttp.createServerで簡易的にはサーバを作れるのですが、ルーティングとかを考えるとWebフレームワークを使った方が楽だと思います。

今回は、Expressプロジェクトの内容が知りたかったので、かなりずるい方法で環境を構築します。

WebStormを使う

はい。WebStormを使います。WebStormはHTML用のIDEです。(なんかPhpStormでもモジュール入れればいけるらしい)

HTML,CSS,JSを書く場合に威力を発揮します。

WebStormはNode.jsにも対応しているので、これでサクッと作っちゃいます。

こちらからダウンロード。

www.jetbrains.com

僕はWebStorm8のライセンスを持っているので8で作ります。最新は11だった。

起動

f:id:hollywis:20160204092134j:plain

*この画像はすぐ消えるので上手く撮れなくて適当に拾ってきました。

環境を選択。テーマはDarculaを選びました(背景が黒いやつです)

f:id:hollywis:20160204092214p:plain

Create New Projectを選択。画像はちょうどCreate New Projectが切れてしまった(上の方にあります)。

f:id:hollywis:20160204092349p:plain

プロジェクト名を入れて、project type をNode.js Express Appに

f:id:hollywis:20160204092505p:plain

Node interpreterを選んで、versionは4.13.1にしました。

Viewのtemplate engineはjadeを選びました。cssはplane css

f:id:hollywis:20160204092739p:plain

するとこんな感じでプロジェクトができました。

f:id:hollywis:20160204092803p:plain

binの下のwwwが起動用jsで、app.jsがアプリケーション全体の設定。

routes下のindex.jsusers.jsがそれぞれのルーティングに対応したjsっぽいですね。

viewsの下にjadeファイルがありました。

node_modulesの下を覗くといっぱいjsのライブラリが・・・。Expressがjsライブラリの集合体であることがわかりますねぇ。

package.jsonを覗いたらこんな感じだった。

{
  "name": "node-test001",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node ./bin/www"
  },
  "dependencies": {
    "body-parser": "~1.13.2",
    "cookie-parser": "~1.3.5",
    "debug": "~2.2.0",
    "express": "~4.13.1",
    "jade": "~1.11.0",
    "morgan": "~1.6.1",
    "serve-favicon": "~2.3.0"
  }
}

そして、MenuのRun -> Run をクリックすると。binしたのwww.jsを叩いてlocalhost:3000でnode.jsを起動してくれます。

ブラウザで開くと、index.jadeのやつが表示されました。

f:id:hollywis:20160204093306p:plain

おしまい。

Posted: February 4, 2016, 12:36 am

こんにちは、のすけです。

Arduinoと人気を分ける多機能IoT端末 Rasberry Pi2を手に入れたので動かしてみました。

Rasberry Pi 2起動

f:id:hollywis:20160203114853j:plain

Rasberry Pi 2はLinuxベースのマシンですので、LinuxのOSで動かせます。

ただ専用のOSが用意されており、それがDebianをベースにした「Raspbian」です。大抵はこのOSを入れて動かすことが多いです。

起動画面もLinuxそのもの。

Rasberry Pi 2には、CPU,メモリ,GPU,SDカード(ストレージ),LAN,USB端子4つが付いており、ほぼPCと遜色ありません。 また、GPIO端子も付いているので電子工作も可能と最強の端末です。

ちなみに、僕の端末にはブラックを基調とした外装を施してあり、CPUとかにもヒートシンクをつけてあります。これで静電気対策や熱対策はバッチリ、ついでに見た目もカッコよさげです。

f:id:hollywis:20160203115647j:plain

なお、PCディスプレイとは画像上部のHDMI接続しています。HDMI端子が付いているなんで凄いですよね。

他にもUSB端子に無線LANモジュールやらマウス用のレシーバやらが刺さっています。USBで色々拡張できるのもRasberryPi2のいいところ。

f:id:hollywis:20160203120129j:plain

起動しました。こちらがデスクトップ画面。

ただのPCですね。

Lチカ回路の作成

起動したので、Lチカ回路を作ります。

適当に抵抗を噛ませて、GPIO端子からLEDと抵抗を通ってGNDに接続させます。

回路図はArduinoとかでやっているのと同じなので、そちらをご参照ください。

hollywis.hatenablog.com

f:id:hollywis:20160203120419j:plain

こんな感じで繋ぐ。

LEDを光らせる

では、光らせてみましょう。

簡単です。専用のファイルに0,1を書き込むだけのイメージです。

まずはコンソールを開いて次のように打ちます。

pi@raspberrypi ~ $ sudo echo 23 > /sys/class/gpio/export
pi@raspberrypi ~ $ ls /sys/class/gpio/
export gpio23 gpiochip0 unexport
pi@raspberrypi ~ $ sudo echo out > /sys/class/gpio/gpio23/direction
  • 1行目はGPIO端子の23番を使うよ!と宣言しています。

  • 2,3行目はgpioディレクトリ以下にgpio23のディレクトリができているのを確認しています。

  • 4行目はgpio23outつまり出力として使うよ!と設定しています。

準備ができたので、あとはgpio23の設定値をvalueに書き込んでやればOKです。

pi@raspberrypi ~ $ sudo echo 1 > /sys/class/gpio/gpio23/value
pi@raspberrypi ~ $ sudo echo 0 > /sys/class/gpio/gpio23/value
pi@raspberrypi ~ $ sudo echo 1 > /sys/class/gpio/gpio23/value
pi@raspberrypi ~ $ sudo echo 0 > /sys/class/gpio/gpio23/value

1でLEDがオン。0でLEDがオフです。

f:id:hollywis:20160203120937j:plain

すると、、、

光ったり。

f:id:hollywis:20160203122219j:plain

消えたり。

f:id:hollywis:20160203122308j:plain

できました。

あとは、冒頭で動画で紹介したように自動でチカチカさせるにはPythonとか適当な言語で 上記のコマンドを入力するようにしてやれば自動Lチカもできます。

f:id:hollywis:20160203120725j:plain

コツは0入力と1入力をする部分をループ化して、間に1秒程度の待ちを入れてあげることです。

なかなか便利なRasberry Pi2。今度はネット越しで制御させてみようかなぁ。

Posted: February 3, 2016, 3:31 am

こんにちは、のすけです。

DTIのsimがなんか半年無料で使えるとかいうキャンペーンがあって、ついつい申し込んで手に入れてしまいました。 ユビキタスプロバイダ DTI: 料金は大手最安値帯 2回連続No1評価獲得

そこで、このDTIのsimを有効活用するためにMacbookに挿してインターネットに接続してみました。

2500円(端末代他)+3000円(初期費)で半年間ネット接続がMacbookからできるなんて凄すぎ。。。しかも毎月 3GBとか。

Macbookにsimを挿すには

iPhoneiPadのようにMacbookにsimがそのまま挿せればいいのですが、残念ながら挿すところはありません。

そこで、先日手に入れたDOCOMOのUSBモデム「L05A」にsimをに挿して使おうとしました。

L05Aはこやつ。Amazonで中古品を1800円で購入。激安ですね。

このUSBモデムにsimを挿して、MacbookとUSB接続して連携するという寸法です。

なお、L05Aは標準SIM(mini-SIM)なのですが、DTIにはnano-SIMで注文してしまったので、下駄を履かせています。

使ったのは↑です。他にも安いやつがあるみたいですが、評価が良かったので。

L05AはOSX 10.9(OS X Mavericks)までだった

しかし問題が、、、

、、、

僕が持っているMacのOS10.11(OS X El Capitan)ではドライバがないということがわかりました。

L-05A | お客様サポート | NTTドコモ

こちらからドライバとMac用の接続ツールが配られています。

OSX 10.9(OS X Mavericks)までしか対応していません。

一応ダウンロードしてインストールしてみましたが、接続ツールを起動しても「端末初期化中・・・」がずっと続いて全く使えません

なんてこった><;

YosemiteやELcapitanで使う方法

そりゃ、DOCOMOさんはこんな古いUSBモデムはもうサポートしないでしょうし、ドライバももう出ないでしょう。 そんなわけで、接続ツールを使わないで僕のMac10.11.2(OS X El Capitan)をインターネットに接続させてみました。

多分Yosemiteでもいけると思います。

接続ツールをアンインストール

まずDOCOMOの接続ツールをインストールしていたら、アンインストールします。

もし、入れていなければこの手順は飛ばして大丈夫です。

アンインストールは、接続ツールのインストール用zipの中に入ってます。

端末をMACに接続して、Finederからデバイスを取り出す

まずは端末をMACのUSB端子に挿します。

f:id:hollywis:20160122133925j:plain

MacbookはUSB Type-cなのでハブみたいのに接続してますが、AirとかProなら直接させばOKです。

そしてFinederを開いて、デバイスのDOCOMOというやつ右にある取り出しマークを押します。

f:id:hollywis:20160122134207p:plain

ネットワーク環境設定で接続設定を記述

次にネットワーク環境設定を開きます。するとL05Aのやつが3つ出てきました。

f:id:hollywis:20160122134347p:plain

この1番上のやつを選択して、構成のところで「構成を追加」を押します。名前は「L05A」とかにして作成します。

f:id:hollywis:20160122134547p:plain

次に右下の「詳細」を押します。

f:id:hollywis:20160122134347p:plain

モデムのタブのところで、「機種」を「GPRS(GSM/3G)」に、APNを「dti.jp」にします。*他のsimならそのsimのAPN設定を入れる感じです。

そして「OK」を押す。

f:id:hollywis:20160122134652p:plain

次に「アカウント名」と「パスワード」を入れます。DTIならdtidtiです。

f:id:hollywis:20160122135205p:plain

最後に「接続」を押せば、インターネットに繋がります。やったーー!

f:id:hollywis:20160122135339p:plain

速度はどんなもんかな?

Wifiの接続を切ってから、速度を測定するサイトで見てみました。

f:id:hollywis:20160122140024p:plain

1.11Mbps あんまり速くないけど、ブラウジングとかなら問題なさそうですね。

Wifiが使えないカフェとかで活躍しそう!

Posted: January 22, 2016, 5:02 am

こんにちは、のすけです。

たまたま用事があって新宿に行きました。その際に、せっかくだからこの辺りで仕事できるコワーキングというか電源カフェないかなぁと探したところ、見つけました。

その名も、BASE POINT(ベースポイント)

新宿・貸し会議室・電源ノマドカフェ「BASE POINT」(ベースポイント)

いかにも、自分のBASE(基地)にしてくださいといった感じのネーミングでホームページを見たところ良さげだったので行ってきました。 f:id:hollywis:20160119143932p:plain

ちょっと奥まったところにある

f:id:hollywis:20160119144031p:plain

新宿の北西、新宿駅より西新宿駅の方が近いかもしれません。昼間に行ったのですが、ちょっと奥まった狭めの道のある場所にあり、営業マンや配達のおじさんが行き交う感じの中小企業が集まるエリアといった場所にありました。

大通りに面しているというわけでもなく中の様子も見えないので、ホームページで事前に調べていなければ入るのに若干勇気がいる感じです。

中はこんな感じで、かなりイケてます。

f:id:hollywis:20160119144917j:plain

変わったシステム

まず、入って認識しなければいけないのが、この店特有のシステムです。

ありていに言えば、漫画喫茶みたいなシステムです。

基本的には時間制のカフェとなっています。10分毎に従量課金です。お値段は2時間で1000円ほど。

また、パック料金もあり3時間や1時間、1日コースもあります。漫画喫茶式ですね。。

そして、料金にはフリードリンクがついてきます。やっぱり漫画喫茶式ですね。。でも、漫画はありません><;

ここはあくまでご飯を食べたり、仕事したり、勉強する場所ですので、当然かもしれません。漫画がずらっと並んでいたら仕事どころじゃないですし

あとは、ランチプランなんのもありました。これは「時間60分とランチ」がセットになったものです。このランチプランを頼んだ場合には、フリードリンクと60分居座れる権利とランチがついてきます。お得ですね。

メニューはタコライスとかそういう、おしゃれカフェ的なメニューでした。

http://b-pt.jp/wp-content/themes/basepoint/images/food/lunch_01.jpg *HPより引用

僕は食べていないので、味はどうなんでしょうか。店内の数名は食べている感じでした。

60分じゃ足りないよって人は、普通に従量制やセットにして、フードを単品で頼んでくださいとのことでした。

電源がどの席にもある

実はこの、「電源がどの席にもある」というのはかなりの重要なポイントです。

よくある電源カフェなんかは、一部の席だけ電源があるだけでそこが埋まっていると充電できない!!みたいなことになります。わざわざ電源カフェを探してきたのに埋まってるし。。。とか辛いですよね。

でも安心してください!このカフェはどの席にも電源ありあります。コンセントから遠い場所には電源タップで延長されていて椅子のすぐ場所に置いてあったりします。

また、店の真ん中あたりでは電源が天井からぶら下がってるので、安心です!

f:id:hollywis:20160119150035j:plain

しかも、小学校とか中学校とかにあったやつ!!

懐かしい、引っ張るとカチカチ音を鳴らしながら下がってきます。

WiFi完備

電源があれば、あとはwifiも欲しいところですがバッチリありました。壁にSSIDとパスワードが張ってあるので誰の目にも明らか!セキュリティとかは、ご愛嬌という感じです。

f:id:hollywis:20160119150456p:plain

速度もなかなか速いです。

でも思ったほどPC利用者は少なかったですね。勉強とかしている人と半分半分でした。

平日の昼間に行ったのですが、結構席は埋まっていました。でも勉強だったりPCだったりしているので、店内は比較的静かですね。作業する場所という感じです。

細部にこだわりあり

僕の中でいいなぁと思ったポイントなのですが、フリードリンクのコップがステンレスコップでした。

漫画喫茶とかによくあるフリードリンクのコップは、透明なプラスチックのやつですけど、あれだとありがたみが薄いですよね。ステンレスコップだと、コップがよく冷えるため口当たりが良くドリンクが美味いです。氷も全然溶けないですしね。

f:id:hollywis:20160119150639j:plain

素晴らしい。

おみくじが引ける

会員になるとセットプランが使えるので、会員になりました。会費は¥150で安かった。

QRコードで登録画面に飛んで、名前とメアドを入力して登録完了です。

こちらが会員用の画面 f:id:hollywis:20160119153211p:plain

システムはWebで作られていて、ポイント機能もついているようです。デザインは全体的にbootstrapっぽい印象。多分レスポンシブ。

職業病でこういうwebシステムみたら分析してしまいます;

下の方に「おみくじを引く」とかあったので押してみました。

f:id:hollywis:20160119153150p:plain

一等兵。。。BASE(基地)に掛けているのでしょうか。

「訓練で汗を流したぶんだけ、実戦で血を流さなくてすむ」名言ですね!?

他になにがあるのかわかりませんが、10ポイントゲットしたようです。他のやつ気になります。知っている方がいたら教えてください!!

f:id:hollywis:20160119153228p:plain

どうやらこのポイントで割引券とかと交換できるようです。初期登録で200ポイントもらえて、さらにおみくじで10ポイントもらえたようです。

でもなぜが、合計が230ポイント。。20ポイントは何かのボーナスでしょうか。

会議室・パーティルーム

一階が通常の時間制カフェ営業なのですが、2Fと3Fは場所貸しになっていました。 ちょっと値段はお高めという印象ですけど。。。

f:id:hollywis:20160119152445j:plain *HPより引用

4席や6席のテーブルや部屋が合計5つありました。部屋毎に値段が違ってパーテーションで区切られた ところなら30分¥400から、個室なら30分¥800からという部屋代です。時間も朝9時から夜22時と中々遅くまでやっています。詳しくはホームページをみてください。

部屋代だけでなくフリードリンク料金が別途人数分かかるので、注意かもしれません。一人あたり2時間で¥430から、4時間以上で¥700などといった感じ。

3Fはワンフロア貸しで18時まで30分¥1200、18時から22時までが30分¥1400です。土日はさらに料金が上がります。マイクやプロジェクターなどの貸し出しもあるようです。

f:id:hollywis:20160119152536j:plain *HPより引用

まとめ

作業場所としてはかなりオススメ。静かなためはかどります。フリードリンクなので、コーヒーとか飲み放題ですし。

僕らは結構会議することも多い為、たまにはこういった場所で会議するのも良いかもと思いました。

新宿・貸し会議室・電源ノマドカフェ「BASE POINT」(ベースポイント)

Posted: January 19, 2016, 6:55 am

f:id:hollywis:20160119150031p:plain

ごぶさたしております。

さいぞうです。

     

前回更新は昨年のクリスマス。

hollywis.hatenablog.com

面倒くさくて最近更新してませんでしたが、気づいたら年があけていました。今年もよろしくお願いします。      

次のチュートリアルはLEDを複数つなげるというだけの回で、つまらないのでやる気がでなかったのですが、 簡単にできるネタを思いついたので書きます。    
           

Arduinoで映像を超絶劣化させるマシン

この動画がArduinoで映像を超絶劣化させるマシンを動かしたところです。

www.youtube.com

     

こういうことです。

つまり、Macのカメラに写った映像を赤緑青に分解し、比率をみて多かった色のLEDを光らせます。 ただし、青色LEDはキットに入ってなかったので、青が多い時は白LEDを光らせます。

     

一応、映像を左右に分けて、それぞれのエリアごとに色を判定することにしました。

     

PCのディスプレイでも、LEDでも、幾つかの光の点を集めてで画像を表しているという点では同じです。

私の使っているmacbook pro 15inchのカメラは720pらしいので、92万1600の画素で映像を表しています。 APPLE MacBook Pro Retina Display(15.4/2.3GHz Quad Core i7/16GB/512GB/Iris Pro/GeForce) ME294J/A

それを3色ずつのLED2組、つまり2画素で表すので、46万800分の1に劣化させています!

f:id:hollywis:20160116214445j:plain

        

        

使うもの

 

f:id:hollywis:20160116210500p:plain  

  1. Arduino
  2. USBケーブル
  3. 赤、黄、緑のLED
  4. ジャンパ線12本
  5. ブレッドボード
  6. 抵抗220オーム6つ  

 

つくりかた

かいろをつくる

   

こんな感じでつなげます。 f:id:hollywis:20160116211355j:plain      

この記事が参考にしているもともとのチュートリアルの通りにプログラムを組むと、 こんな風にいろんなパターンで光ります。 www.youtube.com      
 

コードはこちらです。 https://gist.github.com/uozias/9f9d4135042732a4494b

      

Macのぷろぐらむをつくる

こんな感じです。 youtu.be  
Macについてるカメラの映像を左右に分けて、それぞれ赤緑青のどの色が多いか判定します。        
 

RUbyのコードはこちらです。ruby-opencvというライブラリにお世話になりました。 send_image_date_to_serialport · GitHub  

 

Arduinoのコードもこれに合わせて修正します。

receve_num_from_serial_port · GitHub

詳細を知りたい方ブログコメント等でご連絡下さい。

 

 

うごかす

  こんな感じで光ってくれます。

f:id:hollywis:20160119145113j:plain  

動画です。

www.youtube.com

実は、Arduinoのシリアルポートを使ってもひからせられます。 1¥と送ると、左の青、5¥だと右の緑、とかいう感じです。

    

せんでん

作ってみたいな、と思った人は買ってください。

 
このキットと私がアップしたコードの組み合わせで作れます。      

おわり

おわりです。

次回もまたLEDの回です。 LEDを複数つなげて信号みたいに動かすというまたつまらない内容なので、なんとか考えてかきたいと思います。

今年もよろしくお願いします。

次回 8 章予定

総合もくじ

hollywis.hatenablog.com

Posted: January 16, 2016, 9:37 am

nodeもう少し進めてみます。

今回はhttpのgetリクエストにあるクエリを取得してみたいと思います。

クエリストリングというのは、次のようなURLにあるidarticleのことです。

http://hollywis.com?id=1&type=article

この例では次のデータが格納されています。

  • id:1

  • type:article

やってみる

var http = require('http');
var PORT = 8080;
var url = require('url')
var pages = [
        {id:'1' ,route:'',output:'HelloWorld!\n'},
        {id:'2' ,route:'foo',output:'fooのページです\n'},
        {id:'3' ,route:'var',output:'varのページです\n'},
        {id:'4' ,route:'another page',output: function(){ return 'これが'+this.route+'ページです\n'}}
    ];
http.createServer(function (request,response){
    var id = url.parse(decodeURI(request.url),true).query.id;
    if(id){
        pages.forEach(function(page){
            if(id === page.id){
                response.writeHead(200,{'Content-Type':'text/html'});
                response.end(typeof page.output === 'function' ? page.output() :page.output);
            }
        });
    }
    if(!response.finished){
        response.writeHead(404);
        response.end('ページが見つかりません!');
    }
}).listen(8080);

console.log('Server running at http://localhost'  + ':' + PORT + '/');

実行して以下にアクセスしてみます。 http://localhost:8080/?id=1

$ hotnode server.js

するとクエリストリングidが取れて別々のページにルーティングできるかと思います。

Posted: January 12, 2016, 11:39 am

こんにちは、のすけです。

f:id:hollywis:20160111224502p:plain

全然技術ネタじゃないんですけど。

最近Airbnbのホストをかなりやられている方にお会いして、Airbnbで結構面白い外国人が来るという話を聞きました。

なんでも、ある程度高額な部屋には日本にビジネスをしにくる外国人が多く宿泊することが多く。 なかなか面白い話が聞けるとのこと。

「例:僕はTEDで話すために日本に来たんだよ!」

それを聞いて、「俺も話ししたい!」と思ってしまいました。

しかし、、、僕は英語はできません。そしてAirbnbのホストもしていません。

まぁAirbnbのホストはお金とやる気で解決する話なので問題ないですが、英語力はそうはいきません。

そんなわけで、英語を勉強することにします。

DMM英会話とかやろうかと思っていましたが、もっと鍛えてからやらないと洗礼で挫折するとか言われているので、まずは英語の勉強から入ります。 確かに大学の時にはブラジル人と英会話してましたが、結局まともに喋れるようにならなかったので、いきなり英会話するより2ヶ月くらい座学した方が良いと考えました。

まずは、うちの本棚に眠ってた↓をやります。

英語を話す力が一気に身につく!! 瞬間英作文ドリル (AC MOOK)

英語を話す力が一気に身につく!! 瞬間英作文ドリル (AC MOOK)

これは、英語の文章を反射的に作る訓練をするもので、中学英語だけで話したいことが話せるようになるというやつです。

なんで眠らせてたかというと、ちょっとやってみて効果が出たのですが、他の事が忙しく放置しそのままになっていたためです。何度も本棚整理でいらない本を捨ててきましたが、この英語本だけはとってありました。

瞬間英作文と言います。あらためてネットで調べてみたら、とにかくこの本を10周やるだけでも違うらしいので10周を当面の目標にしましょう。

さて、英語がスラスラと言えるようになるのか。。。

ちなみに瞬間英作文だとこの本の方が売れているみたい。

どんどん話すための瞬間英作文トレーニング (CD BOOK)

どんどん話すための瞬間英作文トレーニング (CD BOOK)

でも、せっかく眠らせていたのでドリルの方で頑張ってみます。

Posted: January 11, 2016, 1:55 pm

こんにちは、のすけです。

JavaScriptでサーバサイドとか面倒そう!ということで今まで敬遠していたのですが 実は手軽に利用出来るようです。

面倒そうと考えた理由としては、JavaScriptはクライアントサイドが普通ですので、何でわざわざJavascriptでサーバサイドまで作らにゃいけないのさ!

もっとWebで使いやすい専用言語とかFrameworkとかあるじゃん!

と思っていたのですが、、、書籍をサラッと見た感じだと、どうやらシンプルなHTTP通信ならnodeいいんじゃね? という認識に変わりました。

f:id:hollywis:20151226225042p:plain

僕はサーバサイドは今までサーブレッット(Java)や.NetFramework(C#)、Rails(Ruby)を使ってきました。 最近はWebでのライブラリの豊富さからRailsばかり触っていましたが、ついにNodeを使ってみることにしました。

なお下記の書籍を購入してしまったので、これを参考に実装しながら学習していこうかと思います。

Nodeクックブック

Nodeクックブック

Nodeの特徴

NodeはどうやらWebサーバとアプリケーションサーバが分離していないようです。 また、Webサーバ機能はプログラミングで作ってしまうことができるため、極めて手軽にWebを始めることができるとのこと。

プログラミング言語JavaScriptです。 クライアントサイドのプログラミング言語として最近は使われまくっているので、言語の敷居は低いですね。

パッケージ管理システムとしてRailsでしたらbundlerがありますが、Nodeではnpmというものがあるようです。安心ですね。

また、個々のリクエストは非同期で処理されI/Oをブロックしません。そのため、多くの同時接続を処理することができます。 シングルスレッドであるため、リクエスト毎にプロセスを生成&メモリ割当をするということもないようです。

実はNodeを使おうとした理由としてチャットシステムを作ろうとしたというのがあります。 従来のサーバサイドプログラムと比較して、同時接続という部分では一番パフォーマンスが良いのではないかと勝手に期待しています。

環境

Macにあらかじめ入れていたNodeを利用していきます。いつ入れたんだろう?

$ node -v
v5.0.0
$ npm -v
3.3.9
$node -p process.versions.v8
4.6.85.28

nodeを起動

有名なFrameworkとしてexpress.jsというのがあるようですが、Nodeを基本から理解するためフレームワークなしでnodeに触れてみたいと思います。 どうやらNodeではかなりシンプルにWeb機能が実装できるようですので。

server.jsというファイルを作る

一般的にサーバ生成用のファイル名はserver.jsという名前にする慣例があるようです。

中身に次のように書きます。

var http = require('http');
var PORT = 8080;
http.createServer(function (request,response){
    response.writeHead(200,{'Content-Type':'text/html'});
    response.end('HelloWorld!\n')
}).listen(8080);

console.log('Server running at http://localhost'  + ':' + PORT + '/');

httpというモジュールをrequireして、createServerでサーバ起動しています。 これだけのようです。シンプルすぎる。。。

ヘッダーにHTTPヘッダーとして、ステータスコード200、Contet-Type text/htmlを設定します。 htmlのbodyとしてHelloWorldを入れています。

なおHTTPについての知識が曖昧な場合には、こちらの書籍がオススメです。 そもそも、HTTPやHTMLとは何なのかが分かりやすく記載されています。 僕も分かっていたつもりでしたが、知らないことも多く読んでかなり頭の中がスッキリしました。

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

hotnodeをインストール
$ npm -g install hotnode
hotnodeでnodeを起動

server.jsというファイルがある場所に移動して、下記でnodeを起動します。

$  hotnode server.js

なお、通常は次のように起動します。hotnodeの利点は、実行ファイルの変更を検知すると再起動して読み直してくれます。 そのため、hotnodeで起動した方が良いでしょう。

$  node server.js

この状態で localhost:8080にアクセスすると「HelloWorld!」と表示されました。

超シンプルだ。

URLルーティングの作成

このままだと localhost:8080/fooも localhost:8080/varも全て「HelloWorld!」になるため アクセスしてくるURLのパスを見て、適切な場所にルーティングし表示を変えてみます。

var http = require('http');
var PORT = 8080;
var path = require('path');  // 追加
http.createServer(function (request,response){
    var lookup = path.basename(decodeURI(request.url));  // 追加
        //・・・

pathモジュールをrequireしています。 request.urlからurlパスを取得しdecodeURIでデコードします。 basenameはパスの最後の部分を取り出します。

ルーティングを記載

ルーティングは配列pagesで定義してみます。 forEachでpages配列を参照して、lookpupとマッチする場合に該当のoutputを出力します。

//・・・
var pages = [
        {route:'',output:'HelloWorld!\n'},
        {route:'foo',output:'fooのページです\n'},
        {route:'var',output:'varのページです\n'},
        {route:'another page',output: function(){ return 'これが'+this.route+'ページです\n'}}
    ];
http.createServer(function (request,response){
    var lookup = path.basename(decodeURI(request.url));
    pages.forEach(function(page){
        if(page.route === lookup){
            response.writeHead(200,{'Content-Type':'text/html'});
            response.end(typeof page.output === 'function' ? page.output() :page.output);
        }
    });
    if(!response.finished){
        response.writeHead(404);
        response.end('ページが見つかりません!');
    }
}).listen(8080);
//・・

これで以下でそれぞれ違う出力が出ました。 なお、ブラウザのエンコードUTF-8にしないと文字化けます。

まとめ

nodeはかなりシンプルにwebサーバを作ることができました。 ルーティング機能すらプログラミングで作ってしまえるなど、自由度が高いのが素晴らしいです。

簡易的なHTTP通信が必要なIoT系の通信なんかはサラッと実装できそうですね。

毛嫌いしていましたが、なかなか有用な技術だと思いました。 とりあえず、nodeでチャット作成を目指して勉強していこうと思います。

Posted: December 26, 2015, 3:03 pm

こんばんは。

さいぞうです。

この記事は、Arduino入門連載の6回目。

前回は、LEDを使ってモールス信号練習機を作った。

本来のチュートリアルからはかなり脱線してきたが、まあ面白かった。 hollywis.hatenablog.com

今回も脱線して、クリスマスなので、Soundcloudからクリスマスソングを取得し再生してそれに合わせてLEDをチカらせてみようと思う。

要はArduinoで簡単なオーディオビジュアライザを作る。

 
 

PWMでLEDの明るさを調整できる

一応、このセインスマートのチュートリアルに沿った連載として始めたのでやっておく。 http://www.sainsmart.com/starter-kits/uno-r3-smartkits/sainsmart-uno-r3-5v-servo-motor-starter-kit-with-basic-arduino-projects.html

今回やる4章のテーマは「PWM」。Pulse Width Modulationの略だ。

詳細はもうWikipediaでも見てください。 パルス幅変調 - Wikipedia

PWMで何ができるのかというと、LEDの例だと、これまで光らせるか光らせないかの2段階にしか制御できなかったのが、多段階でコントロールできるようになる!!  
 

こんな感じの回路を作って... f:id:hollywis:20151224164805p:plain

こんな感じのコードを書いて.... gist.github.com

実行すればこうなる! www.youtube.com

かんたん!

 
 

音に合わせてひからせる

これではすぐ終わってつまらないので、クリスマスソングにあわせて光らせてみよう。 音の出どころはSoundcloudにして、Ruby経由でArduinoに情報を送って光らせるという連携をしてみる。

 

Soundcloudの音楽を再生し、出力を数字にする

Soundcloudってのは音楽共有サイト。いろんな音楽を作った人が曲をアップしてて、皆が聞ける。

soundcloud.com

それだけじゃなく、APIが用意されていて、音楽を他のサイトに埋め込んだり、いろいろできる。

SoundCloud Developers

まず、ブラウザ上でSoundcloudの音楽を再生して、その音楽のパワーバーみたいのを出してみよう。 こちらのサイトに詳しいやり方があったので、これを丸パクリして、つくってみた。

電脳ゴリラ: Audio visualization using Processing.js

以下がHTMLにjavascriptのコードも入れたもの。

<h1>クリスマスソング!</h1>

power:<span id="show_power"></span>
<br />
<audio id="audio" controls autobuffer></audio>
<br />
<canvas id="canvas" ></canvas>

<script src="https://connect.soundcloud.com/sdk.js"></script>

<input type="hidden" id="sc_client_id" value="<%= VALUES['sound_cloud']['client_id'] %>" />


<script>
  var CLIENT_ID = document.getElementById('sc_client_id').value;
  var TRACK_URL = 'https://soundcloud.com/officialmichaelbuble/michael-bubl-its-beginning-to'; // 好きな曲のURL
  SC.initialize({
    client_id: CLIENT_ID
  });
  SC.get('/resolve', {url: TRACK_URL}, function(sound){
    if(sound.errors){
      // エラー処理
      for(var i = 0; i < sound.errors.length; i++){
        console.log(sound.errors[i].error_message);
      }
      return;
    }


    // SoundcloudのストリームURLを取得
    var audio = document.getElementById('audio');
    audio.crossOrigin = "anonymous";

    var streamUrl = sound.stream_url + '?client_id=' + CLIENT_ID;
    audio.setAttribute('src', streamUrl);


    // アナライザーを作る
    var audioCtx = new (window.AudioContext || window.webkitAudioContext);
    var analyser = audioCtx.createAnalyser();
    analyser.fftSize = 256;
    var source = audioCtx.createMediaElementSource(audio);
    source.connect(analyser);
    analyser.connect(audioCtx.destination);


    var showPowerElement = document.getElementById('show_power');


    var bytes = new Uint8Array(analyser.frequencyBinCount);
    var UNIT_COUNT = 80;

    var averagePower = 0;

    var draw = function(){
      analyser.getByteFrequencyData(bytes);
      averagePower = 0;

      for(var i = 0; i < UNIT_COUNT; i++){
        averagePower += bytes[i]
      }

      averagePower = averagePower/UNIT_COUNT;
      if(averagePower >= 255){
        averagePower = 254;
      }

      // 平均パワーを見せる
      showPowerElement.innerText = String(averagePower);
    };

    setInterval(draw, 500); // 繰り返し実行
  });
</script>

後でRubyを使う関係上、Railsでつくっているが、単にこの内容のHTMLファイルを作ってブラウザで読み込ませるだけでもうごくのではないか。  
 

注意点としては"var CLIENT_ID = document.getElementById('sc_client_id').value;"ってとこの=以降を自分のクライアントIDに入れ替えること。

クライアントIDが以下のURLからアプリ登録をすればもらえる。 http://soundcloud.com/you/apps/new f:id:hollywis:20151224170815p:plain

Ruby経由でArduinoに情報を送る

もうここの通りです。

Rubyでserialportを操作してArduinoを動かす - Laboratory of Scarlet

ただし、シリアルポートは私のmacの場合 /dev/cu.usbmodem1411 になった。

上記を参考に、WebブラウザからArduinoに数字を送るRailsアプリを作る。 RailsというのはRuby on RailsというRuby言語でできたフレームワークで、簡単に動的なWebサイトを作れる。 Rails自体のチュートリアルは下のサイトでも見てくれ。

Ruby on Rails チュートリアル:実例を使って Rails を学ぼう

 
Railsなので、SoundControllerというコントローラをつくり、serial_sendアクションに上のサイトのを参考にしたコードを書く。

class SoundController < ApplicationController
  def index

  end

  def serial_send
    @serial_port = "/dev/cu.usbmodem1411" #シリアルのポートを指定
    @serial_bps = 9600

    sp = SerialPort.new(@serial_port,@serial_bps)

    num = params["num"].to_i # 送る数字

    sp.write(num.to_s + '/') #serialへの書き込み "/"を数字の終了コードにした
    puts num.to_s

    render text: num
  end
end

 
ルーティングのroutes.rbにも以下のように設定

 get 'sound/serial_send/:num' => 'sound#serial_send'

 
これで、Webブラウザで例えば、

http://localhost:3000/sound/serial_send/50

というURLをいれると、50という数字がArduinoに送られる。  
 

ArudinoでRuby数字を受け取る

Rubyからというか、シリアルポートからデータを受け取るため、Arduinoのコードを以下のようにする。

gist.github.com

注意点としては、この辺を見て欲しいが、受け取った生データはasciiになっているってこと。

qiita.com

1バイトずつ受け取ったデータから48を引いて数字にして保存するとともに、前に受け取ったデータを10倍して前の桁のデータと解釈してる。

final_value=(final_value*10)+(received-48);

送るデータの最後には"/"をつけることにして、"/"がきたらその数字をLEDの明るさにしている。

ここまでのコードを合体!! 音楽に合わせてLEDを光らせる。

SoundcloudJavascriptRuby→シリアル通信→Arduinoって感じの情報の流れでさいごにLEDを光らせる

クリスマスソング!

URL here
<input type="text" id="sound_cloud_url" onChange="start_music()" />
<br />
power:<span id="show_power"></span>
<br />
<audio id="audio" controls autobuffer autoplay></audio>
<br />
<canvas id="canvas" ></canvas>

<script src="https://connect.soundcloud.com/sdk.js"></script>

<input type="hidden" id="sc_client_id" value="<%= VALUES['sound_cloud']['client_id'] %>" />




<script>
  function start_music(){
    var CLIENT_ID = document.getElementById('sc_client_id').value;
    var TRACK_URL = document.getElementById('sound_cloud_url').value;
    SC.initialize({
      client_id: CLIENT_ID
    });
    SC.get('/resolve', {url: TRACK_URL}, function(sound){
      if(sound.errors){
        // エラー処理
        for(var i = 0; i < sound.errors.length; i++){
          console.log(sound.errors[i].error_message);
        }
        return;
      }


      // SoundcloudのストリームURLを取得
      var audio = document.getElementById('audio');
      audio.crossOrigin = "anonymous";

      var streamUrl = sound.stream_url + '?client_id=' + CLIENT_ID;
      audio.setAttribute('src', streamUrl);


      // アナライザーを作る
      var audioCtx = new (window.AudioContext || window.webkitAudioContext);
      var analyser = audioCtx.createAnalyser();
      analyser.fftSize = 256;
      var source = audioCtx.createMediaElementSource(audio);
      source.connect(analyser);
      analyser.connect(audioCtx.destination);


      var showPowerElement = document.getElementById('show_power');


      var bytes = new Uint8Array(analyser.frequencyBinCount);
      var UNIT_COUNT = 80;

      var averagePower = 0;
      var previousPower = 0;
      var sendValue = 0;

      var draw = function(){
        analyser.getByteFrequencyData(bytes);
        previousPower = averagePower;
        averagePower = 0;

        for(var i = 0; i < UNIT_COUNT; i++){
          averagePower += bytes[i]
        }

        averagePower = averagePower/UNIT_COUNT;
        if(averagePower >= 255){
          averagePower = 254;
        }

        // 平均パワーを見せる
        showPowerElement.innerText = String(averagePower);

        sendValue = averagePower;
        if (Math.abs(previousPower-averagePower) < 10){ // 普通にやると変化がなさすぎてつまらないので、状態を持たせて変化を10倍する
          sendValue = averagePower + (previousPower-averagePower)*10
        }

        // ajaxでデータをサーバ側に送る
        $.ajax(
            '/sound/serial_send/'+sendValue
        )
      };

      setInterval(draw, 100); // 繰り返し実行
    });
  }

</script>

 
下記のコードで、Railsのサーバ側に音楽の出力の数字を送っている。

        // ajaxでデータをサーバ側に送る
        $.ajax(
            '/sound/serial_send/'+sendValue
        )

 
こんな風にうごく。

あとは、URLの入力欄を作り、そこにSoundcloudのページのURLを入力すると再生開始とともにLEDが光るというようにした。

youtu.be

今日はここまで。  

せんでん

忘れてたが、この記事の内容はこのキットだけを使ってやってます。

 
Arduinoとか抵抗とか全部入ってるからめんどくさい人はこれをかおう。

次回はこちら

第6章(予定)

総合もくじ

hollywis.hatenablog.com

Posted: December 24, 2015, 9:32 am

こんにちは、のすけです。

IoTの通信として最適なSIMであるSORACOM Air と契約しました。

手順などをご紹介。

SORACOM Air とは

f:id:hollywis:20151216153112p:plain

小容量通信の常時接続に最適な契約ができるのがSORACOM Airです。

通常のサービスが100Mbpsで月額1GBの通信っで1000円のような感じですが

SORACOM Airは, 基本料金は1日 10 円、データ通信量は 1MB あたり 0.2 円からの従量課金になります。

つまり月額(31日計算)310円から利用できるものになります。

従量課金の価格表はこちら

f:id:hollywis:20151216153024p:plain

IoTなら安い・・・と思う。

もうお判りかもしれませんが、スマホなどに刺して普通に使うなら遅いし高いです。

しかし、IoTなら状況は違ってきます。

IoTで利用する通信は、文字データが中心ですので転送サイズは多くても数キロバイトと、たかが知れています。 そのため、低速で少容量でも十分実用的だと考えられます。

コンソールから設定を変えられる!

なんと、SORACOM Airはコンソールから通信設定を変えることができます。

利用が多い時は即座に上のプランに移行できるというのです。

たぶん便利なのでしょう。まだ使ってないのでわかりませんが。

まずはアカウントを作成

f:id:hollywis:20151216153844p:plain

メールアドレスとパスワードを入れます。

メールでアクティベイト用URLがきますのでクリックすると作成完了です。

SIMを登録する

ログインすると、SIMを登録してほしいと言われます。

クリックするとクレジットカードも登録してください。と言われるので登録します。

f:id:hollywis:20151216154108p:plain

SIMはあらかじめAmazonで購入しておきました。888円です。

なお、コンソールから買うこともできますが10枚単位です。(1枚300円)

SORACOM Air SIMカード(データ通信のみ) (ナノ)

SORACOM Air SIMカード(データ通信のみ) (ナノ)

SIM登録にはIMSIとパスコードを登録するようです。

SIM の台紙の裏面に貼ってあるので、それを入力して登録します。名前、グループは空欄のままでもOKです。

f:id:hollywis:20151216154625p:plain

登録後、速度クラスを変更します。初期状態では「s1.standard」になっています。 速度、などは次の通り。

s1.minimum : Upload 32Kbps / Download 32Kbps

最後に、「操作」メニューから「使用開始」を選べばOKです。 f:id:hollywis:20151217163019p:plain

開始されると1日10円の基本料が課金されるようになるはずです。

監視設定

コンソールの監視メニューから、通信量を監視することができます。

ある一定数を超えたら、メールしたり制限したりすることができるようです。

便利ですね。

f:id:hollywis:20151217163333p:plain

私は試しに日次通信料の監視設定を入れました。

課金情報

課金情報は課金メニューで一発でわかります。

CSVをダウンロードすればSIM毎の詳細な通信量と金額も把握できるようです。

f:id:hollywis:20151217163830p:plain

以上で利用設定は完了です。

Posted: December 17, 2015, 7:44 am

こんにちは、のすけです。

中華で始める Arduino入門日記の15回目になります。

この連載は、爆安の中華製のArduino互換機を入手し、色々と苦しみながらも安い互換機でArduinoを学習してしまおうというものです。 入手の話はこちらから。

hollywis.hatenablog.com

今回のお題

今回は、7セグメントLEDを4つ付けたやつを利用してみたいと思います。

チュートリアルのchapter13に対応しています。

早速始めましょう。

7セグx4

こやつです。数字部分が4つに増えました。

f:id:hollywis:20151211165528j:plain

裏にピンが12個あります。 数字部分が4つなので、7セグの10ピン*4で40ピンとかでは無いようです。安心しました。

1個との違い

中華キットに入っていたのが5461ASでしたので、データシートを探してみました。

データシート(5461AS)より f:id:hollywis:20151211163345p:plain

1個の数字の入力は基本的に同じようです。

ただしDIG1~4まであるので、あとはその表示をDIG1~4のどこを対象にするのかを指定するだけです。

つまり、DIGを指定する入力端子が4つ増痩せば良いということですね。

PINが全部で12あり、左下から反時計回りにPIN1~12となるようです。

pin12,9,8,6はDIG指定用で、11,7,4,2,1,10,5,3はLEDのa~gの表示に対応している模様

f:id:hollywis:20151211155027j:plain

まずは、a~g部分(11,7,4,2,1,10,5,3ピン)を指す

前回とほぼ一緒なので、いきなり刺します。

こんな感じでしょうか。

f:id:hollywis:20151211165726j:plain

プログラム的にはこんな感じになります。

int a=1;  //LED 11pin
int b=2; //LED 7pin
int c=3; //LED 4pin
int d=4; //LED 2pin
int e=5; //LED 1pin
int f=6;  //LED 10pin
int g=7;  //LED 5pin
int dp=8;  //LED3pin

残りはpin12,9,8,6ですな。

それぞれArduinoのデジタルpin9~12に刺します。

//DIG選択用
int d1 = 12; //LED12pin
int d2 = 11; //LED 9pin
int d3 = 10; //LED 8pin
int d4 = 9; //LED 6pin

プログラム

サンプルを参考にしつつアレンジしました。

まずは表示確認ということで、1,2,3,4を出してみます。

// 7セグメントLED x4の制御

int a=1;  //LED 11pin
int b=2; //LED 7pin
int c=3; //LED 4pin
int d=4; //LED 2pin
int e=5; //LED 1pin
int f=6;  //LED 10pin
int g=7;  //LED 5pin
int dp=8;  //LED3pin

//DIG選択用
int d1 = 12; //LED12pin
int d2 = 11; //LED 9pin
int d3 = 10; //LED 8pin
int d4 = 9; //LED 6pin

// すべて消す
void all_low(void)
{
  unsigned char j;
  for(j=1;j<=8;j++)
        digitalWrite(j,LOW);
}

//display number 1
void digital_1(void) 
{ 
    all_low();
    digitalWrite(c,HIGH);
    digitalWrite(b,HIGH);
} 
//display number2
void digital_2(void) 
{ 
    all_low();
    digitalWrite(a,HIGH); 
    digitalWrite(b,HIGH); 
    digitalWrite(g,HIGH); 
    digitalWrite(e,HIGH); 
    digitalWrite(d,HIGH);
} 
// display number3
void digital_3(void) 
{ 
    all_low();
    digitalWrite(a,HIGH); 
    digitalWrite(b,HIGH); 
    digitalWrite(g,HIGH); 
    digitalWrite(c,HIGH); 
    digitalWrite(d,HIGH); 
} 
// display number4
void digital_4(void) 
{ 
    all_low();
    digitalWrite(f,HIGH); 
    digitalWrite(g,HIGH); 
    digitalWrite(b,HIGH); 
    digitalWrite(c,HIGH);     
} 
// display number5
void digital_5(void) 
{ 
    all_low();
    digitalWrite(a,HIGH);
    digitalWrite(f,HIGH); 
    digitalWrite(g,HIGH); 
    digitalWrite(c,HIGH); 
    digitalWrite(d,HIGH); 
} 
// display number6
void digital_6(void) 
{ 
    all_low();
    digitalWrite(a,HIGH); 
    digitalWrite(f,HIGH); 
    digitalWrite(g,HIGH); 
    digitalWrite(c,HIGH); 
    digitalWrite(d,HIGH); 
    digitalWrite(e,HIGH);     
} 
// display number7
void digital_7(void) 
{   
    all_low();
    digitalWrite(a,HIGH); 
    digitalWrite(b,HIGH); 
    digitalWrite(c,HIGH); 
} 
// display number8
void digital_8(void) 
{ 
    all_low();
    digitalWrite(a,HIGH); 
    digitalWrite(f,HIGH); 
    digitalWrite(g,HIGH); 
    digitalWrite(c,HIGH); 
    digitalWrite(d,HIGH); 
    digitalWrite(e,HIGH); 
    digitalWrite(b,HIGH); 
} 
// display number9
void digital_9(void) 
{ 
    all_low();
    digitalWrite(a,HIGH); 
    digitalWrite(f,HIGH); 
    digitalWrite(g,HIGH); 
    digitalWrite(b,HIGH);
    digitalWrite(c,HIGH);
    digitalWrite(d,HIGH); 
} 
// display number0
void digital_0(void) 
{ 
    all_low();
    digitalWrite(a,HIGH); 
    digitalWrite(f,HIGH); 
    digitalWrite(e,HIGH); 
    digitalWrite(d,HIGH); 
    digitalWrite(c,HIGH); 
    digitalWrite(b,HIGH); 
}
// display point
void dispDec(void)
{
    digitalWrite(dp, LOW); 
}

void pickDigit(int x) {
  //DIGの選択
  digitalWrite(d1, HIGH);
  digitalWrite(d2, HIGH);
  digitalWrite(d3, HIGH);
  digitalWrite(d4, HIGH);
  delayMicroseconds(55);
  switch(x) 
  {
    case 1: 
      digitalWrite(d1, LOW); break;
    case 2: 
      digitalWrite(d2, LOW); break;
    case 3: 
      digitalWrite(d3, LOW); break;
    case 4: 
      digitalWrite(d4, LOW); break;
    default:
      digitalWrite(d4, LOW); break;
  }
}

void pickNumber(int x) {
  switch(x) 
  {
    case 1: 
      digital_1(); //1
      break;
    case 2:
      digital_2(); 
      break;
    case 3: 
      digital_3(); 
      break;
    case 4: 
      digital_4(); 
      break;
    case 5: 
      digital_5(); 
      break;
    case 6: 
      digital_6();
      break; 
    case 7: 
      digital_7();
      break; 
    case 8: 
      digital_8(); 
      break;
    case 9: 
      digital_9(); 
      break;
    case 0:
      digital_0(); 
      break;
    default:
      digital_0();  
  }    
}

long n=0;
int x = 100;
int del =155; //delay time

void setup() 
{ 
    int i;//define i
    for(i=1;i<=12;i++) 
        pinMode(i,OUTPUT);//set pin1~pin12 output
} 
void loop() 
{     
    pickDigit(1);
    pickNumber(1);
    delayMicroseconds(del);
    
    pickDigit(2);
    pickNumber(2); 
    delayMicroseconds(del);

    pickDigit(3);
    dispDec();
    pickNumber(3);
    delayMicroseconds(del);

    pickDigit(4);
    pickNumber(4); 
    delayMicroseconds(del);
    n++;
}

1234の結果

やはり一筋縄ではいかない。

どうやらひとつ前の残像が残ってしまい、1,2,3,4が重なっているようです。

f:id:hollywis:20151211174145j:plain

いろいろと試行錯誤をした結果

数字の選択の前に、all_low()を入れて数値のリセットを入れると良いことが判明

そうすると綺麗に表示されました。

void loop() 
{   
    all_low();
    pickDigit(1);
    pickNumber(1);
    delayMicroseconds(del);
    
    all_low();
    pickDigit(2);
    pickNumber(2); 
    delayMicroseconds(del);

    all_low();
    pickDigit(3);
    dispDec();
    pickNumber(3);
    delayMicroseconds(del);

    all_low();
    pickDigit(4);
    pickNumber(4); 
    delayMicroseconds(del);    
}

f:id:hollywis:20151211180916j:plain

7セグメントLEDはdelayの差し込み具合とかがシビアで、ちょっと使いにくいです。

次回は「74HC595」を使います。

Posted: December 13, 2015, 9:30 am

こんにちは、のすけです。

中華で始める Arduino入門日記の14回目になります。

この連載は、爆安の中華製のArduino互換機を入手し、色々と苦しみながらも安い互換機でArduinoを学習してしまおうというものです。 入手の話はこちらから。

hollywis.hatenablog.com

今回のお題

前回は温度センサーを使いました。

hollywis.hatenablog.com

今回は、7セグメントLEDを利用してみたいと思います。

チュートリアルのchapter12に対応しています。

早速始めましょう。

7セグメントLED

こいつです。

f:id:hollywis:20151211152522j:plain

みてわかる通り数字を表示することができそうです。

f:id:hollywis:20151211155027j:plain

サクッと表示させちゃいましょう。

回路

7か所すべての足とデジタルピンをつないで、HIGH,LOWを切り替えればいける感じっぽい。

電圧は下の真ん中の端子にGNDを220Ωの抵抗付きで接続します。

絵では3.3Vにつないでいるように見えますが、実際にはGNDに繋ぎましょう。

f:id:hollywis:20151211152428p:plain by SainSmartチュートリアル

コードがヒドいことになってます。

f:id:hollywis:20151211153413j:plain

プログラム

例によってサンプルプログラムを使うと、まともに数字にならないので自作します。

わかりやすくA~GとDPを表示する変数を作って、それを利用する数字関数を作ります。

数時関数の中では、一度LEDの表示をすべてリセットするall_lowを呼び出すシンプルな構造にしました。

loop内では数字を呼び出します。サンプルにはない9と0も追加してあります。

int a=7; 
int b=6; 
int c=5; 
int d=11; 
int e=10; 
int f=8; 
int g=9; 
int dp=4; 

// すべて消す
void all_low(void)
{
  unsigned char j;
  for(j=4;j<=11;j++)
        digitalWrite(j,LOW); 
}

//display number 1
void digital_1(void) 
{ 
    all_low();
    digitalWrite(c,HIGH);
    digitalWrite(b,HIGH);
} 
//display number2
void digital_2(void) 
{ 
    all_low();
    digitalWrite(a,HIGH); 
    digitalWrite(b,HIGH); 
    digitalWrite(g,HIGH); 
    digitalWrite(e,HIGH); 
    digitalWrite(d,HIGH);
} 
// display number3
void digital_3(void) 
{ 
    all_low();
    digitalWrite(a,HIGH); 
    digitalWrite(b,HIGH); 
    digitalWrite(g,HIGH); 
    digitalWrite(c,HIGH); 
    digitalWrite(d,HIGH); 
} 
// display number4
void digital_4(void) 
{ 
    all_low();
    digitalWrite(f,HIGH); 
    digitalWrite(g,HIGH); 
    digitalWrite(b,HIGH); 
    digitalWrite(c,HIGH);     
} 
// display number5
void digital_5(void) 
{ 
    all_low();
    digitalWrite(a,HIGH);
    digitalWrite(f,HIGH); 
    digitalWrite(g,HIGH); 
    digitalWrite(c,HIGH); 
    digitalWrite(d,HIGH); 
} 
// display number6
void digital_6(void) 
{ 
    all_low();
    digitalWrite(a,HIGH); 
    digitalWrite(f,HIGH); 
    digitalWrite(g,HIGH); 
    digitalWrite(c,HIGH); 
    digitalWrite(d,HIGH); 
    digitalWrite(e,HIGH);     
} 
// display number7
void digital_7(void) 
{   
    all_low();
    digitalWrite(a,HIGH); 
    digitalWrite(b,HIGH); 
    digitalWrite(c,HIGH); 
} 
// display number8
void digital_8(void) 
{ 
    all_low();
    digitalWrite(a,HIGH); 
    digitalWrite(f,HIGH); 
    digitalWrite(g,HIGH); 
    digitalWrite(c,HIGH); 
    digitalWrite(d,HIGH); 
    digitalWrite(e,HIGH); 
    digitalWrite(b,HIGH); 
} 
// display number9
void digital_9(void) 
{ 
    all_low();
    digitalWrite(a,HIGH); 
    digitalWrite(f,HIGH); 
    digitalWrite(g,HIGH); 
    digitalWrite(b,HIGH);
    digitalWrite(c,HIGH);
    digitalWrite(d,HIGH); 
} 
// display number0
void digital_0(void) 
{ 
    all_low();
    digitalWrite(a,HIGH); 
    digitalWrite(f,HIGH); 
    digitalWrite(e,HIGH); 
    digitalWrite(d,HIGH); 
    digitalWrite(c,HIGH); 
    digitalWrite(b,HIGH); 
} 
void setup() 
{ 
    int i;//define i
    for(i=4;i<=11;i++) 
        pinMode(i,OUTPUT);//set pin4~pin11 output
} 
void loop() 
{     
    while(1) 
    { 
        digital_1(); //1
        delay(1000);
        digital_2(); 
        delay(1000); 
        digital_3(); 
        delay(1000); 
        digital_4(); 
        delay(1000); 
        digital_5(); 
        delay(1000); 
        digital_6(); 
        delay(1000); 
        digital_7(); 
        delay(1000); 
        digital_8(); 
        delay(1000);
        digital_9(); 
        delay(1000); 
        digital_0(); 
        delay(1000);     
    }
}

表示してみる

結果はこちら

なかなか綺麗に出ますね。

次は4桁の7セグメントLEDに接続します。

Posted: December 12, 2015, 8:00 am

f:id:hollywis:20151211180054j:plain

こんばんは。

さいぞうです。

Arduino入門連載の5回目だ。 前回はArduinoでLEDを点滅させるという初歩の初歩でふざけてLチカモンスターを作って楽しかった。  
hollywis.hatenablog.com

今回やることは、実は前回とほとんどからない。 参考にしているチュートリアルのタイトルは、

  前回はChapter 2 Blink LED

  今回はChapter3 LED Blink

何が違うのか全然わからない。  
 
なので、チュートリアルは無視して、今ある知識だけで作れる応用として、さっき思いついたモールス信号練習機を作ろうと思う。

 

回路を組む

抵抗をかませる

ここは前回と全く同じでも構わないのでなのでそちらを見てほしい。

一応、チュートリアルでは前回と違い220オームの抵抗を噛ませている。

使ってるセットを探してみると、220オームのはなかった...

しかもパッケージには220オームがあるって書いてあるけど手書きのメモで200オームとあるのが入ってたり、よくわからない。

カラーコードみても200に見えないんだが... カラー抵抗早見表!

f:id:hollywis:20151211175728j:plain とりあえず気にしないことにしてこれを使う

 
f:id:hollywis:20151211180054j:plain これが組んだ回路。

前回のやつに抵抗を噛ませただけ。

比較

前回の構成(左)と、今回の構成(右)で動画をとって比較してみた。

やはり抵抗をかませるとちょっと暗くなっている事がわかる。

プログラムを確認する

現段階では、プログラムは前回のまま。光らせて、1秒まって、光らせるのやめて、1秒まって、を永遠に繰り返している。

int ledPin = 13; // 出力するピンを13番に指定
void setup()
{
  pinMode(ledPin, OUTPUT);//うえで選んだピンを出力モードに指定
}
void loop()
{
  digitalWrite(ledPin, HIGH); //LEDを光らせる
  delay(1000); // 1秒待つ    
  digitalWrite(ledPin, LOW); //LEDを光らせるのをやめる
  delay(1000); // 1秒待つ   
}

すぐわかると思うが、 上記のloop()内をちょっと変えて、delay(1000)のところの1000を別な数字に変えれば、 光ったりやめたりのタイミングが変わる。 また、光らせるのとやめるのを1回ずつしか書いてないが、別に何回書いても良い。

これを応用すれば、モールス信号を示させるのは簡単だ。

モールス信号

モールス信号では短い音と長い音の組み合わせで文字を表す。

長点1つは短点3つ分の長さに相当し、各点の間は短点1つ分の間隔をあける。また、文字間隔は短点3つ分、語間隔は短点7つ分あけて区別する。

らしい。

モールス符号 - Wikipedia

実際の符号は

モールス符号一覧表

「イ」が・(短い) - (長い)、

「レ」が- (長い)- (長い)- (長い)

という感じだ。

ホントは音でやるもんなんだろうが、これをLEDのチカチカでやってみよう。

長いのと短いの

まず、これを表現した、「イ」=・-を表示する短いプログラムをつくる。

長点1つは短点3つ分の長さに相当し、各点の間は短点1つ分の間隔をあける。また、文字間隔は短点3つ分、語間隔は短点7つ分あけて区別する。

int ledPin = 13; //13番をアウトプットに指定
void setup()
{
  pinMode(ledPin, OUTPUT);//13番をアウトプットに指定
}
void loop()
{
  digitalWrite(ledPin, HIGH); // 光らせる
  delay(1000); // ・1つは、1秒にする

  digitalWrite(ledPin, LOW); //光らせるのやめる
  delay(1000); // 各点の間は・ひとつ分なので、1秒まつ

  digitalWrite(ledPin, HIGH); // 光らせる
  delay(3000); // ーは・の3つ分なので、3秒まつ

  digitalWrite(ledPin, LOW); //光らせるのやめる
  delay(3000); // 文字の間は・の3つ分あけるので、3秒末
}

これでずっと「イ」を光らせる。

 

  できた

好きな文字を出す。

次に、好きな文字のモールス信号が表示できるようにする。

先ほどのページの表を利用させてもらって、AとかZとか文字を指定するとそれをずっと光らせるというプログラムにした。 日本語はなんか動かなかったのでアルファベットのみ。

 
String mojiには、表示できる文字をいれてある。

String tonTuには、mojiに対応する順番で、ある文字を表す符号をいれてある。

符号はsが短点、lが長点を表す。

gist.github.com (GISTに公開した)  

 

実行結果はこんな感じ。 「B」のツートントントンがわかるだろうか。

 

シリアルモニタにも、長い、短いのパターンを出すようになっている。

 

入力に合わせた信号を出す

次に、キーボードからの入力を受け付けて、押したキーのモールス信号を出すようにしてみる。

本当はこの連載のもっと先でやるはずなのだろうが、フライングして出すと、Serial.available()とSerial.read()という2つの関数でキーボードからの入力を受け取れる。

gist.github.com

先ほどのコードをちょっと修正したこのプログラムで、キーボードに英字(大文字)を入力するとそれに対応するモールス信号がでる。  

 

LEDのモールス信号を当てる!

更に改造して、LEDで表示されたモールス信号をあてるクイズゲームみたいにしてみる。  
ランダムなモールス信号を出し、それとキーボード入力が合っていたら、素早くチカチカ、まちがってたらもう一度同じ信号を出す。  

gist.github.com


Arduinoでモールス信号あてゲーム

モールス信号の勉強に使ってください。

今日はここまで。  
 
 


次回はこちら

第4章 hollywis.hatenablog.com

総合もくじ

hollywis.hatenablog.com

Posted: December 11, 2015, 12:11 pm

こんにちは、のすけです。

中華で始める Arduino入門日記の13回目になります。

この連載は、爆安の中華製のArduino互換機を入手し、色々と苦しみながらも安い互換機でArduinoを学習してしまおうというものです。 入手の話はこちらから。

hollywis.hatenablog.com

今回のお題

前回は光センサーで明るさを検知してみました。

hollywis.hatenablog.com

今回は、温度センサーを利用して部屋の温度を測ってみたいと思います。

チュートリアルのchapter10に対応しています。

早速始めましょう。

温度センサーを知る

LM35DZという温度センサーが入っていました。

データシートによると次のような特徴があるようです。

  • 摂氏 ( ℃ ) 温度に直接較正されている

  • 温度係数はリニアで+ 10.0mV/℃

  • + 25℃において 0.5℃の精度を保証

  • - 55℃~+ 150 ℃の温度範囲

  • リモート・アプリケーションに最適

  • ウェハ・レベル・トリミングによる低コスト化

  • 4 ~ 30V の動作電源電圧範囲

  • 60 μA 以下の電流ドレイン

  • 低自己発熱、静止空気で 0.08℃

  • ± 1/4℃以下の非直線性 ( 代表値 )

  • 低出力インピーダンス、1mA 負荷で0.1 Ω

と、実はそれなりに良さげなセンサーのようです。

中華キット侮れん。。。

f:id:hollywis:20151211000635p:plain

VoutをアナログA0ピンへ、1℃上昇する毎に10mVの出力が上昇するようです。

回路

温度センサーに直接つないじゃいます。

  • 緑が[5V]と[+Vs] を接続

  • 黄が[A0]と[Vout]を接続

  • 青が[GND]と[GND]を接続

f:id:hollywis:20151211133704j:plain

プログラム

サンプルプログラムを実行してみます。

void loop() {
  int val;
  int dat;
  val = analogRead(potPin);
  dat = (125*val)>>8 ; // Temperature calculation formula
  Serial.print("Tep : ") ; //print “Tep” means temperature 
  Serial.print(dat) ; // print the value of dat 
  Serial.println("C"); //print “C” means degree
  delay(500);//delay 0.5
}

なにやら、読み取った値に125を掛けて、8ビット右シフトしているようです。

つまり,28である1024で割っているようですね。

でも実行した結果、温度が-75℃とかになりました。

そんわけないし。

なんか検索すると各所でうまく温度取れない!みたいな話がいっぱい引っかかってきます。

様々な温度の計算方法があったので全部適用してみた。

そのプログラムがこちら。

int apin = 0; //アナログpin0を利用
float v = 5; // 基準電圧

void setup()
{
    Serial.begin(9600);        // シリアル通信設定
}

void loop() 
{
  int val;
  float aV; // アナログpinの電圧
  int dat;
  val = analogRead(apin);
  Serial.print("Anagor read:");
  Serial.println(val);

  // 方式1(samaple)
  dat = (125*val)>>8;
  Serial.print("Tep1 : ") ; //print “Tep” means temperature 
  Serial.print(dat) ; // print the value of dat 
  Serial.println("C"); //print “C” means degree
  
  // 方式2
  aV = (v * val) / 1024;
  Serial.print("Anarog Voltage:");
  Serial.println(aV);
  dat = aV * 100;
  Serial.print("Tep2 : ") ; //print “Tep” means temperature 
  Serial.print(dat) ; // print the value of dat 
  Serial.println("C"); //print “C” means degree

  // 方式3
  dat = val/27.3;
  Serial.print("Tep3 : ") ; //print “Tep” means temperature 
  Serial.print(dat) ; // print the value of dat 
  Serial.println("C"); //print “C” means degree

  // 方式4
  dat = ((v * val/5) / 1024) * 100;
  Serial.print("Tep4 : ") ;
  Serial.print(dat);
  Serial.println("C"); //print “C” means degree

  Serial.println("");
  delay(2000);
}

方式1のサンプルは125というマジックナンバーがありますし、方式3にも27.3というマジックナンバーがあります。

正直よくわかりません。

方式2と4は、アナログピンへの電圧を求めて、1℃あたり10mVであることから、100倍して温度を計算しています。 式を1つにまとめるか、分けたかの違いだけです。

その結果がこちら。

Analog read:328
Tep1 : -96C
Anarog Voltage:1.60
Tep2 : 160C
Tep3 : 12C
Tep4 : 160C

Analog read:389
Tep1 : -67C
Anarog Voltage:1.90
Tep2 : 189C
Tep3 : 14C
Tep4 : 189C

Analog read:448
Tep1 : -38C
Anarog Voltage:2.19
Tep2 : 218C
Tep3 : 16C
Tep4 : 218C

Analog read:753
Tep1 : 111C
Anarog Voltage:3.68
Tep2 : 367C
Tep3 : 27C
Tep4 : 367C

見てわかる通りかなり違います。 方式3のTep3が一番まともだし、合っているよう見えます。 しかし、27.5を掛けるのはやはり意味がわかりません。

ロジック的には方式2,4が合っているはずだと思います。でも367℃ですからね。

また、Analog readの値が448とかになっており、電圧が2.19Vを記録しています。 LM35DZは最大1.5V(150℃)とかな気がしますけど、これはセンサーが壊れているのでしょうか。

もう良くわかりません。揺れも大きいですし、温度センサーは難しいということがわかりました。

今回はこの辺りでやめにしたいと思います。

次回はセグメントLEDを使います。

Posted: December 11, 2015, 5:57 am

こんにちは、のすけです。

中華で始める Arduino入門日記の12回目になります。

この連載は、爆安の中華製のArduino互換機を入手し、色々と苦しみながらも安い互換機でArduinoを学習してしまおうというものです。 入手の話はこちらから。

hollywis.hatenablog.com

今回のお題

前回はポテンションメーターという可変抵抗器でグリグリしました。

hollywis.hatenablog.com

今回は、Photoresistor(明るさセンサー)を利用して傾きを検出してみたいと思います。

チュートリアルのchapter10に対応しています。

早速始めましょう。

Photoresistor(明るさセンサー)を知る

こいつです。中華キットに抜かりなく入っていました。

f:id:hollywis:20151210182541j:plain

ちょっとここでWikipedia先生の引用を紹介

フォトレジスタ (photoresistor) とは、入射する光の強度が増加すると電気抵抗が低下する電子部品である。 光依存性抵抗 (light-dependent resistor, LDR) や 光導電体 (photoconductor) 、フォトセル(photocell)とも呼ばれる。 フォトレジスタは、高抵抗の半導体でできている。 充分に周波数の高い光が素子に入ると、半導体に吸収された光子のエネルギーにより束縛電子が伝導帯に飛び込む。 結果として生じる自由電子(と対になるホール)によって電流が流れ、電気抵抗が低くなる。

by Wikipedia

光の強さによって、抵抗が低くなるようです。

また、キットに入っているのは硫化カドミウム (CdS) セルというものらしく、セルに光が当たると抵抗値が低くなります。

なお、明るい時は約600Ω、暗い時に1~2MΩになる模様。

回路を作成

利用する部品はこちら

  • Photoresistor : 1

  • LED : 1

  • 1kΩ 抵抗 : 1

  • 220Ω 抵抗 : 1

  • ブレッドボード: 1

  • ジャンパーワイヤ: 5

f:id:hollywis:20151210190749j:plain

1k抵抗は光センサー側につけます。

こんな感じ。

f:id:hollywis:20151210185021j:plain

写真はA2ピンと1kΩ抵抗にジャンパーワイヤーが刺さっていませんね。刺しましょう。

プログラム

サンプルプログラムを使うより、前回のポテンションメーター用の改造プログラムが思いのほか良さげなので、それをちょっと修正しています。

シリアル出力もされててデバッグしやすくいい感じです。

(もう全部これでいいんじゃないか...)

int apin = 2; //アナログpin2を利用
int ledpin = 12; //LED pin
int threshold = 512; //閾値

void setup()
{
    pinMode(ledpin,OUTPUT); //デジタル pinを出力設定
    Serial.begin(9600);        // シリアル通信設定
}
void loop()
{
    int photocell_read;  //変数photocell_readを定義
    while(1)
    {
       photocell_read = analogRead(apin); //アナログpin0から電圧を読み取って変数に格納
       Serial.println(photocell_read);

       if(photocell_read <= threshold) 
       {
          // 閾値以下ならLED点灯
          digitalWrite(ledpin,HIGH);//led点灯
       }
       else //それ以外の場合
       {
          digitalWrite(ledpin,LOW);//led消灯
       }
    }
}

やってみる

はい、やってみた結果LEDは変わりませんでした。

例によって、チューニングです。 このプログラムではシリアル出力してますから、値を確認してみましょう。

  • 通常時で450前後

  • 隠した時に100前後

になっていることがわかりました。

なので、thresholdを256くらいにして、再度挑戦です。

そして、できた結果がこちら。

いい感じですね。

次回は温度計を使ってみます。

Posted: December 10, 2015, 10:33 am

こんにちは、のすけです。

以前は大手システム会社(SIer:社員1万人以上)でサラリーマンをしていたのですが、ずっと自分でサービスを作りたいという 想いがあり、会社を辞めました。

そして、数ヶ月後に2つ目のサービスをリリースした時のことです。(1個目は空中分解しました;)

実質、もう動いていませんがそのサービスがこちら

HOTCOO | ホックー!

プレスリリースを出す

リリースに際して、みんなに知ってもらわなきゃだめだよねってことで、何もわからなかった僕らは お手軽に周知してももらえるプレスリリースというものを行うことにしました。

プレスリリースとは、一般の企業もよくやっているもので世間に自社の新しい取り組みやプロダクトなどを 発表するものになります。

基本的にはプレスリリースの内容を記載したページを1ページ作成して、有名どころのメディアやネットメディアなどに FAXやリリースメールなどを送信すればOKです。

そして、その記事を見た会社などから問い合わせなどを受けて事業連携が進んだり、その記事を見たユーザが使ってくれたり、その記事を見たブロガーがさらに記事を書いたりなど、いいことだらけらしいです。

今はプレスリリースには便利なサービスがいっぱいあって、僕らは

ValuePress! [プレスリリース配信・PR情報サイト]

を利用しました。ここは、流したい内容を書けば数百件から数千件のメディアに対してメールを送信してくれます。

より多くのお金を払えば、電話連絡もしてくれるようです。

書き方の指導とかもあり、初心者にも優しいサービスでした。

僕たちは、色々と悩みながらもなんとかプレスリリースを作成し、メールだけの プランでやりましたが、数個のネットメディアで取り上げてくれました。

そして、僕らは良い問い合わせが来るのを待ったわけです。

営業電話が来る

プレスリリースを出した反響はすぐに出ました。

そう、営業電話が来るのです。事業提携とか、ユーザからの問い合わせとかそんなのは来ません。

一番多かったのは広告会社です。

〇〇という会社なのですが、うちの広告枠で広告を出しませんか?

〇〇という新聞社なのですが、うちの広告枠で広告を出しませんか?

〇〇という広告配信業者なのですが、1クリック○円で広告を出しませんか?

出しません。

弱小スタートアップはりうすに、そんなお金はないし。

マーケティング戦略なんて、まるで考えていなかった僕らは「ほへ〜」って感じでした。

もう電話に出るのが面倒です。

営業マンからメールが来る

「〇〇という雑誌のものなのですが、すごいCEOとして紹介しませんか?」

ある日、そんなメールが来ました。CEOちゃCEOですけどどう考えても僕は凄くありません。

会社辞めて数ヶ月でしたし、サービスもリリースしたばっかりでユーザも碌についていない。

でも勉強のために話を聞いて見ることにしました。

しかもどうやら、僕らのオフィスに来るというのです。

ちなみに僕らのオフィスは当時、神奈川のマイナー駅から徒歩20分のぼろアパートでした。

hollywis.hatenablog.com

接待用のソファもないし、会議室もありません。

しかも玄関のドアには会社名も書いていませんでしたので、急遽プリンターで素早くロゴを作成し テープでドアに貼り付けることにしました。

果たしてどうなるのか、ワクワクが止まりません。

営業マン現る

営業マンから連絡がきます。

どうやら近くまで来ているようなのですが、場所がわからず迷っているようです。

そりゃそうだ。駅から徒歩20分の奥まったボロアパートの場所がわかったら凄いですよ。

なので、営業マンが今見える景色からヒントを得て電話越しにナビをしました。

そして無事に我がオフィスに到着です。営業マンは汗だくでした。

申し訳なさすぎる。

はるばる徒歩20分もスーツをぴっちり決めて歩いてきてくれたのですから、それは大変でしょう。

でも、僕らには抜かりはありませんでした。

家の前にある自動販売機で冷えたお茶をあらかじめ購入してあったので、 何食わぬ顔でそれをスッと出しました。

営業マンは恐縮しながら飲んでくれました。なんかいい人そうだ。

でも、問題が一つあります。僕らのオフィスには作業用の机しかありませんので商談には向きません。

そこで、たまたま持っていた折りたたみ式の50cm四方くらいの低めのテーブルがありましたので、それを商談のテーブルに使うことにしました。

なお色はピンクです。

別にふざけているわけではありません。それしか無かったのです。

畳にあぐらをかきながら商談スタートです。

時おり営業マンが「僕はこういう雰囲気大好きですよ」とか雑談を含めながら楽しく商談しました。

お世辞でも嬉しいです。

ビジネスについてご意見をいただいたりもしました。

商談の内容については"僕はまだ凄くない"という点や、お値段的に見送ることになりましたが 、「凄くなったらお願いします」という話になり終わりました。

「なぜ僕らみたいなところに来たのでしょうか?」と率直に伺ったところ

営業マン的にも顔つなぎというのは大事だそうで、このように初期から顔を出していくことで親近感を沸かせ後々お客さんになっていくということのようです。

なるほど。勉強になります。

それにしても、畳の上で小さなテーブルを囲んでの商談は、傍目にはなかなかシュールな光景になったのではないかと思います。

早くすごいCEOになりたいものですね。

Posted: December 10, 2015, 7:54 am

こんにちは、のすけです。

中華で始める Arduino入門日記の11回目になります。

この連載は、爆安の中華製のArduino互換機を入手し、色々と苦しみながらも安い互換機でArduinoを学習してしまおうというものです。 入手の話はこちらから。

hollywis.hatenablog.com

今回のお題

前回は傾きを検出しました。

hollywis.hatenablog.com

今回は、Potentiometerを利用して傾きを検出してみたいと思います。

チュートリアルのchapter9に対応しています。

早速始めましょう。

ポテンションメーターとは

調整つまみがついたデバイスで、回し具合に応じて様々な抵抗にすることができます。

可変抵抗器ですね。

f:id:hollywis:20151209162606j:plain

3つの端子がありますが、両端の2つに基準電圧を掛けて、真ん中の端子で変更された電圧を受けることができます。

回路を作る

両端の端子に5Vの基準電圧をかけます。

そして、真ん中の端子にはアナログのA0ピンを接続します。

f:id:hollywis:20151209163009j:plain

このつなぎ方でアナログ値を観測すれば5V(ボルト)で1023、0V(ボルト)で0を記録するはず。

実は付属のブレッドボードにはポテンションメーターの端子のサイズが微妙に合わなくて刺さりませんでした。

そこで、別途持っていたミニブレッドボード(中華キットには入ってません)を使うといい感じに刺さりました。

簡単なんで回路図は省略。

プログラム

ポテンションメータ(可変抵抗器)からアナログ値を取得し、シリアルモニタに出すだけです。

前回の傾きより、よほど楽ですね。

int potpin = 0 ; 
int val = 0 ; 

void setup()
{
    Serial.begin(9600);
}
void loop()
{
    delay(50);
    val =  analogRead(potpin);
    Serial.println(val) ;
}

つまみを動かすと、0~1023までの値がシリアルモニタに出ました。

応用してみる

前回のティルトスイッチのプログラムを応用して、512以上になったらLEDを光らせてみました。

int apin = 0; //アナログpin5を利用
int ledpin = 13; //LED pin
int threshold = 512; //閾値

void setup()
{
    pinMode(ledpin,OUTPUT); //デジタル pin13を出力設定
    Serial.begin(9600);        // シリアル通信設定
}
void loop()
{
    int pot_read;  //変数pot_readを定義
    while(1)
    {
       pot_read = analogRead(apin); //アナログpin0から電圧を読み取って変数に格納
       Serial.println(pot_read);

       if(pot_read > threshold) 
       {
          digitalWrite(ledpin,HIGH);//led点灯
       }
       else //それ以外の場合
       {
          digitalWrite(ledpin,LOW);//led消灯
       }
       delay(60);
    }
}

先ほどの回路にpin13と隣のGNDに跨ってLEDを刺しとけばOKです。

なお、ポテンションメーター用のGNDは別のところに移動させます。

f:id:hollywis:20151209170139j:plain

こっちの方が、楽しいですね。

LEDをデジタル出力ではなく、アナログ出力を使えばLEDの明るさを変えたりもできそうですね。

今回はこれでお終いです。

次回は、Photoresistor(明るさ)センサーを使います。

Posted: December 9, 2015, 7:58 am

こんにちは、のすけです。

中華で始める Arduino入門日記の10回目になります。

この連載は、爆安の中華製のArduino互換機を入手し、色々と苦しみながらも安い互換機でArduinoを学習してしまおうというものです。 入手の話はこちらから。

hollywis.hatenablog.com

本題

前回はブザーを鳴らしました。

hollywis.hatenablog.com

今回は、Tilt switchを利用して傾きを検出してみたいと思います。

早速始めましょう。

Tilt switch(ティルトスイッチ)を知る

Tilt switch(ティルトスイッチ)またはTilt Sencer(傾斜センサー)とも言い、文字通り傾きを検出するための 電子デバイスです。

身近なところでは、スマホで縦に持つのと、横持つのを検出するのにも利用されているのでは ないでしょうか。

こいつです。

f:id:hollywis:20151208124342j:plain

なんかコンデンサみたいな形ですね。

でも、見分けるのは簡単! 振るとカチカチいうのがティルトスイッチです。

どうやって傾きを検出してるの?

ググりました。

どうやら御察しの通り、中に入っている金属のボールが関係しているようです。

内部に接点を4つほど用意して、どの接点と金属のボールが接しているかで場合分けをしているようです。 縦に持つと4つ全てに接するけど、横にすると1つまたは2つしか接しない、などなど。

金属ボールの他に、液体を利用するものなど、様々なティルトスイッチの方式がある感じでした。

繋いでみる

このティルトスイッチには極性はなさそうです。

回路図はこんな感じです。Fritzingというソフトを使って自作してみました。

f:id:hollywis:20151208135130p:plain

使い方は後日別記事で紹介したいと思います。直感的でとても便利でした。

ソフトはこちらからダウンロードできます。 Fritzing Download

ブレッドボードの配線図はこちら。

f:id:hollywis:20151208134837j:plain

デジタルpin8にLEDと220Ωの抵抗をつけます。

アナログpin5にティルトスイッチをつけます。

実際に刺したのはこちら

f:id:hollywis:20151208154705j:plain

プログラム

実はサンプルからかなり修正しています。 分かりにくかったのでピンの指定を外だしにしたり、thresholdの設定が 説明と矛盾していたので修正したりしています。

int apin = 5; //アナログpin5を利用
int ledpin = 8; //LED pin
int threshold = 512; //閾値

void setup()
{
    pinMode(ledpin,OUTPUT);//デジタル pin8を出力設定
}
void loop()
{
    int tilt_read;  //変数tilt_readを定義
    while(1)
    {
       tilt_read = analogRead(apin); //アナログpin5から電圧を読み取って変数に格納
       if(tilt_read > threshold) //512より上なら(2.5V)
       {
          digitalWrite(ledpin,HIGH);//led点灯
       }
       else //それ以外の場合
       {
          digitalWrite(ledpin,LOW);//led消灯
       }
    }
}

analogReadでアナログpin5から値を受け取り、一定値以上だったら LEDが光ります。

analogReadで取得できる値は0~1023なので512はちょうど真ん中あたりです。 (5VのPOWERに接続しているので2.5V相当ですね)

やってみる

横にしてみたり

f:id:hollywis:20151208160447j:plain

戻してみたり

f:id:hollywis:20151208160451j:plain

また倒してみたり。。。

f:id:hollywis:20151208160456j:plain

LED変わらないんですけどーーーーーーー。

デバッグだっ!

これは、アナログの入力値をチェックしてみないことには何もわかりませんね。

前回やったシリアル出力でデバックしてみます。

int apin = 5; //アナログpin5を利用
int ledpin = 8; //LED pin
int threshold = 512; //閾値

void setup()
{
    pinMode(ledpin,OUTPUT); //デジタル pin8を出力設定
    Serial.begin(9600);        // シリアル通信設定
}
void loop()
{
    int tilt_read;  //変数tilt_readを定義
    while(1)
    {
       tilt_read = analogRead(apin); //アナログpin5から電圧を読み取って変数に格納
       Serial.println(tilt_read);

       if(tilt_read > threshold) //512より上なら(2.5V)
       {
          digitalWrite(ledpin,HIGH);//led点灯
       }
       else //それ以外の場合
       {
          digitalWrite(ledpin,LOW);//led消灯
       }
    }
}

そして、実行後にシリアルモニタを開いてみると、、

はやっ

ものすごいスピードで、電圧が変わっていることがわかります。 しかも値が512超え、512以下を繰り返していました。

つまり、超高速で点滅しているため結局LEDがついているようにしか見えない!

ということのようです。

果てしない検証の結果

アナログピンを色々変えてみたり、ティルトスイッチを抜いてみたり、閾値を変えてみたり、delayを入れてみたりとしながら シリアルモニタと睨めっこしてデバックを繰り返しました。

その結果、私の環境での設定値はこれじゃね? というのが出ました。

  • thresholdは900

  • 最後にdelayを60ms入れる

最終プログラムはこちら

int apin = 5; //アナログpin5を利用
int ledpin = 8; //LED pin
int threshold = 900; //閾値

void setup()
{
    pinMode(ledpin,OUTPUT); //デジタル pin8を出力設定
    Serial.begin(9600);        // シリアル通信設定
}
void loop()
{
    int tilt_read;  //変数tilt_readを定義
    while(1)
    {
       tilt_read = analogRead(apin); //アナログpin5から電圧を読み取って変数に格納
       Serial.println(tilt_read);

       if(tilt_read > threshold) 
       {
          digitalWrite(ledpin,HIGH);//led点灯
       }
       else //それ以外の場合
       {
          digitalWrite(ledpin,LOW);//led消灯
       }
       delay(60);
    }
}

どうがんばっても、傾けた状態でも1023の電圧を記録してしまうため傾けたら点滅 、普通の状態なら安定して点灯くらいまでしか出来ませんでした。

パーツが悪いのか、私の配線が悪いのか、プログラムが悪いのか。。

どうせLEDが点くか消えるかの2値なんだから、わざわざアナログ値を1024段階取得する意味はあまりない気がしますが。

ふぅ、お疲れ様でした。

次回はチャプター9のPotentiometer(回転角による可変抵抗器)を使ってみたいと思います。

Posted: December 8, 2015, 7:54 am

f:id:hollywis:20151208001943p:plain

こんばんは。

さいぞうです。

ちょっと間が空いてしまいましたが、Arduinoチュートリアルを一歩一歩やっていく連載記事の3つめです。

今回は、LEDをチカチカさせよう。

準備

実際にLEDを光らせるまでに、準備が必要だ。

まずArduinoとパソコン本体をUSBケーブルでこんな感じにつなぐ。

f:id:hollywis:20151207221208j:plain

次に、Arduinoアプリを起動。 f:id:hollywis:20151207221459p:plain

上のメニューのツール>シリアルポート を見て、USBポートにつないだArduinoが認識されていることを確認する。

写真のように /dev/cu.usbmodemなんちゃらかんちゃら と出ていればOK。

この辺でつまずく場合、下の2記事を参照。

hollywis.hatenablog.com

hollywis.hatenablog.com

LEDをつなごう

使うパーツ

ちゃんと認識されることを確認したら、次にこのチュートリアルで使う回路を組む。

といってもハンダは使わない簡易なもの。

まず、Arduinoのセットから以下の3種類のパーツを取り出す。

  • ブレッドボード 穴がたくさん空いた白い四角いプラスチックのボード。食パンみたいだからブレッドボードという。

と思っていたが、実は昔電子回路いじるときに、パンをこねる台=文字通りのブレッドボードを使っていたところからきてるらしい。

ブレッドボード - Wikipedia

  • ケーブル2本 両方にピンがでた両方オスのやつ。
  • 好きな色のLED1つ わかりやすいので赤いやつを選んだ。

f:id:hollywis:20151207225128j:plain

これです。

つなぐ

まず、LEDをブレッドボードに取り付けよう。

f:id:hollywis:20151207225622p:plain

LEDというのは電球と違って+ーがあり、間違ってつなぐと壊れることもある。

ぱっと見どっちがどっちかわからないけど、実は2本出ている足の長さをみると判定できる。

ググればすぐでてくるが、長いほうが+側です。

これをブレッドボードにさす。

ブレッドボードはただ穴がたくさん開いてるだけでなくて、穴同士がつながっている。

f:id:hollywis:20151207230420p:plain

こんなふうに全部がつながっているのではなく、横方向につながっている。

f:id:hollywis:20151207230703p:plain

なので、全体を通してみると黄色い線がプラス側、緑の線がマイナス側になる。

この黄色と緑の線を、Arduino本体につなぐ。

Arduinoには1から13までのピンがある。 後で指定するけど、今回は13番ピンから信号をだすことにする。 そこで、13番に黄色の線、プラス側をつなごう。

f:id:hollywis:20151207231454p:plain

マイナスの緑の線はGNDとかいたピンにつなぐ。

GNDというのはグランドを表し、マイナス側(というか0)みたいな意味。

f:id:hollywis:20151207230745j:plain なんだかボケちゃったけど、こんなかんじになれば完成

コード

準備ができたら、パスコンに戻って、上の画面の真ん中あたりのsetup()とか書いてあるところに下のコードを書き込みます。

int ledPin = 13; // 出力するピンを13番に指定
void setup()
{
  pinMode(ledPin, OUTPUT);//うえで選んだピンを出力モードに指定
}
void loop()
{
  digitalWrite(ledPin, HIGH); //LEDを光らせる
  delay(1000); // 1秒待つ    
  digitalWrite(ledPin, LOW); //LEDを光らせるのをやめる
  delay(1000); // 1秒待つ   
}

f:id:hollywis:20151207231845p:plain

こんな感じ。

プログラム実行

f:id:hollywis:20151207223859p:plain

次に、左上の「マイコンボードに書き込む」というボタンを押す。

すると、パソコンからArduinoに上記のプログラムが書き込まれ、すぐに実行される。

うまくいけば、LEDが1秒間隔でチカチカするはず。

以上です。

つまらないなあ...

本来のチュートリアルはこれで終わりだけど、なんかつまんない....

なんか面白くできないものかと思ってあたりを見回すと、ちょうどもらいもののお菓子の袋がみつかった。

うーん....

なんかこれ顔に見えるなあ...

f:id:hollywis:20151207233357j:plain

 
 
 

LEDを2つにして、かぶせてみると.......

ふむ。

 
 
 

ふむふむ。

 
 
 
それっぽいぞ。結構行ける気がする。

 
 
 

暗闇でとってみた。Lチカモンスターの登場だ!!!!  
 
こわいこわい。 赤ちゃんなら泣かせられるかもしれない。 お子さんが悪さをした時に使ってください。  

補足情報

本記事で使っているのはこちらのチュートリアルです。

www.sainsmart.com

本記事のArduinoはこのキットを買いました。 Arduino本体以外にもモータとかLEDとかいろいろ入ってて便利なのでおすすめです。

使ったお菓子はこちら。銀座鹿鳴館の製品。 おばあちゃんちとかにあるちょっと硬いゼリーみたいなやつです。 美味しいです。


なお、本連載は、2名しかいないスタートアップのメンバーがほぼ同内容の記事を執筆して競う

この記事とほぼ同じ内容の回はこちら。 同じ内容を2回読みたい方はこちらをお読みください。 hollywis.hatenablog.com


次回はこちら

第3章

hollywis.hatenablog.com

総合もくじ

hollywis.hatenablog.com

Posted: December 7, 2015, 2:52 pm

こんにちは、のすけです。

中華で始める Arduino入門日記の9回目です。

この連載は、爆安の中華製のArduino互換機を入手し、色々と苦しみながらも安い互換機でArduinoを学習してしまおうというものです。 入手の話はこちらから。

hollywis.hatenablog.com

本題

中華で始める Arduino入門日記、前回は信号機を作りました。

hollywis.hatenablog.com

今回はついにLEDを卒業して、次なるデバイスである「ブザー」に挑戦です。

ブザーを確認する

こちらの丸っぽい黒いのがブザーです。

f:id:hollywis:20151204184505j:plain

中華キットにもちゃんと入っていました。 これまでの、Arduinoの動きにも特に問題ありませんし、中華キットいいですね!

利用しているキットに近いやつは⇩

ブザーの真ん中に小さな穴が開いています。おそらくここから音が出るのでしょう。

ちなみにブザーというは

The buzzer is one integrated electronic transducers, DC voltage supply, widely used in computers, printers, copiers, alarm, electronic toys, automotive electronic equipment, telephones, timers and other electronic products for sound devices.

DC(直流)電圧で動く、コンピュータ、プリンタ、複写機、アラーム、電子玩具などなど、様々な機器の音源装置としてつかわれているそうです。

なおブザーには2種類あって、裏が黒いのがアクティブブザー、基盤が出てるのがパッシブブザーらしい。高さも1mm違う。

f:id:hollywis:20151204191137j:plain

MULTIMETERで抵抗値を測ったらパッシブブザーが14.4Ω、アクティブブザーが23.3MΩでした。

ちなみに、表側に薄っすらと⊕ のマークがあり、極性があるようですので間違えないように通電したいですね。

接続してみる

Digitalピン13に直接つないでokとのことなので、ダイレクトに繋いでしまいます。 f:id:hollywis:20151204191232j:plain

繋ぎ方は

pin13 - ブザー - GND

プラス・マイナスを間違えないように気をつけましょう。

int buzzer=13;  //ブザーに使うピン
void setup()
{
  pinMode(buzzer,OUTPUT);  //デジタルピンを出力に設定
}
void loop()
{
  unsigned char i,j;
  while(1)
  {
    for(i=0;i<80;i++)
    {
      digitalWrite(buzzer,HIGH);  //鳴らす
      delay(1);
      digitalWrite(buzzer,LOW);
      delay(1);
    }
    for(i=0;i<100;i++)
    {
      digitalWrite(buzzer,HIGH);  //鳴らす
      delay(2);
      digitalWrite(buzzer,LOW);
      delay(2);
    }
  }
}

なぜかサンプルコードはpin7を使っていたので、プログラムの方をpin13を使うように 修正しました。

やってみる

すいません。うるさすぎて、録画できませんでした。

かなりうるさくて、驚きました。

ただ、

for(i=0;i<80;i++)
    {
      digitalWrite(buzzer,HIGH);  //鳴らす
      delay(1);
      digitalWrite(buzzer,LOW);
      delay(1);
    }

for(i=0;i<100;i++)
    {
      digitalWrite(buzzer,HIGH);  //鳴らす
      delay(2);
      digitalWrite(buzzer,LOW);
      delay(2);
    }

では音の高さが違う感じでした。間のdelayの違いだと思います。

また、アクティブブザーとパッシブブザーでも音が違いました。

音については是非、実際にやってみて確認してください。

ただし、かなり耳につく音ですので、周りに気をつけて鳴らしましょう!

次回は傾きセンサーを使います。チュートリアルの「Chapter8 Tilt switch」の部分です。

Posted: December 6, 2015, 10:00 am

こんにちは、のすけです。 中華で始めるArduino入門 8回目の今回は、信号機を作ります。

この連載は、爆安の中華製のArduino互換機を入手し、色々と苦しみながらも安い互換機でArduinoを学習してしまおうというものです。 入手の話はこちらから。

hollywis.hatenablog.com

本題

前回はLEDをクリスマスツリーっぽく光らせました。

今回はArduino チュートリアルの「Chapter6 Traffic light」になります。

回路

前回のやつから、LEDを半分抜いて、順番を信号機のように赤・黄・緑にします。 そして、利用するピンは10,7,4にそれぞれ接続します。

簡単ですね。

f:id:hollywis:20151204183013j:plain

プログラム

int ledred=10;   
int ledyellow=7; 
int ledgreen=4; 
void setup()
{
   pinMode(ledred,OUTPUT);
   pinMode(ledyellow,OUTPUT);
   pinMode(ledgreen,OUTPUT);
}
void loop()
{
   digitalWrite(ledred,HIGH);
   delay(1000);
   digitalWrite(ledred,LOW);
   digitalWrite(ledyellow,HIGH);
   delay(200);
   digitalWrite(ledyellow,LOW);
   digitalWrite(ledgreen,HIGH);
   delay(1000);
   digitalWrite(ledgreen,LOW);
}

特に目新しいことはありませんね。 実際の信号機のように黄色が一瞬だけ光るようにdelay調整しているところにセンスを感じます。

結果

次回はブザーを鳴らします、「Chapter7 Buzzer」の内容に相当します。

Posted: December 5, 2015, 10:00 am

のすけです。 中華で始めるシリーズも今回で7回目ですね。

この連載は、爆安の中華製のArduino互換機を入手し、色々と苦しみながらも安い互換機でArduinoを学習してしまおうというものです。 入手の話はこちらから。

hollywis.hatenablog.com

本題

前回はロウソクのようにLEDを付けました。

hollywis.hatenablog.com

今回は、たくさんの色々なLEDをくっ付けてプログラムで制御します。

チュートリアルのチャプター5 Advertising LEDになります。

回路図

f:id:hollywis:20151203174151p:plain *出展:SainSmartチュートリアル

よく見えませんが、ArduinoのDigitalピン0~5にそれぞれLEDを付けろという ものになります。

配線例がこちら f:id:hollywis:20151203174326p:plain *出展:SainSmartチュートリアル

なんか、複雑ですねぇ。。。

ブレッドボードで作ってみる

f:id:hollywis:20151203174559j:plain

配線例が無駄に複雑っぽかったので、簡略化しました。

材料はこちら

  • LED 6個(赤、黄、緑)

  • 抵抗220Ω 6個

  • ジャンパーコード 7本

配線は次のように繋げます。

  • ピン0 - 220Ω - LED(緑) - GND

  • ピン1 - 220Ω - LED(黄) - GND

  • ピン2 - 220Ω - LED(赤) - GND

  • ピン3- 220Ω - LED(赤) - GND

  • ピン4 - 220Ω - LED(黄) - GND

  • ピン5 - 220Ω - LED(緑) - GND

f:id:hollywis:20151203175139j:plain

つなげてみました。

お気づきかもしれませんが、なぜか右2つのピン0,ピン1に接続している LEDが付いてます。

特にHIGHに設定していないのですが。。。よく分かりません。

プログラム

int Led1 = 1;
int Led2 = 2;
int Led3 = 3;
int Led4 = 4;
int Led5 = 5;
int Led6 = 6;

// 光り方1
// LEDが順に光り(HIGH)に、順に消える(LOW)
void style_1(void)
{
  unsigned char j;
  for(j=1;j<=6;j++)
  {
    digitalWrite(j,HIGH);
    delay(200);
  }
  for(j=6;j>=1;j--)
  {
    digitalWrite(j,LOW);
    delay(200);
  } 
}

// フラッシュ
// LEDが全て光り(HIGH)、全て消える(LOW)
void flash(void)
{   
  unsigned char j,k;
  for(k=0;k<=1;k++)
  {
    for(j=1;j<=6;j++)
      digitalWrite(j,HIGH);
    delay(200);
    for(j=1;j<=6;j++)
      digitalWrite(j,LOW);
    delay(200);
  }
}

// 光り方2
void style_2(void)
{
  unsigned char j,k;
  k=1;
  for(j=3;j>=1;j--)
  {   
    digitalWrite(j,HIGH);
    digitalWrite(j+k,HIGH);
    delay(400);
    k +=2;
  }
  k=5;
  for(j=1;j<=3;j++)
  {
    digitalWrite(j,LOW);
    digitalWrite(j+k,LOW);
    delay(400);
    k -=2;
  }
}

// 光り方3 
void style_3(void)
{
  unsigned char j,k;
  k=5;
  for(j=1;j<=3;j++)
  {
    digitalWrite(j,HIGH);
    digitalWrite(j+k,HIGH);
    delay(400);
    digitalWrite(j,LOW);
    digitalWrite(j+k,LOW);
    k -=2;
  }
  k=3;
  for(j=2;j>=1;j--)
  {   
    digitalWrite(j,HIGH);
    digitalWrite(j+k,HIGH);
    delay(400);
    digitalWrite(j,LOW);
    digitalWrite(j+k,LOW);
    k +=2;
  } 
}
void setup()
{ 
  unsigned char i;
  for(i=1;i<=6;i++)
    pinMode(i,OUTPUT);
}
void loop()
{   
  style_1();
  flash();
  style_2();
  flash();
  style_3();
  flash();
}

やってみた(でも何か変)

光りましたね。でも、一番右のLEDおかしくないですか?

ずっと光ってます。

よくよくコードを見ると

int Led1 = 1;
int Led2 = 2;
int Led3 = 3;
int Led4 = 4;
int Led5 = 5;
int Led6 = 6;

となっていますね。

ずれてるじゃん!!SainSmartのサンプルコードは図とずれているようですね。 修正しましょう。

0ピンはなぜかデフォルトでHIGHになっているっぽいので、使わないでサンプルコードの通り 1~6ピンを使うようにずらします。

f:id:hollywis:20151203182220j:plain

そして、実行すると。。

クリスマスツリーのLED照明とかに似ている感じだ。

1.右から順に光って戻る style_1

2.フラッシュ flush

3.黄赤緑の順に光る style_2

4.フラッシュ flush

5.緑赤黄の順に光る style_3

6.フラッシュ flush

このような順で実行されていました。上手く動いているようです。

  • ピン1,6が緑

  • ピン2,5が赤

  • ピン3,4が黄

これを意識しながらfor文で光り方を設定後delayを追加という流れで、それぞれの光り方を設定している訳ですね。

setup部の

for(i=1;i<=6;i++)
    pinMode(i,OUTPUT);

で一括でDigitalピンを出力設定しています。

次回は「Traffic light」信号機をやります。

Posted: December 4, 2015, 10:00 am

こんにちは、のすけです。

中華で始める Arduino入門日記の6回目です。

この連載は、爆安の中華製のArduino互換機を入手し、色々と苦しみながらも安い互換機でArduinoを学習してしまおうというものです。 入手の話はこちらから。

hollywis.hatenablog.com

本題

前回はブレッドボードを利用して、LEDをチカチカさせました。

hollywis.hatenablog.com

今回はなんと!チカチカではなくほわほわとロウソクのように瞬かせてみたいと思います。

できるんですねぇ、そんなことが。チュートリアルの5章 PWMになります。

では早速やってみましょう。

利用しているキットに近い奴は⇩

アナログ値(PWM)を扱う

指定したピンからアナログ値(PWM波)を出力することができるようです。

何が嬉しいかと言うと、LEDの明るさや、モータの回転スピードなどを調整する時に利用できるとのこと

制御できる段階は256段階(0~255)で、かなり細かく制御できるようですね。

ただし、制御できるDigital I/Oピンは決まっているそうで、3,5,6,9,10,11ピンだけだそうです。

利用方法

analogWrite関数というものが用意されています

実行されるともう一度analogWriteをしたりするまで、安定した矩形波が出力される模様。 周波数はだいたい500Hzだそうです。

ちょっとよくわからないので、ググりました。

矩形波(くけいは、Square wave)とは非正弦波形の基本的な一種であり、電子工学や信号処理の分野で広く使われている。 理想的な矩形波は2レベルの間を規則的かつ瞬間的に変化するが、その2レベルにはゼロが含まれることも含まれないこともある。 方形波とも呼ばれる。

https://upload.wikimedia.org/wikipedia/commons/thumb/0/0a/Synthesis_square.gif/350px-Synthesis_square.gif

by Wikipedia

うん。まだよくわからないけど。

電気を瞬間的にオンにしたりオフにしたりを規則的にすると矩形波になって

オンの時間とオフの時間を調整することで、電圧を擬似的に出力の最大値から256段階に分割していると

だから、抵抗とかを調整しなくても、LEDを明るくしたり暗くしたりができると。

そんな理解でいいのかな?

なるほど便利そうだ。

回路

実は前回と一緒です。9ピンを使います。

緑のジャンパーコードを差した状態を利用します。

f:id:hollywis:20151201185021j:plain

サンプルプログラム

プログラムはこちら。

int led = 9;           // LEDピンを設定
int brightness = 0;    // LEDの明るさ
int fadeAmount = 5;    // LEDの調光段階値

void setup() {
  // 9ピンに設定
  pinMode(led, OUTPUT);
}

void loop() {
  // 9ピンの明るさを設定
  analogWrite(led, brightness);

  // 明るさを変更
  brightness = brightness + fadeAmount;

  // 調光の方向を逆にする
  if (brightness == 0 || brightness == 255) {
    fadeAmount = -fadeAmount ;
  }
  // 調光のために30ミリ秒のwaitを追加
  delay(30);
}

analogWrite()というのが望む電圧を作るやつですな。

loopの度に設定し直していると。

0~255まで設定できるんだけど、1づつ調整してたら面倒だからfadeAmountで5づつ調整する設定にしていると。

if (brightness == 0 || brightness == 255) { fadeAmount = -fadeAmount ; } 最初はどんどん増えていくんだけど、255まで来たらもう増やせないから、255の時は-5づつ調整するようにモードを変更していると。 逆に0になったらまた5づつ増えるようにもなっていますね。

最後に30ミリ秒の待ちを入れて、いい感じの調光速度にしていると。

やってみた

お分りいただけるだろうか。チカチカではなく、ほわほわ光っているのが。

ロウソクか?と言われると微妙ですが、もう少しチューニングすればイケそうなレベルですね。

delayとかを調整して遊んでみると良いかと思います。 お試しください。

hollywis.hatenablog.com

Posted: December 3, 2015, 10:00 am

こんにちは、のすけです。

中華で始める Arduino入門日記の5回目です。

この連載は、爆安の中華製のArduino互換機を入手し、色々と苦しみながらも安い互換機でArduinoを学習してしまおうというものです。 入手の話はこちらから。

hollywis.hatenablog.com

本題

前回はArduinoのプログラミングの書き方として「Hello World!地獄」をやりました。 setup部は1度だけ実行、loop部は何度も実行でしたね。

hollywis.hatenablog.com

今回は、ちょっと進んだLチカ「ブレッドボードLチカ」をやってみたいと思います。

利用しているキットに近いやつは⇩

まずはブレッドボードを知る

ブレッドボードとは、半田付けしなくても簡易的に電子回路が作れちゃう代物です。

f:id:hollywis:20151201182452j:plain

ブレッドボードの仕様

  • +の赤線一列は電子的に繋がっています

  • -の青線一列は電子的に繋がっています

  • 同じ数字のa,b,c,d,eは電子的に繋がっています

  • 同じ数字のf,g,h,i,jは電子的に繋がっています

深く考えずに触ればすぐ慣れると思います

Lチカ回路を作る

こんな感じの回路を作ります。*出典:SainSmartチュートリアル

f:id:hollywis:20151201183057p:plain

  • ブレッドボード
  • 抵抗 200Ω(赤黒茶金)
  • LED (何色でも可)
  • ジャンパーコード3本

チュートリアルには220Ω(赤赤茶金)の抵抗を使うとなっていますが、見つからなかったので200Ωでやっちゃいます。 抵抗については、こちらなど参照:カラー抵抗早見表!

f:id:hollywis:20151201183805j:plain

こんな感じですね。 プラス側(赤)はデジタルピンの9ピンに刺して、マイナス側(青)はGNDに刺します。

f:id:hollywis:20151201185021j:plain

刺しました。微妙に位置が違いますが、回路的に一緒のはず。

だいたいでいいと思います。多分。

プログラム

プログラムはこちらです。

int ledPin = 9; // digital I/Oピンを選択

// 設定箇所
void setup() {
  // digital pin 9 をOUTPUTとして初期化
  pinMode(ledPin, OUTPUT);
}

// ループ箇所
void loop() {
  digitalWrite(ledPin, HIGH);   // LEDにする (HIGHの電圧)
  delay(1000);              // 1秒待つ
  digitalWrite(ledPin, LOW);    // LEDをoffにする(LOWの電圧) 
  delay(1000);              // 1秒待つ
}

今回は9ピンを使うみたいです。しかも指定方法がちょっと進んで、ledPinという外部変数を指定してから それをsetupやloop部で使うように、ちょいスマートになってますね。

結果

では、やってみましょう。

前回と同じように1秒毎にLチカするはずです。 抵抗が入ってるので、少しだけ暗くなるのかな?

正直明るさの違いは良くわかりませんでした。200Ωくらいじゃ何にも変わらない感じですね。

抵抗をもっと増やすと暗くなるのかな?

実は書き込むタイミングで何やらよく分からないエラーが出ました。でも、リセットスイッチを押してからもう一度書き込みを行うと上手くいきました。

もっと抵抗を増やしてみる

200Ωの抵抗がまだあったので、緑のジャンパーコードを外して抵抗を2つ追加しました。

直列接続なので、これで600Ωになったはず。

暗くなるかな?

うん。変わらない。

でも、ブレッドボードを使うと色々変更できて便利なのが分かって頂けたのではないでしょうか;

まとめレシピ

材料

  • Macbook(10.11 El Capitan) 1台

  • Arduino Uno r3(中華製) 1個

  • USBケーブル      1個

  • ブレッドボード 1個

  • 抵抗 200Ω(赤黒茶金) 1〜3個
  • LED (何色でも可) 1個
  • ジャンパーコード 3本

手順

  1. ブレッドボードに回路作成

  2. 9ピンとGNDにブレッドボードを接続

  3. Arduinoにプログラムを書き込む

  4. チカチカ

  5. 抵抗変えてみる

次回はチュートリアルのchapter5 PWMをやります。

Posted: December 2, 2015, 10:00 am

こんにちは、のすけです。

中華で始める Arduino入門日記の4回目です。

この連載は、爆安の中華製のArduino互換機を入手し、色々と苦しみながらも安い互換機でArduinoを学習してしまおうというものです。 入手の話はこちらから。

hollywis.hatenablog.com

本題

前回はハードウェア界の「Hello World!」である「Lチカ」をやりました。

hollywis.hatenablog.com

今回は、プログラミング界の「Hello World!」。つまり、「Hello World!」をやってみたいと思います。

しかもただの「Hello World!」ではつまらないので、「Hello World! 地獄」を作っちゃいます。(チュートリアル未記載)

まずはHello World!を書く

Arduino IDEを開いて、下記ようにプログラムを書きます。

f:id:hollywis:20151130191523p:plain

setup関数の中のみ記述します。 Serialというのは、ArduinoとPCのシリアル通信に使う命令のようですね。

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  Serial.println("Hello World!");
}

void loop() {
  // put your main code here, to run repeatedly:
}

「検証」ボタンを押してから右上の「シリアルモニタ」というボタンを押すと シリアルモニタが現れ、「Hello World!」が1回表示されました。

f:id:hollywis:20151130191535p:plain

リセットボタンを押してみる

Arduinoのボード上のリセットボタンを押すと、Arduinoがリセットされます。

f:id:hollywis:20151130175031j:plain

左上の赤い丸いボタンですね。

つまり、リセットされると、setupが1度呼ばれる訳です。

そうすると、、、

押すたびに「Hello World!」が表示されるはず...

f:id:hollywis:20151130191549p:plain

できました! 良かった良かった。

setupの関数の部分は起動時の1回だけ実行されるのがわかりました。

[本命]Hello World! 地獄

ちなみに、loop関数のところにもHello World!を書いたら 永遠に出続けるはずですよね?

そうすれば、止めたくても止められないHello World!地獄ができるはずです。

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  Serial.println("Hello World!");
}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.println("Hello World!");
  delay(1000);
}

このように、loopの部分にもHello World!を記述

そうすると、、、

f:id:hollywis:20151201202059p:plain

1秒毎にHello World! が何度も、何度も表示されるHello World! 地獄」が完成しました!

すいませんコレだけです。。

loop部分は、何度も実行されるわけですね。なるほどなるほど。

【注意】なお、delayは中々重要で、入れてあげないと上手く動きませんでした。1000くらいの値を設定すると良いと思います。

次回は、ブレッドボードを利用してのLチカです!

hollywis.hatenablog.com

Posted: December 1, 2015, 10:00 am