CuriosityでmTouchを試してみる。その8 AFA編

mTouchでCVDのアルゴリズムにTIMER2を使ってタイミングを正確に管理するAFA(Automatic Frequency Adaptation)というのがありましたが、これのありなしで動きはどう違うのでしょう。あるいはタッチセンシングはどうかわるのでしょう

というのも、現在 mTouch の CVD では TIMER2 を使うように設定していますが、AFAを切れば TIMER2 は開放されるので問題は解決するためです。
ということで、AFAのありなしでセンシング波形を見てみました。

まず AFA ありです。
大きなギャップは約170usec。ギャップ間のスキャン回数は16回です。トリガ条件はローパルス幅でとっています。
上の一部を拡大したものです。

次に AFA なし。
AFA ありのときと違って、規則正しくサンプリングしているようには見えません。一応ギャップ間のスキャン回数は16回ですが、時間的なばらつきがあるようです。もちろんこれでもちゃんとボタン動作はしています。
上の拡大波形です。

AFA なしの場合には、どうもプリチャージ→アクイジション→ADサンプリングのタイミングが長くなったり短くなったりしているようです。それが積み重なって、タイミングがずれていくということのようです。
もう少し見てみると、以下のようになっています。
LOWのプリチャージからサンプリングまでは一定時間になっていますが、次のHIGHのプリジャージからのサンプリング開始が一定していないようです。AFA では、このサンプリング間隔を管理しているのかもしれません。ちなみにタッチのあるなしでタイミングには変化はないようです。
一方、AFA なしではソースファイルに mtouch_random.c というのが追加されていました。どうも、AFAで最適な周波数を取得するのではなく、ランダムにタイミングを制御してノイズを排除するというアルゴリズムのような感じです。

実際に AFA のありなしでノイズ耐性などはどう違うのか、アプリケーション(電池駆動かアダプタ駆動か、それともしっかりした電源装置なのか、あるいは家電か自動車か、など)によってどちらを使ったほうがいいのかとか、その場合に AFA のアドバンテージはどれくらいかなどは説明している文書などが見つかりませんでした。
一方で、AFA を無効にすると mtouch_random.c というファイルが生成され、mTouch の センシング周期をランダムに設定するような動作をしますが、AFA の説明のところで
The AFA requires extra Flash and RAM memory so this feature may not work with RAM limited controllers.
とあり、RAM/Flash ROM リソースの少ない MCU でも使えるように考えられているところを見ると、AFAなしでも問題ないのかもしれません。

本音を言えば、判断する手がかりとなるデータがないときには安全側に振るというのがスジなのですが、やっぱり TIMER2 を使いたいので少し試してみようかと思います。

MPLAB X IDEでMercurialを使う。

PICプログラミングですが、この先に進む前にMPLAB X IDEからバージョン管理システムを使えるようにしておきます。
個人の好みでVCSはMercurialを使います。理由は、自分にとっては使いやすい点とPythonだから、それとGitはPerlだしあまり馴染んでないから、です。もともとNetBSDがVCSとしてCVSを使っていた経緯から、CVS→Subversion→Mercurialというふうに自分で使うVCSを変えてきているので、その流れだというのもあります。当然ながらチームプロジェクトでない限りは自分の使いやすいものを使うのが一番なので、どれを選んでもよいとは思います。

まず、MPLAB X IDEのベースとなっているNetBeans IDEのNetBeans IDEでのMercurialサポートの使用(日本語)を参照します。
IDEのMercurialサポートを活用するためには、システムにMercurialクライアント・ソフトウェアをインストールする必要があります。IDEがサポートしているMercurialクライアントのバージョンは1.04以降です。IDEのMercurialサポートは、Mercurialのコマンド行インタフェースと同じコマンドで動作します。
ということで、Mercurialのダウンロード、もしくはTotoiseHGのダウンロードからインストーラをダウンロードしてインストールします。
ちなみにどちらを選んでもTortoiseHGのMSIインストーラがダウンロードされるようです。

インストールしたら、PATHが通っていることを確認します。コマンドプロンプトなどを立ち上げ、"hg" とタイプしてみます。hg がちゃんと実行できればOKです。

そうしたら MPLAB IDE X の "Tools"→"Options" から "Versioning" タブを開き、"Mercurial" を選択してパスを設定します。

次にリポジトリを作成しますが、その前に $HOME に .hgrc ファイルを作成しておきます。Windowsの場合には "%USERPROFILE%\Mercurial.ini" になります。設定ファイルの中身は以下のようなものです。
# Generated by TortoiseHg settings dialog

[tortoisehg]
ui.language = ja
vdiff = winmergeu
shell = "C:\Program Files\ConEmu\ConEmu64.exe"
tabwidth = 4
maxdiff = 0
editor = notepad++

[ui]
username = Taro YAMADA
editor = notepad++
merge = winmergeu

[extensions]
win32mbcs = 
TortoiseHG から "Global Settings" を開く(フォルダアイコン上で右クリックして "TortoiseHG"→"Global Settings")とユーザ設定を編集できます。
まず「コミット」のタブで名前を設定します。emailアドレスはあってもなくても問題ありません。チームプロジェクトならあったほうがいいでしょう。「TortoiseHG」のタブで同様にUI言語やGUIエディタ、マージツールを指定できます。マージツールは TortoiseHG と一緒にインストールされる kdiff3.exe でもいいですし、他のツールでもよいです。自分は WinMerge を使っています。
それから、日本語を含むファイルパスを使用する可能性がある場合には、「エクステンション」タブの一番右下の方にある "win32mbcs" にチェックを入れます。
他にも設定項目はいろいろありますが、基本的にはデフォルトのままでOKです。
このダイアログで設定すると、設定した内容で Mercurial.ini ファイルを %USERPROFILE% に作成します。

設定ファイルを作成したら、コマンドプロンプトを開いてプロジェクトディレクトリに移動します。今回は CuriTouch2.X というディレクトリで作業していますので、そこに移動して
$ hg init
します。すると .hg というリポジトリデータを格納するディレクトリが作成されます。

次にファイルの追加を行います。が、どうも MPLAB X IDE からでは直接はできないようで、Projects" タブのファイル名の上で右クリックして "Mercurial" のサブメニューで "Add" がグレーアウトしています。なのでエクスプローラからファイル名を右クリックし、"TortoiseHG"→"View File Status" するとダイアログが出るので、そこから追加していきます。
まず、一番下の「フィルタをクリアしてルートを表示」ボタンを押すと、そこにあるファイルのステータスがずらっと表示されます。そこからファイルを選択して右クリックして「追加」を指定すれば、リポジトリに登録するためのフラグが付けられます。

基本的に自動生成されるファイルは登録しません。今回はMCCの生成するファイルで、いじるものを対象とします。登録した後でMCCに上書きされても、差分からもとに戻すことができるようにするためです。当然、コンパイラの吐き出す中間ファイルなども登録しません。
ファイルの選択が終わったら「コミット」ボタンを押します。コミットしないとリポジトリに格納さないので、これは確実に行います。
すると、MPLAB X IDEでのファイルの表示が変わります。
今回登録しなかったファイルは "[ignored]" から "[New]" に変わってますし、登録したものはステータスが消されています。
ちなみに、"[New]" のファイルで右クリックして "Mercurial" のサブメニューを見ると、"Add" が選択できるようになっていますので、もしかしたら1つだけでも登録すれば "Add" できるようになるのかもしれません。

