2013年12月8日日曜日

FRDM-KL25Zを簡易なARMマイコンライタにする

Cortex-M0+を積んだFreescaleの安いマイコンボード、FRDM-KL25Z。これをちょっとした改造でARMマイコン用のライタにします。参照元はいつものMCU on Eclipseから。

仕組み

FRDM-KL25Zは、PC向けUSBポートの管理やデバッグ、書き込みのインタフェースとして、OpenSDAという仕組みを使っています。購入時の状態では、これは同じボード上のKL25Zのマイコンへファームウェアを書き込むのに使われますが、基板上の端子穴からこれを横取りすることで、任意のARMマイコンへファームウェアを書き込むことができるようになります。

改造箇所

  1. 基板裏面にある、J11の穴どうしをつなぐパターンをカット
  2. J6にピンヘッダをはんだづけ
  3. OpenSDAのファームウェアを更新

この3箇所のみ。J11のパターンカットによって、SWDのクロックがボード上のマイコンに届かなくなるので、OpenSDAの影響を受けなくなります。再度接続したい場合は、ジャンパピンをたててショートさせましょう。

J6のピンヘッダがくせ者です。縦横どちらの方向も1.27mmピッチなので、店頭であまり売ってません。残念ながらぼくはどこで買ったか忘れました。これに対応したケーブルつきメスコネクタは秋月に売っていたので、もしかしたらあるかもしれません。

OpenSDAのファームウェアは、Freescaleのサイトからダウンロードします。リンク先の"FRDM-KL25Z Quick start package"からどうぞ。KL25Zに書き込む場合は MSD-FRDM-KL25Z_Pemicro_v105.SDA を、それ以外のARMマイコンの場合は CMSIS-DAP_OpenSDA.S19 を書き込みます。DEBUG-APP_Pemicro_v102.SDAは、ボードをデバッガとして使う場合に書き込みます。v102の部分はバージョン番号で、異なるかもしれません。

接続例

IMG_0423

USBケーブルがささっているほうがライタ、もう一方がターゲットになります。PC側はOpenSDAによってUSBドライブとして認識されているので、コンパイル済みのファームウェアを放り込むだけで書き込みが終わります。

2013年8月29日木曜日

FRDM-KL25ZにUSBホストの機能を実装するための準備

Freescaleのやっすい評価ボードのFRDM-KL25Z。やっすいのに加速度センサやタッチセンサ、フルカラーLEDなんかもついているうえ、マイコン自体がUSBのホスト・デバイス・OTGのいずれにも対応している高機能品です。基板上のUSBコネクタはMini-Bですが、ちょっと無理をすることでUSBホストの機能を実装することができます。

実装にあたり、ほとんどの情報はMCU on Eclipseを参考にしています。この記事もほとんどそのサイトに書いてあることを日本語にしているだけです。ぼくが忘れないように。リンク先の著者はFreescaleの中の人のようですが、Freescale本家サイトよりも圧倒的に詳しくわかりやすく書いてくれています。本家しっかりしろ。

FRDM-KL25Z自体は、最初の発売からアップデートがかかっています。この記事ではRev.Eを使用しています。スイッチサイエンスにて購入したときはこのRev.Eでしたが、一部の回転が遅めな販売業者ではRev.Dが販売されているようです。USBホストとして改造するには死ねますが、mbed互換基板として使うぶんにはよさげです。

基板側の準備

箱から出した状態では、USBデバイスとして基板が構成されています。いくつかの配線をショートさせることで、USBホスト向けの回路にします。

USB ID端子のショート

USBホストを実装する際には、IDピンは不要となります。コネクタそばのR82に0Ω抵抗を実装してGNDへ落とします。

ジャンパピンをショート

2か所のジャンパピンをショートさせます。ひとつはJ21。OpenSDA(デバッグ)用としてPCとつながっているMiniBコネクタの5Vを、そのままVBUS電源として供給するため。もうひとつはJ20。D20のVfでマイコン本体向け3.3Vが低下するのを防ぐため。その先のJ3とJ4もショートさせたほうがいいらしいですが、横の抵抗が0Ωなのでどうなのかなと。

5V出力の3端子レギュレータの追加

これは必須ではありませんが、J22に5V出力の3端子レギュレータを追加すると、外部電源(〜9V)をつないだ際にUSBのVBUSへ安定した電源を供給できます。J9の10番端子に5Vが出てくるので、そこから線を引っ張ってVBUSへ。基板上にはパターンはなさそうなので、めんどうではありますが。

ファームウェアの更新

