Article header library 129505  1

[お掃除ロボ/バッカス] 第4話 ようこそ・・・「ソフトの世界」へ・・・

ソフトの世界

こんにちは、バッカス です。
前回の [お掃除ロボ/バッカス] 第3話 ふるえるぞハード!燃えつきるほどヒート!では、HWの製作を行いました。

この第4話ではSW(ソフトウェア)の製作を行います!
私自身、パソコンにあまり触れてこなかったので、C言語の世界は不安な気持ちでいっぱいです。ですが、まぁ何とかなるだろうの精神で突き進みます!

今回使用するSilicon Labs社マイコンのスタータキット(EFM32GG-STK3700) はSimplicity Studioという開発ツールが無償で提供されており、サンプルコードが豊富にあります。

このサンプルコードを元にガシガシ書き込んでいきます!

フローチャート

まずはフローチャートを書いてプログラムの流れを整理します。
以下が大まかなフローチャートになります。

Article header library 129505 pic01  2

大まかなフローチャート

実際に書いたプログラミングを載せていくとキリがないので、今回は特に苦労したプログラミングを説明させて頂きます!

超音波センサ

今回、SW製作で特に苦労したところ、それは・・・

超音波センサのプログラミング

です。

まず、以下が超音波センサのフローチャートになります。

Article header library 129505 pic02  1

超音波センサのフローチャート

超音波センサは、Trigger入力に10μs以上Highのパルスを印可すると、超音波パルスが送信されます。
その後、超音波パルスが戻ってくるまでの時間、つまりEchoピンがHighになっている時間の半分を音速で乗算した数値が距離となります(下図参照)。

Article header library 129505 pic03  1

超音波センサの動作概要

このときのパルス幅は、インプットキャプチャで測定します。これは、条件を満たしたときのカウントの値をレジスタに記録する機能です。

今回は、超音波センサからの出力がHighになっている時間を測定する必要があるため、信号の立ち上がりと立ち下がりを条件として設定します(下図参照)。
記録後、以下のように計算すればHighになっている時間を求めることができるのです。

立ち下がり - 立ち上がり = パルス幅

Article header library 129505 pic04  1

インプットキャプチャの動作例

超音波センサが動かない

プログラムを書き終えて、超音波センサを動かそうとすると、距離が計測できませんでした。
テスターで調べると、超音波センサ自体には問題はありません。
どうやらプログラムが間違っているようです!

パソコンと向き合うこと数時間、しばらく一人で奮闘していましたが埒があきません。
このままだと時間がもったいないです。

こうなったら、必殺、先輩社員に相談です!
なんたって去年、超音波センサを実際に使用したウッディ先輩がいるのですから!

衝撃の事実

ということで、ウッディ先輩に相談です。
ここで衝撃の事実が発覚します。

バッカス「超音波センサのインプットキャプチャが上手くできないんですけど、どうしてですかね?」

ウッディ先輩「ああ、俺もサンプルコードが上手くいかなくて、自分でプログラム書いたんだよねー。」

バッカス「・・・・・・。」

絶句です・・・。

どうやらプログラミング初心者の私自身で、1からプログラムを作らないといけないようです。
この時点で、超音波センサのSW製作に取り掛かってからすでに2日過ぎていた私には重い言葉でした。

赤外線センサで代用するという案もありましたが、私としては超音波センサを使いたかったのであきらめません!(部品を買いに行く時間ももったいないですし)

ということで、フローチャートを作り直して、その通りにプログラミングを行いました。
修正版のフローチャートは以下のようになります。

Article header library 129505 pic05  2

超音波センサのフローチャート(修正版)

ここで、AとCは今現在の値、BとDは1つ前の値を保持しています。
前後の値を比較して、立ち上がり (A=1,B=0) と立ち下がり (A=0,B=1) のときのタイマーのカウントを求めて、差分を出せばパルス幅が求められて距離が出ます!

計算式は以下のとおりです。

立ち下がりのカウント値 - 立ち上がりのカウント値 = パルスのカウント値
パルスのカウント値 ÷ 1秒あたりのカウント数 = パルス幅
パルス幅 × 音速 ÷ 2 = 距離

結果的には自分でプログラムを1から作成し、超音波センサを動かすことができました!

後から聞いた話ですが、ウッディ先輩によるとインプットキャプチャのサンプルコードにTimerとGPIOをつなげる設定を書き足せば使えるそうです。

筐体完成

HWとSWの設計を終えて完成した筐体がこちらになります!

想像していたよりも多くの部品を使ったので、思っていたよりも大きくなりました(ル○バとかを想像していたので)。ですが、配線をできるだけまとめていたので、効率的にデバッグすることができました!

Article header library 129505 pic06  1

左:筐体前方 / 右:筐体後方

最後に

ここまで様々な問題に衝突し、痛い目に合いながらもHW製作とSW製作を終えることができました。
しかし、製作実習は完成させて終わりではありません!発表本番があるのです!
最後の最後まで是非お付き合いお願いします。

第5話では、HWとSW製作以外でも苦労したことに触れていきます。
次回、[お掃除ロボ/バッカス] 第5話 遠回りこそが最短の道 です。こうご期待!

この記事で使用した商品はこちら

2018年度 翔け新人!エンジニア奮闘記はこちら

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

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

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

関連タグ