2020年8月31日月曜日

H30春ES午後1問2の解き方 冠水防止システム

感想

冠水防止システムの問題です。計算に使用する数値を見つけることができず、ミスが多かったです。
問題と解答は公式サイトに載っています→平成30年春

解答

  • 設問1
  • (1)停止指示の送信から停止までに水がに状態で30秒以上稼働して、ポンプが故障する可能性があるから
    (2)予測した貯水槽の水位と実際に計測した貯水槽の水位の差から判断する
    (3)a:1.25
    (3)b:4.2
    まず水が排水されなかったとして、5分後の水位を考えます。水位は5分で2.0m上昇しているので、同じペースの場合、5分後の水位は4.5mになっていると思われます。

    次にポンプの排水能力を考えます。ポンプは10mの水を28分で排水する能力があるが、排水開始までに3分かかるので1分当たりの排水能力は、10/25mとなります。
    ポンプが動き出すまでの時間は1.25分であるとこはすでに求めているので、ここから排水開始の3分を考慮すると排水が行われる時間は0.75分間です。
    この条件を基に計算すると、この間に排水できる水位は、10/25×0.75で0.3mになります。

    5分後に想定されていた水位の4.5mから0.3mを排水して回答を求めます。

  • 設問2
  • (1)メイン
    (2)a:支持を送信する時刻になったとき、ポンプの稼働指示又は停止指示をポンプ制御タスクに通知する
    (3)b:貯水槽の最新の水位
    (3)c:最新の貯水槽予測流入量
    (4)2592
    水位センサタスクが更新するデータサイズは、1台当たり2バイトであり、水位センサは50台あるので、(50×2)+4=104バイトが5分間に更新するデータである。
    貯水槽水位予測タスクが更新するデータサイズは、2+2=4バイトなので、5分あたり108バイトのデータが更新される。2時間(120分)の間に24回更新されるので、
    108×24=2592バイトが解答になります。

  • 設問3
  • (1)d:予測雨量流入量
    (1)e:各水位センサの最新の計測値
    (2)雨水流入量予測タスクが最新データ及び履歴情報にアクセスするときに履歴情報よりも先に最新データのセマフォを獲得するようにする。

2020年8月29日土曜日

H30春ES午後1問1の解き方 自律式小型マルチコプタ

問題の感想

ドローンの問題でした。簡単に感じました
問題と解答は公式サイトに載っています→平成30年春

解答

  • 設問1
  • (1)a:反対方向
    (1)b:揚力
    (1)c:重力
    (2)d:補正データ
    (2)e:回転数

  • 設問2
  • (1)情報:水平発行位置情報
    (1)制御:ずれを補正する方向へ回転させる
    (2)f:9
    (2)g:11

  • 設問3
  • (1)h:高度測定・障害物検知
    (1)i:無線信号の強度
    (1)j:障害物情報
    (2)k:移動方向に障害物がある
    (2)l:ホバリングに移行させる

2020年8月28日金曜日

H25春ES午後1問2の解き方 歩行ナビゲーションデバイス


問題の感想

歩行ナビゲーションシステムの問題です。
問題と解答は公式サイトに載っています→平成25年春

解答

  • 設問1
  • (1)検索に必要な方角を求められないから
    カメラのレンズが真上、または真下に向いている場合に、地図データベースの検索を中止する理由を問われています。
    カメラが真上、または真下を向いている場合、自分が向いている方向の情報を取得することができないので地図の向きを決めることができません。この状態では意図しない方向の情報を誤って表示してしまう可能性があるので位置データベースの検索を止めています。
    ちなみに私は、歩きスマホを気にして「歩行者が正面を向いていない事になり、危険だから」と間違ってしまっていていました。もっと機能寄りの回答を考えるべきでした。
    (2)ナビゲーション情報の表示が行われないから
    (3)交差点までの直線距離:195
    (3)交差点の方位:西南西
    現在位置から交差点までの距離を求めます。
    現在位置の座標は、北緯35度42分36.5秒、東経139度48分39.0秒で、
    交差点の座標は、 北緯35度42分34.0秒、東経139度48分31.8秒となります。

    この情報から、南に2.5秒、西に7.2秒進んだ距離が現在位置から交差点までの距離であると考えます。
    問題文から、経度は1秒30mなので南に75m、緯度は1秒25mなので180mとなります。
    この数値を問題文にある三角比に突き合わせると、75[m]×2.6=195[m]が回答になります。
    方向は西に進んでいる距離が長いことから西よりの西南なので、西南西となります。
  • 設問2
  • (1)a位置情報
    (1)b歩数計
    (1)cGPS
    (1)d加速度
    (1)e地磁気
    (2)現在位置、移動歩数、方角
    (3)GPSタスクから現在位置を取得できない場合に、過去1秒分の加速度情報から現在位置を求めるため

  • 設問3
  • (1)a省エネモード中は現在位置の把握を行わないから
    (1)b省エネモード中に動作範囲の傾きに戻ったことを検出するため
    (2)動作範囲外の傾きになった状態が一定時間以下だった場合は、省エネモードに遷移しない

