# Arduinoと通信しよう **Arduino**というデバイスを使って、LEDやセンサなど外部デバイスとの入出力をしてみよう。Arduinoを使用するためには、ローカル版のドリトルが必要である。 ## Arduinoの入手 Arduinoは、イタリアで開発された汎用入出力ボードである。設計がオープンソースとして公開されており、さまざまな製品が存在する。((入手方法は、ArduinoのWebサイト(http://www.arduino.cc/)の「Buy」というページから「Japan」の項目で日本での代理店を見ることができる。))今回は、「Arduino UNO」という最新のボードで動作を確認した。このボードにはデジタル入出力が12ポート存在し、そのうち6ポートはアナログ出力が可能である。その他に、アナログ入力が6ポート用意されている。((Arduino UNOの基板上では、アナログ出力可能なポート番号には「〜」の記号が付いている。)) {{:pasted:20180103-160856.png}} ## ドリトルと通信するための設定 Arduinoは標準では、Processing言語で記述されたプログラムを転送して自律的に動作する。本書ではArduinoにドリトルと通信するためのプログラムを転送し、ドリトルと通信しながら対話的に動作させる。Arduinoに格納したプログラムは電源を切っても残るため、いちど書きこんでおけばよい。以下に手順を示す。 - ArduinoのWebサイト(http://www.arduino.cc/)の「Download」ページから、使用しているコンピュータ(Windows, Mac OS X, Linuxなど)に合わせたソフトウェアをダウンロードし、インストールする。 - インストールしたプログラム(**Arduino IDE**)を起動し、ドリトルのパッケージに付属する**arduino_dolittle.ino** というファイルを開く。すると、画面に「#include 」で始まるプログラムが表示される。 - 「Tools」メニューの「Board」から、使用するArduinoの種類を選ぶ。 - Arduino IDE上部の「△」のボタン(Verify)を押す。すると、画面下部に「Done Compiling」と「Binary sketch site: ...」というメッセージが表示される。 - USBケーブルでArduinoをパソコンに接続する((Macでは設定が必要な場合がある。「はじめに」(p.**mac_install** )を参照。「新しいネットワークインターフェースが検出されました」と表示された場合は、キャンセルでダイアログを閉じて構わない。))。すると、基板上の緑色のLEDが点灯する。 - Arduino IDE上部の「→」のボタン(Upload)を押す。シリアルポートを選択するダイアログが開いた場合は、Arduinoが接続されたポートを選択する((ポートが不明な場合は、Windowsであれば「COM」に続く数字の大きい順に試し、Arduinoが反応するポートを探す。Macの場合は「/dev/tty.usbで始まる名前を探す」。ポートは「Tools」メニューの「Serial Port」から選択することもできる。))。すると、基板上のオレンジ色のLEDが点滅してプログラムが転送される。 - 正常に転送された場合は、Arduino IDEの画面下部に「Done uploading」と表示される。このメッセージを確認したら、Arduino IDEを終了する。 ## デジタル出力による動作の確認 動作を確認するには、ArduinoとUSBケーブルを接続した状態で、ドリトルに次のプログラムを入力して実行する。Arduino上の「L」と書かれたオレンジ色のLEDが1秒ごとに10回点滅すれば、ドリトルとの通信は正常に行われている。 システム!"arduino"使う。 a=arduino!作る。 a!(システム!シリアルポート選択)ひらけごま。 led=a!13 デジタル出力。 「led!0 書く。a!1 待つ。led!1 書く。a!1 待つ」!10 繰り返す。 a!とじろごま。 ドリトルからArduinoを制御するプログラムは、次の形で記述する((「(システム!シリアルポート選択)」の部分は、あらかじめわかっている場合は、「"COM1"」のようにポート名を文字列で記述することも可能である。))。先頭の行では、Arduinoを**使う**プログラムを作成することを示している。2行目の「a」は、接続されたArduinoに対応するオブジェクトである。 システム!"arduino"使う。 a=arduino!作る。 a!(システム!シリアルポート選択)ひらけごま。 ... a!とじろごま。 「...」の部分には、Arduinoを制御するプログラムを書く。今回は最初に、13番ポートに**デジタル出力**するオブジェクトを作り「led」という名前を付けている。基板上には13番ポートに接続された**発光ダイオード**(**LED**)が存在するため、外部にLEDを接続しなくても動作の確認が可能である。 led=a!13 デジタル出力。 続いて「led」に「書く」により出力を行う。デジタル出力では、「1」を書くことで出力をONにし、「0」を書くことで出力をOFFにする。このプログラムでは、0と1を1秒ごとに出力することで、LEDを点滅させている。 「led!0 書く。a!1 待つ。led!1 書く。a!1 待つ」!10 繰り返す。 Arduinoに接続したLEDを光らせる場合は、「デジタル出力」のパラメータに接続したポート番号を指定する。ブレッドボードを利用した配線の例は**arduinoSample** を参照されたい。 ## アナログ出力 Arduinoの特定のポート((Arduino UNOでは基板上の番号の前に「--」が付いた3, 5, 6, 9, 10, 11の6個のポートでアナログ出力が可能である。))では、**PWM**((ONとOFFの比率を変えながら高速に繰り返すことで、擬似的にアナログ値を表現する方式。))による**アナログ出力**が可能である。アナログ出力では、出力する値として0から255の数値を指定できる。次のプログラムでは、最初に10番ポートに接続されたLEDを「150」の明るさで点灯させた後、「255」の明るさで点灯し、最後に「0」で消灯している。 システム!"arduino"使う。 a=arduino!作る。 a!(システム!シリアルポート選択)ひらけごま。 led=a!10 アナログ出力。 led!150 書く。a!1 待つ。 led!255 書く。a!1 待つ。 led!0 書く。 a!とじろごま。 ## デジタル入力 **デジタル入力**は、特定のポートの電圧の有無を0と1の値で返すことで、スイッチ等のONとOFFを検出できる。 次のプログラムでは、12番ポートに入力があるときに画面のタートルを前進させている。(スイッチが接続されている場合は、押されているかどうかでタートルの動きが変化する) システム!"arduino"使う。 a=arduino!作る。 a!(システム!シリアルポート選択)ひらけごま。 sw=a!12 デジタル入力。 かめた=タートル!作る。 「かめた!(sw!読む)歩く」!100 繰り返す。 a!とじろごま。 ## アナログ入力 **アナログ入力**は、特定のポートの電圧を0から255の値で返すことで、各種センサの入力を検出できる。 次のプログラムでは、アナログの0番ポートに接続された**光センサ**(**CdS**)の入力値によって、画面のタートルを回転させている。 システム!"arduino"使う。 a=arduino!作る。 a!(システム!シリアルポート選択)ひらけごま。 cds=a!0 アナログ入力。 かめた=タートル!作る。 「かめた!((cds!読む)×10)向き」!100 繰り返す。 a!とじろごま。 ## Arduinoの配線例 **arduino_analog_output** 節から**arduino_analog_input** 節の動作を確認するための回路図を示す。抵抗値はスイッチに接続したものが100KΩ、他は10KΩである。 {{:pasted:20180103-160941.png}} 写真は**ブレッドボード**を利用して配線したものである。配線材、LED等の部品は、スイッチサイエンス社((http://www.switch-science.com/))の「Arduinoをはじめようキット」のものを使用した。 {{:pasted:20180103-160956.png}} ## 加速度センサの応用例 加速度センサを利用すると、傾きを検出できる。次の回路図のように、3軸加速度センサを接続することが可能である。((今回は、秋月電子通商で販売されているカイオニクス社の「3軸加速度センサモジュール KXM52--1050」で動作を確認した。)) {{:pasted:20180103-161012.png}} 3軸加速度センサを利用するプログラム例を示す。ここでは1方向の傾きだけを利用して、Wiiリモコンのように画面のタートルを操作することができる。 システム!"arduino" 使う。 a=Arduino!作る。 a!(システム!シリアルポート選択)ひらけごま。 かめた=タートル!作る。 「かめた!400 歩く 90 左回り」!4 繰り返す。 枠=かめた!図形を作る。枠!-200 -200 移動する。 判定=ラベル!作る。 xin=a!0 アナログ入力。 x値=フィールド!作る。 「 かめた!5 歩く。  x=xin!読む。  x値!(x)書く。  かめた!(x-127)右回り。  かめた:衝突=「かめた!-10 歩く 180 右回り。判定!"OUT" 書く 」。 」!1000 繰り返す。 a!とじろごま。