デジトラのピン番号

ロームのデジトラ、見た目のピン配置は同じなのにパッケージによってピン番号の振り方が違うの、落とし穴すぎる。CADでライブラリを作成するときに要注意。

どうも、ペタ足のパッケージは左側が1番ピンで、ニョロ足のパッケージは右側が1番ピンの法則があるような気がする。どちらにしろ、左側がINで右側がGNDなのだけど。

f:id:licheng:20191008225556p:plain

ペタ足のパッケージ

ローム名称 一般名称 横幅[mm]
VMT3 SC-105AA 1.2
EMT3F SC-89 1.6
UMT3F SC-85 2.0

ニョロ足のパッケージ

ローム名称 一般名称 横幅[mm]
EMT3 SC-75A, SOT-416 1.6
UMT3 SC-70, SOT-323 2.0
SMT3 SC-59, SOT-346 2.9

特に、EMT3FとEMT3、UMT3FとUMT3は、フットプリントが同じような寸法でピン番号の振り方が異なるので紛らわしい。

EclipseでMbedでnRF52なローカル開発環境

(1) やりたいこと

※1 オンラインコンパイラはいざというときにサーバが落ちてるということが多々あったし、BLEのライブラリとかころころ仕様が変わって過去のソースのビルドが通らなくなるし、そのうち昔のMbed OS 2とかビルドできなくなるかもしれないおそれがあるし、いろいろ不安。

※2 Mbed StudioはMbed OS 5のみサポートし、Mbed OS 2はサポートしてないしする予定もないらしい。あと、クールすぎてオッサンにはとっつきにくい。

(2) 方針

GNU MCU Eclipseをインストールし、オンラインコンパイラから「GNU ARM Eclipse」向けにエクスポートしたプロジェクトをインポートするという方法を取ることにする。
gnu-mcu-eclipse.github.io

(3) GNU MCU Eclipseのインストール

少々面倒くさいが以下の手順でインストールする。

(3.1) Node.jsのインストール

nodejs.org

(3.2) xpm(xPack package manager)のインストール
npm install --global xpm
(3.3) xpmでいろいろインストール
xpm install --global @gnu-mcu-eclipse/arm-none-eabi-gcc
xpm install --global @gnu-mcu-eclipse/windows-build-tools
xpm install --global @gnu-mcu-eclipse/openocd
xpm install --global @gnu-mcu-eclipse/qemu
(3.4) Eclipse + CDT + GNU MCU Eclipseプラグインのインストール

自分で構築するのは面倒なので、CDTとGNU MCU Eclipseプラグインが入った状態のEclipseを下記からダウンロードし、適当な場所に展開して使用する。
github.com

Windowsで32ビット版のJavaがインストールされている場合「Java was started but returned with exit code=13」というエラーが発生する。その場合は64ビット版のJavaをインストールする。
www.java.com

(4) オンラインコンパイラからプロジェクトをインポート

Mbedのオンラインコンパイラでプロジェクトを選択して、右クリックメニューから「プログラムのエクスポート」を選択する。するとターゲットとツールチェインを選択するダイアログが出るので、ツールチェインの選択肢から「GNU ARM Eclipse」を選択して、zipファイルをダウンロードする。

Eclipseの [File] > [Import] > [General] > [Existing projects into Workspace] でzipファイルを選択し、インポートする。

(5) デバッガの設定

[Run] > [Debug Configurations] で [DGB SEGGER J-Link Debugging] を選択し、[Debugger]タブの [Device Name] に「nRF52832_xxAA」などと入力する。デバイス名については下記ページを参照。

いまさらOPアンプの入出力特性

いまどきのRail-to-Rail(フルスイング)なOPアンプならあまり気にしないことですが、昔のOPアンプを5Vや3.3Vの単電源で使うとわりと思った通りになりません。このあたり、アナログ回路やってる人には当たり前の話でしょうが、僕はいままで実測して確かめたことがありませんでした。

そこでいまさらですが手持ちのOPアンプの入出力特性を測定してみました。OPアンプでボルテージフォロワ回路を組み、出力は無負荷とし、5Vおよび3.3Vの単電源で入力電圧に対する出力電圧を測定しました。

LM6142 (Rail-to-Rail OPアンプ)

f:id:licheng:20190923194942p:plain

じつに理想的な特性です。5V単電源の場合、0V~5Vの全範囲でリニアに見えます。

手持ちのOPアンプでは他にLMC6482も類似の特性を示しました。

RC4558 (両電源OPアンプ)

f:id:licheng:20190923195000p:plain

