戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

応用情報技術者 2019年 秋期 午後07


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

   G社は、赤外線リモートコントローラ(以下、赤外線リモコンという)を製造している会社である。今回、複数の異なる機器を1台で操作できる統合型の赤外線リモコン(以下、統合リモコンという)を開発することになった。  統合リモコンには、各種のボタンがあり、このボタンを押して機器を操作する。統合リモコンには、主要メーカーの赤外線リモコン及び操作対象の機器の情報があらかじめ登録されており、登録された機器を選択すると、その機器の赤外線リモコンとして使用できる。一方、登録されていない機器については、その機器の赤外線リモコンの信号を解析してボタンごとに登録することによって、その機器の赤外線リモコンとして使用できる。この解析機能・登録機能を学習機能という。   〔赤外線リモコンの信号〕  赤外線リモコンを使用する環境には、蛍光灯、LED照明などからの人工光と、太陽などからの自然光があり、これらの光を外部光という。外部光には、赤外光が含まれていることがある。  赤外線リモコンは、38~40kHzで点滅を繰り返す赤外光を使用する。赤外線リモコンの信号には、連続して点滅を繰り返す状態(以下、ON状態という)と、消灯している状態(以下、OFF状態という)がある。  ON状態とOFF状態それぞれの長さの組合せには、ボタンごとに固有のパターンがある。最初のON状態から最後のON状態までの各状態の長さの組合せを制御パターンという。制御パターンは最大60ミリ秒で完了する。一つの制御パターンの中で、ON状態及びOFF状態の最短時間はそれぞれ350マイクロ秒である。  赤外線リモコンの信号の例を図1に示す。
応用情報技術者試験(令和元年 秋期 午後 問07 図01)
 赤外線リモコンによって操作される機器は、制御パターンを読み取り、その制御パターンに対応した処理を行う。   〔統合リモコンの学習機能における操作〕  学習機能によって一つのボタンを学習させるときの操作は、次のとおりである。  (1) 利用者は、統合リモコンの“特定のボタン”を2秒以上押し続ける。  (2) 利用者は、学習対象の赤外線リモコン(以下、学習対象リモコンという)を操作して、統合リモコンに赤外光を送る。統合リモコンは、解析機能によって赤外光から抽出した制御パターンを登録する。   〔解析機能で使用するハードウェア〕  解析機能では、制御部、赤外線センサ、タイマ及びカウンタを使用する。解析機能で使用するハードウェアの構成を図2に示す。  ・赤外線センサは、赤外光から38~40kHzの信号を取り出し、ON状態からOFF状態、又はOFF状態からON状態に遷移したことを制御部に通知する。  ・タイマは設定した時間になると、制御部に通知する。  ・カウンタは16ビットで1マイクロ秒ごとにカウント値が1加算され、カウント値が65,535に達すると、次のカウントで0に戻る。統合リモコンの解析機能が動作している間は、常にカウントしている。
応用情報技術者試験(令和元年 秋期 午後 問07 図02)
〔制御パターン抽出プログラム〕  制御パターン抽出プログラムは、学習対象リモコンの赤外光を解析して制御パターンを抽出するプログラムで、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に示す関数を使用する。
応用情報技術者試験(令和元年 秋期 午後 問07 表01)
 制御パターン抽出プログラムのフローを図3に示す。
応用情報技術者試験(令和元年 秋期 午後 問07 図03)

設問1〔赤外線リモコンの信号〕、〔解析機能で使用するハードウェア〕について、(1)、(2)に答えよ。

(1)一つの制御パターンにおいて、ON状態の数とOFF状態の数の合計は最大何個となるか。整数で答えよ。

模範解答

171

解説

解答の論理構成

  1. 制御パターン全体に使える時間は【問題文】の「制御パターンは最大60ミリ秒で完了する。」という記述から です。
  2. 各状態(ON/OFF)が取り得る最短時間は同じく【問題文】の「ON状態及びOFF状態の最短時間はそれぞれ350マイクロ秒である。」から です。
  3. したがって、1つの状態が占める最短時間 をできるだけ詰め込めば状態数を最大化できます。 整数で数えられる状態数の上限は小数点以下を切り捨てた です。
  4. よって、「ON状態の数」と「OFF状態の数」の合計の最大値は 171 となります。

