概要

ここではGR-CITRUSのmrubyフレームワークを使用したセンシングについて説明します。


準備

ハードウェア

GR-CITRUS、USBケーブル(マイクロBタイプ)、ジャンパワイヤー、ブレッドボード、センサーモジュールを準備します。センサーは体験するものだけでOKです。 ブレッドボードの大きさは写真のようにGR-CITRUSにUSBケーブルが接続されることを考慮し、大き目のものであれば1つ、小さめのものであれば2つあるとよいです。

ワイヤーは1つのセンサーモジュールに対して4本~5本必要です。照度センサー(フォトトランジスタ)の場合、ワイヤーは不要です。


ソフトウェア

Rubicを使用します。Rubicの使用方法は「Rubicではじめよう!(Ruby編)」を参照してください。

gr-citrus-board
usb-cable
citrus-sp-wire
citrus-sp-solderless-b
citrus-sp-solderless-s

照度

フォトトランジスタNJL7502を使用した例です。

peach-sp-sd-njl7502l


ピン接続

センサー GR-CITRUS
アノード 14
カソード GND
citrus-sp-sensor-njl7502

サンプル

analogReadを使って100回センシングします。抵抗の接続を省くため、GR-CITRUSの内部プルアップ抵抗を利用しており、正確な明るさを測れるわけではありません。値が小さいほど明るいことを示しています。

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

サンプル2

分解能を上げたサンプルです。デフォルトの設定では0~675になりますが、0~4096の分解能になります。

 
usb = Serial.new(0)
analogReference(3) #12bit mode
pinMode(14, 2) #INPUT_PULLUP
100.times do
    usb.println(analogRead(14).to_s)
    delay(100)
end

温湿度

温湿度センサーモジュールHDC1000を使用した例です。

com-sp-hdc1000


ピン接続

センサー GR-CITRUS
+V 3.3V
SDA 5
SCL 6
RDY 2
GND GND

citrus-sp-sensor-hdc1000


サンプル

I2Cクラスを使って100回センシングします。

  
@ADDRESS   = 0x40
@RDY_PIN   = 2
@T_POINTER = 0x00
@H_POINTER = 0x01
@C_POINTER = 0x02
@C_MSB     = 0x10
@C_LSB     = 0x00
 
usb = Serial.new(0)
i2c2 = I2c.new(2)
pinMode(@RDY_PIN, 0);
 
i2c2.begin(@ADDRESS)
i2c2.lwrite(@C_POINTER)
i2c2.lwrite(@C_MSB)
i2c2.lwrite(@C_LSB)
i2c2.end(1)
 
100.times do
  i2c2.begin(@ADDRESS);
  i2c2.lwrite(@T_POINTER)
  i2c2.end(1)
   
  while digitalRead(@RDY_PIN) == 1 do
  end
   
  i2c2.request(@ADDRESS, 4)
 
  t = i2c2.lread() << 8;
  t |= i2c2.lread();
  t = t / 65536.0 * 165.0 - 40.0
  
  h = i2c2.lread() << 8;
  h |= i2c2.lread();
  h = h / 65536.0 * 100.0
   
  usb.print("T:")
  usb.print(t.to_s)
  usb.print(" H:")
  usb.println(h.to_s)
   
  delay(100)
end

ピン接続(WA-MIKANもつなぐ場合)

WA-MIKAN接続時はピン5, 6が使用できないため、別のI2C 接続を使用します。以下はI2C 1(Wire1)を使用する場合です。

センサー GR-CITRUS
+V 3.3V
SDA 0
SCL 1
RDY 2
GND GND
 

サンプル

I2Cクラスを使って100回センシングします。I2C1を使用しています。

   
@ADDRESS   = 0x40
@RDY_PIN   = 2
@T_POINTER = 0x00
@H_POINTER = 0x01
@C_POINTER = 0x02
@C_MSB     = 0x10
@C_LSB     = 0x00
  
usb = Serial.new(0)
i2c = I2c.new(1)
pinMode(@RDY_PIN, 0);
  
i2c.begin(@ADDRESS)
i2c.lwrite(@C_POINTER)
i2c.lwrite(@C_MSB)
i2c.lwrite(@C_LSB)
i2c.end(1)
  
100.times do
  i2c.begin(@ADDRESS);
  i2c.lwrite(@T_POINTER)
  i2c.end(1)
    
  while digitalRead(@RDY_PIN) == 1 do
  end
    
  i2c.request(@ADDRESS, 4)
  
  t = i2c.lread() << 8;
  t |= i2c.lread();
  t = t / 65536.0 * 165.0 - 40.0
   
  h = i2c.lread() << 8;
  h |= i2c.lread();
  h = h / 65536.0 * 100.0
    
  usb.print("T:")
  usb.print(t.to_s)
  usb.print(" H:")
  usb.println(h.to_s)
    
  delay(100)
end 

加速度

加速度センサーモジュールKXSC7-2050を使用した例です。

acceleration-sensor-kxsc7


ピン接続

センサー GR-CITRUS
Vdd 3.3V
Mode 3.3V
ST/MOT GND
Enable 3.3V
Xout 14
Yout 15
Zout 16
GND GND
citrus-sp-sensor-kxsc7-2050

サンプル

