ソナスの2019年夏期インターン終了のご報告

9月末に8月から実施していた2019年のソナスの夏期インターンが終了しました。

報告が遅れましたが、2019年ソナスの夏期インターンについて、実施内容の詳細をお伝え致します。

 

ソナスの夏期インターンの概要

ソナスの夏期インターンは2018年に始まり、2年連続で実施しました。2018年の参加人数は5名、2019年も5名でした。夏期インターンの実施時期は、2019年8月〜9月です。

2019年の夏期インターンの内容は、無線通信やセンシングにまつわる技術的な課題について、8月から1ヶ月〜1.5ヶ月をかけて学生さん一人一人が異なる課題に取り組むといった内容となっています。学生さんが課題に取り組むにあたり、学生さんだけで取り組むのではなく、弊社社員がメンターとして課題の解決をフォローをします。各課題の詳細な内容については後述しますが、どの課題もハードウェアとソフトウェアをどちらも触れる機会がある内容となっています。

また、インターン期間中の勤務時間に関しては、各自の自由となっています。活動時間が自由なら課題が終わらないのではないか?と、疑問を持たれる方もいるかと思います。それについては面接時に、週どれくらいの時間参加可能かをヒアリングし、活動時間に適する課題を設定の上、無理のないスケジュールを事前に計画することで対応をしています。今回参加された学生さんは任意の時間で週に3〜4日程度活動される学生さんが多かったです。

 

どういった学生さんが参加したか

今回のインターンに参加した学生は、東京大学から3名、大阪大学から1名、山口大学から1名でした。学年は3年生が最も多かったですが、博士の学生も参加しています。

 

ソナス2019年夏のインターンで実際に学生さんが挑戦した課題

今回夏期インターンに参加された5名の学生さんが取り組んだ、5つの課題を紹介します。

1. M5StackによるUNISONet検証用端末の開発

M5 Stackという、IoT技術を使ったDIYの界隈で近年人気を集めているマイコンのシリーズがあります。
M5 Stackの特徴はマイコンボードにディスプレイやセンサなどが搭載されていながら、価格は2,000円前後からと非常に安価であることです。ソフトウェアの開発環境はArduinoで、M5Stack向けのライブラリを適宜使用しつつアプリケーションを開発します。このマイコンを使用し、UNISONetの設定作業やテストに最適な専用デバイスを作りました。

実際に作った端末のイメージはこちらです。以下の画像は、UNISONetネットワークの3つのセンサノードから送られてきた、加速度のデータを可視化している様子です。

M5 StackによるUNISONetのモニタリング
M5 StackによるUNISONetのモニタリング

2. UNISONetを使用した在庫管理システムの開発

弊社の内部的な課題として、在庫管理の一部を自動化があります。在庫管理を自動化する、と簡単に言っても、実際の在庫は棚にある物体を対象とするため、この課題を進めるにはソフトウェアとハードウェアの両面からのアプローチが必要となっています。

ソフトウェアも当然開発しますが、中でもこの課題において学生さんには、物体を計量する部分のパーツの自作から、外装の部分の設計までハードウェアにまつわる全てをやるのが他課題とは異なる点となっています。

担当した学生さんは、工作室の3Dプリンタを短時間で難なく習得し、パーツを生成していました。本人は3Dプリンタについて、少々の経験があるという話でしたが、見事に思うようなパーツを設計し、出力していたのが印象的でした。

実際に設置した在庫管理システム
実際に設置した在庫管理システム
在庫管理システムにはUNISONetが適用されています
在庫管理システムにはUNISONetが適用されています

3. 無線到達距離の実地評価

無線通信は、ご存知の通り、環境によって到達距離が大きく変わります。本テーマでは、見通しの良い河川敷で、どの程度無線が飛ぶのかを検証しました。UNISONetとLoRaを対象に行いました。

担当の学生さんは、パケット到達率を評価するため、LoRaの評価キットを用いてマイコンに対しプログラミングを行いました。また、遠隔にある複数台の通信機のパラメータを同時に変更するために、LTEを介して通信パラメータを変える機能を実装しました。

河川での実験の様子
河川での実験の様子

4. Dashを用いた新センサの実装

