令和元年秋期試験午後問題 問7

問7 組込みシステム開発

⇱問題PDF⇱解答用紙PDF
学習機能付き赤外線リモートコントローラの設計に関する次の記述を読んで,設問1~3に答えよ。

 G社は,赤外線リモートコントローラ(以下,赤外線リモコンという)を製造している会社である。今回,複数の異なる機器を1台で操作できる統合型の赤外線リモコン(以下,統合リモコンという)を開発することになった。
 統合リモコンには,各種のボタンがあり,このボタンを押して機器を操作する。統合リモコンには,主要メーカの赤外線リモコン及び操作対象の機器の情報があらかじめ登録されており,登録された機器を選択すると,その機器の赤外線リモコンとして使用できる。一方,登録されていない機器については,その機器の赤外線リモコンの信号を解析してボタンごとに登録することによって,その機器の赤外線リモコンとして使用できる。この解析機能・登録機能を学習機能という。

〔赤外線リモコンの信号〕
 赤外線リモコンを使用する環境には,蛍光灯,LED照明などからの人工光と,太陽などからの自然光があり,これらの光を外部光という。外部光には,赤外光が含まれていることがある。
 赤外線リモコンは,38~40kHzで点滅を繰り返す赤外光を使用する。赤外線リモコンの信号には,連続して点滅を繰り返す状態(以下,ON状態という)と,消灯している状態(以下,OFF状態という)がある。
 ON状態とOFF状態それぞれの長さの組合せには,ボタンごとに固有のパターンがある。最初のON状態から最後のON状態までの各状態の長さの組合せを制御パターンという。制御パターンは最大60ミリ秒で完了する。一つの制御パターンの中で,ON状態及びOFF状態の最短時間はそれぞれ350マイクロ秒である。
 赤外線リモコンの信号の例を図1に示す。
pm07_1.gif
 赤外線リモコンによって操作される機器は,制御パターンを読み取り,その制御パターンに対応した処理を行う。

〔統合リモコンの学習機能における操作〕
 学習機能によって一つのボタンを学習させるときの操作は,次のとおりである。
  • 利用者は,統合リモコンの"特定のボタン"を2秒以上押し続ける。
  • 利用者は,学習対象の赤外線リモコン(以下,学習対象リモコンという)を操作して,統合リモコンに赤外光を送る。統合リモコンは,解析機能によって赤外光から抽出した制御パターンを登録する。

〔解析機能で使用するハードウェア〕
 解析機能では,制御部,赤外線センサ,タイマ及びカウンタを使用する。解析機能で使用するハードウェアの構成を図2に示す。
  • 赤外線センサは,赤外光から38~40kHzの信号を取り出し,ON状態からOFF状態,又はOFF状態からON状態に遷移したことを制御部に通知する。
  • タイマは設定した時間になると,制御部に通知する。
  • カウンタは16ビットで1マイクロ秒ごとにカウント値が1加算され,カウント値が65,535に達すると,次のカウントで0に戻る。統合リモコンの解析機能が動作している間は,常にカウントしている。
pm07_2.gif
〔制御パターン抽出プログラム〕
 制御パターン抽出プログラムは,学習対象リモコンの赤外光を解析して制御パターンを抽出するプログラムで,ON状態の長さ及びOFF状態の長さを,添字が0から始まる配列 T[] に格納する。配列 T[] に格納された要素の個数を変数Nに格納する。配列 T[] 及び変数Nは32ビットの符号付き整数型である。
 制御パターン抽出プログラムは,イベントを待ち,イベントを受けると,そのイベントに応じた処理を行う。イベントには,OFF状態に遷移したときに赤外線センサから通知されるOFFイベント,ON状態に遷移したときに赤外線センサから通知されるONイベント,及びタイマから通知されるタイマイベントがある。これらのイベントは,FIFO動作するキューに格納される。
 ONイベント及びOFFイベントは,同じイベントが連続して通知されることはない。
 制御パターン抽出プログラムは,次のように処理する。
  • 制御パターンの抽出に成功したときは変数 rst にTrueを,失敗したときは変数 rst にFalseを設定する。
  • 学習対象リモコンの赤外光が一定時間検出されないときは,変数 rst にFalseを設定する。
  • 最初に通知されたイベントがOFFイベントのときは,変数 rst にFalseを設定する。
  • 最初に通知されたONイベントから一定時間が経過すると,プログラムを終了する。このとき,最後に赤外線センサから通知されたイベントがONイベントの場合は,変数 rst にFalseを設定する。
  • 制御パターンの抽出が成功し,k を0から始まる整数としたとき,T[2×k] には,a状態の長さが,T[2×k+1] には,b状態の長さが格納される。制御パターン抽出プログラムは,表1に示す関数を使用する。