12bitのanalogReadを使って100回センシングします。重力変換した値を出力しています。

   
usb = Serial.new(0)
@OFFSET = 1.65 / 3.3 * 4096 # 1.65V 0g
@CONVERT = 3.3 / 4096 / 0.66 # 0.66V/g
analogReference(3) #12bit
100.times do
    x = (analogRead(14) - @OFFSET) * @CONVERT
    y = (analogRead(15) - @OFFSET) * @CONVERT
    z = (analogRead(16) - @OFFSET) * @CONVERT
     
    usb.print("x: ")
    usb.print(x.to_s)
    usb.print(" y: ")
    usb.print(y.to_s)
    usb.print(" z: ")
    usb.println(z.to_s)
    delay(100)
end

角速度

角速度センサーモジュールL3GD20を使用した例です。I2C接続です。

com-sp-l3gd20


ピン接続

センサー GR-CITRUS 補足
1:VDD 3.3V  
2:SCL 19 外部プルアップ必要
3:SDA 18 外部プルアップ必要
4:SA0 GND アドレス0x6a
5:CS 3.3V I2Cモード
INT2    
INT1    
GND GND  
citrus-sp-sensor-l3gd20

方位/地磁気

デジタルコンパスHMC5883Lを使用した例です。I2C接続です。

digital-compass-hmc5883l


ピン接続

センサー GR-CITRUS 補足
1:VDD 3.3V  
2:SCL 6 プルアップのためJP1をクローズ
3:SDA 5 プルアップのためJP1をクローズ
4:GND GND  
5:RDY   サンプルでは未使用
6:NC    
7:NC    
8:NC    
citrus-sp-sensor-hmc5883l

サンプル

I2Cクラスを使い100回センシングします。

    
#!mruby
# Digital Compass Module HMC5883L
# SCL -> 6
# SDA -> 5
# I2C Address(8bit): 0x3C(W)/0x3D(R)
# I2C Address(7bit): 0x1E = (0x3C >> 1) || (0x3D >> 1)
 
@ADDRESS   = 0x1E
Usb = Serial.new(0)
Hmc = I2c.new(2)
 
#連続測定モードに設定
Hmc.write(@ADDRESS,0x02,0x00)
#Hmc.begin(@ADDRESS)
#Hmc.lwrite(0x02)
#Hmc.lwrite(0x00)
#Hmc.end()
# ↓ 1行で書くと ↓
Hmc.write(@ADDRESS,0x02,0x00)
 
 
100.times do
  Hmc.begin(@ADDRESS);
  Hmc.lwrite(0x03)
  Hmc.end()
  Hmc.request(@ADDRESS, 6)
 
  xH = Hmc.lread()
  xL = Hmc.lread()
  zH = Hmc.lread()
  zL = Hmc.lread()
  yH = Hmc.lread()
  yL = Hmc.lread()
 
  x = ((xH << 8) + xL) 
  x -= 0x10000 if (x >> 15) == 1
  y = ((yH << 8) + yL)
  y -= 0x10000 if (y >> 15) == 1
  z = ((zH << 8) + zL)
  z -= 0x10000 if (z >> 15) == 1
 
  Usb.println "x:"+x.to_s+" y:"+y.to_s+" z:"+z.to_s
   
  delay(100)
end 

ピン接続(WA-MIKANもつなぐ場合)

WA-MIKAN接続時はピン5, 6が使用できないため、別のI2C接続を使用します。以下はI2C1(Wire1)を使用する場合です。

センサー GR-CITRUS 補足
1:VDD 3.3V  
2:SCL 1 プルアップのためJP1をクローズ
3:SDA 0 プルアップのためJP1をクローズ
4:GND GND  
5:RDY   サンプルでは未使用
6:NC    
7:NC    
8:NC    
 

サンプル

I2Cクラスを使い100回センシングします。I2c.new(1)にして、 I2Cのチャネルを1に変更してます。

  
#!mruby
# Digital Compass Module HMC5883L
# SCL -> 1
# SDA -> 0
# I2C Address(8bit): 0x3C(W)/0x3D(R)
# I2C Address(7bit): 0x1E = (0x3C >> 1) || (0x3D >> 1)
 
@ADDRESS   = 0x1E
Usb = Serial.new(0)
Hmc = I2c.new(1)
 
#連続測定モードに設定
Hmc.write(@ADDRESS,0x02,0x00)
#Hmc.begin(@ADDRESS)
#Hmc.lwrite(0x02)
#Hmc.lwrite(0x00)
#Hmc.end()
# ↓ 1行で書くと ↓
Hmc.write(@ADDRESS,0x02,0x00)
 
 
100.times do
  Hmc.begin(@ADDRESS);
  Hmc.lwrite(0x03)
  Hmc.end()
  Hmc.request(@ADDRESS, 6)
 
  xH = Hmc.lread()
  xL = Hmc.lread()
  zH = Hmc.lread()
  zL = Hmc.lread()
  yH = Hmc.lread()
  yL = Hmc.lread()
 
  x = ((xH << 8) + xL) 
  x -= 0x10000 if (x >> 15) == 1
  y = ((yH << 8) + yL)
  y -= 0x10000 if (y >> 15) == 1
  z = ((zH << 8) + zL)
  z -= 0x10000 if (z >> 15) == 1
 
  Usb.println "x:"+x.to_s+" y:"+y.to_s+" z:"+z.to_s
   
  delay(100)
end