誤りやすいポイント

  • 60 ms を 60,000 μs に換算し忘れる。単位換算ミスは典型的失点要因です。
  • 38~40 kHz という搬送波周波数から1周期(約25 μs)を使って計算してしまう。最短時間は「350マイクロ秒」であって搬送波周期ではありません。
  • ON と OFF を“ペア”と決めつけて 2 で割ると 171÷2 のように誤算する。問われているのは合計個数です。

FAQ

Q: ON と OFF は必ず交互に並ぶのですか?
A: はい。赤外線センサが「同じイベントが連続して通知されることはない」とされており、パターンも ON⇔OFF が交互に続きます。
Q: ぴったり 60 ms を超えても信号として認識されることはありますか?
A: 問題設定では「最大60ミリ秒で完了する」と明記されているため、60 ms を超える部分は制御パターンとしては扱われません。
Q: 350 μs より短い ON/OFF が現れた場合はどうなりますか?
A: 問題の想定範囲外ですが、受信側が想定する最短時間を下回ると誤動作や無視される可能性があります。

関連キーワード: 制御パターン、赤外線、最短時間、マイクロ秒、フロア関数

設問1〔赤外線リモコンの信号〕、〔解析機能で使用するハードウェア〕について、(1)、(2)に答えよ。

(2)自然光などの外部光を含む光を受けた赤外線センサにおいて、38〜40kHzの信号成分を取り出すものはどれか。適切な字句を解答群の中から選び、記号で答えよ。
解答群  ア:UVフィルタ  イ:ハイパスフィルタ  ウ:バンドパスフィルタ  エ:ローパスフィルタ

模範解答

解説

解答の論理構成

  • 問題文では、赤外線リモコンが使う光について「赤外線リモコンは、38~40kHzで点滅を繰り返す赤外光を使用する」と明記されています。
  • 一方、赤外線センサには蛍光灯や太陽光などの外部光も入ります。この外部光は幅広い周波数成分を含むため、目的の 38~40kHz 成分だけを取り出す必要があります。
  • 周波数が “ある狭い範囲” の信号成分を通過させ、それ以外を減衰させる回路は「バンドパスフィルタ」です。
  • したがって、赤外線センサ後段で 38~40kHz 成分を抽出するフィルタは「バンドパスフィルタ」となり、解答群の「ウ」を選択します。

誤りやすいポイント

  • 低周波成分を除去するだけと誤解して「イ:ハイパスフィルタ」を選んでしまう。ハイパスでは高周波側に上限がなく、目的帯域より高いノイズも通してしまいます。
  • 「赤外線=光だから周波数は高い」と連想し「エ:ローパスフィルタ」を排除できず迷うケース。光の“点滅周波数”としては音声帯域に近いためローパスでは信号が削ぎ落ちます。
  • 光学系のイメージで「ア:UVフィルタ」を選ぶミス。ここで扱うのは電気的信号周波数であり、紫外線遮断フィルタとは目的が異なります。

FAQ

Q: なぜ 38kHz だけでなく「38~40kHz」という幅を取っているのですか?
A: メーカーや部品個体差でキャリア周波数が微妙にずれるため、多少のマージンを持たせています。バンドパスフィルタの通過帯域もこの幅を包含するよう設計します。
Q: バンドパスフィルタはアナログ回路だけで実装するのですか?
A: 一般にフォトダイオード出力はアナログのバンドパスで一次整形し、その後マイコンやデジタルフィルタでさらに復調します。低コスト赤外線受光モジュールではバンドパスと復調回路が一体化しています。
Q: フィルタを通した後、次にどんな処理が行われるのですか?
A: バンドパスでキャリア成分を得た後、エンベロープ検波やタイミング計測でON/OFFの長さを数え、問題文の「配列T[]に格納」する制御パターン抽出へ進みます。

関連キーワード: バンドパスフィルタ、キャリア周波数、ノイズ除去、点滅周波数

設問2〔制御パターン抽出プログラム〕について、(1)、(2)に答えよ。ここで、イベント待ち以外の処理時間は無視できるものとし、タイマは指定された時間に正確に機能するものとする。

(1)学習対象リモコンで何も操作が行われないとき、制御パターン抽出プログラムを開始してから終了するまでの時間は何秒か。整数で答えよ。

模範解答

5

解説