これでバージョン管理システムの導入が終わりました。

JIS規格書の閲覧。

JISの規格書は、購入すれば閲覧も部分印刷もできると思います。また図書館にも蔵書されているので、コピーなどもできると思います。が、閲覧だけなら日本工業調査会のページから閲覧できるのを見つけました。検索、拡大などはちょっと使いにくいですが、参考にはなるかと思います。

CuriosityでmTouchを試してみる。その6 シリアルデバッグ編

MCCのmTouchのパネルで "Debug" というのがあったのでいじってみるということで、秋月電子でピンヘッダを買ってきました。1x40の2.54mmピッチの、ごくごくスタンダードなタイプで、1本35円です。あって困ることはないので10本ほど買ってきて、ニッパーで8ピン分を2つ切り取って J33 と J34 に実装します。

熱容量の大きい電源とGND端子も含まれるので、小手先は太め。ちなみにはんだごては HAKKO の FX-951 を使っています。十数秒で設定温度になるし、こてをスタンドに戻せばスリープになってこて先が痛むのを防止してくれるし、用途に応じて簡単にこて先を交換できるので重宝しています。また、はんだは千住金属工業の鉛フリーはんだ SPARKLE ESC-F3-M705-0.6mm。500g巻きで購入しています。使用するときのこて先温度は350~360℃。M705というのは合金の配合割合で、最近ではM705RKというシリーズがこて先寿命を延ばすために開発されているようです。ESCというのは濡れ性などの作業性重視のシリーズで、ESC→ESC21→NEO→GAOというシリーズに進化してきているようです。以前は信頼性重視のRMA08をよく使っていましたが、これは温度をかけすぎると粘りが増してきて使いづらくなるのです。こちらのシリーズはRMA08→LSC→SENというシリーズに進化してきているようです。カタログはこちら
GAOでは合金としてM705からM24APなどを推奨するようになっているようですが、小売市場に出回っているのはM705がほとんどですね。GAOシリーズなどは個人では入手困難かもしれません。ESC21あたりまでしか出回っていないようです。まあ、M705は十分に実績があるので、むしろメーカーさんなどでは新合金に変更して不具合でも出たらやばいのでなかなか切り替えは進んでいかないかもしれません。何年もかけて経時変化含めしっかり評価するでしょうし。

それはさておき、はんだ付けしたものは以下のようになりました。

また、TTl-232R-3V3のコネクタの方は以下のように並べ替えています。

次はMCC側の設定です。
まずmTouchのパネルを見てみます。"USART Module" のところに "EUSART" が入ってきています。これを選択し、"Enable Debug" にチェックを入れます。
次に "Baud Rate" を115200(115.2k)に設定します。また、"Enable Transmit" と "Enable Receive" にチェックを入れます。双方向通信ではないはずなので、割り込みは使いません。
設定をしたら、"Generate" ボタンを押しおしてコードを生成、ビルドしてPICに書き込みます。これでデバッグデータ出力が可能になっているはずなので、まずはTeraTermで受信してみます。
TeraTermの「設定」→「シリアルポート」で「スピード」を115200にするとデータが流れてきました。どうやらバイナリデータのようです。背景は気にしない。のっぺらぼうだとさみしいので、適当な絵を背景にしただけです。

通信ができていることがわかったので、Data Visualizerに食わせてみようと思います。

起動直後の画面。COM3が利用可能になっています。DGIはないので、右上の×で消去しておきます。
"Connect" ボタンを押すと、通信速度を順に試していって115200で止まり、なにやらダイアログを表示してきました。configurationfileがないから指定しろ、とのことです。よくわからないので、Microchipの Data Visualizer User's Guide を見てみると、
When using the Data Stream protocol, the configuration resides in files stored on the host computer and the target application just sends an ID to identify which configuration files to be loaded by the Data Visualizer.
とあります。どうやら "Data Stream Protocol" の設定ファイルをロードする必要があるみたいです。が、プロジェクトディレクトリにはそれらしきファイルはありません。106ページのData Stream Protocolを見ると、0x03のスタートバイトと0xfcのエンドバイトに挟まれて、リトルエンディアンでデータ列が送られてくるようです。
今回は10bit ADCが1チャンネルのみなので、
D,1,1,ADC
というファイルをどこかに用意すればいいような気もします。なのですが、何という名前でどこに保存すればいいのかわかりません。結局のところ、Data Visualizerでデータを意味のある波形として表示できませんでした。残念。

ただ、どうもソースを眺めてみると mtouch_datastreamer.c というのがあって、その中で MTOUCH_DataStreamer_Service() というのが定義されており、それが mtouch.c から呼び出されているようです。mtouch.c の中では、
/*
 * =======================================================================
 * MTOUCH_Service_Mainloop()
 * =======================================================================
 *  Root mainloop service routine for all enabled mTouch library modules.
 */
bool MTOUCH_Service_Mainloop(void)
{

    /* In free running mode, the mTouch service will be executed once MTOUCH_Service_Mainloop gets called.*/
    mtouch_time_toScan = true;
    
    if(mtouch_time_toScan)               
    {
        if(MTOUCH_Sensor_SampleAll() == false)     
            return false;           
        MTOUCH_Button_ServiceAll();             /* Execute state machine for all buttons w/scanned sensors */
            MTOUCH_DataStreamer_Service();          /* Execute Data Visualizer module */  
        mtouch_time_toScan = MTOUCH_needReburst();
        MTOUCH_Sensor_Sampled_ResetAll();  
        MTOUCH_Tick();
        return true;
    }
    else                              
    {
        return false;                
    }
}
なんてことをやっているので、やっぱり MTOUCH_DataStreamer_Service() をちゃんと見ればいいのかもしれません。この mtouch_datastreamer.c は、mtouch の Debug を有効にしていないとファイルが生成されませんので、参考までに引用しておきます。
/*
    MICROCHIP SOFTWARE NOTICE AND DISCLAIMER:

    You may use this software, and any derivatives created by any person or
    entity by or on your behalf, exclusively with Microchip's products.
    Microchip and its subsidiaries ("Microchip"), and its licensors, retain all
    ownership and intellectual property rights in the accompanying software and
    in all derivatives hereto.

    This software and any accompanying information is for suggestion only. It
    does not modify Microchip's standard warranty for its products.  You agree
    that you are solely responsible for testing the software and determining
    its suitability.  Microchip has no obligation to modify, test, certify, or
    support the software.

    THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS".  NO WARRANTIES, WHETHER
    EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED
    WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A
    PARTICULAR PURPOSE APPLY TO THIS SOFTWARE, ITS INTERACTION WITH MICROCHIP'S
    PRODUCTS, COMBINATION WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION.

    IN NO EVENT, WILL MICROCHIP BE LIABLE, WHETHER IN CONTRACT, WARRANTY, TORT
    (INCLUDING NEGLIGENCE OR BREACH OF STATUTORY DUTY), STRICT LIABILITY,
    INDEMNITY, CONTRIBUTION, OR OTHERWISE, FOR ANY INDIRECT, SPECIAL, PUNITIVE,
    EXEMPLARY, INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, FOR COST OR EXPENSE OF
    ANY KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWSOEVER CAUSED, EVEN IF
    MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE
    FORESEEABLE.  TO THE FULLEST EXTENT ALLOWABLE BY LAW, MICROCHIP'S TOTAL
    LIABILITY ON ALL CLAIMS IN ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED
    THE AMOUNT OF FEES, IF ANY, THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR
    THIS SOFTWARE.

    MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF
    THESE TERMS.
 */

