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

日々のスニペットや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 電子工作

圧電スピーカーで音階を奏でる

番外編圧電スピーカーで音階を奏でる。

すぐれたプログラマーになる過程で、いつかはC言語を学習することになります。ここで電子工作と一緒にC言語についても少しだけ触れてみましょう。今回は圧電スピーカを使って音階を奏でることにします。ここでもまずは、wiringPiを使います。

以前はRubyのライブラリーとして使ったwiringPiなのですが、今回はC言語です。本来のオリジナルプログラムはC言語で書かれています。それをRubyでも使えるようにされていたのですね。他の言語で書かれたライブラリーを目的の言語でも使えるように作られたプログラムをラッパーなどといいます。食品を保存するときに使うあのラップですね。既存の言語をターゲットの言語で覆い包んでしまうイメージです。

説明はこれぐらいにして、wiringPiをインストールしましょう。
gitがインストールされてない場合はインストールします。
pi@raspberry sudo apt-get install git-core

gitを使ってwiringPiをインストール。
pi@raspberry git clone git://git.drogon.net/wiringPi

pi@raspberry cd wiringPi
./build

buildと入力することによって、C言語ソースコードコンパイルします。

今回は、作者のサンプルプログラムをそのまま拝借して動かしてみましょう。
tone.cというファイルを作成します。
pi@raspberry vi tone.c

/*
 * tone.c:
 *	Test of the softTone module in wiringPi
 *	Plays a scale out on pin 3 - connect pizeo disc to pin 3 & 0v
 *
 * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
 ***********************************************************************
 * This file is part of wiringPi:
 *	https://projects.drogon.net/raspberry-pi/wiringpi/
 *
 *    wiringPi is free software: you can redistribute it and/or modify
 *    it under the terms of the GNU Lesser General Public License as published by
 *    the Free Software Foundation, either version 3 of the License, or
 *    (at your option) any later version.
 *
 *    wiringPi is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *    GNU Lesser General Public License for more details.
 *
 *    You should have received a copy of the GNU Lesser General Public License
 *    along with wiringPi.  If not, see <http://www.gnu.org/licenses/>.
 ***********************************************************************
 */

#include <stdio.h>
#include <errno.h>
#include <string.h>

#include <wiringPi.h>
#include <softTone.h>

#define	PIN	5

int scale [8] = { 262, 294, 330, 349, 392, 440, 494, 525 } ;

int main ()
{
  int i ;

  if (wiringPiSetup () == -1)
  {
    fprintf (stdout, "oops: %s\n", strerror (errno)) ;
    return 1 ;
  }

  softToneCreate (PIN) ;

  for (;;)
  {
    for (i = 0 ; i < 8 ; ++i)
    {
      printf ("%3d\n", i) ;
      softToneWrite (PIN, scale [i]) ;
      delay (500) ;
    }
  }
}

この圧電スピーカーは極性を意識しなくても問題ありません。
そして、今回もコンパイルします。今回はファイルの出力名等々を指定します。
pi@raspberry cc -o myprog tone.c -lwiringPi -lpthread
pi@raspberry ./myprog

LEDの時と同じ回路を作り音を鳴らすと音階が流れました。


f:id:yuriai0001:20131203183709p:plain

C言語を使った工作として最後にサーボモータを動かしてみましょう。
http://lchikaamazon.hatenablog.com/entry/2014/12/21/153644