INDEX(各項目ごとの目次)

[HOME]  [Processing関係]  [Arduino関係]  [マテリアル関係]  [秋葉原工作マップ]

2008年用ですが、部分的に内容を更新しています(2010/06/14)。
また、[建築農業工作ゼミ2009-2010]とも連動していますので、そちらにも幾つかサンプルがあります。
:

ラベル arduino の投稿を表示しています。 すべての投稿を表示
ラベル arduino の投稿を表示しています。 すべての投稿を表示

2/19/2010

2010年度 「建築農業工作ゼミ」トライアルワークショップ(工作編)+ガイダンス

終了致しました。ご参加ありがとうございました。

2010年度「建築農業工作ゼミ」受講にむけたトライアルワークショップとして、初心者向けのArduino電子工作ワークショップ行ないます。
「建築農業工作ゼミ」受講希望者は、ぜひご参加下さい。
ワークショップ後には、ゼミ全体のガイダンスも行なわれます。

■日時:2010年3月20日(土)
13:00-17:00|初心者向けArduino電子工作ワークショップ
17:00-17:30|建築農業工作ゼミ ガイダンス

■ワークショップ内容:
電子工作の経験はないけれども興味がある初心者を対象としています。
Arduinoボード(マイコン)を用いて、電子回路や電子工作の基礎を学びます。
(1)電子工作/プログラムに必要な環境のセットアップ
(2)基本:LEDを光らせる
(3)応用:センサと音出力

■定員:20名

■参加費:1000円(材料費込)
※持参するものの費用は各自ご負担ください。
※ガイダンスのみの参加も可能です(その場合は無料)。

■当日持参するもの:
●ノートパソコン(WinまたはMac)
●Arduinoボード(以下に購入方法の説明あり)
●USBケーブル(Arduinoホードとパソコンをつなぐケーブル)

Arduinoボード(基板)には幾つか種類がありますが、「Arduino Duemilanove 328」(3200円)という種類のものをおすすめします。
WEB通販であれば、アマゾンスイッチサイエンスなどがあります。
秋葉原の店頭で購入するなら千石電商などがあります
その他購入先については以下のサイトに説明があります。
http://ken-nou-kou.blogspot.com/2009/08/arduino.html

申し込み方法

事務室までお電話/ファックスでまたは直接ご予約ください
(定員に達し次第受付を締め切りますのでお早めにお申し込みください)。

■会場:四谷アート・ステュディウム講義室【地図】

■お申し込み/お問い合わせ:四谷アート・ステュディウム事務室(校舎2F)
tel. 03-3351-0591

リンク:
「建築農業工作ゼミ」トライアルワークショップ

4/07/2009

書籍:Programming Interactivity


Programming Interactivity: Rough Cuts Version
A Designer's Guide to Processing, Arduino, and openFrameworks
http://oreilly.com/catalog/9780596800581/index.html


4/02/2009

Arduino Quad Core Quadruino




Quadruino:
ATmega328を4個搭載したQuadruinoが4週間後に$70で販売されるようです。
4つのスケッチを同時に実行することが可能で、従来のシールドも搭載可能らしいです。
また、ALTERA EP1K50 FPGAチップによって、4個のコントローラをひとまとまりにしたパワフルな動作も可能らしいです。

マイクロコントローラ:ATmega328x4個
使用電圧:5V
入力電圧(推奨):7-12V
入力電圧(限界):6-20V
デジタル入出力ピン数:56本
アナログ入力ピン数:24本

リンク:
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1238600379/0
http://www.freeduino.de/en/blog/arduino-quad-core-quadruino-0



3/30/2009

Arduino Li-ionバッテリ Litium Backpack Stealth


Liquidwireが販売しているArduino用リチウムイオンバッテリ(5V/3.3V出力)。

三種類あり、Arduino基板を通して充電可能、またはmini USBケーブル接続で直接充電可能。
サイズはArduino基板と同程度。
Arduino基板に重ねて取り付けるためのネジ類付属。

・高容量:2200mAh(29時間):$47.36
・中容量:1000mAh(15時間):$34.63
・小容量:600mAh(9.4時間):$31.90

リンク:liquidwire/Litium Backpack Stealth


3/28/2009

Arduino AC Power Shield


Arduino AC Power Shield

まだプロトタイプ段階のようですが、一応販売もしているようです。
120V/60Hz用らしいです。

リンク:
販売:http://ryanjmclaughlin.com/arduino
記事:Arduino Forum内



DSbrut



DS brut($31.95/€26.00):上画像
ニンテンドーDSからUART、GPIO、PWM、ADC、I2Cなどの制御/通信が可能。
Atmega168(8MHz)を使用。
Arduinoソフトウェア(LilyPad Arduino用)でプログラムをアップすることが可能。

新型DS brut 3G(€38.00):
加速度センサADXL330内蔵型。

専用ファームウェア「libdsbrut-0.9」が最近リリースされたようです。
*ただし、最近のマジコンの流通規制との関係から利用は難しいのかもしれません(?)。

リンク:
DSbrut
electrobee

Arduino PID制御ライブラリ

PID制御用のライブラリ(最新バージョン:Beta 0.6)。
http://www.arduino.cc/playground/Code/PIDLibrary

3/27/2009

Arduino Mega+Arduino IDE version 0015



Arduino Mega発売(スイッチサイエンスストロベリーリナックスで購入可:7350円)。
それに合わせて、IDEバージョン0015もリリースしているようです。

3/26/2009

Arduino TouchShield Slide



TouchShield Slide:
320x240 OLEDタッチスクリーン($174.93)

リンク:liquidwire open source electronics


Logitec USB対応15型タッチパネル LTP-15U
ロジテック (2004-10-31)
売り上げランキング: 13768


3/25/2009

書籍:Arduinoをはじめよう

Arduinoをはじめよう
Arduinoをはじめよう
posted with amazlet at 09.03.28
Massimo Banzi
オライリージャパン
売り上げランキング: 1556

2/11/2009

Arduino バージョン0013

Arduinoのバージョン0013がリリースされたようです。
0013では細かなバグ修正のほか:
・Serial、Ethernet、LiquidCrystalライブラリにおいてfloatで出力可能。
word()bitRead()bitWrite()bitSet()bitClear()bit()lowByte()highByte()が追加。
・ATmega328をサポート(ATmega328はスイッチサイエンスマイクロファンにて購入可)。

Arduino Duemilanove 328
Arduino Duemilanove 328
posted with amazlet at 09.03.30
スイッチサイエンス
売り上げランキング: 2300

1/30/2009

目次:Arduino


【変更】以下はArduino1.0まで対応したプログラム内容です。
特にシリアル通信においては、Arduino2.0使用の際、バイト送信する場合、
Serial.print(value,BYTE);
のかわりに、
Serial.write(value);
を使用してください。


・Arduinoボード購入先については、ページ右下のショップリストに掲載(秋葉原のマップはこちら)。
Arduino 日本語リファレンス

書籍:Books
Arduinoをはじめよう
Making Things Talk -Arduinoで作る「会話」するモノたち
Prototyping Lab ―「作りながら考える」ためのArduino実践レシピ
CQ ham radio (ハムラジオ)増刊 マイコンと電子工作No.1 電脳Arduinoでちょっと未来を作る 2010年 01月号 [雑誌]
アーデュイーノ互換マイコン・ボードを作る (プリント基板付き電子工作解説書シリーズ)
Physical Computing: Sensing and Controlling the Physical World with Computers
Programming Interactivity: Unlock the Power of Arduino, Processing, and Openframeworks
Practical Arduino: Cool Projects for Open Source Hardware (Technology in Action)
Arduino Cookbook (Oreilly Cookbooks)

基本操作:Basics
Arduinoのセッティング」--Arduino 0018のダウンロード/インストールの仕方
Arduino基盤の概要」--Arduino基盤の機能や端子の説明
Arduino LEDの点滅」--プログラム、アップロードの仕方、LEDを点滅させる
Arduino 7セグLEDの点灯」--7セグLEDの接続/表示方法
Arduino アナログ入出力」--LEDの明暗をコントロールする