2020年8月24日月曜日

H25春ES午後1問1の解き方 4サイクルガソリンエンジン

問題の感想

ガソリンエンジンの問題でした。なじみがないものなので難しかったです。
問題と解答は公式サイトに載っています→平成25年春

解答

  • 設問1
  • (1)70

    吸気サイクルの開始から排気サイクルの終了までの期間のクランク角センサが出力するパルス数を求めます。
    クランク角センサはクランク角度が10度動くと1パルス出力します。
    吸気サイクルから排気サイクルが回り終わるまでにクランク角度は2周するので、360度でパルスは35。2周するのでこのような解答になります。


    (2)吸気バルブが閉期間でない期間

    モータ制御部に開タイミングの情報を送ってはいけないタイミングを回答します。
    吸気バルブの開タイミングをを受信すると直ちにモータが動くようになっているので、すでに吸気バルブが開いている時に送ると、吸気バルブが開いたままになってしまいます。


  • 設問2
  • (1)サイクル信号がHIGHで、割込み処理でタイマ計測値を読み、直近の約二倍になるのを検出する。
    (2)3333

    クランク角度が50度の時タイマの計測値が500。カウントクロックが1[MHz]としたときのエンジン回転速度を問われています。
    カウントクロックが1[MHz]なので周期は1/1000000で1マイクロ秒。
    50度の時500ということは、40度から50度の間隔が500ということになります。360度の周期は180000マイクロ秒となります。
    エンジンの回転速度は問題文の中で1分当たりの回転数とあるので、60000000マイクロ秒/180000マイクロ秒で3333.3333。整数で回答するので回答は以下になります。


  • 設問3
  • (1)aクランク角
    (1)b回転速度算出
    (1)cバルブ可変量算出
    (1)dモータ制御

    (2)エンジン回転速度、エンジンの負荷情報

2020年8月23日日曜日

H24春ES午後1問1の解き方 スマートアダプタ


問題の感想

スマートアダプタの問題です。
問題と解答は公式サイトに載っています→平成24年春

解答

  • 設問1
  • (1)プラグイン確認メッセージ、プラグイン応答メッセージ、電力量通知メッセージ
    (2)a43200
    (2)b900

    解答欄に目を取られると難しい問題に感じてしまいます。以下の要素に注意して計算式を組み立てます。
    ・プラグイン確認とプラグイン応答のメッセージは2秒に1回送信される。
    ・1Whごとに電力量通知メッセージが送信されるので、1秒当たりのデータとする場合は3600秒で割る必要がある。
    (320/2+160/2×X)+(320/3600×Y)≦5000×0.8(ビット/秒)
    この式を計算すると、Y≦43200-900Xとなります。


  • 設問2
  • (1)PLCタスクにアラーム通知メッセージの送信を要求する
    (2)接続機器の漏電を検出したら、直ちに遮断できるようにしたいから
  • 設問3
  • (1)cプラグイン通知
    (1)dプラグ管理
    (1)eメイン
    (1)f漏電制御
    (1)g子機のプラグ状態
    (1)h通電制御指示
    (2)メインタスクにプラグアウト通知、プラグイン通知を順次送信する

    メインタスクにプラグアウト状態が通知されずにプラグイン状態の通知が来ているのがそもそもの問題なので、通知されなかったプラグアウト通知をするような対処をします。


H24春ES午後1問1の解き方 レーザ加工機

問題の感想

レーザ加工機の問題です。文章で回答する設問が1問しかないのでかなり解きやすいです。
問題と解答は公式サイトに載っています→平成24年春

