7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Raspberry Pi2でフォトトランジスタの値を読む

Last updated at Posted at 2016-01-21

環境情報

Raspberry Pi2 Model B
OS: Raspbian JESSIE
A/Dコンバータ:MCP3002
Python 2.7

目的

Raspberry Pi2 のSPIフォトトランジスタの値をA/Dコンバータを利用して取得し、暗くなったらLEDを点灯させる

用語の説明

SPI通信とは

シリアル・ペリフェラル・インタフェースの頭文字をとってSPI通信と呼び、少ないピンでデータをやり取りする低速インタフェース。
4つの端子で構成される。

SCK・・・Serial Clock
MISO・・・Master In Slave Out
MOSI・・・Master Out Slave In
SS・・・Slave Select

A/D変換とは

アナログ→デジタル変換のことであり、アナログとは連続値でありデジタルとはあるタイミングのスナップショット値のようなもの。
電圧の変化などのアナログ値を、デジタル数値に変換するチップをA/Dコンバータと呼ぶ。

回路

回路は、回路図を用意できないので写真で。。

IMG_1863.jpg

MCP3002のつなぎ方は、データシートを参考にした。

はまりポイント

プログラムを記載して実行してみたが、一向に値が変わらない現象があったが、その理由はVss端子が+(3.3V)につながっていたためで、GNDにつないだことで、値が得られるようになった。

プログラム

pi-spidev のインストール

pi-spidevは、PythonでSPI通信を利用するためのPythonモジュール。以下のコマンドで利用可能となる。

$ git clone git://github.com/doceme/py-spidev
$ cd py-spidev
$ sudo python setup.py install

データ取得処理

Pythonでの実装は、GPIOとpy-spidevを利用してフォトトランジスタの値が、10を下回ったらLEDを点灯させることを実現する。
以下が、実際のPythonプログラム。


#!/usr/bin/env python
# Read the analog sensor value via MCP3002
# -*- coding: utf-8 -*-

import RPi.GPIO as GPIO
import spidev
import time
import subprocess

def ledFlash(num):
    if num < 10:
        GPIO.output(LED , GPIO.HIGH)
    else:
        GPIO.output(LED , GPIO.LOW)
    return


GPIO.setmode(GPIO.BCM)
LED = 25
GPIO.setup(LED , GPIO.OUT)

# opne SPI device 0.0

spi = spidev.SpiDev()
spi.open(0 , 0)

try:
    while True:
        resp = spi.xfer2([0x68, 0x00]) ・・・ポイント①
        value = (resp[0] * 256 + resp[1]) & 0x3ff ・・・ポイント②
        print value
        ledFlash(value) ・・・ポイント③
        time.sleep(0.2)
except KeyboardInterrupt:
    spi.close()


GPIO.cleanup()


  • ポイント①
     MCP3002へのインプット信号は、コンバータの仕様として以下となる。
     CH0 から取得する場合 0b01101000、0b00000000 (2進数)
    CH1 から取得する場合 0b01111000、0b00000000 (2進数)
    spidev.xfer2メソッドに上記の16進数を渡している。

  • ポイント②
    resp (応答)から、応答を受け取って(10bit)取得して値をGET
    ※ここはもう少し詳しくなんでこういう計算式なのか理解する必要あり

  • ポイント③
     用意しておいたLEDの点滅メソッドに値を引数にして渡している
     メソッド内では、値が10以下になったらLEDを光らせている。(部屋が結構暗かったので通常で、16-17の値だったので、10に設定しているがここは光らせたい閾値を変えれば良い)

参考になった記事

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

自分の部屋の温度をロギングしてみました。

7
6
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?