入出力部品の種類:Input/Output Parts and Materials
センサについて」--赤外線距離センサ、光センサ、タクトスイッチの接続と入力方法
センサについて2」--各ショップにおけるセンサの種類(秋月、千石、共立、Sparkfun)
出力方法について」--表示、アクチュエータ、熱、音などの出力部品の種類について
Arduino モータドライバ+モータ」--モータドライバやDCモータの種類/選び方
スピーカ/音出力について」--通常のコーンスピーカ以外の特殊なスピーカなどについて
導電性素材/材料について」--電気を通すことができる様々な材料について
素材実験/鉛筆の描画線」--紙の上に鉛筆で描いた線を可変抵抗として使う
素材実験/小型・薄型の材料」--チップLEDやペーパーバッテリなどの小型部品について

センサ(入力系)各種:Sensors/Inputs
センサについて」--赤外線距離センサ、光センサ、タクトスイッチの接続と入力方法
Arduino 圧電スピーカ」--ブザー、センサとして圧電スピーカを使う/シリアルモニターの仕方
Arduino 加速度センサ」--加速度センサで物体の傾斜角を計測する
Arduino デジタルコンパス/HMC6352」--方位センサ「HMC6352」の使い方
Arduino 距離センサ/超音波レンジファインダー」--Parallax「Ping)))」の使い方
Arduino-Processing BlueTooth通信+曲げセンサ 」--曲げセンサの入力値をBluetoothで送信する
Arduino タッチパネル(4線式)」--4線式タッチパネルの接続方法/使い方
Arduino タッチセンサ」--抵抗だけでタッチセンサをつくる
Arduino デジタルカラーセンサ S9706」--RGB同時測光カラーセンサの実験
光センサ フォトICダイオード S9648-100」(建築農業工作ゼミ2009より)
温・湿度センサ SHT-71」(建築農業工作ゼミ2009より)
温度センサ LM35DZ」(建築農業工作ゼミ2009より)
温度センサ LM60BIZ」(建築農業工作ゼミ2009より)
Arduino:7セグ+照度センサNJL7502L」--照度センサで得た値を7セグを用いて表示する

マトリクスLED:Matrix LED
Arduino マトリクスLED1」--マトリクスLEDをArduinoに直結して表示する
Arduino マトリクスLED2/MAX7219」--LEDドライバMAX7219でマトリクスLED表示する
Arduino+Processing マトリクスLED+Webカメラ」--Webカメラの映像をマトリクスLEDに映す

サーボ/モータ/モータドライバ:Servos/Motors/Motor drivers
Arduino サーボ制御」--PWM、ライブラリ、パルスによるサーボ制御
Arduino 小型DCモータ/TA7291P」--モータドライバTA7291Pでモータを制御する。
Arduino モータドライバ+モータ」--モータドライバやDCモータの種類/選び方

シリアル通信:(パソコン上のProcessingプログラムとの通信)Serial communication
Arduino-Processing シリアル通信1」--ひとつの値を送信する(非同期通信)
Arduino-Processing シリアル通信2」--複数の値を送信する(同期通信)
Arduino-Processing シリアル通信3」--大きな値を複数送信する(ビット演算の説明)
Processing-Arduino シリアル通信4」--Processingの図形をマウスで動かしてArduinoを制御
Arduino-Processing シリアル通信5」--大きな値、複数の値を文字列で一括送信する
Arduino-Processing シリアル通信6」--複数のArduinoをProcessingを通してシリアル通信する

ワイヤレス/ネットワーク通信:Wireless/Network comminication
Arduino+Xbee Shield/Processing+XBee Explorer USB」--Xbee、XBee Explorer USBを用いて無線通信する
Arduino-Processing BlueTooth通信+曲げセンサ 」--曲げセンサの入力値をBluetoothで送信する
Processing-Arduino ネットワーク制御」--ネットワークを通してサーボ、LEDを制御する
Arduino Ethernet Shield」--イーサネットシールドを使って、ArduinoをWebサーバとして機能させる
Arduino Mega + Ethernet Shield」--未対応のArduino Megaにイーサネットシールドを重ねて使う方法
Arduinoで計測した値を指定のwebサーバに送信/保存する」(建築農業工作ゼミ2009より)

ビデオ信号/TV:Video signal/TV
Arduino ビデオ信号/テレビ画面に出力」--Arduinoを使ってテレビ画面に模様や矩形を表示する
Arduino ビデオ信号/バウンドするドット」--Arduinoを使ってテレビ画面に動く映像を表示する

ライブラリ:Libraries
Processing-Arduino Firmataライブラリ」--ProcessingでArduino基板の各設定をし制御する。
Arduino PID制御ライブラリ」--PID制御用の専用ライブラリ

シールド/ハードウェア:Shield/Hardware
Arduino TouchShield Slide」--Liquidwireが販売しているArduino用OLEDタッチパネルスクリーン
Arduino Li-ionバッテリ Litium Backpack Stealth」--Arduino基板用リチウムイオン充電電池パック
Arduino AC Power Shield」--交流電源を制御するArduinoシールド
Arduino Mega+Arduino IDE version 0015」--54個のデジタル入出力ピンがある大型のArduino基板
Arduino Mega:ピンマッピング」--Arduino MegaボードとATmage1280のピン配置関係
Arduino Mega:analogRead 8~15番ピンのバグ」--Arduino0017におけるバグの解決方法
Arduino Quad Core Quadruino」--ATmega328を4個搭載したArduino基板:Quidruino
DSbrut」--LilyPad ArduinoでプログラムできるニンテンドーDS用のカートリッジ基板

12/21/2008

Processing-Arduino Firmataライブラリ

今回は、「Firmataライブラリ」のテストを行いたいと思います。
通常Processing-Arduinoの間を通信させるときにはシリアル通信を使い、Processing側のプログラムとArduino側のプログラムをそれぞれ別々に書いていましたが、「Firmataライブラリ」を使うことで、Processing側から直接Arduinoをプログラムし制御することが可能になります(パソコンにUSB接続したArduino基板をProcessing側からのプログラムだけで操作できるので便利です)。

Firmataライブラリを使うための準備:
・まずFirmataライブラリをダウンロードし、Processingのlibrariesフォルダ内にインストールします。
・Arduino-0012であればArduino用Firmataライブラリは含まれているので、メニューバーのSketchBook>Examples>Library-Firmata>StandardFirmataを開き、Arduino基板にアップロードしておきます。Arduinoのセッティングは以上です。

今回はProcessing用のFirmataライブラリに含まれているサンプルを用いたいと思います。
Processingを開いて、File>Sketchbook>libraries>arduino>examples>arduino_outputを選択します。
以下のようなプログラムが表示されるはずです。

import processing.serial.*;

import cc.arduino.*;

Arduino arduino;

color off = color(4, 79, 111);
color on = color(84, 145, 158);

int[] values = { Arduino.LOW, Arduino.LOW, Arduino.LOW, Arduino.LOW,
Arduino.LOW, Arduino.LOW, Arduino.LOW, Arduino.LOW, Arduino.LOW,
Arduino.LOW, Arduino.LOW, Arduino.LOW, Arduino.LOW, Arduino.LOW };

void setup() {
size(470, 200);

println(Arduino.list());
arduino = new Arduino(this, Arduino.list()[0], 115200);

for (int i = 0; i <= 13; i++)
arduino.pinMode(i, Arduino.OUTPUT);
}

void draw() {
background(off);
stroke(on);

for (int i = 0; i <= 13; i++) {
if (values[i] == Arduino.HIGH)
fill(on);
else
fill(off);

rect(420 - i * 30, 30, 20, 20);
}
}

void mousePressed()
{
int pin = (450 - mouseX) / 30;

if (values[pin] == Arduino.LOW) {
arduino.digitalWrite(pin, Arduino.HIGH);
values[pin] = Arduino.HIGH;
} else {
arduino.digitalWrite(pin, Arduino.LOW);
values[pin] = Arduino.LOW;
}
}


Processing上でこのプログラムをランさせます。この時点でProcessingから、Arduino基板の各ピンの入出力設定がなされます。Processingでは以下のような画面が現れます。



