千葉工業大学
未来 学科
実習用制御回路
mbed4adrobo
ー
2017 年 5 月
千葉工業大学
未来 学科
目次
.実習用制御回路 関
. 未来 学科実習用 mbed
. mbed 関
. mbed4adrobo 回路図, ン配置
. 環境 構築
. ン ー
. MDK-ARM ン ー
. teraterm-4.86 ン ー
. ン ン ー 動作確認
. 環境構築 Q&A
. 環境 使い方
. ン
. LED 点灯
. 時間 制御
. 入力
. USB 介 通信
. ー 制御
. ー ー 制御
. A/D 変換 セン 値 取得
. GPIO 使用 入出力
. ー ン ー ン
.最後
.実習用制御回路 関
. 未来 学科実習用 mbed (mbed4adrobo)
未来 学科 ,学生実習用 独自 制御回路 開発
提供 い .mbed(mbed4adrobo) 呼 本 ー ,
身 回 多く使用 い ARM いう CPU 使用 ,自動的
制御 機械 製作 簡易的 体験 う い .
本 ー ,主 以下 特徴 あ .
・ 開発 比較的簡単 .
mbed標準 環境 開発 .
・様々 外部機器 接続 利用 .
接続 機器 ,主 以下 通
・LED 個 実装済
・ 個 実装済
・RC 用 ー ー 個
・ ー 個
・汎用入出力 個
・セン 出力 個
・SPI 個
・I2C 個
ARM
ー ンや ー
機 様々
使用 い .
. mbed
mbed ン ARM社 ン 用ワン ー
ン びそ ン 環境 指 .
多く mbed 制御 ,種類 増え い .mbed 使
用 開発 ,様々 電子機器 制御 基本 学
ぶ . 上 資料や ン 多数あ
,是非覗い い う.
参考
http://mbed.org/
. mbed4adrobo 回路図, ン配置
. 環境 構築
. ン ー
開発環境構築 必要 ン ー 行い .
以下 セ ン ー 行 く い. ,
以下 動作確認 行 ー ン ,最新 ー ン 動
作 思い .
Keil uVision5 (720MB)
http://www.keil.com/download/product/ MDK523.EXE
※途中 Legacy Support ン ー う
指示 あ . ン ー 下 い.
teraterm-4.94
http://sourceforge.jp/projects/ttssh2/releases/ teraterm-4.94.exe
ン
https://sites.google.com/site/mbed4adrobo/download/ mbed_projectXXXXXX.zip (XXXXXX ー 日付)
MDK v4 Legacy Support (340MB) http://www2.keil.com/mdk5/legacy/ MDKCM523.EXE
※
ソ ン ー 時間程度 あ
. 注意下 い.
mbed 標準的 開発 環境 ,無料 使用
.
通信用 ー
ン .
実習用 作成 環
境 ン
. 改造
独自 作
成 .
. MDK-ARM ン ー
MDK-ARM mbed 開発環境 ,C++言語 作成 ,
,転送 行う .
URL 入力 く い.
http://www.keil.com/download/product/
ン ー [MDK-ARM] く い.
質問 回答 く い.
入力 [Submit] く い.
590MB ほ あ
, ン ー 時間
あ
.
大学 情報 以下
.
Company:
"Chiba Institute of Technology"
Address:
" 2-17-1, Tsudanuma"
City:
"Narashino, Chiba"
ZIP/Postal Code:
"275-0016"
" MDK523.EXE" ン ー 下 い.
ン ー " MDK523.exe" 下 い.
ン ー 起動 ,適宜質問 回答 ,[Next>>]
押 く い.
ン ー 開始 .
ン ー 終了 ,"KEIL uVision5" ー 下 い.
開発環境 起動 確認 下 い. 起動 確認 ,
ソ 終了
下 い.
. teraterm-4.94 ン ー
teraterm 通信 く使用 ソ , 実習
mbed 通信 使用 .
URL 入力 く い.
http://sourceforge.jp/projects/ttssh2/
ン ー [Tera Term 4.94] 下 い.
[teraterm-4.94.exe] .
通信 ,mbed 計
測 ー 直接観
察 .
ー ン
構い .
ン ー " teraterm-4.90.exe " 下 い.
ー ン 制御 い 選択 下 い.
ン ー 言語 選 下 い.
ー 起動 ,質問 回答 ン ー 開始
.
日本語以外 構い
.
[標準 ン ー ] 選択 下 い.
"Tera Term" ー 下 い.
開発環境 起動 確認 下 い.以上 ,Tera
Term ン ー 終了 .
起動 確認 ,
ソ 終了
下 い.
. ン ン ー 動作確認
本実習 使用 mbed , 実習 独自 開発 .
そ ,開発環境 少 特別 . , ン
書 込 ン ー 動作 確
認 .
URL 入力 下 い.
http://sites.google.com/site/mbed4adrobo/download/
[ ン ー ] 下 い.
圧縮 展開
圧縮 mbed_project.zip 展開 下 い.
Windows 標準機能
展開 ,別 ソ
使用
展開 構い .
展開 確認 . ,以下
.
[mbed_project.uvproj]
KEIL 起動 .
[Install Legacy Support] . 関連付け う くい
い い 起動
い あ .
関連付け 行う 起
動 う
.
左 [main.cpp]
,
見 う.
[Download Legacy Support for Cortex-M Devices]
.
"MDKCM523" ー 下 い.
ー ン 制御 い 選択 下 い.
ン ー 起動 ,適宜質問 回答 ,[Next>>]
押 く い.
以下 [Build] ン ,[F7] 押
く い.
ン ー mbed USB ー 接続 下 い.赤い LED
ン 点灯 確認 う.
正常 完了
, 下 [Build Output] ン
[0 Error(s), 0 Warning(s)]
出 .
初 接続 時
ン
ー 行い .
ン
ー いう
セー 待 次
進 下 い.
, 時 ー
ン ー 開始
い場合 ,以下 ン
以下 [Download] ン 下 い.
以下 う ン 表示 ,書 込 始 . セー 表
示 い場合 ,次
ー
[環境構築 Q&A]
[ 書 込
い場合]
進 下 い.
次 以下 う ,Tera Term 起動 , セー 表示
.
以上 開発環境 準備 完了 .途中 問題 発生 場合 ,
次 ー 参考 対処 下 い.
う セー
表示 い場合
,次 ー
[環境構築 Q&A] [Tera Term 起動 い 場合]
進 下 い.
. 環境構築 Q&A
, 環境 構築時 起 や い問題 関 Q&A
示 .
. . 書 込 い場合
前節 . う 書 込 い場合 対処法 示 .
[Window]+[r] 押 下 い.
[ 名 指定 実行] ン 出 ,"cmd" 入
力 ,[OK] 押 下 い.
ン ン 起動 ,"mode" 入力 ,改行
下 い.
[Window] ー
mode 通信関
連 機器
ン .
"COM[数字]" いう う 通信 ー あ く い. ,
mbed USB 抜 差 ,そ 変化 見 下 い.
例 mbed USB ー 抜い 場合
例 mbed ー 挿 場合
変化 い場合 , 問題 発生 い そ あ
, PC 再起動 下 い.
そ 問題 解決 い場合 ,TA 呼 下 い.
接続前 COM 表示
あ .
抜 差 前後 COM
新 追加 い
通信 条件
.
時,複数 COM
ー あ 場合 ,
追加 COM ー
番号 最 大 値
い
COM 数字 一桁 あ
,書 込 条件
. 条件 満 い場合 ,[
ネー ] COM 番号
最大 う 変
更 下 い.
. . Tera Term 起動 い場合
前節 . う TeraTerm 起動 い場合 対処法 示
.
ン ー 展開 [mbed_project] auto_write.bat
帳 開 .
以下 Tera Term ン ー 変更 . 実 行
ttpmacro.exe 変更 い 下 い.
, ン ー 探 方 ,一般的 c
[Program Files] く ,[Program Files (x86)] あ ,開 い 見 け 下 い.
完了 . 通信 い場合 TA 呼 下
い.
. 環境 使い方
現在作成中
. ン
習う 慣 面 あ , ン 入力
,動作 確認 いく 重要 . ,基本
ン 示 ,mbed4adrobo 動作 確認
い う.
. LED 点灯
,LED 点灯 ン .
1-1 LED1点灯
LED1 点灯 思い . ,次 隣 LED2 点灯
う.
1-2 LED点灯 緑色
LED2 点灯 思い . ,次 隣 LED3 点灯
う.LED 2進数 ON/OFF 表 注意 ,LED
自由 点灯 う う.
#include "mbed.h"
BusOut led(LED1, LED2, LED3, LED4);
int main() { led = 1; return 0; }
#include "mbed.h"
BusOut led(LED1, LED2, LED3, LED4);
int main() { led = 2; return 0; }
. 時間 制御
点灯 ,次 時間 点滅 作 .
0.5秒毎 LED ON OFF 繰 返 行い .
2-1 LED点滅
0.5秒 停止 ,LED ON OFF 繰 返 . う ,時
間 使 制御 簡単 .
#include "mbed.h"
BusOut led(LED1, LED2, LED3, LED4);
int main() { while(1){ led = 1; wait(0.5); led = 0; wait(0.5); }
}
. 入力
入力 LED 点滅 う.
3-1 LED 点灯・消灯
入力 ON/OFF LED 点灯 い . ,
離 点灯 ,押 消灯 分 思い .
実 mbed4adrobo 基板上 押 い時 High(1) ,押
い Low(0) . 電子回路 学ぶ 再度
解説 ,普段 感覚 逆 覚え い 下 い.
, 関連 ,
sw.mode(PullUp);
いう行 あ . 押 い時 上(Up) 引 張
(Pull) いう , 押 い い時 ,入力 確
実 High う 必要 命令 .
う , 入力 出力信号 間 以下 関係 あ
.
SW1
ON OFF
SW2 ON 2進数 00 (=0) 2進数 01 (=1)
#include "mbed.h"
BusOut led(LED1, LED2, LED3, LED4); BusIn sw(SW1, SW2);
int main() { sw.mode(PullUp); while(1){
led = sw; }
}
次 ,SW1 押 LED1 点灯 う う. ,SW1
ON 0 ,以下 う 条件分岐 良い
分 .SW 使用 い宣言 い 気 け く
い.
3-2 LED 点灯・消灯
う ,周辺機器 接続 く mbed4adrobo け 学
く あ . ン 基 ,LED
使用 いく 作 う.
課題
SW1 押 左 右 ,SW2 押 右 左 LED 光 流
う 作 う.
#include "mbed.h"
BusOut led(LED1, LED2, LED3, LED4); BusIn sw(SW1);
int main() { sw.mode(PullUp); while(1){
if (sw == 0){ led = 1; } else { led = 0; }
} }
. USB 介 通信
セー 表示 う. ,USB 通
通信 ,文字列 ー 送受信 行い .
4-1 セー 送信
,上記 ,LED 使い ,初期設定
行 い .使わ い時 初期設定 い 問題 発生
あ ,本 ン 常 初期設定 行う う
う.
#include "mbed.h"
BusOut led(LED1, LED2, LED3, LED4);
int main() { led = 0;
printf("Hello World\r\n"); return 0;
}
そ , 応用 , 状態 表示 う う.
4-2 状態 表示
, ンソー 入力 セー ー
う. 文字 入力 Enter 押 表示 .
4-3 受信 セー 送信 ー
実行 入力 文字 表示 け 思う ,
一度 mbed 送 ,そ ー 表示 い .
#include "mbed.h"
BusOut led(LED1, LED2, LED3, LED4); BusIn sw(SW1, SW2);
int main() { int state = -1; led = 0;
sw.mode(PullUp); while(1) {
if (state != sw) {
if (sw & 0x01) printf("SW1 OFF "); else printf("SW1 ON ");
if (sw & 0x02) printf("SW2 OFF\r\n"); else printf("SW2 ON\r\n");
state = sw; }
} }
#include "mbed.h"
BusOut led(LED1, LED2, LED3, LED4);
int main() { char buf[100]; led = 0; while(1) {
scanf("%s", buf); printf("%s\r\n", buf); }
}
, ンソー 入力 数字 LED 点滅 う.
4-4 受信 ー LED 点灯・消灯
1 4 数字 入 ,そ 対応 LED 点灯,消灯
. う ,USB 介 遠隔操作 行う .
遠隔操作 方法 ,そ 遠隔操作 使用
.
#include "mbed.h"
BusOut led(LED1, LED2, LED3, LED4);
int main() { char buf[100]; led = 0; while(1) {
scanf("%s", buf); printf("%s\r\n", buf); int n = atoi(buf);
if (n > 0) led = led ^ (1 << (n - 1)); }
}
. ー 制御
ー 制御 行い .MOTOR1A 端子 ー 接続 下 い.
,本 ン ,外付け 部品 必要 ..
5-1 ー 制御
,Motor ,最大出力(motor = 1 時) 電源 25%
出力 い設定 い . 変更 ,
setMaxRatio(float max_ratio)
ratio: ー 比 最大値(0.0 1.0, 初期設定 0.25)
いう ソ あ ,問題 い場合 そ 使用 く
い.
, 個 ー 使用 場合 ,
Motor motor2(MOTOR2_IN1, MOTOR2_IN2, MOTOR2_PWM);
定義 下 い.
変数名 motor2 自由 設定 頂い 構い
#include "mbed.h"
#include "Motor.h"
BusOut led(LED1, LED2, LED3, LED4);
Motor motor1(MOTOR1_IN1, MOTOR1_IN2, MOTOR1_PWM);
int main() { led = 0;
float delta = 0.1f, i = 0.0f; while(1) {
i += delta;
if (fabs(i) >= 1.0f) delta *= -1.0f; printf("%f\r\n", i);
motor1 = i; wait(0.5); }
}
. ー ー 制御
SERVO1 ー ー 接続 動作 確認 . ー ー
初期位置 個々 異 ,適正 値 調整 下 い.
6-1 ー ー 制御
#include "mbed.h"
BusOut led(LED1, LED2, LED3, LED4); PwmOut servo1(SERVO1);
int main() { led = 0;
servo1.period_ms(20); while(1) {
for(int i = 1000; i <= 2000; i += 100){ printf("%d\r\n", i);
servo1.pulsewidth_us(i); wait(0.5);
} } }
次 初期位置 角度 ン 使 調 う.
6-2 ー ー 初期位置 調査
#include "mbed.h"
BusOut led(LED1, LED2, LED3, LED4); BusIn sw1(SW1), sw2(SW2);
PwmOut servo1(SERVO1);
int main() {
int val = 1500, val0 = 0; led = 0;
servo1.period_ms(20); sw1.mode(PullUp); sw2.mode(PullUp); while(1) {
if (!sw1) val += 10; if (!sw2) val -= 10; if (val != val0){
servo1.pulsewidth_us(val); printf("%d[us]\r\n", val); val0 = val;
}
wait(0.02); }
}
. A/D 変換 セン 値 取得
入力 値 取得 う.PSD 距離セン 接続 ,
値 変化 確認 下 い.
7-1 A/D変換 結果 表示
PSD 距離セン ー 制御 組 合わ ,あ 一定距離 保
.以下 ン 示 .
#include "mbed.h"
BusOut led(LED1, LED2, LED3, LED4); AnalogIn ad[] = {AD0};
int main() { led = 0; while(1) {
printf("%f\r\n", ad[0].read()); wait(0.2);
} }
#include "mbed.h"
#include "Motor.h"
BusOut led(LED1, LED2, LED3, LED4); AnalogIn ad[] = {AD0};
Motor motor1(MOTOR1_IN1, MOTOR1_IN2, MOTOR1_PWM); Motor motor2(MOTOR2_IN1, MOTOR2_IN2, MOTOR2_PWM);
int main() { led = 0; while(1) {
float val = ad[0].read(); printf("%f\r\n", val);
float i = (0.6 - val) * 3.0f; motor1 = i;
motor2 = -i; wait(0.5); }
}
ー 制御
呼 制御系
.
val 前 数字 変更 距離 変更
. GPIO 使用 入出力
GPIO 使用 音楽 演奏 う.GPIO 1 番目 端子
(P1_5) 圧電 ー 接続 ,以下 ン 実行
う. (SW1) 押 LED 点滅 ,音 流 .
8-1 GPIO 使用 音楽 演奏
#include "mbed.h"
#include "Sound.h"
BusOut led(LED1, LED2, LED3, LED4); BusIn sw(SW1);
Sound sound(GPIO1);
int main() {
int sound_data[] = {C4, D4, E4, F4, G4, A4, B4, C5}; sw.mode(PullUp);
while(1){ led = 0; while(sw);
for(int i = 0; i < (sizeof(sound_data)/sizeof(int)); i ++){ led = 1 << (i & 3);
sound = sound_data[i]; wait(0.4);
sound = 0; wait(0.1); }
} }
GPIO ,
General Purpose Input / Output 略 ,汎用入出 力 呼
次 PSD 連動 ,距離 応 音 LED 変化 装置 ン
示 .
8-2 距離 応 周波数 変化
#include "mbed.h"
#include "Sound.h"
BusOut led(LED1, LED2, LED3, LED4); AnalogIn ad[] = {AD0};
Sound sound(GPIO1);
int main() { led = 0; while(1) {
float val = ad[0].read(); printf("%f\r\n", val);
led = 0x0f >> (int)((0.9f - val) * 4); sound = 880 * val;
wait(0.2); }
}
. ー ン ー ン
ー ン ー 回転角度セン 読 取 う.GPIO
番 番 端子 ー ン ー 出力 接続 ,以下
ン 実行 う. ー 回転 ー
ン ー A相,B 相 出力信号 LED 点滅 確認 . ,
ー 回転時 計測 数 出力 .
9-1 ー ン ー ン
#include "mbed.h"
#include "QEI.h"
BusOut led(LED1, LED2, LED3, LED4); BusIn in(GPIO1, GPIO2, GPIO3, GPIO4);
QEI qei(GPIO1, GPIO2, NC, 48, QEI::X4_ENCODING); QEI qei2(GPIO3, GPIO4, NC, 48, QEI::X4_ENCODING);
int main() { in.mode(PullUp); while(1) {
printf("%d\r\n", qei.getPulses(), qei2.getPulses()); for(int i = 0; i < 100; i ++){
led = in; wait(0.01); }
} }
. 動作 用
10-1 ー ン ー ン
#include "mbed.h"
#include "Motor.h"
BusOut led(LED1, LED2, LED3, LED4); BusIn sw(SW1, SW2);
BusIn in(GPIO1, GPIO2, GPIO3, GPIO4);
Motor motor_left(MOTOR1_IN1, MOTOR1_IN2, MOTOR1_PWM); Motor motor_right(MOTOR2_IN1, MOTOR2_IN2, MOTOR2_PWM);
int main() { in.mode(PullUp); sw.mode(PullUp);
motor_left.setMaxRatio(1.0); motor_right.setMaxRatio(1.0); while(1) {
motor_left = 0.5 * !sw[0]; motor_right = 0.5 * !sw[1]; led = in;
wait(0.001); }
}
. 速度制御
ー PWM制御 ー ン ー 組 合わ 速度 制御
行い う.PI 制御 使用 , ー 速度 一定 保 .
#include "mbed.h"
#include "Motor.h"
#include "QEI.h"
BusOut led(LED1, LED2, LED3, LED4); Ticker control;
Motor motor_left(MOTOR1_IN1, MOTOR1_IN2, MOTOR1_PWM); Motor motor_right(MOTOR2_IN1, MOTOR2_IN2, MOTOR2_PWM); BusIn in(GPIO1, GPIO2, GPIO3, GPIO4);
QEI qei_left(GPIO1, GPIO2, NC, 48, QEI::X4_ENCODING); QEI qei_right(GPIO3, GPIO4, NC, 48, QEI::X4_ENCODING);
double speed_left_ref = 0.2, speed_right_ref = 0.2; double speed_left_lpf = 0.0, speed_right_lpf = 0.0; const double sampling_time = 0.020;
const double move_per_pulse = 0.0005; double i_left = 0.0, i_right = 0.0; const double ki = 10.0, kp = 1.0;
double low_pass_filter(double val, double pre_val, double gamma) { return gamma * pre_val + (1.0 - gamma) * val;
}
void control_handler() {
int enc_left = qei_left.getPulses(); int enc_right = qei_right.getPulses(); qei_left.reset();
qei_right.reset();
double speed_left = move_per_pulse * enc_left / sampling_time; double speed_right = move_per_pulse * enc_right / sampling_time; speed_left_lpf = low_pass_filter(speed_left, speed_left_lpf, 0.4); speed_right_lpf = low_pass_filter(speed_right, speed_right_lpf, 0.4); double delta_speed_left = speed_left_ref - speed_left_lpf;
double delta_speed_right = -speed_right_ref - speed_right_lpf; i_left += delta_speed_left * sampling_time;
i_right += delta_speed_right * sampling_time; motor_left = kp * delta_speed_left + ki * i_left; motor_right = kp * delta_speed_right + ki * i_right; }
int main() { in.mode(PullUp);
motor_left.setMaxRatio(1.0); motor_right.setMaxRatio(1.0);
control.attach(&control_handler, sampling_time); led = 1;
while(1){
led = (led << 1) | (led == 0x08); wait(0.5);
} }
ー 回転方向
ー ン ー 値
増加 方向 逆
場合 最大速度 回転
. ,向
一致 い 確認
,
実行 う く
い.
.最後
ン ー 制御 基本 学 い ,い
う .案外簡単 電子機器 操作 , 感 人 多い
い う .現在, ン ー 制御 世界 進化
,使いや い ー 世 中 生 出 い .そ 中
mbed 注目 開発環境 ,情報や ン 多く存在
.自発的 学ぶ 比較的容易 環境 思い ,是非
授業 け く,自分 色々 挑戦 い け 思い .