ものづくりブログ

ゼロからスタートして何かを作って世に出すまでのことを書くブログです.

趣味と実益を兼ねてスマートハウス実験室を作ったお話

こんにちは。

かなり久々の記事更新ですが、その理由はこの数ヶ月全然電子工作やプログラミングをやっていなかったからです。
なぜかというと、転職し、別のものを作っていたからです。

それがこちら。

www.connectly.net

何かというと、IoTデバイスを詰め込んだ家、のような空間です。
なかなか自分で買うと高いHueだったり、COCOROBOだったりのAPIを好きに叩いて良いよ、ということにしています。

ここに来て色々な製品を使ってみてすごく面白ければ買えばいいし、思ったほど面白く無いなと思ったら買わなければ良いので、なかなかお金のかかるハードウェアエンジニア達にとってはそれなりに便利に使ってもらえるのではないかなと思っています。

なんでこの場所を作ったかというと、企業が作るスマートハウスと、個人が考えているスマートハウスにギャップを感じたからです。正直世界中どの企業を見回してもわくわくするスマートハウスの構想が出てきていません。セキュリティがどうだとか、データの量が膨大になるからデータセンターを大量に作れねばとか、たしかに重要なんですけど、肝心のアプリケーションが出てきません。

一方で個人の活動を見ていると、家を音ゲーのゲーム機にしてしまったり自動化を実現してしまったり、色んな面白そうな事例が出てきています。

でも個人で作るとやはり使える予算も少ないし、製品にするためには超えるべきハードルが多数あります。自宅を世間に公開するわけにも行かないので、せっかくの作品も世に広まることが少ないという課題も感じています。

そこで、それらのハードルを取っ払っていこうと考えて作ったのがこのConnectly Lab.です。

具体的には以下のようなハードルを取り去ることに貢献できると考えています。

  • 作品を見てもらうコストが減る(for個人)
  • アプリケーション開発のための機器購入コストが減る(for個人)
  • 他者の作品とその技術を調べるコストが減る(for個人)
  • 作品を製品に変えることができるメーカーとのマッチングコストが減る(for個人)
  • 逆に製品化する実力はある企業がアイデア探しできる(for企業)
  • 面白いアプリケーションに使ってもらえる製品類(Netatmoとか)の宣伝コストが減る(for企業)
  • 部屋のデザインをオシャレに作っているので、デザイン重視層にもアピールできる(for個人、企業)
  • ものづくりを促進するようなイベント開催コストが減る(場所を無料で解放)(主にfor企業)
  • 普段から見学者がいるので、アンケートなどで市場の声が聞ける(for個人、企業)

こんな感じで色んな方々にメリットを提供して、その結果としてこの世にスマートハウスというものが実現すれば、会社や社会の利益にもなるかなぁと思っています。
是非これをご覧になった皆さん遊びに来てください。
遠隔操作できるロボットもあるので、遠方からのオンライン見学も大歓迎です。


お待ちしております!

テスラを試乗してきたけど、未来のクルマの姿を垣間見た

こんにちは。

先日、テスラモーターのモデルSを試乗してきました。私が乗った車種の基本スペックは以下のとおりです。

  • 5人乗り
  • リアにモーターを積んでいて後輪駆動。いわゆるRR。ポルシェと一緒。
  • 最大380馬力
  • 最高速度215kmと250km(クラスにより異なる)
  • 電源はスマホとかと同じリチウムイオン電池で、フル充電で走行できる距離は500km以上(らしい)。

Model S | Tesla



前職の有給消化で比較的自由な毎日を送っていたので、次の仕事にも若干活かせそうだし試乗に行ってみたところ、思いの外感動したので気づいたところなどをまとめました。



まず外観から。

f:id:daisukekmr:20150430183028j:plain

ヘッドライトはLEDでおしゃれな感じです。白色の光で夜道も見やすそう。黄色とかオレンジとかのほうが雨の日見やすいのですが、白のほうがかっこいいですよね。

あと実用上あまり関係ないのですが、ドアノブが面白かったです。通常は何も出っ張りが無いので手を引っ掛けられずドアが開けられないのですが、ノブを押し込むとゆっくりと出てきて、手で引けるようになります。走行開始すると自動的にまた引っ込みます。これがただオシャレのためだけの機能なのか、他の意味があるのかは聞きそびれました。高速走行時は空気抵抗が減るんですかね?



次に運転席からのビューです。メーター部分と、エアコンとかオーディオとかの操作画面があるところがどちらも液晶パネルになっています。ここがテスラの車の一番のポイントだと思います。なぜなら全て液晶にしたおかげで、表示する内容や機能をソフトウェア・アップデートにより変えられるからです。

