しまねソフト研究開発センター(略称 ITOC)にいます、東です。
Grove Beginner Kit for Arduino というものを買ったので、数回に分けて Arduino と Ruby での使用レポートを書いてみようと思います。なおキットの性質上、初心者向けの学習用記事です。
ターゲットは、以下の通り。
- Arduino - 付属の Arduino Uno 互換機
- Ruby - Raspberry Pi + Grove Base HAT for Raspberry Pi
- mruby/c - RBoard
予定しているレポートは、以下の通りです。
- デジタル入出力 - GPIO編 (今回)
- アナログ入力 - ADC編
- パルス出力 - PWM編
- 加速度センサー編
- 気圧センサー編
- 温湿度センサー編
- OLED編
今回は、デジタル入出力 (GPIO) を使ってみます。
Hardware overview
このキットは、Arduino互換機といくつかの Grove モジュールがセットになったもので、さらにそれぞれのモジュールを切り離すことができるよう設計された一つの基板になっています。
準備
Grove Beginner Kit
キットでは、すでに中心の Arduino と、各モジュール間は配線してあります。Arduino だけで試すならばこれで良いのですが、今回は別なマイコンもつなぎたいので切り離します。
Arduino
このレポート内の追試をする範囲であれば、切り離しても切り離さなくても大丈夫です。この Arduino 互換機は、Groveコネクタがたくさんついているので、切り離しても付属の Groveケーブルでセンサー類との接続が簡単にできます。
その他の Groveモジュール等を別途購入して使う場合を考えると、リソース(接続するGPIO番号など)の重複などからむしろ切り離しておいた方が良いかもしれません。
ラズパイ
ラズパイに Grove モジュールを接続するのに便利なように、Grove Base HAT for Raspberry Pi を取り付けます。
次に、I2Cを使えるように、Raspberry Pi OSのセットアップを行います。やり方は検索するといくらでも出てきます。
以下の通り、apt を使って ruby と使用するライブラリをインストールします。レポート内では使いませんが、併せて i2c-tools
もインストールしておくと便利かと思います。
sudo apt install ruby
sudo gem install mruby-sysfs-gpio
sudo gem install mruby-serialport-uart
sudo gem install mruby-linux-i2c
sudo apt install i2c-tools
RBoard
2024年3月現在、公式にはまだリリースがないようですが、mruby 共通 API を使う事ができる最新のファームバージョンで試します。
最新ファームウェアは、自分でアップデートする場合は、RBoard 公式 github ページ からソースコードを取得しビルドして書き込みます。もしくはメーカーに依頼すればたぶんやってくれます。
1. ElChika (えるちか)
まずは、Grove - Red LED モジュールを使って、基本のエルチカをやってみます。GPIO の出力サンプルとなります。
外観 | 回路図 |
---|---|
(メーカーWiki: Grove - Red LED より引用)
LEDの他に少し部品がついていますが、要は Grove Digital ピンの High/Low に応じてLEDが点灯/消灯するだけです。VRにLED点灯電流を流しているのが、ちょっと気になりますね :-P。
接続
Arduino
D4
番に LEDを接続します。切り離さなければ、そこに接続されています。
void setup() {
pinMode( 4, OUTPUT );
}
void loop() {
digitalWrite( 4, HIGH );
delay( 100 );
digitalWrite( 4, LOW );
delay( 900 );
}
プログラム中、ピン番号4 をマジックナンバーとして使っていますが、実用的なプログラムでは定数に定義したほうが良いです。時間待ち関数の delay
は、単位が ms(ミリ秒) であることを覚えておかないといけないのが、ちょっとマイナスポイントですね。
Raspberry Pi (CRuby)
Grove 端子 D5 へ接続します。
このHATは、デジタル端子の番号とGPIO番号は同じ番号で設計されているので、newの引数に5番ピンを指定します。
require "mruby/gpio"
led = GPIO.new( 5, GPIO::OUT )
loop {
led.write( 1 )
sleep( 0.1 )
led.write( 0 )
sleep( 0.9 )
}
こちらは、led
と名前をつけた変数により、ループ中で LED を操作していることが明示できています。時間待ちは sleep
になり、こちらは秒単位なのでわかりやすい反面、小数を使う事にためらいを感じる方もいるかもしれませんね。
RBoard (mruby/c)
Grove 端子 Digital へ接続します。
ピン配置図 により、16番ピンを使用することがわかります。
led = GPIO.new( 16, GPIO::OUT )
loop {
led.write( 1 )
sleep( 0.1 )
led.write( 0 )
sleep( 0.9 )
}
Crubyと同じプログラムが動きます。
2. Button
次は、ボタン(プッシュスイッチ)を使って GPIO の入力をします。
作成するサンプルプログラムは、ボタンを押している間 LED を点灯させるプログラムを作ります。
外観 | 回路図 |
---|---|
(メーカーWiki: Grove - Button より引用)
プッシュスイッチが、10kΩの抵抗でプルアップされている回路になっています。
接続
Arduino
D6
番に接続します。切り離さなければ、そこに接続されています。LED は、オンボードのものを使います。
void setup() {
pinMode( 6, INPUT );
pinMode( 13, OUTPUT ); // onboard LED
}
void loop() {
digitalWrite( 13, digitalRead( 6 ) );
}
Raspberry Pi (CRuby)
ラズパイには、オンボード LED が無い(正確にはありますが、コントロール方法が違う)ので、先ほどの Grove LED を使います。
# connect
# D16 (GPIO16) to Button
# D5 (GPIO5) to LED
require "mruby/gpio"
button = GPIO.new( 16, GPIO::IN )
led = GPIO.new( 5, GPIO::OUT )
while true
led.write( button.read )
end
役者が、button
, led
と2人になり、名前をつけた意味がより感じられますね。
RBoard (mruby/c)
Grove 端子 Digital へ接続します。
オンボード LED は、GPIOクラス経由でも使えますが、専用の関数 leds_write
が用意してありますのでそれを使いました。
button = GPIO.new( 16, GPIO::OUT )
while true
leds_write( button.read )
end
おわりに
今回は、単純なデジタル入出力を試してみました。これだけ単純だと、各環境でほとんど差はないですね。
次回は、アナログ入力を試してみたいと思います。