のちのちデバッグがやりやすいように、OpenSDAをシリアルポートとして認識させるファームウェアに書き換えます。mbed対応のものではないので注意。

PEmicroがOpenSDAの各種ファームウェアやドライバを公開しています。ダウンロードにあたって会員登録が必要なのは目をつむるとしても、ログイン画面だけがHTTPSだったりXSS仕込み放題だったり(さすがにscriptタグは対策してたが)とメールアドレス以外の情報はできるだけ渡したくない雰囲気がぷんぷんしますが、そういう便利ツールを無料公開してるから仕方ないかなって気がしたりしなかったり。

Pemicro_OpenSDA_Debug_MSD_***.zipをダウンロード・解凍すると、各種評価ボード用のOpenSDAファームウェアが入っています。KL25Z…をインストールしそうになりますが、DEBUG-APP_Pemicro***.SDAをつかいます。Windowsにて、基板上のボタンを押したままUSBケーブルをつなぐと、小さなドライブがマウントされるので、そこにファイルをドラッグします。ケーブルを差し直すと、デバッグにやさしい状態になっています。

IDEの準備

mbedはつかいません。なぜならKL25Z向けにUSBホスト機能を提供していないからです。チップがOHCIに対応してないから当分の間実装はしないってさ。なのでブラウザIDEではなく、Freescale提供のCodeWarriorを使います。無償トライアル版ではフラッシュが64KB制限だったりRTOSのサポートがなかったりしますが、特定のデバイスのみに対応するUSBホストを実装して任意のちょいとしたコードを追加するには十分です。どうしても足りないなってときは、もろもろの制限の外し方をさきの参考サイトが書いてくれています。中の人なのに。

FreescaleのサイトからCodeWarriorに加えてUSB Stackをダウンロードし、インストールします。最新版CodeWarriorのなかみはEclipseですが、Windows版のみでMacOS版はありません。マイコン開発の壁はここだと思う。

Processor Expertの準備

CodeWarriorにはProcessor Expertというコード自動生成ツールがついています。UARTやタイマーなどのペリフェラルのうち、レジスタを直接たたくような部分については自動生成し、それ以外のアプリ部分に集中してコードを書けるという仕組みです。USB Stackをインストールすると、ホスト・デバイス・OTGを扱うためのProcessor Expertの追加機能がついてきます。CodeWarriorを起動し、メニューバーのProcessor Expert内、Import Component(s)から。"スタックのフォルダ\ProcessorExpert\Components"の*.PEupdを全て指定しておきましょう。

これで準備完了

これでUSBホスト機能を扱うまでの準備が完了しました。この先のコードなどについてはサンプルや例のサイトなどを参照ください。

2013年8月24日土曜日

いまさらレコードプレイヤーを買った

もう21世紀も1割すぎたってのにね。雰囲気がいいよね。

Vestax handytrax USB

なんか本気の、発電所まで指定しなきゃいけないんじゃないかっていうやつはいらなくて。むかーしアルバムのジャケットで見たものか、ピチカート・ファイヴが歌ってたポータブルプレイヤーがあるといいなーと電気屋さんを見てたら、コレでいいんじゃないかと。

IMG_1235
ほんとはこういうのがよかった

TIのUSBオーディオのICが載っているので、スピーカーから出る音をA/D変換してPCで聴けます。専用ソフトが付属していたけど、とくになくても大丈夫な感じ。PCからは一般的なUSBオーディオデバイスとして見えるだけなのでドライバが必要ってわけでもなく、外部音声入力としてQuickTimeなんかで録音したりもできます。

Negiccoのアナログ盤を聴くために買った

IMG_1217

新潟を中心に活動するアイドルのNegicco、新譜をCDとレコードで出したんですよ。発売当初はCDだけでいいかなと思ってたんだけど、在庫あるっぽいからとりあえず買っておいて、これを機にレコードプレイヤーを導入するのもいいかなと強引に納得させるように。

いま初めて知ったこと

7インチ盤は片面で1曲分。だからボーカル抜きのトラックは入ってない。もともと入ってなくて、8センチCDが出たときにおまけで追加されるようになったんですね。

LP盤は片面20分くらいなので、最近の12センチCDアルバムの内容をレコード化すると2枚組。3〜4曲で片面うまっちゃうんだね。

2013年6月13日木曜日

組み込みソフトウェアのTDDってなんだろーかね

ファームウェアをつくる仕事になりまして。アップデートのできない前提とすると、きちんと抜けなく確かめないとじゃないですか。趣味でコードを書くことはあっても、仕事ではなかったし、自分しか見ないしで、テストとかほとんど何も考えてなかったので、この機会に勉強することにしました。自分が忘れないように書いておきます。