14個ならんでいる正方形をそれぞれクリックすれば(クリックするとその正方形は塗りつぶされる)、Arduinoの0番ピンから13番ピンの合計14個のピンに対応してデジタル出力されます(Processing画面上の左端の正方形がArduinoの13番ピンに対応)。試しにProcessing画面上左端の正方形をクリックすると、13番ピンに接続されたLED(基板内蔵LED)が点灯します。同様に他の正方形をクリックすれば、それに対応したピンからデジタル出力されることが確認できます(各ピンにLED+抵抗:220Ωを接続して下さい)。
ただし、0番ピンと1番ピンに関しては、Processing-Arduino間でのシリアル通信で使用されているため、クリックしても反応しないので、2番ピンから13番ピンでのデジタル出力制御となります。

Processingのプログラム上で、

arduino.pinMode(ピン番号, 入出力設定);

とすれば、Arduinoの任意のピンの入出力設定(Arduino.INPUT または Arduino.OUTPUT)を行うことができます。
出力をHIGHかLOWにするには、

arduino.digitalWrite(ピン番号, 出力値);

で、出力値をarduino.LOWかarduino.HIGHで設定します。
そのほか、

デジタル入力:arduino.digitalRead(ピン番号)
アナログ入力:arduino.analogRead(ピン番号)
アナログ出力:arduino.analogWrite(ピン番号,出力値)

という感じになるので、arduino.を頭につければ、Arduino上でのプログラムとほぼ同じです。

11/15/2008

Arduino デジタルカラーセンサ S9706

今回は秋月電子で購入したデジタルカラーセンサS9706の実験をします。S9706は、RGB3色の同時測光が可能であり、9×9素子(高感度)と3×3素子(低感度)の感度設定が2段階あり、感度設定用の端子(Range端子)をHIGHまたはLOWで切り替えて設定できます。検出結果は12ビットの値でシリアル出力されます。S9706は表面実装用の小さな部品(1.27mmピッチ)なので、DIP変換基板などにハンダ付けして使用したほうが実験しやすくなります。

S9706には、

・Range端子(感度設定)
・Gate端子(測光時間の設定)
・CK端子(クロックパルス)
・Dout端子(出力)
・Vdd端子(5V電源)
・Gnd端子(グランド)

の6端子あります。
それぞれを以下のように接続します。尚、測光時間を調節できるように可変抵抗器も接続することにします。



データシートの動作手順によれば、以下のように説明されています。
(1)Gate端子とCK端子をLowにします。
(2)Range端子で、所望の感度を選択します(今回は、可変抵抗器で調節可能にしておきます)。
(3)Gate端子をLow→Highにして光量の積算を開始します。
(4)所望の積算時間の後にGate端子をHigh→Lowにして光量の積算を終了します。
(5)測定データは、CK端子に36のCKパルスを入れることで、Dout端子から出力されます。

Dout端子からの12ビットのシリアル出力を読み込むためには、CK端子へ12回のパルスを3回送る必要があります。最初の12パルスによって赤、次の12パルスによって緑、そして最後の12パルスによって青が出力されます。この部分の手続きは、shiftIn()というファンクション(名前は任意)を用意することにします。付属のデータシートのタイミングチャートに従ってプログラムしていくことにします。
最終的に得られたRGB三色の値(12ビット:0~4095)をシリアル通信でProcessingへ送信し、Processingの画面上で色表示することにします。

「Arduinoのプログラム」:

 [プログラムを表示]


アナログ入力に接続された可変抵抗器で、測光時間を1ミリ秒から1024ミリ秒まで可変的に設定可能になります。測光時間が短ければ全体的に暗い色として認識されるので適宜調節してください(白色LEDを取り付けて反射光を使って読み取らせることもできると思います)。
12ビットの値を読み込む処理をするint shiftIn(){...}では、一色につき12回CK端子へパルス(HIGH:1μsec+LOW:1μsec)を送ります。12回分のパルスをfor文で繰り返し処理させています。for(){...}の中では、digitalWrite(CK,HIGH)で1回HIGHを送ったあと1マイクロ秒待機すると、Dout端子から1ビット分の出力があるので、digitalRead(DOUT)でHIGHかLOWかを読み込みます。そしてdigitalWrite(CK,LOW)によって、CK端子をLOWに戻しておきます。
読み込み値を、
000000000000~111111111111(十進数の0~4095)
までの二進数で処理するため、digitalRead(DOUT)がHIGHの場合は12ビット中のその桁が1になります。S9706では、右の桁から出力されます。つまり、for(){...}では、最初に処理される桁は右側の一桁であり、最後に処理される桁は左側の一桁(12桁目)になります。



Processingの方では4つの矩形を用意し、RGBの三色それぞれの色面とRGBを合成した色面として表示します。Arduinoとのシリアル通信は文字列で行います(複数の文字列のシリアル通信は「Arduino-Processing シリアル通信5」を参照してください)。Processing側でクリックしたらシリアル通信を開始することにします。


Processing上の画面:左から赤、緑、青、3色合成

「Processingのプログラム」:

 [プログラムを表示]


Arduinoからは0~4095の範囲で値が送られてくるので、fill(r,g,b)の各値に代入するため、map()を使って0~255までの値(さらにint()で括って整数に変換)に変換しています。

11/13/2008

センサについて2

以下は、「秋月電子」、「千石電商」、「共立エレショップ」、「Sparkfun(米国)」の各サイトにおけるセンサの分類です。目的や機能ごとに分かれているので、センサを選ぶ際の参考にして下さい(各店舗の各センサのページへリンクしています)。




秋月電子

センサ一般
湿度/温度

赤外線センサ
リモコン受光部
紫外線関連

ペーハー(pH)
アルコール/ガス 
方位

千石電商

ホール素子/ホールセンサ 
温度センサー
角速度(ジャイロ)
加速度
距離
圧力
衝撃
曲げ
焦電
サーミスタ
共立エレショップ

感圧
ひずみ/曲げ
温度
湿度

赤外線
紫外線
カラー
超音波
磁気
電流
位置
位置(アクセサリ) 
動き
Sparkfun(米国)

Accelerometer(加速度)
Biometrics(生物測定)
Capacitive(静電容量)
Current(電流)
Flex/Force(曲げ/力)
ID(証明/認証)
IMU/Gyros(慣性力/角速度) 
Infrared(赤外線)
Light/Imaging(光/画像)
Magneto(磁力)
Proximity(距離)
Temperature(温度)
Weather(天候)






その他のショップやセンサについては、このブログページ右側の「ショップリスト」にも記載してあるので参考にして下さい。

11/08/2008

Arduino書籍:「Making Things Talk」日本語版

『Making Things Talk--Arduinoで作る「会話」するモノたち』(日本語版)が発売されるそうです。

Making Things Talk -Arduinoで作る「会話」するモノたち
Tom Igoe
オライリージャパン
売り上げランキング: 16017

11/01/2008

Arduino Ethernet Shield

今回は、Arduino Ethernet Shieldスイッチサイエンスストロベリーリナックスにて販売)を使って、Arduinoをサーバとして機能させ、Webブラウザ(IE、Safari、FireFoxなど)から閲覧可能なページの表示実験を行いたいと思います。
そのために、Arduino開発環境の最新版「Arduino 0012」に含まれている「Ethernetライブラリ」を使います。
*Arduino MegaとEthernet Shieldを重ねて使う場合の説明はこちら


(Arduino Ethernet Shield)


Arduinoのサイトによれば、デジタルI/Oピンの11、12、13番ピンはSPI通信に使われているようなので、それらのピンにはセンサなどを接続しないことにします。


今回は、Arduino 0012に含まれている「Web Server」というサンプル(File>Sketchbook>Examples>Library-Ethernet>Web Server)を参考にブラウザで閲覧可能なWebベージを表示させます。元々のサンプルでは、アナログ入力値をWebページに表示させていますが、ブラウザのタイトルバーの表示文字、リンクさせた画像の表示など多少変更した内容にしてみます。
基本的な入力情報として、

・MACアドレス
・サーバのIPアドレス
・ポート番号

が必要となります。尚、ローカルネットワーク内から閲覧できる設定にします。

