インターンからアルバイトへ:RFIDとArduinoをWebAppで管理・制御

はじめまして。 2019年4月新卒予定のアルバイトスタッフの青木です。

今回はアルバイトスタッフをさせていただくまでの経緯と、アルバイトスタッフとして行った事を紹介していきたいと思います。

自己紹介

今年の春に新卒としてオプティムに入社させていただきます。青木と申します。 奈良生まれ奈良育ちの田舎民です。小学生の頃にWindows 95を触っていました。

  • 年齢:22歳
  • 性別:♂
  • 好きな食べ物:RaspberryPI

時系列

時期 内容
2017年6月頃 オプティムと出会う
2017年夏 夏のインターンシップ参加(1週間)
2017年11月頃 リモートアルバイトスタッフとして仕事を始める
2019年3月現在 リモートアルバイトスタッフとして勤務中
2019年4月 正社員として入社予定

趣味

普段はミラーレス一眼を持ち歩いて風景写真を撮影したり、自宅でDTMなんかもやってます。ドライブと旅行が好きで度々車で東京ー大阪間を行き来していますが、マイカーを持っていないので当面はマイカーを持つことが夢です。

アルバイトまでの経緯

学生生活について

2015年春に4年制のコンピュータ系専門学校に入学し、2・3年程関西のWeb制作会社やネットワークの会社で掛け持ちアルバイトをしていました。授業ではCiscoルータやスイッチ等、ネットワーク構築やWebアプリケーション・基本言語の学習(C・Java・HTML,CSS・PHP)・設計モデル(ウォーターフォール・アジャイル)に準じたプロトタイプアプリケーションの作成等々...の学習を行いました。
アルバイトではPHP(Laravel,FuelPHP)やJavascript(Node、Angular)、DBを使用した実務を行っていました。オープンソースの「ECCube」のコミッターもさせていただいております。

就職活動(オプティムとの出会い)

学校3年次で比較的早めの就職活動を行っていたところ、ある就活イベントでオプティムと初めて出会いました。

工業高校出身で電子工作やマシニングセンタを使用していたこともあり「ドローン」や「AI」などにとても関心があり、高校時代からそういった分野で活躍したいと決めていたのでオプティムと自分との合致度がかなり高めでした。

ある就活イベントの最後に懇親会があり、そこで採用担当の方にお声がけして、インターンシップの話を聞きました。
そして、夏のインターンシップに応募し、7日間のインターンシップへ向かいます。

オプティム夏のインターンシップ

7日間のインターンでは、CloudIoTOSに関するデバイスチームに参加させていただくことになりました。 社内の雰囲気も硬すぎず緩すぎず、自分のペースで作業に取りかかれました。 頑張った甲斐があり、一つ案件をこなすことが出来ました。(具体的な内容は省きますが、Webアプリケーションと小型デバイスを使用したアプリケーションです) そのアプリケーションが高評価を頂き、リモートアルバイトスタッフに誘っていただきました。

アルバイトスタッフ

正式にオプティムのアルバイトとして雇っていただけたのは2017年11月でした。 そこから現在(2019年3月)まで様々な案件をさせていただいていましたので、アルバイトについての紹介と案件の一部の技術紹介をしたいと思います。

アルバイト内容について

オプティムのアルバイトスタッフは、他のアルバイトと違いかなりハードな実務もさせていただけました。その分上長のチェックなども厳しく、その都度しっかりと教えていただけるという環境がとても有り難かったです。

一つの案件を持たせていただいたりと、かなり責任重大な部分もあり、自分自身のスキルアップに意識を集中できたと感じました。 また、出来たものをイベントで発表を行えたことで自分自身の成果が感じられたこともモチベーションアップにつながっていると思います。

他とは違うアルバイト形態

私のアルバイト勤務形態が、オプティムでの初の試みであるリモートアルバイトスタッフでした。故に、ミーティングや質問などはすべてビデオ会議かチャットでのやり取りです。

自宅からの勤務は自分のペースが作りやすく、何よりも出勤の手間がまったくないことが一番の強みです。

特に辛いことといえば、本社に届いている機材を使用した案件を行う際は、一度自宅に送っていただかないといけない事であったり、自宅に送れないもの(本社から出せないもの)は本社で構築しリモートアクセスでコントロールをしないといけない点は、やはり本社勤務のほうが扱いやすいと感じました。ですが後々デバイスを外部に提供するのであれば、リモートアクセス前提で進めることで提供後もしっかりと保守できる環境が整っているとも捉えられます。

よく、「リモート勤務は捗らない」という声を聞きますが、個人的にはペースがつかみやすく人目や雑音を気にせず集中できるので作業が捗ることが多くありました。

アルバイト中に使用した技術紹介

アルバイト中に使用した技術(一部)を紹介しようと思います。

概要

ある展示会にて、ジオラマ(模型)に自動車を走らせ、その位置情報をリモート上からWebアプリケーションで把握できるようなシステムを作成します。

位置情報といえばGPSですが、ジオラマ上ではGPSの誤差範囲内におさまってしまうため正確な位置情報が取得できません。

そこで、RFIDタグを自動車に取り付け、道路にRFIDリーダーを設置することで、クライアント(GPS端末)と位置取得地点(人工衛星通信で位置が把握できた場所)と同等の動作をさせます。

