• 2. mbedを使ってみる

    早速、ブラウザから書くってどんな感じなのかやってみましょう。
    今回使うのはSTM32Nucleoです。秋月で1200円とかで売ってます。
    http://akizukidenshi.com/catalog/g/gM-07723/
    種類があるんですが、これはF32F401ってやつです。
    2014-11-20 19.47.47

     

    接続

    さて、箱には注意書きとして
    「JP1がOFF, JP6がON,JP5がU5V側にあることを確認してUSBにつなぐこと」
    って書いてあるのでそれだけ一応確認して接続します。
    2014-11-20 19.47.36

    すると、LEDがつきます。一応簡単なプログラムが書き込んであって、青色のユーザーボタンをおす度にLEDの単滅パターンが変わるようになってます。
    また、つなぐとMacにNUCLEOっていうドライブが出てくると思います。(もしここでエラーが出た人はこのページの一番下を見てください)
    Screen Shot 2014-11-20 at 19.48.27
    ダブルクリックして開くとこんな感じ
    Screen Shot 2014-11-20 at 19.48.32

    僕のMacは隠しファイルも出すようにしてるので余計なのが出ますが、普通ならmbed.htmっていうファイルだけ出てくると思います。
    これを開くとmbedのサイトが開くのでそこでプログラムを書いてみましょうか。

    プログラムを書き込んでみる

    早速開きましょう。ただし、Safariだと問題があるので、FirefoxかChromeがいいです。
    mbed.htmを開くとこんな感じになると思います。
    Screen Shot 2014-11-20 at 19.48.45
    登録しなきゃいけないんですね。
    でも登録するとプログラムとかをこのサイト上に保存できるので、パソコンが壊れても大丈夫です。
    Signupから登録します。登録が完了するとこんな画面になるはず。
    Screen Shot 2014-11-20 at 19.49.53

    つないだボードが出てますね。ちゃんと覚えててくれたんですね。

    さて、プログラムを書く画面を開きましょうか。右側に「Compiler」っていうボタンがあると思います。それがプログラムを書く開発画面になります。
    初めてだと開いた瞬間にこんなのが出ると思います。
    Screen Shot 2014-11-20 at 19.52.08

    使うボード(Platform)が何か聞かれていますが、さっきつないだのが出てますね。
    Templateは、サンプルプログラムです。PWMのテストが選ばれてますが、LEDチカチカが簡単なのでLEDを試せるやつにしましょう。
    ProgramNameはなんでもいいです。決めたらOK。
    Screen Shot 2014-11-20 at 19.52.50

    そしたら開発画面が出てくると思います。Webサイトとは思えないですね。
    左側がファイルで真ん中がメインの編集画面になります。
    サンプルなので早速main.cppが用意されています。これをクリックやダブルクリックで開いてみてください。
    Screen Shot 2014-11-20 at 19.54.20すると、ファイルが開かれます。
    LEDをつけたり消したりするプログラムですが、非常に簡単なプログラムになってますね。
    今回は書き込みまでやってみたいので、プログラムはこのままにしてコンパイルしてみましょう。
    上にある「Compile」ボタンを押すとコンパイルが始まります。問題なければファイルダウンロードがの面が出てきます。僕はFirefoxを使ってたのでこんなやつ。
    Screen Shot 2014-11-20 at 19.55.16

    これがコンパイル後のファイルです。
    プログラムの書き込みはこれをさっきのNUCLEOにドラッグ・アンド・ドロップするだけ!
    Screen Shot 2014-11-20 at 19.55.39

    こうやってね。
    正常に書き込まれたらボードのLEDがチカチカした後に点灯しますのでリセットボタンを押してみましょう。
    するとフラッシュみたいにピカって短く光って長く消えるっていうLEDチカチカが出来ると思います。
    プログラムを見るとそんな感じになっているので問題なく書き込めましたね(^-^

    こんな感じでmbedはブラウザとUSBさえあるパソコンならどこででも開発できますし、プログラム自体も簡単になっています。
    これで大分マイコン開発の敷居が下がりましたね!

     

    ====================

    MacのYosemiteでプログラムが書き込めない問題

    Yosemiteだとmbedボードをつないだ瞬間にこんなのが出ます。
    Screen Shot 2014-11-20 at 19.47.18

    どうも、MacOSのYosemiteだとmbedボードをUSBフラッシュとして正しく認識してくれないようです。根本的な対応がそのうち出るかと思いますが、とりあえずの対処法は
    http://qiita.com/gyoten/items/3dce36b5dd25da03cde6
    http://developer.mbed.org/forum/mbed/topic/5149/?page=1
    これらを参考にすれば出来ると思います。

     

  • 1. mbedって何?

    マイコンのプログラムをマイコンに書き込むのはすごく大変ですよね。新しいパソコンで新しいマイコンを使おうと思ったら

    1) 開発環境を用意する
    2) そのマイコン用のプログラムを書く
    3) 専用ケーブルでつないで書き込む

    こんな手順が必要になります。 これがmbedが出来るまでの話。
    mbedは何かというと開発環境がブラウザになってコンパイルまで出来て、プログラムをUSBフラッシュにデータをいれるようにプログラムを書き込める仕組みのことです。

    まずmbed対応のマイコンボードってのがあります。それには既にプログラムが書き込んであって、USBでパソコンとつなぐとUSBフラッシュとしてパソコンは認識します。
    で、mbedのサイトがあります。mbedのサイトではプログラムを書くことが出来てコンパイルまでできちゃいます。
    コンパイルしたらコンパイル後のファイルがダウンロードできるのでそのダウンロードしたものをUSBフラッシュとして認識されているmbedにドラッグアンドドロップでいれるだけ。
    あとはマイコンの中のプログラムがそれを受け取ってマイコンの中に書き込んでくれます。
    パソコンに開発環境を入れなくていいんです。だからmbedを使うと

    1) 開発環境を用意する  ->  開発環境はネットに繋がったブラウザがあればいい
    2) そのマイコン用のプログラムを書く  ->  mbedのサイトで抽象化されたプログラムが可能
    3) 専用ケーブルでつないで書き込む  -> USBでつないで ドラッグアンドドロップ

    となります。
    mbedは色々なチップで使えるようになっています。つまり、ハードウエアが抽象化されていて、本当だったら色々設定しなきゃいけないのをスルーできます。IOをOutputにするためにはあるレジスタのあるところを1にして、、、みたいなのはなくて
    DigitalOut myled(LED1);
    こんなプログラムを書けば使えちゃうわけです。
    他の人の書いたプログラムも簡単に入れられるようになっているのでいつも面倒だったキャラクタディスプレイのところとかもモジュールとして入れれば簡単ですね。

    mbed対応ボードは1200円とかで買えちゃうので早速やってみましょう。次の回で実際にコンパイルから書き込みまでやってみます。

     

  • FusionPCBを使ってみたよ!

    基板を自分で設計した時に、プリント基板として作ってくれるのはいくつかありますが、話題のめちゃくちゃ安いのがSeedStudioのやっている「FusionPCB」です。どのぐらい安いのかというと、5cm×5cmまでの2層基板10枚を990円(1ドル100円なら)で作ってくれます。送料は別ですがそれでも安いですね。

    サイトはこちら
    http://www.seeedstudio.com/service/index.php?r=pcb

    サイズとかを変更できるようになっていて、ここで値段を確認できます。
    Eagleなどで作ったガーバデータをUpするとそれのサイズなどを自動的に読んで値段に反映してくれます。

     

    Screen Shot 2014-11-20 at 14.28.50

    ずっと使ってみたかったので今日はじめて注文してみました。

    ルールチェックとガーバデータ作成

    まず、作った基板がFusionPCBの工場で問題なく作れることを確認しましょう。さっきのサイトの「Order Submission Guildeline」にEagle用のルールチェックファイルと、ガーバデータのCAMファイルがあります。それをDLしちゃいますScreen_Shot_2014-11-20_at_13_23_25
    どちらもzipふぁいるとrarファイルという圧縮ファイルになっているので解凍します。するとこんなのが入っているはず。

    Screen Shot 2014-11-20 at 13.24.29

     

    青っぽいのがCAMファイルで提出用のファイルを作るためのもので、右下のがルールチェックですね。
    後々便利なので、Eagleのフォルダに入れちゃいましょう。
    Macの人は「アプリケーション」->「Eagle」の 「dru」にdruファイルを。「cam」にcamファイルを入れちゃいます。
    Screen Shot 2014-11-20 at 13.24.52

    ここですね。
    入れたら、ルールチェックからやりましょう。まず、作りたいボードをEagleで開いて、DRCチェックを開きます。

    Screen_Shot_2014-11-20_at_13_25_50

    開いたら「Load」を押します。するとさっきファイルを入れたdruフォルダが開かれるのでFusionPCBのサイトから落としてきたやつを選びます。そして、Checkを押します。
    これでFusionPCBで問題なく制作できるかを確認できます。左下に「DRC: No errors」って出るはずです。

    Screen Shot 2014-11-20 at 13.26.07

    だめだったらダメな場所を修正しましょう。

    これができたらCAMします。ボードを閉じてEagleのプロジェクト画面を開きます。

    Screen Shot 2014-11-20 at 13.26.24

    「CAM Jobs」のなかにさっき追加した2つがあると思います。実際に提出で使うのは「Seeed_Gerber_Generater」で始まるcamファイルです。これを開いてFile->Open->Boardから作りたいボードを選びます
    Screen Shot 2014-11-20 at 13.26.43

    選んだら「Process Job」を押します。すると提出に必要なファイルがボードと同じフォルダに生成されます。実際何が必要なのかはファイルをDLしてきたページに書いてある10ファイルです。これらをzipファイルにまとめちゃいます。

    提出

    では、提出用ファイルが出来たのでFusionPCBのサイトを開いて進めましょう。
    ファイルをDragAndDropすると自動的にサイズなどを読んでくれます。Screen Shot 2014-11-20 at 13.39.48

    んんん???
    謎の999ドルが出てきました。高すぎますね(^^;
    どうもFusionPCBのサイトがおかしいようで、Layerなどを選んだあとにファイルをUplaodしたら元に戻りました。Screen Shot 2014-11-20 at 14.09.39

    ふぅ。。。
    ちなみに

    Layer 層数
    PCB Dimention 基板サイズ
    PCB thickness 基板厚み
    PCB Qty 基板の数
    Surface Finish 表面加工(ハンダなのか、金メッキなのか)
    Copper Weight 銅箔厚み
    Panelized PCBs 面付け

    です。さて、この値段なら問題ないので Add to Cartします。Screen Shot 2014-11-20 at 14.10.26
    ちなみに僕はアカウントを持っているのでスイスイ行きますが、頼む前にアカウントを作って住所とか入れておくと便利です。

    購入処理

    FusionPCBではAmazonとかみたいに買い物カゴの仕組みを使っていて、いまはかごに入った状態です。Screen Shot 2014-11-20 at 14.10.50

    他のものもかごに入れられます。とりあえずこれでいいので「Checkout」を押して進めましょう。
    まずは住所と宅配方法を聞かれます。Screen Shot 2014-11-20 at 14.12.19

    アカウントがある人は住所が出てると思います。
    宅配方法はいろいろ選べますが、安いと遅いです。僕は今回はFedexを選びました。
    Screen Shot 2014-11-20 at 14.20.13

    「Next Step」で進みます。進むと今度は支払い方法Screen Shot 2014-11-20 at 14.20.57

     

    割引クーポンとかある人はここに入れます。
    特になければそのまま下にある支払方法選択でPaypalかクレカかを選びます。
    僕はカードで払います。
    Screen Shot 2014-11-20 at 14.21.02「NextStep」を押すと確認画面が出てきます。問題ないのを確認したらConfirmしましょう。

    クレジットカードを選んだ人はここでカード情報入力画面が出てきます。
    Screen Shot 2014-11-20 at 14.22.24

    で、入れたらProceed to Checkoutで処理しちゃいます。
    支払い完了画面と、だいたいどれぐらいで着くのかが書いてある画面が出てきます。これで完了です!Screen Shot 2014-11-20 at 14.24.51

     

    アカウント画面のOrder Historyを見るとちゃんと出てるし、作業が進めばその進捗が出て来るようです。
    Fedex選んでも5000円ぐらいで基板を10枚頼めるのはいいですね(^-^

     

     

     

  • 1. はじめに

    僕は高校の時、物理が大好きでした。いろんなことが分かsection0_01るようになるからです。窓から消しゴムを投げたら消しゴムはそのうち地面につくってのは物理を習わなくても分かる。だけど、物理を習うと何秒後に落ちるとか何m先に落ちるとかまで計算できるようになるのです。エンジンのパワーを教えてもらえれば、ロケットが地球を脱出するのに何秒エンジンを噴射しなきゃいけないかだって計算出来ますよ。物理を習ってる時は、そんな「どうやって分かるの?」と言いたくなるようなことがどんどん分かって自分で計算できるようになったのが楽しかったんです。もし、さっきのを聞いて自分もできるようになりたいと思ったのなら、ぜひ続きをご覧ください。

     

  • 4. 勾配法とニュートン法の話

    前回はニューラルネットワークは素子を一列に並べた3層構造だけでも関数の再現能力があるっていう話でした。
    今回は「じゃあどうやってある関数に似せるのか」という話です。

    希望の関数に近づける

    ある入力をした時にある出力をする関数があるとします。そして、その関数の式がわからない。これが現実の世界です。
    「デートに行きませんか?」と言って「やめておきます」という結果が出てくるまでは自分で調べられますが、相手の頭の中でどういう処理がされて、なんでこの結果になったのかは謎です。
    人工ニューラルネットワークも元から決まっている関数なら似せるのはとても簡単ですが、わからないものに対処するためのニューラルネットワークです(そもそもわかってるなら式でいいですからね)。
    じゃあどうするかというと、関数はわからないけどいくつかの入力と出力の結果は持ってるわけです。それを使って「じゃあこういう入力した時はこういう出力になるように」とそのデータを使って”学習”させるわけです。
    この学習に使うデータを教師データって言います。まんまですね。
    教師データには沢山の入力とその時の正解の出力が入っています。例えば入力が100なら50が正解と言った具合に。
    それでなにをやるかというと、ニューラルネットの前回までやった閾値や重み付けの値を変えていきます。
    最初はとりあえず適当に決めた値で作っちゃいます。そして、適当に作ったニューラルネットに100を入れてみるわけです。その時に80とかの答えが出てきたら「あ〜あと30大きいから30ぐらい結果が小さくなるように色々減らさなきゃ」となるわけです。
    理想はニューラルネットの出力が教師データと同じになることです。そのためにズレ(誤差)を元に「もうちょっと少なくなるように」「もうちょっと多くなるように」微調整していきます。
    のちのち、実際にニューラルネットの何を変えていくかを紹介しますが、まずは「どうやって誤差を小さくするのか」について話します。それにはニュートン法(勾配法の基礎)を使います

    差とニュートン法

    グラフを用意しました。
    さっきの教師データ 80入力で50出力が理想とした時にニューラルネットワークのいろんなパラメーターを変えて出てきた出力が下の図の青だとします。

    Untitled_Artwork-3

    誤差というのはニューラルネットの出力(青い線)と教師データの出力(赤い線=50)の差のことです。この差だけをグラフにするとこうなります。

    Untitled_Artwork-4

    この時に誤差が最も小さくなる場所が作りたいニューラルネットのパラメーターということになります。

    ニュートン法

    ニュートン法というのは中身が謎な関数があったときに「答えがYになるようなxってどこか」を求めるやり方です。ここでYを例えば0とかにすれば0になるようなxを探せます。もし関数が正の出力しかしないならそれで最小が探せますね。
    さて、ここにある謎関数があります。
    Untitled_Artwork-5

    y=(x-2)^2です。
    「関数分かっとるやないかい!」という突っ込みはしないで下さい。
    確かに、わかってるので最小値はx=2のときのy=0ってのは中学生でも分かりますが、今回は練習。
    さて、この関数の導関数も分かっちゃうとしますy’=2x-4です。

    で、僕らはこのf(x)がわかりません。だけど入力したら出力できるとします。この時にyが0になるのはどこか、どうやって調べましょう。お、何個か思いつきました
    1) おなじ間隔で調べる x=1 x=2 x=3 ,,,,
    2) とりあえずxを決めて値が小さくなる方にxを動かしていく
    さて、1だと大変です。何故ってマイナス無限からプラス無限まであります。
    ということで2をやってみます。なんでもいいから値を決めます。じゃあ3。
    Untitled_Artwork-6

    x=3だとyは1になるようです。
    さて、ここでxをちょっとずつ動かしたいのですがどうしましょう。まずxを増やせばいいのか減らせばいいのか。
    それを知るために微分を使います。y'(3) = 2*3-4なので2です。どうやらx=3ではxが1増えるとyが2増えるような傾きをしているらしいです。上り坂ですね。じゃあyを減らすためにはxも減らさないといけないですね。

    どのぐらい減らしましょう。1ぐらいにしとく?7とか?
    でも、どうせ微分がわかってて傾きが計算できるんだからそれを使いたいですね。。y’が2なので、この場所はxを1増やすとyが2増えることがわかっています。
    だったら!今yをあと1だけ減らしたいんだからxを0.5だけ左に動かせば2*(-1)で1減って0になりそうですよね!今の計算は

    xの動かす量 = – y(x)/y'(x)

    で計算しました。これがyが0なxを探すニュートン法です。
    つまりニュートン法とは

    1) 適当にx決める
    2) その場所のyとy’を得る
    3) 誤差とy’からyが理想の値になるようなxを計算して 2)に戻って繰り返し

    ということです。
    ちなみに傾きは一定じゃないので一発では決まりません。さっきのも0.5動かしたって x=2.5で、正解の2までまだ0.5ズレてます。
    でもこれをずっと繰り返していけばかなり近づいていきます。xがほとんど動かなくなったらゴールです。
    ということで謎な関数でも入力と出力とその場所の微分値が分かるならあるyを出すxを探すのは難しくないんです。

    勾配法とは

    ただ、ニュートン法だと答えを決めないといけません。「つまりyが0になるようなx」みたいな。
    でも謎な関数ですから最小値なんかそもそもわかりません。
    そんな時は勾配法です。勾配法はニュートン法と同じですが最小値が謎なので「・・・まぁ、ちょっとずつ動かしてこうぜ、微分も考慮しながら」っていうのが勾配法です。さっきのニュートン法が

    xの動かす量 = – y(x)/y'(x)

    こんなのでしたが、勾配法になると

    xの動かす量 = – α y(x)/y'(x)

    αみたいな数字がついてきてこれに小さな値を入れます。ビビリ係数です。
    つまり答えがわからない以上ちょっとずつ動かすしか無いのでαに小さめの値を入れてちょっとずつ動かしてyをどんどん小さくしていきます。で、最小な場所を探す。
    αをどのぐらいにするのかが問題になってきそうですが、でもこれで謎関数の最小値を探せそうですね。

    ニュートン法と勾配法の問題

    さて、実はこのやり方には根本的な問題があります。それは、この絵を見ればわかると思います。

    Untitled_Artwork-7

    谷が2つ以上あるとき、適当に決めたxから動かして谷底に落ちて「ここが最小だ!右に行っても左に行っても増えるぞ!」ってなります。
    こういう問題はありますが。それでも適当な場所から一番近い最小をさがせるわけですからよく使われています。

    まとめ

    • ニューラルネットワークをある関数に近づけることを学習という
    • ある関数の中身は謎だけど、教師データというのがある
    • 教師データとの誤差を小さくするのに勾配法を使う
    • 勾配法はニュートン法をちびちびビビりながら行うこと
    • 本当の最小じゃないところで留まる可能性がある