f:id:daisukekmr:20150430183453j:plain

円形のメーターの左半分が速さ、右半分がエネルギー消費を表しています。速さに関しては通常のガソリン車と同じく何km/hで走っているかを表示するものなので特に説明は不要だと思いますが、エネルギー消費のメーターが独特だったので少しご説明します。

要はガソリン車のエコ・ドライブ通知みたいなのと同じ発想なのですが、特徴的なのは消費だけでなく生産があるところです。テスラの車は電気自動車なので、燃料ではなく電池にためた電力で走っています。つまり、モーターの回転を使って発電することができます。あとで詳しく説明しますが、テスラの車の特徴はブレーキのかけ方にもあります。ガソリン車ではスピードを落とすときは足をアクセルからブレーキに素早く踏み変えて行いますが、テスラではほとんど踏み変える必要がありません。ガソリン車でいうところのエンジンブレーキがかなり強力なので、それで結構スピードを落とせてしまいます。このエンジンブレーキが強いのは、その時に発電しているからです。ブレーキペダルを踏むと単にブレーキパッドを削って止まるだけなので運動エネルギーを熱エネルギーに変えているだけですが、アクセルを離すことで止まればそのエネルギーの一部が電池に還元されるわけです。災害用グッズで手でくるくるレバーを回すと明かりが点く懐中電灯がありますが、あれと同じ原理です。あれを回すと結構重いですよね?あれは中にモーターが入っていて、それを回す力を電気エネルギーに変換しているので重いのです。
どれくらいエネルギーを使ってどのくらいエネルギーを生産したかは、時系列でグラフにしてくれるので、自分のエコドライブ具合を後から見ることも可能です。
自動車が走っているというのはそれだけでエネルギーを持っているので、そのスピードを落とすのはエネルギーを失わせているということです。普通のブレーキはそれを熱に変えてしまうのに対し、テスラのこのブレーキは電気エネルギーに変えてくれるので、とてもエコだと言えます。



次はメインパネルとでも言うべき液晶ディスプレイです。

f:id:daisukekmr:20150430183718j:plain

ここで車の操縦以外のほとんどの操作ができます。音楽の再生、ナビの操作、エアコンのコントロールはもちろんですが、前述のブレーキによる発電をするかしないかや、ガソリン車の特にオートマ車ではおなじみのクリープ現象(を再現した機能)のON/OFFなどを切り替えたりできます。また、エアサスペンションが入っているので、車高を変えたりもできます。いるかどうかわからないけどインターネットもできたりします。今後もソフトウェア・アップデートにより次々に機能が追加されていく予定とのこと。もう車というよりほとんどPCですね。そのうちここに広告が出る代わりに車体価格安くするとかも可能性ありますよね。デートの時はいくらか払って広告OFFにするとか。笑



さて、ここでいよいよ試走に入ります。モーターなのでブレーキを離しても進まないはずなのに、ガソリン車に慣れた人のためにクリープ現象が再現されています*1。これもソフトウェア・アップデートで追加された機能だそうです。ただ僕がこの車のオーナーならこの機能はOFFにすると思います。後で説明しますが、アクセルだけでコントロールするのが思いの外素晴らしいUXだったからです。

*1 あとで調べたところ、ガソリン者のオートマ車クリープ現象はとっくに無くせるのだけど、人間がこれに慣れてしまっているからソフトウェア的に再現しているようです。



車体が大きいので若干緊張しながら公道に出ます。左折のウインカーを出そうとしたらシフトノブで、間違えてRに入れてしまって焦りました。外国車なのでウインカーはハンドルの左についてるんですね。シフトノブは左手でガッツリ動かす感じではなく、日本車で言うウインカーのスティック(?)の位置についていて、指で一番下まで下げるとドライブに入って、一番上まで上げるとバックに入るというものです。先端のボタンを押すとサイドブレーキ兼パーキングになります。



個人的に一番よかったのはアクセルの使い方でした。ここまでもちょいちょい触れましたが、走るとき踏み込んで、止まるときはゆっくりアクセルを離してきて、最後5km/hくらいまでの速さになったらブレーキを踏むという使い方でした。従来のガソリン車で止まるときはすぐにアクセルをオフにしてブレーキを踏むというペダルコントロールが必要でしたが、テスラの車ではほとんどアクセルのコントロールだけで用が足りてしまいます。せっかくのブレンボのブレーキ涙目www



