プログラムと電子工作の置き場、たまにコラム

日々のスニペットやMaker's系のプログラムを置いてきます。

部屋の明るさを取得するフォトトランジスター編

f:id:yuriai0001:20141202100320p:plain
フォトトランジスターはスマートフォンにも組み込まれており、日ごろからお世話になっている電子部品です。
今回使用するフォトトランジスターはLEDに似たような部品です。上記の図では白色になってます。

カソード、アノードのように足の長さが違いますが、このフォトレジスターの場合、長いほうがコレクター、短い方がエミッターです。コレクターをプラス電源側につなげましょう。CDSの場合と回路は同じですが、抵抗値として7.5kΩを使ってください。

フォトトランジスターとは名前の通りトランジスターの仲間です。ベース(ここでは光の強さにより強弱)に電流を流すとコレクタ、エミッタ間でより強い電流を流すことができます。

ここでは、当然、Raspberry Piでデジタル化された数値を取得するのが目標です。電圧の変化をA/Dコンバターを通じて出力させてみましょう。

現在の部屋の照度(Lux)を取得するために、便利なスマートフォンアプリがあります。アプリでおおまかな照度を得ながら実験をするとより理解が深まると思います。

Android
https://play.google.com/store/apps/details?id=jp.test.android&feature=search_result#?t=W251bGwsMSwxLDEsImpwLnRlc3QuYW5kcm9pZCJd
iOS
https://itunes.apple.com/jp/app/reple/id545999532?mt=8&at=10l8JW&ct=hatenablog

スマホで撮影すると、照度を簡単に得ることができました。ここで、大阪市立博物館による、照度と明るさの目安を確認しておくのもよいでしょう。
照度と明るさの目安

フォトレジスターから流れる電流量を事前に把握しておきましょう。
f:id:yuriai0001:20141202102611j:plain
データシートによると100Luxで33μAが流れます。
今回は、7.5KΩを利用しているので、出力電圧は
=7500Ω×33μA
=247500μV
= 0.247V
と予想できますね。

計測したい照度のレンジによって抵抗値を変えてあげる必要があります。今回は50Lux~500Lux程度の測定を目安にしています。

Raspberry Piの設定とプログラムのコードは元のページにありますので、先ほどの続き「シリアル通信を有効可する」からお読みください。
また、CDSセルとは出力される電圧が違うのでRaspberry Piに出力されるデジタル数値はCDSセルを使った場合とは異なります。
出力される数値を計算する場合は、A/Dコンバーターのデータシートをご覧ください。
http://www.ee.ic.ac.uk/pcheung/teaching/ee2_digital/MCP3002.pdf

ADコンバーターとフォトレジスタを使って部屋の明るさを取得しよう。 - Raspberry Pi 電子工作

【たぶん一番わかりやすい】Raspberry PiへのOS(Raspbian)インストール(周辺機器なし)

mrprc.stores.jp
【たぶん一番わかりやすい】Raspberry PiへのOS(Raspbian)インストール(周辺機器なし)
モニターやその他周辺機器がない場合、Raspberry Piの為だけに買うのは勿体ないですね。周辺機器なしでもSSHVNCを使えば問題なく利用できます。

Raspbianのダウンロード

その場合はNOOBSは使えないのでRAW IMAGEを使いましょう。
http://www.raspberrypi.org/downloads
f:id:yuriai0001:20141104170941p:plain
Raspbianのzipファイルをダウンロードしてください。

[Windows編]
ImageをSDに書き込むソフトとしてwin32diskimagerを使用しました。
http://sourceforge.net/projects/win32diskimager/
f:id:yuriai0001:20131229103000j:plain
先ほどDLしたRaspbianのイメージを選択しwriteしてください。
完了したらRaspberry PiにSDをセットします。そして、ネットワークケーブルを接続し電源を入れます。SSH接続のためにDHCPにてRaspberry Piに割り当てられたIPアドレスを調べます。以下のソフトウェアを使用しました。
http://www.forest.impress.co.jp/library/software/netenum/

