こちらの内容はプレリリース品(mruby/c3.3)のものです。
- mruby/cIDE version:1.2
- mrbwrite version:1.2
- mrbc commpiler version:3.0
対応するファームウェアはこちらからダウンロードできます。
Ruby
mruby/cにて対応しているRubyのクラスについては下記公式URLをご参照ください。https://www.s-itoc.jp/activity/research/mrubyc/mrubyc_docs/library mruby/cのIOクラス標準化に沿って実装されています。
I/O API Guidelines
下記RBoardのファーム沿った内容で説明します。
GPIO
クラスメソッド
GPIO.setmode( pin, params ) -> nil
pin : 0~20 または "B1"や"A2"などの文字列params : GPIO::IN GPIO::OUTなど
# ピン番号1を出力に設定する。
GPIO.setmode( 1, GPIO::OUT )
# B1(6)ピンを入力、内部プルアップに設定する。
GPIO.setmode( "B1", GPIO::IN | GPIO::PULL_UP )
GPIO.read_at( pin ) -> Integer
pin : 0~20 または "B1"や"A2"などの文字列指定したピンから読み込んだ値を、0または1で返す。
出力に設定したピンに対して read する場合は、ハードウェアが許せば、設定値ではなく実際の値を読んで返すべき。
GPIO.setmode( 1, GPIO::IN )
v1 = GPIO.read_at( 1 ) # read from pin 1.
GPIO.high_at?( pin ) -> bool
pin : 0~20 または "B1"や"A2"などの文字列指定したピンから読み込んだ値が、ハイレベル (==1) であれば、true を返す。
if GPIO.high_at?( 1 )
GPIO.low_at?( pin ) -> bool
pin : 0~20 または "B1"や"A2"などの文字列指定したピンから読み込んだ値が、ローレベル (==0) であれば、true を返す。
if GPIO.low_at?( 1 )
GPIO.write_at( pin, integer_data )
pin : 0~20 または "B1"や"A2"などの文字列integer_data : 0 または 1
指定したピンへ値を出力する。
データが範囲外の場合(0と1以外)、RangeErrorになる。
GPIO.setmode( 1, GPIO::OUT )
GPIO.write_at( 1, 0 ) # output zero to pin 1.
コンストラクタ
GPIO.new( pin, params )
pin : 0~20 または "B1"や"A2"などの文字列params : 定数参照
pin で示す物理ピンを指定して、GPIO オブジェクトを生成する。
同時に param を指定して、入出力方向などのモードを指示する。
pin は標準的には整数で指定するが、"B1"等PIC固有のピン番号を文字列にて指定できる。
param は以下の定数を使い、|で接続して指定する。
IN, OUT もしくは HIGH_Z の指示は必須とし、無き場合は ArgumentError が発生する。
定数:
GPIO::IN # 入力に設定する
GPIO::OUT # 出力に設定する
GPIO::HIGH_Z # ハイインピーダンスに設定する
GPIO::PULL_UP # 内部プルアップを有効にする
GPIO::PULL_DOWN # 内部プルダウンを有効にする
GPIO::OPEN_DRAIN # オープンドレインモードに設定する
# ピン番号1を出力に設定する。
gpio1 = GPIO.new( 1, GPIO::OUT )
# B1ピンを入力、内部プルアップに設定する。
gpio1 = GPIO.new( "B1", GPIO::IN|GPIO::PULL_UP )
インスタンスメソッド
read() -> Integer
読み込んだ値を、0または1で返す。
v1 = gpio1.read()
high?() -> bool
読み込んだ値が、ハイレベル (==1) であれば、true を返す。
if gpio1.high?()
low?() -> bool
読み込んだ値が、ローレベル (==0) であれば、true を返す。
if gpio1.low?()
write( integer_data )
integer_data : 0 または 1ピンへ出力する値を0もしくは1で指定する。
gpio1.write( 1 )
setmode( param ) -> nil
params : GPIO::IN GPIO::OUTなどGPIOのモードを任意のタイミングで変更する。
既に PULL_UP 等が設定されている時に IN,OUT もしくは HIGH_Z が指定された場合は、PULL_UP 等の設定は無効化される。
# 内部プルアップを有効にする
gpio1.setmode( GPIO::PULL_UP )
# 入力に切り替え、内部プルアップを有効にする。
gpio1.setmode( GPIO::IN|GPIO::PULL_UP )
ADC
アナログデジタル変換機能をサポートするクラス。一般に、アナログ電圧値をデジタル値に変換する機能を持つ。
コンストラクタ
ADC.new( pin )
pin で示す物理ピンを指定して、ADC オブジェクトを生成する。pin は標準的には整数で指定するが、"B1"等PIC固有のピン番号を文字列にて指定できる。
ピンが既にGPIO等で使用されていた場合、ADCに切り替える。
adc1 = ADC.new( 1 )
read_voltage() -> Float
値を読み込み、電圧値(V)を返す。0 ~ 3.3V
v1 = adc1.read_voltage()
read() -> Float
read_voltage のエイリアスread_raw() -> Integer
値を読み込み、raw値(電圧に変換前の値)を返す。 0 ~ 1023
v1 = adc1.read_raw()
I2C
I2C バスをサポートするクラス。マスターデバイス、7ビットアドレスのみをサポート。
コンストラクタ
I2C.new( *params )
オプションパラメータparams | type | description |
---|---|---|
frequency | Integer | 周波数 (デフォルト 100kHz) |
freq | 同上 | 同上 |
scl_pin | --- | クロックピンの指定 |
sda_pin | --- | データピンの指定 |
# デフォルトの設定で、i2cオブジェクトを生成する。
i2c = I2C.new()
# I2C デバイスを、周波数 400kHz で使う。
i2c = I2C.new( frequency:400000 ) # 400kHz
インスタンスメソッド
read( i2c_adrs_7, read_bytes, *param ) -> String
i2c_adrs_7 アドレスのデバイスから、read_bytes バイトのデータを読み込む。デバイスが途中で NAK を返す場合は、read_bytes より短い長さの String が返る可能性がある。
param にデータが指定されていれば、それを出力してからリピーテッドスタートを挟み読み込みを始める。
s = i2c.read( 0x45, 3 ) # case 1
s = i2c.read( 0x45, 3, 0xf3, 0x2d ) # case 2
(case 1) S -- adrs(45) R A -- data1 A -- data2 A -- data3 A|N -- P (case 2) S -- adrs(45) W A -- out1(f3) A -- out2(2d) A -- Sr -- adrs(45) R A -- data1 A -- data2 A -- data3 N -- P S : Start condition P : Stop condition Sr: Repeated start condition A : Ack N : Nack R : Read bit W : Write bit
write( i2c_adrs_7 , *outputs ) -> Integer
i2c_adrs_7 アドレスのデバイスに、outputs で指定したデータを書き込む。書き込みできたバイト数が戻り値として返る。
outputsは、Integer, Array<Integer> および String で指定する。
i2c.write( 0x45, 0x61, 0x47 )
i2c.write( 0x50, 0x00, 0x80, "aG" ) # useful for EEPROM
i2c.write( 0x11, [0x61, 0x47] )
S -- adrs W A -- data_1 A -- ... -- data_n N -- P S : Start condition P : Stop condition A : Ack N : Nack W : Write bit
send_start()
Low level method.I2Cバスに StartCondition を出力する。
i2c.send_start
send_restart()
Low level method.I2Cバスに Restart (RepeatedStart) Condition を出力する。
i2c.send_restart
send_stop()
Low level method.I2Cバスに StopCondition を出力する。
i2c.send_stop
raw_read( read_bytes, ack_nack = false ) -> String
Low level method.I2Cバスから read_bytes バイト読み込んで返す。
ack_nack = true で最後のバイト読み込み時に ACK を、false で NACK 出力する。
str = i2c.raw_read( 20 )
raw_write( *outputs ) -> Integer
Low level method.I2Cバスへ outputs で指定したデータを書き込む。
書き込みできたバイト数が戻り値として返る。
outputsは、Integer, Array<Integer> および String で指定する。
i2c.raw_write( 0x45, 0x30, 0xa2 )
SPI
SPI バスをサポートするクラス。マスターデバイス、8bit 単位の転送のみ対応。
チップセレクト SS はGPIO機能を使用してください。
コンストラクタ
SPI.new( id=nil, *params )
id : 1 または 2id で示す物理ユニットを指定して、SPI オブジェクトを生成する。
オプションパラメータ
params | type | description |
---|---|---|
unit | --- | SPIユニットの指定 |
frequency | Integer | 周波数 (デフォルト 1MHz) |
mode | Integer | 0 to 3 (default 0) |
first_bit | Constant | SPI::MSB_FIRST or SPI::LSB_FIRST (default MSB_FIRST) |
mode | CPOL | CPHA | Idle state clock polarity | Sampling timing |
---|---|---|---|---|
0 | 0 | 0 | Low | Rising edge |
1 | 0 | 1 | Low | Falling edge |
2 | 1 | 0 | High | Falling edge |
3 | 1 | 1 | High | Rising edge |
# デフォルトの設定で、spiオブジェクトを生成する。
spi = SPI.new()
# ユニット1 の SPI デバイスを、周波数 10MHz で使う。
spi = SPI.new( unit:1, frequency:10_000_000 )
インスタンスメソッド
setmode( *params )
SPI の動作モード(パラメータ)を変更する。パラメータの指定は、コンストラクタに準拠する。
spi.setmode( mode:3 )
read( read_bytes ) -> String
SPIバスから read_bytes バイトのデータを読み込む。同時に出力されるデータは、0が出力される。
data = spi.read( 32 )
write( *outputs ) -> nil
SPIバスへ、outputs で指定したデータを出力する。outputsは、Integer, Array<Integer> もしくは String で指定する。
spi.write( 0x30, 0xa2 )
spi.write( "\x30\xa2" )
spi.write( 0x02, 0xee, 0xad, 0x00, data_string ) # useful for EEPROM
transfer( outputs, additional_read_bytes = 0 ) -> String
SPIバスへ outputs で指定したデータを出力しながら同時に入力する(汎用転送)outputs は、Integer, Array<Integer> もしくは String で指定する。
additional_read_bytes を指定すると、そのバイト数分の 0x00 を output に続いて出力する。
s = spi.transfer( 0b0000_0101, 1 ) # s は 2バイトの String が返る
PWM
パルス幅変調機能をサポートするクラス。コンストラクタ
PWM.new( pin, *params )
pin : 0~20 または "B1"や"A2"などの文字列params : 定数参照
pin で示す物理ピンを指定して、PWM オブジェクトを生成する。
pin は標準的には整数で指定するが、"B1"等PIC固有のピン番号を文字列にて指定できる。
パラメータ frequency を指定すると、デューティー比50%で出力を開始する。
デューティー比50%以外で出力を開始したい場合には、パラメータ duty を同時に指定する。
オプションパラメータ
params | type | description |
---|---|---|
frequency | Integer,Float | 周波数の指定 |
freq | 同上 | 同上 |
duty | Integer,Float | デューティー比の指定 |
# 1番ピンをPWM出力用としてオブジェクトを生成する。まだ出力はしない。
pwm1 = PWM.new( 1 )
# 1番ピンをPWM出力用としてオブジェクトを生成するとともに、周波数 440Hz デューティー比 30% で出力を開始する。
pwm1 = PWM.new( 1, frequency:440, duty:30 )
インスタンスメソッド
frequency( freq )
周波数を指定して出力を開始、もしくは周波数を変更する。freq は、Integer もしくは Float で指定する。
0を指定すると、出力を停止する。
周波数を変更してもデューティー比は変更されない。
pwm1.frequency( 440 ) # 440Hzの出力
period_us( micro_sec )
1周期の時間(マイクロ秒)を指定して出力を開始、もしくは周期を変更する。micro_sec は、Integerで指定する。
0を指定すると、出力を停止する。
周期を変更してもデューティー比は変更されない。
pwm1.period_us( 2273 ) # 1/2273us = 440Hz
duty( percent )
0から100までのパーセンテージを指定してデューティー比を変更する。 percentは、Integer もしくは Float で指定する。
pwm1.duty( 50 )
pulse_width_us( micro_sec )
1周期のONになる時間をマイクロ秒で指定する。micro_sec は、Integerで指定する。
1周期よりも長い時間を指定された場合、最大のONにできる値で設定されエラーにはならない。
pwm1.pulse_width_us( 1000 )
UART
非同期シリアル通信をサポートするクラス。コンストラクタ
UART.new( id=nil, *params )
id : 1 または 2(defaultは2)id で示す物理ユニットを指定して、UART オブジェクトを生成する。
データビットは8のみ。
フロー制御は未実装のため、RTSCTSは指定できない。
パラメータデフォルト値
- ・ボーレート 9600
- ・データビット 8
- ・ストップビット 1
- ・パリティビット無し
- ・フロー制御無し
baudrate | Integer | ボーレート (default 9600) |
---|---|---|
baud | 同上 | |
stop_bits | Integer | ストップビット (default 1) |
parity | Const | パリティービット (default NONE) |
txd_pin | --- | TxDピンの指定 |
rxd_pin | --- | RxDピンの指定 |
UART::NONE UART::EVEN UART::ODD UART::RTSCTS
# UART1を、全てデフォルトパラメータで使う。
uart1 = UART.new( 1 )
# 指定したデバイスノードを持つシリアルデバイスを、19200bps 偶数パリティーで使う。
uart2 = UART.new("/dev/cu.usbserial1", baud:19200, parity:UART::EVEN )
インスタンスメソッド
setmode( *params )
UARTのモード(パラメータ)を変更する。パラメータの指定は、コンストラクタに準拠する。
uart1.setmode( baudrate:38400 )
read( read_bytes ) -> String
read_bytes で指定されたバイト数のデータを読み込む。指定されたバイト数のデータが到着していない場合は、到着までブロックする。
val = uart1.read( 10 )
write( string ) -> Integer
データを送信する。送信したバイト数を返す。
uart1.write("Output string\r\n")
gets() -> String
文字列を一行読み込む。内部的にはリードバッファ内の "\n" までのバイト列を返す。1行のデータが到着していない場合は、到着までブロックする。
val = uart1.gets()
puts( string ) -> nil
1行送信し、引数 string が改行で終わっていない場合は改行コードを送信する。改行コードは、LF
uart1.puts("Output string")
bytes_available() -> Integer
リードバッファに到着している読み込み可能バイト数を返す。
len = uart1.bytes_available()
bytes_to_write() -> 0
送信バッファが無いため常に0を返します
bytes = uart1.bytes_to_write()
can_read_line() -> bool
1行のデータを読み込むことができる場合は、true を返す。
flag = uart1.can_read_line()
flush()
送信バッファに溜まったデータの送信完了までブロックする。送信バッファが無いため実際には何もしません。
uart1.flush()
clear_rx_buffer()
受信バッファをクリアする。
uart1.clear_rx_buffer()
clear_tx_buffer()
送信バッファをクリアする。送信バッファが無いため実際には何もしません。
uart1.clear_tx_buffer()
send_break( time )
break 信号を送信する。time はオプションで、秒で指定する。
uart1.send_break( 0.1 )
その他
leds_write(bit)
led制御bit : 整数
led | 10進数 | 2進数 |
---|---|---|
1 | 1 | 0b0001 |
2 | 2 | 0b0010 |
3 | 4 | 0b0100 |
4 | 8 | 0b1000 |
sw()
スイッチの状態読み込み戻り値:0 or 1
puts(txt)
文字列出力ターミナルソフトの設定についてはこちら txt:文字列