INDEX(各項目ごとの目次)

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

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

5/23/2008

Arduino 5/24授業

今週5/24も先週に引き続きArduinoを行います。パソコン、Arduino基盤、USBケーブル、ブレッドボード、ジャンプワイヤ、7セグLED(先週使った部品)を持って来て下さい。Processingも同時に行います。

5/18/2008

Arduino 7セグLEDの点灯

7セグLEDは、数字の形を表示するための細長い7個のセグメントと数字右下にある「.(ドット)」の合計8個のLEDで構成されています。つまり8個のLEDを制御するプログラムになるということです。授業で用いた7セグLEDは、秋月電子で購入したものでデータシートは付属していましたが、部品単体で販売されていることもあるので、その際にはメーカーや型番をインターネットで検索しデータシートを探し出すか、自分自身でどのセグメントがどの端子に対応しているのかなどをテストする必要があります。今回の7セグLEDは、アノードコモンタイプ、8個のLED、10本の端子です。アノードコモンタイプは、8個のLEDのプラス側の端子を共有するつくりになっています。
Arduino基盤につなぐには、Arduinoの電圧が5Vに対してLEDの使用電圧が2.5V前後なので、前回同様、抵抗(220〜470Ω程度)が必要になります。一つの抵抗を8個のLEDに対して共有することもできないわけでもないのですが、数字を表示する際には、「0」の場合は6個のLEDセグメント、「1」の場合は2個のLEDセグメントを発光させるというように、その数字によって、発光させるLEDセグメントの数が異なるので、セグメント数が少ないほど明るく発光してしまいます。それぞれの発光を均一にするためにも、抵抗はセグメントの数と同じだけ必要となります。今回はアノードコモン(プラス側の端子は共有)なので、各抵抗はカソード側(マイナス)に接続する回路にします。
1秒ごとに0〜9までカウントアップしていき、それをループするプログラムにしたいと思います。数字右下の「.(ドット)」は今回使わないで、合計7個のLEDセグメントを制御します。

まず、7セグLED裏面に10本端子があるので、どの端子がどのセグメントであるか、ひとつずつ点灯実験してみます(Arduino基盤の5V端子とGND端子に接続してテストしますが、この際にも抵抗を直列つなぎしてください)。ブレッドボードとジャンプワイヤがあると便利です。7セグLEDの場合、共有端子が真ん中にあることが多いので、データシートがない場合は、そのようなことを想定してテストしてみるといいかもしれません。



それぞれの端子は、上図のように各セグメントに対応していることが分かりました。cとhはアノード共有端子です。今回は、eのドットは使わず、a、b、d、f、g、i、jの7個を制御表示させることにします。例えば「1」を表示させるには、dとfをオンにし、残りはオフになるように設定します。アノードコモンであることから、cにはプラスの電圧がかかり、dとfを発光させるには、dとfがマイナスにならなければいけません。前回用いた図の「抵抗をカソード側につけた場合」を参考とし、a、b、d、f、g、i、jの7個の端子にそれぞれ別個の抵抗(220Ω)を取付け、Arduino基盤のデジタル出力の端子に接続します。
とりあえず、aの端子をArduino基盤の1番ピン、bを 2番ピンという順番で以下のようにつなげることにします。
a---1番ピン
b---2番ピン
d---3番ピン
f---4番ピン
g---5番ピン
i---6番ピン
j---7番ピン



「1」を表示するためには、dとfを0V(LOW)にすることで電位差が生じ発光します(cの端子から5V、dのLEDを通して2.5Vに降下し、抵抗によって2.5Vから0Vに降下する)。プログラム上では、
digitalWrite(3,LOW);
digitalWrite(4,LOW);

に設定すると3番ピン(dのLED)とが4番ピン(fのLED)が発光し、「1」の数字が表示されることになります。ただし、光らせたいピンだけではなく、残りのピンを光らせないプログラムも必要となります。残りのピンについては、すべてLOWのかわりにHIGHに設定します。よって、「1」を表示させるプログラムは以下のようになります。
void setup(){
//1〜7番ピンを出力に設定
pinMode(1,OUTPUT);
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
}

void loop(){
//「1」を表示
digitalWrite(1,HIGH);
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
digitalWrite(7,HIGH);
delay(1000);
}