解答

  • 設問1
  • (1)a切断開始位置
    (1)b同期
    (1)cレーザ光の照射
    (2)加工制御部のプログラムが正常に動作していない場合でも加工部を直ちに停止するため

    非常停止制御部が加工部を停止させる際、加工制御部を経由せずに、加工部に対して直接非常停止信号を送信する目的を50文字で答える必要があります。
    直接非常停止信号を送信する目的としては、「加工部を直ちに停止するため」なのですが、問題文に「加工機の動作の観点から」とあるので、もう少し説明を記載する必要がありました。非常停止信号は加工制御部のWDTがリセットされなかった場合に非常停止信号が送られてきます。なので、非常停止信号が送信されてくるときは加工制御部が異常な状態に陥っている可能性があります。その可能性を考えると、非常停止信号は加工制御部を介さずに加工部に伝えたほうが確実であるため、回答例としては以下のような感じかなと思います。


  • 設問2
  • (1)d停止要求の通信時間
    (1)e≦
    (2)2.0

  • 設問3
  • f開始指示
    g加工データ
    h終了指示
    iシーケンス処理タスク
    jWDTのクリア
    k開始
    l同期
    m終了

H23春ES午後1問2の解き方 通信機能を持つ電子血圧計

問題の感想

電子血圧計の問題です。血圧を測定する仕組みになじみが無いので難しかったです。
問題と解答は公式サイトに載っています→平成23年特別

解答

  • 設問1
  • (1)利用者ID
    (2)データセンタに送信できずにフラッシュメモリから削除した測定結果を検出するため

    利用者ごとの測定回数を送信している理由を問われています。
    フラッシュメモリには利用者全体で200回分の測定データを保存しており、上限に達している場合最も古いファイルを削除します。
    仮に削除されていた場合には測定レポートの最後に一部の測定結果が削除された旨のメッセージを出すことになります。

    (3)340

    データセンタから受信する測定データのサイズは最大何バイトになるかを問われています。
    利用者IDを除く保存項目の合計値は、2+1+2+2+7=14[バイト]であり、このデータに3[バイト]の機器番号が関連付けられるので、14+3=17[バイト]のデータが20回分送信されます。

  • 設問2
  • (1)圧力センサ値の読み込みが遅れ、低い血圧値を示すことがある

    音検出タスクの優先度が圧力センサタスクより高い場合に発生する問題について回答します。
    圧力センサタスクが50[ミリ秒]周期で呼ばれる処理であるのに対して、音検出タスクの処理時間は60[ミリ秒]となっています。
    仮に音検出タスクの優先度が高い場合に、圧力検出タスクの処理が遅れてしまうことになるのでこのような解答になります。

    (2)4

    コロトコフ音を検出した間隔が1.0[秒]だった時の血圧値を補正する値を計算する問題です。
    血圧計は50[ミリ秒]ごとに0.2[mmHg]ずつ減圧するので、1000[ミリ秒]/50[ミリ秒]で20回減圧。20回の減圧で4.0[mmHg]の減圧となります。

    (3)(a)コロトコフ音検出の通知を受信
    (3)(b)緊急停止キー押下
    (3)(c)コロトコフ音検出不可の通知を受信

  • 設問3
  • (1)送信に成功したことによって最近の測定結果を削除したから
    (2)データ送信時又はデータ受信時に1回再送が発生したから

H23春ES午後1問1の解き方 気象観測システム

問題の感想

気象観測システムの問題です。問題文が長いですが問題数が少ないです。

問題と解答は公式サイトに載っています→平成22年特別

