ピ

カ ・

タ ワ

ー

ArduinoプログラミングマニュアルArduino プログラミングマニュアル

はじめに
このマニュアルは、エレキットの『PICA Tower(ピカ・タワー：AW-864)』の LED 部と Arduino を使用し、LED のオリジナル点灯パターンの作成やセンサーでの点灯制御を行うプログラム作成を通して、Arduino でのプログラミング方法を学習することを目的としています。
Arduino は ATMEL 社の AVR マイコンを搭載したマイコンボードで、C 言語に似た『Arduino 言語』を用いてプ
ログラミングをすることができます。その開発環境は無償で使用することができ、多くの解説書などが出版されたこともあり、誰もが比較的簡単にマイコンのプログラミングを行え、希望の動作をする電子回路が作成できるようになりました。
Arduino にはいろいろな種類があり、目的により使い分けられています。PICA Tower の LED 部は Arduino
UNO にそのまま取り付けることができるようになっていますので、本書では Arduino UNO でオリジナル点灯パ
ターンを作成する方法を解説します。
(※Arduino でプログラミングをするためには、Arduino UNO、パソコン(Windows XP 以降、Mac OSX 以降、Linux)、USB ケーブルなどが別途必要です。)
・PICA Tower (AW-864)について
PICA Tower は 27 コ、4 色の LED(発光ダイオード)を立体的に配置した電飾オブジェです。
PICA Tower は株式会社イーケイジャパンと福岡県立福岡工業高等学校の共同開発プロジェクトにより、開発・商品化しました。

お断り
本書の内容は『PICA Tower (AW-864)』を Arudino でプログラミングする際に必要な最低限の解説のみとなります。また、Arduino の機能もその一部についてのみ解説しており、全てを解説しているものではありません。
更に詳しく Arduino やそのプログラミング方法についてお知りになりたい方
は、専門書等をご参照ください。
また、プログラミングに必要な開発環境はソフトウェアのアップデート等により本書の内容と異なる場合があります。あらかじめご了承ください。
本書で解説している開発環境についてのサポートは当社ではお受けできません。あらかじめご了承ください。

1

Arduino プログラミングマニュアルもくじ
1. 開発環境の準備

4●用意するもの4●Arduino IDE のインストール

5・Arduino IDE の入手と起動

5
6●ドライバーのインストール
・Windows の場合

6・Mac OS X の場合

8●COM ポートの確認と設定

8・Windows no 場合

8・Mac OS X の場合

9●Arduino 各部の機能

10・ピン配置図10・ピンの機能10

2. PICA Tower の回路について

11●PICA Tower の回路

11●LED が点灯するためには

11・電流が流れる方向

11・LED に加える電圧12・順方向電流の調整

12●Arduino のポート

13

3. Arduino 言語の基礎

15●文法の基礎

15

・コメント

15

・文

15

・ブロック

15

●定数と変数

16

●データ型

16

●演算

17

・代入

17

・算術演算子17

・インクリメント、デクリメント

18・比較演算子18

・論理演算子19

・シフト演算子

20・変数計算後に同じ変数に代入する演算子(複合演算子) 20
21・演算の順番2

Arduino プログラミングマニュアル22●制御文・if 制御文22・switch 制御文

23・for 制御文

24・while 制御文

25
29

●関数
・関数の書き方

29・関数のプロトタイプ宣言

31

・グローバル変数とローカル変数

32●デジタル入出力33●アナログ入出力

33

●時間関数

35

●便利な機能35

4. Arduino IDE でプログラミング

37●Arduino と PICA Tower の LED 部の接続

37

●Arduino IDE の画面

37●Arduino のプログラミング

38●プログラムの検証と Arduino への書き込み

39

5. オリジナル点灯パターンをつくろう！

40●LED を点滅させる

41●LED を回転するように点灯させる

42●制御文を使用してプログラムを作る

43●関数を使用する

45

6．明るさセンサーを使おう48●アナログ入力で読み取った値

49●アナログ入力を使ってみよう

49

・シリアルポートモニター

49

・アナログ入力を使ったプログラム

51

3

Arduino プログラミングマニュアル

1．開発環境の準備●用意するもの・Arduino UNO (R3)
(R3)は Arduino のバージョンを表します。
Arduino UNO なら、どのバージョンでも使用出来ますが、このマニュアルでは(R3)を使用します。
※バージョンにより端子数や部品のレイアウトが異なります。
・USB ケーブル
パソコンと Arduino を接続します。
・パソコン
パソコンの OS は、Windows(XP 以降)、Mac(OS X
以降)、Linux が使用できます。
このマニュアルでは Windows を例に説明します。
●いろいろな Arduino
市販されている Arduino には多くの種類があります。Arduino の最も標準的な Arduino UNO に加えて、ブレッドボード上でのテストに便利な Nano、衣服に縫い付けることを考えられた LilyPad、PCとの通信部分を取り外して安価にした Pro、入出力が強化された Mega などがあります。
これら全ての Arduino は、プログラムを作る仕組みが同じで、同じ Arduino IDE といわれるプログ
ラム開発ソフト（総合開発環境といいます）で作成することができます。
プログラムの書き換えに特別な機器は必要としないので、プログラムの書き込みが手軽ですぐに使い始められます。
Arduino の例

Arduino UNO

Arduino Nano

LilyPadArduino Mega

Arduino Pro

4

Arduino プログラミングマニュアル●Arduino IDE のインストール
Arduino を制御するためには、プログラムを作成し、Arduino 基板へ書き込みを行う必要があります。このプログラムを作成するエディタとプログラム書き込み機能を持った開発環境のことを、Arduino IDE といいます。

・Arduino IDE の入手と起動
まず Arduino のホームページにアクセスします。
http://www.arduino.cc/ (英語のサイトです)

ダウンロード画面から、お使いの OS に対応したソフトを選択し、適当なフォルダーに保存します。

※画面は変わる可能性があります
画面は 2013 年 10 月現在のものです。

ダウンロード後、保存したフォルダー内に、arduino-X.X.X-XXX が作成されます。このファイルは圧縮されているので解凍(展開)ソフトなどで解凍してくだい。
※XXX は使用する OS やソフトのバージョンによって異なります。

ファイルを解凍すると、Arduino-1.0.1 のように、バージョン番号が付いたフォルダーが作成されます。
先ほど解凍したフォルダー内にある、arduino のアイコンをダブルクリックすると、arduino IDE が起動
し画面が表示されます。
IDE 起動画面↓フォルダーの中の arduino をクリック

5Arduino プログラミングマニュアル●ドライバーのインストール
次に、Arduino 基板とパソコンが通信するために必要なドライバーをインストールします。
Windows の場合
Arduino 基板とパソコンを USB ケーブルで接続します。

・WindowsXP の場合接続後に「新しいハードウェアの検出」画面が表示されますので、「いいえ、今回は接続しません。」を選択して次へ進みます。

「一覧または特定の場所からインストールする。
」を選択して次へ進みます。

「次の場所を含める。」で、参照のボタンをクリックして、先ほど解凍したフォルダーの中にある「drivers」を選択して、次へ進みます。

ドライバーのインストールが始まり、自動的に完了します。
完了後に、もう一度ドライバーのインストールを求められる場合は、1 回目と同じように進めて完了させます。

6

Arduino プログラミングマニュアル

・WindowsVista/7 の場合「デバイスドライバーソフトウェアをインストールしています。
」と表示され、しばらく待つと、パソコンが自動でドライバーを検索しインストールが完了します。もしも自動でインストールができない場合は次の手順でインストールしてください。

WindowsVista/7 に手動でドライバーをインストールする
1)『コントロールパネル』→『システムのセキュリテ
ィ』→『デバイスマネージャー』と選んで、デバイ
スマネージャーの画面を開きます。

2)デバイスマネージャー画面の中に、「不明なデバイス」という表示がされていますので、その文字の上で右クリックして、「ドライバーソフトウェアの更新…」を選びます。

3)「ドライバーソフトウェアの更新」画面から、「コン
ピューターを参照してドライバーソフトウェアを検索します。
」を選びます。

7

Arduino プログラミングマニュアル
4)「ドライバーソフトウェアの更新」画面から、「コンピューターを参照してドライバーソフトウェアを検索します。」を選びます。参照のボタンをクリックして、先ほど解凍したフォルダーの中にある「drivers」を選択して、次へ進みます。

5) しばらく待つと、ドライバーのインストール完了画面が表示されます。
※セキュリティーソフトの設定により警告画面が表示される場合があります。
そのような場合にはインストールを承認するようにしてください。

6) もう一度デバイスマネージャーを表示して、Arduino 基板が、ポート（COM と LPT）に登録されていることを確認してください。

Mac OS X の場合
Mac OS X の場合、ダウンロードが完了すると自動的にドライバーがインストールされますので、表示されるメッセージに従い必要に応じて管理者パスワードの入力や再起動を行ってください。

●COM ポートの確認と設定
次に、Arduino 基板がどのシリアルポート（COM ポート）に接続されたか確認します。
Windows の場合
WindowsXP では、マイコンピュータのアイコンを右クリックして「プロパティ」を選択し、「ハードウェア」のタブの中にある「デバイスマネージャー」をクリックします。
WindowsVista/7 では、「コントロールパネル」→「システムとセキュリティ」→「デバイスマネージャー」と進みます。
デバイスの一覧が表示されますので、「ポート（COM と LPT）」という項目の下を確認します。
8

Arduino プログラミングマニュアル
Arduino 基板が接続されたポートが表示されます。
図では Arduino 基板が「COM4」に接続されていることが分かります。この COM の番号を覚えておきます。

Arduino IDE を起動し、メニューの『ツール』→『シリアルポート』で『COM4』を選択(✓が付いた状態)しておきます。

Mac OS X の場合
1.Arduino 基板をパソコンと接続します。
2.Arduino-IDE を起動し、画面の「ツール」メニューから、「マイコンボード」を選択し、パソコンに接続した
Arduino 基板を選択します。
3.次に Arduino-IDE 画面の「ツール」メニューから、「シリアルポート」を選択し、「/dev/cu.usbmodem-」
または「/dev/tty.usbmodem-」ではじまる項目を選んでください。

9

Arduino プログラミングマニュアル●Arduino 各部の機能・ピン配置図
Arduino UNO(R3)の場合※Arduino UNO(R3)以外では
ピン数、機能が異なる場合があります。

・ピンの機能
機能
リザーブ
IOREF
RESET
3.3V
5V
GND
GND

説明
将来の拡張用に予約されているピンで使うことはできません。
Adruino UNO では Vcc に接続されています。
リセットボタンに接続されています。リセットボタンの追加に使用できます。
3.3V の電源として使用できます。
5V の電源として使用できます。
電源のマイナスにつながっています。
DC ジャックから入力された電源につながっています。
(内部でダイオードを経由しますので、電圧は少し低くなります。)

Vin
機能 1
A0
A1
A2
A3
A4
A5

機能 2

機能 1
SCL
SDA
AREF
GND
13
12
11
10
9
8
7
6
5
4
3
2
1
0

機能 2
(A4)
(A5)

説明
アナログ入力端子です。入出力に使用する端子は『ポート』とも呼ばれます。
センサーなどの入力など、アナログ信号を入力します。
デジタル入出力ピンとして使うこともできます。

SCL
SDA

I2C(Wire)通信を行う時に使用します。

説明
A4、A5 はここにもつながっています。
AD 変換器の基準電圧用の端子です。使用するためには特別な命令や配線が必要です。
電源マイナスにつながっています。

PWM
PWM
PWM

PWM
PWM

デジタル入出力端子として使用します。
機能 2 で『PWM』機能が割り当てられている端子は、『PWM 制御』ができる端子です。
PWM 制御については 34 ページ『アナログ入出力』の『analogWrite』で説明します。

PWM
TX
RX

USB 経由でパソコンと通信する時に使用します。
10

Arduino プログラミングマニュアル

