[RISC-V技術ブログ連載第19回]Learn InventorでRISC-Vを始めよう①

SiFive技術ブログ・アイキャッチ画像 RISC-V

1.はじめに

 今回から2回に渡って技術ブログを担当させて頂くことになりました、Life-iz株式会社ヒアーイーズしんばしです。始めての技術ブログの執筆、そして、始めてのRISC-Vボードの操作となりますが、お付き合いいただければ幸いです。
 まずは、私たちの自己紹介をします。Life-iz株式会社は横浜市泉区で就労継続支援B型事業所のヒアーイーズしんばしを運営しています。ヒアーイーズしんばしでは「就労意欲はあるが、体力や人間関係に不安がある方」を対象に機械学習、ホームページ制作、デザイン、動画編集などPCでの作業を中心とした支援事業を提供しており、その一環としてRISC-Vの学習にも取り組んでいます。

ヒアーイーズしんばし外観
作業風景

2.Learn Inventorについて

 今回ヒアーイーズしんばしが取り上げさせていただくのは、Learn Inventorボード(以下Inventor)という小型のコンピュータデバイスになります。Inventorは、子供たちでも容易に扱えるような非常にシンプルなデバイスです。
 Inventorについてご紹介していきましょう。InventorはSiFive製のボードで、主に教育用途に用いられます。教育用途でシンプルな仕様をしているため、手軽にRISC-Vを触ってみたいという方にもオススメだと思います。どこまで手軽に扱えるか実際にプログラムを作成し、試していこうと思います。

Inventorの外観(左: 表、右: 裏)

3.Inventorで出来ること

 Inventorはシンプルでありながら、とても便利な機能を有しています。
 SiFiveの150MHz FE310 SoCをベースにしたInventor開発システムは、512KBフラッシュストレージ、6×8ワイドスクリーンフルカラースペクトルLED、Wi-Fi、Bluetooth、加速度計、温度計、コンパス、環境光センサーなどの幅広いインターフェースとセンサーを搭載しています。これらを用いて、例えば環境光センサーと温度計を組み合わせて冷蔵庫の開けっ放し状態を警告したり、Wi-Fiと環境光センサーを組み合わせて目覚まし時計を作成するなどといったことが実現できるかと思います。
 また、Inventorでは、ビジュアルプログラミングというブロックを積み重ねて作るプログラムとMicroPythonを用いたプログラムの2通りが可能です。今回、ヒアーイーズしんばしでは、AIにおける機械学習フレームワークを操作する業務もありPythonには日頃から触れているという背景があったため、MicroPythonを用いたプログラミングに挑戦してみます。MicroPythonは主にマイコンのような、リソースが限られている場合に用いられるPythonの一種で、大雑把に言えば、機能限定版のPythonと見なすことができます。今回は、実際に、RISC-Vボードを簡単に動かすということを重視して、REPL(※1)を用いたプログラミングを行っていきます。

※1 Read-Eval-Print Loopの略で、利用者が入力欄にキーボードなどから式や文を一行入力すると、即座に解釈・実行して結果を返し、再び入力可能になるもの。インタプリタの一種。

4.Inventorで電子コンパスを作成しよう

4.1.準備

 それでは、Inventorを利用したプログラムを作成していきます。ヒアーイーズしんばしで花を植えようということになり、敷地内のどこがより日差しを受けることが出来るのかを調べようという話が出たので、電子コンパスを作成してみようと思います。
 作成にあたって用いたのは以下の通りです。

①ハードウェア
・PC
・Inventor本体
・MicroUSBケーブル
 データ通信用

②ソフトウェア
・OS
 Windows10 64bit
・ターミナルソフト
 Tera Term(ver.4.106)

4.2.接続を行う

 それでは、InventorとTera Termを接続します。まず、Micro USBケーブルでInventorとパソコンとを接続します。続いて、Tera Termを起動します。Tera Termを起動すると、下図のような画面が表示されます。

接続の設定を行う

 この画面で新しく接続されたデバイスを選択します。まず、「シリアル(E)」を選択し、続いて「ポート(R)」からデバイスを選択します。任意の接続されたポートを選択しOKを押し、新しい接続画面を完了させます。
 次に、「設定(S)」から「シリアルポート(E)」を選択し下図のウィンドウで設定を行っていきます。

シリアルポートの設定と接続 画面

 この画面で変更を行うのは、「スピード(E)」の項目です。Inventorにおいては、115200という値を用いるため、スピードを変更します。スピードの変更を行い次第、「クローズ&新規オープン(N)」を押して変更を適用し、Inventorの裏側にあるRESETボタンを押します。この時、無事に接続がされていれば、次のようなSiFiveロゴが表示されます。

SiFiveロゴ

 無事にロゴが表示されたら、Ctrl+Cを押し、REPLの入力待ち状態へ移行します(下図参照)。この状態で、MicroPythonのスクリプトをターミナルソフト上でコーディングし、実行することが出来ます。また、この画面で「help()」と入力し、Enterを押すと、ヘルプ内容が表示されます。この時に、チュートリアルサイトのURLも表示されるので、MicroPythonで困ったときにはそちらをあたるということも可能です。