解答

  • 設問1
  • (1)14

    センタが観測装置の電池切れを認識するまでに送信するメッセージ数を答える問題です。
    メッセージ数を数える際に認識しておくポイントとしては、
    ・センタは送信要求の応答がないときに2回再送要求をする。
    ・10分後に送信要求して、その後2回の再送要求をしても応答がなかった場合に動作してないものとする。
    ・観測装置は他に9台接続している。
    したがって、最初の送信要求以降の送信回数を数えると、再送要求2回+送信要求1回+再送要求2回+他装置の送信要求9回=14回になります。

    (2)観測したデータを直ちに保存すると、送信が成功した場合、次の観測データを送信する際に観測データがセンタに送信されないから

  • 設問2
  • (1)79.2

    観測項目のデータ量として、3+3+4+4+2+3=19バイト。
    観測項目を表す1バイトのデータが6つの項目に対して必要なので、プラス6バイト。
    さらに時刻のデータとしてプラス8バイトして、1回分のデータ量は19+6+8=33バイトとなります。
    これを10日分の2400回で掛けて正解を算出します。

    (2)9
    (3)カウンタの値を2回読み、それらが同じ値になるまで繰り返す処理

  • 設問3
  • (1)送信不可のメッセージ
    (2)タスク構成図を作成

    タスク構成図を完成させる問題です。タスクの機能概要を見て線を引けばいいのですが、素直に読み取れない線が1本あるのでそれが難しいです。
    ・表示タスクは、メインタスクからの指示に基づいて表示処理を行う。
    ・シリアル通信タスクは、結果を観測タスクに通知する。
    ・観測タスクは、観測したデータをメインタスクとデータ管理タスクに通知する。
    ・雨量計測タスクは、結果を観測タスクに通知する。
    ・データ管理タスクは、観測データを管理する。
    ・温湿度計測タスクは、結果を観測タスクに通知する。
    これらに加えて、メインタスクはシステム全体の管理や送信するデータの形式を整えることをしているので、メインタスクからデータ管理タスクの線も引く必要があり、全部で7本の線を引いてタスク構成図が完成となります。

2020年8月20日木曜日

H22春ES午後1問2の解き方 可搬型パーソナル天体観測システム

問題の概要

天体望遠鏡の問題です。計算が少し多いですがほとんど記述なので楽でした。

問題と解答は公式サイトに載っています→平成22年春

解答

  • 設問1
  • (1)a 位置通知
      b 向き制御要求
      c 初期調整完了
    (2)d 34.53

    変更する角度を求めて、変更料が0.03[度]刻みであることを考慮して変更する角度を求めます。
    121.31[度]-86.77[度]=34.54[度]
    34.54[度]÷0.03=1151.33…[度]
    なので、34.54[度]に近い、34.53[度]が解答になります。

      e 23.40
      f 121.30
      g 35.83


  • 設問2
  • (1) h モード管理
      i 初期調整モード
      j 観測モード
      k 向き制御
    (2) l 回転方向

    方位角モータ、仰角モータに出力する情報としてパルス数以外に必要となる情報を考えて、回転方向を指示する必要があることを導きます。

      m 5
      n 5.4


  • 設問3
  • (1)観測モードの最初では方向記憶領域の値とセンサの値が大きくずれており、閾値を超える可能性があるから
    (2)向き異常検出タスクが、向き異常検出通知を送信するのと同時に、観測モードタスクが向き制御要求を受信したとき

2020年8月19日水曜日

GASでファイルをリネームして移動させる

概要

ラズパイで撮影した写真をGoogleDriveに転送するようにしたので、GoogleDrive側でGASを1時間に1回動かしてファイル操作をしています。
初めてGASに触りましたが、Web上の情報を寄せ集めて作ることができました。
このスクリプトでは、「XXXXXXXXXXXXXXXXXXXXXX」というディレクトリで、以下の事をしています。
  1. Photo.jpgがあれば、日付情報の名前にリネームして「YYYYYYYYYYYYYYYYYYYYYYY」ディレクトリに移動する。
  2. New_Photo.jpgがあれば、Photo.jpgにリネームする。

ソースコード


 function myFunction() {
  
   // ディレクトリのIDを取得
   var Input_dir = DriveApp.getFolderById("XXXXXXXXXXXXXXXXXXXXXX");
   var Output_dir = DriveApp.getFolderById('YYYYYYYYYYYYYYYYYYYYYYY');
  
   //フォルダ内にある全てのファイルを取得
   var LIST = Input_dir.getFiles();

   var Input_File_name = "Photo.jpg"
   var Input_NewFile_name = "New_Photo.jpg";
  
   //Photo.jpgがあればリネーム
   while(LIST.hasNext()){
     if(LIST.next() == Input_File_name){
       Logger.log("Photo.jpg move.");
       var Input_File = Input_dir.getFilesByName(Input_File_name).next();
      
       // 日付日時情報にリネームして別のフォルダに出力
       var OutputFileName = Input_File.getName().replace('.jpg', '')+'_'+Utilities.formatDate(new Date(), 'JST', 'yyyyMMddHHmm')+'.jpg'  
       Input_File.makeCopy(OutputFileName, Output_dir);
       Input_File.setTrashed(true);
     }
   }
  
   var LIST = Input_dir.getFiles();
  
   //New_Photo.jpgがあればリネーム
   while(LIST.hasNext()){
     if(LIST.next() == Input_NewFile_name){
       Logger.log("New_Photo.jpg move.");
       var Input_NewFile = Input_dir.getFilesByName(Input_NewFile_name).next();
  
       // Newを消してファイルをリネーム
       var OutputFileName = Input_NewFile.getName().replace('New_', '')  
       Input_NewFile.makeCopy(OutputFileName, Input_dir);
       Input_NewFile.setTrashed(true);
     }
   }
 }

