概要
ここではGR-CITRUSのmrubyフレームワークを使用したセンシングについて説明します。
準備
ハードウェア
GR-CITRUS、USBケーブル(マイクロBタイプ)、ジャンパワイヤー、ブレッドボード、センサーモジュールを準備します。センサーは体験するものだけでOKです。 ブレッドボードの大きさは写真のようにGR-CITRUSにUSBケーブルが接続されることを考慮し、大き目のものであれば1つ、小さめのものであれば2つあるとよいです。
ワイヤーは1つのセンサーモジュールに対して4本~5本必要です。照度センサー(フォトトランジスタ)の場合、ワイヤーは不要です。
ソフトウェア
Rubicを使用します。Rubicの使用方法は「Rubicではじめよう!(Ruby編)」を参照してください。





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

ピン接続
| センサー | GR-CITRUS | 
|---|---|
| アノード | 14 | 
| カソード | GND | 

サンプル
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を使用した例です。

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

サンプル
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を使用した例です。

ピン接続
| センサー | GR-CITRUS | 
|---|---|
| Vdd | 3.3V | 
| Mode | 3.3V | 
| ST/MOT | GND | 
| Enable | 3.3V | 
| Xout | 14 | 
| Yout | 15 | 
| Zout | 16 | 
| GND | GND | 

サンプル
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接続です。

ピン接続
| センサー | 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 | 

方位/地磁気
デジタルコンパスHMC5883Lを使用した例です。I2C接続です。

ピン接続
| センサー | 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 | 

サンプル
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