他の数字に関しても同様にプログラムしていきます(ここでは省略して、0〜3までの表示とします)。
void setup(){
//1〜7番ピンを出力に設定
pinMode(1,OUTPUT);
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
}

void loop(){
//「0」を表示
digitalWrite(1,LOW);
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,HIGH);
delay(1000);
//「1」を表示
digitalWrite(1,HIGH);
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
digitalWrite(7,HIGH);
delay(1000);
//「2」を表示
digitalWrite(1,LOW);
digitalWrite(2,LOW);
digitalWrite(3,HIGH);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,HIGH);
digitalWrite(7,LOW);
delay(1000);
//「3」を表示
digitalWrite(1,HIGH);
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,HIGH);
digitalWrite(7,LOW);
delay(1000);
}

setup()の中のpinMode()for文という繰り返しの構文を用いた書き方にします。以下のfor()の中の「int i=1; i<=7; i++」は、1から7までを順番(+1ずつ)に7回分繰り返し処理するという意味です。もし「int i=3; i<=5; i++」と書いていれば、3から5までの3回分繰り返し処理することになります。この場合なら、3から5がpinMode()内のiに代入されるので、3〜5番ピンをOUTPUTに設定するということになります。「int i=1; i<=7; i+=2」と書けば、「i++」の部分を「i+=2」にしたので、1〜7までを+2ずつということになり、「1、3、5、7」だけを処理させるということになります。上記プログラムでは、1〜7番ピンを一気にOUTPUTに設定したいので、以下のように「int i=1; i<=7; i++」とします。
それから、loop()の中が長くなりすぎて見づらいので、それぞれの数字の表示に対してファンクション名(任意の名前)をつけて、以下のようにloop()の外に定義しておくことができます。
void setup(){
for(int i=1; i<=7;i++){ //iを1から7までの数とし
pinMode(i,OUTPUT); //1から7までのピンを出力に設定
}
}

void loop(){
zero();
delay(1000);
one();
delay(1000);
two();
delay(1000);
three();
delay(1000);
}

void zero(){
digitalWrite(1,LOW);
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,HIGH);
}

void one(){
digitalWrite(1,HIGH);
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
digitalWrite(7,HIGH);
}

void two(){
digitalWrite(1,LOW);
digitalWrite(2,LOW);
digitalWrite(3,HIGH);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,HIGH);
digitalWrite(7,LOW);
}

void three(){
digitalWrite(1,HIGH);
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,HIGH);
digitalWrite(7,LOW);
}

このように各数字に対するファンクションを定義することで、必要に応じてloop()内でファンクション名を呼び出す使い方が可能になります。loop()内では、全体の流れが上から順に書かれており、loop()外には、それぞれの数字の内訳のプログラムが書いてあり、全体と部分という関係でプログラムしていくことができます。部分(数字の内訳のプログラム)を修正すれば、loop()内で処理される全体の流れにもすぐ反映され、全体の流れだけを修正したい時には、いちいち部分のプログラム内容に触れなくても済むという利点があります。

また、数字がカウントアップしていくプログラムであれば、更に以下のように配列(Array)を利用して、反復する内容をできるかぎり省略して書くこともできます。先ほどまでは、pinMode()、digitalWrite()、delay()が繰り返し書かれてきましたが、以下のようにすれば、それぞれを一回書くだけで済みます。
boolean table[4][7]={ {0,0,0,0,0,0,1},
{1,1,0,0,1,1,1},
{0,0,1,0,0,1,0},
{1,0,0,0,0,1,0} };

void setup(){
for(int i=1; i<=7;i++){
pinMode(i,OUTPUT);
}
}

void loop(){
for(int i=0;i<=3;i++){
for(int j=0;j<=6;j++){
digitalWrite(j+1,table[i][j]);
}
delay(1000);
}
}

配列によって複数の値をグループとして用いることが可能となります。配列は[]の括弧をもちいてあらわします。もし、数字の「0」についてのグループをつくるなら、

boolean zero[]={0,0,0,0,0,0,1};