昔から定番の両電源OPアンプ「4558」です。今回はTI製のRC4558を使いました。

奇妙な特性ですね。5V単電源の場合、リニアな特性が得られるのはせいぜい1.5V~4.4Vの範囲です。両電源OPアンプはV-付近およびV+付近で出力が飽和します。さらに4558の場合、0.7Vあたりを境にとつぜん出力が反転します。この現象については下記の記事が参考になりました。

誤解の無いように言っておきますが、べつに4558をディスってるわけではありません。使い道を間違えてはいけないというだけのことです。

手持ちのOPアンプでは他にLF412CNも類似の特性を示しました。

LM358N (単電源OPアンプ)

f:id:licheng:20190923195016p:plain

昔から定番の単電源OPアンプ「358」です。今回はSTマイクロ製のLM358Nを使いました。

5V単電源の場合、リニアな特性が得られるのはおよそ0V~3.9Vの範囲です。Rail-to-Railでない単電源OPアンプはV-付近では飽和せずリニアな特性が得られますが、V+付近では飽和します。

手持ちのOPアンプでは他にNJM2902も類似の特性を示しました。

結論

マイコン回路への/からのアナログ信号には、Rail-to-RailなOPアンプを使うのが無難でしょう。

LPC1114のA/Dコンバータ

LPC1114のA/Dコンバータでちょっとつまづいたのでメモ。
LPC1114のA/Dコンバータには以下の2つのモードがある。

(1) ソフトウェア制御モード

A/D制御レジスタ(AD0CR)のBURST=0とするとこのモードとなる。
AD0CRのSELでチャンネルを選択し、AD0CRのSTART=001で変換を開始する。

注意すべきは、AD0CRのSELで選べるチャンネルは一つだけであり、二つ以上のビットをセットしてもいちばん若いビットのチャンネルのみがA/D変換される。

/***** LPCOpenでのコード例(抜粋) *****/

// ソフトウェア制御モードに設定
Chip_ADC_SetBurstCmd(LPC_ADC, DISABLE);

// チャンネル選択
Chip_ADC_EnableChannel(LPC_ADC, ADC_CH0, ENABLE);
// 変換開始
Chip_ADC_SetStartMode(LPC_ADC, ADC_START_NOW, ADC_TRIGGERMODE_RISING);
// 変換完了待ち
while (Chip_ADC_ReadStatus(LPC_ADC, ADC_CH0, ADC_DR_DONE_STAT) != SET) {}
// 変換値取得
uint16_t data;
Chip_ADC_ReadValue(LPC_ADC, ADC_CH0, &data);
(2) ハードウェアスキャンモード

A/D制御レジスタ(AD0CR)のBURST=1とするとこのモードとなる。
ソフトウェア制御モードと異なり、AD0CRのSELで複数のチャンネルを選択できる。
以降はハードウェアが選択されたチャンネルを順次A/D変換し続けてくれる。

注意すべきは、AD0CRのSTARTは必ず000に設定しなければならない。このことは『LPC111x/LPC11C1x User manual』のAD0CRの項に明記されているが、日本語版は訳がおかしい。英語読めという話である。

/***** LPCOpenでのコード例(抜粋) *****/

// チャンネル選択
Chip_ADC_EnableChannel(LPC_ADC, ADC_CH0, ENABLE);
Chip_ADC_EnableChannel(LPC_ADC, ADC_CH1, ENABLE);
Chip_ADC_EnableChannel(LPC_ADC, ADC_CH2, ENABLE);

// ハードウェアスキャンモードに設定
Chip_ADC_SetBurstCmd(LPC_ADC, ENABLE);
// ハードウェアスキャンモードのときはSTART=000にする
Chip_ADC_SetStartMode(LPC_ADC, ADC_NO_START, ADC_TRIGGERMODE_RISING);
	
// 変換値取得
uint16_t data[3];
Chip_ADC_ReadValue(LPC_ADC, ADC_CH0, &data[0]);
Chip_ADC_ReadValue(LPC_ADC, ADC_CH1, &data[1]);
Chip_ADC_ReadValue(LPC_ADC, ADC_CH2, &data[2]);


以上のことは、すべて『LPC111x/LPC11C1x User manual』に書かれている。ググる前にちゃんとマニュアル読めという話である。

SELで複数チャンネルを選択しておいてSTART=001としたタイミングで連続変換できるようなモードがあったら便利なのだけどそんなものはないようだ。

Visual Studio CodeでArduino

Arduino IDEはなにかと不便なのでVisual Studio Code (VSCode) を使ってArduinoの開発をするメモ。

