AITC シニア向け第4回IoT勉強会
Arduinoを使って、もうちょっとやってみる？！
2015年8月1日
先端IT活用推進コンソーシアム
クラウド・テクノロジー活用部会
リーダー 荒本道隆

アジェンダ 復習：13:30～14:30
 前半：14:30～15:30◦ LEDとタクトスイッチで色々とやってみる 後半：15:30～16:15◦ センサ（照度、温湿度、人感、距離）を使ってみる 交流会：16:15～18:00
 全体を通して◦ 特に休憩は取らないので、トイレは適宜行ってください◦ 自信のある人は、回答ページを見ずにトライ◦ 重要：やっているうちに突然アイデアがおりてきた人

 →アイデア優先で、作ってみてください2

小学生以下の子供がいる家は、保管場所に注意

その前に 配布物：返却不要（壊れたら予備もあります）◦ CDSセル(5mm, 照度センサ)
30円 = 30円
◦ 赤色LED(3mm , 500mcd)x5
3.5円x5 = 17.5円◦ ハイパワー青色LED(3mm, 12000mcd)x1 25円 = 25円◦ タクトスイッチx3
7円x3 = 21円◦ ジャンパーコード（10cm）x5
9円x5 = 45円◦ 抵抗（1/4W, 150Ω, 茶緑茶金）x6
1円x6 = 6円◦ 抵抗（1/4W, 1kΩ, 茶黒赤金）x5
1円x5 = 5円
注：秋月電子通商の100個セット価格から算出

 貸出品：要返却◦ 温湿度センサ(DHT11)◦ 人感センサ(Panasonic AMN41121)◦ 超音波距離センサ(HC-SR04)

300円
1,000円
800円

3

復習（前回の菅井さんの資料から）

4

復習（前回の菅井さんの資料から）

Zipのダウンロード＆解凍をしてください5

復習（前回の菅井さんの資料から）

6

復習（前回の菅井さんの資料から）

7

復習（前回の菅井さんの資料から）

8

復習（前回の菅井さんの資料から）

9

復習（前回の菅井さんの資料から）

10

復習（前回の菅井さんの資料から）

11

復習（前回の菅井さんの資料から）

12

復習（前回の菅井さんの資料から）

13復習
150Ω（茶緑茶金）

5Vと接続

14

復習（前回の菅井さんの資料から）

15

復習（前回の菅井さんの資料から）

16

復習（前回の菅井さんの資料から）

17

コピペ用
サンプルプログラム#define LED_OUTPUT 8void setup() {pinMode(LED_OUTPUT, OUTPUT);}
void loop() {digitalWrite(LED_OUTPUT, HIGH);
delay(1000);
digitalWrite(LED_OUTPUT, LOW);
delay(1000);}18

復習（前回の菅井さんの資料から）

19

復習（前回の菅井さんの資料から）

20

復習

デジタルの8番と接続

5Vにつながっていた線を外す

21

復習（前回の菅井さんの資料から）

22

復習（前回の菅井さんの資料から）23追加した部分

復習

1kΩ（茶黒赤金）
デジタルの9番と接続
前回の資料とは違う

24

コピペ用
サンプルプログラム
void setup() {pinMode(8, OUTPUT);
pinMode(9, INPUT);}
void loop() {if(digitalRead(9) == HIGH) {digitalWrite(8, HIGH);} else {digitalWrite(8, LOW);}
delay(10);}25実は、プログラムを書かなくても直結プログラムで制御している線を外す

Arduinoは5VとGNDを提供しているだけ

26

前半
LEDとタクトスイッチで色々とやってみる論理回路の作成
 コンピュータ入門で必ず出てくる論理回路を作成◦ AND, OR, XOR, NOT, NAND, NOR◦ LEDと２つのタクトスイッチ（A, B）で実現

ANDORXORNOT

NAND

NOR

28

例題
 OR回路をハードウエアとソフトウエアで実現

 要件◦ 何もしていない状態だと、LEDは点かない◦ Aを押すと、LEDは点く◦ Bを押すと、LEDは点く◦ AとB両方を押すと、LEDは点く