Raspberry PiIPアドレス

ファイル→検索から自分が使用していNICを選択して実行するとRaspberry Pi Foundationというベンダー名が見つかります。このIPアドレスSSH接続しましょう。
f:id:yuriai0001:20131229104114j:plain

Tera TermとBonjour

Windowsの場合はSSHクライアントソフトウェアを準備します。定番としては、Tera Termというソフトウエアがあります。
http://sourceforge.jp/projects/ttssh2/

Raspberry Piは初期の状態からSSHデーモンが立ち上がっているのですが、windowsからの接続にはAppleBonjourを利用します。
iTunesがインストールされている場合は既にBonjourもインストールされています。iTunesが導入されてない場合はBonjour Print Services for Windowsを導入しましょう。
http://support.apple.com/kb/DL999
私のwindows8.1+iTunes11の環境ではRaspberry PiSSH接続しても切断されてしまう現象が発生しました。原因の突き止めはできてないのですが、Bonjour Print Services for Windowsをインストールしたところ現象が解消されました。


Tera Termを起動すると接続先を入力する画面がありますので、先ほどのIPアドレスを入力しましょう。
f:id:yuriai0001:20131229104707j:plain
SSH認証という画面が出てきます。Raspbianのデフォルトのidとpassは
id:pi
pass:raspberry
となりますので、それぞれ入力してください。下の画面が表示されると接続成功です。
f:id:yuriai0001:20131229104916j:plain

ここでRaspberry Piのデスクトップ画面を操作したい場合はVNC接続をする必要があります。VNCとはRFBプロトコルを使いコンピュータを遠隔操作するためのソフトウェアのことです。以下のようにホストOSからRaspberry Piデスクトップが利用できます。
f:id:yuriai0001:20131229110803j:plain
ここでもwindowsの場合は定番のVNCソフトウェアがあるのでDLして導入しましょう。
http://www.realvnc.com/download/viewer/

Raspberry PiVNCサーバーを導入する

TightVNCをRaspberry Piに導入します。Tera TermでSSH接続をしたRaspberry Piから
pi@raspberrypi ~ $ sudo apt-get install tightvncserver
インストールが完了したら起動します。
pi@raspberrypi ~ $ tightvncserver
パスワードを要求されますので入力しましょう。
f:id:yuriai0001:20131229100223j:plain
先ほどDLしたviwerを起動します。
Raspberry PiのIPにポート5901を指定
f:id:yuriai0001:20131229112834j:plain
初回の起動では、この通信は暗号化されておりませんという警告が出ると思います。
ここは再度表示しないにチェックを入れ先に進みます。
パスワードを要求されますので先ほど設定したパスを入力。
f:id:yuriai0001:20131229110803j:plain
無事に起動したでしょうか。
プロセスの終了(VNCを停止したい)の場合は以下のコマンドを入力します。
pi@raspberrypi ~ $ vncserver -kill :1
電子工作の場合はGUIはそこまで必要ないと思いますので、VNCを使う場合は都度起動ということにします。

config画面にいくには、
pi@raspberrypi ~ $ sudo raspi-config
で設定画面に行けます。


[Mac編]
[Mac]
Macの場合はターミナルからddコマンドを使用してもよいです。
dd[オプション]
if = <入力ファイル>
of = <出力ファイル>
df =<バイト> 出力するブロックサイズの指定

ターミナルを立ち上げて
$ df -h
と入力すると現在マウントされているデバイスが表示されます。

その後SDをスロットに挿入してもう一度、
$ df -h
を実行すると、SDがマウントされたのを確認してください。
おそらく、/dev/diskNsn(N,nは数値)のような形で出力されます。
例:/dev/disk4s1

その後、デバイスをアンマウントしてください。(N=4、n=1の場合)
$sudo diskutil unmount /dev/disk4
ただし、SDカードは刺したままです。