ラズパイで写真を撮ってGoogleDriveに転送する


概要

ラズパイで写真を撮影して、/var/local/PhotoData/New_Photo.jpgに保存し、撮影した写真をGoogleDriveに転送します。
gdriveコマンドを使うためにGoogleDrive側の設定など必要になります。

ソースコード(PhotoShot.py)

ファイルのサイズを小さくしたかったので品質は10%で。デバイスの都合で90度傾けて撮影しています。
XXXXXXXXXXXXXXXXXXXXXXXXXXXのところには転送先のフォルダのIDを記載してください。

 #!/usr/bin/python
 # coding: utf-8

 import os

 com = 'raspistill -q 10 -rot 90 -o ' + '/var/local/PhotoData/New_Photo.jpg'
 os.system(com)

 com2 = '/bin/gdrive upload --parent "XXXXXXXXXXXXXXXXXXXXXXXXXXX" /var/local/PhotoData/New_Photo.jpg'

 os.system(com2)


使用例


 $ sudo python PhotoShot.py
 Uploading /var/local/PhotoData/New_Photo.jpg
 Uploaded 1uxAnYqEtUQ91nsGt61G7ofwrwVQQbNUh at 17.3 KB/s, total 152.9 KB

この処理をcrontabに書いておけば、時間を決めて写真撮影をしてそのままGoogleDriveに転送することができるようになるので便利です!

2020年8月17日月曜日

H22春ES午後1問1の解き方 通信機能を持つ宅配荷物受取システム

問題の概要

宅配システムの問題です。パケットが全体を一周するように流れていることがぴんとこなくて苦労しました。
問題と解答は公式サイトに載っています→平成22年春

解答

  • 設問1
  • (1)暗証番号だけでは暗証番号を知られた場合、荷物が不正に取り出されるから
    (2)荷物部及びシリアル回線が正常に動作しているか検知できる
  • 設問2
  • (1)16.0

    「制御部→荷物部1→荷物部2→荷物部3→荷物部4→制御部」というようにパケットが流れるので通信時間の合計はこのように求めます。
    通信部や制御部間の通信の時間:1.6ミリ秒×5=8.0ミリ秒
    判断と送信開始までの時間:(1ミリ秒+1ミリ秒)×4=8.0ミリ秒
    送信開始から受信完了までの時間:8.0ミリ秒+8.0ミリ秒=16.0ミリ秒


    (2)荷物部2がパケットの送信開始と同時に荷物部2に荷物が入れられたことを検出した場合

  • 設問3
  • (1)a 取出し
      b データ管理
      c 集荷
    (2)集荷番号
    (3)・ボックス番号
      ・解除指示

2020年8月16日日曜日

無通信が続いた時に再起動する方法

経緯

先日の投稿でSORACOMの無通信タイムアウトを回避するためにpingを定期送信する処理を記載しましたが、この処理を入れても再起動すると「ping: pong.soracom.io: 名前解決に一時的に失敗しました」というのが継続的に発生してネットワークにつながらなくなる事象が2回に1回くらいの割合で発生するようになりました。

※関連しているかもしれない記事
特定地域向け IoT SIM (旧日本向け Air SIM) SORACOM Air for セルラー トラブルシューティングガイド【接続できなくなった場合】

できれば原因を究明したいところでしたが、軽くググってってもわからなかったし再起動で直る(また繋がるようになる)ことがわかっていたので、つながらない状態が10分続くと再起動するように処理を改造しました。


60秒周期にsoracomにpingを飛ばして、10回失敗したら再起動する処理