次ページの解答を参照
29

ORをハードウエアで実現
直結

A

B

Aを押しても、Bを押しても、AB両方押しても、LED点灯

30

ORをソフトウエアで実現
A

B

Aを押しても、Bを押しても、AB両方押しても、LED点灯

直結を外し、Arduinoと接続

31

ORをソフトウエアで実現
サンプルプログラム
void setup() {pinMode(8, OUTPUT);||OR
pinMode(9, INPUT);&& AND
pinMode(10, INPUT);^XOR}
void loop() {if(digitalRead(9) == HIGH || digitalRead(10) == HIGH ) {digitalWrite(8, HIGH);} else {digitalWrite(8, LOW);}
delay(10);
}

32

課題－１
 AND回路をハードウエアとソフトウエアで実現◦ ソフトウエアからやった方が楽◦ ハードウエアは、ちょっと考えましょう 要件◦ 何もしていない状態だと、LEDは点かない◦ Aを押しても、LEDは点かない◦ Bを押しても、LEDは点かない◦ AとB両方を押すと、LEDは点く

制限時間は１０分間
33

ANDをソフトウエアで実現
サンプルプログラム

配線はORと同じ

void setup() {pinMode(8, OUTPUT);||OR
pinMode(9, INPUT);&& AND
pinMode(10, INPUT);^XOR}
void loop() {if(digitalRead(9) == HIGH && digitalRead(10) == HIGH ) {digitalWrite(8, HIGH);} else {digitalWrite(8, LOW);}
delay(10);}34

ANDをハードウエアで実現
直結A

B

AB両方押した時だけ、LED点灯

ここも外す

35

課題－２
 XOR回路をハードウエアとソフトウエアで実現◦ ソフトウエアからやった方が楽◦ ハードウエアは、どうでしょう？
 要件◦ 何もしていない状態だと、LEDは点かない◦ Aを押すと、LEDは点く◦ Bを押すと、LEDは点く◦ AとB両方を押すと、LEDは点かない

知っている人、居ませんか？
36

XORをソフトウエアで実現
サンプルプログラム

配線はORと同じ

void setup() {pinMode(8, OUTPUT);||OR
pinMode(9, INPUT);&& AND
pinMode(10, INPUT);^XOR}
void loop() {if(digitalRead(9) == HIGH ^ digitalRead(10) == HIGH ) {digitalWrite(8, HIGH);} else {digitalWrite(8, LOW);}
delay(10);}37

XORをハードウエアで実現
 実は、XORを手元のパーツで実現するのは難しい じゃぁ、どうするかというと◦ SN74HC00Nを買ってくる◦ NANDを組み合わせれば、全ての論理回路が表現可能◦ 秋月電子通商で20円／個
 http://akizukidenshi.com/catalog/g/gI-08594/

38

課題－３
 LEDを2個にして、早押し対決装置を作る
 要件◦ AとBで、先に押した方が分かるようにしたい◦ 先に押した方のLEDを点灯したままにする◦ 後から押してもLEDは点灯しない

プログラミングスキルが結構必要分からない人は、次ページ参照
39

早押し対決装置追加した部分

AB

先に押した方だけ点灯

リセット
ボタン

リセット完了まで約２秒

40

早押し対決装置
void setup() {pinMode(8, OUTPUT);
pinMode(9, INPUT);
pinMode(10, INPUT);
pinMode(11, OUTPUT);}
int first = 0; // 勝者を格納する。0 は勝者未定
void loop() {if (first == 0){ // まだ勝者が決まっていないなら
if(digitalRead(9) == HIGH) {first = 9;} // 9が押した→勝者
if(digitalRead(10) == HIGH) {first = 10;} // 10が押した→勝者} else {// 勝者が決まっているなら
if (first == 9){ // 9が勝者ならdigitalWrite(8, HIGH); // 8を点けて
digitalWrite(11, LOW); // 11を消す}
if (first == 10){ // 10が勝者ならdigitalWrite(8, LOW); // 8を消して
digitalWrite(11, HIGH); // 11を点ける}
delay(10);}// delay(10); // 勝者が決まるまではwaitを入れない}41

早押し対決装置の課題
 あまり楽しくないで、ゲーム性を追加する◦ もう１つLEDを追加して、開始の合図にする
 開始のLEDは、ランダムで点灯する
 フライングすると、その時点で負け確定。LEDが点かなくなる 開始の合図からスイッチを押すまでの時間を測定◦ マイクを追加し、「大きな音」を開始の合図にする◦ 体感時間でジャスト10秒を測る装置を作る

42

後半
センサを使ってみる（照度、温湿度、人感、距離）復習（前回の菅井さんの資料から）

44

復習（前回の菅井さんの資料から）

45

コピペ用
サンプルプログラム#define CDS_INPUT 0void setup() {Serial.begin(9600);}
void loop() {int value = analogRead(CDS_INPUT);
Serial.println(value);
delay(1000);}46

復習（前回の菅井さんの資料から）

47

復習（前回の菅井さんの資料から）

48

課題－４
 照度センサを使い、「暗ければLED点灯」を作る
 要件◦ 照度センサはアナログ入力0に接続する◦ LEDはデジタル出力8に接続する◦ 照度が一定数以下なら、LEDを点灯する◦ 照度が一定数以上なら、LEDを消灯する◦ 照度の値は、場所と抵抗値で変わります

制限時間は１５分間
49暗ければLED点灯
CdSを暗くすると点灯

1kΩ（茶黒赤金）

50暗ければLED点灯
サンプルプログラム#define CDS_INPUT 0
void setup() {pinMode(8, OUTPUT);
Serial.begin(9600);}
void loop() {int value = analogRead(CDS_INPUT);
Serial.println(value);if(value <= 200) {digitalWrite(8, HIGH);} else {digitalWrite(8, LOW);}
delay(500); // 反応を早くするために、waitを減らす
}

51

課題－５
 選択方式です◦ 課題－４を拡張、暗い時間が一定時間継続するとLED点灯◦ 温湿度センサ(DHT11)を使ってみる◦ 人感センサ(Panasonic)を使ってみる◦ 超音波距離センサ(HC-SR04)を使ってみる

終了時間まで52暗い時間をカウント

150Ω（茶緑茶金）

53

暗い時間をカウント#define CDS_INPUT 0
void setup() {pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
Serial.begin(9600);}
int counter = 0;
void loop() {int value = analogRead(CDS_INPUT);
Serial.println(value);if(value <= 200) { // 閾値は、それぞれ調整
counter = counter + 1;
} else {counter = 0;}
if (counter >= 1){ digitalWrite(8, HIGH);} else {digitalWrite(8, LOW);}
if (counter >= 2){ digitalWrite(9, HIGH);} else {digitalWrite(9, LOW);}
if (counter >= 3){ digitalWrite(10, HIGH);} else {digitalWrite(10, LOW);}
if (counter >= 4){ digitalWrite(11, HIGH);} else {digitalWrite(11, LOW);}
if (counter >= 5){ digitalWrite(12, HIGH);} else {digitalWrite(12, LOW);}
delay(500);}54２進数で暗い時間をカウント#define CDS_INPUT 0
void setup() {pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
Serial.begin(9600);}
int counter = 0;
void loop() {int value = analogRead(CDS_INPUT);
Serial.println(value);if(value <= 200) { // 閾値は、それぞれ調整counter = counter + 1;
} else {counter = 0;}// 4bitで1～15（0000～1111）を表現
digitalWrite(8, counter & 1);
digitalWrite(9, (counter >> 1) & 1);
digitalWrite(10, (counter >> 2) & 1);
digitalWrite(11, (counter >> 3) & 1);
if (counter >= 16){ digitalWrite(12, HIGH);} else {digitalWrite(12, LOW);}
delay(500);}55温湿度センサ(DHT11)を使ってみる 温湿度センサ（DHT11）とはシリアル通信◦ 専用のライブラリを使えばカンタン
 http://playground.arduino.cc/main/DHT11Lib
 ディレクトリを作成し、dht11.h と dht11.cpp をダウンロード
 開発環境の「スケッチ」→「ライブラリを使用」→「Add Library…」で、ダウンロードしたディレクトリを指定
 サンプル（Usageのすぐ下）をコピペして実行◦ 安物（300円）なので精度と耐久度がイマイチ 精度：±２℃（＠25℃）
 AM2302という高級品（950円）もある
 精度：±0.5℃（-40～80℃）

http://learning.grobotronics.com/2013/07/
measuring-humidity-with-dht11-sensor/
56

人感センサ(AMN41121)を使ってみる デジタル入力に接続するだけ◦ pinMode(ピン番号, INPUT);◦ int a = digitalRead(ピン番号);◦ 動きを検出するとHIGH、無ければLOW◦ アナログ入力に接続すると、細かい変化が見える 使用上の注意◦ ほんのわずかな動きも検出するので、常にHIGH◦ 何かを被せて静かにすると、LOW になる
デジタル入力へGND

GND
100KΩ（茶黒黄金）

5V

Panasonic AMN41121
人感センサを裏面から見た図

57

超音波距離センサ(HC-SR04)を使ってみる 正確に測定するには、温湿度センサと併用する

http://www.honda-el.co.jp/hb/3_17.html

 参考URL◦ http://deviceplus.jp/hobby/entry016/

58

参考情報
測定した値を送信する

HTTP通信に必要なもの
 イーサネットシールド追加で通信が可能になる◦ Macアドレスをハードコード、LAN内で重複しないように◦ DNSを参照するのは手間なので、直IPアドレスで指定◦ 別機器で無線LAN化（コンバータモードを使用）◦ HTTP通信を手書きする（複雑な通信は大変）

イーサネットシールド

無線LAN化機器
PLANEX MZK-PR150N

60

HTTP通信（サンプル前半）#include <SPI.h>#include <Ethernet.h>#define LED_OUTPUT 8#define CDS_INPUT 0

boolean led = LOW;
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };IPAddress server(219,101,208,155);
int port = 80;// 自分のMACを決める// 接続先のIPアドレス// 接続先のポート番号

void setup() {pinMode(LED_OUTPUT, OUTPUT);

Serial.begin(9600);
Serial.println("DHCP Request");for(;Ethernet.begin(mac) == 0;) {// DHCPサーバからIPアドレスを取得
Serial.println("Failed to configure Ethernet using DHCP");
delay(10000);}
Serial.println("START!");}
61

HTTP通信（サンプル後半）
void loop(){int val = analogRead(CDS_INPUT);
boolean writeFlag = false;if (val < 400){ // 暗ければ
if (led != HIGH){
led = HIGH; // 点ける
writeFlag = true;}} else {// そうでなければ、
if (led != LOW){
led = LOW; // 消す
writeFlag = true;}}
if (writeFlag == true){digitalWrite(LED_OUTPUT, led);
Serial.print ("CdS :");
Serial.print (val);
Serial.println();

EthernetClient client;
if (client.connect(server, port)) {Serial.println("HTTP connected");// Make a HTTP request:
client.print("GET /arduino/ID/"); // IDを識別できる名前に変更
client.print("?LED=");client.print(led);client.print(“&cds=");client.print(val);client.print(" HTTP/1.0");
client.println();client.println();delay(100); // 送信が終わるまで、ちょっと待つclient.stop();}}delay(100);
}
62

後片付け
 要返却のものは、忘れずに戻してください◦ 温湿度センサ(DHT11)◦ 人感センサ(Panasonic AMN41121)◦ 超音波距離センサ(HC-SR04)◦ Arduino＋ブレッドボード
2015/8/1（土）、8/2（日）Maker Faire Tokyo
東京ビックサイトで開催中
http://makezine.jp/event/mft2015/
入場料：大人1,500円

63