RASPBERRYPI応用研究(4) wiringPi導入


ハードウェア部分の制作に先立ってソフトウェア側を一部検討したい。
今回のシステムではセンサー信号を入力していろいろな処理をするという事でI/Oからの入力をラズパイ側に取り込む必要がある。合わせてリレーをOn/Offする為に出力ポートをコントロールする事も必要である。

入力としてはセンサー1~4の4点とトグルスイッチ1点の計5点
出力はとりあえずリレーの2点だが、残りのポートは出力ポートとして事にする。
RaspberryPiではGPIOというらしい。
GPIOは兼用ピンも含めると結構あり21個あり今回のシステムでは十分間に合う。
コネクタ1とコネクタ5に跨ってあるが、今回はコネクタ1のGPIOを使う事にする。
ネットや参考本ではPythonを使ったサンプルが多いようだが、いまさらPythonを習得する気にもならないのでCで書くことにした。

C言語でGPIOにアクセスする方法はいくつかあるが、wiringPiという便利なライブラリーがあるようなので此れを活用することで色々面倒な部分を省くことができそうだ。

waringPi導入

$ git clone git://git.drogon.net/wiringPi

Cloning into 'wiringPi'...
remote: Counting objects: 929, done.
remote: Compressing objects: 100% (759/759), done.
remote: Total 929 (delta 661), reused 218 (delta 142)
Receiving objects: 100% (929/929), 290.00 KiB, done.
Resolving deltas: 100% (661/661), done.

$ cd wiringPi
~/wiringPi $ ./build

wiringPi Build script
=====================
WiringPi Library
[UnInstall]
[Compile] wiringPi.c
[Compile] wiringSerial.c
[Compile] piHiPri.c
[Compile] wiringShift.c
[Compile] piThread.c
[Compile] wiringPiSPI.c
[Compile] wiringPiI2C.c
[Compile] softPwm.c
[Compile] softTone.c
[Compile] mcp23008.c
[Compile] mcp23016.c
[Compile] mcp23017.c
[Compile] mcp23s08.c
[Compile] mcp23s17.c
[Compile] sr595.c
[Compile] pcf8574.c
[Compile] pcf8591.c
[Compile] mcp3002.c
[Compile] mcp4802.c
[Compile] mcp3004.c
[Compile] mcp3422.c
[Compile] max31855.c
[Compile] max5322.c
[Compile] sn3218.c
[Compile] drcSerial.c
[Compile] wpiExtensions.c
[Link (Dynamic)]
[Install Headers]
[Install Dynamic Lib]
WiringPi Devices Library
[UnInstall]
[Compile] ds1302.c
[Compile] gertboard.c
[Compile] maxdetect.c
[Compile] piNes.c
[Compile] piFace.c
[Compile] lcd128x64.c
[Compile] lcd.c
[Compile] piGlow.c
[Link (Dynamic)]
[Install Headers]
[Install Dynamic Lib]
GPIO Utility
[Compile] readall.c
[Compile] pins.c
[Compile] gpio.c
[Link]
[Install]
All Done.
NOTE: To compile programs with wiringPi, you need to add:
-lwiringPi
to your compile line(s) To use the Gertboard, MaxDetect, etc.
code (the devLib), you need to also add:
-lwiringPiDev
to your compile line(s).

これでソフトウェア開発の準備は大体整いました。
wiringPiのおかげで面倒なコーディングは無しにGPIOの制御ができるようになりました。
wiringPiで使用する関数などは

  • WiringPiの初期化 wiringPiSetupGpio();
  • GPIOピンのモード設定 pinMode([GPIOピン番号], [モード]);
    [モード]にはOUTPUT or INPUT
  • GPIOピンの出力 digitalWrite([GPIOピン名番号], [値]);
    [値]に0か1を指定。
  • GPIOピンの入力 digitalRead([GPIOピン名番号]);
    戻り値 GPIOピンの現在の値。

これらの関数で事足りそうです。

本当はセンサーの取り込みは割り込みなどを使ったほうが良いと思うが今回は簡単に出来るポーリング方式にした。
チップのマニュアルなど参照する気にもならないし・・・

割り込み処理は次のステップでって事にしておきます。

メール送信スクリプト

それとメールはCだと面倒なのでperlで書いてsystem関数で起動する感じで逃げる。

とりあえずメール送信のperlスクリプトを作ってみました。
恥ずかしいですがソースは

use strict;
use 5.10.0;
use Encode;
#my %h;
$h{System_coding} = ‘UTF-8’;
$h{SMTP_SERVER} = “127.0.0.1”;
$h{MAIL_FROM} = ‘from@testtest.com’;
$h{to} = $ARGV[0] || ‘to@testtest.com’;
$h{subject} = “Mail Test”;
$h{txt} = <<TEXT;
人感センサーが侵入検知しました。
(センサー番号1)
TEXT
#
# test program
#&send_mail(\%h);

#メールの送信

