ものづくり基礎工学(情報工学分野)
前回の内容
◆
マイクロコンピュータにおけるプログラミング
●
PC上で作成,コンパイル→マイコンに転送,実行
◆
プログラムを用いて外部の装置を動作させる
●
LED:turnOnLed,turnOffLed
●
LCD:printf
◆
プログラムを用いて外部の装置の状態を読み取る
●プッシュスイッチ:
getPushSW
●ディップスイッチ:
getDipSw
●スイッチの状態によって関数の戻り値が変わる
●戻り値の値を変数に代入する
◆
状態に応じて動作を変える
●
if文
int dip; ・ ・ ・今回の内容
◆
物理量を読み取る装置の利用
●
A/D変換器
●距離センサ
◆
プログラムを用いて外部の装置を動作させる
●モータ
◆
状態に応じて動作を変える
●
2つ以上の場合に分ける
◆
外部の状況に応じた機器の制御
マイコンに内蔵されているH8/3048F–ONE
マイコン
A/D変換器を用いた電圧計
A/D変換器
0 1 ・ ・ ・ 1022 1023乾電池
LCD
●マイコンに内蔵された
A/D変換器
を利用する.
●得られた整数値をプログラムで電圧値に変換して
LCDに表示する.
距離センサ
電圧値に変換
0.00~5.00A/D変換器
A/D変換器
A/D =
A
nalog to
D
igital
電圧値
(アナログ)
(ディジタル)
整数値
とびとび(離散) 連続 範囲内のどのような値も取り得る →無限大の情報量 ↓ プログラムで利用できない 0~1023の範囲の値 →210通り=10[bit]の分解能 ↓ プログラムで利用できる入力された電圧値に応じた整数値を出力する
センサ(電圧を出力する)からの 情報を受け取って処理できるA/D変換器を用いた電圧計
-リスト
4.2.1(06battery.c)-
引数で指定した回数変換し,平均を取る. ●細かな変動を取り除く. ●1000と記述されているのと同じ. ●電圧値をA/D変換する. ●A/D変換値を電圧値に変換 する. ●電圧値を返す. LCDに表示 電圧(実数)を保存 するための変数の宣言 #define avNum 1000 void main(void) { double v; initMicon(); clearScreen(); while(1){ v=getVoltage(avNum); gotoxy(0,0); printVoltage(v); } } #define avNum 1000CN1,CN2,CN3は外部の装置 とマイコンの間で信号(小さな 電流を伴う電圧の変化)のやり 取りを行なうために用いる 電源用コネクタ
マザーボード上のコネクタ
CN2 この位置は16番ピン CN2–16と表わす ピン番号 1 2 19 20 10 CN2 GND 5V CN3 外部の装置に電源を供給する GND:電圧の基準 5V :GNDに対して5[V]を出力する CN1 (コネクタ1)電池ケースの接続
ー課題
4.1(1) ー
赤色の導線はここに 12番ピン:CN2–12 ピン番号 単3形乾電池 +極 −極 1 2 19 20 10 CN2 GND 5V 黒色の導線はこの列のいずれかに 電池 ケース距離センサの接続
ー課題
4.1(2) ー
緑色の導線はここに 12番ピン:CN2–12 1 2 19 20 10 CN2 GND 5V 黒色の導線はこの列のいずれかに 赤色の導線はこの列のいずれかに距離センサの入出力端子と動作
距離に応じた電圧が 出力される 反射された 赤外線を受ける 赤外線が出ている ↓ 携帯電話のカメラや ディジタルカメラで見ると 光って見える 受光された赤外線の位置 から距離を計算する 動作用の電圧を 加える 入出力電圧の基準 = GND 5V Vo測定の方法
ー課題
4.1(2) ー
距離センサ
A4版の紙
↓
実験テキストも
同じ大きさ
誤差と誤差率の計算
ー課題
4.1(2)[iv]ー
●
誤 差
(誤差)=(測定値)-(真の値)
●
誤差率
(誤差)
(真の値)
×100
(測定値)-(真の値)
(真の値)
×100
(誤差率)
[%] =
=
正の誤差(率)= 測定値が真の値より大きい
負の誤差(率)= 測定値が真の値より小さい
課題4.1(2)では A4長辺の長さ=29.7[cm]誤差と誤差率には符号がつくことに注意する
測定値と真の値の大小関 係によって符号が変わる有効数字
●
有効数字
信頼の置けない桁以下を四捨五入し,打ち切って表した値
例
2.85=真の値は2.845以上2.855未満の範囲にある
●
有効数字の桁数
2.85 = 有効数字3桁
0.0285 = 有効数字3桁,先頭の0は有効数字ではない
0.002850 = 有効数字4桁,末尾の0は有効数字である
有効数字の桁数は,小数点以下の桁数とは意味が異なる
.
信頼の置ける桁数 ↓ 相対的な誤差の大きさ 絶対的な誤差の大きさ誤差を含む値の計算
●
和と差
誤差が最も大きい数値を調べ,その末位よりも
1位下まで
計算し,最後の桁を四捨五入する.
例
1.89−0.523 = 1.367 = 1.37 有効数字の 桁数を0.5に 合わせる=1桁●
積と商
有効数字の桁数が最も少ない数値を調べ,それよりも桁数が
1
桁余分になるように計算し,最後の桁を四捨五入する.
例
31.4÷29.7 = 1.057 = 1.06 0.5÷29.7 = 0.016 = 0.02 誤差が最も大きい値 (小数第3位は信用できない) 有効数字の桁数を 31.4(29.7)に 四捨五入 一旦,1.89を1.890と みなして計算 一旦,1桁余分に計算 四捨五入課題
4.1(2)における計算
●
電圧から計算される距離
小数第
1位まで求める.
●
誤 差
計算した距離,真の値とも小数第
1位まで求められている
ので,小数第
1位まで求める.
誤差の大きさによって有効数字の桁数が変わる.
●
誤差率
求めた誤差によって有効数字の桁数が変わる.
この課題では,真の値は有効数字
3桁であるので,
誤差が有効数字
2桁→誤差率も有効数字2桁となる
誤差が有効数字
1桁→誤差率も有効数字1桁となる
例 誤差が1.2[cm]:有効数字2桁 誤差が0.8[cm]:有効数字1桁距離センサと
A/D変換器を用いた距離計
●距離センサによって,距離に応じた電圧を生成させる.
●マイコンに内蔵された
A/D変換器を利用する.
●測定された電圧から距離を計算する.
(メーカ発行のデータシートによる)
H8/3048F–ONE
マイコン
A/D変換器
0 1 ・ ・ ・ 1022 1023LCD
距離センサ
電圧値に変換
0.00~5.00距離に変換
電圧を出力距離センサと
A/D変換器を用いた距離計
ーリスト
4.2.2(07distance.c)-
電圧値から距離を 求める処理 この部分はリスト4.2.1と同じ ↓ 1000回A/D変換をして電圧の 平均値をLCDに表示する 計算して求めた距離をLCDに表示する #define avNum 1000 void main(void) { int i,data,distance; double v; initMicon(); clearScreen(); while(1){ v=getVoltage(avNum); gotoxy(0,0); printVoltage(v); distance=calcDistance(v); gotoxy(0,1); printf("distance:%4d cm",distance); } } この部分はリスト4.2.1と同じ ↓ 1000回A/D変換をして電圧の 平均値をLCDに表示する 距離センサの 出力電圧これらの電圧の組み合わせで モータを制御する
モータ実験基板
IN1 モータ制御用信号1 IN2 モータ制御用信号2 5V モータ,モータコント ロールIC ,ロータリー エンコーダ用の電源 GND モータ実験基板 モータコントロールIC (モータドライバ) ●モータの回転を制御する. ●モータを駆動するための ロータリーエンコーダ (回転角度センサ) ●モータの回転角度を 検出する. モータモータ実験基板の接続
IN1:CN3–15 IN2:CN3–16 5V:5V GND:GND モータ実験基板 正転 (CW) 逆転 (CCW)高速正転
モータの制御
(1)
-リスト
4.2.3(08motor1.c)-
void main(void) { initMicon2(); while(1){ /*Motor0 高速正転と停止*/ gotoxy(0,0); printf("Motor0: 100"); drive(0,100); waitms(1000); gotoxy(0,0); printf("Motor0: 0"); drive(0,0); waitms(1000); } 高速正転したまま待つ 停止 停止したまま待つモータ制御関数
drive(モータ実験基板の番号,
モータの出力
);
−100~100の範囲の整数で指定 符号:回転の向き 正の値:正転 負の値:逆転 絶対値:回転の速度 (0は停止) 制御するモータ実験基板の番号 0:IN1とIN2をCN3–15とCN3–16に接続 1:IN1とIN2をCN3–17とCN3–18に接続 正転(CW) 逆転(CCW)●
回転の向きの定義
ディップスイッチによるモータの制御
-リスト
4.2.5(10motor3.c)-
void main(void) { int dip; initMicon2(); while(1){ dip=getDipSw(); drive(0,dip); gotoxy(0,0); printf("dip=%3d",dip); } } ディップスイッチの状態を 記憶するための変数の宣言 ディップスイッチの 状態を読み取り ↓ dipには0~255の整数 値が代入される dipの値に応じて回転 ↓ この場合正転または停止if文
2つの場合に分けて処理を行なう
-
if~else-
if~elseのひな形
if(
条件式
) {
条件が満たされた場合の処理
} else {
条件が満たされない場合の処理
}
条件が満たされ ない場合は何も しない 条件の判断 条件が満たされ 条件が満たされた 場合の処理3つ以上の場合に分けて処理を行なう
-
if~else if~else-
if~else if~elseのひな形
if(
条件式1
) {
条件式1が満たされた場合の処理
} else if( 条件式2 ) {
条件式1が満たされず,
条件式2が見たされた場合の処理
} else if( 条件式3 ) {
条件式1,2が満たされず,
条件式3が見たされた場合の処理
}
・
・
・
} else {
上記の条件がすべて
満たされない場合の処理
}
if~else if文課題
4.5のプログラム例1
ヒント(1) ヒント(2) ヒント(4) void main(void) { int dip; プッシュスイッチの状態を記憶するための変数を宣言 initMicon2(); while(1){ プッシュスイッチの状態を読み込み dip=getDipSw(); if( S0のみが押された ) { モータ0をdipで指定された速度で正転 } else if( S2のみが押された ) { モータ0をdipで指定された速度で逆転 } else { モータ0停止 } gotoxy(0,0); printf("dip=%3d",dip); } } ヒント(3) ヒント(4) ヒント(5) ヒント(5) ヒント(5)課題
4.5のプログラム例2
void main(void) { int dip,speed; プッシュスイッチの状態を記憶するための変数を宣言 initMicon2(); while(1){ プッシュスイッチの状態を読み込み dip=getDipSw(); if( S0のみが押された ) { dipで指定された速度で正転するよう speedの値を設定 } else if( S2のみが押された ) { dipで指定された速度で逆転するよう speedの値を設定 } else { 停止するようspeedの値を設定 } モータ0をspeedの値に応じて回転させる gotoxy(0,0); printf("dip=%3d speed=%3d",dip,speed);課題
4.6
表のようにまとめる
スイッチを押す前のモータの状態 正 転 逆 転 停 止 S0 S1●スイッチを押してから離したとき,モータの動作はどのように
変わるか.
●スイッチを押す前と比較する.
スイッチを押し続けたとき スイッチを押してから離したとき S2 S3●表のようにスイッチを操作したとき,モータの動作はどう
なるか.
●あらかじめモータを回転させておく.
powerが・・・ という解答は 不可 変数の値の変化 を問うているの ではないモータ基板1 距離センサ GND:GND