この処理を、/usr/local/bin/PingSend.pyに保存します。参考にしてみてください。

 #!/usr/bin/python
 # coding: UTF-8

 import time
 import os

 count=0

 while True:
     time.sleep(60)
     ret = os.system('ping -c 3  pong.soracom.io')
 
     if ret==0:
         count=0

     else:
         count=count+1

     if count>=10:
         os.system('shutdown -r now')

2020年8月9日日曜日

ラズパイでLEDを点灯する pigpioの使い方

概要

ラズパイでLEDを制御する際、GPIOを操作する方法の一つとして、Pythonのpigpioライブラリを使うのが便利そうなので使い方を学びます。


使い方

  1. pigpioのサービスを起動しておく
  2. pigpioを使う際にはあらかじめ「pigpiod」という常駐プログラムを起動しておく必要があります。
    pigpiodを制御するユニットがあらかじめ用意されているので、systemctlコマンドで常駐プログラムを起動します。
    
     pi@raspberrypi:~ $ sudo systemctl start pigpiod
     pi@raspberrypi:~ $ sudo systemctl status pigpiod
     ● pigpiod.service - Daemon required to control GPIO pins via pigpio
        Loaded: loaded (/lib/systemd/system/pigpiod.service; disabled; vendor preset: enabled)
        Active: active (running) since Sun 2020-08-09 13:40:24 JST; 2s ago
       Process: 17319 ExecStart=/usr/bin/pigpiod -l (code=exited, status=0/SUCCESS)
      Main PID: 17321 (pigpiod)
         Tasks: 4 (limit: 2200)
        Memory: 532.0K
        CGroup: /system.slice/pigpiod.service
                mq17321 /usr/bin/pigpiod -l
    
      8月 09 13:40:24 raspberrypi systemd[1]: Starting Daemon required to control GPIO pins via pigpio...
      8月 09 13:40:24 raspberrypi systemd[1]: Started Daemon required to control GPIO pins via pigpio.
    
    

    サービスファイルの中身はこのようになっています。
    
     pi@raspberrypi:~ $ cat /lib/systemd/system/pigpiod.service
     [Unit]
     Description=Daemon required to control GPIO pins via pigpio
     [Service]
     ExecStart=/usr/bin/pigpiod -l
     ExecStop=/bin/systemctl kill pigpiod
     Type=forking
     [Install]
     WantedBy=multi-user.target
    
    

    再起動後した時に自動起動する場合には、ユニットをenableにしておきます。
    
     pi@raspberrypi:~ $ sudo systemctl enable pigpiod
     Created symlink /etc/systemd/system/multi-user.target.wants/pigpiod.service → /lib/systemd/system/pigpiod.service.
    
    

  3. pigpioを使ってLEDを点灯するプログラムを作成する
  4. LEDはこのように接続しました。GPIO14をGRDのピンを使用しています。
    抵抗は200Ωのものを使っています。(図に書かれている抵抗の色とは違うものです)


    以下がプログラムです。pigpioをインポートして、出力設定した後にHighに設定しています。
    
     pi@raspberrypi:~/test $ cat led_on.py
     import pigpio
    
     LED_PIN = 14
    
     pi= pigpio.pi()
     pi.set_mode( LED_PIN, pigpio.OUTPUT )
     pi.write( LED_PIN, pigpio.HIGH)
    
    
  5. プログラムを実行する
  6. 以下のようにpythonのプログラムを実行します。
    
     pi@raspberrypi:~/test $ python led_on.py
    
    
    無事に点灯しました。

ここではpigpioを使ってLEDを点灯させてみましたが、これができればループ処理を組み合わせて点滅させたり、明るさを変えてみたりすることができそうです。
IoTでラズパイを使う際にディスプレイはつながないで使う事が多いと思うので、LEDを使って簡単に出力できるのは便利そうです。


2020年8月5日水曜日

H21春ES午後1問2の解き方 マイコン制御による温水洗浄機能付き便座


問題の概要

温水洗浄機能付き便座の問題です。記述が少なくタスク名を回答する問題が多いです。

問題と解答は公式サイトに載っています→平成21年春

