ほとんどコピペで作るコピペ専用USBデバイス

この記事はmbed Advent Calendar 2014 - Adventarの8日目の記事です。

コピペでチョッパヤ開発デバイスとして有名なmbedを使って、コピペするための専用ハードウェアを(ほとんど)コピペだけで作ってみましょう。

○ mbedオンラインコンパイラ上でのコピペとは

mbedの開発で使用するオンラインコンパイラでのコピペとは、主にライブラリを1クリックか2クリックで使用するプロジェクト内にインポートすることを指します。また、そのサンプルコードをフォーラムなどから入手し、自分のソースコードへコピペします。つまり、接続しているピンの定義やライブラリの間を繋ぐちょっとしたコードを足すだけであらゆるものを作れる環境が揃っています。(たぶん)

○ なんとなく仕様

  • USBキーボードとして認識される。
  • スイッチは3つ。スイッチを押すと全選択(ctrl+A)、コピー(ctrl+C)、ペースト(ctrl+V)のコマンドを送信する。
  • スイッチを押した時にmbed本体のLEDが光る。 

○ 必要なもの

  • mbed本体
    USBデバイスに対応してそうなものを選びます。青mbedや黄mbedはもちろん、STやフリースケールのものも対応しています。platformsのところをよく読んで選びましょう。
    今回は他のmbedと異なり、デバイス側のUSBコネクタが基板上にあるFRDM-KL25Zを選びました。LPC11U35やLPC1549のものもデバイス側のUSBコネクタが載っていて便利です。個人的にはLPC11Uがシンプルで使いやすいと思います。
     
  • スイッチ3個
    何でも良いです。タクトスイッチだとブレッドボードに刺さって便利。
     
  • ブレッドボードとワイヤー
      

○ 配線

usbcopypastebreadboard.png

 スイッチを配線してmbedに接続します。ピンはDigitalInできるところならどこでも構いません。

○ コピペしてくるライブラリ

 

  • PinDetect

    http://developer.mbed.org/users/AjK/code/PinDetect/
    DigitalInのバウンスやノイズを解除し、立ち上がり・立ち下がり・長押しなど任意の状態に変化したときに割り込みをかけてくれるライブラリ。スイッチを使うときには何も考えずにこれを使うと吉。
    割り込みなので変数の扱いやブロッキングを伴うコードには注意。

 

ライブラリのインポート

mbedオンラインコンパイラでのライブラリのインポートはとても簡単です。

  1. オンラインコンパイラで新規にプロジェクトを作成します。
    もし、すでにプロジェクトを作成している場合は必要ありません。

  2. インポートしたいプロジェクトのページへ行きます。

  3. "Import this library"をクリック

     WS000121.png


  4. オンラインコンパイラとポップアップが表示されるので追加したいプロジェクトをTarget Pathに指定する。
    New Programにプロジェクト名を入力すると新しいプロジェクトを作ってそこにライブラリを追加します。
    その場合はmbedライブラリが追加されないので別途インポートが必要です。

    WS000122.png 

 

○ ライブラリの動作確認

実際にソースコードを書く場合はライブラリを1つずつ確認しながらの作業になります。
コピペ開発にはできるだけライブラリのAPIドキュメントが充実しているもの、サンプルコードが潤沢なものを選ぶ必要があります。
そうでない場合はライブラリのソースコードを読み解かなければいけません。
幸い今回利用するライブラリには詳細なドキュメントとサンプルコードがついています。
まずはサンプルコードをそれぞれ個別に自分の環境でコンパイルし、mbed上で動くことを確認します。
 

・準備

ハードウェア上で接続したピンを以下のように定数にします。
今後、ライブラリを試す上でこの定数を使用するとハードウェアとソフトウェアでの不整合を防げます。

#define SW_A D2
#define SW_B D3
#define SW_C D4

defineすると怒られるかもしれないけど便利なのでしちゃいます。
 
 

・PinDetect

PinDetectのサンプルコードは変則的にライブラリ内にあります。

http://developer.mbed.org/users/AjK/code/PinDetect/file/cb3afc45028b/example.h

考えるのが面倒な場合はよく読まずにmain.cppに全てコピーしてピンの設定を変更してからコンパイルします。

PinDetect  pin ( SW_A  ); // スイッチのピンを指定する。
DigitalOut led1( LED1 );  // これ以下はテスト用のLEDです。
DigitalOut led2( LED2 );  // 使用しているボードによって書き換えること。
DigitalOut led3( LED3 );
DigitalOut led4( LED4 );

スイッチを押してピカピカとLEDが光れば動作しています。

しかし、KL25Zの場合、コンパイル時にエラーが出てしまいます。

WS000123.png

 

このエラーはKL25ZのpinModeの指定にPullDownがないことに起因していますので、
エラーメッセージをダブルクリックして、該当の場所を開いて修正します。

// エラーメッセージをダブルクリックするとここが開きます
// PinDetect.hの181行目あたり
PinDetect(PinName p) {
    init( p, PullDown );
}

 

この部分を以下のように修正し、再度コンパイルします。

PinDetect(PinName p) {
    init( p, PullUp );
}

 

エラーを修正した場合は現在のプロジェクト内のライブラリのみが修正されます。
もし、ちゃんと動作の確認が出来た場合は元のライブラリのリポジトリへプルリクエストを送ると良いでしょう。(当然、他のプラットフォームのmbedでも修正後のライブラリで動作することを確認しなければなりません。) 

 

・USBDevice

USBDeviceの中のUSBKeyboardのサンプルコードをプログラムとしてインポートして試します。
http://developer.mbed.org/handbook/USBKeyboard  

Import programからオンラインコンパイラを起動してコンパイル、転送して下さい。
もし、デバイス側のUSBケーブルを刺したままにしていると思いもよらぬところでキーボード入力されてしまうかもしれないので、
メモ帳などを立ち上げてそこにフォーカスを移してからデバイス側のUSBケーブルを差し込む方が安全です。
正常に動いていれば、PCの音量が下がったり勝手に文字入力されたりします。

 

○ コードを書く

全てのライブラリの動作確認が出来たら、全てのライブラリをインポートしてコードを書いていきます。ここまで来たらもう簡単です。あっちとこっちを組み合わせる部分だけを書きます。
もしかするとライブラリを同時に使用したことで何らかのエラーが出るかもしれません。そのときは諦めて他のライブラリを検索するか、ForumやQuestionで該当するものがないかどうか探してみましょう。

実際に書いたコードはこちらで公開しています。 
公開の都合上、修正したPinDetectライブラリはフォルダに変換してあります。 

http://developer.mbed.org/users/hsgw/code/USBCopyPasteKey/

○ まとめ

コピペでチョッパヤプログラミングはmbed.org内での検索能力に秀でていなければいけません。そして、お行儀の悪いライブラリには全くコメントやドキュメントが書かれておらず、ソースコードそのものを読み解く必要もでてくるでしょう。もしかするとmbedライブラリやマイコン自体のデータシートまで調査する必要があるかもしれません。コピペの道は修羅の道です。
大人しく最初から書いたほうが良いことも多いですが、そのお手本にするためのコード資産がmbed.orgには集まりつつあります。利用しない手はありません。この機会にmbedはじめてみましょう!

次はkumar0001さんです。よろしくお願いします。

この記事はmbed Advent Calender 2014向けの記事です。

// 書いてる途中にこういうものが公開されているのを知りました。おもいっきり被りました。 
// http://www.nicovideo.jp/watch/sm24956707

// 僕も以前こういうUSBデバイス作りました。
// http://www.nicovideo.jp/watch/sm19652615