|
1. 概要 |
Web技術の進歩により、最近ではパソコンに接続したMIDIデバイスで演奏するWebページが作れるようになりました(下図)。

WebIO は、この仕組みを用いてブラウザからIO制御できるようにしたものです(下図)。

上図左は、温湿度センサをつないだマイコン(図ではXIAO M0)とパソコンをUSB接続し、パソコンのWebブラウザの画面にセンサの値を表示する様子を表しています。
上図右は、赤外線送信機をつないだマイコン(図ではATOM lite)とスマホをBluetooth接続し、スマホでテレビのリモコン操作をする様子を表しています。
マイコンにプログラム(webio2.ino)を書き込んでおくことにより、パソコンやスマホからは見かけ上MIDIデバイスとなります。温湿度計やリモコンのWebアプリはサーバに置きます。
パソコンやスマホに特別なアプリは必要なく、ブラウザでページ(Webアプリ)を表示するだけです。そのページはサーバに置かずに、パソコン上に置いても構いません。
操作対象は「ブラウザが動作しているパソコンやスマホに接続したデバイス」です(上図)。遠隔地のデバイスを操作できるわけではありません。
以下はWebIOを用いた制作例で、それぞれリンク先に詳しい説明があります。
大きなモニタに表示すれば、体育館やイベント会場などで熱中症対策に利用できます。

大きなモニタを使えば、イベント会場や飲食店の店頭などで換気の目安を表示できます(新型コロナ対策)。

よく使うボタンだけを表示するリモコンや、複数の機器を操作できるリモコンを作ることができます。通常のリモコンボタンを押せない重度障害者も、パソコン操作ができればリモコンを利用できます。

高機能のラジオIC SI4732をブラウザで操作するラジオです。通常のラジオを操作できない重度障害者も、パソコン操作ができれば利用できます。

ブラウザのメロディーと連動して、ミニドラムのスティックをモータで制御します。

ブラウザの操作でLEDをオンオフ、スイッチでブラウザ画面を操作、センサの値をブラウザ画面に表示などの簡単なWebアプリを作りながら、電子工作の導入教材として利用できます。

以下のブラウザおよびマイコンで動作を確認しています。どのブラウザが Web MIDI API やWebBluetoothに対応しているかは「Can I Use」で確認できます。
| パソコンとUSB接続の場合 | パソコンやスマホとBluetooth接続の場合 | |
|---|---|---|
| マイコン | Leonardo, Micro, Wio, XIAO M0(samd21) | XIAO ESP32C3, ATOM lite(C3) |
| ブラウザ | Windows版Chrome, Edge など (Web MIDI API 対応ブラウザ) |
Windows版Chrome, Edge Android版Chrome (Web MIDI APIおよび Web Bluetooth 対応ブラウザ) |
webio2.zipをダウンロードし、解凍すると、以下のファイルが復元されます。
(1) パソコンに「本物のMIDIデバイス(ここではnsx-39)」を接続してwebio2.jsを使ったページ(このページもそうです)を表示すると、ページ冒頭の表示が
のようになります。これで、ブラウザ画面から接続したMIDI音源(nsx-39)で演奏させることができます。
WebIOは、「さまざまなオリジナルのMIDIデバイスを作って演奏(?)するページを作る」ということに他なりません。
(2) 今度はパソコンにマイコン(XIAO M0)をUSB接続し、このページを表示すると、ページ冒頭に
のような表示が現れます。これは、接続したマイコンがSeeed XIAO M0という名前で認識されていることを表しています。
(3) USB接続のMIDIデバイスが無い場合は、
のような表示になります。近くにマイコン(ATOM C3)を置き、ボタンを押すと、下図右のような画面が現れます。一覧の中から接続するMIDIデバイス(この例では ATOM C3)を選択し、ボタンを押します。マイコンとBluetooth接続され、ページ冒頭の表示は
のようになります。これは、接続したマイコンがATOM C3という名前で認識されたことを表しています。
以下では、MIDIデバイス(マイコン)として Leonardo, Micro または XIAO M0 をUSB接続、または ATOM lite をBluetooth接続した時の、基本的な入出力の様子について説明しています。ATOMの場合は、スマホからこのページで動作を確認することもできます。ATOMに内蔵されているLEDやスイッチを使っているので、外部に何も接続する必要はありません。なお、このページには所々に
のような箇所があります。選択したボードに対応した説明が表示されます。
画面上のボタンを押すとマイコンに接続したLEDが点灯・消灯する例です。

