ArduinoでLEDサンプルのサーバーを実行し、パソコン上のクライアントと通信させます。
なお、このサンプルの動作確認はArduino UNOで行っています。
公式サイトからIDEをダウンロードしてインストールします。
このLEDのサンプルはarduino-1.6.4とarduino-1.0.5で動作を確認しています。 しかし、この後のリアルタイムシステムのサンプルで利用するDuinOSがarduino-1.6.4では動作しませんので、 ここではarduino-1.0.5を利用します。
http://www.arduino.cc/en/Main/OldSoftwareReleases#previous からarduino-1.0.5-r2-windows.zipをダウンロードして、インストールしたい先へ解凍します。 arduino.exeをダブルクリックすれば、IDEが起動します。
WindowsにArduinoを接続するのにドライバのインストールが必要となる場合があります。 ハードウェアの種類により違いがありますので、詳細はArduinoハードウェアの購入先が提供する情報を確認して下さい。以下は公式サイトの情報です。
http://arduino.cc/en/Guide/Windows#toc4
まず、起動中のArduino IDEがある場合は、全て終了させて下さい。
hipcarduino-0.5.zipをダウンロードして解凍します。 Arduino IDEのインストール先を確認して、librariesフォルダを探して下さい。 解凍して出来たhipcフォルダを丸ごとlibrariesフォルダの中にコピーして下さい。
Arduinoのスケッチをビルドするためにledという名前のフォルダを作ります。 パソコンのPOSIX環境で前のLEDサンプルをmake
したディレクトリからledフォルダへファイルをコピーします。 具体的には、LEDサンプルのhipccfgディレクトリとserverディレクトリから以下のファイルを新しく作ったledフォルダにコピーして下さい。
注意: CFGled.h、CFGled_scfg.c、CFGled_scfg.hの3つのファイルは、必ず先ほどサンプルをビルドしたときに使ったファイルをコピーして下さい。別の場所で作り直すと構成IDが変わってしまい、先ほどビルドしたクライアントとは通信できなくなってしまいます。
Arduino IDEを立ち上げて、led.inoを開きます。 スケッチをArduinoへ書き込んで下さい。
まず、Arduino IDEのシリアルモニタを使って、Arduinoと通信できることを確認します。
a
を1つ入力して送信を押します。Failed to accept
というボディに相当する文字列が表示されることを確認します。ArduinoのPosix環境でのデバイス名を確認します。
Cygwinでは、WindowsでのCOM1が/dev/ttyS0、COM2が/dev/ttyS1というように対応しています。 http://cygwin.com/cygwin-ug-net/using-specialnames.html#pathnames-posixdevices
仮想マシンを利用している場合は、仮想マシンにArduinoの接続します。 例えば、VirtualBoxではメニューバーから"Devices" - "USB Devices" - "Arduino"と選択します。
環境によってはArduinoを接続した後にdmesg
コマンドを実行することで、デバイス名を確認します。例:
[ 1110.173072] cdc_acm 1-2:1.0: ttyACM0: USB ACM device
Linuxを使っている場合などで、ユーザーをdialoutグループに所属させる必要がある場合は、gpasswd
などを使って下さい。
Arduinoはインターネット上の情報が充実しているので、その他不明な点があれば検索してみることをお勧めします。
(参考)Ubuntuへのインストール方法: http://playground.arduino.cc/Linux/Ubuntu
socatが作動することを確認します。 先ほどのLEDサンプルをビルドしたPOSIX環境から、以下のコマンドを実行してます。(ttyS2
は適切なデバイス名に変更して下さい。)
socat /dev/ttyS2,raw,b9600,echo=0 STDIO
キーボードからa
を入力してEnterキーを押します。 Failed to accept
という文字列が表示されるのを確認して、Ctrl+Cでsocat
を終了します。
うまく行かない場合は、Arduino IDEのシリアルモニタやpicocomで確認を行って下さい。
パソコンのPOSIX環境で先ほどLEDサンプルをmake run
したディレクトリに移動して、以下のコマンドを実行します。(ttyS2
は適切なデバイス名に変更して下さい。)
ruby ../../utilities/hipcdump 'socat /dev/ttyS2,raw,b9600,echo=0 STDIO' 'sleep 3; client/client'
クライアントプログラムが終了したらCtrl+Cで終了します。
なお、コマンドの中の'sleep 3'
は、Arduinoの自動リセットに対応するためのものです。
Arduinoボードの種類や通信設定によっては、通信開始時に自動的にArduinoがリセットされます。リセットスイッチを押さずにArduinoへ書き込みが出来るなら、自動リセットが有効になっている可能性があります。自動リセット直後はブートローダーが走っているため、ユーザーか書き込んだプログラムは通信開始直後に送信されたデータを受信することが出来ません。
従って、自動リセットが有効になっているときは、通信開始直後のデータ送信を避けて下さい。具体的には、sleep等でクライアントが通信を開始するのを遅らせて下さい。また、シリアルモニタやsocatを使って手動で動作を確認する場合は、1秒程度待ってから操作を開始して下さい。
Arduinoとの通信がうまくいかないときは、シリアル通信の特殊処理が行われて問題となっている可能性があります。 この場合は、socatのオプションにonlcr=0
やixoff=0
等を追加して、明示的に特殊処理を無効にして下さい。
socatで設定できるTERMIOSオプションはsocatのサイトの http://www.dest-unreach.org/socat/doc/socat.html#GROUP_TERMIOS で確認できます。それぞれのTERMIOSフラグの詳細はTERMIOSのマニュアル等で確認できます。
また、socatの新しいバージョンではraw
オプションではなく、新たに実装されたrawer
かcfmakeraw
の利用が推奨されています。raw
で通信がうまくいかない場合は、これらの新しいオプションを利用して下さい。
Cygwinで以下のようなtcgetattrエラーが発生した場合は、WindowsでArduino IDEを起動させ、一度シリアルモニタから通信を行うとエラーが解消されるようです。
2015/06/20 09:25:06 socat[4124] E tcgetattr(5, 0x23c580): Invalid argument
Last modified: 2015/07/27 08:00:59 +09:00