となります。zeroというグループには7つの値が含まれており、それぞれが順番にLEDセグメントのLOWかHIGH(0か1)の設定に対応しています。0か1しかないので、boolean型を用いています。zero[6]という表記は、配列zeroの6番目の値ということになります。配列では、{}内に含まれる最初の値を0番目として扱います。よって、zero[0]からzero[5]までは0で、配列zeroに含まれる最後の値であるzero[6]は1となります。
zero[]と同様にして数字「1」、「2」、「3」に関しては
boolean one[]={1,1,0,0,1,1,1};
boolean two[]={0,0,1,0,0,1,0};
boolean three[]={1,0,0,0,0,1,0}

となります。
さらに、これらの各数字グループをまとめる全体グループをもう一つの配列を用いてつくります(その配列名をtableとします)。
一行で書くと横に長くなるので、改行して少し見やすくします。

boolean table[4][7]={ {0,0,0,0,0,0,1},
{1,1,0,0,1,1,1},
{0,0,1,0,0,1,0},
{1,0,0,0,0,1,0} };

配列tableは、4つ要素を持ち、それぞれの要素がさらに7つの値を含んでいるということになります。例えば、table[2][2]は、数字「2」の2番目の値で1(HIGH)であり、table[2][5]も1(HIGH)となります。
この全体の配列tableは、loop()内で処理される全体の流れと、それぞれの内訳を0と1だけを用いて書き直した表のようなものです。loop()内では、この表に従って順にカウントアップされる処理が行われます。
void loop(){
for(int i=0;i<=3;i++){
for(int j=0;j<=6;j++){
digitalWrite(j+1,table[i][j]);
}
delay(1000);
}
}

このloop()内のfor文では、iをint型の変数にして0〜3までの数字を順番に処理していき、その処理のさらに内部では、jをint型の変数にして各配列の0〜6番目までの値を順番に処理させ、digitalWrite()のピン番号とLOWかHIGHかを指定する部分に0か1が入るようになっています(digitalWrite()の中のj+1という部分は、配列の0番目が今回使用したArduino基盤のピン番号の1番目に対応するため+1してあります。本来、基盤の0番ピンから使えば、配列の0番目がピン番号の0番目に対応するので、このようなことをしなくても済んだはずです)。
配列(Array)for文に関しては、プログラミングではよく出てきますので、詳細については再び授業あるいはブログで説明していきたいと思います。

関連:
Arduino:7 セグ+照度センサNJL7502L」--照度センサで得た値を7セグを用いて表示する


Arduino LEDの点滅



LEDを点滅させるプログラム(上画像)です。
まずsetup()loop()を用いて、以下のようなフォーマットを用意します。ほぼProcessingと同じような感じです。
void setup(){
//初期設定のプログラム
}

void loop(){
//ループ処理のプログラム
}

初期設定setup()の中には、pinMode()を使って、基盤上のどのピンを出力または入力で使いたいのかを設定します。
pinMode()の()内には、数字でピンの番号(0〜13)とOUTPUTかINPUTのどちらかをコンマで区切って入れます。LEDを光らせる電源としてOUTPUT(出力)に設定します。
ループ処理loop()の中には、LEDを点滅させる一連の処理についてのプログラムを書きます。
digitalWrite()の()内には、数字でピンの番号(0〜13)とHIGHかLOWのどちらかをコンマで区切って入れます。HIGHは5Vを出力し、LOWは0Vを出力します。delay()は、()内に入れた数字の分だけ、時間を保持します。単位はミリ秒で、1秒は1000ミリ秒に相当します。上記のプログラムでは、delay(1000)を二回挿入しているので、2秒ループのプログラムになります。
プログラムを新たに書き直したら、一旦「Verify」ボタンを押してプログラムをコンパイルします。Arduino基盤とパソコンがUSB接続されていれば、「Upload to I/O Board」ボタンをクリックし、基盤にプログラムをアップロードします。


LEDは電流を一方向にしか流さない特性があるため、+と-を電源に対して正しくつながないと発光しません(逆につないでも壊れるということは、ほぼありません)。上図のように、通常二つの端子(アノードとカソード)があります。アノード側をプラスに、カソード側をマイナスに接続します。LEDの多くは2.5V前後の電源で発光するようにつくられているので、Arduino基盤上の5V電源とGND(0V)に直接つなぐと壊れる恐れがあります。そのため、抵抗をかませる必要があります。Arduino基盤の13番ピンには抵抗なしで直接つなぐことができますが、0〜12番ピンに接続する際には、抵抗(220〜470Ω程度)を直列つなぎしてください。LEDによって特性が異なりますので、より精確に行いたい場合は、購入する際に使用電圧や最大電流についてメモしておくか、付属のデータシートを参考にしてください。



