Article header library 124601  1

[消臭剤噴射機TAK1号] 第4話 ハード製作のミス発覚!初めてのソフト設計

まずやること!メインルーチンを考える

ハードウェア設計が完成したので、今回はソフトウェア設計のお話しです。ソフトウェア設計は経験がないため、知らないことばかり。先輩社員に教わりながら、何とかプログラムを作成していきます。

まず最初は、ソフトウェア プログラムの全体構成(フローチャート)を考えていきます。第2話の仕様で決めた状態遷移図を元にメインルーチンのフローチャート作成します。

Article header library 124601 pic01  2

状態遷移図

割り込み要因を決める

何も考えず、様々な機能を盛り込みましたがソフトウェアの世界では「割り込み」という概念を使って実現するようです。恥ずかしながら、はじめて「割り込み」という考え方を知りました。

当初、次の様な機能を考えていたので、これらは割込み処理を使って実現します。

  • 赤外線センサにより人を検知し、衣類用消臭剤を噴射
  • 設定した時間ごとに、部屋用消臭剤を噴射
  • 曜日により噴射される衣類用消臭剤を自動切り替え

人を検知すると「赤外線センサ検知による割り込み」を発生させます。また、時間、曜日情報を知るためにはRTC(リアルタイムクロック)を使用します。設定した時間、曜日になると「RTC割り込み」を発生させます。
今回、RTCを使用することになった経緯については、少し長くなりますので後ほど紹介します。

割り込み処理ルーチンの内容を決める

次に割り込み処理ルーチンの内容を決めます。
  • 「赤外線センサ検知による割り込み」発生時、変数の値に1をセットします。
  • 「RTC割り込み」発生時、タイマーカウントダウンの状態と曜日を予め決めた変数値の通り設定します。

条件を判断する変数を決める

最後に条件を判断する変数を決めました。

「RTC割り込み」発生時の状態を示す変数名にはCDを、「赤外線センサ検知による割り込み」発生時の状態を示す変数名にはSenを付けました。それ以外に、曜日、消臭剤選択の状態を示す変数をそれぞれ、Youbi、Fabと付けました。

変数名とそれぞれの条件についての詳細は、表に示す通りです。
変数名 値 = 0x0 値 = 0x1 値 = 0x2
int CD タイマーのカウントダウン途中 タイマーのカウントダウン終了
int Sen 赤外線センサ検知なし 赤外線センサ検知あり
int Youbi 月曜~金曜 土曜・日曜
int Fab 消臭剤A 消臭剤B 消臭剤C

メインルーチンと割り込み処理のフローチャート

以上の検討結果を踏まえ、メインルーチンと割り込み処理ルーチンを作成しました。

簡単に動作を説明すると、

  • 「RTC割り込み」、「赤外線センサ検知による割り込み」いずれか発生すると噴射ルーチンに入ります。
    ただし、同時に発生した場合は「赤外線センサ検知による割り込み」が優先されます。
  • どちらの割り込みも発生していない間は、曜日や各ボタンの状態に対応したLEDを点灯させます。

Article header library 124601 pic02  1

メインルーチン

 

Article header library 124601 pic03  1

割り込み処理ルーチン

本格化するソフト設計・・・サブルーチンとの格闘

振り返ってみるとどれも困難な道のりでしたが、特にやらかしてしまったところや苦戦した様子をご覧ください。

  • 7segLEDの表示
  • 赤外線センサの動作
  • RTC割り込みルーチンによる曜日のカウント(こちらは第5話でご紹介します)

あれ、LED点灯しない!?衝撃のミス発覚!

7segLEDの点灯に関連するサブルーチンのフローチャートと、7segLEDの点灯パターンは以下の通りです。

  • 電源ON時(初期設定サブルーチンに入った直後)は、「ーー」を表示
    タイマー入力ボタンを押す(フローチャートの"タイマー入力")たびに、「01」、「10」、「20」、「30」、「40」、「50」、「60」、「70」、「80」、「90」(分)と表示が切り替わる
  • タイマーSTARTボタンが押された後は、噴射間隔となるタイマー時間を変更しない限り、設定した「XX」分を表示し続ける

Article header library 124601 pic04  1

サブルーチン:初期設定、タイマー設定

 

Article header library 124601 pic05  1

7segLED点灯時の写真

ここは先輩方に教えてもらいながら進めたこともあり、コードは比較的早く完成しました。早速点灯させてみようとコードを走らせると・・・

なぜか1つも点灯しません。

プログラミングでどこか間違ったかな・・・、とコードを見直しつつ先輩に相談してみたところ、先輩から「コードが間違っていたとしても電源入れて1つも点灯しないっておかしくない?」と言われました・・・。ごもっともです。

結果ですね、
なんと電源と各LEDを接続し忘れていました!!!

そりゃ電源と繋がっていなければ点灯しませんよね。電源と繋いだ後は無事に点灯しました。

センサから異臭が・・・衝撃のミス発覚!part2

赤外線センサは難しそうなイメージがありますが、機能としては至ってシンプルでした。

人が出す微弱な赤外線を検知すると出力を与える。ただそれだけ。

プログラムとしてもシンプルで、センサからの出力がHighなのかLowなのか見るだけ!ということであっさりコードができました。

早速動かしてみるとなんだか異臭が・・・。
一旦止めて再度動かしてみるとまた異臭が・・・。

なんだろうとセンサを触ると火傷するほど熱い!!!
よく見るとセンサが溶けて傾いてしまっています。

原因を探っていくと、センサの電源とGNDを逆に繋いでしまっていました・・・。電源とGNDを間違えるなんてFAEとしてあってはならないミスです。

結果、センサを破壊してしまいました。

今回は新しいセンサを購入することで解決しましたが、致命的なミスが続き気分は沈みます・・・。こういった失敗を経験することも研修の目的だと自分に言い聞かせ、切り替えていきます!

サブルーチン:センサ割り込み

サブルーチン:センサ割り込み

破壊した赤外線センサの写真

破壊した赤外線センサの写真

最後に

実際に機能を実現するプログラムに落とし込むと、製品内部でどういうことが起こっているのかを理解できた気がします。ただこれほど難しい作業になるとは想像もしていませんでした。そして最後の難関であるRTC割り込みをまだ制覇していません・・・。

次回、第5話 最後の難関、割り込み・I2C制御に挑む はソフトウェア開発の後半戦です。
お楽しみに。


おすすめ記事/資料はこちら

商品の購入はこちら

翔け新人!エンジニア奮闘記とは?

マクニカのエンジニアが新人時代に研修中に感じた疑問、制作実習での奮闘、発生したトラブルを解決するまでのフローなど紹介します。個性あふれる新人たちが奮闘から会得した実用的なノウハウを業務にご活用ください。

翔け新人!エンジニア奮闘記 著者紹介はこちら

関連タグ