• 公開日:2021年06月16日
  • | 更新日:2022年11月30日

マイコン初心者が色判定可能なマシンを作ってみた 第4話「ソフトウェアを作ろう!~マイコンとの闘い~」

こんにちは。“四代目ビリーK”です。

前回の第3話ではマシンのハードウェア作成についてお話させて頂きました。

第3話「ハードウェアを作ろう!~予想外の敵現わる~」

前回でハードウェアのプロトタイプが完成しましたが、本当に動くのか!?今回はソフトウェアをマイコンに実装していきたいと思います。

その前に、現段階でのスケジュールは以下になります。

発表会まで1週間をきりました!!!
幸い、ソフトウェアはI2C(カラーセンサー)の基本が出来上がっているので、GPIOとSPI(全体技術研修で使った)の制御部分がこれから作成しなければいけないソフトウェアです。

では、ソフトウェア作成に取り組んでいきたいと思います!

 

一般的なC言語の知識で上手くいく!と思っていたマイコンのプログラミング…

プログラミング言語と言えば皆さん何をイメージされますか??
「C言語、Java、Go、Swift、Python、etc…」等があります。
私は大学時代カリキュラム・研究等でC言語とPythonに触れたことが合ったので、正直なんとかなると考えていました。

絶望でした。

5月に行われた全体技術研修のマイコン講座では、テンプレートが有りC言語でLEDの光り方を制御するだけでした。なので、C言語の知識を勉強すれば良いと考えておりました。

しかし、実際にマイコンで0から自分の機能を作るとなると話レベルが違いすぎました(ちなみに、生まれて初めてマイコンに触れました)。

マイコンではプログラミング自体はC言語なのですが、マイコンの機能を有効/無効にしたりするのにレジスタの設定をしなければなりません。
これがとても難しいです。ユーザーマニュアルやデータシートを読み進めながら一つ一つ理解する他ありません。

第2話で出てきました先輩に教えて頂いたTIのサンプルコードサイトを見ても全く分かりません。
とりあえず、全貌を理解するのをやめ、ユニット毎にプログラミングを作っていく事にしました。

 

ユニットごとのプログラムを作る

プログラミングの際、基本的にはオブジェクト指向で進めていきます。
ですのでユニット毎にプログラムを作ります。

今回私が使用するインターフェースは、GPIO, I2C, SPIなのでサンプルコードを元に作っていきます。
インターフェースで使用する部品の内訳

  • GPIO:スイッチ、ブザー、照度センサー、フルカラーLED、7セグLED
  • I2C :カラーセンサー
  • SPI :LEDマトリクス

まず、簡単な所から始めます。スイッチ、ブザー、照度センサーに取り組みました。
ここはI/O(Input/Output信号)だけなので簡単です。実際にプログラム毎に動かしてみましたが良好です。
スイッチ、ブザー、照度センサーは終わりました。

  • GPIO:スイッチ、ブザー、照度センサー、フルカラーLED、7セグLED
  • I2C :カラーセンサー
  • SPI :LEDマトリクス

フルカラーLEDはカラーセンサーから得たカラーデータの値を反映させる予定です。従って、カラーセンサーはおおよそ完成しているので、ここはセットとして後に回します。
スケジュールに大幅な遅れをとっているので、優先順位付けを意識するよう先輩にアドバイスを頂きました。
優先順位としては(7セグLED >> SPI >> カラーセンサーとフルカラーLED)とします。

 

絶望と希望が混ざり合う7セグLED開発

7セグLEDは、カウントダウン/カウントアップを表示します。
なんとか、過去の先輩方のサンプルコードなどを参考にしながら作成してみました。

(はんだ付けをする前に電源が入るか配線チェックしている所です。ここにマイコンを繋いでチェックしていました。)

しかし、7セグを5個使いたいのですが、1個しか動きません。
何回作り直しても動きません。
もう一度はんだ付けと配線を確認しました。
動きません。

とても焦りながら、先輩に助けを求めました。
一緒にデバックしました。

配線と電圧(導通)をチェック。OK。
最後に、データーシートチェック。
見つけました!!!
このシフトレジスタは数珠つなぎが出来ないシフトレジスタでした。
つまり、1個の7セグLEDしか制御が出来ませんでした…

あれれ、もしかして…
シフトレジスタを間違って購入していました!!

絶望です。

もう一度購入して、はんだ付けし直すという作戦もありましたが、スケジュール的にかなり厳しいです…

先輩と話し合いました。
7セグLEDは数珠つなぎ出来るシフトレジスタがないと動きません。
現状のままですと、GPIOピンが沢山あれば動かせますが、圧倒的に足りません。

うーーーーーん

あ、そうだ!!!
LEDマトリクスだ!!!
これなら、SPI接続を使うのでピンはそのままで、かつ7セグLEDの代用になる!

希望の光が見えました!!!

という事で、気持ちを大いに切り替え、LEDマトリクス表示作戦に切り替えます。
SPIのLEDマトリクスでは、タイムアップ/カウントダウンを表示させることにします。
早速作成してみました…
数字は表示されますが、カウントダウンが行われません。なので、カウントアップをまずは作ってみる事にしました。

(電源を入れた所です)
動きません。

絶望です。
と言いたい所ですが、冷静になりました。
研修で用いたSPIのサンプルコードを参考に作ってみましたが、やはり、時間が連続で動きます。

