RASPBERRYPI応用研究(4) wiringPi導入

投稿者: | 2015年12月8日

ハードウェア部分の制作に先立ってソフトウェア側を一部検討したい。
今回のシステムではセンサー信号を入力していろいろな処理をするという事で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日つけっぱなしでも充電が切れない。
コンセント要らずで快適です。

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

[amazonjs asin=”B00TBKFAI2″ locale=”JP” tmpl=”Small” title=”Raspberry Pi2 Model B ボード&ケースセット (Standard, Clear)-Physical Computing Lab”]

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です