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