その後、ダウンロドードしたimgファイルをifオプションで指定してコマンドを実行。
書き込み完了まで気長に待ちます。
$ sudo dd bs=1m if=2015-05-05-wheezy-raspbian.img of=/dev/disk4

SSH接続先のアドレスを調べるためにwindowsではソフトウェアを使いましたが、Macでは同じくターミナルでnmapを使用しましょう。

Macのシステム環境設定→ネットワークを開き、接続済みネットワークを選択するとIPアドレスが表示されます。
IP アドレス 192.168.0.5 の時は
$nmap 192.168.0.1/24
この場合192.168.0.1 ~ 192.168.0.255までを調べます。

ターミナルに以下のような接続先が表示されますのでSSHで接続してください。
f:id:yuriai0001:20150619142313p:plain

$ssh pi@10.0.0.157
パスワードの初期設定はraspberryです。

vncで接続する場合は、windows編の

Raspberry PiVNCサーバーを導入する

と同じ作業を行ってください。

マックの場合はChicken of the VNCを使うと良いと思います。

Raspberry Piで温度センサー。部屋の気温を取得しよう

温度センサーを使って部屋の温度を取得してみましょう。

この記事を書いているのは冬なので今日は何度まで下がるのか等々、温度(気温)というのは人の生活において最も大切な指標の一つですね。今回はそんな気温をセンサーで取得してみましょう。

このグラフは21度に設定されたエアコンを入れてからの20分間の温度推移です。
f:id:yuriai0001:20131223190351j:plain
21度に向けて数値が上昇していってます。
f:id:yuriai0001:20131223234245p:plain

キットを購入していただいてる方は、温度センサーとセラミックコンデンサーを準備してください。

f:id:yuriai0001:20140513202451p:plain
回路そのものは、CDSの項目とほぼ同じです。
温度センサーは逆向きに取り付けないよう注意してください。また温度センサーの後ろにセラミックコンデンサーを取り付けます。温度センサーの両脇の足の後ろに取り付けます。このコンデンサーには極性はないのでどちら向きでも結構です。


コードもCDSで明るさを取得した際のものを流用すればいいのですが、今回の最終的な単位は℃なので返ってきたvalueの数値をもとにして変換する必要があります。温度センサーの仕様として電圧範囲は100mVから1.75V、0℃の時には500mVの出力電圧で温度の係数は10.0mV/℃つまり1℃につき10mV出力電圧が変化します。アナログセンサーとして利用しているMCP3002に関しては10bit(1024)ですので、

require 'pi_piper'
loop do
  value = 0
  PiPiper::Spi.begin do |spi|
    raw = spi.write [0b01101000,0]
    value = ((raw[0]<<8) + raw[1]) & 0x03FF
  end
  volt = (value * 3300)/1024
  degree = (volt - 500)/10
  puts degree
  sleep(1)
end

実行すると1秒ごとに現在の温度が表示されます。
この温度センサーは個体によって最大±4℃の精度と温度センサーとしてどうなんだというくらいに、大幅にずれる可能性があるみたいです。その場合には+25℃を基準にしてソフトウェアによる校正を入れてみてください。私がいくつか試した結果では、ほぼ問題なく21℃を示していました。結果をfloatで求めたい場合などは、ずれを均一化するため平均で数値を出すなどの工夫が必要になると思います。

部屋の温度はcsvで出力して表計算ソフトウェアで編集するのもよいでしょう。
CSVについての詳細はcodezineの記事が役に立ちます。
CSVファイルフォーマットの解説:CodeZine(コードジン)

Raspberry Piの入門本ではwebブラウザ経由で現在の温度や過去の温度をグラフで確認するというようなサンプルが多いので、ここでもやってみましょう。ただ、インターネット経由となるとその他多くの作業が必要になるため今回はLocalの範囲内とします。