/*----------------------------------------------------------------------------
  include files
----------------------------------------------------------------------------*/
#include "mtouch_datastreamer.h"
#include "../mcc.h"

/*----------------------------------------------------------------------------
  manifest constants
----------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------
  global variables
----------------------------------------------------------------------------*/
uint8_t data[] = {0x5F,
    0xB4, 0x00, 0x86, 0x4A,
    0x03, 0xEB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAA, 0x55, 0x01,
    0x6E,
    0xA0};

/*----------------------------------------------------------------------------
  prototypes
----------------------------------------------------------------------------*/
void MTOUCH_DataStreamer_Initialize(void)
{
}

void inline datastreamer_output_byte(uint8_t data) 
{
    EUSART_Write(data);
}

void MTOUCH_DataStreamer_Service(void) 
{
    uint8_t i;
    static uint8_t sequence = 0u;
    uint16_t u16temp_output;
    uint8_t u8temp_output;
    volatile uint8_t count_bytes_out;

    if ((sequence % 10) == 0) 
    {
        for (i = 0; i < sizeof (data); i++)
            datastreamer_output_byte(data[i]);
    }

    // Start token
    datastreamer_output_byte(0x55);

    datastreamer_output_byte(sequence);

    /* table - button specific data */
    for (count_bytes_out = 0u; count_bytes_out < MTOUCH_BUTTONS; count_bytes_out++) 
    {
        u16temp_output = MTOUCH_Button_Reading_Get(count_bytes_out);
        datastreamer_output_byte((uint8_t) u16temp_output);
        datastreamer_output_byte((uint8_t) (u16temp_output >> 8u));

        u16temp_output = MTOUCH_Button_Baseline_Get(count_bytes_out);
        datastreamer_output_byte((uint8_t) u16temp_output);
        datastreamer_output_byte((uint8_t) (u16temp_output >> 8u));

        u16temp_output = (uint16_t)((int16_t)MTOUCH_Button_Deviation_Get(count_bytes_out));
        datastreamer_output_byte((uint8_t) u16temp_output);
        datastreamer_output_byte((uint8_t) (u16temp_output >> 8u));

        u16temp_output = MTOUCH_Button_Scaling_Get(count_bytes_out);
        datastreamer_output_byte((uint8_t) u16temp_output);
        datastreamer_output_byte((uint8_t) (u16temp_output >> 8u));

        datastreamer_output_byte(MTOUCH_Button_Threshold_Get(count_bytes_out));

        datastreamer_output_byte(MTOUCH_Button_isPressed(count_bytes_out));

    }

    datastreamer_output_byte(sequence++);

    // End token
    datastreamer_output_byte(~0x55);
}
このなかで、"Start token" と "End token" のところをそれぞれ "0x03" と "0xFC" にしたうえで "configurationfile" を適当に作ってやればいいのかな、とは思いますが。

ネジのサイズ。

ちょっと皿ネジのサイズを知りたかったので自分用メモ。
以下は多分JIS B1111より。参考 http://www.luomao.com.cn/JIS/JISB1111.pdf (リンクはつけません)


ネジの呼び径 M2 M2.5 M3 M4 M5 M6 M8 M10
頭部径(φdk) 4.0 5.0 6.0 8.0 10.0 12.0 16.0 20.0
頭部高さ 1.2 1.45 1.75 2.3 2.8 3.4 4.4 5.7
呼び長さ 3-20 3-25 4-30 5-40 6-50 8-60 10-60 12-60

Bloggerでの画像データの扱い。

Blogger Helpでブログへの画像や動画の追加には、
ブログ内の画像は Google アルバム アーカイブに保存され、ページやブログ投稿に挿入する際に Blogger に表示されます。
とあるのですが、一方でGoogle アルバムアーカイブのほうでは、
Google+ のアルバム アーカイブ内の写真と動画は、2019 年 4 月 2 日以降に削除されます。詳細
などとあって、2019年4月2日以降削除されてしまうようなことが書いてあります。Bloggerについてはどうなってんの?と思うんですが、上記詳細のリンク先にも詳しいことは書いていないようです。
どうなってんの?

Windows10 October 2018 Updateの内容。

特に目新しいところはないはずですし、そこら中のサイトで触れられているところだと思うので、自分用のメモ。

なぜか今朝PCを立ち上げたら最新の Windows 10 の更新プログラムの新機能というページがChromeで自動で開かれていたので目を通しました。以下、これまで知らなかった点を抜粋します。ちなみに October 2018 Update は Version 1809 になります。

クラウド クリップボードから貼り付ける

2018 年 10 月の更新では、クラウドベースのクリップボードを使用して、PC 間で画像やテキストをコピーして貼り付けることができます。

PC で Android スマートフォンからの写真を閲覧する

2018 年 10 月の更新では、スマホ同期アプリを使用して、Android スマートフォンに保存された最近の 25 枚の写真を閲覧できます。

PC から Android のテキスト メッセージを送信する

2018 年 10 月の更新では、スマホ同期アプリを使用して Android のテキスト メッセージをコンピューターから表示および送信できます。携帯電話をポケットから取り出す必要はありません。PC でテキスト メッセージを作成および送信する方法については、スマホ同期アプリのヘルプをご覧ください。

画面上の項目を拡大する

拡大鏡を使うと、画面の一部または画面全体を拡大して、文字や画像を見やすくすることができます。すぐに拡大鏡を起動するには、Windows ロゴ キー を押しながら正符号 (+) キーを押します。終了するには、Windows ロゴ キーを押しながら Esc キーを押します。

切り取り & スケッチを使用して画像のキャプチャ、マークアップ、共有を行う

画面スケッチが切り取り & スケッチと呼ばれるようになりました。切り取り & スケッチを開いて画面の一部を切り取るか、または前の画像をマークアップして共有します。

すばやく切り取るには、Windows ロゴ キー + Shift + S キーを押します。画面が暗くなり、カーソルが十字形で表示されます。コピーする領域の端をポイントしてカーソルを左クリックします。カーソルを動かして、キャプチャする領域を選択します。キャプチャした領域が画面に表示されます。