MicroPythonの入力画面

4.3.MicroPythonの実行方法

 それでは、早速MicroPythonを実行していきましょう。どのようにInventor上でソースコードを実行するか、まずは、その方法の解説を行っていきます。REPLの入力待ち状態で、Ctrl+Eを押しペーストモードへ移行します。対象となるソースコードをターミナル上にコピーし、Ctrl+Dを押しMicroPythonを実行します。

4.4.電子コンパスを作ろう

 具体的にMicroPythonを用いて電子コンパスを作成します。作成したソースコードは以下のようになります。

from hifive import *
compass.calibrate()
while True:
    n = ((360 - compass.heading())//45) % 8
    display.show(Image.ALL_ARROWS[n])

 それでは、ポイントとなる行について説明をしていきます。
 まず、2行目

compass.calibrate()

 でキャリブレーション作業を行います。
 下図のように電子コンパスのキャリブレーション画面が表示されるので、画面を傾けつつ画面全体のLEDを点灯させるようにキャリブレーション作業を行います。画面全体のLEDを点灯させた後、しばらく待つと、スマイルマークが表示され、キャリブレーション作業の完了を知ることができます。

キャリブレーション作業中
キャリブレーション作業完了(スマイルマークの表示)

 4行目(以下)の説明です。

n = ((360 - compass.heading())//45) % 8

 4行目のcompass.heading()はInventorの向いている方位を0~360(時計回り)の整数値で返します。たとえば、真北では0、真南では180となります。compass.heading()の理解ができたところで、変数nについて見ていきましょう。Inventorが真東(90°)を向いているとき、4行目の式に従いnの値を計算すると、6となります。

 最後となる5行目(以下)ですが、

display.show(Image.ALL_ARROWS[n])

 たとえば、n=6のとき、display.show(Image.ALL_ARROWS[6])は下図のように、Inventorディスプレイ上で’←’を指し示します。

display.show(Image.ALL_ARROWS[6])のときの表示

 ソースコードの説明は以上になります。
 プログラム全体の流れは、①キャリブレーション、②方位の取得、③矢印を表示するためのパラメータの決定、④矢印の出力、②~④の繰り返し、となります。
 それでは、実際にプログラムを動かしてみます。前述のキャリブレーション操作を行った後、下図のように常に北を示す矢印が表示されました。

測位をしている様子

4.5.電子コンパスを改造する

 ここまでで電子コンパスが完成しました。しかしながら、今回作りたいのは陽の当たる場所を探すということを目的とした電子コンパスです。一般的にコンパスは北を示すものですが、より使いやすくするために南を示す電子コンパスを作成することにします。改変するのは4行目です。南を向くようにするには、北の場合から矢印を180°ずらせばよさそうです。というわけで定数の360に180を加え540に変更します。

n = ((540 – compass.heading())//45) % 8

Inventorでは、改変後のコードの適用も非常に簡単に行えます。REPLを用いていますので、改変後のコード一式をターミナル上にペーストするだけで反映できます。結果、下図のように南を示す電子コンパスの作成に成功しました。

南を示す電子コンパス

 改変したコード一式は以下のようになります。

from hifive import *
compass.calibrate()
while True: 
    n = ((540 - compass.heading())//45) % 8
    display.show(Image.ALL_ARROWS[n])

 非常にシンプルなコードでしたが、RISC-Vボードを手軽に扱うことが出来ました。日頃触れているPythonの知識を応用することが出来ました。MicroPythonやInventorの理解をさらに深めれば出来ることは膨らんでいきます。

5.まとめ

 南を指し示す電子コンパスのおかげで、今回の目標であった、陽の当たる場所を探すという目的は無事達することができ、植えた種が無事に芽吹いてくれました。

花壇の様子

 今回の技術ブログはいかがでしたでしょうか。Inventorの簡便さ手軽さをお伝えできたのではないでしょうか。次回も、私達ヒアーイーズしんばしが技術ブログの執筆を担当します。引き続き、ヒアーイーズしんばしでの困りごとの解決に役立つデバイスを開発する、といった視点で検討したものを題材としてお送りする予定ですので、ご覧いただければ幸いです。ここまでご覧いただきありがとうございました。

著作権および商標
本ブログに記載する製品名は、一般に各開発メーカーの商標または登録商標です。
なお、本文中には™ および ® マークは表記していません。

■■DTSインサイトの「システムLSI設計ソリューションサービス」■■
 DTSインサイトでは、システムLSI/FPGA設計の受託も行っています。
 当社のノウハウを活かした、ソフトウェアの移行(マイグレーション)
 サービスも提供しておりますので、お気軽にご相談ください。

システムLSI設計ソリューションサービス紹介は こちら