Dashは、UNISONet搭載製品を用いて高速に実証実験を行うための基盤技術およびそれを用いたPoCサービスの名称です。

この課題では、Dashを用いてさまざまなセンサを使ってUNISONetでのデータ収集システムの開発を行いました。ここで開発された製品の一部は、追ってリリースされる予定です。

5. UNISONetの通信原理についての研究

UNISONetの通信には同時送信フラッディングという仕組みを利用しています。同時送信フラッディングがうまく機能するかは、物理層の変調方式やパラメータに大きく依存します。

現在UNISONetで採用している物理層技術について、シミュレーション/エミュレーションにより、強め合う条件、弱め合う条件などを、詳細に検証するというのが本テーマです。難易度の極めて高い課題でしたが、無線通信を研究する博士の学生さんが専門性を活かして、見事に結果を出してくれました。

インターン期間のイベントの様子

インターン期間にあるイベントの様子を写真を交えながら簡単に紹介したいと思います。インターン期間にある大きなイベントは3つで、中間報告会、最終報告会、最終報告会後の打ち上げとなっています。

中間報告会

中間発表の様子その1
中間発表の様子その1
中間発表の様子その2
中間発表の様子その2
中間発表の様子その3
中間発表の様子その3

中間報告会は、主に弊社の創業メンバー向けに報告をおこないました。発表時間10分、質疑応答10分の時間を持ち時間とし、報告を行います。

中間報告会の実施時期は、夏期インターンが開始して3週間ほどの時期です。中間報告会の目的は、活動状況の進捗確認も大きな目的ではありますが、課題で「もっとこうしたほうが良くなるのではないか」であるとか、「こういう問題があるのではないか」など、普段の活動では見えない課題や改善点の洗い出しをすることが目的です。

中間報告会後の動きを振り返ると、報告時のフィードバックで得た課題や新しいアイディアをもとに、最終報告会までのスケジュールを調整するような方が多かったです。

最終報告会

最終報告会の様子
最終報告会の様子

最終報告会は、夏期インターンが終わる9月の最終週に実施します。
中間報告会では、創業メンバー数名に向けたプレゼンテーションでしたが、最終報告会では全社員向けと規模が一段と大きくなります。今回参加した5名が、写真では少々暗いですが、執務室エリアで全社員に向けて活動の成果報告をおこないます。

夏期インターンの特性上、学生さんは開発者よりの人材と関わることが多いのですが、今回ビジネス側の人材から「この課題を発展させてよりよいものを作るべき」などといった反響があるなど、発表は大いに盛り上がりを見せました。

打ち上げ

打ち上げの食事会の様子
打ち上げの食事会の様子
打ち上げ後の集合写真。お疲れ様でした!
打ち上げ後の集合写真。お疲れ様でした!

オフィス近くの焼き肉屋で最終報告会の後に打ち上げを行いました。インターン期間中に、学生さんとはランチによく行くことがありましたが、インターン期間中に飲み会を開催できていなかったので、会食にて学生さんとざっくばらんにお話できて楽しかったです。

 

担当者からのメッセージ

弊社の人材採用ポリシーとして、雇用する側・される側が対等であるというポリシーがあります。
採用する側としては、学生さん個人の保有するスキルセット、また参加される学生さんが弊社のインターンに何を求めているのか、学生さんとのニーズと弊社側のニーズのマッチには担当者として特に気をつけました。
その結果、学生さんからは、インターン終了後のフィードバックにて、取り組んでもらう課題や実際の内容については、全員から「事前説明と齟齬がなかった」という回答を得られました。

学生さんからこのようなフィードバックが得られて幸いではありますが、もちろん反省点もあります。課題のマイルストーンを活動のなかで徐々に決めていくような場面もあるなど、至らない点もありました。今後のインターン企画では今回の反省点を踏まえて改善し、より魅力的なインターンにしていきたいと思っています。

M5Stackでビープ音の音量調節を行う

beep関数で音を鳴らすと音量が大きすぎる

M5Stackで一通り機能を試してみよう!と音を出そうとして、とりあえず一番簡単なbeep関数で音を鳴らしてみると、部屋に

ピー!!

と大きめの音が鳴ってびっくりしました。

今回はその解決方法を探っていきたいと思います。

