概要
ここでは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