Arduinoのプログラム(サーバ):

//イーサネットライブラリを取り入れる
#include <Ethernet.h>

//MAC ID(各シールドに記載)
byte mac[] = { 0x00, 0x50, 0xC2, 0x97, 0x20, 0x11 };
//サーバ用IPアドレスの設定
byte ip[] = { 192, 168, 3, 100 };
//ポート設定(80:HTTPプロトコル)
Server server(80);

void setup(){
//イーサネット通信開始
Ethernet.begin(mac, ip);
//サーバ開始
server.begin();
}

void loop(){
//クライアントからのデータ受信
Client client = server.available();
//クライアントからの受信がある場合
if (client) {
//ブラウザからのHTTPリクエストの空白行の有無のフラグ
boolean current_line_is_blank = true;

//クライアントとの接続中の処理
while (client.connected()) {
//クライアントから受信データがあるとき
if (client.available()) {
//HTTPリクエスト(受信データ)を一つずつ読み込む
char c = client.read();
//HTTPリクエストにラインフィード(改行)があり、
//現在空白行である場合
if (c == '\n' && current_line_is_blank) {
//HTTPレスポンス(返信)
server.println("HTTP/1.1 200 OK");//リクエスト成功
server.println("Content-Type: text/html");//HTML文書形式
server.println();//空白行を入れる

//タイトルバー表示
server.println("<title>KOUSAKU WEB SITE</title>");
server.print("ANALOG INPUT: ");//文字表示
server.print(analogRead(0));//アナログ入力値
server.println("<br/>");//改行
//リンク画像表示
server.println("<img src=\"http://2.bp.blogspot.com/_7uyXRm_coS4/SQeoW-PJB2I/AAAAAAAAAbA/0Go85aRfLDY/s400/ethernet.png\">");
server.println("<br/>");//改行
//このブログへのリンク
server.println("<a href=\"http://kousaku-kousaku.blogspot.com\">GO TO: KOUSAKU BLOG PAGE<a>");
break;
}
if (c == '\n') {//読み込んだ文字がラインフィードの場合
//現在の行を空白行とみなす
current_line_is_blank = true;
} else if (c != '\r') {//読み込んだ文字がキャリッジリターン以外の場合
//現在の行を空白行としない
current_line_is_blank = false;
}
}
}
delay(1);
client.stop();
}
}


Arduino基板のアナログ入力0番端子に可変抵抗器をひとつ接続し、その読み取り値もページに表示されます。Arduinoのプログラム上では、MACアドレス、IPアドレス、ポート番号をそれぞれ設定しておき(説明以下)、クライアントのブラウザからの「HTTPリクエスト」(説明以下)を受け、「HTTPリクエスト」内の空白行を確認したら、「HTTPレスポンス」(説明以下)を返します。そのとき同時にHTML形式のページ表示内容データも送信されます。送信されたら、client.stop()で、クライアントとの接続を一旦停止します。再度、クライアントから「HTTPリクエスト」があれば、同様に処理されます。

「MACアドレス」:
MACアドレスは、Ethernet Shield固有のアドレスであり(ハードウェアごとに異なる)、スイッチサイエンスから購入したものであれば、Ethernet Shield裏面に貼られたシールに記載されている「00-50-C2-97-20-11」のような16進数の6つの数値です。これらの数値を16進数表記であたまに「0x」を付け加え記入しておきます。
もし、MACアドレスが不明の場合は、MacOSXなら「アプリケーション>ユーティリティ」内にある「ターミナル」を起動し、「ping -c 3 192.168.3.100」(IPアドレスは設定したものを入力してください)というように入力しリターンキーを押してください。その後、「arp -a」を入力しリターンキーを押すと、入力したIPアドレスの右横にMACアドレスが表示されます。
Windowsの場合、アクセサリ内の「コマンドプロンプト」を起動して、「ping 192.168.3.100」(「ping」の後に半角スペースを入れ、設定したEthernet ShieldのIPアドレスを入力)を入力しリターンキーを押すと、返答として「reply from...」などと数行表示されます。その後、すぐに「arp -a」を入力しリターンキーを押せば、Ethernet ShieldのIPアドレスの右横にMACアドレス(Physical Address)が表示されるはずです。

「IPアドレス」:
IPアドレスを設定するには、Ethernet Shieldに接続するイーサネットケーブルをコンピュータに接続し、まずイーサネット経由でのコンピュータのIPアドレスを調べてみます。IPアドレスが「192.168.3.xxx」であれば、最後の桁に任意の数値(他のIPアドレスと重ならないような数値)を入力すれば、大丈夫なはずです(今回の場合は「100」にしました)。同時に、ルータ(gateway)のIPアドレスも調べておくといいでしょう。この場合「192.168.3.1」(最後の桁が「1」)になっているはずです。
「ターミナル(MacOSX)」や「コマンドプロンプト(Windows)」で、MACアドレスを調べると(前述)、ルータのIPアドレスやMACアドレスも表示されるはずです。
尚、「Processing HTTPサーバ/Webページ表示」の冒頭でも、IPアドレスの調べ方について記載しているので参照して下さい。

「ポート」:
ポートは、通常のインターネットで使用している「80」に設定されています(プロトコル:HTTP用)。例えば任意のポート「12345」に設定する場合、ブラウザ上でIPアドレスを入力する際に「http://196.168.3.100:12345」というように「:12345」をIPアドレスの後ろに付け加えます。

「HTTPリクエスト」:

通常、ブラウザからURLを入力しページを表示させる場合、「GET / HTTP/1.1」(HTTPリクエスト)というサーバへの要求内容が送信されます。「GET /index.html HTTP/1.1」にすれば、サーバ上の「index.html」を指定して表示要求することもできます。
実際のブラウザ「Fire Fox 3.0.3」からサーバへ送信されるHTTPリクエストは、以下のような内容になっていました。

GET / HTTP/1.1 (リクエスト行)
Host: 192.168.3.100:12345 (メッセージヘッダ:以下の空白行手前まで)
User-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.4; ja-JP-mac; rv:1.9.0.3) Gecko/2008092414 Firefox/3.0.3
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cache-Control: max-age=0
(空白行)
(メッセージボディ:今回は特に何も送るデータは含まれていない)

「リクエスト行」では、サーバへの要求内容が書かれています。
「メッセージヘッダ」では、サポートされるデータ形式や言語などの様々な情報が記載されています。
「空白行」を挿入することで、要求内容の終わり部分を知らせます。
「メッセージボディ」は、サーバに入力情報などを送る際に使われます。
各行末には「\r\n」(CR+LFの改行コード)がついていました。


「HTTPレスポンス」:

サーバはブラウザからのHTTPリクエストを受け取って、「HTTP/1.1 200 OK」という受信確認した返事を返してきます。「200」はHTTPステータスコードと呼ばれ、「Not Found」(ページが見当たらない)の場合は「404」を返します。
「content-type:text/html」は、内容がHTML文書であるという形式について返答しています。
その後で、println()で空白行を送信します(CR+LF/キャリッジリターン+ラインフィードを送信)。
次に、HTMLなどのコンテンツを送ります。
つまり、以下のような内容になります。

HTTP/1.1 200 OK    (ステータス行)
content-type:text/html (メッセージヘッダー)
            (空白行:CR+LF)
<html>         (メッセージボディ)
<head>...</head>
<body>...</body>
</html>

コンテンツはHTML形式で、println()の括弧内に記述します。基本的に<>(タグ)で囲い、ブラウザのタイトルバーを表示させるために「<title>KOUSAKU WEB SITE</title>」としています。ひとつ問題になることは、println()の括弧内に「"..."」ダブルクオーテーションマークで文字列をくくらなければならないのですが、画像リンクやURLリンク先を記入する場合に「"」を文字列として扱いたい時、そのまま入力するとエラーになってしまうので、「"」を「\"」に置き換えて入力します(エスケープシーケンス)。そのため、「println("<img src="リンク先URL">")」(二重に「"」で括られてしまう)を「println("<img src=\"リンク先URL\">")」という表記にします。<br/>は、ブラウザ表示される際の改行です。

「ブラウザ上での閲覧」:
ポートを「80」に設定している場合、「http://192.168.3.100」(設定したIPアドレス)を入力しリターンキーを押せば、Arduino Ethernet Shieldからデータが送られ、ブラウザにコンテンツが表示されるはずです。
ポートを「12345」などの任意の番号にしている場合、「http://192.168.3.100:12345」というように、アドレスの最後に「:12345」(コロンとポート番号)をつけてアクセスして下さい。

「ローカルネットワーク外からのアクセス」:
外部からインターネットによってアクセスする場合は、グローバルIPアドレス、ルータ、ポートマッピングなどの設定が必要になります(「Processing-Arduino ネットワーク制御」の後半に、ポートマッピングなどの設定方法が書いてあるので参照してください)。
尚、LAN内の別のコンピュータからグローバルIPアドレスを使ってアクセスはできないので、実際にLAN外部からアクセスして見てください。

Arduinoイーサネット・シールド
スイッチサイエンス
売り上げランキング: 15483






10/25/2008

Processing-Arduino ネットワーク制御

今回は、ProcessingのNetworkライブラリを使って、ネットワーク越しに複数のクライアントコンピュータから、サーバコンピュータに接続されたArduinoのサーボとLEDを操作することにします。ネットワーク上では、情報を提供する側となるサーバコンピュータに複数のクライアントコンピュータが接続されているような状態になります。



まず、上図のようにローカルネットワーク内での通信を行ってみます(後半にローカルネットワーク外からの通信サンプルを記載しておきました)。

ひとつのクライアントからサーバへ信号が送られると、サーボの角度やLEDの点灯状態が変化しますが、サーバはクライアントからの信号を受け取るだけではなく、現在のサーボの角度やLEDの状態(オン/オフ)についての情報も各クライアントへ送り返します。そうすることで、各クライアントは現在のサーボやLEDの状態を把握しながら制御することができます。
サーバコンピュータとクライアントコンピュータはインターネット越しに通信され、サーバコンピュータとArduinoはシリアル通信されます。


(Processingの画面:画面上半分がサーボ用スライダ、下半分がLED用ボタン)

Processingの画面には、上半分がサーボ用のスライダ、下半分にLED用のボタンを配置することにします。スライダは0~255の値を送信し、ボタンは押すとオン(緑)の状態になり、もう一度押すと白(オフ)に戻ります。あるクライアントがボタンを押せば、サーバとその他のクライアントのボタンの色も同時に変わります。サーバからのコントロールも可能です。

Arduinoでは、サーボの値とLEDの値をサーバコンピュータからシリアル通信を通してデータ受信します。以下のプログラムでは、サーボは3番ピンと接続しPWMで制御することにします(サーボ制御の方法については、「Arduino サーボ制御」を参照して下さい)。LEDは13番ピンに接続しデジタル出力でオン/オフ制御することにします。


Arduinoのプログラム:

//サーボ用変数を用意
int servoVal;
//LED用変数を用意
int ledVal;

void setup(){
//シリアル通信開始
Serial.begin(9600);
//13番ピンをデジタル出力に設定
pinMode(13,OUTPUT);
}

void loop(){
//データが二個きたら(1個より多ければ)
if(Serial.available()>1){
//サーボの回転値として読み込む(0~255)
servoVal=Serial.read();
//LEDの点灯状態(0:OFF,1:ON)
ledVal=Serial.read();
//合図用データ送信
Serial.print('A');
}
//3番ピン(PWM):アナログ出力(サーボ)
analogWrite(3,servoVal);
//13番ピン:デジタル出力(LED)
digitalWrite(13,ledVal);

//0.02秒周期にする
delay(20);
}



「サーバのプログラム」:
サーバ側のプログラムでは、ネットワークとシリアル通信の二つのライブラリが必要となります。スライダは横方向(X座標)に動かし256段階あるので、画面サイズの横幅も256ピクセルにしてあります。ドラッグのためのプログラムは、mouseDragged()を使わず、startDrag(名前は任意)というフラグを用意し、mousePressed()でマウスを押したときにフラグがtrueになり、ドラッグが開始されたことになり、mouseReleased()でマウスが放されたときにドラッグ終了になり、同時にフラグもfalseになるようにしておきます。つまりフラグstartDragによって、ドラッグしているかどうかを判別することになります。ドラッグしていなくてもマウスボタンを押し続けている限りドラッグ中と見なされるので、その間データを送信し続けます。
あまり高速での通信ができないためフレームレートを10にしています。環境に応じてフレームレートを調整してみて下さい(サーバとクライアントのプログラム両方)。
サーバとクライアントの間では、文字列で送受信しています。文字列に含まれるデータは:

サーボの値 + コンマ + LEDの値 + 改行コード

であり、たとえば

"155,1\n"

のような連続した文字列になります。サーボの値は0~255の数値、LEDの値は0か1になり、その間をコンマで区切り(デリミタ)、最後の部分に「\n」改行コードを付け加えて送信します。文字「\n」は、アスキーコード表で十進数の「10」に相当します。受信の際には、readStringUntil(10)を使うことで、改行コード「\n」つまり「10」までをひとまとまりのデータとして読み込み、その文字列データをtrim()で改行コードを取り除き、split()でコンマをもとに配列に分解し、int()で文字列の数値を整数化し、それぞれの値に代入します(文字列を分解して数値化する方法は「Arduino-Processing シリアル通信5」でも説明してあります)。
サーバのプログラムが開始したら、「s」キーを押してArduinoとのシリアル通信を開始します。

Processing サーバのプログラム:

//ネットワークライブラリの取り込み
import processing.net.*;
//シリアル通信ライブラリの取り込み
import processing.serial.*;

//サーバのインスタンス
Server server;
//クライアントのインスタンス
Client client;
//シリアル通信のインスタンス
Serial port;

//サーボの変数
int servoVal;
//LEDの変数
int ledVal;
//ドラッグ中かどうかのフラグ
boolean startDrag=false;

void setup(){
//画面サイズ
size(256,200);
//フレームレートを遅めに設定
frameRate(10);
//サーバの設定(ポート:12345)
server = new Server(this, 12345);
//シリアルポート設定
port=new Serial(this,"/dev/tty.usbserial-A4001Kjl",9600);
//矩形描画を中央配置に設定
rectMode(CENTER);
//外形線なし
noStroke();
}

void draw() {
//クライアントからのデータ受信
client = server.available();
//クライアント受信内容が空ではないとき
if (client != null) {
//文字列データの読み込み(改行コードまで)
String input=client.readStringUntil(10);
//文字列データの改行コードを取り除く
input=trim(input);
//文字列データを整数の配列に変換
int[] data = int(split(input, ','));
//配列の最初の値をサーボ変数に代入
servoVal=data[0];
//配列の次の値をLED変数に代入
ledVal=data[1];
}

//ドラッグ中
if(startDrag){
//サーボ変数にマウスX座標値を代入(最小値:0、最大値:255)
servoVal=constrain(mouseX,0,255);
//クライアント側へ送信(サーボの値、コンマ、LEDの値、改行コード)
server.write(servoVal+","+ledVal+"\n");
}

background(0);//背景(黒)

fill(80);//スライダ溝の塗色(グレー:80)
rect(width/2,50,width,50);//スライダ溝の矩形描画
fill(255);//スライダの塗色(白)
rect(servoVal,50,10,50);//スライダの矩形描画

//LEDボタンの色切替(0:オフ,1:オン)
if(ledVal==1){ //オンの場合
fill(0,255,0);//緑にする
}else{ //オフの場合
fill(255); //白にする
}
//LED用のボタン描画
rect(width/2,150,50,50);
}

//シリアル通信処理
void serialEvent(Serial p){
//合図用データが1個来た場合(0個より多い場合)
if(port.available()>0){
//合図用データを読込んバッファを空にする
port.read();
//サーボの値とLEDの値をシリアル通信で出力
port.write(servoVal);
port.write(ledVal);
}
}

//キーを押した場合
void keyPressed(){
//「s」キーの場合
if(key=='s'){
//シリアル通信開始用データ送信
port.write(servoVal);
port.write(ledVal);
}
}

