mruby/c IO API 仕様提案書
汎用デジタル入出力
基本は1bitずつですが、機器によっては数ビットまとめて入出力ができる場合もあるでしょう。
例 (mruby/c devkit 02)
gpio1 = GPIO.new( 1 ) # param: grove pin number.
例 (mruby/c devkit 02)
gpio1.setmode( GPIO::IN ) # GPIO::IN or GPIO::OUT
(参考)機器によってはコンストラクタの引数で入出力の設定も併せて行い、実行途中では変更できないという方法が良いでしょう。
例 (mruby/c devkit 02)
gpio1.write( 1 )
例 (mruby/c devkit 02)
val = gpio1.read() # val = 0 or 1
電圧入力
汎用の電圧入力です。入力範囲などは、機器によって異なります。
例 (mruby/c devkit 02)
adc1 = ADC.new( 1 ) # param: grove pin number.
ADCが出力した整数値を、物理量(通常は電圧値)に変換して返します。
例 (mruby/c devkit 02)
val = adc1.read() # val = 0.0 - 2.048 (Volt)
ADCが出力した整数値を返します。戻り値はADCのビット数により実装依存です。
例 (mruby/c devkit 02 未実装)
val = adc1.raw_read() # val = 0 - 2048
UARTシリアルインターフェースを扱います。
例 (mruby/c devkit 02)
uart1 = UART.new( 1 ) # param: grove pin number.
指定された文字列を出力します。
例 (mruby/c devkit 02)
uart1.write("Output string\r\n")
指定されたバイト数のデータを読み込みます。指定されたバイト数のデータが到着していない場合、nilを返します。
例 (mruby/c devkit 02)
val = uart1.read( 10 )
(参考)POSIX APIなど、データが到着していなければブロックする方式が一般的ですが、mruby/cで作るアプリケーションの場合、あえてブロックしない方式としたほうがプログラミングしやすかったので、そのような仕様になっています。
指定されたバイト数のデータを読み込みます。指定されたバイト数のデータが到着していない場合、到着している分のデータを返します。
例 (mruby/c devkit 02)
val = uart1.read_nonblock( 1024 )
文字列を一行読み込みます。実際には受信キュー内の "\n" までのバイト列を返します。 受信キューに "\n" が無い場合、nilを返します。
例 (mruby/c devkit 02)
val = uart1.gets()
(参考)受信キューより長い文字列を受信した場合、gets()では処理できません。その場合、受信キューを大きくしたファームウェアを用意する必要があります。
読み込みバッファをクリアします。
例 (mruby/c devkit 02)
uart1.clear_tx_buffer()
書き込みバッファをクリアします。
例 (mruby/c devkit 02)
uart1.clear_rx_buffer()
I2Cシリアルインターフェースを扱います。
例 (mruby/c devkit 02)
i2c = I2C.new()
指定されたバイトを順次出力します。
例 (mruby/c devkit 02)
i2c.write( ADRS, 0x02, 0x16, 0x00 )
指定された文字列を出力します。
例 (mruby/c devkit 02)
i2c.write( ADRS, "string" )
指定されたバイト数のデータを読み込みます。指定されたバイト数のデータが到着していない場合、ブロックします。
paramsを指定することで、read前にparamsを出力します。すなわち、以下のシーケンスとなります。
(S) - ADRS7 (W)(A) - [params ...] - (Sr) - ADRS7 (R)(A) - data_1 (A)... data_n (A|N) - (P)
S : Start condition P : Stop condition
Sr: Repeated start condition
A : Ack N : Nack
例 (mruby/c devkit 02)
s = i2c.read( ADRS, 2, 0xfe ) # 0xfeレジスタから2バイト取得
SPIシリアルインターフェースを扱います。
例 (mruby/c devkit 02)
spi = SPI.new()
指定されたバイトを順次出力します。
例 (mruby/c devkit 02)
spi.write( 0x02, 0x16, 0x00 )
指定された文字列を出力します。
例 (mruby/c devkit 02)
spi.write( "string" )
指定されたバイト数のデータを読み込みます。
例 (mruby/c devkit 02)
s = spi.read( 2 )
d1,d2...を送信し、その後recv_size分の 0x00 を送信します。
戻り値は、受信した長さ recv_size バイトの文字列となります。
パルス幅変調(Pulse Width Modulation)を扱います。 周波数を指定する方法と、周期を指定する方法があります。
例 (mruby/c devkit 02)
pwm = PWM.new()
指定した周波数の信号を出力します。最大値は利用する機器に依存します。0を指定すると出力を停止します。
デューティー比を、0(全オフ)から1024(全オン)までで指定します。
例 (mruby/c devkit 02)
pwm.frequency( 440 ) # 440Hz
pwm.duty( 512 ) # 50%
周期を指定して信号を出力します。単位はマイクロ秒 (μs) です。 最大値は利用する機器に依存します。0を指定すると出力を停止します。
例 (mruby/c devkit 02)
pwm.period_us( 2273 ) # 440Hz
pwm.duty( 512 ) # 50%
(参考)機器によっては、上記のパラメータ設計では解像度が不足するかもしれません。その場合、浮動小数点でパラメータを与える事も考慮すべきだと考えます。