というあたりが気になった部分です。
クラウドクリップボードは、パスワードなどを扱うにはちょっと慎重になる必要があるかもしれません。便利そうだけど様子見。

スマホ同期アプリによる写真やテキストメッセージ(SMS)の同期は便利そうです。Version 1809 ではプレインストールアプリとしてインストール済みのようです。ただ、SMSは日本は欧米ほどポピュラーではないので、PCで常時見られるようにしておくほどのものではなさそうにも思えます。

画面の拡大はいろいろと使えそうです。特にCAD作業中に一部分を拡大してみたいときに、アプリ内でパン&ズームするよりも拡大鏡で同様のことができるならメリットがあるように思います。使ってみた結果、つかえねーということも考えられますが。

CuriosityでmTouchを試してみる。その5 PIC16F18346編

PIC16F1619 で mTouch を実現できたので、次は Curiosity の MCU を PIC16F18346 に変更してやってみます。

内容はほぼCuriosityでmTouchを試してみる。その2CuriosityでmTouchを試してみる。その3をそのまま踏襲したら、すぐにできました。

ところで MCC の mTouch のタブで、Debug というのがあって、そこに "USART Module" というのが出ていました。

USART Moduleを指定してやれば、タッチセンサのデバッグ情報を受け取って、これをさらに "Data Visualizer" に食わせてやることで視覚化できるということらしいです。

おもしろそうなのでやってみましょう。

上記の Data Visualizer はもともとATMELのもののようです。左側のコラムにある "Download" リンクをクリックしてダウンロードし、インストールしてみます。ATMELはMicrochipに買収されたので、たぶんMPLAB X IDEと連携しても使える…ようになっているといいのですが。
インストールの最後にこんなのが出てきましたので一応キャプチャ。

Data Visualizer is a program used for processing and visualizing data. Data Visualizer can receive data from various sources such as the Embedded Debugger Data Gateway Interface found on XplainedPro boards, and COM ports. Data Visualizer has a graph plotter and an oscilloscope, a terminal and a configurable dashboard with buttons, sliders, and various indicators. It can decode protocols and log data to file.
ということで、ざっくり訳すと、「Data VisualizerはCOMポートを経由して受信したデータを処理して可視化します、グラフプロッタ、オシロスコープ機能、ターミナル、ボタンとスライダーといろいろなインジケータがついた設定可能なダッシュボードがあります。プロトコルをデコードできるし、ログファイルに出力することもできます」という感じです。

なので、上で作成したプロジェクトにUSARTを組み込んでみましょう。

CDBにはプログラマ/デバッガとしてPIC24が載っていますが、どうやらUSB-UARTのエンドポイントは持っていないようです。つまり、PCでデバッグデータを受け取るためには別途COMポートを用意しないといけません。

一番手間がなさそうなのが、Curiosityの右半分にあるmikroBUSを使うことです。ここに、USB UART CLICKを搭載すればPCと通信できるようになります。USB UART CLICKはFTDI社のFT232RLを搭載していますが、これは自分のなかではUSB-UARTコンバータの中で一番信用できるものですから、安心して使えます。ところがこのUSB UART CLICK、日本では全然売っていません。Digikeyなどの通販で扱っていますが、1800円前後します。これはちょっとシャレにならないので、別の方法を考えます。実のところ、Explorer8ボードを使えば、ボード上にUSB-UART変換ICが実装されているのでなにもすることがないのですが、Explorer8ボードにはmTouchボタンがありません。けっこう痛し痒しです。

実は以前に、TERASIC ALTERA DE0ボードでのデバッグ用にFTDI謹製のTTL-232R-3V3というUSB-UARTケーブルを購入しているのですが、これなら使えるかもしれません。ちょっと変則的になりますが、このケーブルはUART側がシングルインラインのソケットになっていて、ソケットのハウジングのロックを持ち上げてやると端子をソケットから抜くことができます。それを利用してピンの順番を変えることができるのです。

ということで回路図を参照します。User's Guideから該当部分を切り出します。ケーブルが3.3V仕様なので、+3.3V電源がきているJ33のスルーホールを使用することにします。

そしてPIC側でEUSARTのIOピンを指定することでケーブルのピンと対応させます。以下の通りです。

No. TTL
Original
Layout
TTL
for
Curiosity
J33 PIN #
and
PIC PORT
PIC Func.
Assign
1 GND GND 8 GND
2 CTS# VCC 7 +3.3V
3 VCC TXD 6 (RC7) RX
4 TXD RXD 5 (RB4) TX
5 RXD CTS# 4 (RB6)
6 RTS# RTS# 3 (RC6)

実際には EUSART モジュールはフロー制御まではやらないようなので、TXDとRXDのみで十分です。が、TXD/RXDは対向する同士でねじれの関係になるので注意が必要です。これ、よくよく考えて回路図を書いてもけっこう間違います。mikroBUSの規格書がmikroeのページではリンク切れになっていますが、こちらから直接ダウンロードできるようなので参照しておきます。
6ページにソケット側のピン配置が出ていますが、ここでTXはソケットからアドオンボードへの出力(つまりCDBではPICからの出力)、RXはその逆というふうに定義されています。

次にJ33にシングルの8ピンのピンヘッダをはんだ付けするのですが、手元になかったのでこの際だからいくつか買っておきましょう。

次回に続きます。

PaSoRiでe-Tax。

確定申告をe-Taxで終えたので、やったことのメモ。

  1. まずPaSoRiを用意します。
  2. PaSoRiをPCに繋がない状態で、SONYのサイトから、NFCポートソフトウェアをダウンロードしてインストールします。
  3. PaSoRiをPCに繋ぎます。
  4. 公的個人認証サービスポータルサイトの利用者クライアントソフトをダウンロードしてインストールします。
  5. e-Taxのページから国税庁確定申告書等作成コーナーに飛びます。
  6. 「作成開始」→「e-Taxで提出する」→「マイナンバーカード方式により提出する」と進みます。

あとは画面に従って進んでいきますが、はじめてe-Taxで申告する場合には途中で利用者識別番号(16桁の数字)を申請するようになります。これはその場で取得できますが、今後も必要になるものなので忘れないようにしておきます。また6桁の納税用確認番号を指定するので、これも忘れないようにしておきます。こちらの納税用確認番号は一時保存などを行った場合に必要になると思われますが、今回は取得しただけで使わなかったため詳細は不明です。

PICのタイマ機能の比較。

PICは世代ごとに実装されている機能が微妙に違ってきているので、機能をきちんと把握しないとあとで苦労することになります。
今回は自分用に、PIC16F1619とPIC16F18346のタイマ機能を比較してみました。
なお、Bloggerは組み込みのテーブルツールなどがないので、テーブルの作成は HTML Table Generator を使ってみました。

まずはLibreOffice Calcで表を作成し、これをCSVで保存します。HTML Table GeneratorにCSVファイルをインポートして、各種装飾を施し、その出力をクリップボードにコピーして貼り付けます。

まず最初にPIC16F1619。これはCuriosity Development Boardに付属してくるPICです。

