« ◇USB-シリアル-Python/Java:Raspi/Ubntu/WIn | トップページ | Tomcat-Jersey2でREST:臨時メモ »

◇raspi3お手軽試験キットで、LEDランプ点滅、センサー値取得

さしあたってRaspi3でLED点滅/センサー値取得まで。

 GrovePi+スターターキットをRasPi3で動かす

RasPiにお手軽にコネクタ式LEDモジュールやセンサーモジュールを繋ぐためのボード

  • GrovePi+ Starter Kit
をRasPi3に'乗せて'動かしてみました。

コネクタ式になっており、ハンダ付けは不要です。

 GrovePiをRasPi3に乗せる

GrovePi+をRasPi3に乗せます。
RasPi3のGPIOピンがGrovePiのメスポートに挿さるようにします。 ピンの端を合わせます。ボードそのものは少しずれたような形になります。

正しく挿さると、GrovePiのPWRランプが点きます。
(キットを挿す時は電源を落として、挿した後でランプを確認します)

 サンプルプログラムをダウンロードする。

GitHub https://github.com/DexterInd/GrovePi からサンプルプログラムをダウンロードします。

右側の[Clone or Download]をクリックして出るダイアログで [Download ZIP]を選べば、GrovePi-master.zipがダウンロードされます。
これを展開するとサンプルプログラムが得られます。

[Clone or Download]が表示されていない場合左の「<>Code」をクリックすると表示されます。

今回はこれを/project/GrovePi/に展開しました。
Pythonのサンプルは/project/GrovePi/Software/Python下に置かれます。

 I2Cを有効にする

I2Cはシリアル通信の方式で、GrovePiのモジュールを動かすにはこれを有効にしておく必要があるようです。

i2c-toolは最初から入っているようですが、念のため

sudo apt-get install i2c-tools

初期設定画面を起動します。これは本体ではなくTeraTermでも可能です。

sudo raspi-config

Advanced Optionを選びます。

I2Cを選びます。

"はい"を選びます。

その後、幾つかの画面を肯定的に進み、最後にrebootします。

 LEDモジュールをD4ポートに挿す

[Grove - Red LED]を袋から取り出し、LEDの足をモジュールの所定の場所に取り付け、 ケーブルで、キットのD4ポートに接続します。

LEDの足には+-があります。逆にすると光りません。もしプログラムを動かして光らない場合は挿しかえて確認します。

 プログラムを動かす

LEDを点滅させるpythonプログラムを動かします。

cd /project/GrovePi/Software/Python
sudo python grove_led_blink.py

プログラムは次のようになっています。

# -*- coding: utf-8 -*-
import time
from grovepi import *
led = 4 # LEDが port D4 にあるものとしています
pinMode(led,"OUTPUT")
time.sleep(1)
print ("Connect the LED to the port labele D4!" )
while True:
    try:
        #Blink the LED
        digitalWrite(led,1)		# Send HIGH to switch on LED
        print ("LED ON!")
        time.sleep(1)
        digitalWrite(led,0)		# Send LOW to switch off LED
        print ("LED OFF!")
        time.sleep(1)
    except KeyboardInterrupt:	# Turn LED off before stopping
        digitalWrite(led,0)
        break
    except IOError:				# Print "Error" if communication error encountered
        print ("Error")

 ポート配置/ポート割り当て

ポートは次の様に配置されています。

  • デジタル入出力ポート×7:D2~D8
  • アナログ入出力ポート×3:A0~A2
  • I2Cポート×3:I2C-1~I2C-3
  • GrovePi用シリアルポート×1
  • RasPiにつながるシリアルポート×1

同番号のポート(例えばA2とD2)が同時に使えるかどうかは未だわかっていません。

 ポートとモジュール

スターターキットで用意されているモジュールは次のものです。

アナログ入出力ポートにつながるモジュール
 ロータリー角度センサー(ボリューム)
 照度計
 騒音計

デジタル入出力ポートにつながるモジュール
 ブザー
 ボタン
 LED (赤/青/緑)
 リレー
 超音波距離計
 温度湿度計
(なぜかD2でしか動かない)

I2Cポートにつながるモジュール
 RGBバックライト付キャラクタディスプレイ

 その他センサー類を使ってみる

次のプログラムで色々なセンサー情報を読み込んでみました。
各センサの値を1秒に1回表示し、LEDランプ2個が交互に点滅します。 ボタンを押すと終了します。

# -*- coding: utf-8 -*-
import threading
import serial
import time
import sys
import grovepi

# 装置設定
LIGHT_SENSOR = 0 # A0 照度計
SOUND_SENSOR = 1 # A1 騒音計
DHT_SENSOR   = 2 # D2 温度湿度計(なぜかD2以外では動かない)
US_RANGER    = 3 # D3 超音波距離計
BUTTON       = 4 # D4
LED1         = 5 # D5
LED2         = 6 # D6
grovepi.pinMode(LIGHT_SENSOR,"INPUT")
grovepi.pinMode(SOUND_SENSOR,"INPUT")
grovepi.pinMode(LED1,"OUTPUT")
grovepi.pinMode(LED2,"OUTPUT")
grovepi.pinMode(BUTTON,"INPUT")
grovepi.digitalRead(BUTTON)     # 空読みが必要

class SensorThread(threading.Thread):
   def __init__(self):
      super(SensorThread, self).__init__()
      self.stop_flag = False
   def run(self):
      try:
         self.on_off = False
         while ( not self.stop_flag ):
            light  = grovepi.analogRead(LIGHT_SENSOR)
            sound  = grovepi.analogRead(SOUND_SENSOR)
            [t,h]  = grovepi.dht(DHT_SENSOR,0)
            urange = grovepi.ultrasonicRead(US_RANGER)
            print("明かるさ:%d 音量:%d 温度:%d 湿度:%d 距離:%d" \
                  %(light,sound,t,h,urange))
            for i in range(0, 20):
               if( grovepi.digitalRead(BUTTON) ):
                  print "BUTTON PRESSED"
                  self.stop_flag = True
                  break
               time.sleep(0.05)
            grovepi.digitalWrite(LED1,self.on_off)
            self.on_off = not self.on_off
            grovepi.digitalWrite(LED2,self.on_off)
      except IOError:
         print ("Error")
def main():
   sensor = SensorThread()
   sensor.start()
if __name__ == '__main__':
   main()

  • grovepiはGrovePi/Software/Python/grovepi.pyをこのソースファイルを置いたフォルダにコピーしてimportしています
  • この例ではThreadを使っていますが、単純にグローバルなwhileループの中でも動きます。 (取得データを別スレッドで送信する機能が付いていたのを省略したのでこのような形となっています。)
  • 温度湿度計はD2以外では動きませんでした
  • 超音波距離計は正確な値がとれていません
  • ボタンは最初に空読みをしないとONで始まることがあるようです。とても不安定で触ってなくてもONになることがあります

|

« ◇USB-シリアル-Python/Java:Raspi/Ubntu/WIn | トップページ | Tomcat-Jersey2でREST:臨時メモ »

トラックバック


この記事へのトラックバック一覧です: ◇raspi3お手軽試験キットで、LEDランプ点滅、センサー値取得:

« ◇USB-シリアル-Python/Java:Raspi/Ubntu/WIn | トップページ | Tomcat-Jersey2でREST:臨時メモ »