|
WebIOは、PCに接続したMidiデバイスをブラウザから制御するWeb Midi APIという機能を使って、IO制御を試みたものです。FirmataのWeb版のような感じですが、Web Midi APIではSysEXコマンドがhttpsに制限されているため、Midiコマンドと入出力の対応はFirmataとは異なっています。
システムの概要は下図のようになっています。Arduinoにはあらかじめプログラム(webio.ino)を書き込んでおきます。
プログラムはWebコンテンツ(HTML+JavaScript)としてサーバに置き、パソコンのブラウザで表示し、ブラウザ画面で操作します。ブラウザから制御できるのは自身のパソコンに接続されているデバイスであり、遠隔操作できるというわけではありません。動作の確認はWeb Midi API に対応しているChromeを使い、Windows10で行っています。
後ほど紹介するように、ブラウザ画面で操作するさまざまなWebコンテンツを作ることができます。今話題のIoTを小中学校で扱う場合も、適当なWebコンテンツをサーバに置いておけば、児童生徒一人一人がさまざまな学習が可能になるのではないかと思います。また、10章で紹介するように、パソコンに接続した温湿度センサのデータをブラウザから遠方のサーバに送ることもできるので、さまざまな応用が考えられると思っています。
ここでは下図左のブレッドボード(EIC-301)を使います。ボードの内部は下図右のように接続されています。
(外観) | (内部の接続) |
---|---|
ブレッドボードにArduino Pro Microを差し込み、GNDと5Vの端子を図のように接続します。USBケーブルをパソコンに接続すると、電源(5V)がパソコンから供給されます。Arduino Pro Microに見やすいラベルを貼っておくことをお勧めします。
(回路図) | (実体配線図) |
---|---|
初めてブレッドボードを使う場合は、練習としてLEDと抵抗を下図左のように接続して点灯を確認しましょう。電源はパソコンからUSB端子を通じて供給され、電流の流れは下図右のようになります。ブレッドボードの内部の結線も含めて「電流が流れる経路」を意識することが重要です。
(回路図) | (実体配線図) | (電流の流れ) |
---|---|---|
(練習) ブレッドボードで下記の回路を組み立て、スイッチを押すとLEDが点灯することを確認しなさい。
上のzipファイルをダウンロードして解凍してください。
上のコマンド入力欄にJavaScriptの命令文を入力し、実行ボタンを押すかEnterキーを押すと、その命令が実行されます。次のように入力してみてください。
以下のふたつめの例では文字列と数値((100+200)の演算結果)の連接演算(+)になっていて、数値(演算結果)が文字列に変換されて文字列の連接演算が行われます。
ここから以降は、WebIOのプログラムを書き込んだArduino Pro Micro(LeonardoやDavinciでもよい)を接続し、ブラウザはChromeまたはEdgeを使って行ってください。
以下の回路を組み立ててください。
(a) 回路図 |
(b) 実体配線図 |
LEDはD9ピンに接続します。「digitalWrite」というコマンドでD9ピンに高い電圧を出力したり低い電圧を出力したりすることができます。上のコマンド入力欄に
LEDが点灯する時の電流の流れは下図のようになります。下図中のスイッチをJavaScriptの命令で切り替えていると考えるといいでしょう。
(練習)「digitalWrite(D9,1)」および「digitalWrite(D9,0)」を実行した時のD9ピンの電圧を、テスターで測りなさい。
(練習)LEDを他のピンにつなぎ替えて、点灯・消灯してみなさい。
プログラムのはじめの一歩は「Lチカ」です。以下のWebページを作成し、ブラウザ(ChromeまたはEdge)で表示してください。冒頭の5行はWebページの常套句で、その先がWebページの本体とプログラムになります。
Webページは単に「LEDの点滅」と表示するだけです。「<script>」と「</script>」の間がJavaScriptプログラムになります。
プログラムは、はじめに広域変数としてledの値を0にしています。ledはLEDの点灯状態(0で消灯状態、1で点灯状態)を表しています。次にsetup()とtoggle()の2つの関数を定義しています。
ここで、「setup()」は特別な関数の名前になっていて、ページが表示された時にこの関数が実行されます。そこでは、まずpinModeでLEDが接続されているD9ピンを出力(OUTPUT)にしています。OUTPUTは予め定義された組み込み変数です。次の「setInterval("toggle()",1000)」で、1000ms(1秒)毎に「toggle()」が呼び出されるよう指示しています。toggle()が呼び出されると、LEDの点灯状態ledを0なら1に、1なら0にし、その値をそのままdigitalWrite()で出力します。
JavaScriptプログラムでは「delay」や「wait」などの関数は用意されておらず、setInterval()やsetTimeout()を使ってプログラムを作ります。
blink.html:
|
画面上のボタンが押されるとプログラムが実行される例です。「<button>点灯</button>」でのようにボタンが表示されます。このボタンを押した時にプログラムが実行されるようにするには「<button onclick=プログラム>点灯</button>」のように書きます。
以下の例では「点灯」ボタンが押されると「digitalWrite(9,1)」が呼び出されます。
button0.html:
|
下図左のようにD1ピンにスイッチを接続し、「pinMode(D1, INPUT_PULLUP)」とすると、下図右のようにマイコンに内蔵された抵抗が有効になります。すると、D1ピンはスイッチをオンにすると低い電圧(0V)になり、スイッチをオフにすると高い電圧(5V)になります。この抵抗を「プルアップ抵抗」といいます。「高い電圧に引っ張り上げる抵抗」というような意味です。
スイッチを接続 |
プルアップ抵抗 |
コマンド入力欄を使い、D1ピンをプルアップ入力に設定した後、D1ピンが高い電圧(1)か低い電圧(0)かをアラート表示してみましょう。
|
(練習) D1ピンに接続したスイッチを押した時と放した時のスイッチ両端の電圧を、テスターで測りなさい。
(練習) スイッチを押した時と放した時の「alert(digitalRead(D1))」の結果を確かめなさい。
以下のプログラムはスイッチの状態をデジタル値としてブラウザ画面に数字で表示します。
button1.html:
|
以下は、ブラウザ画面への表示に加え、LEDの点灯・消灯も行うようにしたプログラムです。
button2.html:
|
(練習) スイッチを押した時にLEDが点灯しブラウザ画面に「ON」が表示され、スイッチを放した時にLEDが消灯しブラウザ画面に「OFF」が表示されるようにしなさい。
以下のプログラムは、スイッチを押すと交互にLEDが点灯・消灯します。考え方は、「スイッチが押された瞬間に(つまりさっき押されていなくて今押されたら)LED表示を反転する」というものです。buttonSには「今のスイッチの状態(0または1)」、lastSには「さっきのスイッチの状態(0または1)」、変数ledSには「今のLEDの点灯状態(1が点灯、0が消灯)」を保存します。
まず現在のD1ピンの状態(1または0)を読み取り、buttonSに入れます。そして、スイッチがさっきまで押されていなくて今押されているならledSの値を0なら1、1なら0にします。その後、D9ピン(LED)にledSの値を出力し、今のスイッチの状態を記憶します。
button3.html:
|
(練習) 緑色LEDを増設し、スイッチを押すと赤色LEDと緑色LEDが交互に点灯するようにしなさい。
以下のプログラムは、スイッチ操作4回に一度LEDが点灯します。
スイッチが押されると、Cにスイッチが押された回数を記憶します。つまり、スイッチがさっきまで押されていなくて今押されたならCの値に1を加えます。その後、「C%4==0」つまりCの値を4で割った余りが0であればLEDを点灯し、そうでなければLEDを消灯します。最後に、今のスイッチの状態を記憶します。
button4.html:
|
(練習) 「C%4==0」の箇所を「C%7==0」や「C%4!=0」などに変えて、どのような動作になるか調べなさい。
(練習) 2個の押しボタンスイッチを使い、一方のスイッチを押すとLEDが点灯し、もう一方のスイッチを押すと消灯するようにしなさい。
はじめに、コマンド入力でLEDの明るさを変えてみます。analogWrite(ピン,値)は、指定したピンに0~255のアナログ値を出力します。0~255の値に応じて電圧(0~5V)ピンの電圧は0~5Vになります。ただし、アナログ出力に利用できるピンは3, 5, 6, 9, 10に限られているので注意が必要です。
|
以下の例ではWeb画面上のスライダーでLEDの明るさをコントロールします。「<input type=range ...>」の箇所でスライダーの表示を指示していて、「value=0」は初期値を0、「min=0 max=255 step=1」はスライダーの返す値を0~255で1きざみにする指示です。また、「onchange=...」の箇所にスライダーの値が変化した時に呼び出すプログラムを書いています。
slider.html:
|
下図左のようにA0ピンにボリュームを接続すると、ボリュームの操作に応じてA0ピンの電圧は0~5Vに変化します。analogRead(A0)は、A0ピンの電圧(0~5V)に応じて0~1023の値を返します。
コマンド入力欄を使い、をanalogRead(A0)でA0ピンの値を読み取り、アラート表示してみましょう。
|
(練習) ボリュームを操作し、A0の電圧がどの範囲で変化するか、テスターで測りなさい。
(練習) ボリュームを操作し、「alert(analogRead(A0))」の結果を確かめなさい。
以下のプログラムはA0ピンの電圧値を0~1023の値としてブラウザ画面に表示します。
以下のプログラムはこの値をブラウザに数字で表示します。
analog.html:
|
以下のプログラムは読み取ったアナログ値をブラウザにバーグラフで表示します。
bargraph.html:
|
analogRead(A0)は、A0ピンの電圧(0~5V)に応じて0~1023の値をとります。以下のプログラムはこれを利用し、ボリュームの値に応じてLEDの点滅時間が変化します。
analogblink.html:
|
以下のプログラムは、ボリュームのアナログ値(0~1023)が400未満の時にLEDを点灯します。
autolight.html:
|
押しボタンスイッチやスライドスイッチは、操作用のスイッチですが、センサーとしても活躍しています。例えば、CD/DVDデッキやコピー機やプリンタなど動きを伴う機器には、所定の位置に来たがどうかを検知するために、マイクロスイッチが必ずといっていいほど使われています。このような使われ方をするスイッチを「リミットスイッチ」と呼ぶこともあります。
9.7のモーターカーでは車の先端にマイクロスイッチを使いました。ふたつの金属片を接触させるだけでスイッチ(センサー)となるので、オリジナルのスイッチを作ることも難しくはありません。所定の水位になったかどうかを検知するピンポン球を使った浮力スイッチ、傾けると金属ボールが移動する傾斜スイッチなど、用途に応じて工夫するのも楽しいでしょう。
5.2のボリュームの代わりに明るさセンサー(CDS)をつないでみましょう。明るくなるほどCDSの抵抗値が低くなり、A0ピンの電圧は高くなります。一定以下に暗くなるとLEDが点灯します。プログラムは5.2と同様です。ただし、明るさの閾値「400」の値は適切な値に変更する必要があります。
analog.html:
|
以下のプログラムは読み取ったアナログ値をブラウザにバーグラフで表示します。
bargraph.html:
|
街路灯は、暗くなると点灯します。以下のプログラムは、明るさの値が400未満の時にLEDを点灯します。プログラムは5.4と同じです。
autolight.html:
|
街路灯では、境界値付近でledが点灯したり消灯したり不安定になるのを避けるために、下図のような「ヒステリシス特性」を持たせます。
hysteresis.html:
|
(練習) ヒステリシス特性の効果を確かめなさい。また、400と500の値を変えて、適切な値をみつけなさい。
以下のプログラムは音量をバーグラフで表示します。5.3と同じプログラムです。
bargraph.html:
|
以下のプログラムは、音を検知したらLEDを3秒点灯するものです。
sound3.html:
| < |
(練習) 手をたたくとカウントアップしブラウザに回数を表示するプログラムを作りなさい。
赤外線の反射光で数mm程度の距離に反射物を検知するセンサーです。モーターカーと組み合わせると、ライントレースや衝突回避などが可能になります。以下のプログラムは5.2と同じものです。センサを接続して、analogRead(A0)でどの程度の値が返されるかがわかります。
analog.html:
|
D9ピンに接続したブザーから指定したkeyで音を出すことができます。D9ピンにブザーを接続し、以下の操作で確認してください。
|
keyはmidiのノート番号(21~108)または文字列("A0"~"C8")で指定します。また、長さは[ms]で指定します。長さを省略すると300[ms]となります。
sendNote()ではなくplayNote()を使うと、ブラウザから音を出すことができます。以下の操作で確認してください。
ブラウザからドラム音を出すこともできます。
以下は、簡単な演奏プログラムで、D9ピンに接続したブザーから音が出ます。midi音源を接続しても動作します。Javascriptにはdelay()という関数がないため、setTimeout()で次の音に進みます。
sendnotes.html:
| < |
以下は、ブラウザで演奏するプログラムです。
playnotes.html:
| < |
以下は、楽譜データを参照しながら演奏するプログラムです。楽譜データがプログラムと分離されているので、長い曲も表しやすくなっています。midi音源を接続しても動作します。
midimelody.html:
| < |
楽譜はさまざまな方法で表現することができます。以下は、少し長い曲を演奏するプログラムです。
playmidi.html:
|
以下は、「私だけの電子オルゴール」のように「ドドソソララソー」のように楽譜を入力できるようにした例です。
オモチャのドラムを左右2つのスティックで叩きます。左のスティックはセンタードラム(L)とサイドドラム(S)、右のスティックはセンタードラム(R)とハイハット(H)を担当し、サーボモータでそれぞれのドラム位置にスティックを移動します。
drum1.html:
|
|
オモチャの鉄琴を左右2つのスティックで叩きます。左のスティックはドレミファ(C4 D4 E4 F4)、右のスティックはソラシド(G4 A4 B4 C5)を担当し、サーボモータでそれぞれの位置にスティックを移動します。
tekkin1.html:
|
|
複数の楽器で「セッション」も楽しめます。グループ学習でやってみると面白いと思います。ブラウザ画面から音が出ますので、楽器が1台でも十分楽しめます。
それぞれのパソコンのブラウザ画面でを押すと、「正10秒」まで待って演奏を開始します。ボタンを押すタイミングが少しずれても大丈夫です。パソコンの時刻同期の設定をきちんとしておくと時刻のズレを少なくできます(NICTのページで確認できます)。ここではパソコン毎に多少時刻がずれていてもいいように、±1秒の範囲で調整できるようにしてあります。
session1.html:
|
|
以下は楽譜データを分けて(sample.js, akahana.js, ...)、曲を選択できるようにした例です。NeoPixelをつなぐと演奏に連動してカラフルに光ります。イルミネーションのオブジェはngo-tecさんのページを見て作りました。「正10秒」で同期演奏できますし、「正時」に演奏させれば「からくり時計」となります。ブラウザ画面上で楽譜を入力して演奏させることもできます。詳しくは「ミニドラム・ミニ鉄琴」のページをご覧ください。
|
ブラウザの音声合成機能を用いて、おしゃべりするページを作ることができます。
|
|
以下は、「九九」を合成音声で読み上げるプログラムです。
kuku.html:
|
以下は、外部スイッチが押されると「九九」をランダムに読み上げるプログラムです。
kukubutton.html:
|
利用者に適したスイッチを使い、合成音声の読み上げで支援するさまざまなツール(VOCA)をWebで作ることができます。
(練習) 2個のスイッチを接続し、それぞれ「はい」「いいえ」の合成音声が出るようなVOCAを作りなさい。
NeoPixelはフルカラーLEDがシリアルに連結されていて(ここでは10連LEDを使用)、1本の信号線で任意のLEDの発光をコントロールできるのが特徴です。WebIOでは、4ピンに接続した最大12連のNeoPixelをpixelコマンドで制御することができます。パラメータで、順にLEDの番号(0~11)、Redの明るさ(0~255)、Greenの明るさ(0~255)、Blueの明るさ(0~255)を指定します。
LEDの番号(0~11)と色相(0~255)と明るさ(0~255)を指定することもできます。明るさの指定を省略すると255として扱われます。
まず、コマンド操作で試してみてください。
|
以下のプログラムは、ひとつ目のLEDを赤で点滅させます。1秒点灯・1秒消灯をくりかえします。下図右は点滅の時間的な変化をタイムチャートで示したものです。
pixelblink1.html:
|
次のようにすると10個のLEDが緑で点滅します。
pixelblink10.html:
|
次のようにすると明るく短時間点灯する「フラッシュ」になります。
pixelflash10.html:
|
(練習) 10個のLEDが1秒毎に「青→黄→赤」を繰り返すプログラムを作りなさい。
以下のプログラムは、10個のLEDを順に点灯させます。このようなイルミネーション効果は「ワイプ」と呼ばれます。
pixelwipe.html:
|
(練習) 「赤のワイプ→緑のワイプ→青のワイプ」を繰り返すプログラムを作りなさい。
以下のプログラムは、10個のLEDを順に点灯・消灯させます。
pixelsweep.html:
|
(練習) 100ms毎にスイープするようにしてみなさい。
以下のプログラムは、4個に1個の点灯がスイープし、波(ウェーブ)のように(あるいは追いかけているように)見えます。「P=3」にすると3個に1個の点灯になります。
pixelwave.html:
|
(練習) 「1個おき」「3個おき」のウェーブにしてみなさい。
以下のプログラムは、ひとつ目のLEDをだんだん明るくし(赤を0→50)、だんだん暗くし(赤を50→0)、これを繰り返します。
pixelfade.html:
|
(練習) 色を変えてみなさい。また速さを変えてみなさい。
(練習) 10個のLEDを同時にフェードイン・フェードアウトさせなさい。
ひとつ目のLEDをフェードアウトしながら、ふたつ目のLEDをフェードインすると滑らかに変化させることができます。これを「クロスフェード」といいます。
pixelxfade.html:
|
以下は、クロスフェードをスイープに応用した例で、LEDの点灯が滑らかに移動します。
pixelxsweep.html:
|
クロスフェードを用いると色を滑らかに変化させることができます。以下のプログラムは、ひとつ目のLEDの色が赤→緑に滑らかに変化します。
pixelxrg.html:
|
RGBの値と表示色の関係は下図のようになっています。
以下のプログラムは、すべてのLEDの色をフルカラーで連続的に変化させます(明るさ最大85)。
pixelxrgb.html:
|
以下のプログラムは、すべてのLEDの色を場所を変えながらフルカラーで連続的に変化させます(明るさ最大85)。rgb()は0~255の色相Wを与えると、R,G,Bの変数に値(各々0~85)がセットされます。
pixelrgb.html:
|
以下は、「ドロップ」のイルミネーションの作例です。水滴が滴り落ちるイメージで、最後にキラッと光ります。
pixeldrop.html:
|
以下は、NeoPixelリング(12個)を使い、ランダムに点灯させるようにした例です。オブジェの作り方はngo-tecさんのページを参考にしました(クッキングシートを使ってみました)。点灯位置と点灯色と点灯時間間隔をランダムにし、点灯後はだんだん暗くしています。
pixelfire.html:
|
(練習) オリジナルのイルミネーションを考え、作ってみなさい。
ラジコン用のサーボモーターは、右図のようなPWM波形で角度(0~180°)を制御するように作られています。 以下の例は、サーボモーターが車のワイパーのように動きます。 |
sweep.html:
|
以下のプログラムは、ボリュームの値によってサーボモーターの位置(角度)が変わります。
knob.html:
|
(練習) 上記のknob.htmlでボリュームの代わりに明るさセンサーを使い、明るさで位置が変わるようにしなさい。
下図のようにモーターを接続します。まず、motorコマンドでモーターを動かしてみてください。左右のモーターの速度は-256~255で指定します。電源への負荷を軽減するために、早さを変える場合は一旦停止させてください。
|
以下はブラウザに表示されたスライダを操作することによってモーターの回転速度が変わります。
motorslider.html:
|
以下は、ブラウザ画面のボタン操作で前後左右に動かします。
motorbutton.html:
|
以下はボリュームの値によってモーターの回転速度が変わります。
motorvr.html:
|
以下は音センサモジュールと組み合わせた例で、手を叩く(A0に接続した音センサーが400以上)と1秒間前進します。
motorsound.html:
|
以下の例は、車の先端がテーブルから落ちそう(A0に接続した赤外線反射センサーが30以上)になると、少し後退し、右回転して、再び前進します。
motorir.html:
|
イルミネーションの時と同じLEDを使い、押しボタン信号機を作ってみます。下図の状態遷移図で考え、LEDの割り当ては
signal.html:
|
また、以下は小学校などで利用されている「交通安全教室用信号機」ですが、上記と組み合わせればWebページと連動した指導ができるようになるかもしれません。
以下は、デジタル温湿度センサSHT31を使った温湿度計です。TEMPとHUMIは特別なアナログ入力ピンでA0やA1と同じように使います。
thermometer.html:
|
以下は、グラフ表示など多目的に使えるようにした例です。データは使用するパソコンのブラウザに保存され、そのデータをネットワーク経由で見ることはできません。理科や保健の授業などで利用できるかもしれません。ネットワークを利用した気温・湿度・熱中症指数(WBGT)・CO2モニタリングシステムはこちらをご覧ください。
| |
以下はCO2センサも利用できるようにした例です。 | |
|
下図のように、WebIOの動作を確かめるページを作りました。プログラムをクッキーに保存することもできます。
ブレッドボードで利用できる入出力モジュールの製作例です。
モジュール | 回路図 | 製作例 |
---|---|---|
可変抵抗モジュール | ||
明るさセンサーモジュール | ||
赤外線反射モジュール | ||
音量センサーモジュール | ||
10連LEDモジュール | NeoPixel(Dinはpin10に接続) | |
モーターモジュール | 右モーターはA0とA1をGNDに接続 |
名称 | 外観 | 備考 |
---|---|---|
Arduino Pro Micro | スイッチサイエンス 2492円 (互換品が600円程度で入手できます) |
|
ブレッドボード EIC-301 | EIC-301 秋月 190円 | |
ブレッドボード ジャンパーワイヤ 15cm | 秋月 10本 300円 | |
ブレッドボード ジャンパーワイヤ EIC-J-S | 秋月 250円 | |
LED | 秋月 10個 120円 | |
フルカラーシリアルLEDテープ | SwitchScience 756円 | |
圧電スピーカー | 秋月 2個 100円 | |
プッシュスイッチ DS-660R-C | 千石 84円 | |
抵抗 1/4W 4.7Ω, 100Ω, 220Ω, 470Ω, 1kΩ, 10kΩ | 秋月 100本 100円 | |
CDS(光センサ) | 秋月 30円 | |
温湿度センサ SHT31 | 秋月 950円 | |
赤外線反射センサ LBR-127HLD | 秋月 50円 | |
サーボモーター SG-90 | 秋月 400円 | |
モータードライバ DRV8830 | 秋月 170円 |
(1) ProMicroで使用できるピン
ピン | 定義した変数名 | 備考 | |
---|---|---|---|
デジタル入出力 アナログ出力(PWM)# | アナログ入力 | ||
0 | D0 | - | TX(midi Out) |
1 | D1 | - | RX(midi In) |
2 | D2 | - | I2C SDA |
3 | D3 # | - | I2C SCL |
4 | D4 | - | NeoPixel |
5 | D5 # | - | |
6 | D6 # | A7 | Bzz...sendNote()に対応 |
7 | D7 | - | |
8 | D8 | - | |
9 | D9 # | - | Servo |
10 | D10 # | - | Servo |
14 | D14 | - | MISO |
15 | D15 | - | SCK |
16 | D16 | - | MOSI |
18 | D18 | A0 | |
19 | D19 | A1 | |
20 | D20 | A2 | |
21 | D21 | A3 | |
22(仮想ピン) | - | TEMP | SHT31 温度 |
23(仮想ピン) | - | HUMI | SHT31 湿度 |
24(仮想ピン) | - | CO2 | CDM7160 CO2濃度 |
設定値または取得値 | 0 / 1 # 0 - 255 | 0 - 1023 |
(2) 組み込み定数(拡張分)
定数名 | 内容 |
---|---|
HIGH, LOW | デジタル出力またはデジタル入力されたピンの状態(HIGHは1、LOWは0) |
OUTPUT INPUT, INPUT_PULLUP ANALOG_INPUT OUTPUT_TONE, OUTPUT_NEOPIXEL | pinMode()で設定する入出力のモード |
D0~D10, D14~D16, D18~D21 | デジタル入出力ピンおよびアナログ出力ピン |
A0~A3, A7 | アナログ入力ピン |
TEMP, HUMI, CO2 | I2C接続したSHT31, SCD30, CDM7160の測定値を入力する仮想ピン |
(3) 組み込み関数(拡張分)
関数名 | 内容 |
---|---|
pinMode(pin, mode) | pinをmodeにする(modeはOUTPUT, INPUT, INPUT_PULLUP, ANALOG_INPUT, OUTPUT_TONE, OUTPUT_NEOPIXEL) |
digitalRead(pin) | pinの値を読んでHIGHまたはLOWの値を返す |
digitalWrite(pin, HIGH) digitalWrite(pin, 1, t) | pinにHIGHを出力する(値はHIGHまたはLOW) pinをt(ms) 1にする |
analogRead(A0) | A0, A1, A2, A3, A7ピンのアナログ値を読み、0~1023の値を返す。 A4(TEMP), A5(HUMI), A6(CO2)ピンのアナログ値を返す。 |
analogWrite(pin, value) | pin(3,5,6,9,10,11のいずれか)に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(s) talk(s,voice) talk(s,voice,pitch) talk(s,voice,pitch,speed) |
ブラウザの合成音声でsを読み上げる(声はHaruka) 声を指定 日本語: 10 Google 日本語, 19 Ayumi, 20 Haruka, 21 Ichiro, 22 Sayaka 英語: 1 US, 2 UK Female, 3 UK Male 声と音程(0.1~2)を指定 声と音程と速さ(0.1~10)を指定 |
servo(pin, pos) | pinに接続したサーボの角度をpos(0~180)にする(pinは9と10を推奨) |
motor(lspeed, rspeed) | 左右のモーターの速度をlspeed, rspeed(それぞれ-255~255)にする |
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に接続 |
$(id) | document.getElementById(id)の短縮表現 |
上記とは別に、以下の関数をプログラム中に定義すると特別な役割を果たします。
関数名 | 内容 |
---|---|
setup() | ページが表示された時にこの関数が呼び出される |
loop() | 20ms毎にこの関数が呼び出される |
機能 | send(PC → I/O) | receive(I/O → PC) | JavaScript関数 | 備考 | |||||
---|---|---|---|---|---|---|---|---|---|
byte1 | byte2 | byte3 | byte1 | byte2 | byte3 | ||||
8x | [midi] NoteOff | 1000nnnn | 0kkkkkkk | 0vvvvvvv | 1000nnnn | 0kkkkkkk | 0vvvvvvv | ピン6の音を停止 | |
9x | [midi] NoteOn | 1001nnnn | 0kkkkkkk | 0vvvvvvv | 1001nnnn | 0kkkkkkk | 0vvvvvvv | sendNote(key, t) | ピン6にkey0-125のブザー音をt[ms]出力 |
Ax | [midi] Pressure | 1010nnnn | 0kkkkkkk | 0vvvvvvv | |||||
NeoPixel | 1010nnnn | 0rgbllll | 0rrrrrrr | Pixel(LED, R,G,B) | LED0-15の色をR(0-255)G(0-255)B(0-255)にする | ||||
1010nnnn | 0ggggggg | 0bbbbbbb | |||||||
analogIn | 1010nnnn | 0vvvvvaa | 0vvvvvvv | analogRead(pin) | A4(22),A5(23),A6(24)の値0-4095を返す(20ms毎に更新) | ||||
Bx | [midi] Control Change | 1011nnnn | 0ccccccc | 0vvvvvvv | |||||
PinMode | 1011nnnn | 011100pp | 0pppmmmm | pinMode(pin, mode) | pin0-21のpinModeをmode0-13にする | ||||
DigitalOut | 1011nnnn | 011100pp | 0ppp111v | digitalWrite(pin, val) digitalWrite(pin, 1, t) | pin0-21を0/1にする tを指定した場合は t[ms] 1にする | ||||
DigitalIn | 1011nnnn | 011100pp | 0ppp111v | digitalRead(ch, pin) | pin0-21の値0/1を返す(20ms毎に更新) | ||||
Set Channel | 1011nnnn | 01110100 | 00000000 | setCh(ch) | |||||
Character IO | 1011nnnn | 01110101 | 0ccccccc | 1011nnnn | 01110101 | 0ccccccc | sendChar(char) | 文字0-127を送る 文字0-127を返す | |
([midi] Program Change) | 1011nnnn | 01111111 | 0ppppppp | setVoice(ch, voice) | ch0-15を音源0-127にする | ||||
Reset | 1011nnnn | 01111001 | 00000000 | reset() | Reset All Control | ||||
AllNoteOff | 1011nnnn | 01111011 | 00000000 | All Note Off | |||||
Cx | [midi] Program Change | 1100nnnn | 0ppppppp | ||||||
Dx | [midi] Pressure | 1101nnnn | 0vvvvvvv | ||||||
Ex | [midi] Pitch Bend | 1110nnnn | 0lllllll | 0mmmmmmm | |||||
Servo | 1110nnnn | 00vppppp | 0vvvvvvv | servo(pin, val) servo(pin, val, t) | pin0-21のサーボモーターを0-180にする tを指定した場合はt[ms]後に停止する | ||||
Motor | 1110nnnn | 00v1111p | 0vvvvvvv | motor(lspeed, rspeed) | 左モーター(pin30) 右モーター(pin31)のスピードを -128~127 にする | ||||
analogOut | 1110nnnn | 01vppppp | 0vvvvvvv | analogWrite(pin, val) | pin3,5,6,9,10を0-255にする | ||||
analogIn | 1110nnnn | 00vvvaaa | 0vvvvvvv | analogRead(pin) | A0(18),A1(19),A7(6)の値0-1023を返す(20ms毎に更新) | ||||
Fx | [midi] SysEx | 1111xxxx |
|
|
|