• 投稿日
  • S++ Swing  〜ソラコム インターン生活を添えて〜

    こんにちは。ソラコムインターン生のtakuyaです。
    8/1から1ヶ月半ほど夏季インターンシップをソラコムで体験させていただきました。

    S+ Camera Basicを用いた最終成果物、その名もS++ Swing(S+ Camera Basicをさらに進化させたのでプラスが1個増えています!)を紹介します。
    また、ソラコムでしか味わうことのできない楽しいインターン生活を紹介できたらいいなと思います。

    熱いぞ!S+ Camera Basic

    f:id:jupy:20190913101202p:plain
    SORACOM Napter, SORACOM Harvestといったソラコムが提供しているサービスを組み合わせた「SORACOM Mosaic」をベースとしており、

    • SORACOM Inventoryからカメラ画像を取得
    • コンソール画面から設定を変更
    • 遠隔で独自のプログラムの開発

    等が出来ます。
    すなわち、ユーザ次第で自由自在にカスタムすることのできる優れたカメラなのです。

    このカメラに惹かれた私、そして同じくソラコムでインターンをしていたjuroとpiyoの3人でこのカメラを使ったプロジェクト開発、その名も「S++ Camera」の開発を始動させました。
    juroとpiyoのブログも公開されています。ぜひご覧ください。

    S++ Swing プロジェクト始動!

    ある日、S+ Camera Basicを開発しているメンターの方からインターン生のために仕組みや開発環境などの説明をしていただきました。
    注目していただきたいのはこの画像
    f:id:jupy:20190906120602p:plain
    何気ない質問からプロジェクトが開始しました。
    (???) 「頭の部分は自動で回転できるんですか?」
       -「残念ながら、手動です。」
    「制御出来たらかっこいいですね(わいわい)」

    自動で動いた方がかっこいいに決まっている、そんな安直な考えからS+ Camera Basicに首振り(swing)機能を搭載するS++ Swing プロジェクトが始動しました。
    しかし、かっこいいだけがS++ Swingではありません。
    そもそもS+ Camera Basicの強みとして遠隔で操作可能といった大きなメリットがあり、電源を起動すれば通信も含めて稼働してくれます。
    現在は設置の際に手動で調整するのですが、これを設置後にリモートで変更できるようになるとさらに利便性が増します。
    さらに、撮影範囲が広がるため設置台数を減らすことができるかもしれません。

    設計フェーズ

    私の希望としては、既成品に対して新しくSwing機能を組み込めるような機構を考えていたのですが、空間的な制約があり、今回は断念。
    メンターの方々、他のインターン生に色々とアドバイスをもらいながら、最終的には以下のような機構となりました。
    回転イメージは以下のようになります。
    f:id:jupy:20190910111720g:plain

    サーボモータには回転に必要なトルクを考えSG90を選び、PWM(Pulse Width Modulation)制御で動かしました。
    SG90のデータシートによると、要求電圧は5Vです。
    今回は、Raspberry Pi 3 Model B+(以下、Raspi)のGPIOピンを使わず、SG90よりもパワーが有るサーボへ変更ができるように、外部から5Vの電源を供給しました。

    いざ加工、電装編

    f:id:jupy:20190909115934j:plain
    ずれてしまいました
    SG90の正確な寸法を測ることができなかったのが原因だと思われます。
    (+アルミの加工が大変でした。)
    失敗を元にズレを修正します。

    f:id:jupy:20190906150123j:plain
    こんなこともあろうかとメンターの方がバックアッププランとして作っていただいたパーツを使用
    レーザーカッターで切り出していただいた木製の部材でとても加工しやすく、すぐに修正できました。

    f:id:jupy:20190906150335j:plain
    Raspiむき出しですね。とにかくモータを動かしたい。

    f:id:jupy:20190912144440j:plain
    最終的な電装の様子はこんな感じになりました。

    まずは、リモートでRaspi操作

    ソラコム が提供しているサービスの中で個人的に一番気に入っているサービスSORAOM Napterは、IoTデバイスに固定のグローバルアドレスを割り振ることがなく、セキュアなリモートアクセスが可能です。
    必要な時のみリモートアクセスが可能で、とても簡単にIoTデバイスを使用することができます。

    f:id:jupy:20190909140957p:plain
    Raspiに使われているSIMがオンラインになっていることを確認し、チェックを入れます。

    操作→オンデマンドリモートアクセス
    f:id:jupy:20190909141239p:plain

    時間は使う分だけ選択すれば無駄に通信することは無くなります。SSH でアクセスしたい場合は「デバイス側ポート」をデフォルトの 22 にしたまま OK をクリックします。

    f:id:jupy:20190909142135p:plain

    sshが表示されるので、これをコピー
    terminalで先ほどのをペースト。userのところをpiにして実行します。
    実は、私は今回のインターンでsshデビューしました!
    これでRaspiへの接続完了です。

    PWM制御試験

    RPi.GPIOWiringPipigpio等のモジュールを試しました。
    RPi.GPIOのコード例は以下のようになります。

    import RPi.GPIO as GPIO
    import time
    '''
     GPIO.setmode(GPIO.BCM)
     
     #GPIO*を制御パルスの出力に設定
     gp_out = *
     GPIO.setup(gp_out, GPIO.OUT)
     
     #「GPIO*出力」でPWMインスタンスを作成する。
     servo = GPIO.PWM(gp_out, 50)
     
     #パルス出力開始。 servo.start( [デューティサイクル 0~100%] )
     servo.start(0)
     
     for i in range(*):
         #デューティサイクルの値を変更することでサーボが回って角度が変わる。
         servo.ChangeDutyCycle(2.5)
         time.sleep(0.5)
     
         servo.ChangeDutyCycle(7.25)
         time.sleep(0.5)
     
         servo.ChangeDutyCycle(12)
         time.sleep(0.5)
     
         servo.ChangeDutyCycle(7.25)
         time.sleep(0.5)
     
     servo.stop()
     GPIO.cleanup()
     '''
    #デューティ = パルス / 周期
    #PWMサイクル:20mS
    #制御パルス:0.5ms~2.4ms
    #-90度 = 0.5ms / 20ms =  2.5%。
    #+90度 = 2.4ms / 20ms = 12.0%
    val = [2.5,3.6875,4.875,6.0625,7.25,8.4375,9.625,10.8125,12] #角度のリスト
    while True:
    for i in enumerate(val):
    servo.ChangeDutyCycle(i)
    time.sleep(1.0)
    for i in enumerate(reversed(val)):
    servo.ChangeDutyCycle(i)
    time.sleep(1.0)
    

    WiringPiは割愛

    pigpioについても動かすだけなら以下で大丈夫です。

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    import pigpio
    import time
    pi = pigpio.pi()
    #ここで-90
    pi.set_servo_pulsewidth(18, 550)
    time.sleep(3)
    #ここで0
    pi.set_servo_pulsewidth(18, 1450)
    time.sleep(3)
    #ここで90
    pi.set_servo_pulsewidth(18, 2300)
    

    モータが動くかどうかを確かめたいだけなら3つのうちどれか1つを試せば十分ですが、モータが動かない場合には、GPIOピンが使える状態にあるのかを確かめる、コードを変えてみる等すると良いと思います。
    現時点では S+ Camera Basic はGPIO 対応していませんが、インターンシッププログラムのために特別に GPIO 制御可能なカスタムファームウェアを作ってもらいました。

    うまくモータが動いたら、いよいよ実機でテストです!

    躓きポイント

    実行環境はpython3です。
    WiringPiは実行環境次第では何もインストールすることなく使えるのですが、pigpioを使うときはpip3 install pigpioをお忘れなく!
    python xxx.pyだとうまくいかないことがあるので
    python3 xxx.pyでバージョンを指定してあげましょう。

    ついに、実機Deploy

    まずは、Macに、S+ Camera Basicと同じpython環境構築をして、事前確認を行います。
    次に、事前準備としてSORACOM CLIをインストールします。
    こちらにガイドがあるので参考にします。

    $ brew tap soracom/soracom-cli
    $ brew install soracom-cli
    $ brew install bash-completion
    

    これでインストール出来ます。

    最後に、

    $ soracom configure
    

    で、プロファイルの作成を忘れないようにしましょう!設定方法は、先ほどのSORACOM CLIのGitHubを参考にしてください
    Harvest FilesとInventoryにアクセスするために必要です。

    ちなみに、 SORACOM CLIにアップグレードが入った時には

    $ brew upgrade soracom-cli
    

    とします。

    その他のMosaicのDeployに必要なモジュールをインストールし、Deployコマンドを実行すればOKです。

    いざ、Swing !

    ここまで、長い道のりでしたが、あとはsshでモータを動かした時と同じコードをDeployすれば良いだけです。

    初めて動いた時には簡単な動作でも、とても愛着が湧いてしまいます。

    動いただけでは、物足りなく感じたので自分なりに改良もしてみました。(最初に述べたように、簡単に自由にコードを書き換えることが出来るのはすごい便利でした。)

    監視を目的として180°回転し続けます。dlibの顔認識を用いており、顔を検知するとHarvest Filesに画像が送られます。


    追跡モードを目的としています。これまた、dlibの顔認識を用いており、顔を検知し中央から離れているとカメラが動いて位置を調整します。
    カメラが止まっているときは、顔が中央に写っている画像をHarvest Filesに送っています。

    Inventoryもいじらせてもらいます!

    Swingによりリモートで角度を自由に変えることが出来ました。
    さらに、毎回terminalからdeployするのではなく、ユーザコンソール上から角度指定出来るようにしました!
    デフォルトでは以下のような種類の環境変数を渡すことができます。
    f:id:jupy:20190912111134p:plain
    それが、、、
    f:id:jupy:20190912111209p:plain
    出ました 一番下のCAMERA_ANGLEに好きな数字を入れるだけで動いてくれました!

    最終発表会

    以上までが、最終発表のために2週間で開発したサービスS++ Swingになります。
    f:id:jupy:20190913200743j:plain
    最後の週には、社員の方々へ向けて最終成果物を発表しました。
    最後まで助けをもらいながらなんとかデモも無事動いてくれ、満足のいくプレゼンをすることができました!
    社員の皆さまにも楽しんでいただけた様子で安心しました。
    振り返ってみると、あっという間に過ぎた6週間でしたが、日々刺激を受けながら技術的にも多くのことを吸収することができ、最高のインターン生活を過ごすことができました。
    本当にありがとうございました!

    長々と書かせていただきましたが、最後まで読んでいただき誠にありがとうございました。

    タイトル回収

    冒頭でインターンの期間が1ヶ月半と書きましたが、S++ Swingの開発期間は2週間としていることに違和感を覚えましたか?
    もちろん前半の3週間遊んで過ごしていたわけではないです
    ということで、ここからは前半戦にやってきたこと、およびインターン目線のソラコムの雰囲気をお届けできたらいいなと思います。
    前半戦の目的はIoTの意義、ソラコムの役割を知り、課題を見つけることでした。
    M5StackやSORACOM LTE-M Button PlusGrove IoT スターターキット for SORACOM等のデバイスを提供していただき、ソラコムのサービスを使ったデモを色々作ってみました。
    f:id:jupy:20190909121257p:plain
    クラウド初心者であった私でもSORACOM Funkを使って簡単にAWS Lambdaを利用することができました。ボタンのクリックの種類、現在地等の情報がSlackに通知されています。

    また、ソラコムが提供しているサービスやデバイスに関する講義を社員の方からしていただきました。Maker Faire Tokyo やHello SORACOMといったイベントにも参加させていただき、ソラコムが提供している各種サービス、事業例等を肌で感じることができました。

    さらに、後半戦(S++ Cameraの開発)に向けてプレスリリースというものを作成しました。
    f:id:jupy:20190912152601p:plain
    プレスリリースを書くことは初体験で新鮮でした。プレスリリースを書くことで自分が開発するサービスがどのようなメリットをもたらしてくれるかを整理することができます。
    また、後半戦どのように開発を進めていくかを定期的にメンターの方々と相談する機会を設けていただき、プロのアドバイスを受けることができます!

    少し寄り道

    ソラコムでは、リモートワークが可能という素晴らしい文化があります(雨の日にはオフィスに人が少ない印象です )。遠方からバリバリ働いている社員さんなどもいます。
    また、情報共有する環境が整っているので、困ったことがあると迅速に解決してくれます!
    もう一つ個人的に気に入っている文化として、2週間に1度Happy Hourという社内で開催される飲み会があります。そこでは、日頃接する機会の少ない社員の方とも気軽に会話することができます。

    話は戻りますが、前半戦最後には、中間発表を行いました。
    f:id:jupy:20190913102338p:plain
    多くの社員の方々に見守られながらのプレゼン、緊張感がありました。
    多方面で活躍されている社員の方々からの貴重な意見をもらうことができました。

    f:id:jupy:20190912175951j:plain
    中間発表後には、BBQにも連れて行ってもらいました!
    最高の打ち上げでした!

    終わり

    ソラコムでのインターンでは、他では体験することのできない貴重な時間を過ごすことができたと明言できます!
    会社の文化を身近に体験できること
    自己で課題を発見すること
    その解決に向けてリソースの提供や的確なアドバイスをいただいたこと
    全力でバックアップしてもらいながらとにかく自由に活動させていただくことができました。
    そして、何よりもソラコムのことが好きになりました

    これからもソラコムのサービスをどんどん活用していきたいです!

    以上、takuyaでした!

    sorazine.soracom.jp