VSCodeArduino IDEをインストール

当然ながら、まずVSCodeをインストールしておくこと。また、VSCodeArduinoの開発をするといっても、内部ではArduino IDEのツールチェインを利用するので、Arduino IDEはインストールしておくこと。これらについては説明を省く。

VSCodeArduino拡張機能をインストール

Extensions(拡張機能) にて「Arduino」で検索し、MicrosoftArduino (vsciot-vscode.vscode-arduino) をインストールする。

f:id:licheng:20190820182218p:plain

コマンドの実行方法

F1 または Ctrl+Shift+P でコマンドパレットを開き、「Arduino」と入力するとコマンドが一覧表示されるので、そこから選択する。

f:id:licheng:20190820184247p:plain

サンプルスケッチを開く

コマンドパレットで「Arduino: Examples」を選択するとサンプルスケッチを選択するタブが開く。どれか一つを選択すると、Arduino/generated_examplesフォルダにそのサンプルスケッチがコピーされ(←ここポイント!)、新しいウィンドウのVSCodeで開かれる。

f:id:licheng:20190823171716p:plain

スケッチを新規作成 / スケッチを開く

スケッチを新規作成または既存のスケッチを開くには、メニューの File > Open Folder でスケッチのフォルダを開く。ファイルを新規作成するにはメニューの FIle > New File または Explolerビューの New Fileボタンをクリック。

f:id:licheng:20190824121516p:plain

ボード選択

コマンドパレットで「Arduino: Board Config」を選択するとボード選択のタブが開く。ここでボードを選択すると、スケッチのフォルダの下の .vscode/arduino.json ファイルに設定が保存される。(←ここポイント!) Arduino IDEとちがってスケッチごとに設定が保存されるのが便利である。

f:id:licheng:20190823174551p:plain

ボードによってはより詳細な選択が必要なものもあるが、この画面で設定できる。

f:id:licheng:20190824122237p:plain

シリアルポート選択

コマンドパレットで「Arduino: Select Serial Port」を選択するとシリアルポート選択のタブが開く。ボード選択と同様に、ここでの設定は .vscode/arduino.json ファイルに保存される。

f:id:licheng:20190825001112p:plain

ビルド出力先の設定

ビルド結果の出力先のパスを設定する。これを設定しないと毎回フルビルドすることになり時間がかかる。スケッチのフォルダにある .vscode/arduino.json ファイルを開き、
"output": "../build" などと追記する。カンマに注意すること。するとビルド時にはスケッチのフォルダの下のbuildフォルダに出力され、以後は差分ビルドとなる。

ただし、スケッチのフォルダ自身やそのサブフォルダは指定しないこと。その場合、正しく機能しないおそれがある。(←ここポイント) やや不便であるが、公式のREADMEに書かれている仕様である。

{
    "sketch": "Blink.ino",
    "port": "COM7",
    "board": "arduino:avr:pro",
    "configuration": "cpu=8MHzatmega328",
    "output": "../build"
}

検証 / 書き込む

コマンドパレットで「Arduino: Verify」を選択すると、スケッチが検証(ビルド)される。この操作にはショートカットキー Ctrl+Alt+R が割り当てられている。ビルド結果のメッセージは下段にビューが開いて表示される。

また、コマンドパレットで「Arduino: Upload」を選択すると、スケッチがビルドされArduinoボードにアップロード(書き込み)される。この操作にはショートカットキー Crtl+Alt+U が割り当てられている。

f:id:licheng:20190825001736p:plain:w700

シリアルモニタ

コマンドパレットで「Arduino: Change Board Rate」を選択すると、シリアルポートのボーレートを設定できる。

f:id:licheng:20190824132042p:plain

そして、コマンドパレットで「Arduino: Open Serial Monitor」を選択すると、シリアルモニタが下段に表示される。

f:id:licheng:20190825003125p:plain:w700

SW4STM32のデバッガ設定の注意点 (リセットモード)

System Workbench for STM32 (SW4STM32) でハマったのでメモ。

ST-Linkをマイコンボードに接続してデバッグしようと思ったら、下記のようなエラーが発生した。

Error: timed out while waiting for target halted 

どうも SWCLK と SWDIO だけを接続して RESET を接続してなかったのが原因のようだ。この場合、Debug Configuration の Debugger の設定で「Reset Mode」が「Connect under reset」になっていると上記のエラーが発生する。RESETが接続されてない場合は「Software system reset」を選択しなければならない。

f:id:licheng:20190820212255p:plain:w600

参考ページ

github.com