参考にした資料

Web系やIT系のかたがただと実践した記録が勉強会で出てきてるけど、マイコン開発だとなかなか見つからなくて。上記の書籍とサイトを参考に、自分の環境を整えました。上記サイトは幸いにもPIC向け開発のものだったのですが、32ビットPICだと若干見直さないといけない箇所があり苦労しました。そういうところはオライリーの書籍を参考にしてます。

ソフトに期待する動きを決める→テスト項目でしばる→期待する動きになるようにコードを書く→少し書いては実行してテスト、が流れなのかなと。

環境をととのえる

エディタはSublime Text 2を。今まではMPLAB Xで(テストぬきの)コードの作成から書き込み、デバッグまですべてをやっていたけれど、書き込みとデバッグのみに使おうと思います。補完やジャンプはすごいしっかりしてるけど、ビルドや書き込みで数秒間(Macごと)プチフリすることが多く、微妙にイライラしてました。

テストのフレームワークには今のところUnityを使っています。サイトと書籍のとおり。加えて、Ceedlingというビルドシステム(よい日本語が見つからない)を重ねています。先述の書籍では「テストコードを記述したあと、それを呼び出すためのmain関数を忘れずに記入するんだぞ」的なことが書いてあるのですが、この辺を自動生成してテストを呼び忘れることのないようにしてくれます。なかみはRuby。保存時に自動でビルドする設定で、そういった処理をやってくれるrakeを呼ぶようにすると、毎回のテストがはかどります。

ハードウェア依存の部分はどうすれば

I/Oとか、レジスタに直で読み書きする部分はどうしたらいいのかなと。ここはまだあまり自分のなかでまとまってないところ。書籍のほうには各種レジスタのポインタを使って…とかあるけれど。

32ビット版以外のPICだと、Microchipがsim30というシミュレータを提供していまして。マイコン用にビルドしたバイナリをターミナルから実行できてしまうのです。これを使うとポインタもなにも気にしなくていいんですが。

さいごに

TDDはものすごい上のレイヤーのエンジニアがやるもので、Cとかは泥臭いやりかたしかないんだろうなーって勝手に考えてましたが、全然そんなことはなく。外部環境に依存するものと考えれば、I/Oや割り込みなんてのもネットワークの向こうのDBサーバとかと同じ扱いなんだろうなと。あとは期待する動作とテスト項目をちゃんと考えないとね。ちゃんとってなんだろーかね。

Sublime Text 2を、ちょいとしたJavaScriptの記述以外で使いましたが、微妙な初期設定で苦労しました。ここはまた別に書きます。

2013年3月4日月曜日

Konashi(旧Monaka)とPulseSensorでドキドキをカウント

Bluetooth 4.0を使ってiPhoneから直接制御できる外部ハードウェアのひとつ、Konashi。これと心拍数を計るPulseSensorを組み合わせてみました。

Konashiとは

ユカイ工学製のBluetoothプロトタイピングボード。Bluetooth 4.0を積んでいるため、電圧の入出力をiPhoneから制御できるのが特長。

今までも、TIなどのチップメーカーから出ているサンプルボードを使えば同様のことができていました。が、国内で電波を飛ばす許可がなかったり、SoCのコードの作法とかコンパイラの壁があったりで、ぼくにはちょっとハードルの高い印象がありました。Konashiの場合、チップ自体を触ることはありません。Arduinoに近いメソッドをiOSから呼ぶことで、Konashi上の入出力(A/D変換やUARTなどを含む)をいじくる感覚です。Bluetoothデバイスを探したりなどの部分は、ライブラリ側がやってくれます。

PulseSensorとは

皮膚に光をあてて、血管を動きから心拍数を読み取るデバイス。手ごろな価格でけっこういい感じに読めます。国内ではスイッチサイエンスで取り扱いがあります。詳しい情報はメーカーのサイトか、書籍版Makeにて。

KonashiでA/D変換

IMG_1027

Konashiは3つのA/D変換ピンを持っています。参照電圧が1.3Vなので、読み取る電圧も分圧などでしぼる必要があります。PulseSensorの最大出力電圧はだいたい電源ピンなので、ボタン電池(3.0V)を使う場合は半分にすればよいでしょう。

電圧を読む際はちょっと工夫がいります。ドキュメントにもあるように、まずanalogReadRequestを呼んで、それからanalogReadを呼ぶという順序を守らねばなりません。A/D値はmVで帰ってきます。