webアプリのフレームワークといえばRuby on Railsですが、小さなアプリの場合はsinatraが適しているように思います。まずはチュートリアルに従ってHello Worldをやってみましょう。やり方は公式サイトに掲載されています。
http://www.sinatrarb.com/intro-ja.html
以下のコードを書いて

# myapp.rb
require 'sinatra'
get '/' do
  'Hello world!'
end

gemをインストールしましょう。
gem install sinatra
そして実行。
ruby myapp.rb

webブラウザを起動してアドレスバーに下記を入力すると、
http://localhost:4567

Hello world!と出力されてると思います。


さて、グラフの描写にはJavaScriptを使用したいと思います。ネットで調べて見たところ、Chart.jsが良さそうな感じです。
http://www.chartjs.org/


サンプルコードをそのまま使用しましたのでチグハグですが(時間あるときに修正します)。
sinatraのマニュアルに従いviewsというフォルダにindex.erbファイルを置きます。
index.erb

<!doctype html>
<html>
<head>
  <title>Line Chart</title>
  <script src="../Chart.js"></script>
  <script src="http://ajax.aspnetcdn.com/ajax/jquery/jquery-1.9.0.js"></script>
  <meta name = "viewport" content = "initial-scale = 1, user-scalable = no">
</head>
<body>
<input type="button" id="synch" value="load">
<div id="container">
<canvas id="canvas" height="450" width="600"></canvas>
</div>

<script>
$(function () {
     $('#synch').click(function () {
         $.ajax({
             type: 'GET',
             url: 'http://localhost:4567/graph',
             dataType: 'json',
             success: function (json) {
                 var ary = json;
                 var xaxis = [];
                 var yaxis = [];
                 for (var i = 0, l = ary.length; i < l; i++) {
                     if (i % 2 == 0) {
                         xaxis.push(ary[i]);
                     } else {
                         yaxis.push(ary[i]);
                     }
                 }
                 var lineChartData = {
                     labels: xaxis,
                     datasets: [{
                             fillColor: "rgba(220,220,220,0.5)",
                             strokeColor: "rgba(220,220,220,1)",
                             pointColor: "rgba(220,220,220,1)",
                             pointStrokeColor: "#fff",
                             data: yaxis
                         },

                     ]
                 }

                 var myLine = new Chart(document.getElementById("canvas").getContext("2d")).Line(lineChartData);

             },
             error: function () {
                 $('#container').append('<p>' + 'Error! something is wrong.' + '<p>');
             }
         })
     })
 })
</script>
</body>
</html>
require 'sinatra'
require 'sinatra/reloader'
require 'sinatra/contrib/all'
require 'csv'
require 'json'

def file_convert
  datatime=""
  CSV.foreach("./temp.csv","r") do |data|
     datatime = data
  end
  return datatime
end

get '/' do
  erb :index
end

get '/graph' do
 @message = "Hello Graph Page"
 content_type :json
  data = file_convert
  data.to_json
end

実行する前に、
gem install sinatra-contrib
をしてください。

アプリケーションを起動したら、
http://localhost:4567/にアクセスします。ボタンを押すとAjaxを使った通信によってcsvファイルに保存されている時間と温度がグラフ表示される仕組みです。
http://localhost:4567/graphにアクセスするとjson形式で値が出力されます。
f:id:yuriai0001:20140107182301p:plain
動くことには動きました。グラフのデザインを設定するにはオプションを設定する必要があります。
Chart jsのドキュメントを見て、ひとまず必要最低限のデザイン設定をしました。
http://www.chartjs.org/docs/
f:id:yuriai0001:20140128142443j:plain

[補足]
このマニュアルを公開してから随分と月日が経ちました。IoTがバズワードからようやく実際に利活用される段階まできている気がします。最近はIoTのバックエンド周りをサポートしてくれるサービスがちらほら出てきます。以下のリンク先をもその1つです。これを使えば、自前でネットワークの問題を解決する必要がなくなります。また視覚化も簡単ですね。
blog.mlkcca.com