sub send_mail {
my $h = shift;
my $txt = $h->{txt};
Encode::from_to($txt, $h->{System_coding}, ‘iso-2022-jp’);

# ヘッダ生成
my $subject = $h->{subject};
Encode::from_to($subject, $h->{System_coding}, ‘iso-2022-jp’);
Encode::encode(‘MIME-Header-ISO_2022_JP’, $subject);
if (!ref($h->{to})) { $h->{to} = [ $h->{to} ] }
my $to = join(‘,’, @{$h->{to}});
my $header =<<TEXT;
From: $h->{MAIL_FROM}
To: $to
Subject: $subject
Mime-Version: 1.0
Content-Type: text/plain; charset = “ISO-2022-JP”
Content-Trensfer-Encoding: 7bit
TEXT

# SMTP
require Net::SMTP;
my $smtp = Net::SMTP->new($h->{SMTP_SERVER});
$smtp->mail( $h->{MAIL_FROM} );
$smtp->to( @{ $h->{to} } );
$smtp->data();
$smtp->datasend($header);
$smtp->datasend($txt);
$smtp->dataend();
$smtp->quit;
}

こんな感じ。
今回はここまで。

raspbrreyPiの電源について

本編からそれますがRaspberryPiの電源について

ラズパイを楽しんでいる皆さんは電源どうしてますか?
適当なUSBアダプタなど使っている方が多いのでしょうか。

私も一時期はスマフォの充電器やらいろいろ使用していましたが、最近ではモバイルバッテリーで済ましています。
10400mAhのものですが結構持つもので1日つけっぱなしでも充電が切れない。
コンセント要らずで快適です。

モバイルバッテリーを余らしている人にはお勧めです。

RaspberryPi応用研究(2) 回路図の見直し


部品の調達が完了するまでラズパイ側のインストールや設定等を行おうと思っていたが、とりあえずELPAの受信機を分解してみた。
センサー信号をどこから取り出すか確認するためだ。
LEDの駆動はボンディングのコントローラーから直接行われているようで、基板のパターンを追っていくとどうやら初めの目論見どおりではなく吐きだしでLEDを駆動しているようである。

kiban

またLEDとスイッチ用のポートが共通なので入力兼出力ポートとして使われているようだ。
と言うわけで前回の回路図を少し修正する必要がある。

ELPAのセンサーから直接フォトカプラを駆動するような回路からデジトラを挟みデジトラでフォトカプラを駆動するように修正した。

Pi2

もしかしたらプルダウン抵抗が必要になるかもしれない。
部品は8割がたそろったがデジトラが売り切れで手に入らなかったので不足分については電車代より送料の方が安いし他に秋葉原に用事もないので通販で購入予定です。

RaspberryPi応用研究(1)


RaspberryPi(以下ラズパイ)で簡易セキュリティシステムを構築する

超小型のLinux実行環境であるラズパイであるが安価だしいろいろな使用用途が考えられる。
本来の目的でもある教育用としても使えるしLinuxが動作するので小型のサーバーとしても使用できる。世界中のユーザーの中にはラズパイで小型のスパコン(もどき)を作ってしまう人もいるようだ。
技術ヲタとしてはスパコンとか超面白いのだが実用性が皆無。作って満足、燃え尽きる可能性は否めない。いやきっとそうなるだろう。
雑誌などの記事でLEDを点灯させるとかあるが、それもまた同様、動いて満足な感じになってしまうと思う。
そこで以前実用的な何かできないかと考え出た結論がセコム的なもの、簡易セキュリティシステムだ。
なかなか実現できずにいたがようやく時間がとれそうなのでいよいよ着手することにした。
思考錯誤の末、機能として次のようなものを実装できそうだ。

  1. 人感センサーの信号を受けmailで知らせる。
  2. mailで知らせると同時にリレー出力する。(パトランプ等に)
  3. 夜間不定期に室内の電灯をリモコンでON/OFFする。

一応、安価にできそうな機能だけに絞った。
これらを実現するために必要なものとして

  1. ラズパイ本体+SDカード
  2. ELPAのワイヤレス人感センサーと受信機
  3. ユニバーサル基板と電子部品
  4. これらを入れるケース

が必要である。

IMG_5909

 

Raspberry Pi Type B 512MB
ELPA ワイヤレスチャイム センサー送信器 増設用 EWS-03
ELPA ワイヤレスチャイム ランプ付き受信器 増設用 EWS-20

電源周りが比較的高くつきそうだが家の安全を考えれば安いもんだ。
さて今回は大体の回路図を考えてみたい。
ELPAの受信機はセンサーを4台取り付けられ、それぞれ検知するとLEDが点灯する。このLEDを駆動するトランジスタの信号を横取りしフォトカプラを介しラズパイのGPIO1-4に取り込む。
通常HでLになったら人感センサーが反応したことになる。
入力はこれだけ。
リレーの駆動はRN1202等のデジトラで。ラズパイの出力ポートでON/OFFを制御する。
とりあえず2つリレーを載せておくことにする。
リモコンはフォトトランジスタをリモコンの波形パターンで真似てIRで出力するだけ。または面倒なら学習リモコンのスイッチを外部から入り切りすることで行う。
(またどうするか決まってない。)

最後に電源周り。
ラズパイは5V電源があればOKだが受信機は4.5V.または電池3本である。
三端子レギュレータなどを使えば安くすむのだが、発熱対策など面倒なのでDC-DCを使っちゃうことにした。
これば目的に電圧が出せればOKである。

で回路図はこんな感じ。

Pi

すでにラズパイとEUPAの受信機、センサー類は手元にある。
ちなみに手持ちのラズパイは旧タイプ。
しかし他の部品は久しく電子工作をしてないので殆どない。
というわけで近所では部品が調達できないなので久しぶりに秋葉原へGoである。