//マウスボタンを押した場合
void mousePressed(){
//LED用のボタン矩形内にマウスがある場合
if(mouseX>width/2-25 && mouseX<width/2+25 && mouseY>125 && mouseY<175){
//LED点灯切替処理
if(ledVal==0){//オフの場合
ledVal=1; //オンにする
}else{ //オンの場合
ledVal=0; //オフにする
}
//クライアント側へ送信(サーボの値、コンマ、LEDの値、改行コード)
server.write(servoVal+","+ledVal+"\n");
}
//スライダ部分の場合
if(mouseY>25 && mouseY<75){
//ドラッグのフラグをtrueにする
startDrag=true;
}
}

//マウスを放した場合
void mouseReleased(){
//ドラッグのフラグをfalseにする
startDrag=false;
}




「Processing クライアント側のプログラム」:

//ネットワークライブラリを取り込む
import processing.net.*;
//クライアントのインスタンス
Client client;

//サーボ用変数を用意
int servoVal=127;
//LED用変数を用意
int ledVal=0;
//ドラッグ中かどうかのフラグ
boolean startDrag;

void setup() {
size(256, 200);
frameRate(10);
//サーバのIPアドレス、ポートの設定
//(「10.0.1.2」の部分は適宜変更)
client = new Client(this, "10.0.1.2", 12345);
rectMode(CENTER);
noStroke();
}

void draw(){
//サーバからのデータ受信
if (client.available() > 0) {
String input = client.readStringUntil(10);
input = trim(input);
int[] data = int(split(input, ','));
print(data);
servoVal=data[0];
ledVal=data[1];
}

//ドラッグ中の処理
if(startDrag){
servoVal=constrain(mouseX,0,255);
client.write(servoVal + "," +ledVal + "\n");
}

//描画処理
background(0);
fill(20);
rect(width/2,50,width,50);
fill(255);
rect(servoVal,50,10,50);
if(ledVal==1){
fill(0,255,0);
}else{
fill(255);
}
rect(width/2,150,50,50);
}


void mousePressed(){
if(mouseX>width/2-25 && mouseX<width/2+25 && mouseY>125 && mouseY<175){
if(ledVal==0){
ledVal=1;
}else{
ledVal=0;
}
//サーバへ送信(サーボの値、コンマ、LEDの値、改行コード)
client.write(servoVal + "," +ledVal + "\n");
}

if(mouseY>25 && mouseY<75){
startDrag=true;
}
}

void mouseReleased(){
startDrag=false;
}



クライアント側のプログラムでは、setup(){...}内でサーバのIPアドレスを指定する必要があります。上のプログラムでは「10.0.1.2」になっていますが、適宜変更してください。通常ローカルネットワークであれば「127.0.1.2」や「192.168.1.2」、あるいはルーターやAirMacなどを使っていれば、「10.0.1.2」などになっているかもしれません。サーバに設定したコンピュータのIPアドレスを調べるには、MacOSXであれば、「システム環境設定>ネットワーク」を開き、AirMacを使用している場合は「AirMac」を選択、ケーブル接続している場合は「内蔵Ethernet」を選択し、「TCP/IP」タグを選択すると2段目あたりに「IPアドレス:10.0.1.2」などと表示されています。Windowsの場合は、コマンドプロンプトを開いて、「ipconfig」と打ってリターンすれば、幾つかの情報が現れ「IP Address....10.0.1.2」などと表示されるはずです。



「外部からの接続方法」:
ルータを通してインターネットに接続している場合、ローカルネットワーク外から通信するには、ルータのポートマッピングやサーバコンピュータのファイヤーウォールの解除設定する必要がでてきます。
通常、インターネットプロバイダからグローバルIPアドレスがひとつ与えられています。各自のパソコンからグローバルIPアドレスを調べるには以下のようなサイトで調べることができます。
http://dog.tele.jp/lookup.php
「あなたのパソコンのグローバルIPアドレスは」と書かれている場所に表示されるはずです。
あるいは、
http://www.ugtop.com/spill.shtml
のサイトの「現在接続している場所(現IP)」の欄に同じアドレスが表示されるはずです。
このグローバルIPアドレスをメモしておきます。


「接続例」:
以下は、ローカルネットワーク内のひとつのコンピュータをサーバに設定し、ローカルネットワーク外から通信をするための接続例です。例えば、仕事場や学校のコンピュータから、自宅にあるサーバに設定したコンピュータにアクセスする方法です。



上画像では、ADSLモデム-ルータを使用してインターネットに接続しており、さらにそのADSLモデム-ルータにAirMacをケーブルで接続しています。そして複数あるコンピュータは、AirMacの無線通信でインターネットに接続しています。
このネットワークのグローバルIPアドレスは、先ほど調べた方法により「219.196.xxx.xxx」になっています(実際のアドレスに置き換えてください)。「モデム-ルータ」によって、グローバルIPアドレスがプライベートIPアドレスに変換され、複数のプライベートIPアドレスに分けられます(「192.168.xxx.xxx」のようなアドレス)。さらに、AirMacにおいてもルータ機能があるため、さらに細かなプライベートIPアドレスに分けられます(「10.0.1.xxx」のようなアドレス)。
ここでは、二つのルータによって二段階にIPアドレスが割り振られていますが、AirMacを「ブリッジモード」に切り替えることで、以下のようにAirMacのルータ機能を使わないネットワークに変更することができます。



「ブリッジモード」:
「ブリッジモード」は、コンピュータから「AirMacユーティリティ」を開いて変更することができます(ただし、変更できる権限が必要です)。「ブリッジモード」にすることで、AirMacはIPアドレス(「10.0.1.xxx」のようなアドレス)を割り振らなくなるので、元々の「モデム-ルータ」が割り振るアドレスを使うことにします(「192.168.xxx.xxx」のようなアドレス)。ただし、このままだと「モデム-ルータ」が自動的にプライベートIPアドレスをそれぞれのコンピュータに割り振ってしまうので、使用しないコンピュータなどがあるときは、プライベートIPアドレスが入れ替わってしまうことがあります。
そのため、サーバにしたいコンピュータには固定したIPアドレスを与えます。以下のように「コンピュータC」に固定のIPアドレス「192.168.3.10」を与えて、サーバとして機能させることにします。



「固定IPアドレスにする」:
各コンピュータ上のIPアドレス設定では、「DHCPサーバを参照」や「DHCPサーバを使用」というように、ルータから自動的にIPアドレスが割り振られる設定になっていることが多いと思います。MacOSXの場合、「システム環境設定>ネットワーク」へ行き、AirMac(あるいはEthernet:現在インターネットに接続している方法を選択)を選択し、「TCP/IP」の項目内で設定できます。サーバ用に使うコンピュータにおいては、このIPアドレス設定の部分を、「手入力」に変更し、指定したIPアドレスを使うように設定し直します。
Windows XPの場合は、「コントロールパネル>ネットワーク接続」で、使用しているネットワーク接続(「ワイヤレスネットワーク接続」など)のプロパティを右クリックで開き、「インターネットプロトコル(TCP/IP)」を選択しプロパティボタンを押し、「IPアドレスを自動的に取得する」に設定されている部分を「次のIPアドレスを使う」に切り替えて、以下の設定を入力していきます。

上図の場合は、ルータのIPアドレスが「192.168.3.1」になり、AirMacが「192.168.3.2」、以下に続く各コンピュータは「192.168.3.3」、「192.168.3.4」というように最後の数値がひとつずつ増えていきます。IPアドレスが重ならないように、固定するIPアドレスを「192.168.3.10」に設定しておきます(1~254まで可)。サブネットマスクは自動的に「255.255.255.0」になるはずです。ルータのIPアドレス(ゲートウェイ)は、「DHCPサーバを参照」の時と同じなので「192.168.3.1」を記入します。「DNS」あるいは「DNSサーバ」の項目については、先ほど調べたグローバルIPアドレスである「219.196.xxx.xxx」を記入します(グローバルIPアドレスは、実際に調べたアドレスを入れてください)。サーバ用のコンピュータの設定は以上です。