以上で、キットの内容はすべてとなります。
パーツとして使いましたデータシート一覧が必要な場合はメールにてお問い合わせください。

またお時間があれば、番外編として圧電スピーカーで音階を奏でるもご覧ください。

【たぶん一番わかりやすい】Raspberry PiへのOS(Raspbian)インストール(周辺機器あり)

mrprc.stores.jp

Raspberry Piに接続するモニターやキーボード等周辺機器はありますか?

これの有無によってかなりやり方が違ってきます。
単純に周辺機器ありの場合から見てみましょう。
ない場合は、↓↓↓
【たぶん一番わかりやすい】Raspberry PiへのOS(Raspbian)インストール(周辺機器なし) - Raspberry Pi 電子工作

New out of Box Softwareをダウンロード

NOOBを使えばイメージングのソフトウェアを使うことなくRaspberry Piの初期設定が行えます。zip形式のファイルを解凍したらそのままSDにコピーしてください。
Raspberry Pi Downloads - Software for the Raspberry Pi

f:id:yuriai0001:20131212180044p:plain


SDのフォーマットが必要な場合SDアソシエーションのsdformatterを使用しクイックフォーマットをすればよいです。
https://www.sdcard.org/jp/downloads/formatter_4/

コピーが完了したらRaspberry Piに差し込んでmicroUSBケーブルと接続してください。
電源は5V 1Aなので何らかのアダプターを使ってください。
インストールするOSを選択する画面がでてきたらRaspbian(RECOMENDED)を選びます。
画面下部のLanguageはUKのままで大丈夫です。

f:id:yuriai0001:20131212185210j:plain

インストール作業に10分~15分必要です。
Raspbianが無事にインストールされるとraspi-configという初期設定のメニューが現れます。
まずは、Change User Passwordの項目でパスワードを変更します。
デフォルトでは
id:pi
Pass:raspberry
になっています。
変更が終わると4.を選んでください。
f:id:yuriai0001:20131213165235p:plain
f:id:yuriai0001:20131213175803p:plain
ja_JP.UTF-8の箇所でスペースキーを押して*がついたらEnterを押します。
ja_JP.UTF-8以外にも使う予定があれば複数選択しておくこともできます。
f:id:yuriai0001:20131214174108p:plain
ja_JP.UTF-8を選んでEnterを押します。
f:id:yuriai0001:20131214174417p:plain
設定が終わったらTabキーでOKを選択してEnterを押します。
トップ画面に移りますので再度この画面に戻ってきます。
今度はChange Timezoneを選択します。
f:id:yuriai0001:20131214174901p:plain
Asiaを選んで
f:id:yuriai0001:20131214175024p:plain
次は東京
f:id:yuriai0001:20131214175126p:plain
時間が設定されました。
最後にキーボードの設定を行います。
f:id:yuriai0001:20131214175233p:plain
Change Keyborad Layout
f:id:yuriai0001:20131225102112j:plain
Generic 105-key (Intl) PC
f:id:yuriai0001:20131225102226j:plain
Other
f:id:yuriai0001:20131225102303j:plain
Japanese
f:id:yuriai0001:20131225102335j:plain
Japanese
f:id:yuriai0001:20131225102400j:plain
The default for the keyboard layout
f:id:yuriai0001:20131225102847j:plain
No compose key
f:id:yuriai0001:20131225102449j:plain
No
これで完了です。
コンソール画面に戻ってきたら
$sudo apt-get update
$sudo apt-get upgrade
を実行しましょう。
NOOBの場合はSDのパーティション設定は不要です。