pm07_3.gif
 制御パターン抽出プログラムのフローを図3に示す。
pm07_4.gif

設問1

〔赤外線リモコンの信号〕,(解析機能で使用するハードウェア〕について,(1),(2)に答えよ。
  • 一つの制御パターンにおいて,ON状態の数とOFF状態の数の合計は最大何個となるか。整数で答えよ。
  • 自然光などの外部光を含む光を受けた赤外線センサにおいて,38~40kHzの信号成分を取り出すものはどれか。適切な字句を解答群の中から選び,記号で答えよ。
解答群
  • UVフィルタ
  • ハイパスフィルタ
  • バンドパスフィルタ
  • ローパスフィルタ

解答例・解答の要点

  • 171

解説

  • 問題文の〔赤外線リモコンの信号〕には、「制御パターンは最大60ミリ秒で完了する。一つの制御パターンの中で、ON状態及びOFF状態の最短時間はそれぞれ350マイクロ秒である。」という記述があります。

    一つの制御パターンにおけるON状態とOFF状態の合計の最大となるのは、60ミリ秒の間にON状態及びOFF状態が最短時間で繰り返された場合です。このとき記録される状態の数は、次の式で求めることができます。

     60ミリ秒÷350マイクロ秒
    =60,000マイクロ秒÷350マイクロ秒
    =171.428571…回

    整数で答えることになっているので、小数点以下を切り捨てた「171個」が適切です。

    ∴171

  • 各フィルタは次の効果を得るためのフィルタです。
    UVフィルタ
    紫外線を遮断する
    ハイパスフィルタ
    遮断周波数(カットオフ周波数)よりも高い信号成分を通す
    バンドフィルタ
    必要な周波数帯域の信号成分を通す
    ローパスフィルタ
    遮断周波数よりも低い周波数よりも低い信号成分を通す
    赤外線センサは、赤外光から38~40kHzの信号成分を取り出すので、特定周波数帯域だけを通す「バンドフィルタ」の使用が適切です。

    ∴ウ:バンドフィルタ

設問2

〔制御パターン抽出プログラム〕について,(1),(2)に答えよ。ここで,イベント待ち以外の処理時間は無視できるものとし,タイマは指定された時間に正確に機能するものとする。
  • 学習対象リモコンで何も操作が行われないとき,制御パターン抽出プログラムを開始してから終了するまでの時間は何秒か。整数で答えよ。
  • 本文中のabに入れる適切な状態名を答えよ。

解答例・解答の要点

  • 5
  • a:ON
    b:OFF

解説

  • 図3「制御パターン抽出プログラムのフロー」では、開始直後に setTimer(5000) の処理を行い、5,000ミリ秒のタイマを設定しています。学習対象リモコンで何の操作も行われない場合は、ONイベント及びOFFイベントが通知されることはないので、waitEvent() が最初に受信するイベントは開始から5,000ミリ秒後のタイマイベントとなります。

    タイマイベントを受信すると、[c]が含まれる分岐でされると No に分岐し、rst にFalseが設定されて、制御パターン抽出処理は終了します。このとき開始から終了までの時間は、5,000ミリ秒=5秒です。

    ∴5

  • abについて〕
    状態名ですので、ONまたはOFFが入ります。

    問題文の「最初に通知されたイベントがOFFイベントのときは,変数 rst にFalseを設定する。」という記述から、一つの制御パターンは必ずON状態から始まることがわかります。本プログラムでは「ON状態の長さ及びOFF状態の長さを,添字が0から始まる配列 T[] に格納する」ので、T[0]にはON状態の長さ、T[1]にはOFF状態の長さ、T[2]にはON状態の長さ、…という順序で格納されていきます。すなわち、偶数番目にはON状態の長さが、奇数番目にはOFF状態の長さが入ります。

    kを整数とすると、T[2×k] は配列Tの偶数番目の要素、T[2×k+1] は、配列Tの奇数番目の要素になるので、aにはON(状態)、bにはOFF(状態)が入ります。

    a=ON
     b=OFF

設問3

図3の制御パターン抽出プログラムのフローについて,(1)~(3)に答えよ。
  • 図3中のcに入れる適切なイベント名,及びdに入れる適切な字句を答えよ。ここで,配列 T[] の要素の個数は十分に大きいものとする。
  • 図3中の下線①について,T[N]<0 となるのは,どのような事象が発生したときか。20字以内で答えよ。
  • 図3中の下線②について,T[N] の補正方法を,20字以内で答えよ。

解答例・解答の要点

  • c:ONイベント
    d:今回値
  • カウント値が0に戻ったとき (13文字)
  • T[N]に65,536を加算する (16文字)

解説

  • cについて〕
    図3「制御パターン抽出プログラムのフロー」では、waitEvent() の受信したイベントが[c]の場合に、T[N]へON状態またはOFF状態の長さの記録などを行っています。一方で、イベントが[c]ではない場合は、rst にFalseの代入などを行い、制御パターンプログラムを終了します。これらのことから、図3「制御パターン抽出プログラムのフロー」の最初の分岐では、制御パターンの記録が開始できる状態になったかどうかの判定を行っていることわかります。

    本文中では「最初に通知されたイベントがOFFイベントのときは,変数 rst にFalseを設定する。」、「学習対象リモコンの赤外光が一定時間検出されないときは,変数 rst にFalseを設定する。」とあり、最初に通知されたイベントがOFFイベントまたはタイマイベントの場合には、制御パターンの記録を行わずにプログラムを終了することなっています。つまり、制御パターンの記録を開始するのはイベントが「ONイベント」のときだけです。よって、[c]にはONイベントが入ります。

    c=ONイベント

    dについて〕
    T[N]に格納される値が「今回値-前回値」であることからもわかるように、前回のカウントと今回のカウントの差を状態の長さとしています。次回の記録時には、今回のカウントを前回のカウントとして使うことになるので、次のループ処理に移る前に前回値を今回値で更新する処理が必要です。

    ∴今回値

  • 問題文には、「カウンタは16ビットで1マイクロ秒ごとにカウント値が1加算され、カウント値が65,535に達すると、次のカウントで0に戻る。」という記述があります。このことから、カウンタが0に戻った後に「今回値 ← getCount()」が行われた場合には、今回値が前回値よりも小さくなり、T[N]が負数になることがわかります。例えば、前回値が65,000→(カウントが65,535を超えて0に戻る)→今回値が1,000→T[N]が-64,000となるようなケースです。

    ∴カウント値が0に戻ったとき

  • 図3中の下線②は、図3中の下線① T[N]<0 が Yes の場合に実行する処理です。設問3の(2)で述べたように、T[N]<0 が Yesの場合とは、カウンタが0に戻った場合のことです。

    カウント値が65,535に達すると次のカウントで0に戻るので、2値の正しいカウント差は次のようになります。
    pm07_5.gif
    つまり、T[N]が負数となったときは、T[N]に65,536を加えてやれば正しいカウント差となります。よって、補正処理の内容は「T[N]に65,536を加算する」が適切です。なお、本問では制御パターンの最大が60ミリ秒=60,000マイクロ秒、カウンタの最大値が65,535なので、0に戻った後、何もイベントが通知されることなく再び0に戻ることはありません。したがって、カウンタが2周以上したケースを考える必要はありません。

    ∴T[N]に65,536を加算する

Pagetop