2．PICA Tower の回路について
マイコンのプログラミングをするためには、LED などがどのようにつながっているかを知っておく必要があります。
ここでは、PICA Tower の回路がどのような構成になっていて、LED を正しく光らせるにはどのようにすればよいかを説明します。

●PICA Tower の回路
PICA Tower は、3 段に重なった LED 部分と、マイコンを搭載した部分が分離できるようになっています。
Arduino を使用する場合、LED 部とマイコン部を分離し、マイコン部のかわりに Arduino を取り付けます。
下図は PICA Tower の LED 部とマイコン部の回路図です。

LED 部の回路図

マイコン部の回路図

LED 部の各端子名に記載されている( )内の数字等は、Arduino に接続した場合に対応する端子です。

●LED が点灯するためには
左の図は LED 部の回路から LED の回路を 1 つだけ抜き出したものです。
の記号が LED で、この図の上側の端子を『アノード(A と表します)』、下側の端子を『カソード(K と表します)』といいます。

・電流が流れる方向
LED は電流を流すことで点灯するのですが、電流はアノードからカソードに向かって流れ、その逆には流れません。ですから、LED を点灯させるためには、電流がアノードからカソードに流れるような回路にしなければなりません。
11

Arduino プログラミングマニュアル

電流の流れ

アノード(A)

カソード(K)

逆方向には流れない・LED に加える電圧
電子回路に電流を流すためには電圧を加えなければなりません。電子回路の電流の流れは、よく水の流れに例えられます。水は水圧の高い方から低い方へ流れます。これと同じように、電流も電圧の高い方から低い方に流れますので、LED のアノードからカソードに電流が流れるようにアノードとカソードの間にアノードの方の電圧が高くなるように電圧を加える必要があります。
電圧を加える

電圧(低)

電圧(高)
アノード(A)

カソード(K)・順方向電流の調整
LED を光らせるためには電流を流さなくてはならないことは説明しましたが、LED には流すことのできる電流の上限が決められています。それ以上の電流を流すと、LED が壊れたり、寿命がとても短くなったりします。PICA Tower の回路を見ると、LED のアノード側にがつながっています。この部品

は『抵抗』で、電流が流れる量を調整する役割があります。

・実際の回路では、PICA Tower の LED とマイコン部分の回路はどうなっているのでしょう。
Aduino の 2 番ピンだけのつながりを見てみると、抵抗→LED を通って 11 番ピンへつながっています。
LED のアノードの電圧を高く、カソードを低くすると点灯しますので、この LED を点灯させるためには、Arduino の 2 番ピンの電圧を高く、
11 番ピンの電圧を低くなるようにプログラムを作ればよいわけです。

12

Arduino プログラミングマニュアル●Arduino のポート
Arduino の各ピンの電圧を高くしたり低くしたりするとはどういうことでしょう。
出力に設定したポートは、プログラムにより『電圧がある状態』や『電圧がない状態』に設定することができます。
『電圧がある状態』とは、ポートから電源のプラスと同じ電圧を出力することで『HIGH(ハイ)』、または『H』や『1』と表します。
『電圧がない状態』とは、ポートから電源のマイナスと同じ電圧を出力することで『LOW(ロー)』、または『L』や『0』と表します。
Arduino の場合、
『HIGH』に設定したポートは『5V』に、『LOW』に設定したポートは『0V』になります。
先ほどの PICA Tower の回路の場合、2 番ピンを『HIGH』に、11 番ピンを『LOW』にすると、LED のアノー
ド側の電圧が高くなり、カソード側の電圧が低くなるため、LED に順方向電流が流れ点灯するのです。

『HIGH』『LOW』

では、LED を消灯するためにはどうすればよいのでしょう。
LED のアノードとカソードの電圧を同じにするか、カソードの方をアノードより高い電圧にすればよいので、
・2 番ピン、11 番ピンの両方を『LOW』
・2 番ピン、11 番ピンの両方を『HIGH』
・2 番ピンを『LOW』、11 番ピンを『HIGH』

『LOW』

電圧が同じ
なので流れ
ない

『LOW』

のいずれかにすれば LED は消灯します。

『HIGH』

『LOW』

電圧が同じ
なので流れ
ない

『HIGH』

逆向きは
流れない『HIGH』

PICA Tower の LED は全て抵抗とつながっています。それぞれ接続先のポートが違うだけです。
縦の同じ位置にある LED のアノードはそれぞれ 2 番ピン～10 番ピンにつながっています。
また、同じ段にある LED のカソードは 1 段目が 11 番ピン、2 段目のカソードが 12 番ピン、3 段目のカソードが 13 番ピンにつながっています。
例えば、2 段目の 5 番の LED を点灯させるためには、5 番ピンを『HIGH』、12 番ピンを『LOW』にすればOK です。
また、2 番ピン～10 番ピンを全て『HIGH』、11 番ピンを『LOW』にして 12 番ピンと 13 番ピンを『HIGH』に13

Arduino プログラミングマニュアル
すれば、1 段目の LED を全て点灯させることができますし、この状態で 11 番ピンを『HIGH』、12 番ピンを『LOW』、13 番ピンを『HIGH』にすると 2 段目だけが点灯、さらに 11 番ピンと 12 番ピンを『HIGH』、13 番
ピンを『LOW』にすると 3 段目だけが光りますので、この 11 番ピン～13 番ピンのポートの状態の切り替えを順番に行うようにプログラムすると、LED が流れるように点灯させることができるのです。
HIGH

HIGH

LOW

上の図のように 1 段目だけを⾒てみましょう。
1 段目の LED のカソードは全て 11 番ピンにつながっています。
例えば、2 番ピンと 6 番ピンを『HIGH』に、11 番ピンを『LOW』にすると、1 段目の 2
番と 6 番の LED が点灯する。

各 LED のアノード側とカソード側の対応は下表のとおりです。
例えば『6 番ピン』を『HIGH』、『12 番ピン』を『LOW』にすると、左図の『2段目のオ』に対応する LED が点灯します。

カソード側

11
番
ピ
ン
12
番
ピ
ン
13
番
ピ
ン

アノード側
6番
7番
ピン
ピン

2番
ピン

3番
ピン

4番
ピン

5番
ピン

1 段目
ア

1 段目
イ

1 段目
ウ

1 段目
エ

1 段目
オ

2 段目
ア

2 段目
イ

2 段目
ウ

2 段目
エ

3 段目
ア

3 段目
イ

3 段目
ウ

3 段目
エ

14

8番
ピン

9番
ピン

10 番
ピン

1 段目
カ

1 段目
キ

1 段目
ク

1 段目
ケ

2 段目
オ

2 段目
カ

2 段目
キ

2 段目
ク

2 段目
ケ

3 段目
オ

3 段目
カ

3 段目
キ

3 段目
ク

3 段目
ケ

Arduino プログラミングマニュアル

3．Arduino 言語の基礎
ここに書いたものが全てではありませんが、Arduino のプログラムでよく使う文法や関数をまとめています。Arduino-IDE のその他の関数や詳細については書籍などで学習を行ってください。

Arduino のプログラムは、次の例のように書きます。
/*Arduino のプログラム
書き方の例です*/{a = 4;
b = c+d;e = g;}//a に 4 を代入//c と d を足した結果を b に代入//e に g を代入●文法の基本
・コメント
/*～*/
//
/*～*/で囲まれた部分、及び//から行末までは『コメント』になります。
コメントはプログラムとは直接関係がなく、その内容を補足説明などする場合に記入する文章で、日本語で書くことも可能です。
コメント部分はプログラム実行時には空白として扱われますので、その内容は無視されます。
ちなみに、改行や TAB で挿入した部分も空白として扱われ、プログラム実行時は無視されます。ただし、全角の空白をコメント行以外に書いてしまうとエラーになるので注意してください。
/*～*/ で書いたコメントは/* と */ で囲まれた部分が全てコメントと認識されます。これは複数行にまたがって記入されていても OK です。
// で書いたコメントは、// から行末までがコメントとして認識されます。

・文
a = 4; のように書かれた部分は『文』で、途中に(セミコロン)が付けられていますが、これは『その命文はここまでですよ』ということを表しています。
例えば
a = 4
b = c+d;と、上の行末に;を付け忘れた場合、プログラムは
a = 4 b = c+d;と認識され、エラーになってしまいます。
これもよくあるミスです。また(ダブルコロン)と間違えやすいので注意しましょう。

・ブロック
{

} (波カッコ)で囲まれた部分を『ブロック』といいます。ブロックは文をまとめるために使用
15

Arduino プログラミングマニュアル
し、関数などの処理内容の手順を列記する時に使用します。プログラム中に『始まりの{ 』があれば、それに対応する『終わりの }』が無くてはなりません。時々{ }の数が合わずにエラーになってしまうことがありますので注意しましょう。

●定数と変数
Arduino 言語であつかうデータは大きく『定数』と『変数』の 2 種類に分けられます。
例えば、

a = 5; a = 10; と書かれている場合、『a』は場合によって 5 や 10 になるので『変数』。

5 や 10 は変わらないので『定数』です。
定数は 10 進数のほか、2 進数や 16 進数で書かれることがあります。定数を書いた時、それが何進数かを表すために、次のような書き方をします。
基数

書き方

例

10 進数

そのまま表記56

2 進数

最初に『B』を付ける

B00111000

0x38
16 進数
最初に『0x』を付ける
あまり使用しませんが、8 進数で書くこともできます。
8 進数・・・070 最初に『0』を付ける。
しかし、10 進数を書くつもりで不用意に最初に 0 を付けてしまい、それが元でエラーになってしまった場合など、エラーの原因が見つけにくくなりますので普段は使わないほうがよいでしょう。

●データ型
変数は、その変数が表す数値の範囲によって『データ型』を選ぶ必要があります。
変数の値の範囲を超えた計算を行うと正しい計算結果が得られない場合があるなど、注意が必要です。
データ型と値の範囲は次のとおりです。
データ型

ビット数

値の範囲

boolean

1

char

8

true
または fales－128 ～ 127

byte

8

int

16

unsigned int

16

データ型

ビット数

値の範囲

long

32

unsigned long32

－2147483648 ～
2147483647
0 ～ 4294967295

0 ～ 255

float

32－3.4×1038 ～ 3.4×1038－32768 ～32767
0 ～ 65535

double64

0 ～ 1.79×10308

変数を使うときは、あらかじめそのプログラムの中で、『これは変数ですよ！』と宣言します。
変数宣言の書き方は『変数のデータ型』と『変数』、その変数の『初期値』を書く場合などいろいろあり、下記はその一例です。
char a;int b,c;int d=10;//a は char 型のデータ範囲を取り扱う変数だと宣言//『,』で区切って続けて書いても OK。b も c も int 型の変数。
//初期値を書いても OK。d は int 型で、初期値に 10 が代入される。

16

Arduino プログラミングマニュアル● 演算
定数、変数の足し算や引き算などの計算や、それぞれの比較などを行う時に『演算子』を使用します。

・代入
代入演算子は『=』の右側の項の内容を左側の項に書き込みます
演算子
使用例
意味
a = 10;a に 10 を代入するので、a は 10 になりますb = 1+2;
b に 1+2 の結果を代入するので、b は 3 になります=a = b;
a に b の値を代入します『=』の左右が入れ替わると意味が変わってしまいますので、注意しましょう。
a = 10;b = 5;
a = b;//a は 10 になります//b は 5 になります//a に b を代入するので、a は b と同じく 5 になりますa = 10;b = 5;
b = a;//a は 10 になります//b は 5 になります//b に a を代入するので、b は a と同じく 10 になります