解答の論理構成

  1. 初期化直後にセットされるタイマ
    図3 の処理 2 行目は【問題文】引用
    「setTimer(5000)」
    すなわちプログラム開始時に “5,000 ms” のタイマイベントが予約されます。
  2. 他のイベントは発生しない前提
    設問条件は【問題文】引用
    「学習対象リモコンで何も操作が行われないとき」
    よって “ONイベント” “OFFイベント” は一切キューへ入りません。
  3. イベント待ちの動き
    ① 5 行目で waitEvent() へ遷移
    ② 38~40 kHz の赤外光が来ないので待機を継続
    ③ 5,000 ms 経過時にタイマイベントが発生し、これが最初に取得するイベントになります。
  4. タイマイベントを受けた後の分岐
    6 行目の判定は
    「イベント = c ?」
    初回イベントがタイマイベントなので “No” に進み、処理 12 に到達します。
  5. プログラム終了までの時間
    イベント待ち以外の時間は無視できるとの前提(【問題文】「イベント待ち以外の処理時間は無視できるものとし」)より、 開始からタイマイベント受信までの “5,000 ms” が実質的な動作時間です。
  6. 単位換算
したがって、解答は「5」です。

誤りやすいポイント

  • 5000 ms と 60 ms のタイマを混同する
    5,000 ms のタイマは“最初”に一度だけ設定され、60 ms タイマは ONイベント発生後にしか設定されません。
  • 「startSensor()」に要する時間を考慮してしまう
    処理時間は無視できると明示されているので計算に入れません。
  • キューが空でも waitEvent() が即時復帰すると誤解
    実装仕様はブロッキング待ち。イベントが来るまで戻りません。

FAQ

Q: 60 ms のタイマはまったく使われないのですか?
A: ONイベントが一度も到着しないので setTimer(60) は呼び出されず、5,000 ms のタイマだけが発火します。
Q: rst の値は問われていませんが最終的にどうなりますか?
A: N が “0” の偶数なので 12 行目の分岐で「rst ← False」が実行されます。
Q: タイマイベントより前にカウンタがオーバーフローしたらどうなりますか?
A: 赤外光が検出されないため getCount() は呼ばれず、オーバーフローが制御フローに影響する場面はありません。

関連キーワード: タイマイベント、ブロッキング待機、イベントドリブン、赤外線信号、カウンタオーバーフロー

設問2〔制御パターン抽出プログラム〕について、(1)、(2)に答えよ。ここで、イベント待ち以外の処理時間は無視できるものとし、タイマは指定された時間に正確に機能するものとする。

(2)本文中のabに入れる適切な状態名を答えよ。

模範解答

a:ON b:OFF

解説

解答の論理構成

  1. 【問題文】には「最初に通知されたイベントが OFF イベントのときは、変数 rst に False を設定する。」とあり、OFF から始まる入力は失敗扱いです。逆に言えば、正常な制御パターンは ON から始まると読み取れます。
  2. 同じく【問題文】で「制御パターンの抽出が成功し…T[2×k]には、a状態の長さが、T[2×k+1] には、b状態の長さが格納される。」と指定されています。
  3. 手順 6 の判定(図3)で待っている最初のイベントは後続の処理で ON/OFF のペアを取り込む流れになっています。したがって偶数添字(2×k)が“最初の ON から次の遷移まで”の時間、奇数添字(2×k+1)が“OFF から次の遷移まで”の時間になります。
  4. 以上より、aには「ON」、bには「OFF」を入れるのが整合します。

誤りやすいポイント

  • OFF イベントを先頭に読み取ってしまい、配列の偶数・奇数を逆に覚えるミス。
  • “赤外線センサは ON→OFF, OFF→ON の遷移だけ通知する”という仕様を見落とし、同一状態が続くケースを想定してしまう。
  • タイマ 60ms の終了条件に気を取られ、配列格納順が問われていることを見落とす。

FAQ

Q: もし ON 状態が途中で長く続き、タイマ 60ms に達して終了した場合でも a/b の答えは変わりますか?
A: いいえ。タイマで打ち切られても最初が ON であることと ON/OFF の交互格納仕様は変わりません。
Q: OFF から始まる制御パターンを持つ赤外線機器は存在しないのでしょうか?
A: 実装上は可能ですが、本プログラムでは「最初に通知されたイベントが OFF イベントのときは…False」としているため、学習対象外になります。
Q: T[] の上限サイズは規定されていないのですか?
A: 配列型は 32 ビット整数ですが、制御パターンは「最大60ミリ秒」「最短350マイクロ秒」とあるので、理論上 個の ON/OFF が上限となり、32 ビット長配列で十分収まります。