「ポートマッピング設定」:
もうひとつしなければならないことは、ポートマッピング(ポート転送/ポートフォワーディング)の設定です。回線に接続しているルータ自体の設定を変更する必要があります。通常コンピュータ上のブラウザからルータのアドレスにアクセスし操作するようになっています(各ルータのマニュアルを参照してください)。大抵の場合は、「詳細設定」のような項目に入っていると思います。
プロトコル、ポート、転送先のIPアドレス(先ほど固定したサーバ用のIPアドレス)を入力する必要があります。プロトコルは「TCP/UDP」を選択し、WAN側とLAN側のポートは同じものを入れておきますが、今回の場合Processingのコードでポートを「12345」に設定しておいたので、それを入力することにします(「12345」〜「12346」までというように範囲指定する入力にしておきます)。転送先IPアドレスは、固定した「192.168.3.10」を入力しておきます。ポートマッピングの設定は以上です。尚、ポートは、0~65535までの番号が入れられますが、0~1023までは使用目的が決められているので、あまりつかわない方がいいと思います。

ポートマッピングによって、ポート「12345」(あるいは「12346」)を通してローカルネットワーク外からグローバルIPアドレス「219.196.xxx.xxx」に送られた信号は、サーバ用コンピュータのプライベートIPアドレス「192.168.3.10」に転送されることになります。

Processingのクライアント用のプログラム内の、

client = new Client(this, "219.196.xxx.xxx", 12345);

IPアドレス部分をグローバルIPアドレス「219.196.xxx.xxx」(実際に調べたアドレスを入れてください)に書き換えればローカルネットワーク外から通信できるようになります。

参照:YahooBBのモデムのポート転送設定方法


「外部から通信できない場合」:
ファイヤーウォールによって、外部からの通信をブロックしている場合があるので、ファイヤーウォール設定を解除して通信してみてください。ただし、セキュリティ上危険になるので注意してください。

尚、同じローカルネットワーク内にある別のコンピュータからは通信できないので(例えば上図の「コンピュータA」とサーバの「コンピュータC」との通信はできない)、異なるグローバルIPアドレス(外部)から通信してください。「コンピュータA」と「コンピュータC」を通信させる場合は、前半で説明したローカルネットワーク内での通信方法を利用してください。



10/23/2008

Arduino書籍:「Getting Started with Arduino」


Getting Started with Arduino

Arduinoの本「Getting Started with Arduino」が、日本のアマゾンからも購入(予約購入)できるようになりました。

その他、Arduino関連の本であれば、主に以下のようなものがあります。
・「Making Things Talk
・「Physical Computing: Sensing and Controlling the Physical World with Computers

Arduino-Processing BlueTooth通信+曲げセンサ

以前、ワイヤレス通信としてXbeeモジュールを用いましたが、もう一つワイヤレス通信として「BlueTooth」を用いる方法があります。今回は、SparkfunのBlueToothモジュール「BlueSmiRF Gold」を使います(国内ではストロベリーリナックスで販売)。Xbeeは3.3V電源を使用しますが、「BlueSmiRF Gold」は3.3V〜6.0Vまでの電源を使うことができるので、そのままArduinoにも接続しやすい仕様となっています(ただし、日本において、「BlueSmiRF Gold」は技術基準適合証明を受けていないため、実験や開発用のみで使用しなければならないようです)。Xbeeの場合は最低でも二つのモジュールを用意しなければ通信実験できないのですが、多くのノートパソコンにはBlueToothが搭載されているので、一つのBlueToothモジュールがあれば、とりあえずコンピュータから送受信することができます。