また、次のように書くとエラーになります。これは定数はその値しか取り得ないので、定数に他の値を代入することができないためです。
10 = a;//10 は定数なので a は代入できない。エラーになる・算術演算子
加減乗除などの計算をする演算子です。
演算子の種類と機能、使い方例は下記のとおりです。
演算子 使用例
意味+a = 1+2
足し算をします。1+2 の結果を a に代入するので、a は 3 になります。
b = 3-1
引き算をします。3-1 の結果を b に代入するので、b は 2 になります。
*
c = 2*2
掛け算をします。2×2 の結果を c に代入するので、c は 4 になります。
/
d = 8/4
割り算をします。8÷4 の結果を d に代入するので、d は 2 になります。
モジュロ算という計算をします。モジュロ算は割り算をした時の『余%e = 7%2り』を求める計算です。使用例の場合 7÷2 の余りを e に代入するので、
e は 1 になります。
算術演算子は定数どうしだけでなく、定数と変数、変数どうしなどの計算もできます。
a = 1+2;b = a*2;c = b-a;//a は 3 になります。
//b は 3×2 で 6 になります。
//b は 6、a は 3 なので、c は 6-3 で 3 になります。

int 型の変数 d に次の計算をすると、d の値はどうなるでしょう？
d = 10/4
この場合、d は『2』になります。なぜなら int 型の値の範囲は『－32768 ～ 32767 の整数』だからです。
小数点以下を含んだデータを取り扱うには、データ型を float にしましょう。

17

Arduino プログラミングマニュアル

・インクリメント、デクリメント
インクリメントは『1 を足す』こと、デクリメントは『1 を引く』ことです。
演算子
使用例
意味
++
++a
a の値に 1 を足して、その値を a に書き込みます。
---bb の値から 1 を引いて、その値を b に書き込みます。
例えば、
a = 10;b = 5;
c = ++a;d = --b;//a は 10 になります。
//b は 5 になります。
//a は 1 を足した 11 になり、それを c に代入するので C も 11 になります。
// b は 1 を引いた 4 になり、それを d に代入するので d も 4 になります。

インクリメント、デクリメントは『a++』『b--』のように変数の後ろに書くこともできます。しかし、この場合、前に書いた時と計算をするタイミングが変わります。
a = 10;b = 5;
c = a++;
d = b--;//a は 10 になります。
//b は 5 になります。
//先に c に a を代入してから a をインクリメントする。
//c は 10 になり、a は 11 になる。
//先に d に b を代入してから b をデクリメントする。
//d は 5 になり、b は 4 になる。

・比較演算子
2 つの定数や変数の関係を調べるための演算子です。
調べた結果、その関係が正しければ真、間違っていれば偽といいます。
真は『1』、偽は『0』で表すこともあります。
演算子 使用例
意味>a > b
a が b より大きければ真、小さければ偽になります。
>=
a >= ba が b と同じか大きければ真、小さければ偽になります。
<
a < bb が a より大きければ真、小さければ偽になります。
<=
a <= bb が a と同じか大きければ真、小さければ偽になります。
==
a == ba と b が等しければ真、異なれば偽になります。
!=
a != ba と b が異なれば真、等しければ偽になります。
『||』の左右の関係式で、どちらか片方でも真ならば真。どちら||(a>b) || (c<d) も偽ならば偽になります。例では a>b と c<d のどちらか一方が真であれば真になります。
『&&』の左右の関係式で、どちらも真ならば真。片方でも偽、ま&&(a>b) && (c<d) たは両方とも偽ならば偽になります。例では a>b と c<d の両方が真の時だけ真になります。
『!』の後に書かれた関係式が真ならば偽、偽ならば真になりま!
!(a>b)
す。つまり、関係式の真偽の逆になります。例では a>b が真ならば偽に、偽ならば真になります。
では、次の式の場合はどうなるでしょうか。
a = 10;//a は 10b = 5;//b は 5c = 3;//c は 3d = 7;//d は 7e = (a>b);f = (b==c);g = ((a>b) && (c<d))//a は 10、b は 5 なので a>b は真。真は『1』なので、e は 1 になる。
//b と c は等しくないので b==c は偽。偽は『0』なので、f は 0 になる。
//a は 10、b は 5 なので a>b は真。c は 3、d は 7 なので c<d も真。
//2 つの関係式が両方ともに真なので(a>b) && (c<d)は真。g は『1』になる。

上の例のように、式の中に( )がある場合は、( )の中を先に計算します。
この比較演算子は、あとで説明する『制御文』の『繰り返し』や『条件分岐』でよく使用されます。
18

Arduino プログラミングマニュアル

・論理演算子
2 つの定数や変数を論理演算する時に使う演算子です。
演算子 使用例
意味&a & b
a と b を AND で論理演算した値になる。AND は『論理積』とも言う。
|
a | b
a と b を OR で論理演算した値になる。OR は『論理和』とも言う。
^
a ^ b
a と b を XOR で論理演算した値になる。XOR は『排他的論理和』とも言う。
~~aa の各ビットを反転(NOT)した値になる。
ビットごとの操作はその値を 2 進数に変換して考えるとわかりやすいです。
例えば a と b に入る値を 16 進数で書いてみました。
a = 0x56;//a を 2 進数で表すと 0b01010110
b = 0x4A;//b を 2 進数で表すと 0b01001010
c = (a&b);
d = (a|b);e = (a^b);
f = ~a//c は 0x42 になる//d は 0x5E になる//e は 0x1C になる。
//f は 0xA9 になる。

これを 2 進数で考えてみましょう。
それぞれの変数の値は 2 進数で表すと
a = 0x56 = 0b01010110
b = 0x4A = 0b01001010となります。

まず 2 つの値を上下に並べて書いてみます。
bit7
0
0

bit6
1
1

bit5
0
0

bit4
1
0

bit3
0
1

bit2
1
0

bit1
1
1

bit0
0
0

a & b
(AND)

0

1

0

0

0

0

1

0

a | b
(OR)

0

1

0

1

1

1

1

0

a ^ b
(XOR)

0

0

0

1

1

1

0

0

~ a
(NOT)

1

0

1

0

1

0

0

1

a
b

操作内容

各ビットを比較し、両方とも『1』のときだけ『1』。その他の場合は『0』になる。
各ビットを比較し、少なくとも片方が『1』であれば『1』。両方とも『0』なら『0』になる。
各ビットを比較し、それぞれのビットの値が異なるときは『1』。
同じ値の場合は『0』になる。
各ビットの値が『1』なら『0』、『0』なら『1』になる。

2 進数で考えるととてもわかりやすくなりましたね。
AND、OR、XOR はどのようなときに使うのでしょう？
・AND
任意のビットを取り出すときに使います。
例)a=01101100
AND 11110000
01100000・OR
任意のビットを『1』にする
ときに使います。
例)a=01101101
OR
00111100
01111101・XOR
任意のビットを反転にする
ときに使います。
例)a=01101101
XOR 00001111
01100010

取り出したいビットを『1』そうでないビットを『0』にすると『1』の部分だけそのまま取り出せる。

『1』にしたいビットを『1』そうでないビットを『0』にすると『1』の部
分は『1』になる。
『0』の部分はそのまま。

反転したいビットを『1』そうでないビット
を『0』にすると『1』の部分は反転する。『0』の部分はそのまま。

19

Arduino プログラミングマニュアル

・シフト演算子
定数や変数の値を指定されたビット数分、左または右にずらす処理をする演算子です。
演算子
<<
>>

使用例
a << ba >> b意味a を左に b ビットシフトした値になる。
a を右に b ビットシフトした値になる。

次のような場合では
a = 0x56;
b = 2;c = (a<<b);d = (a>>b);// 2 進数で表すと 0b01010110//ずらすビット数は 2//c は 0x58 になる//d は 0x15 になる

この場合も 2 進数で考えましょう。
まず、左シフトの場合は、
a

左シフト

bit7
0

bit6
1

bit5
0

bit4
1

bit3
0

bit2
1

bit1
1

bit0
0

0

1

0

1

1

0

0

0

操作内容

今回の例では 2 ビット左にずらす。
新たに右側に追加される値は『0』。

新たに追加
次に右シフトの場合は、
bit7
0

a

bit6
1

0

右シフト

0

bit5
0

0

bit4
1

1

bit3
0

0

bit2
1

1

bit1
1

bit0
0

0

1

操作内容

今回の例では 2 ビット右にずらす。
新たに左側に追加される値はその値のデータ型と最上位ビットの値により変わります。

新たに追加※データ型がマイナスを扱える範囲の場合で、最上位ビットが『1』の時、新たに追加される値は『1』。

・変数計算後に同じ変数に代入する演算子(複合演算子)
例えば a という変数に 10 を足し、その結果を変数 a に代入する式は、
a = (a+10);となります。

このような場合に便利な書き方があります。
上記の場合
a +=10;

演算子
+=
-=
*=
/=
%=
&=
|=
^=

使用例
a+=b
a-=b
a*=b
a/=b
a%=b
a&=b
a|=b
a^=b

と書くこともできます。

同じ処理の式a=(a+b)a=(a-b)a=(a*b)a=(a/b)a=(a%b)a=(a&b)a=(a|b)a=(a^b)説明a に b を足して、その結果を a に代入する。
a から b を引いて、その結果を a に代入する。
a と b をかけて、その結果を a に代入する。
a を b で割って、その結果を a に代入する。
a を b で割った余りを a に代入する。
a と b を AND し、その結果を a に代入する。
a と b を OR し、その結果を a に代入する。
a と b を XOR し、その結果を a に代入する。
20

<<=

a<<=b

a=(a<<b)

>>=

a>>=b

a=(a>>b)

Arduino プログラミングマニュアルa を b ビット分左にシフトして、その結果を a に代入する。
a を b ビット分右にシフトして、その結果を a に代入する。

・演算の順番
算数の計算をする時、同じ式の中にいくつも加減乗除の計算がある場合、足し算や引き算よりも掛け算や割り算を先に、また( )があればその中を先に計算するという決まりがありますね。
それと同じように、定数や変数の演算にも優先順位が決まっています。
優先順位
高い

低い

演算子
( )
!
*
+
<<
<
==
&
^
|
&&
||
=
,

~
++
/
%
>>
<=
>
!=

--

+=

*=

-=

>=

/=

%=

21

&=

^=

|=

<<=

>>=

Arduino プログラミングマニュアル●制御文
定数や変数の比較をし、その真偽によってプログラムで実行する処理の流れを変えたり、同じ処理を繰り返し行うなどの制御ができます。

・if 制御文if を使った制御文は、比較した結果により処理の流れを変える時に使用します。
次の 3 通りの使い方があります。if 文は、その処理の中に if 文を記入する『多段 if 文』を作ることもで
きます。
使い方

説明

使用例

if(条件){真の場合の処理}(条件)が真ならば、{真の場合の処理}を行う。

if(a>=5){b=10;
C=b+2;}(条件)が真ならば、{真の場合の処理}を行い、そうでなかったら{偽の場合の処理}を行う。

if(a>=5){b=10;
C=b+2;}
else{
b=5;
c=b-2;}(条件 1)が真ならば{処理 1}を行う。
(条件 1)がそうではなかったら(条件 2)を調べ、真なら{処理2}そうでなかったら{処理 3}を行う。

if(a>=5){b=10;
C=b+2;}
else if(a<5){b=5;c=b-2;
}
else{
b=1
}

if(条件){真の場合の処理}
else{偽の場合の処理}

if(条件 1)
{処理 1}
else if(条件 2){処理 2}
else{処理 3}

フローチャート

1

2

間違えやすいポイント
制御文を書く時に間違えやすいポイントがあります。
・条件を書くときに使う演算子に注意！
a==0 と書かなくてはならないところを a=0 と書いてしまうと a に 0 を代入するという文になってしまい、期待した通りの処理をされなくなります。条件判断ではその値が 0 の時だけ『偽』、それ以外は全て『真』と判断します。
・『;』を付けるとそこで終わり！
制御文の文字(if や else など)の後には『;』は必要ありません。{ }で囲った処理内の文の後には必ず必要ですが、
if(a==1); {b=0;} と書くと、if 文の処理が {b=0;} の前で終わってしまい、{b=0;} は if の文として実行されません。if(a==1) {b=0;}; else{b=1;} と書くと、if(a==1) {b=0};で if 文の処理が終わってしまうことになり、その後の else に対応する if がなくなってしまうことになり、エラーになってしまいます。
『;』は『そこでその文の処理が終わるマーク』とおぼえておくとよいでしょう。