ヘッダファイルの中身を見てみる

短いのでとりあえずM5Stack.hの中でスピーカーに関係するところを全て載せます。

Speaker.cpp

ソースコードのリンク(2019年9月現在)

このソースコードから

  1. スピーカーピンとトーンピンがある (8行目 void SPEAKER::begin )
  2. スピーカーピンには音量がアナログで書き込めるが、トーンピンには周波数がアナログで書き込める(21行目 void SPEAKER::tone, 64行目void SPEAKER::playMusic)

ということがわかります。つまり、playMusic関数では音量を調整できますがbeep関数では音量を調整できないようです。ビープ音の音量を調整するために、3つの方法を検討しました。

解決法① setVolume関数を使う

せっかくsetVolome関数で音量調整ができるので、それを活用していきましょう。

setVolumeで音量を11にして、正弦波の音データを生成してそれをplayMusicで流します。

以下サンプルコード

playBeepでmakeBeepを呼び出し、音データを生成し、playMusicで再生しています。

解決法② 音源を小さくする

それでもまだ音が大きいと感じたのでさらに音を小さくしていきます。

音源データの振幅自体を小さくしていけばさらに音を小さくすることができます。

以下サンプルコード

vが振幅を表しています。

解決法③ ハードウェア的解決

そもそもスピーカーにつながっているアンプの増幅率が大きすぎるのが原因らしいので、そこに抵抗を入れたりすると音量を小さくすることができるようです。(未検証)

さらに、原始的な方法としてスピーカーにテープなどを貼ると音量を小さくできます。

 参考サイト M5Stackのスピーカボリューム調整機構

まとめ

そもそもスピーカーの性能があまり良くないので難しいですが、playMusic関数を用いることでなんとか音は小さくできました。

次は音を出していないときにも勝手に出ている音をなんとかしたいですね。

M5Stackの各種開発環境の紹介

前回の記事では、M5Stackにどんな種類があるのかを紹介しました。今回はそれに引き続き、実際にM5Stackを動かすための環境構築について解説します。

特にMacの場合、公式の説明書に従っていてもうまくいかないのでM5Stackで電子工作等をする上で最も(?)大変になるのがこの環境構築だと思われます。環境構築に関しては、私も大変苦労したしたので、M5Stack初心者にもわかりやすいように経験した限りで開発環境を解説していきたいと思います。

本記事では、Macにおける環境について解説していきますが、Windowsとおおよそは同じのはずです。

開発環境構築の前に…詰まったらまずは新しい情報を検索することがポイント

M5Stackに関する全般について言えることですが、公式が頻繁に仕様を変えることがあるので、「おや?」と思ったら、すぐに検索して新しい情報を探すようにするのが良いと思われます。

どの開発環境が自分に向いているか

まず、簡単にどういう人がどの開発環境を使えば良いかを紹介します。以下、「スケッチ」というキーワードが登場しますが、これはArudinoの世界ではプログラムを指します。

それぞれの開発環境の特徴は、

Arduino IDE→導入が簡単、Arduino言語は広く使われているので他の人のスケッチが探しやすい、エディタとしては少し扱いづらい。

PlatformIO→ライブラリの管理が複雑だが、慣れているとわかりやすい、Arduino IDEと同じ理由で他の人のスケッチが探しやすい。

UIFlow→処理が抽象化されたブロックを使って直感的にプログラムが書ける環境。ブラウザ上で手軽に扱えるのが他の環境に比べて強みであり、すぐにM5Goの付属キットを使うことができる。しかし、スケッチがUIFlowのアプリケーションの一部になるのでメモリが圧迫され、本格的な開発には向かない。UIFlowで使われるMicroPythonはM5Stackで使っている人が少ないので情報が得づらい。

MaixPy IDE→Pythonを使っており、画像認識やニューラルネットの計算を得意とするM5StickVと相性が良い。自分のスケッチだけを書き込めるのでメモリを全て活用できる。UIFlowと同じ理由で情報が得づらい。

なお、UIFlowは、M5StackVの開発には使うことができませんが、それ以外のモデルであれば可能です。