解答

  • 設問1
  • (1) a 人検出センサOFF
      b 着座センサON
     c 着座センサOFF
     d 洗浄開始スイッチON
     e 洗浄停止スイッチON
     f 洗浄停止と水温制御停止

    (2) (a) 6840

    ふたを開けるときの駆動パルスを回答します。120個の駆動パルスで1回転し、1回転で2度分の角度を動かします。
    求める角度は、OFFからONになった時(6度)から120度開いた状態にするので、114度動かす必要があり、114度動かすためには57回転する必要があるので、57回転×120個=6840 になります。


    (2)(b)制御:ふた開閉センサがONになるまで開いてからふたの閉動作を行う
       理由:ふたが6度未満のどの位置で停止しているか検出できないから

    掃除可能状態からふた閉状態に遷移する際のふたの開閉制御について回答します。
    問題文にふた開閉検出センサOFFの時とあります。ふた開閉検出センサがOFFの時はふたが、0度~6度の時となります。
    一般的に掃除が終わったら便座のふたを閉じておく必要がありますが、問題文にある用語を使って具体的に以下のように回答する必要があります。


  • 設問2
  • (1) g 洗浄
      h 洗浄水温度

    (2)メイン、洗浄水温度制御、洗浄水噴出力制御

    掃状態遷移の通知を定期的に検出する必要があるので、メインタスクもタイマタスクを使う事になります。
    処理内容の「温水便座の状態遷移を制御する。」というところに着目する必要がありそうです。

    (3)洗浄停止処理、洗浄水温度制御、緊急通報

  • 設問3
  • (1)状態遷移条件検出、洗浄水噴出力制御

    赤外線通信タスクから通知を受けた情報振り分けタスクが通知するタスクを回答します。
    メインタスクを変更しないということなので、状態を制御するために状態遷移条件検出タスクも必要になります。

    (2)i タイマ
     j 水温設定スイッチ
     k 水温制御開始

    空欄を埋める問題です。洗浄水温度制御タスクが変数tmpの温度を制御をするトリガとなる通知がどのタスクから通知を受けるか回答します。
    洗浄水温度制御タスクはタイマタスクから定期的に通知を受け取るので、処理のトリガになるのはタイマタスクとなり、これが(i)の回答になります。

2020年8月2日日曜日

H21春ES午後1問1の解き方 電池で動作するガスメータ

問題の概要

電池で動作するガスメータの問題です。電池で動作しているので消費電力には気を遣う装置なのかもしれません。
タイマ0カウンタとタイマ1カウンタがあるのでそれぞれの役割を理解して問題を解く必要があります。カウンタの問題はエンベデッドでは定番らしいです。

問題と解答は公式サイトに載っています→平成21年春

解答

  • 設問1
  • (1)消費電力を抑えるため

    ガスメータがガス量の計測をメインプログラムではなく割込みを使って測定している理由を回答します。
    私はいつも割込みのほうが早そうな気がしてしまい「ガス漏れを即時に検出するため」と答えてしまうことが多いのですが、割込みを使う理由としてはMPUの消費電力を抑えることのほうが一般的みたいです。
    この装置は電池で動作しており、MPUの状態と動作電流の表もあるので、消費電力に着目する必要がありそうです。

    (2)0.09(ミリW)

    まず、動作電流と動作時間から消費エネルギーを求めます。
    通常状態 :2mA×5V×10秒=100mJ
    省電力状態:100uA×5V×90秒=45mJ
    待機状態 :10uA×5V×3500秒=175mJ
    この合計を3600秒で割って平均消費電力を求めて四捨五入した値が回答になります。
    (100mJ+45mJ+175mJ)/3600秒=0.08888mW

  • 設問2
  • モードレジスタ: 81
    16ビットレジスタ: 10000
  • 設問3
  • (1)一定量のガスが流れるとカウンタの割込みが入り、ガス漏れ時はこの割込み間隔が短くなるから
    (2)タイマ1の読取りが遅れた場合に、ガス漏れの検出の判断を誤る可能性があるため

    カウンタの割込みの優先度を最も高くしている理由を回答します。
    この装置にはカウンタ割込み以外にタイマ0割込みというものが存在しているので、仮にタイマ0割込みのほうが優先度が高い場合にどうなるかを考えます。

    ・タイマ0の割込みによる処理中にカウンタ割込みが発生して待ちが発生する。

    ・待ちが発生するとタイマ1の値が大きくなる。

    ・ガス漏れ検出の判断を誤る。