22

Arduino プログラミングマニュアル

・switch 制御文
条件の内容により分岐先をいくつも変えるような場合に使用するのが switch 文です。
使い方
説明
使用例
switch(条件){case 値 1:
値 1 の場合の処理;
break;
case 値 2:
値 2 の場合の処理;
break;
case 値 3:
値 3 の場合の処理;
break;
・・
default:
条件結果がどれにも当てはまらない場合の処理;

int a;
int b;(条件)の内容が値 1 に等しい場合は、
値 1 の場合の処理を行う。
(条件)の内容が値 2 に等しい場合は、
値 2 の場合の処理を行う。
(条件)の内容が値 3 に等しい場合は、
値 3 の場合の処理を行う。
・・・(条件)の内容が値のどれにも当てはまらない場合には『default』に書いた処
理を行う。

}

switch(a){case 1:b=10;
break;//a が 1 の時

case 3:b=20;
break;//a が 3 の時

case 4:b=40;
break;//a が 4 の時

default:b=0;}//a がそれ以外の時

フローチャート

間違えやすいポイント
・ case 値: 文の後ろは『;(セミコロン)』ではなく『:(ダブルコロン)』です。
・ case 値: のあとの処理文の後には break; が必要！
break; が無いと、条件判断に戻らず、次の行の処理を行うことになりますので、上の例でcase 1: に対応する break; が無かったとすると、case 1 の処理後、続けて case 2 の処理をしてしまいます。
・ case 値: の『値』には変数は使用できません！ 定数、または定数の計算式のみ使用できます。

switch(条件){case 値 1:
case 値 3:
値 1・3 の場合の処理;
break;

条件判断の結果の値が異なる場合でも同じ処理をさせたいときには、左記のように一つの処理に複数の『case 値:』を書くこともできます。

case 値 2:
値 2 の場合の処理;
break;}
23

Arduino プログラミングマニュアル

・for 制御文
for を使うと、同じ処理を回数を数えながら繰り返すことができます。
使い方

説明

使用例

for(変数の初期値;条件;
増減処理){
繰り返す処理;}変数の初期値を設定し、その変数が条件の真偽を判断する。
条件が真の場合は『繰
り返す処理』を実行した後、変数の増減を行い再度条件判断を行う。
変数が条件判断が真である限り『繰り返す処理』を行い、条件判断が偽になると繰り返しから抜ける。

フローチャート

int a;
int b=10;
for(a=0;a<=5;++a)
{
--b;
}

for 文は数を数えながら繰り返すだけではなく、条件が成立するならば繰り返すという使い方もできま
す。
使い方

説明

使用例

for(変数の初期値;条件;
変数を変化させる処理){
繰り返す処理;}

前述の例の『変数の増減』が『変数の変化処理』に変わった書き方。
処理は同じで『条件』が真である限り『繰
り返す処理』を実行する。
for の後の( )内の『変数の初期化』と『変数を変化させる処理』は『,』で区切ることでいくつも書くことができる。

int a,b,;
int c=0x01;
for(a=0,b=10;a<=b;++a,b-=2){
C<<=1;}

繰り返す処理の途中に if 文と break; を入れると、その if 条件を満たした場合、繰り返すループから抜けることができます。
使い方

for(変数の初期値;条件;
増減処理){
繰り返す処理①;
if(中断条件) break;
繰り返す処理②;}

説明

for 文の条件が真の場
合は『繰り返す処理①』を実行した後、『中断条件』判断を行い、真なら繰り返し処理を即座に中断します。
『中断条件』判断が偽なら、繰り返す処理②を実行し、増減処理を行った後、for 文の条
件判断を行います。

使用例

int a;
int b=c=10;
for(a=0;a<=10;a++){--b;if(a==5) break;
C-=2;
}

24

フローチャートArduino プログラミングマニュアル
繰り返す処理の途中に if 文と continue; を入れると、その if 条件を満たした場合、continue 以降の処理を中断し、変数増減処理に飛ぶことができます。
使い方

for(変数の初期値;条件;
増減処理){
繰り返す処理①;
if(中断条件)
continue;
繰り返す処理②;}

説明

for 文の条件が真の場
合は『繰り返す処理①』を実行した後、『中断条件』判断を行い、真ならそれ以降の『繰り返す②』は実行
せずに変数の増減処理に移行し、 for 文の条件判断を続行します。
『中断条件』判断が偽なら、繰り返す処理②を実行し、増減処理を行った後、for 文の条
件判断を行います。

使用例

フローチャート

int a;
int b=c=10;
for(a=0;a<=10;++a){--b;if(a==5) continue;
C-=2;}・while 制御文
while 制御文は、条件が真である限りならば処理を繰り返し実行します。
前述の for 文で条件が成立する限り繰り返す書き方がありましたが動作はそれと同じです。
for 文ではその後の( )内に、条件の他に変数の初期設定と変化処理を書きましたが、while 文では
while 文の前に変数の初期設定を、{ }でくくられた繰り返す処理の中に変数の変化処理を書きます。
使い方

説明

使用例

まず変数の初期設定。
int a=0;
int b=10;

変数の初期設定;
while(条件){
繰り返す処理(変数変化処
理を含む);}

条件が真の場合は『繰
り返す処理』を実行。
偽なら繰り返し処理から抜ける。

while(a<=10)
{
b-=2;
++a;
}

条件判断に使う変数の値の変化は『繰り返す処理』の中に含める。

25

フローチャートArduino プログラミングマニュアル
while 文では条件判断をした後に繰り返す処理を実行しますが、do-while 文を使用すると、最初に処理を実行した後、条件判断を行う事ができます。
使い方

説明

使用例

int a=0;
int b=10;

まず変数の初期設定。
変数の初期設定;
do{
繰り返す処理(変数変化処
理を含む);}
while(条件);

フローチャート

最初に『繰り返す処理』を実行。

do
{
b-=2;
++a;
}
while(a<=10);

その後に条件判断を行い、真なら『繰り返す処理』にもどり、偽ならこの繰り返しから抜ける。

while 文でも for 文の時と同じように break;や continue;を使用することができます。
使い方

変数の初期設定;
while(条件){
繰り返す処理①;
if(中断条件) break;
繰り返す処理②;
変数変化処理;}変数の初期設定;
while(条件){
繰り返す処理①;
変数変化処理;if(中断条件)
continue;
繰り返す処理②;}

説明
while 文の条件が真の場合は『繰り返す処理①』を実行した後、『中断条件』判断を行い、真なら繰り返し処理を即座に中断します。
『中断条件』判断が偽なら、繰り返す処理②を実行し、変数変化処理を行った後、while
文の条件判断を行います。

while 文の条件が真の場合は『繰り返す処理①』を実行した後、『中断条件』判断を行い、真ならそれ以降の『繰り返す②』は実行
せずに変数の変数変化
処理に移行し、 while
文の条件判断を続行します。
『中断条件』判断が偽なら、繰り返す処理②を実行し、変数変化処理を行った後、while
文の条件判断を行います。

使用例

int a=10;
int b=c=0;
while(a>=10){++b;if(a==0) break;
C+=2;
a--;
}

int a=10;
int b=c=0;
while(a>=10)
{
++b;
a--;
if(a==0) continue;
C+=2;
}

26

フローチャートArduino プログラミングマニュアル
do-while 文でも break;や continue;を使用することができます。
使い方

説明

使用例

フローチャート

まず変数の初期設定。

変数の初期設定;
do{
繰り返す処理①;
if(中断条件) break;
繰り返す処理②;
変数変化処理;}while(条件);

最初に『繰り返す処理①』を実行した後、『中断条件』判断を行い、真なら繰り返し処理を即座に中断します。
『中断条件』判断が偽なら、繰り返す処理②を実行し、変数変化処理を行った後、while
文の条件判断を行います。
while 文の条件が真な
ら『繰り返す処理①』にもどり、偽ならこのループから抜けます。

int a=10;
int b=c=0;
do
{
++b;
if(a==0) break;
C+=2;
a--;
}
while(a>=10);

まず変数の初期設定。

変数の初期設定;
do{
繰り返す処理①;
変数変化処理;if(中断条件)
continue;
繰り返す処理②;}
while(条件);

最初に『繰り返す処理①』を実行した後、『中断条件』判断を行い、真なら『繰り返し処理②』を行わずに
while 文の条件判断を行います。
『中断条件』判断が偽なら、『繰り返す処理②』を実行し、変数変化処理を行った後、
while 文の条件判断を行います。
while 文の条件が真な
ら『繰り返す処理①』にもどり、偽ならこのループから抜けます。

int a=10;
int b=c=0;
do
{
++b;
a--;
if(a==0) continue;
C+=2;}
while(a>=10);

間違えやすいポイント
・ do-while 文で、do の後に( )はありません。
・ do-while 文で、while(条件)の後には『;』が必要です。
・ continue を使った文では、変数変化処理を記述する場所によって『無限ループ』に陥ってしまいます。
例えば、continue;の後に変数変化処理を書くと、中断条件により変数変化処理を行わずに while(条件)の判断になるために条件変数が変化せず、いつまでも『繰り返し処理』を繰り返す事になります。

27

Arduino プログラミングマニュアル
while 文を使用し、その処理をいつまでも繰り返す『無限ループ』を作ることもできます。
使い方

説明

使用例

フローチャート

int a=0;
while(1){繰り返す処理;}条件が『1』なので常に真となるため、『繰
り返す処理』をいつまでも繰り返す。

while(1){++a;}無限ループの繰り返し処理の中に break;文を書くことで、無限ループから抜ける事もできます。
使い方

while(1){繰り返す処理;if(中断条件) break;
}

説明

使用例

条件が『1』なので常に真となるため、『繰
り返す処理』実行。
『中断条件』判断が偽なら、『繰り返す処理』を繰り返し、真なら無限ループから抜けます。

フローチャート

int a=0;
while(1){++a;if(a==10) break;}for 文を使用して無限ループを作ることもできます。もちろん break;も使用することができます。
使い方

説明

使用例
int a=0;

for(;;){
繰り返す処理;}for 文の変数初期値や条件文、変数の増減処理がありませんが、【条件が『0』以外なので常に真】となるため、『繰り返す処理』をいつまでも繰り返す。

for(;;){
繰り返す処理;if(中断条件) break;}

条件が『0』以外なので常に真となるため、『繰
り返す処理』実行。
『中断条件』判断が偽なら、『繰り返す処理』を繰り返し、真なら無限ループから抜けます。

for(;;){++a;}
int a=0;28

for(;;){++a;if(a==5) break;}Arduino プログラミングマニュアル●関数
関数とは、ある処理に対しその手順を記したものです。

・関数の書き方関数は戻り値の型 関数名(引数の型 仮引数名){
処理記述;
return 戻り値;}

このように書きます。
戻り値や引数、仮引数など難しそうな名前が並んでいます。

もっとわかりやすく、関数を図にしてみました。
ab
左のように、上から数字を入れると下から計算結果が出てくる箱があります。
この箱は『func』という名前がついています。
この箱は中で『a+b という計算をしなさい！』という指令書が入っていまし

func

た。
なので a+b の計算がされ、その答えが『c』とします。a と b は整数だとすると、答えの c も整数です。整数をあつかうデータの型には char や int などがありましたね。ここでは int としましょう。

c

これを先ほどの関数の書き方に当てはめると
int func(int a, int b){
int c;
c=a+b;
return c;}となります。戻り値はその関数の計算結果、仮引数とはその関数で使われる値の入れ物と考えるとわかりやすいでしょう。また、関数で計算をするときには仮引数に値を入れなくてはいけませんが、仮引数に入れる値のことを『実引数』といいます。
= ＋y

数学で 『

= 5, y = 2』 のように書きますね。この時の『』が関数。数式中の『 , y』

が仮引数。その値を決める『 = 5, y = 2』が実引数とイメージするとわかりやすいかもしれません。

関数の終わりに return を書くことで、計算結果を関数に『答えはこれですよ！』と伝えることができます。

