"Arduino"
"Arduino"は,オープンソースのArduino Unoマイクロコントローラボード上のデジタルとアナログのピンを通して,低レベルの汎用入出力を提供する. このマイクロコントローラボードは,シリアル上でWolfram言語と接続されている.
デフォルトでサポートされるボードはArduino Unoである.これは,基本的な8ビットのマイクロコントローラチップを搭載している.Arduino Yunもサポートされている.これは,コプロセッサを通してチップにネットワーク機能を提供し,Data Dropとインタラクトすることを可能にする.
Arduino Yunでは,実行中のスケッチはWi-Fi接続またはEthernetケーブルを通してインターネットに接続することができる.ボードでEthernet接続を使う場合には,Arduino特定の設定は必要ないが,ワイヤレスのWi-Fi接続を使う場合には,ボードがどのワイヤレスネットワークに接続されているのかを設定する必要がある.この情報はArduino LLCのWebサイトに掲載されている.
Wolfram言語のArduino関連の機能はすべてArduino YunとArduino Unoの両方のボードにおいて使用可能である.特に指定されていない限り,すべての機能が使える.
さまざまな種類のタスクに使用することが可能であり,特にモータ,センサ等の物理的なシステムデバイスとインタラクトすることに焦点を当てる.
GPIO(汎用入出力),およびデバイス上でのC/C++コードの実行に使うことができる.
さらにボードには,13個のデジタル入出力,およびパルス幅変調が可能な6個のピンと,アナログ電圧とデジタル入出力を読み取ることができる6個のピンが含まれる.
Arduinoのボードでは,以下のピンが読取りと書込みに使用できる:2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, "A0" (14), "A1" (15), "A2" (16), "A3" (17), "A4" (18), "A5" (19).
Arduinoは,Wolfram言語と交信するスケッチと呼ばれるカスタムプログラムを実行する.このスケッチは,DeviceRead,DeviceWrite,DeviceExecuteのいずれかを使う前に,DeviceConfigureでArduinoにアップロードしなければならない.
注意:デフォルトで,"Arduino"では,ピンは読取りモードと書込みモードのどちらにでも使用することが可能である.DeviceConfigureを使うと,特定のピンを読取り用あるいは書取り用に設定することができる.
デバイス発見
- Arduinoは,シリアルポートで交信を行うので,Arduinoの発見は,基本的にシリアルポートの発見と同じである.このため,Arduinoの自動発見は難しく,現在実装されていない.
- Unixベースのシステムでは,特定のプラグが接続される前と後の/dev/tty*デバイスのリストを比べることによって,シリアル接続の名前を識別することが可能な場合もある.
- Windowsベースのシステムでは,デバイスマネージャを開いて,「バーチャルCOMポート」あるいは単に「ポート(COM & LPT)」(使用しているWindowsのバージョンによる)のリストを調べることによって,シリアル接続の名前を識別することが可能な場合もある.
デバイスを開く
- Arduino IDEがマシン上に見付からない場合には,バージョン1.6.7をダウンロードして$UserBaseDirectoryにインストールするようにという指示が表示される.Arduinoを使うためには,Arduino IDEが必要である.すべてのバージョンのArduino IDEがサポートされている.デバイス特性"ArduinoInstallLocation"と一緒に使うために別の場所を指定することも可能である.
- DeviceOpen は,追加オプションとして"BoardType"をサポートする.このオプションで,どのタイプのArduinoボードと接続するかを指定することができる."BoardType"の有効な値は以下の通りである.
-
"Uno" ATMEGA328pチップがインストールされた通常のArduinoボード(デフォルト) "Yun" 追加のWi-Fiとネットワーク機能が搭載されたArduinoボード - Arduino Yunは,ボード上のコプロセッサを通してインターネットに接続することができる.このため,ネットワーク操作を行っている場合には,コプロセッサが最初に作動し始めるときに遅れが生じる.この遅れは通常,デバイスがオンされてから60秒間ほどである.ピンからの読取りやピンへの書込み等,その他の機能については,デバイスがオンになってすぐに実行できるが,DeviceExecuteのドキュメントで説明されるDatabinAdd関数等のネットワークに依存する機能については,最初に接続した場合には通常より長い時間かかることがある.
- オプション"InitialUpload"を使うと,カスタムのWolfram言語スケッチをDeviceOpenでデバイスに自動的にアップロードすることができる."InitialUpload"のデフォルトはTrueである.注意:"InitialUpload"がFalseである場合には,カスタムのWolfram言語スケッチを使用前にDeviceConfigureでアップロードしなければならない場合もある.
DeviceOpen["Arduino",name]
指定の名前を持つ,シリアルポート上のArduinoを開く.Unixベースのシステムでよく使われる名前には"/dev/ttyXXX"と"/dev/tty.usbserialXXX"があり,Windowsベースのシステムでは"COM1","COM2"等がある.
デバイスの設定
- 注意:スケッチの修正には,Arduinoの再実装が必要である.再実装は,行うのに5秒から30秒かかる場合もあれば,必要に応じて自動的に行われる場合もある.
- DeviceConfigureは,規則のリストに使用することもできる.
- "PinConfigure"は,Arduinoが実行するスケッチを修正しないので, Arduinoを再実装する必要がない.
- ピンを1つの方向に設定すると,そのピンを再設定せずに別の方向に使用することはできなくなる.精度の高いハードウェアを使う前には,それぞれのピンの方向を設定することが望ましい.
- 有効な方向:
-
"Input" ピンをデジタル入力に,あるいはピンがサポートする場合にはアナログ入力に設定する "Output" ピンを,5ボルト(1あるいは高),0ボルト(0あるいは低),アナログ値(PWM)(ピンがサポートする場合)のいずれかを出力することができる,デジタル出力ピンに設定する "AnalogOutput" ピンをアナログ(PWM)出力に設定する.この出力には,0から1までの任意の実数あるいは形式 の任意の有理数( は,0から255までのInteger)を使うことができる "AnalogInput" 0から5ボルトまでのアナログ電圧を自動的に読み取るアナログ入力にピンを設定する - アナログ出力(PWM)は,3,5,6,9,10,11のピンのみでサポートされている.
- アナログ入力は,"A0" (14),"A1" (15),"A2" (16),"A3" (17),"A4" (18),"A5" (19)のピンのみでサポートされている.
- DeviceConfigureは,実行するArduinoのスケッチを設定する.これは,新関数,C++クラス,変数等の機能を加えることができるだけでなく,ピンの方向を制御することもできる.
- Arduino Yun上でData Drop機能を使用できるようにすると,Arduino Yun上のピンの値を指定されたデータビンにDeviceExecuteでアップロードすることができるようにする特定のDatabinAdd関数が使用できる.特定の"BootFunction"も使用できる.この詳細は,"BootFunction"についてのドキュメントを参照のこと.
- Arudino Yun上でData Drop機能を無効にすると,デバイスにアップロードされるその他の関数に,より多くのプログラムスペースが与えられる.
- Data Drop機能は,DeviceConfigureの"Functions"オプションで指定された任意のカスタムC/C++コードで使用する3つのC関数も提供する.DatabinIntegerAdd,DatabinRealAdd,DatabinStringAddはいずれも val を binID で指定されたDatabinに keyName のKeyとともにアップロードする.binID と keyName のどちらも解放されない.これらは,動的に割り当てられている場合には,関数を呼び出すことにより,正しく解放されるはずのものである.binID と keyName はどちらもヌル終端された正しいCスタイルの文字列でなければならない.
- DatabinIntegerAddはIntegerの数をDatabinにアップロードする.
- DatabinRealAddはRealの数をDatabinにアップロードする.
- DatabinStringAddはStringの数をDatabinにアップロードする.
- "Functions"は,指定のC/C++コードをスケッチに加え,このコード集合をDeviceExecuteで実行できるようにする."Functions" は,連想として指定されるべきもので,funcname がAssociation.になる.Association のキーとしては,"ArgumentTypes"が引数の型のリスト(下にまとめられている),"ReturnType"が戻り型,"Code"がC/C++ コードの実際のStringになる.
- 以下は,Wolfram言語とCの間の型の変換をまとめたものである.doubleとfloatは,Arduinoでは同じであり,shortはintと同じであることに注意されたい.Arduinoのアーキテクチャについての詳細は, http://arduino.cc/en/Reference/HomePageをご覧ください.
-
byte, char, short, int, long Integer float, double Real float [], double [] {Real} byte [], short [], int [], long [] {Integer} char [] String - Arduino上のIntegerリストは,Wolfram言語での整数がArduino上のlongデータ型として実装されているため,関数の引数として現れる場合には,(long *)として指定しなければならない.さらに,引数としての単一の整数リストは{{Integer}}として,単一の実数リストは{{Real}}として指定されなければならない.Arduino上のRealリストは,(double *)あるいは(float *)として指定される.
- Arduinoでは,unsigned longデータ型はサポートされていない.
- Arduinoでサポートされる関数の戻り型は,Integer,Real,Stringである.Stringを返す関数については,関数が返す文字列は,ヌル終端されたC文字列でなければならず,さもなければ,未定義の動作が起る可能性がある.
- 無効にできない戻り型を持つ定義の関数の"ReturnType"を削除すると,返された値が無視され,シリアルポート上でWolfram言語に返されなくなる.
- シンボルAssociationを含む"Functions"のレガシー指定もサポートされる.その場合には,上で触れたAssociation は, funcnameArduinoCode[<"Code"codestr, … >]のように,シンボルArduinoCodeの唯一の引数となる.
- SymbolicC関数を使うためには,まずパッケージをロードしなければならない.
- "BootFunction"は,Wolfram言語が接続されていない場合でも,Arduinoがオンになるとすぐに関数が実行されるようにArduinoを設定する.これによって,"BootFunction"をArduinoに配備してから,コンピュータからArduinoを取り外し,別のデバイスからオンにして,アップロードされたコードを実行するということが可能になる.
- コード文字列 codestr は,引数を取らない有効なC/C++関数でなければならない.関数に戻り値が含まれる場合には,それは無視される.
- 追加のオプション"Scheduling"をAssociation内で指定し,"BootFunction"が呼び出されるスケジュールを制御することができる.設定関数のスケジュールについては,下のDeviceExecuteセクションを参照されたい.
- "BootFunction"をデバイスにアップロードする際に,デバイスが"BootFunction"でコードを実行しているためにふさがっており,それが終了するまで他のリクエストに対して応答しないということがある.設定関数からの結果が返されず,無限に実行される場合には,他の機能にアクセスするためにデバイスをDeviceConfigureで再設定する必要がある.
- このDatabinAdd "BootFunction"の追加オプション:
-
"Pin" 必須 値を読み取るピン.有効なArduinoピンでなければならない. "Databin" 必須 ビンの"UUID"か"ShortID"の文字列あるいはDatabinオブジェクトとしてアップロードするDatabin. "Key" 任意 デフォルトでは,値は"AnalogPinX"または"DigitalPinX"のキーと一緒にアップロードされるが,指定すると,Keyの値と一緒にアップロードすることができる. "ReadMode" 任意 アナログピンは,0ボルトから5ボルトまでの連続した電圧として,または1か0のデジタル値として読み取ることができる.このオプションは,電圧の"Analog"の読取りと,1または0としてのデジタル状態の"Digital"の読取りのどちらのモードから読み取るかを制御する.デフォルトはAutomaticであり,デジタルのピンは"Digital"として,アナログのピンは"Analog"として読み取られる. "Scheduling" 任意 デフォルトでは,"BootFunction"は起動時に一度実行されるが,DatabinAdd関数を設定して"Scheduling"で指定されるスケジュールで実行することもできる."Scheduling"の有効な値については,DeviceExecuteのセクションを参照のこと. - ライブラリは,"Functions"あるいはInitializationオプションで指定された codestr の任意のカスタムコード内で使うためのものである.
- lib に有効な値:
-
"dir" 該当のライブラリを含むディレクトリ "file" 該当のライブラリを含むアーカイブファイル "LibraryName" 組込みライブラリのリテラル名 {lib1,lib2,…} 上記の任意の組合せのリスト - サイズ制限のために,ライブラリの中にはArduinoにアップロードできないものもある.
- "TFT","Ethernet"等のライブラリの中には,他のライブラリに依存するものもある.これらは自動的に解決されるものではなく,ユーザが手作業で指定しなければならない."TFT"と"Ethernet"のライブラリについては,"SPI"ライブラリが必要であり,ライブラリのリストにこれを含む必要がある.
- Arduinoソフトウェアでサポートされる組込みライブラリのリスト:
-
"GSM" Arduino GSMシールドでインターフェースを行うライブラリ "LiquidCrystal" LCDディスプレイでインターフェースを行うライブラリ "Servo" サーボモータを制御するためのライブラリ "Stepper" ステッピングモータを制御するためのライブラリ "TFT" TFTディスプレイでインターフェースを行うライブラリ "Ethernet" Arduino Ethernetシールドでインターフェースを行うライブラリ "Wire" I2Cデバイスでインターフェースを行うライブラリ "SPI" SPI標準を使って通信を可能にするライブラリ "EEPROM" ArduinoのEEPROMの読取りと書込みを可能にするライブラリ "SoftwareSerial" 任意のデジタルピン上でシリアル通信を可能にするライブラリ - Initializationコードが通常使用されるのは,さまざまな関数で使用されるオブジェクト,変数,またはクラスの宣言である.初期化コードの中には,事実,"Functions" codestr オプションの中に置かれるだけでよいものもある.Initializationコードの多くは,代りにライブラリ内に置くことができる.
- アップロードの際のその他のDeviceConfigureのオプション:
-
"FlashVerify" True "Debug" False "CleanIntermediate" True - "FlashVerify"は,プログラムがArduinoにアップロードされた後で確認するかどうかを設定する.これをFalseに設定すると,アップロードにかかる時間は軽減されるが,プログラムが正しくアップロードされずに失敗する可能性が出てくる.また,失敗したかどうかは,Arduinoが正しく作動しないことによってしか知り得ない.したがって,スピードがどうしても必要である場合を除いて,この設定はデフォルトのままにしておくことが望ましい.可能な値は,TrueとFalseである.
- "Debug"は,デバッグの情報をスクリーンに出力するかどうかを設定する.情報には,スケッチとさまざまなライブラリのコンパイルに使われた一時フォルダの他に,スケッチをArduinoで設定,コンパイル,アップロードするために使われる生のコマンドが含まれる.可能な値は,TrueとFalseである.
- "CleanIntermediate"は,Arduinoのカスタムスケッチを設定するのに使われた$TemporaryDirectoryディレクトリ内の中間ファイルを削除するかどうかを設定する.可能な値は,TrueとFalseである.
DeviceConfigure[dev,"PinConfigure"<n1dir1,n2dir2,… >]
ピン ni の方向を diri に設定する.
DeviceConfigure[dev,<n1dir1,n2dir2,… >]
ピン ni の方向を diri に設定する.
DeviceConfigure[dev,"Upload"opts]
DeviceObject dev のスケッチを opts で指定されるように設定し,これをArduinoにアップロードする.
DeviceConfigure[dev,"Upload""DataDrop"True]
Arduino Yun上で,Data Drop機能が使えるようにスケッチを設定する. Arduino Yunではデフォルトであるが,Arduino Unoでは使用できない.
void DatabinIntegerAdd(char * binID,char * keyName, long val)
void DatabinRealAdd(char * binID, char * keyName, double val)
void DatabinStringAdd(char * binID, char * keyName, char * val)
DeviceConfigure[dev,"Upload""Functions"<funcname<"ArgumentTypes"{type1,type2,…},"ReturnType"return,"Code"codestr > >]
引数の型が typei である関数を加え,C/C++定義 codestr を持つ型 return をスケッチに返して,関数がDeviceExecute["Arduino",funcname]で呼び出せるようにする.
DeviceConfigure[dev,"Upload""Functions"<funcnameCFunction[type,name,args,body] >]
SymbolicCのCFunctionで定義されるように,名前が funcname である関数をArduinoのスケッチに加える.
DeviceConfigure[dev,"Upload""BootFunction"<"Code"codestr >]
Arduinoがオンになるとすぐに関数 codestr が実行されるようにArduinoを設定する.
DeviceConfigure[dev,"Upload""BootFunction"<"Code"DatabinAdd,"Databin"bin,"Pin"pin >]
Arduino Yun上で, 読み取っている pin の値を Databin bin にアップロードする"BootFunction"を設定する.
DeviceConfigure[dev,"Upload""Libraries"lib]
Arduinoがユーザ定義された関数で使うために実行するスケッチにライブラリ lib を含める.
DeviceConfigure[dev,"Upload""Libraries"{lib1,lib2,…}]
Arduinoがユーザ定義された関数で使うために実行するスケッチにライブラリ libi を含める.
DeviceConfigure[dev,"Upload"Initializationcodestr]
Arduinoがファイルの先頭に追加された codestr 内にC/C++ コードを持つために実行するスケッチを設定する.
デバイスの特性
- 現在サポートされている唯一の特性は, 最も最新のピンの値とさまざまなピンの状態のDatasetを返す"PinConfigurations",Arduinoが接続されているシリアルポートの名前を返す"SerialPort",およびArduinoソフトウェアの場所の指定に使われる"ArduinoInstallLocation"である.
- "PinConfigurations"は,読取りしか行えないが,"ArduinoInstallLocation"は,関数のコンパイルとアップロードに使う別の場所を指定するのに使うことができる.
- 以下は例である.
- "PinConfigurations"と"SerialPort"が読取りのみであるのに対し,"ArduinoInstallLocation"は,書き込むことができ,関数のコンパイルとアップロードに使うArduinoソフトウェアの場所を指定するのに使うことができる.
- 指定された"ArduinoInstallLocation"特性は確かめられるので,ユーザが指定したものがArduinoソフトウェアの有効な位置でなければならない.これは,コンパイラとアップローダのユーティリティおよびその他の必要なソフトウェアの存在から判断することができる.Arduino IDEのリリースされたすべてのバージョンがサポートされている.
データの読取り
- "ReadMode"の可能な値は,"Digital"と"Analog"である.
- アナログピンから読み取ると,デフォルトでそのピンのアナログの読取りが行われる.デジタル値の読取りは,"ReadMode""Digital"を使って得ることができる.
- "A0" (14),"A1" (15),"A2" (16),"A3" (17),"A4" (18),"A5" (19) のピンのみがアナログの読取りをサポートする.デジタルの読取りは,すべてのピンでサポートされている.
- DeviceReadTimeSeriesもサポートされている.
- "ReturnFunction" f は,f[val]を返す.アナログ入力ピンについては,val は,そのピン上のアナログ電圧に対応する,0から1023までの数になる.1023は5ボルトに,0は0ボルトに対応する.5ボルトより高い電圧をArduino上のピンに適用すると,デバイスが破損することがある.その他のピンについては,val は,そのピン上の電圧が3ボルトより高い場合は1,低い場合は0になる.
- 注意:デフォルトで,"Arduino"では,ピンは読取りモードと書取りモードのどちらにでも使うことができる.DeviceConfigureを使って,特定のピンを読取りあるいは書取り用に設定することができる.
DeviceRead[dev,n]
ピン n の値を読み取る.
DeviceRead[dev,{{n1,n2,…}}]
各ピン ni の値を読み取り,ni の連想を値に返す.
DeviceRead[dev,{n,"ReturnFunction"(func)}]
ピン n の値を読み取り,それを返す前に,func を値に適用する.
DeviceRead[dev,{n,"ReadMode"mode}]
ピン n の mode の値を読み取る.
データの書込み
- 値 val は,ピン n がパルス幅変調(PWM)をサポートする場合を除いて,0または1になる.
- DeviceWriteは,規則のリストもサポートする.
- PWMは,3,5,6,9,10,11のピンでサポートされる.これらのピン上では,val は,0からの1の任意の実数,あるいは形式 の任意の有理数である.ここで は,0から255までのIntegerである.これは,そのピン上でのPWMタイマーのデューティサイクルに対応する.
- PWMピンは,デューティサイクルにスケールされる0から5までのボルトのQuantityを書き込むこともサポートする.
- 注意:デフォルトでは,"Arduino"は,任意のピンが読取りと書込みのモードのどちらにでも使えるようにする.DeviceConfigureを使って,特定のピンを読取りあるいは書取り用に設定することができる.
DeviceWrite[dev,nval]
値 val をピン n に書き込む.
DeviceWrite[dev,<n1val1,n2val2,… >]
各値 vali をピン ni に書き込む.
コマンドの実行
- "Scheduling"は,Arduino上で実行される関数をスケジュールに入れる.これはつまり,Arduinoが中断されずに電源に繋がれている限り,関数はWolfram言語が終了した後も実行され続けることを意味する.Arduinoが再設定された場合,あるいは受電できなくなった場合には,関数を再度スケジュールに入れる必要がある.
- Arduinoは,ミリ秒の精度でスケジュールを立てることができるので,timespec で指定された時間は,小数点以下3桁で四捨五入される.
- timespec で指定されたスケジュールの時間は,以下の形式をサポートする:
-
dt dt 秒ごとに関数を実行する {wait} wait 秒待った後で,関数を一度実行する {dt,count} dt 秒ごとに関数を count 回実行する - Arduino上でのタスクをスケジュールに入れた後で,DeviceExecute[dev,"DeleteTask",funcname]を使って時期尚早にそれを停止することが可能である.
- 注意:Arduino上では,一度に1つの関数だけを実行する,あるいはスケジュールに入れることができる.
- DeviceConfigureでデバイスにアップロードする際には,"Databin"bin を指定することによって,この関数がアップロードするDatabinとして bin を使うように設定できる.DeviceConfigureで設定されていない場合には,オプションDatabinをビンの"UUID"か"ShortID"のStringとして,あるいはDatabinオブジェクトとして指定しなければならない.
- "ReadMode"を指定すると,アナログピン上の pin のデジタル値を"ReadMode""Digital"で読み取ることができる.指定がない場合には,アナログピンは0ボルトから5ボルトまでのアナログ電圧として読み取られる.pin がデジタルピンである場合には,"Digital"またはAutomaticのみが有効な値である.
- この関数は,デバイスが"DataDrop"Falseと設定されている場合には使用できない.
- 注意:Arduino Yunのみで使用可能である.
DeviceExecute[dev,funcname]
関数 funcname をArduino上で実行する.
DeviceExecute[dev,funcname,args]
引数 args を持つ関数 funcname をArduino上で実行する.
DeviceExecute[dev,funcname,{args,"Scheduling"timespec}]
引数 args を持つ関数 funcname を timespec で指定されたスケジュール上で実行する.
DeviceExecute[dev,DatabinAdd,pin]
Arduino Yun上で,pin の現行値をDeviceConfigureで指定されたデフォルトのDatabinにアップロードする.
DeviceExecute[dev,DatabinAdd,{pin,"Databin"bin,"Key"name,"ReadMode"mode}
Arduino Yun上で,mode で読み取る際に,pin の現行値を bin にKeyの name と一緒にアップロードする.
リソースの終了と解放
- ArduinoをマシンのUSBポートあるいはシリアルポートから物理的に取り除くだけでは,接続は閉じられない.正しく使用を終了するためには,デバイスを取り除く前に,DeviceCloseを呼び出すことが望ましい.
- Arduinoが電源に接続され続けている限り,Arduinoで予定される関数は,デバイスへの接続が閉じられた後も実行され続ける.
DeviceClose[dev]
Arduinoデバイス dev への接続を閉じ,シリアルポートを解放する.
例題
例 (1)
Arduinoへの接続を開き,必要なスケッチをデバイスにアップロードする:
ピン3のデューティサイクルのパルス幅変調を50%に設定する:
ピン5にパルス幅変調のデューティサイクルを書き込む.これはあるデバイスの約2.5ボルトに対応する:
"ReturnFunction"を使って値を1と比べ,ピン4から読み取る:
アナログピンA3から値を読み取り,値がインチになるように変換関数を適用する:
SymbolicC関数をArduinoにアップロードし,2つの数に数1000を加える:
Arduinoのピン9に繋がれたサーボモータを制御する関数をアップロードし,その引数として,Arduinoの組込みServoライブラリを使うようにサーボを回転する位置を取る:
以下の例では,LCDが12,11,5,4,3,2のピンでArduinoに接続されていなければならない.まず,LCDスクリーンに文字列を書き込む簡単な関数をアップロードする:
デフォルトでDatabinを使うようにArduinoを設定する:
デジタルピン4の値を,1秒ごとに10秒間ビンにアップロードする:
起動されてから60秒ごとに無限に,ピン"A5"の値をキー"SensorValue"と一緒にアップロードするように,Yunを設定する: