情報処理演習II
本日の講義内容
•
本校講義の概要
•
インタラクティブ・デバイスについて
• Arduino
について
•
前回の復習
•
ブレッドボードの理解
•
演習1
–タクトスイッチでLEDを点灯させる
•
演習2
–タクトスイッチでLEDを点灯させる
• 抵抗によるLEDの輝度の制限 • トグル機能の実装•
課題
–タクトスイッチにより2個のLEDを交互に点灯させよ
情報処理演習IIの目標
•
マイクロコンピュータのハードウェアを直接操作するプログラム
を記述することにより,プログラミング手法とコンピュータ
アーキテクチャについて理解を深めます.
–独自のインタラクティブ・デバイスの「中身」を作る技術を学ぶ
•
電子回路
•
マイクロコントローラ(マイコン)プログラミング
– Arduino•
独自のデバイス(の中身)を作る
•
本講義の予習・復習などは以下のサイトを参照すること
–
http://hope.c.fun.ac.jp/course/view.php?id=458
•
以下のサイトも参考に
–
http://www.musashinodenpa.com/wiki/
製品開発と情報処理演習IIの関連
• 製品のデザインプロセス
–コンセプト設定
• 市場調査,
顧客要求,
顕在ニーズ,
潜在ニーズの分析
–ユーザの観察,ユーザの設定ペルソナ作成(ユーザモデル)
–ブレーンストーミング, アイデア生成
–プロトタイピング
• ペーパプロトタイピング,
インタフェースモデリング
•
ワーキングプロトタイプ
, 3Dプロトタイピング
–評価
• プロトタイプを使って評価,問題を発見,新機能を発想
モックアップの作成
•
製品評価に重要な役割
•
実際に使用して判明
•
反応が実感できるシステム
–センサ(ボタン,加速度センサ)
–表示装置(LED, Display)
–アクチュエータ
•
マイコンボード, I/Oボードを用いる
–いくつかのバリエーションを経験する
•
この技術をもっていれば,なにかと
有利
–C/C++ ベースにより実際に動くものを制作
•
センサやカメラなどからの情報取得,ロボットや計測システムなどの
組み込みシステムの制御などに応用可能
情報処理演習
Ⅱでは
Arduinoを使用
インタラクティブ・デバイスとは
•
情報処理機能/入出力機能を備えた
単体動作するハードウェア
–ユーザと直接インタラクションが可能
iPhone
Fitbit Ultra
Wifi Body Scale
インタラクティブ・デバイスの構成要素
•
「情報」「電子回路」「構造」の3要素
•
情報: 演算機能(コンピュータ)
•
電子回路: 入出力機能(センサ/アクチュエータ)
インタラクティブ・デバイスの構成要素
•
「情報」「電子回路」「構造」の3要素
•
情報: 演算機能(コンピュータ)
•
電子回路: 入出力機能(センサ/アクチュエータ)
•
構造: 筐体/機構機能(外装)
ハードウェア
ソフトウェア
製品例: iPhone 5
•
情報: CPU(ARM),OS(iOS6 or iOS7)
•
電子: 静電式タッチパネル,ディスプレイ,マイク,
スピーカー,振動モーター,カメラ,
各種センサ(後述)
•
構造: アルミニウム(嵌め合せ,特殊ネジ)
製品例:
iPhone
のセンサ(加速度)
• 3
軸加速度センサ
–機能: 重力加速度/加速度の取得
–用途: 画面縦横反転/行動認識
製品例:
iPhone
のセンサ(ジャイロ)
• 3
軸ジャイロセンサ
–機能: 角速度の取得
–用途: 回転動作を利用したゲームコントローラ
製品例: iPhoneのセンサ(位置/方位)
• GPS
&地磁気センサ
–機能: 絶対位置/方位取得
講義の目的
•
独自のインタラクティブ・デバイスを作る
– ユーザがインタラクティブに操作可能
– 筐体に組み込み,単体動作
iPhone
ではアプリは作れても
新しいデバイスは難しい
Arduinoで独自のインタラクティブ・
デバイスを作る
Arduino
とは
•
情報/電子回路をまたぐプロトタイピングを支援する
プラットフォーム
• Arduino
デバイスとPC上のプログラミング環境から構成
–Atmel AVR マイコン、入出力ポートを備えた基盤
• AVR
マイコン: ATmega328P
用語定義
• Arduino
デバイス → Arduino
• Arudino
IDE →
開発環境 or IDE
–(スケッチ → プログラム)
デバイス構成(メイン)
入出力ピン
USB
コネクタ
デバイス構成(メイン)
入出力ピン
USB
コネクタ
電源コネクタ
PC
に接続
プログラミング/ 通信/給電電源に接続
※単体動作時のみ電子回路に接続
デジタル入出力/ アナログ入出力デバイス構成(サブ)
LED(
電源)
LED(
通信)
リセットボタン
LED(
テスト)
マイコン
入出力コネクタの構成
デジタル入力/出力
アナログ入力
GND
GND
VCC
Arduino
の使い方(情報)
• PC
上でプログラム作成
–C/C++ ベース
• PC
とUSBケーブルで接続してプログラム書き込み
PC (Win/Mac)
Arduino
USBケーブル プログラム書込前回の復習
•
演習
–総合開発環境の(IDE)のインストール
–Arduinoの基盤のLEDを点滅させる
Arduino
の使い方(電子回路)
•
ブレッドボード上にセンサ/電子部品を配置
Arduino
の基盤のLEDを点滅させる
&
Arduino
にLEDを取り付けて点滅させる
Arduino
の基盤のLEDを点滅させる
&
Arduino
にLEDを取り付けて点滅させる
void setup() {
pinMode(
13
, OUTPUT);
}
void loop() {
digitalWrite(
13
, HIGH);
delay(500);
digitalWrite(
13
, LOW);
delay(500);
}
デジタル入出力[0-13]
setup()
, loop()の説明
• Arduino
のプログラムは必ずsetup()とloop()という2つの特別
な関数を持っている
–Setup()はスタート時に1度だけ呼び出される
•
ピンモードやライブラリの初期化といった処理に使用
–Loop()関数はプログラムの心臓部であり、繰り返し実行
•
内部に無限の繰り返しを入れないこと
– for(;;)やwhile(1)
int main()
{
init();
setup();
for(;;)
loop();
return 0;
}
実際の処理の概要ブレッドボード(ソルダーレス・ブレッドボード)とは
•
はんだ付けが不要な,実験,評価,試作に用いる基板
–各種電子部品やジャンパ線を差し込むだけで電子回路を組める
•
ボード内部に導体が埋め込まれている
ブレッドボード(ソルダーレス・ブレッドボード)とは
•
はんだ付けが不要な,実験,評価,試作に用いる基板
–各種電子部品やジャンパ線を差し込むだけで電子回路を組める
•
ボード内部に導体が埋め込まれている
ブレッドボードの仕組み
•
ブレッドボードはどの穴とどの穴が
繋がるという仕組みが決まっている
•
両側の赤線/青線の穴は
縦一直線
に全部つながっている
–2本の赤線同士はつながっていない
–2本の青線同士もつながっていない
•
中央の1~30の穴は
横一直線
に
繋がっている
–ただし,中央の溝を挟んで
左側/右側で分かれる
•
各数字のa~eとf~jの
5
穴ずつ
(デジタル)テスタとは
•
電気的な測定値をディスプレイに数字で
表示する計測器
–ディスプレイ/各種スイッチ/リードから構成
–アナログ-デジタル(A/D)変換回路を利用
•
電圧 / 電流 / 抵抗の測定
•
ブザーにより通電状態を確認
ブレッドボードの通電確認
•
両側の赤線/青線の穴の通電
チェック
–赤線/青線縦一列
–左右の赤線同士は未接続
•
中央の1~30の穴の通電チェック
–a~eとf~jの
5
穴
ずつ
–中央の溝を挟むと未接続
演習1:タクトスイッチでLEDを点灯させる
•
ブレッドボード上にタクトスイッチを配置
• Arduino
の入出力ピンとブレッドボードを接続
–ミニマムなインタラクティブ・デバイス
1-1
ブレッドボード
1-2
プログラム
1-3
コンパイル&
アップロード
1-4
動作確認
入出力ピンはこれ
入出力ピンの詳細
デジタル入出力
アナログ入力
GND
GND
VCC
1-1
ブレッドボードに部品を挿す
•
プッシュスイッチを
中央の溝に沿って配置
–
向きに注意!
•
足が届く方向に.
• Arduino
に接続
–7番ピンとGNDピン
7 GND1-2:
プログラムを書く
const int SW = 7;
// Pushbutton Pin
const int LED = 13;
// LED Pin
int state = 0;
void
setup()
{
pinMode(LED, OUTPUT);
pinMode(SW , INPUT);
digitalWrite(SW, HIGH);
//おまじない
}
void
loop()
{
state = digitalRead(SW);
if (state == HIGH) {
digitalWrite(LED, HIGH);
}
else {
digitalWrite(LED, LOW);
}
}
定数・変数
条件分岐
(if文)
const: constant (
定数)
int: integer (
整数)
1-3:
コンパイル&アップロード
•
エラーが出たら,エラー箇所を修正
–分からない場合はTAに質問すること
コンパイル中
成功
失敗
コンパイル中
アップロード中
成功
1-4:
動作確認
•
ボタンを押している間だけLEDが光るように
–下記部分を修正
state = digitalRead(SW);
if (state ==
LOW
) {
digitalWrite(LED, HIGH);
}
else {
digitalWrite(LED, LOW);
}
参考: プログラムの説明
const int SW = 7; //タクトスイッチはデジタルピン7に接続 const int LED = 13; //LEDはデジタルピン13に接続
int state = 0; //スイッチの状態を格納する変数 void setup() {
pinMode(LED, OUTPUT); // LEDのピンを「出力」に設定 pinMode(SW , INPUT); // スイッチのピンを「入力」に設定 digitalWrite(SW, HIGH); //おまじない
}
void loop() {
state = digitalRead(SW); //スイッチの状態を「state」に格納 if (state == HIGH) { //スイッチの入力がHIGHの時
digitalWrite(LED, HIGH); //LEDを点灯 }
else { //スイッチの入力がLOWの時 digitalWrite(LED, LOW); //LEDを消灯
} }
参考: 関数リファレンス(1)
• pinMode(pin, mode)
–ピンの動作を入力か出力に設定
• [パラメータ]– pin: 設定したいピンの番号
– value: INPUTかOUTPUT
• [戻り値] – なし• digitalWrite(pin, value)
–HIGHかLOWを指定したピンに出力
• [パラメータ]– pin: 出力するピンの番号
– value: HIGHかLOW
• [戻り値] – なし参考: 関数リファレンス(2)
• delay(ms)
–プログラムを指定した時間だけ止める
• [
パラメータ]
– ms:一時停止する時間.単位はミリ秒• digitalRead(pin)
–指定したピンの値を読み込む.結果は
HIGHかLOWとなる• [
パラメータ]
– pin: 読みたいピンの番号• [
戻り値]
– HIGHかLOW参考: 回路図
LED
演習2:抵抗によるLEDの輝度の制限
• LED
をブレッドボード上に配置する
–LEDには抵抗をセットでつける
•
電流制限(明るさ抑制)用
– 330Ω(橙橙茶金)–GNDを両端の穴を使って共通化
• Arduino
とブレッドボード間の配線を減らす
• LEDに大きな電流が流れると壊れる 抵抗を入れて電流を調整抵抗の値の読み方
•
カラーコード(4本の線)で値を表す
•
判別しにくく,覚えにくい
–「抵抗 カラーコード」で検索する
–テスターで調べる
数値 位取り 誤差
抵抗の理解
•
キット内の抵抗を付け替えてみる
–270Ω抵抗(赤紫茶金) x 1
–330Ω抵抗(橙橙茶金) x 1
–1kΩ抵抗(茶黒赤金) x 3
–10kΩ抵抗(茶黒橙金 ) x 2
•
キット内のLEDも付け替えてみる
参考: オームの法則
•
𝐼𝐼 =
𝑉𝑉
𝑅𝑅
※I
=電流 (A),V= 電圧(V),R=抵抗(Ω)
– 抵抗が高くなると,流れる電流が減る
– 流れる電流が減ると,LEDが暗くなる
•
状態提示用途では通常10~20mA程度
1KΩ 10KΩ 100KΩ参考: 回路図
LED
プッシュスイッチ
演習2: トグル機能の実装
•
タクトスイッチを「押すたび」にLEDの点灯/消灯を切り替える
トグルのソースコード
(簡易版)
const int SW = 7; const int LED = 13;
boolean state = 0; boolean ledState = 0; void setup() { pinMode(LED, OUTPUT); pinMode(SW, INPUT); digitalWrite(SW, HIGH); //おまじない } void loop(){ state = digitalRead(SW); if (!state) { ledState = !(ledState); } if (ledState) { digitalWrite(LED, HIGH); } else { digitalWrite(LED, LOW); } }
int: Integer
(整数)
boolean: (
真偽値,1 or 0)
プルアップ抵抗・プルダウン抵抗
•
マイコンの入力にHIGHかLOW信号を確実に伝える為に
取り付ける
•
抵抗がない場合はHIGH/LOWの状態が不安定となる
–HIGHなのにLOWとなったり、LOWなのにHIGHとなったりして
マイコンが誤動作を起こす
プルアップ抵抗 プルダウン抵抗Aruduino
でのプルアップ抵抗
•
プルアップ抵抗を有効にする
–pinMode(SW, INPUT_PULLUP);
•
次でも同様の効果
–pinMode(SW, INPUT);
–digitalWrite(SW, HIGH);
スイッチ入力の安定化
•
前回の回路の復元
–スイッチを押したときの通電箇所をテスターでチェック
330Ω
13
7
GND簡易版トグルの問題点
• LED
の状態が不安定
–プッシュスイッチの機構の問題
•
スイッチを押してから,接点が
安定するまでに時間がかかる
–マイコンの動作速度はかなり高速
• 16MHz = 1
命令 62.5 ns
– 1sec = 1000msec = 1000000usec
10~50 μsec
チャタリング
•
スイッチの接点がバウンドする
現象
–押した瞬間/放した瞬間に生じる –簡単なフィルタ処理が必要トグルのソースコード 1
const int SW = 7; const int LED = 13; boolean state = 0; boolean statePre = 0; boolean ledState = 0; void setup() { pinMode(LED, OUTPUT); pinMode(SW, INPUT_PULLUP); } void loop(){ state = digitalRead(SW); if (state && !(statePre)) {
ledState = !(ledState); delay(10); } statePre = state; if (ledState) { digitalWrite(LED, HIGH); } else { digitalWrite(LED, LOW); } }
pinMode(SW , INPUT);
digitalWrite(SW, HIGH);
pinMode(SW, INPUT_PULLUP);
キー処理
•
押している間の処理
–if (!state)
•
押した瞬間の処理
SW_OFF SW_ON ON OFF SW_OFF SW_ON ON OFF•
チャタリングによる誤動作の防止
–簡単なフィルタ処理
チャタリングの処理
SW_OFF
SW_ON
1 1 0 0 1 void loop(){ state = digitalRead(SW); if (state && !(statePre)) {ledState = !(ledState);
delay(10);
}
フラグを使用したキー処理
if (!state) {
if (!flag) {
処理を記述
}
flag = 1;
}
else
flag = 0;
SW_OFF SW_ON ON OFF 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 flagトグルのソースコード 2
const int SW = 7; const int LED = 13; boolean state = 0; boolean flag = 0; boolean ledState = 0; void setup() { pinMode(LED, OUTPUT); pinMode(SW, INPUT_PULLUP); } void loop(){ state = digitalRead(SW); if (!state){ if (! flag ){ if (ledState ){ ledState = 0; } else{ ledState = 1; } flag = 1; } } else{ flag = 0; } if (ledState) { digitalWrite(LED, HIGH); } else { digitalWrite(LED, LOW); } }
トグルのソースコード 2
const int SW = 7; const int LED = 13; boolean state = 0; boolean flag = 0; boolean ledState = 0; void setup() { pinMode(LED, OUTPUT); pinMode(SW, INPUT_PULLUP); } void loop(){ state = digitalRead(SW); if (!state){ if (! flag ){ if (ledState ) ledState = 0; else ledState = 1; flag = 1; } } else flag = 0; if (ledState) digitalWrite(LED, HIGH); else digitalWrite(LED, LOW); }
•
チャタリングによる誤動作の防止
–簡単なフィルタ処理
チャタリングの処理
SW_OFF
SW_ON
SW_OFF
SW_ON
0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 2 3 4 5 6 7 8 9 10 0 0 0 0 0トグルのソースコード 3
const int SW = 7; const int LED = 13; boolean state = 0; int flag = 0; boolean ledState = 0; void setup() { pinMode(LED, OUTPUT); pinMode(SW, INPUT_PULLUP); } void loop(){ state = digitalRead(SW); if (!state){ if ( flag < 250 ) flag ++; if ( flag = = 200 ){ if (ledState ) ledState = 0; else ledState = 1; } } else flag = 0; if (ledState) digitalWrite(LED, HIGH); else digitalWrite(LED, LOW); }