PIC16F1619のタイマー構成
TIMER0 TIMER1/3/5 TIMER2/4/6
機能 8bit Timer/Counter 16bit Timer/Counter 8bit Timer/Period
タイマーレジスタ 8 bit
TMR0
16bit
TMR1H/1L
8bit
TMR2
ピリオドレジスタ なし なし 8bit
PR2
プリスケーラ 3bit
1/1 – 1/256

2bit1/1, ½, ¼, 1/8
3bit
1/1 – 1/128
ポストスケーラ - - 4bit
1/1 – 1/16
クロック 各種選択可
EXTCLKエッジ選択
T1CKI入力
Fosc
Fosc/4
LFINTOSC
4bit
12種類から選択可
ステータスフラグ
割り込み要因 オーバーフロー
TMR0IF
オーバーフロー
TMR1IF
マッチ
PR2
リセット/リスタート あり 14種類から選択可
T2RST
ゲート制御 ゲート極性選択
トグルモード
シングルパルスモード
値ゲート
ゲートイベント割り込み
その他 TMR1のゲートとして使用可 コンパレータ出力
ADCトリガー
フリーランカウンタ
ワンショット
モノステーブル
PWMとして利用可
機能としては、大きくTIMER0、TIMER1/3/5、TIMER2/4/6で分かれていることがわかります。またTIMER0は8bitタイマ/カウンタです。

一方、PIC16F18346は以下のようになります。
PIC16F18346のタイマー構成
TIMER0 TIMER1/3/5 TIMER2/4/6
機能 16bit Timer/Counter
8bit Timer/Counter/Period
16bit Timer/Counter 8bit Timer/Period
タイマーレジスタ 8 or 16( selectable)
16 (TMR0H/TMR0L)
16bit
TMR1H/1L
8bit
TMR2
ピリオドレジスタ 8bit
TMR0H
なし 8bit
PR2
プリスケーラ 4bit
1/1 – 1/32768
2bit
1/1, ½, ¼, 1/8
2bit
1/1, ¼, 1/16, 1/64
ポストスケーラ 4bit
1/1 – 1/16
- 4bit
1/1 – 1/16
クロック 3bit
7種から選択可
T1CKI
Fosc
Fosc/4
Fosc/4
割り込み要因 マッチ(8bit)
またはオーバーフロー(16bit)
オーバーフロー
マッチ
PR2
出力 ピンまたは他のペリフェラル
リセット/リスタート あり
ゲート制御 ゲート極性選択
トグルモード
シングルパルスモード
値ゲート
ゲートイベント割り込み
その他 コンパレータ出力
ADCトリガー
Capture/Compare
MSSPxのシフトクロックとして使用可
TIMER0は16bitタイマ/カウンタと8bitピリオドタイマの切り替えができるようになっています。つまり、16bitタイマ/カウンタが4つと8bitタイマが3つ、もしくは16bitタイマ/カウンタが3つと8bitタイマが4つの組み合わせから選択できることになります。

mTouchのCVD実装ではピリオドタイマとしてTMR2/4/6を選択できるようになっていましたが、PIC16F18346 を使えば TMR0 も選択肢に入れられそうです。ただし、MCCでは 2/4/6 からのみ選択できるようになっているので、その部分は自分で実装しないといけません。CuriosityでmTouchを試してみる。その4で、
他のタイマに変更できないのか、できるとすればどうすればいいのかはちょっと調べてみたいと思います。
と書きましたが、MCC上から簡単にできました。mTouchのAFAの設定でタイマを指定できるようになっています。またAFA(Automatic Frequency Adaptation)を使用しない(つまりソフトでゴリゴリ実装する)方法も選ぶことができますが、これだとタイミングを正確に取れないのでやめたほうがよさそうなのですが、もしかしてTMR0を使うならこの方法を使うしかないのかもしれません。その場合、AFAで何をやっているのかをソースを追いかけて、同様の処理をTMR0で実現すれば使えるのかも。

Bloggerでのテーブルの書き方。

Blogger は残念なことにテーブル(表)を書く機能を提供していません。

WordPress では、有名なTablePressプラグインがあって、いろいろな修飾や並べ替え、簡易データベースとして検索できるような機能を提供していて、これはなかなかすごいものがあります。