悩んでいる暇はありません。
先輩に相談しました。
一緒に考え、教えて下さいながら、作成すること、数十分。

完成致しました!!!
本当に感謝です。

カウントアップは一旦出来ましたので、カウントダウンは、優先順位を後にします。

続いて、カラーセンサーとフルカラーLEDのプログラムを作成します。
まず、GPIOでフルカラーLEDにカラーデータを反映できるかをやってみます。

一向に出来ません。
電源投入時青色に光るのですが、一向に変化しません。

データシートを読みましたが、データの送信の仕方や電源などに関しては問題ありませんでした。

ただ、1つだけ見つかりました。
それはClockです。つまり、タイムチャートです。

フルカラーLEDのタイムチャート

https://cdn-shop.adafruit.com/datasheets/WS2811.pdf

 

カラーセンサーのタイムチャート

https://ams.com/documents/20143/36005/TCS3472_DS000390_2-00.pdf/6e452176-2407-faaf-a590-d526c78c7432

フルカラーLEDのdelay timeとカラーセンサーのdelay timeを上手く調整しなければなりません。
delay timeとは、任意の時間プログラムを停止する指示です。
次のプログラムまでの時間が早すぎたりすると、デバイス起動等のタイミングが合わないため調整しなければなりません。
マイコンのデータシートを見ながらdelay time (Clock)を調整し、なんとか光らせることに成功しました。

 

カラーセンサーのソフトウェア制御

カラーセンサーでRGB(カラー)データの取得に成功し、フルカラーLEDで任意のRGBデータを反映させることに成功したのでこの2つをいよいよ統合します。

プログラムを作成しました。

LEDは光りません。

実はここは想定内です。
理由は、ズバリ「クロック」です。
今回、フルカラーLEDの方がカラーセンサーのクロックより速いです。
従って、マイコンの内部クロックをフルカラーLEDに合わせ、ソフトウェア上でカラーセンサーのdelayを上手く調整しなければなりません。
クロックを統一するのはとても重要な事と学びました。

そして、うまく調整し、無事カラーセンサーからのカラーデータを反映することに成功しました!!!

だが、しかし、問題が発生しました。

それは、カラーセンサーのセンシングが敏感過ぎました。
しかし、2週間カラーセンサーのアクセスで苦闘した甲斐があり、カラーセンサーの設定(主にGainとRange)を変更する力が身についていましたので、ここも色々試して実験するのみです。

・Gain:x60(MAX)とデータ取得time:700ms(MAX)
→Gainが強すぎてカラーデータが“白色”になる、カラーデータを反映するまでの時間がかかる。

・Gain:x16とデータ習得time:2.4ms(min)
→Gainを弱めたことで色の変化は確認出来る、取得時間が早すぎて意図通りの色が全く反映されない。

・Gain: x1(min)とデータ習得time:101ms
→前よりは意図通りの色が反映されるようになったが、しっくりこない。

と実験をし、無事いい感じに色を反映することが出来ました。

ここまでの経過を先輩方に報告致しました所、「閾値とかを設定して、きれいに色を反映できると面白いかもね!」と、アドバイスを頂きました。

そこで2つの反映モードを作成しました。
それは
① リアルデータ反映モード
② 閾値データ反映モード
です。

①はカラーセンサーが読み取ったRGBの値をそのまま反映する、いたってシンプルなものです。(ずっと実験していたものです。)

②はカラーセンサーが読み取ったRGBの値を各色の閾値と比較し、該当する色を反映するものです。
例えば、下の色は何色か分かりますか?

正解は「黄色」です。

例えば黄色の場合、センサーからは「R:G:B=49:39:20」という値が来ます。なのでここの値を基準に閾値範囲を設定(R>G && R>B && R>20、B<30)し、自ら作った黄色のカラーデータを反映させます。
ルービックキューブ®6面の色のカラーデータのサンプルを取りフローチャートを作成しました。

この様に、①では何色か分かりませんが、ボタンでモードを切り替えることで本当の色が分かるというものです。

では実際に①と②を実験してみた際の動画をご覧ください。0:15あたりで、①から②へ切り替えています。

果たして、皆さんが揃えたルービックキューブはどんな色に近づくでしょうか、楽しみです!!

本当に壁しかなかったですが、なんとか沢山の先輩方に助けられながら、ソフトウェアが完成しました。
本当に感謝です。

各々のユニットのソフトウェアは出来ましたので、いよいよ全体統合です!!
残り発表会までギリギリ1日ですが、この日は一旦終わりました。

という事で筐体のプロトタイプも出来、ソフトも出来いよいよ光が見えました。
製品の完成まで、あと一歩です。

いよいよ感動のフィナーレです!

次回は、第5話「ま、さ、か、~最大のピンチ!!!~」です。

第5話を読む

※ルービックキューブは株式会社メガハウスの登録商標です。

マイコン初心者が色判定可能なマシンを作ってみたシリーズ一覧

第1話「仕様を考えよう!製作実習はじまる!!」
第2話「カラーセンサーの実験をしよう!~はじめてのI2C~」
第3話「ハードウェアを作ろう!~予想外の敵現わる~」
第4話「ソフトウェアを作ろう!~マイコンとの闘い~」
第5話「ま、さ、か、~最大のピンチ!!!~」
第6話「フィナーレ~技術商社のその先へ~」