関連キーワード: 状態遷移、イベント駆動、赤外線通信、タイムスタンプ

設問3図3の制御パターン抽出プログラムのフローについて、(1)〜(3)に答えよ。

(1)図3中のcに入れる適切なイベント名、及びdに入れる適切な字句を答えよ。ここで、配列T[]の要素の個数は十分に大きいものとする。

模範解答

c:ONイベント d:今回値

解説

解答の論理構成

  1. イベント分岐 c の考察
    • プログラム冒頭で startSensor() を呼び、続いて waitEvent() で最初のイベントを待ちます。
    • 本文に「“最初に通知されたイベントが OFF イベントのときは、変数 rst に False を設定する。”」とあります。つまり最初に欲しいのは ON 側のイベントです。
    • さらに赤外線センサの仕様として「“赤外線センサは、ON状態からOFF状態、又はOFF状態からON状態に遷移したことを制御部に通知する。”」と明記されています。
    • 以上より、フロー図 6 番目の判定では“ONイベント”を Yes 側に取ることで、OFF が最初に来た場合を自然にエラー扱い(No 側)にできます。
      c = 「ONイベント」
  2. 変数更新 d の考察
    • フロー 11-2 で TN ← 今回値 − 前回値 と長さを計算し終わった後、次ループでも差分計算を行うためには「今回値」を次回の“前回値”として保存しておく必要があります。
    • したがって 11-4 の代入は 前回値 ← 今回値 が妥当です。
      d = 「今回値」
  3. 整合性チェック
    • 最初に ON が来た場合だけ ON/OFF のペアが偶数個並び、ループ終了後の「N は奇数?」が True となり「rst ← True」。
    • 最初に OFF が来る、途中で信号が切れる、タイムアウトする場合はいずれも N が偶数となり rst ← False。
    • よって解答は論理的に矛盾しません。

誤りやすいポイント

  • 「最初に ON が来る」と「最初が OFF なら失敗」の規則を見落として、c を“OFFイベント”と誤記するケース。
  • 前回値 ← 今回値 の更新を忘れ、常に最初のカウンタとの差を取り続けてしまう実装ミス。
  • 16 ビットカウンタが 65,535 でロールオーバーすることを踏まえ、11-3 の負値補正ロジックを軽視する失点。
  • タイマ setTimer(60) が「60 ミリ秒」と読めず、“60 秒”と早合点してフロー全体を誤解するケース。

FAQ

Q: なぜ最初に setTimer(5000) を呼んでいるのですか?
A: 「学習対象リモコンの赤外光が一定時間検出されないときは、変数 rst に False」を実現するために 5 000 ms のタイムアウトを先に仕込んでいます。
Q: 11-3 の負値補正は何をしているのですか?
A: カウンタが 16 ビットで「“カウント値が65,535に達すると、次のカウントで0に戻る。”」ため、ロールオーバー直後に差分を取ると負値になります。ここで補正して 1 周分を足し込めば正しい時間が得られます。
Q: setTimer(60) の役割は?
A: 制御パターン全体が「“制御パターンは最大60ミリ秒で完了する。”」ため、ONイベント受信後に 60 ms のタイマーを掛け、次のイベントが来なければ制御パターン終端と判定します。

関連キーワード: タイマ割り込み、イベント駆動、ロールオーバー、信号解析

設問3図3の制御パターン抽出プログラムのフローについて、(1)〜(3)に答えよ。

(2)図3中の下線①について、T[N]<0となるのは、どのような事象が発生したときか。20字以内で答えよ。

模範解答

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

解説