でも Blogger はテーブルを書く機能を提供していません。大切なことなので(以下略

冗談はさておき、Bloggerでテーブルを書くには、<table />、<td />、<tr />というHTMLタグを使ってゴリゴリと書いていく、という方法があるわけですが、これもめんどくさい。

こういうときには、外部のツールで表を作って、それをHTMLにエクスポートして、それをコピペすれば楽じゃん、という方向で考えてしまいます。楽できるところは苦労する必要はありません。

幸いなことに、この世には LibreOffice というすばらしいツールがあります。いわゆるオフィススイートというやつです。今回はこれを使って楽をしてしまいます。

まずLibreOfficeで表を作ります。
Write(Microsoft Wordに相当)か Calc(Microsoft Excelに相当)を起動して、好きなように表を書きます。
上はCalcで適当に書いて適当に色とかつけたものです。
ここから、表部分を範囲選択してクリップボードにコピーします。

次に Write を起動し、「新規ドキュメント」を作成します。
そこで「編集」→「形式を選択して貼り付け」→「詳細オプション」を選択します。するとダイアログが出るので、"HyperText Markup Language (HTML)" を選択して "OK" を押します。
Writer に貼り付けると以下のようになります。
そうしたら、「ファイル」→「名前を付けて保存」を選択し、デスクトップなどのわかりやすい場所に、「ファイルの種類」を "HTML ドキュメント" として保存します。確認画面が出ますから、そこは「HTMLドキュメント形式を使用」を選びます。

次に、そのファイルをテキストエディタで読み込みます。以下は秀丸で読み込んだところです。

ここから <table>~</table> で囲まれた部分を選択してコピー、Bloggerのエディタに貼り付けます。

ほんどたぬき

あらいぐま

原産国

日本

北米

分布

日本

北米、中米、日本
欧州の一部

木登り

下手

上手

あとは幅などの体裁を整えてできあがりです。

また、これとは別に Tables GeneratorHTML Table Generator を使う方法もあります。こちらのほうが好みの人もいるかも知れませんが、一応セキュリティにはご注意を。

Windowsのバージョンを確認する。

Windows 10はだいたい半期ごとに大型アップデートがあるようですが、コントロールパネルからのシステム情報では現在のバージョンを確認することができません。
ちなみにエクスプローラーのPCアイコンで右クリックして「プロパティ」を選択するとシステム情報が表示されます。またここからデバイスマネージャーも開くことができます。

Windowsのバージョンの確認方法はいくつかありますが、自分的に一番手っ取り早いのはタスクバーの "◯" アイコンをクリックして "winver.exe" を起動する方法です。
タスクバーにある "◯" は、マイク付きのPCならばここをクリックして音声で操作できます。どうやら "Cortana" というらしいですが。

"◯" をクリックすると、「ここに入力して検索」というフィールドがあるので、そこに "winver" と入れてリターン。するとWinverが起動します。

ちなみにビルドと言われているのはここのビルド番号。上のキャプチャでは "1809" で、これが Windows 10 October 2018 Update と呼ばれているものです。

他にも、この Cortana に "paint" とか "memo" とかを入力するとそれらのアプリを起動できます。インストールされているアプリはほぼ起動できるようですが、インストーラでインストールしていないものはパスを通しておく必要があります。
また、Cortana は Winキー+S でも起動できるので、アプリの起動がマウスを使わなくてもできますから、キーボードで作業中になにか他のアプリを起動したい場合にも便利です。

Windows10での不明なACPIデバイス。

メインのPCでは出ていないんだけれど、サブのPCで出ていました。
これは特に実害はないんですが、内容は「Windows10ではサポートしていないIntel Smart Connect Technologyのドライバがない」というものです。
インテル・スマート・コネクト・テクノロジーは、スリープモードまたはスタンバイモードにある PC を定期的に短時間復帰させ、プログラムを更新するように設計されています。この機能は、Outlook* や Windows* Live Mail など自動的にインターネットからデータを取得するアプリケーションで役立ちます。
というような仕組みだったわけですが、こんなことしなくても普通にスケジューラで指定できますし、よくよく考えれば「誰もPCを使わない夜中にメールを取得しても意味がない」ということがわかるはず。つまり、翌朝取得すればいいわけです。

この機能がBIOS設定で有効にされているとWindows側で「不明なデバイス」として表示されるので、BIOSの設定で無効にすれば消えます。

メインPCでは設定していたと思うけれど、サブPCはヘッドレス運用しているのでBIOS画面を出すにはディスプレイを接続しなくてはならず、面倒なのでやっていなかったようです。

mTouch CVD方式以外のやり方。

Microchip のサイトでは mTouch の実現方法として、AD変換器を使った CVD 方式以外にも、CSM(Capacitive Sensing Module)を使った方法CTMU (Charge Time Measurement Unit)を使った充電時間での電圧を用いる方法が解説されています。

CSMを使った方法

CSM(容量検知モジュール)は、実際にはコンパレータとSRラッチによって構成されます。
上の図は上記のAN1101-容量検知ソリューションの紹介のPDFから抜粋したものです。
内部基準電圧とC2OUTから出力されたデジタル信号比較する \(\overline{C1}\) と、3kΩと1kΩで分圧した基準電圧(1/4 VDD)と、C2OUTを比較する \(C2\) をSRラッチに入力し、その \(\overline{Q}\) 出力をTMR1のクロックにします。
TMR0 で一定周期を作り出し、その間にカウントされたTMR1値から周波数をカウントします。
ここで、CSの部分に指などが触れると容量が変化し、RC回路の時定数が変化することによってC2OUTの周波数が変わります。Rが120kΩに対してCSは数十pF程度にすることで、指で触ったときの容量変化を相対的に大きくすることができ、検出のしきい値を決めやすくなります。

この例ではIOピンとして3ないし4ピンを消費していますが、もう少し簡略化して2ピンで実現することも可能です。

CTMUを使った方法

CTMU(充電時間計測ユニット)は、電流値を設定可能な定電流源とそれを制御するためのロジック部分からなるユニットです。
上の図はセクション 37. 充電時間計測ユニット (CTMU)から抜粋しています。
CMTUCONを外部トリガで制御して、定電流源から電流を供給します。これはCSMでのRC回路のRと同等とみなすことができます。
その電流によって内部のAD変換器の入力容量CAD、回路とタッチパッドの寄生容量CCIRおよびCSWに充電され、それをAD変換器で読み取って検出します。
定電流源の供給開始からAD変換までの時間を一定にすることで、外部のタッチパッド部分での容量変化を検出することができる、というものです。

これは回路中に寄生容量以外のキャパシタがないため、外部容量の変化には結構敏感です。なので、タッチセンス以外にも近接センサ、壁の中の柱センサ、液位センサなどのアプリケーションの例がCTMU の多彩な機能には触れられています。

他に方法は?

もちろん他にもあります。
CSMを使った方法の簡易的なもので、CSMからコンパレータとラッチを省きます。そのかわりに最近のPICには多くなってきているCLC(Configurable Logic Cell)を使います。また、IOピンの入力をシュミットトリガにして、エッジ割り込みを設定します。
外部にはRC回路を置いて、そこにタッチパッドを接続します。CLCには上記IOピンから入力した信号をインバータ(あるいはNANDゲート)のみを使用してIOピンに出力し、その出力でRC回路をドライブします。こうしてRC回路をインバータで駆動する発振回路を構成し、その周波数をタイマで計測してやる方法です。概略としては以下の図のような感じです。

上記3つの方法はいずれも「容量変化による周波数の変化」を検出して判定する方法ですが、いずれも少しずつ異なります。またPICについてもCMTUやCSM、CVDの機能のあるなしで、ソフトウェア側の負担が変わってきますし検出以外のロジックに利用できるCPUクロックも変わってきます。

PICデバイスの選定はこうした機能の有無、必要なペリフェラル回路、処理速度、ピン数などの複合要件で行いますが、そのためには何をやりたいのか、どうやって実現したいのかをある程度明確にしておかないと、あとになって「これじゃできないじゃん!」ということになるので最初が肝心です。

CuriosityでmTouchを試してみる。その4

その3までやったところで走らせてみたところ、うんともすんとも言いません。

よろしい、ならばデバッグだ。

ということでオシロスコープを引っ張り出します。

CDBにはGNDピンが立っていないので、以前に展示会でマック8のブースでもらったサンプルのピンをGNDのスルーホールに立てて、そこにプローブのGNDクリップをつなぎます。

まず、MCCでCLKOUTの設定をしてみます。"Pin Module" で Port A の RA4 をロックして、CLKOUT をピン3に出力させます。このとき忘れてはいけないのが、"Generate" ボタンを押すこと。これを押さないと、変更がソースに反映されません。
逆に言えば、MCCが生成するソースはいじってはいけません。"Generate" を押すたびに上書きされるので、ソースをいじった部分もその瞬間になくなります。
なので、MCCではMCUやピンの設定、イベントの設定以外は(Configuratorというだけあって)いじらないようにしているようですし、ロジック部分はそれ以外のソースで実装していくのが筋でしょう。

ということでまずはCLKOUT出力です。

周波数はFOSCで設定した8MHz、ちゃんと動いています。電源電圧のセレクタ J12 が +3V3 側なので、3.3Vレギュレータを通して電源が供給されていることもわかります。

次に Port C の RC1 です。ここはAD入力であると同時にドライブもされているので、本来ならば動いているはず…なのですが、レベルは0Vに張りついていました。

もしかして TMR6 が動いていないか、TMR6 の割り込みが処理されていないかどちらかかもしれない、と思いながらふとソースを見てみると、
      // Enable the Global Interrupts
-     //INTERRUPT_GlobalInterruptEnable();
+     INTERRUPT_GlobalInterruptEnable();
  
      // Enable the Peripheral Interrupts
-     //INTERRUPT_PeripheralInterruptEnable();
+     INTERRUPT_PeripheralInterruptEnable();
この部分がコメントアウトしたままになっていて、早い話が割り込み禁止状態になっていました。

コメントアウトを外してビルドしてみると、ドライブ波形が出てきました。

mTouchボタンを触ってみると、LEDが点いたり消えたりします。が、触ると消えて離すと点くので、どうやら信号の極性が間違っているようです。回路図を見ると、確かにLEDの電源はIOポートで引き込むのではなく、IOポートから給電する形になっていました。なので、以下のように main.c を修正します。
  void processButtonTouch(enum mtouch_button_names button)
  {
      switch(button)
      {
-         case Button0: LED_SetLow();break;
+         case Button0: LED_SetHigh();break;
          default: break;
      }
  }
  
  void processButtonRelease(enum mtouch_button_names button)
  {
      switch(button)
      {
-         case Button0: LED_SetHigh();break;
+         case Button0: LED_SetLow();break;
          default: break;
      }
  }

ちなみにタッチしている間の波形は以下のように変化しています。

上の波形との違いはプリチャージ後の波形の戻り方で、この差を検出しているようです。

ところでMCCを使ったmTouchの実装では、上記のようにTMR6を使っています。このタイマを他のタイマに変更できないのか、できるとすればどうすればいいのかはちょっと調べてみたいと思います。

BloggerでSyntaxHighlighterを使う。

CにしてもPythonにしてもなんにしても、Bloggerでソースコードを貼り付けるのは<pre />タグを使っても面倒だったりします。

以前にWordPressでやっていたときには、Crayon Syntax Highlighterを使っていました。最近はCDN(Content Delivery Network)という仕組みを使って、サーバにインストールしなくてもCDNへのリンクでスタイルシートや.jsファイルをロードできるので、管理がずいぶんと楽になってきています。

早速、SyntaxHighlighterを使ってソースコードをきれいにできないかとやってみました。"syntaxHighligher cdn" で検索してみると、CDNJS.COMに記述がありました。ここから必要なファイルへのリンクを拾ってきて、Bloggerのテーマファイルにコピペしてやることで使えるようになるはずです。

必要なファイルは、
  • shCore.js
  • shCore.css
  • shThemeDefault.css
  • 必要な言語のBrushファイル
です。

ファイルリストの右側にあるコピーボタンをクリックすると、"Copy Script Tag" というメニューが出るので、これでコピーしてからテーマファイルにペーストしていきます。ここでは定義は以下のようにしました。

<!-- SyntaxHighligher scripts and css -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/SyntaxHighlighter/3.0.83/scripts/shCore.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/SyntaxHighlighter/3.0.83/styles/shCore.css" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/SyntaxHighlighter/3.0.83/styles/shCoreDefault.css" />

<!-- Brush files -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/SyntaxHighlighter/3.0.83/scripts/shBrushBash.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/SyntaxHighlighter/3.0.83/scripts/shBrushCpp.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/SyntaxHighlighter/3.0.83/scripts/shBrushCss.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/SyntaxHighlighter/3.0.83/scripts/shBrushDiff.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/SyntaxHighlighter/3.0.83/scripts/shBrushPhp.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/SyntaxHighlighter/3.0.83/scripts/shBrushPlain.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/SyntaxHighlighter/3.0.83/scripts/shBrushPowerShell.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/SyntaxHighlighter/3.0.83/scripts/shBrushPython.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/SyntaxHighlighter/3.0.83/scripts/shBrushXml.js"></script>

<!-- bloggerで使用可能にする -->
<script type="text/javascript">
    SyntaxHighlighter.config.bloggerMode = true;
    SyntaxHighlighter.all()
</script>
最後の bloggerMode については、公式のConfigurationを参照。

これをBloggerのテーマの </head>タグの直前に置きます。

ソースコードを書くときは
<pre class="brush:cpp; ruler:true; first-line:5; highlight:[7-9]"> ソースコード </pre>
みたいな感じです。

CuriosityでmTouchを試してみる。その3

その2ではmTouchの設定とピンアサインをMCCを使って行いました。

その3ではLEDの処理などを追加していきます。

まずはその2で生成されたファイルを眺めてみます。

結構たくさんあるみたいです。ファイル名のあとに "[Ignored]" とあるのはソースコード管理のための Mercurial でのステータスでしょう。

main.c を開いてみると、実際のコード部分はとてもシンプルです。
#include "mcc_generated_files/mcc.h"
/*
                         Main application
 */
void main(void)
{
    // initialize the device
    SYSTEM_Initialize();

    // When using interrupts, you need to set the Global and Peripheral Interrupt Enable bits
    // Use the following macros to:

    // Enable the Global Interrupts
    //INTERRUPT_GlobalInterruptEnable();

    // Enable the Peripheral Interrupts
    //INTERRUPT_PeripheralInterruptEnable();

    // Disable the Global Interrupts
    //INTERRUPT_GlobalInterruptDisable();

    // Disable the Peripheral Interrupts
    //INTERRUPT_PeripheralInterruptDisable();

    while (1)
    {
        // Add your application code
    }
}

まず、main()の while(1)の中にMOUTCH_Service_Mainloop();を追加します。
while (1)
      {
          // Add your application code
+        MOUTCH_Service_Mainloop();
      }

次に、main()の外にコールバック関数を書きます。
#include "mcc_generated_files/mcc.h"
  
+ void processButtonTouch(enum mtouch_button_names button)
+ {
+     switch(button)
+     {
+         case Button0: LED_SetLow();break;
+         default: break;
+     }
+ }
+  
+ void processButtonRelease(enum mtouch_button_names button)
+ {
+     switch(button)
+     {
+         case Button0: LED_SetHigh();break;
+         default: break;
+     }
+ }
ここで、"Button0" はもしもボタンの名称を変えていたらそれに合わせます。"LED" も同様です。LED_SetLow() / LED_SetHigh() などはMCCによって生成されていますので、そのまま使えます。

最後に、while(1)ループの前にコールバック関数へのフックを書きます。また、globalインタラプトとperipheralインタラプトを有効にします。
/*
                           Main application
   */
  void main(void)
  {
      // initialize the device
      SYSTEM_Initialize();
  
      // When using interrupts, you need to set the Global and Peripheral Interrupt Enable bits
      // Use the following macros to:
  
      // Enable the Global Interrupts
-     // INTERRUPT_GlobalInterruptEnable();
+     INTERRUPT_GlobalInterruptEnable();
  
      // Enable the Peripheral Interrupts
-     //INTERRUPT_PeripheralInterruptEnable();
+     INTERRUPT_PeripheralInterruptEnable();
  
      // Disable the Global Interrupts
      //INTERRUPT_GlobalInterruptDisable();
  
      // Disable the Peripheral Interrupts
      //INTERRUPT_PeripheralInterruptDisable();
  
+     MTOUCH_Button_SetPressedCallback(processButtonTouch);
+     MTOUCH_Button_SetNotPressedCallback(processButtonRelease);
  
      while (1)
      {
          // Add your application code
          MTOUCH_Service_Mainloop();
      }
  }
ソースの変更はここまでです。
早速ビルドしてみます。F11キーまたは "Production"→"Build Main Project" を実行します。エラーがなければ書き込みボタンを押します。最初にボード上のPIC24にファームウェアをダウンロードしたあとでPIC16F1619への書き込みが始まります。

その4へ続く

CuriosityでmTouchを試してみる。その2

その1ではプロジェクトを作成してパッケージの指定までを行いました。

次にやることはシステムクロックの設定、ピンアサインなどです。

まずシステムクロックを32MHzに設定します。
"System Clock Select" を "FOSC" に、"Internal Clock" を "8MHz_HF" に、"PLL Enabled" にチェックをします。
これでPLLを使用して4倍にします。

次に、"Device Resources" から "ADC" を追加します。"Peripherals" の "ADC [PIC10 /..." をダブルクリックして "Project Resources" に追加できます。
同様に下の "Libraries" にある "mTouch" ライブラリを追加します。

さて、ここからちょっと変わります。CVD(Capacitive Voltage Divider)によるmTouchをMCCで実現するということで、mTouch® Capacitive Sensing Library Module for MPLAB® X Code Configuratorを参照していきます。

まず、IDEの下の方にある "Notifications [MCC]" を見ると、警告が一つあります。ADCのサンプリングタイムが短すぎる、という警告が出ていますので、これをなくします。

左側のコラムにある "Project Resources" からADCを選択し(あるいは真ん中のパネルのADCタブを選択し)、"ADC Clock" を "FOSC/32" に設定します。
すると警告がすぐに消えます。

次に、真ん中のパネルの "mTouch" タブを選択します。その左のコラムから、"Hardware Sensors" を選択すると、"To create hardware sensors, assign CS pins in the Pin Manager Grid View" とあります。Curiosity の User's Guide にある回路図で、mTouch Button が RC1 に割り当てられているので、Pin Manager の mTouch の CS に、PortC の 1 を割り当てます。

すると Hardware Sensors のところに "Sensor_AN5:RC1/AN5" が追加されます。ここではキャプチャのために "mTouch" のタブを外に移動しています。
まず "Hardware Sensors" を選択し、"Scan Rate Control" が "Free Running Mode" であることを確認します。 もうひとつの選択しである "TIMER1_Scheduling" は、TIMER1を使ってハードウェアで起動するモードですが、ここではメインループ内で回す方向で考えます。実際にはメインループの中で、MTOUCH_Service_Mainloop( ) を呼び出す処理を入れます。
次に "Sensor_AN5:RC1/AN5" を選択すると、右側に "Sensor Settings" があらわれますが、まずはここはデフォルトのままにしておきます。
この部分の数値などは、センサのサイズや寄生容量などの条件によって調整する、ということですので、実アプリケーションではいじることもあるかもしれません。

次に "Buttons" の定義です。左のコラムから "Buttons" を選択し、現れた "Create New Button" をクリックします。
CDBではボタンの数は1つなので "Number of Button" は "1"、また "Interface Method" はコールバック("Callback function notifies application")とポーリング("Application will poll button status")の2種類から選べますが、今回はコールバックを選択して "Add" ボタンをクリックします。

追加された "Button0:No sensor selected" を選択して、 "Sensor" を "Sensor_AN5" に割り当てます。

次は割り込みの設定です。左のコラムで "Interrupt Module" を選択すると(あるいは真ん中のパネルの "Interrupt Module" を選択すると)、TMR6が有効化されているのがわかります。
ソフトウェアCVDではタイマで動作を行うために、専用にタイマが必要なようです。これがハードウェアCVDでは自動でやってくれるようです。PIC16F1619はCVDを持っていないため、ソフトウェアで実現する必要があるので、TMR6を割り当てます。

CVDの動作は、プリチャージ(+)→取り込み→AD変換→プリチャージ(-)→取り込み→AD変換の繰り返しで、それぞれのタイミングをライブラリ側で制御するので、TMR6の細かい設定をする必要はないということのようです。

mTouch関連の設定はこれで終わっているのですが、タッチを判定した結果を確認する方法がありません。なのでこの部分はLEDを光らせることにします。タッチで点灯、リリースで消灯でいいでしょう。
CDBの回路図を参照すると、RC5 が D7 の LED に接続されていますので、これを使います。D7はポテンショメータ横のLEDのならびの一番左側にあります。
"Pin Manager" で "RC5" の "Output" をロックします。

また、あとでわかりやすいように、"Pin Module" で "RC5" の "Custom Name" を "LED" に設定しておきます。

"Notifications [MCC]" のタブで警告などがないことを確認します。

問題なければ、左のコラムの上の方にある "Generate" ボタンをクリックします。

すると "Output - MPLAB Code Configurator" のタブにずらずらっとメッセージが表示されて、必要なソースファイルが生成されます。

その3へ続く

CuriosityでmTouchを試してみる。その1

早速ですが、Curiosity Development BoardでmTouchをやってみようと思います。

環境は以下のとおりです。
  • Windows 10 Pro 64bit
  • MPLAB X IDE v5.10
  • Microchip XC8 compiler 2.05
  • Microchip PIC16F1619
  • Microchip Code Configurator 3.75
  • mTouch® Capacitive SensingLibrary 2.60.1
PICはCDBに最初からついているPIC16F1619をそのまま使ってみます。電源はUSBからの5V給電、動作が確認できたら乾電池でも試してみようかと思います。

参考ドキュメントとしてDS40001852Aがにあるので、その説明に従いながらやってみます。また、CDBのページからUser's Guideをダウンロードして、必要に応じて回路図を参照します。
そのものズバリのCuriosityを使ったステップバイステップはこちらにあります。

MPLAB X IDEを起動して、まずはプロジェクトを作成します。プロジェクト名はCuriTouchとでもしておきます。

まず "Microchip Embedded" → "Standalone Project" を選択してNext。

"Device" に "PIC16F1619" を入力してNext。

次の "Select Header" は "None" のままNext。

次の "Select Tool" は "Curiosity" を選択してNext。

次の "Select Compiler" では "XC8(v2.05)" を選択。

次の "Select Project Name and Folder" は "Project Name" を "CuriTouch"、"Encoding" を "UTF-8" にしてFinishです。

プロジェクトを作成したら、そのままツールバーの "MCC" ボタン、もしくはメニューから "Tools"→"Embedded"→"MPLAB Code Configurator"を起動します。するとファイル保存のダイアログが出るので、そのまま "MyConfig.mc3" で保存しておきます。

MCCの画面が出たら、パッケージがQFN20のものなので、これをPDIP20に変更します。

すると右上のパッケージの図がPDIPに変わります。
ここまでで一旦保存します。

その2へ続く

Windowsでシンボリックリンクを試してみる。

きっかけは、1つのファイルを別の名前で起動したら違う動きになるようなスクリプトを書く、でした。  busybox なんかでは、同じ実行形式ファイルの名前を、lsにすればlsと同じ、cpとすればcpと同じ動作をするようにしてますが、Pythonスクリプトでそれと同じように argv...