以上の特徴から、目的に応じて下記のように環境をおすすめします。

  • プログラミング、開発初心者である…Arduino IDE
  • Visual Studio Codeをよく使う、慣れている本格的な開発をしたい…PlatformIO
  • お試しで使ってみたい、M5Goを買った、教育用に使いたい…UIFlow
  • 本格的にPythonを使いたい、M5StickVを使いたい…MaixPy IDE

他にM5cloudなどもありますが、既に公式にはサポートされていないようなのでここでは取り扱いません。それではそれぞれの環境について解説します。

各開発環境についての注意点

MaixPy以外のどのエディタにも共通することとして、M5Stack用のUSBドライバをインストールしなければならないので気をつけましょう。

USBドライバをインストールする画面

Arduino IDE

Aruduino IDEは、ほぼC++と同じであるArduino言語を使います。Arduino IDEはM5Stack付属の説明書にも載っているエディタで、これにM5Stack用の追加のライブラリを追加すればすぐにM5Stackを動かすことができます。ただし、説明書に記載のボードマネージャのURLのリンクが切れているので注意してください(2019年8月現在)。何と言っても導入が簡単で、すぐに動かすことができるので手間がかかりません。一方で、エディタとしての機能が乏しいのでプログラミングに慣れている人には少し不満かもしれません。

Arduino IDEの編集画面

実行するには、スケッチを書いたら、ツール→シリアル ポートで正しいシリアル を選択、左上の矢印ボタンを押すと基板に書き込みがされて実行されます。

また、外部エディタと連携するオプションも用意されています。メニュー画面より、Arduino→Preferencesを開き、「外部のエディタを使用する」をONにすることでエディタとしてVScodeを使用することもできます。

参考記事:
初心者向けM5Stackの始め方(ArduinoIDE編) | ラズパイ好きの日記
https://raspberrypi.mongonta.com/howto-start-m5stack-arduinoide/

PlatformIO

PlatfomIOはVScodeの拡張版として存在するエディタで、VSCodeがインストールされていればすぐにインストールすることができます。

Arduino言語でスケッチを書いて、USBを通じて書き込みをするという流れはArduino IDEと同じですが、このPlatfomIOだけで書き込みもできて、プロジェクトごとにライブラリ等を個別に管理するので混乱も起こりづいため、使い勝手が良いです。それなりにコードを書いてM5Stackを動かすならこれがオススメです。

さらに、多くの拡張ツールがPlatformIOを通じて簡単に利用できます。

PlatformIOのホーム画面
書き込みもボタン一つでOK

参考記事:
M5Stackの開発環境を整える – PlatformIO IDE編 – Qiita
https://qiita.com/lutecia16v/items/1c560bdd7eac7ebeaff7

UIFLow

これから紹介するUIFlowからは、言語がPythonライクな言語、MicroPythonによる開発環境になります。UIFlowはブラウザ上で動作するアプリケーションでその特徴はブロックによるコーディングができることと、とても早くM5Stack上での動作を見られるという点にあります。

子供が電子工作を始める場合などにぴったりかもしれません。

UIFlowのブロック編集の画面
直感的でわかりやすい

M5Stackの基板に書き込みをする他の環境と違って、UIFlowはまず付属のファームウェア(初期プログラム)を書き込んでからその上で動作させるので書き込みが不要で、Web上で書いたコードを1秒ほどで動作させることができます。しかし、UIFlow以外の環境と違って、ファームウェアを上書きすることができないのでスケッチは全てファームウェア上で動かすことになります。UIFlowのファームウェアには他にもたくさんの機能が入っているので本格的な開発になるとメモリが足りなくなる可能性もあります。

UIFlowのスタート画面

M5Stack公式がUIFlowをM5Goの方にお勧めしているのは、付属のモジュールをすぐに試せるようになっているからですが、M5StackシリーズならばUIFlowはM5StickV以外ならばどの機種でも使えます。

まずはM5StackにUIFlowのファームウェアを書き込むためにM5Burnerをインストールする必要があります。

M5Burnerを使ったファームウェアの書き込み

※Mac版の場合、M5BurnerをDownloadsフォルダに入れていると動かないのでApplicationsフォルダに移動しましょう。

参考記事:
M5stack(M5GO)とM5UI.Flowであそんでみた – Qiita
https://qiita.com/mashed-p/items/1ba7a3dc54e3b766c2a8

