Skip to content

Instantly share code, notes, and snippets.

@sean2121
Last active April 15, 2018 03:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sean2121/61c1c74b01c668ffe95818c97c13ecee to your computer and use it in GitHub Desktop.
Save sean2121/61c1c74b01c668ffe95818c97c13ecee to your computer and use it in GitHub Desktop.
IoTシステムをRubyで作ろう!GR-CITRUSでセンサープログラミング

必要なもの

  • Windows or Mac
  • GR-CITRUS、WA-MIKAN
  • マイクロUSBケーブル
  • ブレッドボード
  • ジャンパワイヤー(オスオス)
  • LED
  • CDSセル
  • 抵抗
  • 温湿度センサーモジュール

環境構築

参加案内に記載していたようようにVisual Studio CodeとプラグインのRubicを利用します。
VS Codeの機能拡張からRubicを選択しインストールします。

Rubicのボードカタログ設定メニューでは以下の画像のようにアコーディオンメニューを選択します。接続テストは失敗との警告がでることがありますが、その場合は接続テストに成功しないままファームウェアを書き込みに進んでください。  

テスト

環境構築のテストとしてシリアル通信で文字を出力したいと思います。
main.rbに以下ので作成します。

usb = Serial.new(0)
usb.println("Hello World")

GR-Citrusのクラス、メソッド早見表がルネサスのサイトに掲載されているので、以降参考にしてください。
http://gadget.renesas.com/ja/product/citrus_sp1z.html

ファームウェアのソースはgithub上で確認できます。
https://github.com/wakayamarb/wrbb-v2lib-firm

Lチカから始めよう

LチカとはLEDチカチカの略です。 電子工作分野におけるHello Worldのようなものです。

ブレッドボードの使い方

ブレッドボードは実験、試作用によく使われる基盤です。 パーツを差し込むだけで使えます。 下部の図のような形で内部はつながっています。

画像引用:https://tool-lab.com/make/macpic-startup-6/

Lチカやる前にまずはLピカから

まずはLEDを光らせるための回路を作っていきます。
GR-CITRUSの電源電圧(3.3V)-> 抵抗 -> LED -> GNDになるように回路を作ります。          

画像引用:https://tool-lab.com/make/macpic-startup-6/

LEDの足には長い方、短い方があります。図のように+側に長い方、マイナス側に短い方を配置します。

抵抗は220Ωもしくは270Ω。
オームの法則I=E/Rより抵抗値を上げると電流量が小さくなりLEDは暗くなります。

抵抗は色によって数値を判断します。
以下のリンクから確認できます。
http://sec-suzuki.com/newpage337.htm

Lチカ

マイコンの周辺機能として、汎用I/Oポート(GPIO)がありオン、オフのデジタル信号の入出力端子として扱われます。 Lチカに入る前に、GR-CTIRUSのポートの仕様を確認しておきましょう  

LEDを操作するにはdigital Write/Readのピンを選択します。今回は12です。  

led = 12
pinMode(led, 1)
10.times do
  digitalWrite(led, 0)
  #delayの単位はミリセカンド
  delay(1000)
  digitalWrite(led,1)
  delay(1000)
end

画像引用:https://tool-lab.com/make/raspberrypi-startup-22/

引用なのでRaspberryPiと書いちゃってますが・・・。
この回路図のようにスイッチの動作をプログラムで制御することでLEDへ電気の流れを作りだします。  

LEDの明るさを制御する

LEDの明るさ調整はPWM(Pulse Width Modulation) を利用した以下のコードで可能です。
ごく短い間にON,OFFの出力を素早く交互に行うことでパルス幅に比例した電圧を作りだしています。  

画像引用:https://tool-lab.com/make/pic-app-2/     

以下にPWMによる明るさ制御のコード例を示します。

pinMode(12, OUTPUT)

val = 0
direction = 1

loop do
  pwm(12, val)
  #PWMの比率 0~255
  val = val + direction
  direction = 1 if val == 0
  direction = -1 if val == 255
  delay (5)
end

analogReadとCdSセルで照度センサ