日本語入力のためi-busのanthyを導入します。
$sudo apt-get install ibus
$sudo apt-get install ibus-anthy
本体を再起動
$sudo reboot
再起動するとidと先ほど設定したpassを入力します。
一度、GUIを立ち上げてみましょう
f:id:yuriai0001:20131225152834j:plain
この画面で
$startx
とするとx-window systemが立ち上がりwindowsMacのようなデスクトップ画面で作業できます。
f:id:yuriai0001:20131225153325j:plain
midoriというブラウザがデフォルトで入っていますが、やっぱりRaspberry Piでのウェブブラウジングは遅くてきついものがあります。日本語も入力できるようにしておきましょう。
f:id:yuriai0001:20131225143854j:plain
一番左したにあるwindowsでいうスタートボタンをクリックします。
設定→IBusの設定
f:id:yuriai0001:20131225143854j:plain
インプットメソッドというタブがありますので写真のようにAnthyを選んで保存してください。Ctrl + spaceキーを押すと日本語入力に切り替えることができます。切り替え方法については一般のタブから設定することができます。
f:id:yuriai0001:20131225154403j:plain

Raspberry Piの為にモニター、キーボードなどの周辺機器を用意するのはもったいないですね。本体のみの場合も別途、パソコンを準備できれば単体のみでインストール可能です。また、一度周辺機器を使ってインストールしたが次回からは単体で操作したいという場合にはこちらをどうぞ。
↓↓
http://lchikaamazon.hatenablog.com/entry/2013/12/25/154950

Raspberry Piで計測したデータをEmailで送信する。

前回はフォトレジスタとADコンバーターを使ってRaspberry Piで部屋の明るさを計測しました。今回は取得したデータをある一定の条件の際に携帯電話に送信するお知らせ機能を追加したいと思います。

Raspberry Piシリアル通信

その前に前回出てきたコードを理解するにはシリアル通信の基礎知識が必要です。
SPIモジュール
上記のサイトで簡潔にまとめられているため、一度ご覧いただくとよいと思います。

require 'pi_piper'
loop do
  value = 0
  PiPiper::Spi.begin do |spi|
    raw = spi.write [0b01101000,0]
    value = ((raw[0]<<8) + raw[1]) & 0x03FF
  end
  puts value
  sleep(1)
end

先ほどのサイトの説明通り8ビット * 2の計16ビットの情報をMCP3002とRaspberry Piで交換しています。MCP3002から取得したデータを変数rawに代入。その後、ビットをシフトさせて必要な情報を取り出しvalueに代入してます。
基本的に商品のデータシートに説明書きがありますので事前に読んでみるとよいでしょう。これはMCP3002のデータシートの一部です。
f:id:yuriai0001:20140513212613j:plain
各ピンがどのような機能を持っているのかがわかります。
例えば、今回のコードで以下のデータを送っていますが、1bitは0、2bit目はスタートビットとして必ず1、SGL/DIFFビットでは1、次のビットでは今回はCH0を使っているので0,MSBFでは受け取るデータをMSBFにするため1としています。それ以降はDon't careのため0です。

 raw = spi.write [0b01101000,0]

f:id:yuriai0001:20140513212533j:plain

mcp3002データシート

条件を設定して測定した数値をメール送信する

Emailの送信にはActionMailerを使用します。
Ruby on Railsでは、標準になっているので、メールを受けるユーザーとして知らない間にあなたも必ず使ったことがあるというライブラリーです。今回は単体で使いましょう。
gemファイルを取得しましょう。
gem install actionmailer

クラスメソッドを通じて設定を行います。今回はGmailを使いました。
今回はただのテストということもありますし、セキュリティのことを考え新しくアカウントを作ります。

# -*- coding: utf-8 -*-
require 'pi_piper'
require 'action_mailer'

ActionMailer::Base.delivery_method = :smtp
ActionMailer::Base.smtp_settings = {
  address:   'smtp.gmail.com',
  port:      587,
  domain:    'smtp.gmail.com',
  user_name: 'gmailアカウント',
  password:  'gmailパスワード',
  authentication: 'plain',
}

class Pi_mailer < ActionMailer::Base
  def sendmail(body)
   mail(
      to:      '送信したいアドレス',
      from:    'gmailアドレス',
      subject: 'info from Raspberry Pi',
      body:    body.to_s
    )
  end
end

loop do
  value = 12
  PiPiper::Spi.begin do |spi|
    raw = spi.write [0b01101000,0]
   value = ((raw[0]<<8) + raw[1]) & 0x03FF
  end
  Pi_mailer.sendmail("部屋の明かりの値は#{value}です。").deliver
  sleep(60)
end

これでひとまず完成しました。ただ、このままだと60秒毎にメールが送られてきます。
Pi_mailer.sendmail().deliverの呼び出しに関して何らかの一定条件を加えたほうがよさそうです。

Rubyでの条件分岐の書き方がわからない場合、
条件分岐 - Ruby入門
このサイトをご覧いただくと良いです。

例えば、valueの値を比較し前回測定よりも300以上の上昇がある場合にはメールを出すという条件にしておけば、特に夜の場合は必ず何らかの明かりが点灯したと考えるのが妥当です。そこら辺の条件に付いては設置場所によっても違うのでご自身にあった設定を行ってください。このプログラムを稼働させておくと、誰かと一緒に暮らしている場合、何時に帰ってきたでしょ。なんてちょっと相手を驚かせることができるかもしれません。ただ、いたずらは程々にしましょう。信頼はRaspberry Piではプログラミングできません!

Raspberry Piで部屋の温度を取得

今回はセンサーにCDSを使いましたが、例えば、温度センサーや大気圧センサーを使いデータを取得することもできます。
では、次の章では比較的簡単で実用的な部屋の温度を取得してみましょう。
Raspberry Piで温度センサー。部屋の気温を取得しよう - Raspberry Pi 電子工作

ADコンバーターとフォトレジスタを使って部屋の明るさを取得しよう。

Raspberry Piは残念ながらアナログ入力ピンが搭載されていないため、
各種アナログセンサーを使った電子工作の際に不便です。
それを解決するために、今回はADコンバーターをブレッドボード上に設置します。
その後、明るさを取得出来るセンサーを使って部屋の明るさを取得しましょう。
さらに、ネットワークを使って部屋が明るくなった、もしくは暗くなった場合にお知らせのEmailを携帯に送信したりというような機能も追加します。

特定の使い方を想定しているわけではないですが、例えばリビングなどで可動させておくと外出中でも、誰か帰ってきたのかな?とわかる。なんていう使い方もできますね。まぁ、条件が限られてしまうので実用的かどうかはさておきですが・・。

f:id:yuriai0001:20131222134201j:plain
f:id:yuriai0001:20150524180432p:plain
MCP3002は半月型の凹みの位置をよく確認してください。
CDSセルに極性はないため、どちらの足を使っても問題ありません。

ちょっと複雑な形になりました!
これで回路図は完了です。


<重要:2014年12月2日>
電子部品キットに含まれる内容物をフォトレジスターからフォトトランジスターに変更しています。フォトトランジスターの場合はこちらを参照してください。


どのような仕組なのかというと、
フォトレジスターは明るさに応じて抵抗値が変化します。
そこで、MCP3002のCH0で値を取得してDin,Doutなどのピンから通信をすることによって、その変化をRaspberryPiで取得できます。その後、人間にもわかるように画面に出力しようという計画です。

では、さっそく取り掛かるにあたって、デフォルトでOFFになってるシリアル通信を有効化しましょう。ターミナルを起動して
$ sudo leafpad /etc/modprobe.d/raspi-blacklist.conf
テキストエディタが起動したら
#blacklist spi-bcm2708
blacklist i2c-bcm2708
のように#を入れてコメントアウトします。保存して終了したらRaspberryPiを再起動してください。