関数によっては『答え』を伝えない場合があります。
a

b

func1
c

d

int c,d;

例えば、左の関数『func1』の中には『a を cvoid func1(int a, int b)
{
c=a;
d=b;
}

に、b を d に入れなさい！』という指令書が29入っていたとすると、上から a、b を入れて処理をした後、その値を関数に伝えなくて良い
場合には return を書く必要はありません。

Arduino プログラミングマニュアル
関数に戻ってくる値がない場合、『戻り値の型』には『void』と書きます。

また、仮引数がない関数もあります。

func2

int func2(void){
int c;
C=1+6;
return C;}

例えば、左の関数『func2』の中には『1+6 をして c に入れなさい！』という指令書が入っていたとすると、上から何も入れなくても値『7』が入った『c』が出てくることになります。この c を関数cに伝える場合には return を書いて関数に返します。

仮引数の値がないので( )の中には『void』と書きます。仮引数がない場合の( )内の void は省略する
ことができます。

戻り値も仮引数も無い関数もあります。

func3

void func3(void){
Serial.end()}

例えば、左の関数『func3』の中にはパソコンとの通信を制御する『Serial.end()』という指令書が入っています。この命令はパソコンとの通信をストップする手順が書かれているだけ
で、戻り値も仮引数もありません。

戻り値も仮引数の値もないので、戻り値の型にも( )の中にも『void』と書きます。仮引数がない場合の( )内の void は省略することができます。