led1.html:
LEDの点灯・消灯 |

led1.html:
LEDの点灯・消灯 |

led1.html:
LEDの点灯・消灯 |

led1.html:
LEDの点灯・消灯 |
ブラウザの表示は以下のようになります。

このページが表示され、MIDIデバイス(マイコン)が認識されると、setup関数が呼び出されます。
setupの関数定義の中の
pinMode関数はwebio2.jsの中で定義されています。利用できるピンや入出力モードは使用するマイコンによって異なり、webio2.jsの中で定義されていて、MIDIデバイス(マイコン)が認識された時点で値が決まります。
pinMode()が呼び出されると、その指示がMIDIデバイス(マイコン)に送信されます。実際にどのようなデータが送られるかは、ブラウザでF12キーを押すと確認することができます(データの詳細はこちら)。
MIDIデバイス(マイコン)はMIDIデータを受け取ると、内容を解読し、LEDが接続されたピンを出力モードにします。
ブラウザ画面のボタンが押されると、
MIDIデバイス(マイコン)はMIDIデータを受け取ると、内容を解読し、LEDが接続されたピンに1(高い電圧)を出力し、LEDが点灯します。
同様に、ブラウザ画面のボタンが押されると、
スイッチの状態(オフで1, オンで0)をブラウザ画面に表示します。

button1.html:
スイッチの状態 |

button1.html:
スイッチの状態 |

button1.html:
スイッチの状態 |

button1.html:
スイッチの状態 |
ブラウザの表示は以下のようになります。

このページが表示され、MIDIデバイス(マイコン)が認識されると、setup関数が呼び出されます。
setupの関数定義の中の
pinMode()が呼び出されると、その指示がMIDIデバイス(マイコン)に送信され、MIDIデバイス(マイコン)はこれを受け取り、内容を解読し、スイッチが接続されたピンをプルアップ入力モードにします。スイッチがオフの時に1(高い電圧)、オンの時に0(低い電圧)になります。マイコンは定期的(20ms毎)にこの値を読み取り、「初回および変化があった時」に、ピンの状態(0か1)を表すMIDIデータをパソコンに送信します。
ブラウザは、20ms毎に実行されるloop関数の中の
loop関数の中では引き続き、
スイッチの状態をブラウザ画面に表示するとともに、LEDも連動して点灯・消灯します。ブラウザのプログラムで点灯・消灯するため、若干の遅れが生じ、その遅れを体感できます。

button2.html:
スイッチの状態 |

button2.html:
スイッチの状態 |

button2.html:
スイッチの状態 |

button2.html:
スイッチの状態 |
ブラウザの表示は以下のようになります。

このページが表示され、MIDIデバイス(マイコン)が認識されると、setup関数が呼び出されます。
setupの関数定義の中の
D2/PIN_BUTTONはピン番号、INPUT_PULLUPは入出力モードで、XIAO M0の場合、D2の値は2、INPUT_PULLUPの値は2です。
pinMode(9,1)が呼び出されると、MIDIデータがMIDIデバイス(マイコン)に送信され、MIDIデバイス(マイコン)はこれを受け取り、内容を解読し、9ピンを出力モードにします。
pinMode(2,2)が呼び出されると、MIDIデータがMIDIデバイス(マイコン)に送信され、MIDIデバイス(マイコン)はこれを受け取り、内容を解読し、2ピンをプルアップ入力モードにします。2ピンには押しボタンスイッチがつながっていて、スイッチがオフの時に1(高い電圧)、オンの時に0(低い電圧)になります。マイコンは定期的(20ms毎)にこの値を読み取り、「初回および変化があった時」に、ピンの状態(0か1)を表すMIDIデータをパソコンに送信します。
ブラウザは、20ms毎に実行されるloop関数の中の
MIDIデバイス(マイコン)はMIDIデータを受け取ると、内容を解読し、LEDに0(低い電圧)または1(高い電圧)を出力します。
loop関数の中では引き続き、
はじめに、コマンド入力でLEDの明るさを変えてみます。