OSを起動したら再度ターミナルで、
$ ls -la /dev/spi*
とすると以下のようにデバイスが認識されてます。
crw------- 1 root root 153, 0 Jan 1 1970 /dev/spidev0.0
crw------- 1 root root 153, 1 Jan 1 1970 /dev/spidev0.1


前回と同じようにgemライブラリを使用します。
$ sudo gem install pi_piper
念のためgemがきちんとインストールされたか確認してみてください。
$ gem list
Local GEMSという一覧の中にpi_piper(1.3.2)があれば大丈夫です。

[Raspberry Pi2の場合]
$sudo raspi-config
を実行して変更できます。
8 Advanced OptionsからSPIを有効可して再起動してください。

f:id:yuriai0001:20150525084141p:plain
f:id:yuriai0001:20150525084152p:plain

pi_piperなのですが、bcm2835というRaspberry Piのライブラリーを使用しています。
Raspberry Pi2の場合は比較的新しいバージョンのbcm2835を使う必要があります。

レポジトリから直接gem installしてもpi_piperのlibbcm2835.imgが古いままなので動きません。
そこで、直接 githubからcloneしてbuildしてください。

$ git clone https://github.com/jwhitehorn/pi_piper
$ cd pi_piper
$ sudo gem build pi_piper.gemspec
$ sudo gem install pi_piper-2.0.beta.xx.gem
xxは最新のバージョンに対応した数字

今回のプログラムを保存するフォルダーを作りましょう
$ mkdir ruby_projects
では、LeafPadを起動してRubyのコードを作成していきましょう。

require 'pi_piper'
loop do
  value = 0
  PiPiper::Spi.begin do |spi|
    raw = spi.write [0b01101000,0]
    value = ((raw[0]<<8) + raw[1]) & 0x03FF
  end
  puts value
  sleep(1)
end

ライブラリーのおかげで、これだけです!
先ほど作ったフォルダにmcp3002.rbで保存しました。
ではターミナルを開きましょう。
$ cd ruby_project
$ sudo ruby mcp3002.rb
先ほどSPIを有効化しましたが、管理者でしか実行できないようにしてますので、sudoを入れて実行してください。条件にもよりますが、日中で蛍光灯を使ってる部屋なら700~800の値が1秒おきにターミナルに出力されると思います。プログラムを実行中にCDSセルを軽く手で覆うと数値が小さくなりますでしょうか。真っ暗な状態で0付近の値を取るのならば正しく稼働しています。

プログラムの中身の説明とEmailの送信は次の章で行いましょう。
Raspberry Piで計測したデータをEmailで送信する。 - Raspberry Pi 電子工作

ハック ラズベリーパイ Raspberry Pi2 スターターキット

ハック ラズベリーパイ Raspberry Pi2 スターターキット

スイッチを使ったLEDの点滅

mrprc.stores.jp

最後にスイッチを使ったLEDの点滅です。
スイッチを押せばLEDが点灯し、離すと同時に消えるというまさにスイッチの仕組みです。

今までのやり方のなかで既にコードをどのように書けばいいかわかっているはずです。
今回は自分で考えて見ましょう。
今回のプログラムを実現するための1つの考えとしては、このような形はいかがでしょうか。

1.スイッチの値を読み込みむ。

2.もし、値が1(もしくは0)の際にはLEDを点灯

3.それ以外は消灯

4.1~3をloopさせる。


いくつかの注意点として、

io.mode(pin, INPUT)

スイッチの入力に使うピンの宣言はINPUTになります。
LEDのGPIOピンに関してはOUTPUTでよいでしょう。
(wiringpiのバージョンによっては、INPUT,OUTPUTは定義されていませんとエラーが出力されます。)
その場合は、

いままでのいくつかのレッスンによってある程度自由自在に光が操れるようになったのではないでしょうか。
これからは自分でオリジナルのコードを色々と試してみましょう。

一息ついたら、LEDはいったん卒業として次の項目に進みましょう。