・Arduino 言語でのメインプログラムの書き方
Arduino 言語では電源を入れた時やリセットされた時に 1 度だけ実行される void setup()と、実際に実行する void loop()の 2 つの関数を必ず書く決まりになっています。
void setup()は各ピンモードや変数の初期設定などを記入します。
void loop()は実際に実行されるプログラムの命令を記入し、Arduino の電源が ON になっている間はこの部分を繰り返し実行します。
void setup(){//各ピンの初期設定など}
void loop(){//実行するプログラム内容}30

Arduino プログラミングマニュアル

・関数のプロトタイプ宣言
loop 関数に他の関数を書き加えてプログラムを書きますが、その他のプログラムをそのまま中に書くと、とても長くなったり、とてもわかりにくいプログラムになってしまいます。
void loop(){
int func0 (int a,int b){
return(a+b);}左の例では loop 関数の中に『func0』『func1』という関数が入っています。この例ではそれぞれの関数はそれほど長くないのですが、実際はもっと長くなることもあります。
また、 『func0』は 2 回書かれていますので、まとめてスッキリさせた

void func1 (char c,char d)
{
d<<1;
e>>1;
}

いですね。

int func0 (int a,int b){
return(a+b);}}

void loop(){
func0 (3,6);
func1 (0x11,0x80);
func0 (2,4);}loop 関数はこの部分だけloop 関数の外に書かれた関数を呼び出して使う

int func0 (int a,int b){
return(a+b);}
void func1 (char c,char d)
{
d<<1;
e>>1;
}

呼び出す関数はここに書かれている。

上のように書くと少しスッキリします。複数回使用する関数も 1 つだけ書けば良いので見やすくなります。

しかし！
この書き方はちょっと問題があります。それは、func0、func1 の関数の記述が loop 関数より下にあるので、loop 関数を実行した時、それぞれの関数がまだ読み込まれておらず、その時点では func0、func1 が何なのかわからないためエラーになってしまうのです。
loop 関数の上に func0、func1 の記述をすればよいのでしょうが、関数がとても多くなった場合にはとても大変なことになります。
そこで、loop 関数の前に『このプログラムでは次の関数を使いますよ！』と宣言をする記述をします。
31

Arduino プログラミングマニュアル
それを『関数のプロトタイプ宣言』といいます。
int func0 (int a,int b);
void func1 (char c,chard);void loop(void){
func0 (3,6);
func1 (0x11,0x80);
func0 (2,4);}関数のプロトタイプ宣言
このプログラムで使う関数を、loop 関数の前に宣言します。

関数のプロトタイプ宣言は戻り値の型 関数名(引数の型 仮引数名);の形で書くことになっています。

int func0 (int a,int b){
return(a+b);}
void func1 (char c,char d)
{
d<<1;
e>>1;
}

・グローバル変数とローカル変数関数などで一時的に値を入れておく場所を変数と呼ぶことは最初にお話しました。
では、次のようなプログラムの場合、変数はどれになるでしょう？
void loop(void){
int a,b,c;
a=b+c;

int a,b,c;

どちらの書き方も『a、b、c は int 型

void loop(void){の値を取る変数だ』と宣言していますので、a、b、c は変数ですね。

a=b+c;}}

しかし、この 2 つは同じ変数の宣言をしているのですが、意味が異なります。
上の左側の場合のように、関数の中で変数を宣言をすると、その変数はその関数の中のみで使える変数になります。a、b、c はその関数のみで使える変数になり、このような変数を『ローカル変数』といいます。
上の右側の場合は、関数の外で変数の宣言をしています。この場合の a、b、c はメイン関数以外でも使用することができる変数になり、このような変数を『グローバル変数』といいます。

32

Arduino プログラミングマニュアル●デジタル入出力
Arduino のポートをデジタル入力、またはデジタル出力として使用する場合に使用する関数です。
・ピンの動作を入力または出力または、プルアップ機能を利用した入力に設定します。
書き方
パラメーター
pin：設定したいピンの番号
mode：INPUT
pinMode(pin, mode)
OUTPUTINPUT_PULLUP
pinMode(9, OUTPUT);//9 番ピンが出力になります。
使用例
pinMode(13,INPUT);//13 番ピンが入力になります。
pinMode(A0, INPUT_PULLUP);//A0 番ピンがプルアップされた入力になります。

・指定したピンを、HIGH または LOW にします。HIGH は 5V、LOW は 0V(GND)になります。
書き方
パラメーター
pin：設定したいピンの番号
digitalWrite(pin, value)
value：HIGH か LOW（または、1 か 0）
digitalWrite(9, HIGH);//9 番ピンが HIGH になります。
使用例
digitalWrite(2, 0);//2 番ピンが LOW になります。

・指定したピンの状態を調べます。結果は HIGH か LOW になります。
書き方
パラメーターdigitalRead(pin)pin：調べたいピンの番号
x = digitalRead(9); //x に 9 番ピンの状態が HIGH か LOW で記憶されます。
使用例//例えば 9 番ピンが GND に接続されている場合は LOW になります。

●アナログ入出力
Arduino のポートをアナログ入力、または PWM 出力として使用する場合に使用する関数です。
・指定したアナログピンの状態を調べます。結果は 0 から 5V の電圧範囲を 0 から 1023 の範囲に変換した値になります。Arduino UNO では A0～A5 がアナログピンとして利用できます。
書き方
パラメーターanalogRead(pin)pin：調べたいアナログピンの番号
使用例
x = analogRead(A0);//x に A0 番ピンの状態が 0 から 1023 の整数値で記憶されます。

・指定したピンから PWM 波を出力（アナログ出力）します。
analogWrite の前に pinMode で出力にする必要はありません。
Arduino UNO では３，５，６，９，１０，１１番ピンがアナログ出力ピンとして利用できます。
analogWrite を実行すると、次に同じピンで analogWrite を実行するまで PWM 波が出力されます。
書き方
パラメーター
pin：出力に設定するピン番号
analogWrite(pin, value)
value：PWM 出力のデューティ比（0 から 255 の範囲で設定します。）
analogWrite(3, 64);//3 番ピンからデューティ比 64 の波形を出力します。
使用例
analogWrite(3, 0);//3 番ピンからはデューティ比 0(=0V)が出力されます。
analogWrite(3, 255); //3 番ピンからはデューティ比 255(=5V)が出力されます。

33

Arduino プログラミングマニュアル

PWM 制御について
analogWrite で出力する『PWM』とはどのようなものでしょう。
PWM は『pulse width modulation』で、日本語では『パルス幅変調』といいます。
digitalWrite で出力を設定した場合、その出力信号は 5V または 0V の電圧が連続して出力されるのに対し、analogWrite で出力を設定すると、0V と 5V が交互に繰り返す信号が出力されます。
つまり、ON と OFF を繰り返すような信号が出力されるわけです。このような信号は、LED の明
るさを変化させたり、モーターのスピードを変えるときなどに使用されます。
PWM 制御の重要なパラメーターに『デューティ比』があります。デューティ比は PWM 信号の 1 周期の 5Vの時間と 0V の時間の比です。
1 周期とは、出力信号が 5V になった後に 0V になり、もう一度 5V になるまでの時間です。
1 周期のうち、5V になっている時間と 0V になっている時
間が全く同じなら、デューティ比は 50％です。
1 周期のうち、5V の時間が占める割合をデューティ比といいます。

Arduino は 1 周期を 255 個に分割し、その分割した時間のいくつ分を 5V を出力する時間にするかで設定します。
analogWrite で value を 127 に設定するとデューティ比が 50％になります。value を 0 にするとデューティ比は0％で 5V の時間がなくなり、ずっと 0V が出力されたままに、value を 255 にするとデューティ比は 100％で 1 周期の全てを 5V の時間が占め、ずっと 5V が出力されたままになります。

例えば、左図のように 3 番ピンに LED 回路が接続され PWM 信号を出力する場合、デューティ比が高いほど LED は明るく点灯することになります。

34Arduino プログラミングマニュアル●時間関数
プログラミングでは時間の設定や、どのくらい時間が経ったかなどを計ることがよくあります。
・カッコ内で指定された時間待って、次の文の処理へ進みます。
書き方
パラメーターdelay(ms)ms：カッコ内の数値(ミリ秒)を待ちます。
delayMicroseconds(us)us：カッコ内の数値(マイクロ秒)を待ちます。
digitalWrite(9,HIGH);//9 番ピンを『HIGH』にします。
使用例
delay(500);//500 ミリ秒待ちます。
digitalWrite(9,LOW);//9 番ピンを『LOW』にします。
※1 ミリ秒＝0.001 秒
1 マイクロ秒＝0.001 ミリ秒＝0.000001 秒
・Arduino がプログラムの実行を開始してから現在までの時間を計ることができます。
書き方
パラメーターmillis()ありません
micros()x = millis() //プログラム実行から現在までの時間を『ミリ秒』で計り、x に代入。
使用例
x = micros() //プログラム実行から現在までの時間を『マイクロ秒』で計り、x に代入。
millis()は約 50 日でオーバーフローし、最初からのカウントになります。
micros()は約 70 分でオーバーフローし、最初からのカウントになります。
注
また、Arduino UNO では 4 マイクロ秒単位での測定となり、測定結果は必ず 4 の倍数になります。

●便利な機能Arduino 言語でプログラムを作成するときに使うと、プログラムがわかりやすくなるようにできる便利な機能があります。
・検証時（コンパイル時）に自動的に定数名を値に変換します。プログラムを見やすく、間違いを少なくするために有効です。#を付けることを忘れないようにします。
書き方
パラメーター#define 定数名 値

使用例
注

定義名：わかりやすい名前を付けましょう。
値：定義名に割り付ける値を記入します。

#define ledPin 4
digitalWirte(ledPin, HIGH);//ledPin は検証時に自動的に 4 に置き換えられます。
#define 文の最後に；（セミコロン）は必要ありません。

・外部に用意されているライブラリをプログラムに取り入れたいときに使います。
ライブラリは Arduino-IDE にあらかじめ用意されているものや、インターネットから入手できるものなどがあります。
書き方
パラメーター#include <ライブラリ名>

ライブラリ名：外部ファイルの名前を書きます。

使用例#include <LiquidCrystal.h>//LCD 表示器のライブラリを使うことができるようになります。

注#include 文の最後に；（セミコロン）は必要ありません。
35

Arduino プログラミングマニュアル

ライブラリとはプログラムを書くときの、決まった手続きや、似たような手続きをまとめて専用の命令としていつでも使えるようにしたものを「ライブラリ」と呼んでいます。
1 回だけ動かすのであれば長いプログラムになっても特に気になりませんが、液晶ディスプレイに文字を表示させる命令などでは、何度も何度も同じような命令を書かなくてはなりません。ここでその「決まった手続き」を一つの命令にまとめたものがあれば、プログラムの作成が便利になり、間違
いも少なくなります。
Arduino には多くのライブラリがあり、あらかじめ Arduino IDE にインストールされている『公式ライブラリ』と Arduino のユーザーが作成し公開しているライブラリがあります。
新しく使いたい部品やモジュールを動かすためのライブラリが用意されていないか、インターネッ
トなどでチェックしてみると良いでしょう。

36

Arduino プログラミングマニュアル

4．Arduino IDE でプログラミング
Arduino IDE やドライバーのインストールが完了し、LED が点灯・消灯する条件、Arduino 言語の基礎が整いましたので、実際にプログラムの作成を行いましょう。

● Arduino と PICA Tower の LED 部 の 接 続
まず、PICA Tower の LED 部と電池ボックスが取り付けられている
MCU 部を分離します。LED 部と MCU 部はコネクターで接続されていますので、引っ張って外すことができます。

Arduino のコネクターに PICA Tower の LED 部を接続します。PICA
Tower LED 部のコネクターで『A5』と印刷してある端子が、Arduinoの『A5』端子に来るように接続します。
向きをまちがえないように注意してください。
こちらが『A5』端子LED 部の接続ができたら、Arduino とパソコンを USB ケーブルで接続します。Arduino、および LED 部の電源は USB ケーブルを通し、パソコンから供給されます。

● Arduino IDE の 画 面
Aruino IDE を起動すると、下記画面が表示されます。
新規ファイル開く

保存検証
シリアルモニタマイコンボード
に書き込む

プログラム
作成エリア
メッセージエリアコンソール

ボード・COM 番号37

Arduino プログラミングマニュアル
新しいプログラム作成エリアを開きます。
保存しているプログラムを開きます。
作成したプログラムを保存します。
正しい文法でプログラムが作成されているかチェックします。
シリアルデータを表示します。
シリアルモニタ(データに何を表示させるかあらかじめプログラムに書く必要があります。)
プログラムを PC に接続している Arduino 基板に書き込みます。
マイコンボードに書き込む
アップロードと表示されている場合もあります。
プログラム作成エリア
プログラムを書き込むエリアです。
メッセージエリア
操作に応じてメッセージやエラーが表示されます。
コンソール
メッセージやエラーの詳細が表示されます。(※)
Arduino-IDE で設定している、Arduino 基板の種類と COM ポート番号が表示
ボード・COM 番号されます。
※ここに表示された文字や単語を検索サイトで調べることで、エラー解決に役立つことがあります。
新規ファイル開く
保存検証(コンパイル)● Arduino の プ ロ グ ラ ミ ン グ
Arduino を動かすためのプログラムを作成してみましょう。
void setup(){//各ピンの初期設定など}
void loop(){//実行するプログラム内容}

Arduino のプログラムは、電源を入れた時やリセットされた時に 1 度だけ実行される void setup()と、実際に実行する void loop()の 2 つの関数を必ず書く決まりになっていましたね。
void setup()は各ピンモードや変数の初期設定などを記入。
void loop()は実際に実行されるプログラムの命令を記入し、Arduinoの電源が ON になっている間はこの部分を繰り返し実行しますので、まずvoid setup()部分を考えてみましょう。

void setup(){
pinMode(2,OUTPUT); //2～13 番ピンをデジタル出力に
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(11,OUTPUT);
pinMode(12,OUTPUT);
pinMode(13,OUTPUT);
digitalWrite(11,HIGH);
digitalWrite(12,HIGH);
digitalWrite(13,HIGH);//11 番ピンを HIGH に//12 番ピンを HIGH に//13 番ピンを HIGH に

PICA Tower の LED は縦の同じ位置にあるLED のアノード側はそれぞれ 2 番ピン～10
番ピンに、カソード側は 1 段目が 11 番ピン、2 段目が 12 番ピン、3 段目が 13 番ピンにつながっていて、この端子の出力状態
を『HIGH』または『LOW』に設定することで点灯をコントロールしますので、2 番ピン～13 番ピンは全てデジタル出力に設定する必要があります。
また、電源投入時に LED を消灯状態にしておくため、digitalWrite で 11～13 番ピンを『HIGH』に初期化しておきます。

}
上記のプログラムでは、pinMode 関数で、2 番ピン～13 番ピンをデジタル出力に設定しています。

使用する Arduino 端子の初期設定ができましたので、LED を点灯させるプログラムを作成しましょう。
では、14 ページの表で『1 段目のア』の LED だけ点灯するプログラムを考えてみましょう。
38

Arduino プログラミングマニュアル
void loop(){
digitalWrite(2,HIGH);
digitalWrite(11,LOW);}

左記のプログラムでは LED『ア』のアノー//2 番ピンを HIGH に//11 番ピンを LOW に

ド側を HIGH に、カソード側を LOW にすることで LED『ア』を点灯させています。

● プ ロ グ ラ ム の 検 証 と Arduino へ の 書 き 込 み
では、前述の void setup()と void loop()を Arduino IDE のプログラム作成エリアに記入してください。
記入が終わったら、プログラムが正しく書かれているか、『検証』ボタンをクリックしてください。

すると、メッセージエリアに結果が表示されます。
『コンパイル終了。
』と表示されればプログラムは正し
く書かれています。
もし下記のようにメッセージエリアが赤く表示されたときは、記入したプログラムにエラーがあります。

エラー内容の詳細はコンソールに表示されますので、その内容を頼りに修正してください。

『検証』が OK であれば、プログラムを Arduino に書き込みます。
『マイコンボードに書き込む』ボタンをクリックし、メッセージエリアに『マイコンボードへの書き込みが完了しました。
』と表示されれば、書き込み完了です。
1 段目『ア』の LED だけが点灯するはずです。
もしうまく書き込みができない場合は、COM ポートの設定などを確認して下さい。

39

Arduino プログラミングマニュアル

5．オリジナル点灯パターンを作ろう
では、オリジナル点灯パターンの作成を行いましょう。
前項で、LED を 1 つだけ点灯させましたが、考え方は同じです。点灯させたい LED につながってる出力ポートの状態をプログラムして制御します。
問題
1 段目の LED が全て点灯(2 段目、3 段目は消灯)するプログラムを作成してください。

答え
前項のプログラムの void setup()部分の各端子の初期設定は同じですね。実際の点灯パターンを記述する void loop()部分を変更することになります。
各 LED のアノード側は、Arduino の 2 番～10 番ピンに接続されていましたね。(14 ページ参照)なので、2～10 番ピンを『HIGH』に設定すれば OK です。カソード側は 11～13 番ピンに接続されていますので、この端子を『LOW』にすると、それに対応した段の LED が点灯します。
今回は 1 段目だけを点灯させたいので 11 番ピンだけを『LOW』にすれば OK です。
void setup(){
pinMode(2,OUTPUT); //2～13 番ピンをデジタル出力に
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(11,OUTPUT);
pinMode(12,OUTPUT);
pinMode(13,OUTPUT);
digitalWrite(11,HIGH);
digitalWrite(12,HIGH);
digitalWrite(13,HIGH);//11 番ピンを HIGH に//12 番ピンを HIGH に//13 番ピンを HIGH にvoid loop(){
digitalWrite(2,HIGH);
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);//2 番ピンを HIGH に//3 番ピンを HIGH に//4 番ピンを HIGH に//5 番ピンを HIGH に//6 番ピンを HIGH に//7 番ピンを HIGH に//8 番ピンを HIGH に//9 番ピンを HIGH に//10 番ピンを HIGH にdigitalWrite(11,LOW);//11 番ピンを LOW に}}
実際に上記のプログラムを作成し、Arduino に書き込んでチェックしてください。
40

Arduino プログラミングマニュアル問題

1～3 段目の LED が全て点灯するプログラムを作成してください。

答え
前問のプログラムのカソード側端子を全て『LOW』にすれば OK ですね。
前問のプログラムでカソード側(11～13 番ピン)の修正部分は下記のようになります。
digitalWrite(11,LOW);
digitalWrite(12,LOW);
digitalWrite(13,LOW);//11 番ピンを LOW に//12 番ピンを LOW に//13 番ピンを LOW に全問で作成したプログラムを修正し、Arduino に書き込んでチェックしてください。

● LED を 点 滅 さ せ る
前項までのプログラムでは、LED は点灯したままです。
LED をピカピカと点滅させる方法を考えてみましょう。
点滅動作は、LED が一定時間点灯したあと、一定時間消灯。これを繰り返す動作です。
プログラムでも同様に、LED を点灯させた後にその状態を一定時間保持。その後消灯させたあと、消灯状態
を一定時間保持。これを繰り返すプログラムを作成します。
前問のプログラムを利用し、全体を 0.5 秒間隔で点滅させるプログラムを考えてみましょう。
まず、全体を点灯させるプログラムは前問のとおりです。この状態を 0.5 秒保持するプログラムは 35 ページの『時間関数』を使用します。
void loop(){
digitalWrite(2,HIGH);
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);//2 番ピンを HIGH に//3 番ピンを HIGH に//4 番ピンを HIGH に//5 番ピンを HIGH に//6 番ピンを HIGH に//7 番ピンを HIGH に//8 番ピンを HIGH に//9 番ピンを HIGH に//10 番ピンを HIGH にdigitalWrite(11,LOW);
digitalWrite(12,LOW);
digitalWrite(13,LOW);//11 番ピンを LOW に//12 番ピンを LOW に//13 番ピンを LOW に

delay(500);//500 ミリ秒=0.5 秒待ちます

digitalWrite(11,HIGH);
digitalWrite(12,HIGH);
digitalWrite(13,HIGH);//11 番ピンを HIGH に//12 番ピンを HIGH に//13 番ピンを HIGH に

delay(500);//500 ミリ秒=0.5 秒待ちます

delay(500);が 0.5 秒(500 ミリ秒)}

41

保持するプログラムです。
その後、11～13 番ピンを『HIGH』にして全部の LED を消灯し、もう一
度 delay(500);で 0.5 秒消灯を保持します。
Arduino プログラムの void loop()
部は電源が ON の間、ずっと繰り返しますので、全体の LED が 0.5 秒毎に点滅を繰り返します。

Arduino プログラミングマニュアル● LED を 回 転 す る よ う に 点 灯 さ せ る
次は、円形に配置された LED をクルクルと回転しているように点灯させてみましょう。回転するように点灯させるためには、14 ページの表の LED『ア』→『イ』→『ウ』→『エ』→・・・→『ク』→『ア』→・・・・と、順に点灯する LED を切り替えていけば OK ですね。今回のプログラムでは、まん中の LED『ケ』は消灯したままにしましょう。
void loop(){
digitalWrite(11,LOW);
digitalWrite(12,LOW);
digitalWrite(13,LOW);

まず最初に、カソード側を『LOW』に//11 番ピンを LOW に//12 番ピンを LOW に//13 番ピンを LOW にするプログラムを書きます。
全項まではアノード側のプログラムの後に書いていましたが、それでは

digitalWrite(2,HIGH);
delay(500);
digitalWrite(2,LOW);//2 番ピンを HIGH に//500 ミリ秒=0.5 秒待ちます//2 番ピンを LOW に(消灯)digitalWrite(3,HIGH);
delay(500);
digitalWrite(3,LOW);//3 番ピンを HIGH に//500 ミリ秒=0.5 秒待ちます//3 番ピンを LOW に(消灯)digitalWrite(4,HIGH);
delay(500);
digitalWrite(4,LOW);//4 番ピンを HIGH に//500 ミリ秒=0.5 秒待ちます//4 番ピンを LOW に(消灯)

うまく回転するように点灯しない場
合があります。なぜなら、プログラ
ムは上の行から順に実行していくた
め、今回のようにアノード側の状態を切り替える場合、全項と同じようにアノード側のプログラムの後に書
くと、アノード側の処理が終わった
後にカソード側の設定を行う事にな

digitalWrite(5,HIGH);
delay(500);
digitalWrite(5,LOW);//5 番ピンを HIGH に//500 ミリ秒=0.5 秒待ちます//5 番ピンを LOW に(消灯)digitalWrite(6,HIGH);
delay(500);
digitalWrite(6,LOW);//6 番ピンを HIGH に//500 ミリ秒=0.5 秒待ちます//6 番ピンを LOW に(消灯)digitalWrite(7,HIGH);
delay(500);
digitalWrite(7,LOW);//7 番ピンを HIGH に//500 ミリ秒=0.5 秒待ちます//7 番ピンを LOW に(消灯)せた後、時間関数で一定時間(今回はdigitalWrite(8,HIGH);
delay(500);
digitalWrite(8,LOW);//8 番ピンを HIGH に//500 ミリ秒=0.5 秒待ちます//8 番ピンを LOW に(消灯)います。これを LED『ア』～『ク』

digitalWrite(9,HIGH);
delay(500);
digitalWrite(9,LOW);//9 番ピンを HIGH に//500 ミリ秒=0.5 秒待ちます//9 番ピンを LOW に(消灯)ります。
プログラムを作成するときは、処理の順番も考えながら行う必要があります。
アノード側の処理は、LED を点灯さ0.5 秒)保持した後にその LED を消灯
し、次の LED アノード側の処理を行まで行います。
delay(500);の値を変更すると、回}42

転する速さを変えることができます。

Arduino プログラミングマニュアル●制御文を使用してプログラムを作る
前項のプログラムを見ると同じような文が繰り返されていますが、工夫するともっと短いプログラムになりそうです。LED は 8 個を順に点灯させて 1 周させ、それを繰り返せばよいわけですから、数をかぞえながら繰り返す『for 文』が使用できそうです。
void loop(){
digitalWrite(11,LOW);
digitalWrite(12,LOW);
digitalWrite(13,LOW);//11 番ピンを LOW に//12 番ピンを LOW に//13 番ピンを LOW に

for (int a=2;a<10;++a){
digitalWrite(a,HIGH);
delay(500);
digitalWrite(a,LOW);}//1 周を数える変数を a に//変数 a に対応するピンを HIGH に//500 ミリ秒=0.5 秒待ちます//変数 a に対応するピンを LOW に}
上記プログラムがその例です。
for (int a=2;a<10;++a)は、LED が 1 周する 8 回を数える変数 a を初期値 2 で設定し、a が 10 より小さければ{ }で囲った部分を実行します。変数 a の初期値を 2 にしたのは、この変数を digitalWrite で設定するアノード側のピン番号にも使用するためです。
まず、変数 a は初期値が 2 になります。2 は 10 より小さいので条件判断は『真』ですから for 文の{

}を実

行します。
digitalWrite(a,HIGH);
delay(500);
digitalWrite(a,LOW);
digitalWrite(a,HIGH);では、変数 a が 2 なので、2 番ピンが『HIGH』になり、2 番ピンに接続された LED『ア』が点灯します。delay(500);で 0.5 秒待った後、digitalWrite(a,LOW);で変数 a の端子(2 番ピン)が『LOW』になり、LED が消灯します。
for 文の{}内の処理が終わると、変数 a がインクリメント(＋1)され、3 になります。

これを a が 9 の場合まで繰り返し、a=10 になったら for 文の処理から抜け、void loop()の最初の行に戻り、繰り返します。

問題
上記のプログラムは縦 3 つの LED が同時に点灯しクルクルと回りますが、これを 1 段目だけの LED が 1 周回ったら 2 段目だけが 1 周。それが終われば 3 段目だけが 1 周。この動作を繰り返すプログラムを作ってみましょう。
このプログラムは、カソード側も for 文で切り替えていくとよいでしょう。

答え
カソード側を for 文で切り替え、さらにアノード側も for 文で切り替えていく方法を考えてみましょう。
次ページのプログラムがその例で、for 文の中に for 文がある『2 重構造』になっています。
43

Arduino プログラミングマニュアル
void loop(){for (int b=11;b<14;++b){
digitalWrite(b,LOW);//段を切り替える変数を b に//変数 b に対応する段のカソードを LOW に

for (int a=2;a<10;++a){
digitalWrite(a,HIGH);
delay(500);
digitalWrite(a,LOW);}
digitalWrite(b,HIGH);}//1 周を数える変数を a に//変数 a に対応するピンを HIGH に//500 ミリ秒=0.5 秒待ちます//変数 a に対応するピンを LOW に//変数 b に対応する段を HIGH に}
2 重の for 文は左記のような構造になっていますが、for (変数 2;条件 2;変数変化 2){
for (変数 1;条件 1;変数変化 1){
処理プログラム}}『for 文 2』を実行する中に『for 文 1』があるので、『for 文 1』の条件が偽となり『for 文 1』のループを抜けたあと、『for 文 2』の条件が真で『for 文 2』のループ処理を引き続き実行する場合、再度『for 文 1』のfor 文 1
ループが実行されることになります。

for 文 2

上記のプログラムは、段を制御するカソード側をセットした後にアノード側を 1 周させるように切り替
え、その 1 周が終わったら次の段に切り替えるという手順になっています。
カソード側は 3 段目の処理まで完了したら 1 段目に戻るようになっています。

44

Arduino プログラミングマニュアル●関数を使用する
前項までは 1 種類の点灯パターンをプログラムしましたが、順番に数種類の異なった点灯パターンを実行する方法を考えてみましょう。
プログラムは上の行から順番に実行していきますので、その点灯パターンの通りに順に記述していっても OKです。
void loop(){for (int a=0;a<5;a++){for(int b=2;b<11;b++){digitalWrite(b,HIGH);}
digitalWrite(11,LOW);
digitalWrite(12,LOW);
digitalWrite(13,LOW);//全点滅 5 回繰り返しループ//2～11 番ピンを HIGH に//11 番ピンを LOW に//12 番ピンを LOW に//13 番ピンを LOW に

delay(500);//500 ミリ秒=0.5 秒待機

digitalWrite(11,HIGH);
digitalWrite(12,HIGH);
digitalWrite(13,HIGH);//11 番ピンを HIGH に//12 番ピンを HIGH に//13 番ピンを HIGH に

delay(500);}//500 ミリ秒=0.5 秒待機

for(int c=2;c<11;c++){digitalWrite(c,LOW);}//2～11 番ピンを LOW に初期化

for (int d=11;d<14;d++){digitalWrite(d,LOW);//段を切り替える変数を d に

for (int e=2;e<10;e++){digitalWrite(e,HIGH);
delay(500);
digitalWrite(e,LOW);}
digitalWrite(d,HIGH);}//変数 d に対応する段のカソードを LOW に//1 周を数える変数を e に//変数 e に対応するピンを HIGH に//500 ミリ秒=0.5 秒待機//変数 e に対応するピンを LOW に//変数 d に対応する段を HIGH に}
上記のプログラムは、ピカピカと全体を 5 回点滅させた後、1 つずつクルクルと点灯させるプログラムです。
たった 2 つの点灯パターンですが、長くてわかりづらいですね。もっと多くの点灯パターンを作る場合、もっとわかりにくくなりそうです。
そこで、点灯パターンごとに『関数』を作って、それを呼び出して使うプログラムを考えてみましょう。

45

Arduino プログラミングマニュアル//関数のプロトタイプ宣言-----------------------void initial();//初期設定void ptn0();//LED 全消灯(初期化)
void ptn1();//点灯パターン 1
void ptn2();//点灯パターン 2//-------------------------------------------void setup(){
initial();}void loop(){for (int x=0;x<5;x++){ptn1();}//初期設定関数呼び出し//パターン 1 を 5 回繰り返し//点灯パターン 1 を呼び出し

ptn0();//LED 初期化を呼び出し

ptn2();//点灯パターン 1 を呼び出し

ptn0();
delay(500);// LED 初期化を呼び出し//0.5 秒消灯}//初期設定-----------------------------------void initial(){for(int a=2;a<14;a++){pinMode(a,OUTPUT);//変数 a に対応するピンをデジタル出力に}
digitalWrite(11,HIGH);//11 番ピンを HIGH にdigitalWrite(12,HIGH);//12 番ピンを HIGH にdigitalWrite(13,HIGH);//13 番ピンを HIGH に}//-------------------------------------------//全 LED 消灯(初期化)--------------------------void ptn0(){for(int b=2;b<11;b++){digitalWrite(b,LOW);//変数 b に対応するピンを LOW に}
digitalWrite(11,HIGH);//11 番ピンを HIGH にdigitalWrite(12,HIGH);//12 番ピンを HIGH にdigitalWrite(13,HIGH);//13 番ピンを HIGH に}//-------------------------------------------//点灯パターン 1(全 LED 点滅)-------------------void ptn1(){for(int c=2;c<11;c++){digitalWrite(c,HIGH);//変数 c に対応するピンを HIGH に}digitalWrite(11,LOW);//11 番ピンを LOW に
46

Arduino プログラミングマニュアル
digitalWrite(12,LOW);
digitalWrite(13,LOW);
delay(500);
digitalWrite(11,HIGH);
digitalWrite(12,HIGH);
digitalWrite(13,HIGH);
delay(500);//12 番ピンを LOW に//13 番ピンを LOW に//500 ミリ秒=0.5 秒待ちます//11 番ピンを HIGH に//12 番ピンを HIGH に//13 番ピンを HIGH に//500 ミリ秒=0.5 秒待ちます}//-------------------------------------------//点灯パターン 2(LED1 周点滅 1 段→2 段→3 段)---void ptn2(){for (int d=11;d<14;++d)//段を切り替える変数を d に{
digitalWrite(d,LOW);//変数 d に対応する段のカソードを LOW に
for (int e=2;e<10;++e) //1 周を数える変数を e に{
digitalWrite(e,HIGH); //変数 e に対応するピンを HIGH に
delay(500);//500 ミリ秒=0.5 秒待ちます
digitalWrite(e,LOW); //変数 e に対応するピンを LOW に}
digitalWrite(d,HIGH);//変数 d に対応する段を HIGH に}}//-------------------------------------------上記が点灯パターンを関数にしたプログラムです。
最初にこのプログラムで使用する関数のプロトタイプ宣言を行います。このプログラムでは initial()、ptn0()、ptn1()、ptn2()の 4 つの関数を使用しています。
Arduino のプログラムに必須の void setup()と void loop()は赤い破線で囲った部分だけです。その下に先ほどの 4 つの関数の実行内容が記述されています。(青い破線部分)
void setup()で Arduino の初期設定を記述した initial()を呼び出しています。
void loop()では、点灯パターンの関数 ptn0、ptn1、ptn2 を呼び出しています。ptn1 は for 文の中で呼び出し、5 回繰り返しています。
このように、点灯パターンなどの定型プログラムを関数にしておくことで、プログラムがとても見やすくな
りますし、同じ関数を何度も使用する動作記述(上記例では LED の初期化)を関数にしておくと、関数の記述
を 1 度しておけば何度も呼び出して使用することができ、便利になります。

47

Arduino プログラミングマニュアル

6．明るさセンサーを使おう
PICA Tower には周囲の明るさをキャッチする明るさセンサーが標準で搭載されています。
この明るさセンサーは『CdS(シーディーエス)』という電子部品で、CdS に当たる光が明るくなると CdS の抵抗値が低くなり、暗くなると高くなるという性質があり、これを利用して周囲の明るさをキャッチします。

左は PICA Tower の CdS 回路部分だけを抜き出したものです。
抵抗と CdS が直列につながり、その両端が電源に、中間が Arduino
Arduino のA0 端子の A0 端子につながっています。
A0 端子につながっている端子の電圧は CdS の抵抗値により変化します。これは、電源電圧の 4.5V が固定抵抗 RS と CdS の抵抗値の比により分割されるからです。このことを『分圧』といいます。

これはオームの法則で求めることができます。
例えば、CdS の抵抗値を XkΩとすると、全体の合成抵抗は(10＋X)kΩ ですね。計算しやすいように kΩ ははずして考えましょう。
.

この合成抵抗に流れる電流は、電流＝電圧÷抵抗ですから、です。

厳密には Arduino にも電流が流れるのですが、その電流はこの抵抗に流れる電流に比べとても小さいため、無視して計算することができます。
この時 CdS に加わる電圧は、電圧＝電流×抵抗ですから、.
＋

× X = 4.5となり、電源電圧を固定抵抗と CdS の合成抵抗で割ったものに CdS の抵抗値をかけたもの、つまり CdS と合成抵抗の比になります。

例えば CdS に光があたっている時(周囲が明るい時)の CdS の抵抗値が 1kΩ だったとすると・・・
A0 端子

CdS に加わる電圧＝A0 端子に加わる電圧ですから
A0 端子の電圧= 4.5

抵抗値：1kΩ≒ 0.4

で、約 0.4V です。

また CdS に光があたっていない時(周囲が暗い時)の CdS の抵抗値が 100kΩ だったとすると・・・
CdS に加わる電圧＝A0 端子に加わる電圧ですから
A0 端子

A0 端子の電圧= 4.5
抵抗値：100kΩ

≒ 4.1

＋

で、約 4.1V になります。

このように、CdS の抵抗の変化を電圧の変化に変換することで、その電圧の値を Arduino で読み取ることが48

Arduino プログラミングマニュアル
できます。
Arduino では A0～A5 の 6 つの端子の電圧を読み取ることができ、analogRead(pin)で読み取る端子を指定します。この端子は『アナログ入力端子』といいます。
これにより analogRead で指定した端子の電圧の値に応じて LED の点灯パターンを変えるというプログラムを作ることができるのです。

・アナログ入力で読み取った値
Arduino はアナログ入力に使用できる端子は、前述のように A0～A5 の 6 端子を持っていています。
読み取れる電圧の分解能は 10 ビットです。
『分解能が 10 ビット』とは、基準になる電圧を『2= 1024』分割した精度で読み取ることができるという意味です。
例えば、基準電圧が 5V の場合、5 ÷ 1024 = 0.00488V ⋯で、約 4.9mV 刻みで読み取ることができます。
読み取った値が 0V だった時、読み取った電圧の値は 0、5V の時が 1023 となります。
この値を使用し、『analogRead で読み取った値が 512 より小さいときは消灯する』というようなプログラムを作成することができます。

・アナログ入力を使ってみよう
・シリアルポートモニター
では、アナログ入力を使って点灯パターンを作成する前に、明るさセンサーでアナログ入力の値がどのように変化しているのか見てみましょう。
Arduino はパソコンとデータ通信をすることができます。この機能を利用し、アナログ入力で読み取った値をパソコンに表示させてみましょう。
int akarusa;
void setup(){
Serial.begin(9600);}
void loop(){akarusa = analogRead(A0);Serial.println(akarusa);
delay(500);}//A0 端子の電圧値を記憶させておく変数を宣言//パソコンとの通信速度を 9600 に//A0 端子の値を akarusa に//akarusa の内容をパソコンに表示//次の表示まで 0.5 秒待つ

上記がパソコンに A0 端子の電圧値を読み取った結果を表示させるプログラムです。
上記を入力したら Arduino にプログラムを書き込んだ後、メニューバーの『ツール』→『シリアルモニタ』を選択してください。

49

Arduino プログラミングマニュアル

すると左図のウインドウが開き、0.5 秒ごとに読み取った値が表示されます。
この時表示がおかしい場合はウインドウ右下の数字(赤で囲った部分)が 9600bps になっているか確認して下さい。
この数値を Serial.begin で設定した数値と同じにしておかないと、表示される文字がおかしくなります。

Arduino とパソコンのデータ通信の関数は下記のとおりです。
・Arduino とパソコンのデータ通信の速度を設定します。
書き方
パラメーター
速さ：通信速度を記入します。
パソコンと通信する場合、300、1200、2400、
Serial.begin(速さ)4800、9600、14400、19200、28800、38400、57600、115200 の中から選びます。通常は 9600
にします。
使用例
Serial.begin(9600);//通信速度を 9600 に設定します。
・パソコンとデータ通信をするためのシリアル端子にデータを出力します。
書き方
パラメーター
データ：出力するデータを記入します。
数値だけでなく文字を出力することもできます。(ただし日本語は不可)
変換型：出力するデータを何進数で表示するかを設定します。
Serial.print(データ,変換型)
10 進数のときは DEC
16 進数のときは HEX
2 進数のときは BIN※変換型は省略する事が可能で、省略したときはDEC と同じ。
Serial.print (93);//シリアル端子に 93 が出力される
Serial.print (93,HEX);//シリアル端子に 5D が出力される
使用例
Serial.print (93,BIN);//シリアル端子に 1011101 が出力される
Serial.print (”HELLO”); //シリアル端子に HELLO が出力される//※文字を出力するときには『” ”』で文字を囲む
・パソコンとデータ通信をするためのシリアル端子に、データの末尾に改行コードを付けて出力します。
書き方
パラメーター
データ：Serial.print と同じ
Serial.println(データ,変換型)
変換型：Serial.print と同じ
使用例

Serial.println (93);//シリアル端子に 93＋改行が出力される

Serial.print と Serial.println の違いは改行コードが付加されるかどうかだけです。前ページのプロ
グラムの Seril.println を Serial.print に変えてみて実行してみましょう。
Seril.print は改行がありませんので、数値がヨコにつながって表示
されます。
50

Arduino プログラミングマニュアル//A0 端子の電圧値を記憶させておく変数を宣言

int akarusa;
void setup(){
Serial.begin(9600);}
void loop(){akarusa = analogRead(A0);Serial.print(”akarusa=”);Serial.print(”¥t”);
Serial.println(akarusa);
delay(500);}//パソコンとの通信速度を 9600 に//A0 端子の値を akarusa に//akarusa の内容をパソコンに表示//次の表示まで 0.5 秒待つ

先ほどのプログラムに上記の赤で示した 2 行を追加して実行してみてください。
左図のように文字と空白が追加されて表示されます。
『¥t』はエスケープコードといいます。
プログラム上に『タブ』や『改行』など文字で表せない物や、プログラムで使用できない『？』などの文字を書きたいときに使用します。
例えば¥と書きたいとき → ¥¥と書きます?と書きたいとき → ¥?と書きます『タブ』を書きたいとき →¥t と書きます『改行』を書きたいとき →¥n と書きます上記のプログラムでは
akarusa=

akarusa の値(改行) と表示されます。

タブ・アナログ入力を使ったプログラム
では、LED 部ベース基板にある CdS に手をかざして、明るさの状況を変化させてみましょう。
明るいときは 300 くらいだった値が、800 くらいに変化します。

※明るさの状況により、この数字通りにならない場合もありますが、明るい時より暗い時のほうが値が大
きくなります。
この変化を利用し、明るいときは全部の LED が点灯し、暗くなると 1 段ずつ 1 個の LED がクルクル回るプ
ログラムを考えてみましょう。
明るさの状態＝A0 端子の電圧値により処理が変わりますので、制御文の『if 文』が使用できそうです。
if 文は『もしも○○○が△△△なら□□□を実行し、そうでないなら☆☆☆を実行する』というものでしたので、今回のプログラムに当てはめると『もしも A0 端子の値が 600 より小さいなら全 LED の点滅を行い、そうでない(600 以上)なら 1 段ずつ 1 個の LED がクルクル回る様に点灯させる』ということになります。
プログラム切り替えのしきい値※を 600 としましたが、この値は明るさの状況により変わりますので、シリアルモニターで明るい時と暗い時の数値を見ながら決めてください。
51

Arduino プログラミングマニュアル※しきい値
しきい値とは動作が切り替わる境になる「ある決められた値」のことをで、「いき値」とも呼ばれます

以下は、このプログラム例です。
//関数のプロトタイプ宣言-----------------------void initial();//初期設定void ptn0();//LED 全消灯(初期化)
void ptn1();//点灯パターン 1
void ptn2();//点灯パターン 2//-------------------------------------------//変数宣言------------------------------------int akarusa;//int 型の変数 akarusa を設定(A0 の値代入用)//-------------------------------------------void setup(){
initial();}void loop(){ptn0();//初期設定関数呼び出し//LED 全消灯(初期化)

akarusa = analogRead(A0); //A0 端子の電圧値を akarusa に代入
if(akarusa<600){
ptn1();}//akarusa が 600 より小さければ

else{
ptn2();}//そうでなければ(akarusa が 600 以上ならば)//点灯パターン 1 を実行//点灯パターン 2 を実行}//初期設定-----------------------------------void initial(){for(int a=2;a<14;a++){pinMode(a,OUTPUT);//変数 a に対応するピンをデジタル出力に}
digitalWrite(11,HIGH);//11 番ピンを HIGH にdigitalWrite(12,HIGH);//12 番ピンを HIGH にdigitalWrite(13,HIGH);//13 番ピンを HIGH に}//-------------------------------------------//全 LED 消灯(初期化)--------------------------void ptn0(){for(int b=2;b<11;b++){digitalWrite(b,LOW);//変数 b に対応するピンを LOW に}
52

Arduino プログラミングマニュアル
digitalWrite(11,HIGH);
digitalWrite(12,HIGH);
digitalWrite(13,HIGH);//11 番ピンを HIGH に//12 番ピンを HIGH に//13 番ピンを HIGH に}//-------------------------------------------//点灯パターン 1(全 LED 点滅)-------------------void ptn1(){for(int c=2;c<11;c++){digitalWrite(c,HIGH);//変数 c に対応するピンを HIGH に}digitalWrite(11,LOW);//11 番ピンを LOW に
digitalWrite(12,LOW);//12 番ピンを LOW に
digitalWrite(13,LOW);//13 番ピンを LOW に
delay(500);//500 ミリ秒=0.5 秒待ちます
digitalWrite(11,HIGH);//11 番ピンを HIGH にdigitalWrite(12,HIGH);//12 番ピンを HIGH にdigitalWrite(13,HIGH);//13 番ピンを HIGH に
delay(500);//500 ミリ秒=0.5 秒待ちます}//-------------------------------------------//点灯パターン 2(LED1 周点滅 1 段→2 段→3 段)---void ptn2(){for (int d=11;d<14;++d)//段を切り替える変数を d に{
digitalWrite(d,LOW);//変数 d に対応する段のカソードを LOW に
for (int e=2;e<10;++e) //1 周を数える変数を e に{
digitalWrite(e,HIGH); //変数 e に対応するピンを HIGH に
delay(500);//500 ミリ秒=0.5 秒待ちます
digitalWrite(e,LOW); //変数 e に対応するピンを LOW に}
digitalWrite(d,HIGH);//変数 d に対応する段を HIGH に}}//--------------------------------------------

void loop()部分の『if～else～』部分が明るさにより点灯パターンプログラムの切り替えを行っている部
分です。if(akarusa<600)の数値を変更すると点灯パターンが切り替わる周囲の明るさが変わります。
しきい値が 600 未満のときは ptn1()を、600 以上のときは ptn2()を呼び出して実行しています。

以上で、Arduino による PICA Tower のプログラムの解説はおしまいです。
Arduino にはこの他にも色々な機能があり、LED の点灯だけでなく、色々と便利な用途に使用することができます。
今回のプログラミングをきっかけに、色々チャレンジしてみてください。

53

Arduino プログラミングマニュアル

ご注意 ① ELEKIT は、株式会社イーケイジャパンの登録商標です。
② 本書の内容の一部、または全部を無断転載することはかたくお断りします。
③ 本書の内容等については、将来予告なく変更する場合があります。
④ 本書の内容は教育、ホビー用途を目的に記載されていますので、実際の運用には適さない記述があります。
⑤ 本書の内容を元に作成されたプログラム等につきまして、弊社では一切の責任を負いかねます
ので、あらかじめご了承ください。
2014 年 1 月 15 日 初版発行

C (株)イーケイジャパン 2014○
54