◇raspi3お手軽試験キットで、LEDランプ点滅、センサー値取得
- GrovePiをRasPi3に乗せる
- サンプルプログラムをダウンロードする
- I2Cを有効にする
- LEDモジュールをD4ポートに挿す
- プログラムを動かす ---
- ポートの配置
- スターターキットに入っているモジュール ---
- センサー類
GrovePi+スターターキットをRasPi3で動かす
RasPiにお手軽にコネクタ式LEDモジュールやセンサーモジュールを繋ぐためのボード
- GrovePi+ Starter Kit
コネクタ式になっており、ハンダ付けは不要です。
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になることがあります
| 固定リンク