アノード側に抵抗をつないだ場合は、抵抗を通して5Vの電圧が2.5Vまで下げられ、LEDによって2.5Vから0Vに下げられます。
カソード側に抵抗をつないだ場合は、LEDを通過することで5Vの電圧が2.5Vまで下げられ、抵抗によって2.5Vから0Vに下げられます。
最初にプラス側で電圧をさげておくか、最後にマイナス側で電圧を下げるかという違いです。もし、抵抗を取付けなければ、LEDにおいて5Vから0Vに一気に下げられ、電位差が5Vになってしまい使用電圧である2.5Vをはるかに上回り破損してしまうという感じです。抵抗の取付けについては、回路設計やLEDの特性に応じて使い分けてください。

5/17/2008

Arduino基盤の概要


上画像は旧型のArduino Decimilaボードです。

Arduino基盤には、大きく分けてデジタル出力、デジタル入力、アナログ出力、アナログ入力の端子があります。LED、センサ、アクチュエータ、その他電子部品を接続して使用します。基盤上方にある0〜13番ピンについては、デジタル入出力の際に、使用するピンを出力用に使うのか、入力用に使うのかをプログラム上のpinMode()で設定する必要があります。基盤の下方にある5Vピンからは、5V電圧をとることができます。GNDピン(0V)は、上方13番ピンの隣と、下方5Vピンの隣に2つ、合計3箇所あります。
Arduino基盤では、基本的に、0〜5Vの電圧を扱います。

デジタル出力:
デジタル出力/digitalWrite()では、LOWかHIGHの二段階の出力方法しかありません。LOWは0Vに、HIGHは5Vに対応します。あるいは、二進法ではLOWが0、HIGHが1、またboolean型変数におけるfalse/trueに対応します。
例えば、LEDの点灯/消灯させるときに使います。

デジタル入力:
デジタル入力/digitalRead()も同様にLOW/HIGHの二段階です。
例えば、接続したセンサ/スイッチを通してオンになっているのかオフになっているのかを読み取るときに使います。

アナログ出力(PWM):
アナログ出力/analogWrite()は、上方の3、5、6、9、10、11番ピンの6箇所に接続でき、0〜255の256段階の出力が可能です(0V〜5Vを256段階に分けています)。
例えば、LEDの明暗を調節して光らせるときに使います。モーターならスピード調節になります。

アナログ入力:
アナログ入力/analogRead()は、センサなどから0〜1023の1024段階の読み取りが可能です(0V〜5Vを1024段階に分けています)。
例えば音量調節、照度調節、スピード調節などするために接続したセンサの度合いを読み取ります。

アナログ入出力においては、pinMode()を設定する必要はありません。

電源(外部電源):
通常は、USB接続によってパソコンから5V電源がArduino基盤に供給されます。外部電源から供給したい場合には、外部電源端子にバッテリやACアダプタ(6~20V/推奨は7~12V)などを接続します。例えば、DC12V/1AのACアダプター
差し込むプラグは内径2.1mm、外形5.5mmで、中心軸がプラス極になります。
*Arduino Decimilaなどの旧型の場合は、USB/外部電源のジャンパピンを差し替える必要があります(基盤上に明記されている文字:USBからEXT側へ)。パソコンからプログラムをアップロードする際には、再度USBケーブルを接続し、USB側へジャンパピンを差し替えます。

Arduinoのセッティング



ソフトのダウンロードとインストール:
・Arduinoサイトへアクセス→http://www.arduino.cc
・サイト内Downloadページから開発環境ソフト「Arduino 0018」(最新版)をダウンロード(Win用/Mac用あり)。
(注意)初めて使う場合は、「Arduino開発環境ソフト」だけでなく「USBドライバソフト」もインストールする必要があります。