MaixPy IDE

Maixpy IDEは記事執筆時点ではあまり試せていないのですが、M5Stick、特にM5StickVを使うなら、ニューラルネットワークプロセッサを生かした画像認識を扱う方が多いようですので、ライブラリが豊富なPythonを使うことになると思います。そのためにMicroPythonを使えるMaixPyを使うことになると思います。

雰囲気はUIFlowのような感じで編集ができて、M5Stickのカメラの映像をリアルタイムにチェックすることができます。ただしUIFlowのようにインターネットを通じて実行等をすることはできません。

こちらもM5Burnerのようにファームウェアの書き込みをするためにKflash_GUIをインストールする必要があります。

Mac版ではApplicationsに移動しても起動できないのでターミナルから open /Applications/kflash_gui.app で実行します。

MaixPy IDEでカメラ画像を読み込んでいる


参考記事:
m5-docs/m5stickv_quick_start.md at master · m5stack/m5-docs
https://github.com/m5stack/m5-docs/blob/master/docs/en/quick_start/m5stickv/m5stickv_quick_start.md#kflash

macOSでM5StickVをはじめる – Qiita
https://qiita.com/mayfair/items/d1a4ad360670c61ba0fa#fn3

まとめ

以上が実際に体験してきた開発環境になります。
私は現状特にPythonで書く必要がないので、エディタとして使いやすいPlatformIOを使っています。
M5Stackの開発環境は、今後どんどん変わることが予想されます(※付属の説明書に記載のURLは既に使えなかった)。この記事を参考にしながらも、他の最新の情報を参考にしつつ、環境構築をすることをお勧めします。

SONASに圧力センサを導入してみたい。

私がこの夏に取り組んでいるのは、「何らかのセンサを用いた在庫管理システムを開発する」という課題です。

今上り調子のSONASにとって、増加の一途をたどる在庫をスマートに管理することは、急務のようですね。
在庫数をデータに変換する手段として、一番に思いつくのは 圧力センサ ですよね。重さを測って在庫数を管理できないか、これから検証していきます。

さて、圧力センサにもいくつか種類があるようで、今回選択したのは下の棒のようなセンサ。別名ロードセル。どうやら体重計やキッチン量りなどによく用いられているようです。この原理についてはまた別記事で触れようと思います。

歪みセンサ(ロードセル)Amazonページ

写真にあるようにこのセンサの定格負荷は5kgで信頼度は±0.02%F.S.だそうなので、誤差はフルスケールの0.02%なのでなんと±1g、、だそうです。

早速これをArduinoに繋ぎたいのですが、ロードセルが出せる電圧は0.1~0.5mV程度で、Arduinoで直接読むことはできません。そこで市販のロードセル専用ADコンバータを用いてこの電圧を拡大します。もちろんオペアンプ等で自分で増幅回路を組んでも良いです。

画像: amazonより引用

ADコンバータはHX711が搭載されているものならなんでも動きますが、種類によってサンプリング周期が違うようです。

さて接続です。ロードセルからは赤黒白緑の線が出ており、
まずはロードセル⇆コンバータ間

  • 赤:E+
  • 黒:E-
  • 白:A-
  • 緑:A+

に接続します。赤黒はもちろん、白と緑を間違えても動作しません。(変ですね)

次にコンバータ⇆Arduino間

  • GND:GND
  • DT:DIGITAL PIN 8
  • SCK:DIGITAL PIN 9
  • VCC: 5V

次はArduinoのスケッチです。ADコンバータを用いているのでデジタル入力を受け取る必要があります。少し難しいので、秋月電子通商さんが公開しているサンプルコードを使います。
ピン設定は調整しているので、そのままで構いません。変更点はロードセルの定格出力と定格容量です。今回は定格容量5kg、定格出力1±0.1mV/Vなので

#define OUT_VOL 0.001f //定格出力 [V]
#define  LOAD 5000.0f //定格容量 [g]
と変更します。

ここまでで問題がなければ、シリアルモニタに重さと16進数の信号が表示されます。私はこれを達成するのに丸2日かかりました(T . T)

ともあれ、ようやく重さを測定することができました。
次回はこのセンサの信頼性を測っていこうと思います。

