Article header library 129409  1

[お掃除ロボ/てんぜん] 第4話 動き出したお掃除ロボット

ソフトウェア製作開始

こんにちは。てんぜん です。

前回は、ハードウェア製作を行いました。
肝心のブロアが正常に動かない問題が発生しましたが何とか解決しました。
[お掃除ロボ/てんぜん] 第3話 取り戻せ!ブロアの力

今回からソフトウェア製作に入ります。
とりあえずマイコンのピン設定から入ります。あらかじめ使用するピンは決めていたので、その通りにプログラムを書いていきます。入力と出力やピン番号を間違えないように気をつけます。

ライントレース

ここから、動作のプログラムに入ります。
ライントレースでは、フォトリフレクタの信号を見て動作を決定します。

Article header library 129409 pic01  1

ライントレースフローチャート

タイマーは後で作るので、ひとまず置いておきます。

マイコンのピンがHighかLowか読み取りたいので、記述方法を調べます。
Simplicity Studioに入っているサンプルコードを読んでいくと、GPIO_PinInGetというものを使用すればピンの値を読み込めることがわかりました。フォトリフレクタを接続しているピンの値を読み込んで、条件ごとに動作を記述します。

今までハード製作でかなり苦労してきましたが、ソフト製作は比較的スムーズに進んでいます。ライントレース部分まで書き終えたのでテストをします!

ライントレーステスト

電源をオンにしても全く動きません・・・。

原因調査です。
とりあえず、プログラムを一行ずつ実行していきます。

すると、フォトリフレクタの値が上手く読み取れていないことがわかりました。
マイコンのピンが3.3Vでも0Vでも、読み込んだ結果がLowになってしまっています。何で読み込めていないのか、プログラムを何度見てもわかりませんでした。マイコンのピン設定を変更したり、違うピンで試してみたりしましたがダメでした。

先輩にプログラムを見てもらいます。「何でここ16進数で書いてるの?」と、ピン設定の部分に指摘がありました。自分としては複数のピンを同時に設定するために16進数で書いていたのですが、この書き方が正しいか調べた方が良いと言われました。

Article header library 129409 pic02  1

ピン設定記述法

・・・何・・・だと・・・?
アプリケーションノートを見てみると16進数で書かれていない!?

いつの間にか錯覚していたようです。こちらのものと混ざって16進数で書いてしまっていました。

Article header library 129409 pic03  1

ピン出力記述法

10進数で書き直して実行すると、無事フォトリフレクタの値を読み込むことができ、動作することを確認できました!

人に見てもらうことは重要だなと感じました。自分では間違っていないと思っていたところの間違いに気づくことができました。

3分タイマー

タイマーは、サンプルプログラムを少し変更したら一瞬で終わるだろうと思って取り掛かりました。

タイマーは TopSet という値を決めて、カウントが TopSet 値に達すると、LEDの点灯と消灯が切り替わるサンプルプログラムがあります。これを利用して TopSet 値を3分に設定して、実行!

求める動作としては3分でLEDが点灯して、その後3分で消灯して欲しかったのですが、LEDがすごい速さで点滅するだけでした・・・。

いろいろ試していると、どうもタイマーで数えられる限界が5秒程度だということがわかりました。
タイマーのレジスタが16ビットなので、65535が設定できる最大値だったのです。
タイマーの入力クロックを変えることを検討しましたが、机上の計算では3分に届きません・・・。

for文を使用して3分を測ることもできるのですが、5秒間隔で割り込み処理に入るのは動作に影響がでるかもしれないと思いました。
どうにかできないかデータシートを見ていると、このようなものを見つけました。

Article header library 129409 pic04  1

タイマー接続

タイマー0のオーバーフローで、タイマー1がカウントされるというものです。

要するに、タイマー0を5秒で設定しておくと、5秒おきにタイマー1がカウントされます。タイマーを2つ使用すれば毎回割り込みをしなくても3分を測ることができます!

3分になるように設定して動作テストです。

Article header library 129409 pic05  3

3分タイマーテスト

3分を測れるようになりました!
3分後の割り込みの処理を入れて完成です。

フィールド内テスト

ライントレースとタイマーは完璧です!
後はフィールド内動作です。
赤外線センサの出力を見て動作を決めます。

壁を検知すると(左写真)、バックして方向転換(右写真)をします。

Article header library 129409 pic06  1

1. 壁検知 / 2~7. バックして方向転換

動作に問題は無さそうです。
壁にぶつからないようにだけ調整して終了です。

斜めから壁に近づくと、ぶつかる確率が高くなります。
改善するために前面につけているセンサの角度を変更し、ぶつからないようにすることができました!

超音波センサは時間の都合で、使用することをやめました。赤外線センサだけでも壁の色の影響は特になかったのでこれで戦います。

最後に

ソフトウェア製作を終えました。
残すは本番のみです。

次回、第5話です。
[お掃除ロボ/てんぜん] 第5話 ごみVSお掃除ロボット

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

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

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

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

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

関連タグ