試乗の途中、広めの道で前が開けたので結構強めにアクセルを踏んでみたのですが、ガソリン車では考えられない加速でした。思い切りシートに張り付く感覚。これは高速道路で追い越すときなどにかなり良さそうです。追い越すときはスピード上げてさっと追い越したほうが安全ですからね。そしてスピードを落とすときはアクセルをゆっくり離してくれば良いので、ブレーキはほんとにほとんど使いません。



ギアは何段変速かな?と思ったら、ギアは無いとのこと。CVTみたいな無段階変速とかではなく、変速そのものがないそうです。ガソリンとかディーゼルエンジンだとせいぜい数千回転くらいしか回せないのでギアで切り替える必要がありますが、モーターは4万回転とかまで回せるのでギアで切り替える必要が無いためとのこと。F1でも1万数千回転とかなのに4万回転は驚異的ですね。
MT車無いんですかとか聞きそうだった自分の固定観念が打ちのめされました。



また、現行で一番安い(と言っても高級)モデルは4WDらしいのですが、原動機1個でプロペラシャフトを通じて4輪を駆動させるという従来の仕組みではなく、モーターを2個積んでそれぞれ前輪と後輪を動かす仕組みとのことで、両者をアクティブに制御できるそうです。4WDだとシャフト通す分車内狭くなるじゃんと思ってましたが、これも固定観念でした。でもインホイールモーターみたいに1車輪あたり1モーターではなく、前輪で1個、後輪で1個の合計2個とのことです。左右の作動装置はディファレンシャルギア(LSDだったかも)とのことでした。これは従来の自動車と同じですね。


最後車庫入れは私はやりませんでしたが、バックの時はメインディスプレイに大きく後方の映像が映し出されます。この機能自体は通常のカーナビなどでも搭載されていますが、あの大画面で出ると結構見やすさが際立つなーと思いました。



最後いくつか経済的なところを教えてもらったので羅列します。

  • 税金はかなり優遇されていて、自動車取得税と重量税が免税
  • 車両価格はオプション何も付けずに937万円
  • サンルーフが18万円くらいでつくので、多分オプションの価格は良心的
  • 車両価格の大部分はバッテリー代。panasonic製のリチウムイオン電池。みんなevoltaたくさん買って価格を下げようw
  • 車検は意外と安いらしい。部品点数がガソリン車より少なく、オイル漏れなどもないためメンテナンスが楽なため、とのこと
  • 家庭でのフル充電(半分だったかな?)で1,000円程度の電気代。どちらにしてもそれで250kmから500km走れるなら高くない
  • ただし家庭の100Vではかなり充電が遅いので、200Vの工事を推奨しているとのこと。工事代10万円程度

結論としては、かなり欲しいと思いました。ただ東京で車乗らないんですよね。。。

Python学習用課題に取り組んでみた(2次回答)

こんにちは。

前回に引き続きPython学習用の課題についての記事です。

添削してもらった結果、得たフィードバックは下記のようなものでした。


  • 不正な入力が来た時にプログラムが止まらないよう例外処理を使ったほうが良い
  • 日付のエラー判定はdateクラスを使うと良い

ふむ。



というわけで書いたプログラムが以下のとおりです。

# -*- coding: utf-8 -*-

from datetime import date

#社員情報クラス
class employee:

    def __init__(self,id,name,bd,salary):
        self.id = id
        self.name = name
        self.bd = bd
        self.salary = salary


#社員登録
def register(employeeid):

    print "名前を入力してください"
    tempname = raw_input()
    while(1):
        print "生年月日を入力してください(yyyy/mm/ddまたはyyyymmddの形で)"
        tempbd = raw_input()
        bdlist = tempbd.split("/")
        bd = []
        if len(bdlist) != 3:
            if tempbd.isdigit() and len(tempbd) == 8:
                try:
                    bd = date(int(tempbd[:-4]),int(tempbd[-4:-2]),int(tempbd[-2:]))
                except:
                    print"不正な値です。"
                    continue
                break
            else:
                print "不正な値です。再度入力してください。"
        else:
            try:
                bd = date(int(bdlist[0]),int(bdlist[1]),int(bdlist[2]))
            except:
                print "不正な値です。"
                continue
            break

    while(1):

        print "月額の給与を入力してください(8桁まで)"
        tempstrsalary = raw_input()
        try:
            tempintsalary = int(tempstrsalary)
        except:
            print "不正な値です。"
            continue
        if tempintsalary > 0 and tempintsalary < 100000000:
            break
        else:
            print "不正な値です。"

    EmployeeList.append(employee(employeeid,tempname,bd,tempintsalary))

    employeeidtemp = employeeid + 1

    return(employeeidtemp)

#社員情報照会
def intro():

    print "*****************************"
    print "ID   名前       生年月日     給与"
    print "*****************************"
    for i in EmployeeList:
        string = str(i.id) + "   " + i.name + "    " + str(i.bd.year) + "年" + str(i.bd.month) +"月" + str(i.bd.day) + "日" + "      " + '{:,d}'.format(i.salary) + "円"
        print string
    print "*****************************"


#削除
def delete(requiredid):

    j = 0
    if requiredid == 0:
        print "削除する社員のIDを入力してください"
        deleteid = input()

    else:
        deleteid = requiredid

    for deletenum in EmployeeList:
        if deletenum.id == deleteid:
            deletedList = EmployeeList.pop(j)
            if requiredid == 0:
                print "%sを削除しました" % deletedList.name
            break
        j = j + 1
    print "該当するIDの社員情報がありませんでした"

#編集
def edit():

    print "更新したい社員のIDを入力してください"
    editid = input()


#削除関数と登録関数により編集を実施
    delete(editid)
    register(editid)




if __name__ == "__main__":

    employeeid = 1  #社員IDを連番にするための変数の初期値
    EmployeeList = []   #社員リスト

    while(1):
        print "<MENU>\n"
        print "========================"
        print "1. 登録"
        print "2. 紹介"
        print "3. 削除"
        print "4. 更新"
        print "========================"

        select = raw_input("実行する処理を半角数字で入力")

        if select == "1":
            employeeid = register(employeeid)
        elif select == "2":
            intro()
        elif select == "3":
            delete(0)
        elif select == "4":
            edit()
        else:
            print "無効なコマンドです。"

1箇所ずつ順に見ていきます。
まずはdateクラスを使うためにimportします。

from datetime import date

次に実際にdateクラスのインスタンスを作成し、代入するところを見てみます。

        tempbd = raw_input()
        bdlist = tempbd.split("/")
        bd = []
        if len(bdlist) != 3:
            if tempbd.isdigit() and len(tempbd) == 8:
                try:
                    bd = date(int(tempbd[:-4]),int(tempbd[-4:-2]),int(tempbd[-2:]))
                except:
                    print"不正な値です。"
                    continue
                break
            else:
                print "不正な値です。再度入力してください。"

ここは添削されたところではないのですが、日付の入力はyyyy/mm/ddだけでなく、yyyymmddでも良いようにすると仕様書にあったため実装した箇所です。
if文により、ユーザが入力した文字列を/で区切った時に3個の要素にならないかを見た後(if len(bdlist) != 3:)、それがTrueだった時(3個でない時)にその文字列が全て数字に変更可能(isdigit())で、かつ8桁であることを判定しています(if tempbd.isdigit() and len(tempbd) == 8:)。
もしこれがTrueなら下4桁を削った値を年、その次の2桁を月、そして最後の2桁を日としてbdという変数に代入しています[2]。
ここで登場するのがdateクラスです。
bdにはdateクラス形式で代入しているので、無効な日付であればエラーを返してくれます。
単純にエラーを返すだけではそこで処理が止まってしまうため、例外処理(try,exception)を使用しました[3]。



次はユーザが入力した文字列を/で区切った時に3個の要素になる場合の処理を見てみます。

        else:
            try:
                bd = date(int(bdlist[0]),int(bdlist[1]),int(bdlist[2]))
            except:
                print "不正な値です。"
                continue
            break

こちらも先ほどと同様にdateクラスを使用するように改造しました。
また、例外処理を用いることで予期せぬ入力にも対応するようにしました。



次はもう1箇所例外処理を導入した箇所です。

        tempstrsalary = raw_input()
        try:
            tempintsalary = int(tempstrsalary)
        except:
            print "不正な値です。"
            continue
        if tempintsalary > 0 and tempintsalary < 100000000:
            break
        else:
            print "不正な値です。"

給与を入力する箇所です。ここでは例外処理を使うこと自体は生年月日の箇所と同じですが、今回はdateのようなクラスが存在しないため、値が正しいかどうかを判断する必要があります。
そこで、try以下で処理を行った後、エラーが無かった場合もif文を使用して0以下でないか、また8桁を超えていないかを判定しています。



以上が添削を受けて私が修正した部分です。



参考文献
[1]Python式日本語版「8.1. datetime — 基本的な日付型および時間型」(http://docs.python.jp/2/library/datetime.html)
[2]PythonWEB「スライスを使った部分文字列の取得」(http://www.pythonweb.jp/tutorial/string/index11.html)
[3]python-izm「例外処理」(http://www.python-izm.com/contents/basis/exception.shtml)