|
|

|
|

|
|
ATOM内蔵のLEDを使います。
|
|
analogWrite(ピン,値)は、指定したピンに0~255のアナログ値を出力します。0~255の値に応じてピンの電圧は0~3.3Vに変化します。
次に、ブラウザ画面のスライダーの操作でLEDの明るさを変化させます。

slider.html:
LEDの点灯・消灯 |

slider.html:
LEDの点灯・消灯 |

slider.html:
LEDの点灯・消灯 |

slider.html:
LEDの点灯・消灯 |
「<input type=range ...>」の箇所でスライダーの表示を指示していて、「value=0」は初期値を0、「min=0 max=255 step=1」はスライダーの返す値を0~255で1きざみにする指示です。また、「onchange=...」の箇所にスライダーの値が変化した時に呼び出すプログラムを書いています。
LEDの明るさはブラウザのスライダーの操作により変化します。

A1ピンにつないだボリュームを操作して電圧値を変えると、ブラウザ画面に0~1023の値として表示されます。

analog.html:
|
|

analog.html:
|
|

analog.html:
|
|

analog.html:
|
|
ブラウザの表示はボリュームの操作により変化します。

| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| mode | Leonardo Micro |
XIAO M0 | XIAO ESP32C3 ATOM C3 lite |
|---|---|---|---|
| INPUT | 0 | 0 | 1 |
| OUTPUT | 1 | 1 | 3 |
| INPUT_PULLUP | 2 | 2 | 5 |
| INPUT_PULLDOWN | - | 3 | 9 |
| INPUT_ANALOG | 6 | ||
| OUTPUT_ANALOG | 7 | ||
| OUTPUT_TONE | 10 | ||
| OUTPUT_NEOPIXEL | 11 | ||
| INPUT_IR | - | 12 | |
| OUTPUT_IR | - | 13 | |
パソコンやスマホとマイコンの間の情報交換はMIDI通信で、ブラウザの Web MIDI API を介して行われます。Webアプリから利用しやすいように、以下のようにArduino風のJavascriptの関数や定数をJavascriptライブラリ(webio2.js)で定義しています。
| 定数名 | 内容 |
|---|---|
| HIGH, LOW | デジタル出力またはデジタル入力されたピンの状態 (HIGHは1、LOWは0) |
| OUTPUT, INPUT, INPUT_PULLUP INPUT_ANALOG, OUTPUT_TONE, OUTPUT_NEOPIXEL, OUTPUT_IR, INPUT_IR |
pinMode()で設定する入出力のモード(マイコンにより異なる) (INPUT, OUTPUT, INPUT_PULLUP以外は独自の名称) |
| D0~, A0~, G0~ | デジタル入出力およびアナログ入力のピン番号 (実際のピン番号はマイコンにより異なる: 付録2参照) |
| LED / LED_BUILTIN | 内蔵LEDのピン番号 (ATOM C3) |
| IRLED / IRLED_BUILTIN | 内蔵赤外線LEDのピン番号 (ATOM C3) |
| RGBLED / RGBLED_BUILTIN | 内蔵RGBLED(NEOPIXEL)のピン番号 (ATOM C3) |
| NEOPIXEL / NEOPIXEL_BUILTIN | |
| BUTTON / BUTTON_BUILTIN | 内蔵押しボタンスイッチのピン番号 (ATOM C3) |
| GROVE1 / IRIN | GROVE1またはGROVEに接続したIRユニット(受信)のピン番号 (ATOM C3) |
| GROVE2 / IROUT | GROVE2またはGROVEに接続したIRユニット(送信)のピン番号 (ATOM C3) |
| TEMP, HUMI, CO2 | I2C接続した温湿度センサSHT30/SHT31または CO2センサSCD30の仮想ピン番号 |
| 関数名 | 内容 |
|---|---|
| pinMode(pin, mode) | pinをmodeにする(modeは(1)の表参照) |
| digitalRead(pin) | pinの値を読んでHIGH(1)またはLOW(0)の値を返す |
| digitalWrite(pin, HIGH) digitalWrite(pin, HIGH, t) |
pinにHIGH(1)を出力する...値はHIGH(1)またはLOW(0) pinをt(ms) HIGH(1)にする |
| analogRead(a) | aはA0~のアナログピンで指定する。ピンaのアナログ値を読み、0~1023の値を返す。 TEMP(63), HUMI(62), CO2(61)は仮想ピンで(値は0~4096)。 |
| analogWrite(pin, value) | pinにvalue(0~255)を出力する |
| sendNote(key, t) | ピン6にkeyのブザー音をt[ms]出力する keyの指定はmidiのノート番号(21~108)または文字列("A0"~"C8") |
| playNote(key, t) | ブラウザからkeyの合成音をt[ms]出力する keyの指定はmidiのノート番号(21~108)または文字列("A0"~"C8") ただし 0 または "R" は休符 |
| drumKick(key, t) drumSnare(key, t) drumHihat(key, t) |
ブラウザからドラムの合成音を出力する ブラウザからスネアの合成音を出力する ブラウザからハイハットの合成音を出力する |
| talk(str) talk(str,voice) talk(str,voice,pitch) talk(str,voice,pitch,rate) |
・ブラウザから文字列(str)を合成音声で読み上げる。 ・利用できる声(voice)はブラウザによって異なる(こちらを参考に)。 デフォルトは「日本語で初めに見つかった声」。 Windows10版Chromeの場合、日本語は Ayumi, Haruka, Ichiro, Sayaka, 日本語 英語は US, UK, Female, Male などが指定できる(文字列が一致する最初の声になる)。 ・音程(pitch)を指定する場合は 0.1~2 (無指定時は1) ・速さ(rate)は 0.1~10 (無指定時は1) |
| pixel(i, r,g,b) pixel(i, hue, brightness) |
NeoPixelのi番目のLEDをr,g,bにする(それぞれ0~255)。 NeoPixelのi番目のLEDを色相hue(0~255), 明るさbrightness(0~255 省略時255)にする。 NeoPixelはピン4に接続 |
| IRsend(protocol, command, address) | IRリモート信号を出力する |
| $(id) | document.getElementById(id)の短縮表現 |
上記とは別に、以下の関数をプログラム中に定義すると特別な役割を果たします。
| 関数名 | 内容 |
|---|---|
| setup() | ページが表示され、MIDIデバイスが認識された時にこの関数が呼び出される |
| loop() | 20ms毎にこの関数が呼び出される |
| onIRreceived(protocol, address, command) | IRリモコン信号を受信した時に呼び出される |
| 機能 | send(PC → I/O) | receive(I/O → PC) | JavaScript関数 | 備考 | |||||
|---|---|---|---|---|---|---|---|---|---|
| byte1 | byte2 | byte3 | byte1 | byte2 | byte3 | ||||
| 8x | NoteOff | 1000nnnn | 0kkkkkkk | 0vvvvvvv | 音を停止 | ||||
| 9x | NoteOn | 1001nnnn | 0kkkkkkk | 0vvvvvvv | sendNote(key, t) sendNote(key, t, ch) | key0-125のブザー音をt[ms]出力 ch0-15を指定できる | |||
| Ax | Pressure | 1010nnnn | 0kkkkkkk | 0vvvvvvv | |||||
| Bx | Control Change | 1011nnnn | 0ccccccc | 0vvvvvvv | |||||
| Reset | 1011nnnn | 01111001 | 00000000 | Reset All Control | |||||
| AllNoteOff | 1011nnnn | 01111011 | 00000000 | All Note Off | |||||
| Cx | Program Change | 1100nnnn | 0ppppppp | setVoice(ch, voice) | ch0-15を音源0-127に | ||||
| Dx | Pressure | 1101nnnn | 0vvvvvvv | ||||||
| Ex | Pitch Bend | 1110nnnn | 0lllllll | 0mmmmmmm | |||||
| F0 | analogWrite servo motor |
11110000(F0) 01111111(7D) 01101111(6F) |
0ppppppp 0vvvvvvv 0vvvvvvv |
11110111(F7) | analogWrite(pin, val) servo(pin, val) servo(pin, val, t) motor(lspeed, rspeed) |
pin 0~127 を 0-255 に pin 0~127 のサーボモーターを 0-180 に tを指定した場合はt[ms]後に停止 L(126) R(127) モーターのスピードを -128~127 に | |||
| analogRead | 11110000(F0) 01111111(7D) 01101111(6F) |
0ppppppp 0vvvvvvv 0vvvvvvv | 11110111(F7) | analogRead(pin) | pin 0~127 の値 0-1023 TEMP(125), HUMI(126), O2(127C) の値 0-4095 (20ms毎に更新) | ||||
| pinMode | 11110000(F0) 01111111(7D) 01110000(70) | 0ppppppp 0100mmmm |
11110111(F7) | pinMode(pin, mode) | pin 0-127 のpinModeをmode 0-15 に | ||||
| digitalWrite | 11110000(F0) 01111111(7D) 01110000(70) | 0ppppppp 0000000v |
11110111(F7) | digitalWrite(pin,val) digitalWrite(pin,1,t) |
pin 0-127 を 0/1 に tを指定した場合は t[ms] 1に | ||||
| digitalRead | 11110000(F0) 01111111(7D) 01110000(70) |
0ppppppp 0000000v | 11110111(F7) | digitalRead(pin) | pin 0-127 の値 0/1 (20ms毎に更新) | ||||
| String | 11110000(F0) 01111111(7D) 01110001(71) |
... | 11110111(F7) | 11110000(F0) 01111111(7D) 01110001(71) |
... | 11110111(F7) | string message with 14-bits per char | ||
| NeoPixel | 11110000(F0) 01111101(7D) 01110010(72) |
0LLLLLLL 00000rgb 0rrrrrrr 0ggggggg 0bbbbbbb |
11110111(F7) | Pixel(LED, R,G,B) | LED 0-127 の色を R(0-255) G(0-255) B(0-255) に | ||||
| IRsend IRreceive |
11110000(F0) 01111101(7D) 01110011(73) |
0PPPPPPP 0000aacc 0aaaaaaa 0aaaaaaa 0ccccccc 0ccccccc |
11110111(F7) | 11110000(F0) 01111101(7D) 01110011(73) |
0PPPPPPP 0000aacc 0aaaaaaa 0aaaaaaa 0ccccccc 0ccccccc |
11110111(F7) | IRsend(&IRDATA) IRreceive(&IRDATA) |
IRリモート信号を送信/受信 IRDATA内に protocol, address, command | |
| SMP display (DaVinciのみ) |
11110000(F0) 01111101(7D) 01110100(74) |
00000001 | 11110111(F7) | SMPbegin() | SMP displayの利用を開始 | ||||
| 00000010 0ttttttt 0000dddd(LSB) 0000dddd(MSB) 0000dddd(LSB) 0000dddd(MSB) 0000dddd(LSB) 0000dddd(MSB) 0000dddd(LSB) 0000dddd(MSB) 0000dddd(LSB) 0000dddd(MSB) 0000dddd(LSB) 0000dddd(MSB) 0000dddd(LSB) 0000dddd(MSB) 0000dddd(LSB) 0000dddd(MSB) |
11110111(F7) | SMPdrive([y1,.. y8], t) | SMP displayに8×8ドットを表示 y1-y8 は各行の横8ドット(x1-x8)のパターン tは0-127(0.1秒単位) | ||||||
| SI4732A (XIAO M0のみ) |
11110000(F0) 01111101(7D) 01110101(75) 00000001(01) |
00000000(00) | 11110111(F7) | RXreset() | SI4732をリセット | ||||
| 00000001(01) | 11110111(F7) | RXalive() | SI4732動作中 | ||||||
| 0pppmmm0 | 11110111(F7) | RXsetup(pin, mode) | SI4732の利用を開始 | ||||||
| 11110000(F0) 01111101(7D) 01110101(75) 00000010(01) |
0vvvvvvv | 11110111(F7) | RXgetCurrentRSSI() ... 0-127 | ||||||
| 11110000(F0) 01111101(7D) 01110101(75) 00000010(02) |
00vvvvvv(0-63) | 11110111(F7) | RXsetVolume(0-63) | ||||||
| 01xxxxxx(64-) | 11110111(F7) | RXvolumeUp(64) RXvolumeDown(65) RXsetAudioMute(66(true)) RXsetAudioMute(67(false)) RXfrequencyUp(68) RXfrequencyDown(69) RXseekStationUp(70) RXseekStationDown(71) RXseekStationProgress(72/73) |
|||||||
| 11110000(F0) 01111101(7D) 01110101(75) 00000010(02) |
00vvvvvv(0-63) | 11110111(F7) | RXgetVolume() ... 0-63 | ||||||
| 01xxxxxx(64-) | 11110111(F7) | RXisCurrentTuneAM() ... 64 RXisCurrentTuneFM() ... 65 RXgetCurrentPilot() ... 66 RXisCurrentTuneSSB() ... 67 | |||||||
| 11110000(F0) 01111101(7D) 01110101(75) 00000011(03) |
0fffffff(LSB) 0fffffff 000000ff(MSB) または 000001ff(MSB) |
11110111(F7) | RXsetFrequency(0-65535) | ||||||
| 0fffffff(LSB) 0fffffff 000000ff(MSB) または 000001ff(MSB) |
11110111(F7) | RXsetSSBBfo(-16383 - 16383) | |||||||
| 11110000(F0) 01111101(7D) 01110101(75) 00000011(03) |
0fffffff(LSB) 0fffffff 00000cff(MSB) |
11110111(F7) | RXgetFrequency() ... 0-65535(c=0) RXgetcurrentFrequency() ... 0-65535(c=1) |
||||||
| 11110000(F0) 01111101(7D) 01110101(75) 00000100(04) |
00aaaaaa(0-36) | 11110111(F7) | RXsetAutomaticGainControl(0(enable)/1(disable), 0(minAtt)-36) | AGC: 0-36 | |||||
| 0100pbbb | 11110111(F7) | RXsetBandwidth(b(0-6), p(0/1)) | 0:6kHz 1:kHz 2:3kHz 3:2kHz(default) 4:1kHz 5:1.8kHz 6:2.5kHz | ||||||
| 01010sss | 11110111(F7) | RXsetSSBAudioBandwidth(s(0-5)) | 0:1.2kHzLPF(default) 1:2.2kHzLPF 2:3kHzLPF 3:4kHzLPF 4:500HzBPF 5:1kHzBPF | ||||||
| 11110000(F0) 01111101(7D) 01110101(75) 00000100(04) |
00aaaaaa | 11110111(F7) | RXgetAutomaticGainControl() ... 0-36 | ||||||
| 11110000(F0) 01111101(7D) 01110101(75) 00000101(05) |
0fffffff(LSB) 0fffffff 000000ff(MSB) 0fffffff(LSB) 0fffffff 000000ff(MSB) 0fffffff(LSB) 0fffffff 000000ff(MSB) 0fffffff(LSB) 0fffffff 000000ff(MSB) |
11110111(F7) | RXsetAM(minFreq, maxFreq, Freq, Step) | ||||||
| 11110000(F0) 01111101(7D) 01110101(75) 00000110(06) |
0fffffff(LSB) 0fffffff 000000ff(MSB) 0fffffff(LSB) 0fffffff 000000ff(MSB) 0fffffff(LSB) 0fffffff 000000ff(MSB) 0fffffff(0-127) |
11110111(F7) | RXsetFM(minFreq, maxFreq, Freq, Step) | ||||||
| 11110000(F0) 01111101(7D) 01110101(75) 00000111(07) |
0fffffff(LSB) 0fffffff 000000ff(MSB) 0fffffff(LSB) 0fffffff 000000ff(MSB) 0fffffff(LSB) 0fffffff 0000ULff(MSB) 0fffffff(0-127) |
11110111(F7) | RXsetSSB(minFreq, maxFreq, Freq, Step, 1(LSB)/2(USB)) | ||||||
| 11110000(F0) 01111101(7D) 01110101(75) 00001000(08) |
0fffffff(LSB) 0fffffff 000000ff(MSB) 0fffffff(LSB) 0fffffff 000000ff(MSB) |
11110111(F7) | RXsetSeekAmLimits(minfreq, maxfreq) | ||||||
| 0fffffff(LSB) 0fffffff 000001ff(MSB) 0fffffff(LSB) 0fffffff 000001ff(MSB) |
11110111(F7) | RXsetSeekFmLimits(minfreq, maxfreq) | |||||||
| 11110000(F0) 01111101(7D) 01110101(75) 00001001(09) |
00vvvvvv(0-63) | 11110111(F7) | RXsetAmSpacing(0-63) | 0-63kHz | |||||
| 01vvvvvv(0-63) | 11110111(F7) | RXsetFmSpacing(0-63) | 0-630kHz | ||||||
| 11110000(F0) 01111101(7D) 01110101(75) 00001010(0A) |
00vvvvvv(0-63) | 11110111(F7) | RXsetSeekAmRssiThreshold(0-63) | 0-63(default 25dBuV) | |||||
| 01vvvvvv(0-63) | 11110111(F7) | RXsetSeekFmRssiThreshold(0-63) | 0-63(default 20dBuV) | ||||||
| 11110000(F0) 01111101(7D) 01110101(75) 00001011(0B) |
00vvvvvv(0-63) | 11110111(F7) | RXsetSeekAmSNRThreshold(0-63) | 0-63(default 5dB) | |||||
| 01vvvvvv(0-63) | 11110111(F7) | RXsetSeekFmSNRThreshold(0-63) | 0-63(default 3dB) | ||||||
| I2C Request | 11110000(F0) 01111111(7D) 01110110(76) |
0aaaaaaa(LSB) 0aaaaaaa(MSB) 0ddddddd(LSB) 0ddddddd(MSB) 0ddddddd(LSB) 0ddddddd(MSB) ... |
11110111(F7) | I2C request messages 0aaaaaaa(MSB): b7:0 b6:autorestart 0(stop) 1(restart) b5: 1(address 10bit mode) b4-3: 00(write) 01(read once) 10(read continuously) 11(stop reading) b2-0: address mode | |||||
| I2C Reply | 11110000(F0) 01111111(7D) 01110111(77) |
0aaaaaaa(LSB) 0aaaaaaa(MSB) 0rrrrrrr(LSB) 0rrrrrrr(MSB) 0ddddddd(LSB) 0ddddddd(MSB) ... |
11110111(F7) | I2C reply messages 0aaaaaaa(MSB): b0-2: transaction sequence from the request in 7 bit mode | |||||
| I2C Config | 11110000(F0) 01111111(7D) 01111000(78) |
delay(LSB) delay(MSB) ... |
11110111(F7) | Configure special I2C settings such as power pins and delay times (optional) | |||||
| FF | SystemReset | 11111111(FF) | ioreset() | SystemReset | |||||