(上画像:「BlueSmiRF Gold」/from Sparkfun


今回は、Arduino基板に曲げセンサと「BlueSmiRF Gold」を接続し、コンピュータのBlueTooth機能を利用して、Processingとワイヤレスでシリアル通信してみます。曲げセンサについては、2本を背中合わせに貼り合わせて、まっすぐな状態から両方向に曲げて出力値が変化するように加工します。


「コンピュータとのBluetooth接続設定」
まず、「BlueSmiRF Gold」とコンピュータのBluetoothの接続設定を行います。
「BlueSmiRF Gold」には以下のように6本の端子があります。

CTS:送信要求端子(非接続またはRTS端子へ)
PWR:電源端子(Arduino 5V端子へ)
GND:グランド端子(Arduino GND端子へ)
TX :送信端子(Arduino RX:0番端子へ)
RX :受信端子(Arduino TX:1番端子へ)
RTS:受信準備完了端子(非接続またはCTS端子へ)

「BlueSmiRF Gold」のPWR端子とGND端子をArduinoの5V端子とGND端子に接続し、USBを通して電源供給します(あるいは、外部電源でもかまいません)。そうすれば、「BlueSmiRF Gold」の赤色のLEDが点滅し始めます。他の端子については、今のところ接続する必要はありません。

MacOSXの場合、
・メニューバー右端のBluetoothアイコンをクリック。
・「Bluetooth:入」を選択し機能をオンにする。
・さらに「Bluetoothデバイスを設定...」を選択する。
・「Bluetooth設定アシスタント」の画面が現れる。
・「続ける」を押していき、「任意のデバイス」を選択。
・デバイスが検索されたら「パスキーオプション」を押す。
・「このデバイスではパスキーを使用しない」を選択し「OK」を押す。
・「続ける」を押していき、最後に「終了」を押して完了。

Windowsの「Bluetooth設定」の場合、
アプリケーションを立ち上げて「新しい接続」を押します。「新しい接続の追加ウィザード」の画面で、「エクスプレスモード」を選び「次へ」を押し、「FireFry-D39A」というようなデバイス名で「BlueSmiRF Gold」を認識します。「次へ」を押すとポートが「COM40」あたりに設定されます。設定されれば以下のような画面になります。

「FireFry-D39A」を選択しダブルクリックすれば「接続」しますが、ここでは「接続」せず「ハイパーターミナル」上で「接続」することにします。

Bluetoothが内蔵されていないコンピュータの場合は、以下のようなBluetooth USBアダプタをコンピュータに接続する必要があります。




「Zterm/ハイパーターミナルの設定」
「BlueSmiRF Gold」の赤色のLED点滅が緑色のLED点灯に変われば通信接続されたことになります。
ただし「BlueSmiRF Gold」のデフォルトの通信速度(ボーレート)が115200bpsであるため、9600bpsに設定し直すことにします。そのためには、「BlueSmiRF Gold」の内部設定をATコマンドによって変更します。ATコマンドを使うには、MacOSXなら「ZTerm」、Windowsなら「ハイパーターミナル」などのターミナルアプリケーションを使って送信すると便利です。
「BlueSmiRF Gold」を電源に接続し、コンピュータのBluetooth接続設定をした後、「ZTerm」(MacOSX)あるいは「ハイパーターミナル」(Windows)を起動します。

MacOSXの場合:
ZTermのDial>Directry...を選択すると以下の画面が現れます。

「Dial Directory」画面上の「New」ボタンを押すと以下のような別画面が現れます。

「Service Name:」の欄に任意名を記入します。「Local Echo」にチェックを入れます。その他は上のような設定でも大丈夫です。「OK」ボタンを押します(「Dial Directory」画面上の中央上の「Connection」ボタンでこの画面に戻ることができます)。
「Settings>Terminal...」あるいは「Dial Directory」画面上の「Terminal」ボタンを押すと以下の画面が現れます。

上のような内容で設定し「OK」ボタンを押す。
次に、「Settings>Modem Preferences...」を選択すると以下の画面が現れます。

ここで、画面上段の「Serial Port:」がBluetoothのシリアルポート(「/dev/tty.FireFly-D39A-SPP-1」など)になっているか確認してください(なっていなければ選択する)。「OK」ボタンを押し、「Dial Directory」画面に戻ります。「Dial」ボタンを押して通信接続します。接続中は、「BlueSmiRF Gold」の緑色のLEDが点灯します。接続されない場合は、「BlueSmiRF Gold」の電源を入れなおすか、「Zterm」を再起動してみてください。

Windowsの場合:
ハイパーターミナルを立ち上げます。

この画面上で、「名前:」に接続名(任意名)を記入し、「OK」を押します(次回接続するときは、「キャンセル」を押し、メニューバーの「ファイル>開く」から保存した設定ファイルを選択してください)。


「接続方法:」の欄で、先ほどの「Bluetooth設定」で割り当てられたポート「COM40」を選択し「OK」を押します。


「ビット/秒:」を「9600」、「フロー制御」を「なし」、「適用」と「OK」を押します。
この設定ウィンドウが閉じると自動的に接続が開始されますが、メニューバーの「通信>切断」で通信を中断し、「ファイル>プロパティ」をクリックし、以下の画面を出します。


「ASCII設定」ボタンを押すと、さらに以下の画面が現れます。


上画像のようにチェックをいれます。「OK」を押して戻ります。
メニューバー「通信>電話」をクリックし、通信を開始します。
通信が開始されれば、「BlueSmiRF Gold」の緑のLEDが点灯します。
後は、ATコマンドを入力していきます。


「ATコマンド入力/通信速度の設定変更」
コンピュータ側のBluetoothと接続され、「BlueSmiRF Gold」の緑色のLEDが点灯すれば、以下のようにATコマンドを入力していきます。

$$$

ドルを三回(最後にリターンキーは押さない)を入力すると「CMD」という返事が表示され、ATコマンドモードに切り替わり、緑のLEDが点灯しつつ赤いLEDが点滅し始めます。
注意しなければいけないことは、「BlueSmiRF Gold」にはタイマー機能(デフォルト:60秒)があり、電源を入れてから60秒以内に「$$$」を入力する必要があります。時間切れになると、赤いLEDの点滅速度が遅くなります。「CMD」が表示されなかったり、赤いLEDが高速に点滅しないときは、一旦通信を切断し、「BlueSmiRF Gold」の電源を切って再接続した後、60秒以内に再度「$$$」を入力してみてください。あるいは、以下のように、このタイマー機能の時間を設定し直すことも可能です。

ST,100

を入力し「リターンキー」を押せば、タイマーを100秒に設定することができます(「ST,」の後に数値を入れることで制限時間を設定できます)。ただし、「ST,」の後に「0」を入力すると「遠隔設定不可」、「255」を入力すると「時間制限なし」になります。

通信速度(ボーレート)を9600に変更するには、

SU,96

を入力し「リターンキー」を押します(「SU,」の後にボーレートの最初の2桁を入力、9600の場合「96」、4800の場合「48」を入力)。「AOK」が表示されれば、変更されたことになります。変更内容を確認するには、

D

を入力し「リターンキー」を押します。そうすると各設定が以下のように表示されます。

***Settings***
BTA=00066600D39A
BTName=FireFly-D39A
Baudrt=9600
Parity=None
Mode =Slav
Authen=0
Encryp=0
PinCod=1234
Bonded=0
Rem=NONE SET

「Baudrt=9600」になっているので、通信速度(ボーレート)は9600に変更されています。ATコマンドモードを終了するには、

---

というように、ハイフンを3回入力し、「リターンキー」を押してください。そうすると「END」という返事がきます。
その他のコマンドについては、
http://www.sparkfun.com/datasheets/RF/RN_BlueportII-ref-guide.pdf
に書いてあります。「BlueSmiRF Gold」の基本設定は以上です。
尚、「ZTerm」やATコマンド入力については、「Arduino+Xbee Shield/Processing+XBee Explorer USB」においても説明があります。


(「ZTerm」のATコマンド入力画面)


「曲げセンサの接続方法」
次は、曲げセンサについてです。通常、曲げセンサはまっすぐな状態の時に抵抗値が低く、曲げると抵抗値が高くなる特性があります。反対方向に曲げてもそれ以上抵抗値は変化しないので、曲げる方向は一方向に限られてしまいます。2本の曲げセンサを背中合わせに貼り合わせて1本として使えば、まっすぐな状態からどちらの方向に曲げても抵抗値が変化するようになります。曲げセンサの通電性のある面を外側にし、両面テープなどで貼り合わせ、それぞれの端子の部分は互いにショートしないようにビニルテープや熱収縮チューブなどで絶縁しておきます。
ひとつの曲げセンサにプルアップ抵抗(10KΩ)を取付け、もうひとつの曲げセンサにはプルダウン抵抗(10KΩ)を取付けます(プルアップ/プルダウン抵抗については「センサについて」を参照)。そうすることで、一方へ曲げると読み取られる電圧は下がり、逆方向へ曲げると電圧が上がるようになります。それぞれ読み取った値をプログラム上で合成しProcessingへ送信します。Arduinoのアナログ入力analogRead()で読み込むと、一方の値が約200~500に変化し、もう一方が約500~800に変化するので、合成すると約700~1300前後で値が変化することになります。まっすぐな状態のときは、約1000前後になります。
ちなみに、「Bi-directional Flexible Bend Sensor」という両方向性の曲げセンサがあります。


「スタンドアロン/外部電源の接続方法」

今回はワイヤレス通信なのでコンピュータにUSB接続せずに、外部電源として乾電池006P(9V)を用いスタンドアロンで操作できるようにします。
抵抗を取り付けた曲げセンサを、以下のようにArduinoのアナログ端子の0番ピンと1番ピンに接続します。
Arduinoへプログラムをアップロードする際には、Bluetoothモジュールを外して行って下さい。同時に、Arduino基板上の「USB-EXT」のジャンパピンも「USB」側に差込んでアップロードしてください。
アップロード後は、Arduino基板とBluetoothモジュールを以下のように接続し、「USB-EXT」のジャンパピンを「EXT」側に差し込んでください。




「Arduinoのプログラム」

void setup(){
//シリアル通信開始
Serial.begin(9600);
}

void loop(){
//変数を用意し、二つの読取り値を合成して代入
int val=analogRead(0)+analogRead(1);

//合図用データが届いたら
if(Serial.available()>0){
//合成した値を文字列(改行コード付き)で送信
Serial.println(val,DEC);

//バッファを空にしておく
Serial.read();
}
}



Arduinoからは、値を文字列として送信します。文字列にすることで、大きな値をそのままProcessingへ送信することができます(文字列でシリアル通信する方法については「Arduino-Processing シリアル通信5」を参照して下さい)。


「Processingのプログラム」
Processingの方は、読み取った値に応じて矩形が左右に動く単純なプログラムにします。Arduinoからは改行コードを含んだ文字列データが届くのでbufferUntil()を用い、改行コードまでをひとまとまりのデータとしてreadStringUntil()で読み込み、不要な改行コードをtrim()で取り除き、int()で整数値化し、最終的にmap()でオフセットや最小値/最大値を設定してX座標に代入します。少しゆとりをみて、合成された読み取り値の最小値を500、最大値を1500、図形のX座標値となる最小値を0、最大値を画面幅の600に設定することにします。map()で得られる値はfloat(小数)になるので、X座標用の変数xもfloat型にしておきます。
プログラムを実行し、マウスクリックでシリアル通信を開始することにします。


//シリアル通信ライブラリを取り込む
import processing.serial.*;
//ポートのインスタンス
Serial port;
//X座標用の変数(小数)
float x;

void setup(){
//横長の画面に設定
size(600,200);
//シリアルポート設定(Bluetoothのポート)
port=new Serial(this,"/dev/tty.FireFly-D39A-SPP-1",9600);

//「10」(ラインフィード:改行コード)が来る度に
//serialEvent()を呼び出す
port.bufferUntil(10);
}

void draw(){
//背景
background(100);
//矩形描画
rect(x,100,20,20);
}

void serialEvent(Serial p){
//文字列の変数stringDataを用意し、
//「10」(ラインフィード:改行コード)が来るまで読み込む
String stringData=port.readStringUntil(10);

//文字列データが空ではないとき
if(stringData!=null){
//文字列データに含まれる改行記号を取り除き整数にする
int val=int(trim(stringData));
//値のオフセット、最小値、最大値を設定しxに代入
x=map(val,500,1500,0,600);
//合図用データ送信
port.write('A');
}
}

//マウスをクリックしたらシリアル通信開始
void mousePressed(){
//通信開始用データ送信
port.write('A');
}


[目次:Processing関係]  [HOMEへ戻る]  [目次:Arduino関係]