NSLog

このあとグラフ表示までやりたかったのだけど、時間もなくちょっとめんどうなのでまずはここまで。

2013年1月24日木曜日

Web Speech APIで音声認識

Google Chromeのベータ版にのっているWeb Speech APIをつかってみたよ。最近はブラウザでなんでもできるけどここまでやるとはね。

Web Speech APIでできること

Web Speech API Specificationによると、音声認識と音声合成が簡単に扱えるAPIのようす。Chrome 25のベータ版では、音声認識のみ実装しているようです。

認識精度がけっこういいのだ

まずはGoogleのデモアプリで遊んでみる。はっきりとしゃべる分には、けっこう正確に認識してくれる感覚。例によって宇多丸と歌丸を使い分けるぞ!

Web Speech API recognizes UTAMARU correctly.

この音声認識も、Siriよろしくどっかのサーバで解析して結果を返してもらっている様子。ネットワークを切った状態で認識ボタンを押すと、マイクを起動しにいった直後に切ってしまい、音すら拾ってくれません。また、ローカルでもきちんとWebサーバを立てて、HTTPで開いていないとダメみたい。file://ではマイクすら立ち上げません。なかみはXHRをつかっているのだろうか。

イベントのトリガが豊富

仕様の5.1.3節にイベントいちらんが列挙されています。基本的にはonresultで、認識した結果を使うのだろうけど。onspeechendとかを使うと、解析結果はどうでもいいから声があったことだけ使いたいってときに使えそうです。2コンに向かってなんでもいいから叫ぶアレのエミュレートとか。

さいごに

Web Audio APIとかみたいに、内部でがっつりコードが動いているわけではなく、認識も生成も外部サーバのクライアントとしての立ち位置みたい。外部サーバも任意に指定できるっぽいので、SiriProxyがわりに使っちゃうこともできるんじゃないだろうか。iPhoneのWebKitに載るのは当分先だろうけど、楽しみ。

2013年1月3日木曜日

Node.jsとMongoDBで回路のテスト

昨年末に基板を自作しまして。まとめにも書いているように、理屈のうえでは電池のもちがよくなっているはずです。でもどのくらいよくなっているのかがわかりにくいので、実際に測定してみることに。

どうやって測るか

基板から制御する8個のLEDを全開にした(ほぼ)最大負荷の状態で何時間もつかを測ります。通常使用では全開にし続けることはないので、「最低でもこれだけもちます」という時間がわかります。

最初はiPhoneのストップウォッチでいいんじゃねえかと思いましたが、如何せん時間が長い。目を離したすきに電池が切れられても困ります。せっかくXBeeで電圧をモニタしているので、これを利用することに。Node.jsでシリアルポートを監視し、XBeeのパケットを受信したらMongoDBに放り込みます。XBeeからのパケットが途絶えた(=電池が切れた)ところでMongoDBの中身をグラフ化し、何時間動き続けたかを読み返します。

動かしてみた

コードはこんな感じに。

var mongoose = require('mongoose');
var db = mongoose.connect('mongodb://localhost/batterytest');

var Packet = new mongoose.Schema({
    vol1:   Number,
    vol2:   Number,
    time:   { type: Date, default: Date.now },
});

exports.Packet = db.model('Packet', Packet);
var model = require('./model_voltage');
var Packet = model.Packet;

serial_xbee.on('data', function(data){
    // 受信したパケットが'Data Sample'である
    if( (typeof data.bytes !== "undefined") && (data.bytes[0] == 0x92)){
        // パケット中のA/D変換した読み値でオブジェクトをつくる
        var newPacket = new Packet({vol1: data.samples.A0, vol2: data.samples.A1});
        newPacket.save(function(err){
            if(err){
                console.log(err);
            }
        });
    }
});

で、とったログをグラフ化。ここはMongoDBからCSVとしてはきだして、Numbersでグラフにしました。Numbersでグラフをつくるのは意外とめんどうでした。Excelほしいです。

名称未設定 2

5V昇圧をナシにしたFusion PCB試作のほうが、圧倒的に長いあいだ動作できることがわかります。適当なパターンで点滅させるとなれば、もっと動作時間は延びると考えられます。加えて、電池や昇圧ICの特性もみえそうという副産物も。もとの電源が十分に電圧を確保できてる場合、5V電源のほうは出力電圧がビチッと5Vで安定してますね。

おわりに

そういう用途ならばfluentdを使えばとなるのだけれど。シリアルポートがうまく読めなくて苦労しているので、なんとかなったらそこはまた。