CdSセルを使って照度を使った工作をやっていきたいと思います。
CdS(硫化カドミニウム)を主成分とするこのパーツは明るさに応じて抵抗値が変化する特性があります。(明るいと抵抗値が低くなり、暗いと抵抗値が高くなる)
そして、GR-Citrusではピンから入力電圧を計測することができます。
これらを利用して部屋の明るさを判断できる照度センサーを作りたいと思います。

回路設計

まずは、CdSの動作を理解するために、LEDを使った実験を行います。
  蛍光灯が光る明るいオフィスの環境でCdSの抵抗値をテスターで計測すると1.3kΩでした。

この時R2の電圧はR2 / (R1 + R2) に電源電圧3.3Vをかけた式で求めることができます。
R1に2kΩの抵抗を利用すると先ほどの式より、1.3vとなりLEDは点灯しません。

しかし、手で覆うなどしてCdS抵抗値をあげるとLEDにかかる電圧が高くなりLEDが点灯することになります。点灯はしますが電流量が少ないため、ごくわずかに光る程度です。

電圧計測

簡単な実験を経由しましたが、analogReadを使えばGPIOを通じて電圧の変化をリアルタイムに測定して出力することができます。

usb = Serial.new(0)
pinMode(14, 0)
analogReference(2)
100.times do
    usb.println(analogRead(14).to_s)
    delay(500)
end

SHT31-DIS 温湿度モジュール

では、今日の本題。
温湿度センサーモジュールの使い方を解説します。

まずは、センサーとマイコンでI2C(アイスクエアドシー)を利用して通信しますので簡単に理解する必要があります。

I2C通信のプロトコルについて

以下のリンク先でI2Cのプロトコルについてざっくりと理解できます。
http://www.picfun.com/c15.html

SHT31-DISの仕様書

(日本語) http://akizukidenshi.com/download/ds/sensirion/Sensirion_Humidity_Sensors_SHT3x_DIS_Datasheet_V3_J.pdf (英語) http://akizukidenshi.com/download/ds/sensirion/Sensirion_Humidity_Sensors_SHT3x_Datasheet_digital_V4_E.pdf

プロトコルと温湿度センサの仕様を理解したら実際にコーディングしていきます。   以下はサンプルプログラムです。

#スレーブのアドレス
I2C_ADDR = 0x45
#データシートの設定条件より
COMMAND = 0x2400


usb = Serial.new(0)
#引数は初期化する通信ポート(SDA/SCL)
wire = I2c.new(0)

10.times do
  #書き込み準備の開始
  wire.begin(I2C_ADDR);
  #コマンドMSB部
  wire.lwrite(COMMAND>>8);
  #コマンドLSB部 0xFFにてマスクする。0xFF.to_s(2) => 11111111
  wire.lwrite(COMMAND&0xFF);
  #I2C通信。wire.endでスレーブに送信する
  wire.end

  #スレーブからデータを受信する
  wire.request(I2C_ADDR,6)
  data = []
  num = 0
  while wire.available != 0 do
    data[num] = wire.lread
    num += 1
  end

  #データシートの式から温度と湿度を計算する
  temp = -45.0 + (175.0 * ((data[0] * 256.0) + data[1]) / 65535.0)
  humidity = (100.0 * ((data[3] * 256.0) + data[4]) / 65535.0)
 
  
  #コンソールに出力する
  usb.println("T : #{temp.to_s}")
  usb.println("RH : #{humidity.to_s}")
  usb.println("+++++++++++++")
  delay(1000)
end

自分自身のプロジェクトを作る

ここからはCdSもしくは照度センサなどで取得したデータを使って自由に自分自身のプロジェクトを作成してください。 準備しているセンサーは以下のものです。(数に限りがあります)
Webと組み合わせると面白いことができるかもしれません。

WA-MIKAN

WA-MIKANを使えばネットワークアクセス、MicroSDカードが使えます。

usb = Serial.new(0)

System.useWiFi
WiFi.setMode 1
WiFi.connect "SSID", "PASS"
usb.println(WiFi.ipconfig)
WiFi.disconnect

WiFiクラスのメソッド確認はルネサスの早見表をご覧ください。
http://gadget.renesas.com/ja/product/citrus_sp1z.html

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment