• SMT32F3Discoverって何?

    流行(はやり)のアーキテクチャARMというのがあります。
    iPhoneに使われているので有名です。ARMというのはアーキテクチャなのでARMっていうマイコンがあるわけじゃないのですが、ARMアーキテクチャになっているマイコンはたくさんあります。
    注目はこちら http://akizukidenshi.com/catalog/g/gM-06268/
    マイコンだけじゃなく、マイコンの書き込み回路、LED,加速度センサ、ジャイロセンサ、磁気センサがワンセットになっているものが1,250円という値段で売っています 

    Windowsさえもってれば、これを買ってきてUSBにつなぐだけでマイコンの開発ができちゃいます。しかもセンサー付きです!!
    これに乗っているマイコンは ARMアーキテクチャの Cortex-4Mというものです。32BitでDSPまで実装してます。ちょっとロボット作るぐらいならこれだけで十分ですね。

  • Scrum Sprint Plannning

     

    Scrum Sprint Plannning写真

  • RaspberryPiとサーボモーターで家のドアをiPhoneから開ける

    ゆとり部屋のドアの鍵を人数分作るのが大変だな〜と思ったので、遠隔で開けられるようにしました。
    2014-08-13 21.49.34

    動いている様子や動作のまとめはこちら

    構成

    まず、6Vの電源をレギュレーターで5Vにして、RaspberryPiにmicroUSB経由で供給しています。また、サーボモーターがレギュレーターを介さずにダイレクトに6Vにつながっています。また、信号線はRaspberryPiのGPIOをそのままつないでいます。また、RaspberryPiは有線LANにつながっています。こんな感じ。

    名称未設定アートワーク-8

    ソフトウェア

    ソフトとしてはPWMを使ってサーボモーターを回せばそれで終わりです。
    なんとかブラウザ経由で開けしめしたかったので、僕が開発中のCWebというC言語用のWebFrameworkを使っています。そこで、HTTPリクエストを受けて開けるべきか閉めるべきかを判断します。これで、PCでもiPhoneでもブラウザさえあればどこからでも開け閉めできます。
    GPIOのPWMに関してはwiringpiを使っています。
    アプリは手元のMacのXcodeで開発してGithubにあげます。RaspberryPiにsshではいって、git pullして、makeして、、、と言ったデプロイ方法です。普通ですね。

    raspberryPiには固定IPが必要です。そのIPへ無線ルーターでポート80へのTCP接続が行くようにルーティングの設定をします。
    また、無線ルーターはグローバルな固定IPを持っていないのでdynamicDNSを使っています。

    ハードウェア

    サーボモーターは360度回るものを用意しました。それは、故障や停電などしても、鍵で安全に開けられるようにです。270度回るサーボモーターがあればこれが可能です。つまり、鍵のつまみの可動範囲は90度なので、鍵が回ってこない場所があるわけです。
    そこに逃がして開け閉めすれば鍵の動作を邪魔しないので安全に普通の鍵で開けられます。実際の動きはこんな感じです。左が開いているものを閉じる動き。右が閉じているものを開く動きで、黒と白の点がサーボモーターについている突起です。

    2014-08-14 22.26.30 のコピー

    このように鍵の動く範囲は90度なので鍵がやってこない場所があります、また、黒い点の動きを見てもらえれば分かりますが、270度の動きが必要です。
    2014-08-14 22.26.30

    これが出来ると

    • ドアを開け閉めしても鍵とサーボモーターがぶつからない
    • 実際に鍵を使って鍵を開け閉めしたとしても鍵とサーボモーターの突起がぶつかることはない

    ということができます。実際動いてる様子はこちら。

    ボディーなどはゆとり部屋の3Dプリンタで出力しているのでピッタリのサイズ。

    2014-08-07 23.26.32
    2014-08-07 23.27.13
    2014-08-12 23.56.52

     

    意外と強度があるのは嬉しいです。ただ、忘れてネジをおもいっきりしめたところは少し曲がりましたが(笑)

  • 1. 人のニューラルネットワークとは

    人間は入力をして出力をする

    人間には入力と出力があります。ケーキを食べようとする動きで見ると、「ケーキを見る」これが入力です。目で机の上にあるケーキを見ると「ケーキの映像」が人に入力されますね。そして、頭のなかで「あれはケーキだ」とか「いちごがある」とか「美味しそう」といった思考が走ります。そして、「手を伸ばす」という行動に出ます。この最後の行動が人間の出力となります。

    名称未設定アートワーク-1

    もちろん「いちご嫌い」とか「お腹いっぱい」とかになることもあるし出力が「よだれを出す」になることもありますが、流れは同じで

    1. ケーキの映像が入力される
    2. それに対して処理が行われる。認識とか決断とか
    3. 何かをする(何もしないというのも出力(決断)の一つですね)

    となります。さて、この入力ですが何がやってるかというと目がやっています。出力は筋肉ですね。そして処理をしているのは脳という臓器です。面白いことに、目で受け取った映像は電気信号で脳に伝わります。筋肉も電気で動きます。そしてなんと脳みその中も電気でやりとりされているので、人間と言いながらもコンピューターみたいなもんです。(電気といってもナトリウムチャネルなど、化学物質を使うことが多いけど、要は電気です)

    名称未設定アートワーク-2

    つまり人の脳みそは「電気で受け取った情報を電気で出力している」のです。そうやって考えたらなんだか作れちゃいそうですよね。電気を処理する脳みそを作ればロボットが出来ちゃうわけですから。

    脳みそを見てみる

    でも、一番難しそうなのは脳みそですね。さぞ、複雑なんでしょうなぁ。その脳みそを顕微鏡で見てみるとこんな感じになっています

    050207_02
    出典: 理化学研究所

    色がついていますが、ホントはこんな色じゃありません。見やすくしてあるだけです。この赤いの1つ1つが神経細胞で、緑色のものがその細胞同士のつながりです。
    よくある細胞のイメージだと

    kenbi-miru7
    出典:torikyo

    こんな風にくっついてますが。神経細胞はかなり離れています。で、そのせいで細胞同士のやり取りは基本的にこの細胞同士をつなぐケーブルに頼ってるわけです。ケーブルで他の細胞につながってやりとりしている。これなら何が起きてるかわかりやすいですね。(細かいのは割愛)では、神経細胞1つを見てみましょう。

    神経細胞の働き

    名称未設定アートワーク-3

    これが神経細胞です。(絵が下手でごめんね)。さっきいっぱいつながっていた奴の1つですね。こいつが他の細胞と何をやりとりしてるかなんですが、神経細胞には入力をする樹状突起と出力をするシナプスがあって、入力の電気信号の合計があるレベルを超えたら出力をするという単純なことしかしていません。しかも

    • 入力は複数あるが出力は1つだけ
    • 出力は”する”か”しない”かの2つの状態しかない
    • 出力は入力の合計がある値を超えないとしない

    と、ものすごく単純です。こんな感じ

    名称未設定アートワーク-4

    強い入力と出力が赤色ね。1個じゃ足りなかったけど2個で出力したって感じです。この出力をするのがシナプスってので、他の細胞の入力である樹状突起につながっています。
    それがニューラルネットワークと呼ばれています。(ニューロンによるネットワークって意味)

    入力とか出力って言ってるのはもちろん電気の話です。グラフで書くとこんな感じです。

    名称未設定アートワーク-6

    この細胞への入力の合計(細胞内電位と言います)があるレベルを超えたら細胞は興奮してインパルスという出力を1msだけ出力します。そして、そのあとは不応期という「いけるはずなのに反応しない期間」があります。(逆に考えると1つの細胞が出力できるのは1秒に不応期を無視した最大でも1000回ということです。ちなみに軸索を情報が進むスピードは数百m/sと遅く、シナプスが他の細胞に情報を伝えるのにも1mSほどかかります。かなり遅いです。)
    そして、この出力が他の細胞につながっているので他の細胞の細胞内電位を上げてその細胞が興奮してまたインパルスを出して、、、とつながっていきます。
    ただ、どのレベルで興奮して出してくれるかは細胞によって違います。こんな風にね名称未設定アートワーク-5

    ちなみに実際の脳細胞の中には他の細胞の興奮をおさえる奴も居たり、出力の長さが小さいの長いのが居たりひょっとしたら出力がアナログな奴も居るかもしれないという話です。

    最初の人間の入力出力の話の図の中にこの神経細胞を入れるとこんな感じになります。

    名称未設定アートワーク-7

    目の視神経からの入力がニューラルネットワークの細胞たちに入力され、ある細胞は興奮して出力し、ある細胞はしない。細胞の興奮で起きた1msのインパルスは次の細胞に伝わり、興奮したりしなかったり。そうして伝わっていき、腕の筋肉を動かす出力が出て、腕の筋肉まで伝わり腕が動く。

    今日のまとめ

    • 人間は入力をして出力をする。細胞同士は電気で情報をやり取りをしている。
    • 脳の中も同じく入力をして出力をする神経細胞がいて、それが沢山つながっている
    • 神経細胞は多入力単一出力
    • 出力はするかしないかの2択で伝わるのが遅い
    • 興奮するレベルは細胞によって違う
  • CWeb 一旦完成

    C言語のWebFrameworkがどうしても欲しいので作ることにした。

    • C言語だけ
    • 標準ライブラリ以外は使わない
    • この上なく高速で余計なことをFrameworkの中でしない

    の3つをポイントに開発することにした。ということで自分で作らないといけないのは

    1. socketによるTCPの送受信
    2. HTTP Requestのパーサー
    3. hashやarrayの仕組み
    4. HTMLレンダリングエンジン

    が特に作らないといけない重要ポイント。
    ということで作ってみました。

    [c]

    #include "cweb/cweb.h"

    int main(int argc, char *argv[])
    {
    CWebListen(8081);
    return 1;
    }

    void didReceiveCWebRequest(CWebTCPConnection *connection, CWebHTTPRequest *request)
    {
    CWebObject *object = CWebObjectCreateDictionaryStringValueWithCopy("title", "taitoru");
    char *html = CWebRenderHTML("./index.html", object);
    CWebHTTPResponse *response = CWebResponseCreateWithHTMLBODY(html);
    CWebResponse(connection, response);
    }
    <p class="p1">[/c]

    こんな感じで利用できます。main関数内はこれだけです。
    ルーティングもあるんですが、今日はつかれたのでここまでにしてます。

    アクセスするとこんな感じ
    スクリーンショット 2014-07-21 22.22.56

    一旦Apache Benchしてみました

    
    Server Software: CWeb
    Server Hostname: 127.0.0.1
    Server Port: 8081
    
    Document Path: /
    Document Length: 89 bytes
    
    Concurrency Level: 10
    Time taken for tests: 0.139 seconds
    Complete requests: 1000
    Failed requests: 16
    (Connect: 0, Receive: 0, Length: 16, Exceptions: 0)
    Write errors: 0
    Total transferred: 180078 bytes
    HTML transferred: 89078 bytes
    Requests per second: 7210.85 [#/sec] (mean)
    Time per request: 1.387 [ms] (mean)
    Time per request: 0.139 [ms] (mean, across all concurrent requests)
    Transfer rate: 1268.08 [Kbytes/sec] received
    
    Connection Times (ms)
    min mean[+/-sd] median max
    Connect: 0 0 0.2 0 1
    Processing: 0 1 0.5 1 3
    Waiting: 0 1 0.4 1 3
    Total: 1 1 0.4 1 4
    
    Percentage of the requests served within a certain time (ms)
    50% 1
    66% 1
    75% 2
    80% 2
    90% 2
    95% 2
    98% 3
    99% 3
    100% 4 (longest request)
    
    

    正直ApacheBenchなんて初めてやるからいいかどうかわからないんだけどw
    ただ、revelのテンプレートアプリを同じようにやったらRequests per secondが2000ぐらいなので、まだ激速いとはいえないですね。

    やっといまレンダリングエンジンとレスポンスまで出来たのでこれから色々詰めていきます。やりたいのは

    • 1リクエストしか処理できないのをlibevent使ってどうにかする
    • ちょっとでも malloc->freeを使う部分を減らす