M5Stackを始める前に

本記事では2019年8月現在のM5Stackのバージョンについて説明しています。


初めまして、ソナスでインターンを始めましたHです。

このインターンではソナス自体が新しい会社だというのもあって、テーマは設定されますが(現在は)課題がはっきりと決まっていません!

僕はインターン生一人目なので好きなテーマを選ばせていただきました。そこで何を選んだかというと、M5Stackという最近中国で開発されている、小型テレビにボタンが3つ付いているという外見のちょっとかわいいマイコンの動作検証です。

M5Stackは中にArduinoという昔から広く使われているマイコンが入っていて、スピーカーやボタンやディスプレイが付属しているのでこれ一台でそれなりになんでもできてしまうのが強みです。

とりあえず最初はHello Worldから。

さらに簡単に分解することができ、拡張用のモジュールも発売されているのでそれらをピンに挿すだけで機能の拡張が簡単にできます。

M5Stackと言ってもその中にはDSのように様々な種類があり、まずメインで触っているのがM5Stack BASICで、これが最も基本的なM5Stackになります。

距離センサーにM5Stack BASICを繋いで対象との速度をグラフにしています。

それに加速度センサーや磁気センサーが備え付けられているのがM5Stack GREYで、その名の通り灰色のM5Stackです。これはM5 FACESというセットで発売もされていてゲームボーイのようなボタン、電卓風ボタン、QWERTYキーボードがついた基盤の上に乗っています。製品の充実度の割にBASICに比べてすごくお買い得があります。

あの有名ゲームも付属のサンプルプログラムからすぐに遊べます。

現在通常のM5Stackシリーズの最上位(?)として位置づけられているのがM5StackGOです。GOはいろんな拡張モジュールと一緒に発売されていて、UIFlowというブラウザ上から操作できるIDEを用いることができます。その割には値が張る気がしますが…

これはM5GOではありませんが他のM5でもこのようにオンラインでM5Stackをいじることができます。

最後に、M5Stackの亜種とも言えるのがM5Stickシリーズです。Stickというだけあって細長いです。機能面では大きいStackシリーズには劣りますが、なんと言ってもその安さがStickシリーズの売りでしょう。
Stickシリーズで最も基本になるのがM5StickCです。

さらに独自の進化を遂げたStickシリーズがM5StickVです。このVはVisualのVらしく、ニューラルネットワークに特化したCPUを搭載しており、画像認識を得意としているそうです。コード例を書き込めばすぐに使えるらしくぜひ使ってみたいですね。

高性能と噂のM5StickVです (*画像はM5Stack公式より)

国内ではスイッチサイエンス等で早く購入することができます。安く購入するなら配送に時間はかかりますが公式ページから購入するのが良いでしょう。拡張ユニットも豊富に取り揃えてあります。

2019年夏期インターンがはじまりました

ソナス株式会社の宮内です(2019年7月、つい先日入社したばかりです!)。
弊社は今年も、昨年に引き続き夏期インターンを実施しています。
昨年は弊社社員のつながりによる募集のみでしたが、今年はそれに加え、さらにインターネット上でも募集を行いました。
結果、多くの応募を頂き、満員御礼となりました(…と言っても、弊社のインターンの定員数は5名と、大きな企業さんと比べると決して多くはありませんが)!

弊社の社員数は2019年8月の現時点で10名ですので、5名の受け入れはなかなか頑張ったなあ、と思います。
弊社のインターンでは、ソフトウェアからハードウェアを対象とする課題まで、さまざまな題材を取り扱っています。応募された学生さんに、弊社のインターンのどういうところに興味を持ったのかを聞いてみたところ「ハードウェアに触れられる環境が魅力に感じた」という回答が多く見受けられました。ソフトウェアではなく、ハードウェアを取り扱うインターンが世の中のインターンに少ないのか、採用する側としては重要なアピールポイントであると、あらためて感じました。ハードウェアを扱う弊社にとっては、学生さんからのコメントより、なかなか良い知見を得られたなあと思っています。

今回の夏期インターンでは、インターン生に取り組んでいる課題や日常について、このブログでアウトプットしてもらいます。

皆さん、ぜひ温かい目で見守ってあげてください!