構成

  • ArduinoRFIDリーダをセットで使用します
  • ArduinoPCはUSB接続で、ttyを使用し相互通信を行います
  • 位置情報タグ情報MySQLに格納します
  • Websocket通信で、クライアントへ非同期通信を実現します
  • 今後Webサーバを分離することを考えて、Webサーバとデータ送信用プログラムを分けて構築します

移動する物体(車や電車など)にRFIDタグをつけて、RFIDリーダの上を走らせます。 RFIDリーダごとに位置情報を設定していますので、RFIDタグ(物体情報)を特定のRFIDリーダ(位置情報)が感知すると位置と物体の情報がわかるような仕組みになっています。

各所技術紹介

RFIDについて

RFIDはタグとリーダーによって構成される近距離無線通信されるものの事を言います。 代表的な規格としてFeliCaなどが存在します。

タグ・無線周波数・伝送方式など様々な種類があり、それぞれ使用用途や環境によって使い分ける必要があります。

伝送距離は数cm~100mに及ぶものまで存在し、現在では大手アパレルショップのセルフレジシステムや、マラソンのタイム計測などにも使用されています。

RFIDのメリット

  • 読み取りが高速(約10ms~100ms)
  • 衝突回避技術があるため、複数のタグが密集していても読み取れる
  • タグに対して情報書き込みも可能
  • 無線通信の為、許容範囲内の障害物でも動作する

RFIDの課題

  • 大量に導入する場合はコストが高い
  • 脆弱性について
    • リーダーがあれば読み取れてしまうが故に、内部情報が隠蔽されていなければ誰でも読み取ることが出来てしまう
    • タグを紛失した場合、遠隔で情報消去などが難しい(タグ内部の情報は盗まれる危険性がある)

等があります。

RC522<-->Arduino

RC522のサンプルコードがあるので、Arduinoにインポートします。 RFIDタグをかざした際に、Arduinoの標準出力部分にデータが表示できれば、この部分は完成です。

Arduino<-->Ubuntu(Python)

様々な情報通信方法がありますが、今回はttyを監視する方法を取ります。

PythonでUSB接続されたArduinoのttyにStream接続をし、常時監視を行います。 事前にttyとArduinoの情報を紐づけておかないと、どのArduinoか判別できないので注意が必要です。

送られてきたRFIDタグデータと、Arduinoの情報を整形してWebsocketに送信します。

フロントエンド

セキュリティ等の為、フレームワーク「Laravel」を使用します。

laravel.jp

汎用性を高くするために、一画面でComponentにわけてコーディングします。 そのために「Vue.js」の技術を使用します。 Componentを超えたデータの管理が必須となりますので、「Vuex」も同時に使用します。

jp.vuejs.org

vuex.vuejs.org

この構成にすることで、データをリアルタイムで反映することが出来ます。 また、Component単位で作成しているので画面内の情報を入れ替え、ユーザ自身で見やすい位置に移動などが行えます。

苦労した点

ArduinoとPCをUSB接続する際に、どうしても抜き差しが必要になります。

そうすると、、当然ですが接続時にOSがArduinoを認識した順番にttyが決まることになります。 RFIDリーダ側から毎回Arduinoの識別データを投げれば済む話ですが、余分な通信を避けたいところです。

したがって、USBをどの順番で再接続したとしても特定のArduinoを識別できる機構を考えなければなりません。 (様々な方法がある故に一番苦労しました・・・)

解決法

様々な方法がありますが、今回はWebアプリケーション側で紐づけ設定をできるように構成しました。

  1. 新たに設定画面を構築し、接続されている端末のtty郡を抽出しリスト化してWebページに送ります(Webサーバと分割している場合はデバイス側のサーバにAPIを追加します)
  2. 予めArduinoの情報をDBに格納しているので、それもリスト化してWebページに送ります
  3. 紐付けるWebフォームを作成し、リレーションデータをDBに保存します
  4. WebApp側でリレーションデータを元に、RFタグの情報を表示します

こうすることで、ttyで出力されるあらゆるデバイスをWebアプリケーションと紐付けることが出来ました。 この場合はArduinoでしたが、FeliCa規格のものであってもttyから出力できればデータの受信が可能になります。

また、ArduinoとRFIDリーダ本体を誤って別の場所に設置してしまった場合にも、位置情報とArduino本体情報の紐づけ設定を見直すことで気軽に位置を変更できます。

テストの際にソースコードから変更するようなことがなくなるのでリスクがとても低くなる設計だと思います。

最後に

1年と数ヶ月間でしたが、アルバイトスタッフとして様々な事に挑戦できたと思いました。

また、アルバイトをする前に関西地区で数社の開発業務経験もかなり生かされていると感じました。 入社してからは社内外かかわらず、様々な技術を磨いてイノベーションを起こしていきたいです!

オプティムでは一緒に働く仲間を探しております。

2020年新卒予定の方、2021年新卒予定の方は今年2019年夏のインターンシップ(6~8月頃に募集開始)に是非参加してみてください!

中途採用や、新卒採用に関して何か不明点がございましたら、下記URLでのお問い合わせをお願いいたします。

www.optim.co.jp

最後まで目を通していただき、ありがとうございました。 今後とも、よろしくお願い申し上げます。

以上、オプティムアルバイトスタッフの青木でした。