解答の論理構成

  1. プログラムは 前回値 ← getCount() と 今回値 ← getCount() の差を TN に代入しています。
    ⇒ 【問題文】「getCount() … カウンタのカウント値を32ビットの符号付き整数型の戻り値として返す。」
  2. カウント値は上位16ビットが常に0の16ビットカウンタで、65,535 まで進むと次に 0 に戻ります。
    ⇒ 【問題文】「カウンタは16ビットで1マイクロ秒ごとにカウント値が1加算され、カウント値が65,535に達すると、次のカウントで0に戻る。」
  3. したがって
    ・前回値=65,535 近辺
    ・今回値=0 近辺
    となると 今回値-前回値 は負の値になります。
  4. フロー中の下線① TN < 0 判定は、まさにこの負値を検出するための処理です。
  5. 以上より「カウント値が0に戻ったとき」という事象が解答となります。

誤りやすいポイント

  • 差分計算をミリ秒単位と誤解し、赤外光が途切れた時間と混同する。
  • getCount() が32ビットと記載されているため「32ビットならオーバーフローしない」と思い込む。実際には上位16ビットが常に 0。
  • 「OFF→ON 切替え時のみ wrap-around が起きる」と誤認し、タイマイベントとの組合せを考慮し忘れる。

FAQ

Q: TN が負値でも補正後に再び負値になることはありますか?
A: ありません。補正は +65,536 するだけで必ず正の値になります。
Q: wrap-around が発生してもタイミング精度は確保できますか?
A: はい。1周 65,536µs(約 65ms)で、制御パターンは「最大60ミリ秒で完了する」ため1回の計測内で2回以上の wrap-around は起きません。
Q: タイマ値 60 はどこから来ていますか?
A: 「最初のON状態から最後のON状態まで…最大60ミリ秒で完了する」という仕様から、次のイベント待ち時間を 60ms に設定しています。

関連キーワード: カウンタ、オーバーフロー、タイマ、wrap-around, 差分計算

設問3図3の制御パターン抽出プログラムのフローについて、(1)〜(3)に答えよ。

(3)図3中の下線②について、T[N]の補正方法を、20字以内で答えよ。

模範解答

TNに65,536を加算する。

解説

解答の論理構成

  1. カウンタの仕様把握
    • 【問題文】には「カウンタは16ビットで1マイクロ秒ごとにカウント値が1加算され、カウント値が65,535に達すると、次のカウントで0に戻る。」とある。
    • 16ビットなので 0〜65,535 の範囲で周回し、1周の幅は 65,535−0+1=65,536 である。
  2. 差分計算と負値発生の理由
    • フロー 11-2 で「TN ← 今回値 − 前回値」を計算する。
    • ラップアラウンドが起きずに 今回値 > 前回値 なら正値になるが、ラップ後は 今回値 < 前回値 となり TN が負になる。
    • そこでフロー 11-3 で「TN < 0?」を判定し、負の場合に補正処理②へ遷移する。
  3. 補正量の決定
    • 周期幅(1周分)は前述のとおり 65,536
    • ラップ時の実際の経過時間は
      今回値 + (65,536 − 前回値)
      であり、計算式 今回値 − 前回値 に 65,536 を加えるとちょうどこの値になる。
    • よって TN へ加算すべき定数は 65,536
  4. 結論
    • ②の補正内容は「TN に 65,536 を加算する」である。
    • これにより TN は常に正の経過時間を保持し、後続処理が安定して動作する。

誤りやすいポイント

  • 65,535 と 65,536 を取り違える
  • unsigned と誤解し負値が出ないと思い込む
  • ミリ秒とマイクロ秒を混同し補正値を 60 などにしてしまう
  • ラップが複数回起きると誤解して 2×65,536 などを加算する

FAQ

Q: 補正の代わりに unsigned int へ型変換しても良いですか?
A: 本プログラムは「配列T[]及び変数 N は 32 ビットの符号付き整数型である」と明示されており、仕様外の型変換は想定されていません。補正で整合を取るほうが安全です。
Q: カウンタが 0 に戻る瞬間を検出して別処理に分けても良いですか?
A: カウンタ読取は割込みやポーリングではなく通常の関数 getCount() です。ラップ瞬間を確実に捉える保証がないため、差分が負になったときに補正する現在の方法が確実です。
Q: 65,536 をハードコードせず定数にしたほうが良いですか?
A: 実装では const int COUNTER_MAX = 65536; のように管理すると保守性が高まりますが、試験解としては定数 65,536 を明示することが求められます。

関連キーワード: 16ビットカウンタ、オーバフロー、ラップアラウンド、マイクロ秒タイミング
戦国ITクイズ機能

\ せっかくなら /

応用情報技術者
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について