Windows:
・ダウンロードした「arduino-0018.zip」を展開する。
・「arduino-0018」ファイルを「C:¥Program Files」へ移動しインストール。
・ArduinoボードをUSB接続する。
・「USBドライバソフト」のアップデート自動検索画面が出るので(初回のみ)、
 「Program Files>arduino-0018>drivers>FTDI USB Drivers」フォルダを指定しインストールする。
 (Vistaの場合は自動的に探してインストールされる)。
・「arduino-0018」フォルダ内の「arduino.exe」を開く。
・Arduinoソフトのメニューバー「Tools>Board」から接続しているArduinoボードの種類を選択。
「Arduino Duemilanove 328」なら「Arduino Duemilanove or Nano w/ATmega 328」を選択。
・メニューバー「Tools>Serial Port」から「COM*」を選択(COM3などと表示)。
・以上でセットアップ完了。
*「USBドライバ」がインストールされたか確認するには:
ArduinoボードをUSB接続したまま「コントロールパネル>システム」を開き、「システムのプロパティ」画面内「ハードウェア」タブを選択、「デバイスマネージャ」ボタンをクリック、「デバイスマネージャ」内のリストから「ポート(COMとLPT)」を選択、「ポート(COMとLPT)」内に「USB Serial Port(COM3)」(COM4やCOM5の場合あり)があるか確認。Arduinoソフトのメニューバー「Tools>Serial Port」で上記のPort(COM3など)を選択する。

Macintosh:
・ダウンロードした「arduino-0018.dmg」を開く。
・「Arduino.app」を「Applications」フォルダに移動。
・「FTDIUSBSerialDriver_10_4_10_5_10_6.mpkg」をダブルクリックし、ドライバを画面上の指示に従いインストール。
・ArduinoボードをUSB接続する。
・ダウンロードしたArduino.appを開く。
・Arduinoソフトのメニューバー「Tools>Board」からArduinoボードの種類を選択。
「Arduino Duemilanove 328なら」「Arduino Duemilanove or Nano w/ATmega 328」を選択。
・メニューバー「Tools>Serial Port」から「/dev/tty.usbserial-********」を選択。
 上記「********」はボードによって異なります。
・以上でセットアップ完了。
*「USBドライバ」がインストールされたか確認するには:
ArduinoボードをUSB接続したまま、メニューバー左上アップルマーク>このMacについて」を選択、画面内で「詳しい情報...」ボタンをクリック、次の画面上左側のリストから「ハードウェア>USB」を選択、「USBバス」内に「FT232R USB UART」があるか確認する。「FT232R USB UART」を選択し、画面内「シリアル番号」欄の番号が上記「/dev/tty.usbserial-********」の「********」になります。

動作確認:
無事ソフトとUSBドライバのインストールが済んだら、動作確認として以下のサンプルプログラムを試してみて下さい。
Arduino画面メニューバーのFile>Sketchbook>Examples>Digital>Blinkを選択すると、「Blink(LEDの点滅)」のサンプルプログラムが現れます(Arduinoサイト内にも同じサンプルがあります)。

「Upload to I/O Board」ボタンかFile>Upload to I/O Boardを選択すると、Arduino基盤にプログラムのアップロードが開始されます。画面の下の方に「Done uploading.」と表示されれば、アップロード完了です。

Arduino DuemilanoveやDiecimilaの場合は、基盤上のリセットボタンを押す必要はありませんが、Arduino NG基盤(旧型)の場合は、リセットボタンを押した直後に「Upload to I/O Board」ボタンを押して下さい。

問題なければ、Arduino基盤上のLED(13番ピン用内蔵LED/13番ピンの真下あたりにある基盤上の小さいLED)が一秒ごとに点滅します。Arduino NG基盤(旧型)の場合は、LEDが内蔵されていないので、13番ピンとGNDピンにLEDを差し込む必要があります(LEDについてはブログ内の「Arduino LEDの点滅」を参照)。
Arduinoサイト上のLearning(上画像/赤印)は、学習用のサンプルプログラムが記載されているページです。Reference(上画像/赤印)は、プログラムの各言語について説明してあるページです。それぞれ参照してみて下さい。
尚、四谷工作研究所(2007年度)のブログでもセッティングや使用法について記載されているので参考にしてください。


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