半田ごてを握ったら書くブログ 2nd

半田ごてを握ったら書くブログの続きです。

AnalogDevices SigmaDSPのデータシートを勝手に日本語化

ADAU1401AはAnalogDevicesのSigmaDSPシリーズのチップです。

で、昨年(2017年)の前半に仕事でADAU1401Aを実験的に使った時、データシートを読む時に自分に必要な分だけ自力で翻訳したので、これを公開します。
AnalogDevice社はいくつものDSPチップを発売してますが、SigmaDSPに関しては日本語での情報がほとんどなく、安価で扱いやすい興味深いチップなのにもったいないと個人的には歯がゆかったので、微力にでもなればと思い稚拙な日本語ですが公開します。
ちなみに写真のような実験をしてました。

f:id:ohneta:20170509195214j:plain
f:id:ohneta:20170524032005j:plain

f:id:ohneta:20170524025407j:plain

また、ADAU1401AはSigmaDSPでは最もメジャーなADAU1701の車載向け用のチップなので機能的には変更/追加はないのでADAU1701の日本語データシートとしても読めるとおもます。


なお、これは私が個人的におこなったものですのでAnalogDevices社とはまったく関係ありません。
この勝手な日本語版を公開に先立ってAnalogDevices社への許認可も行っておりませんので、権利関係で消える場合があるかもしれませんのであしからず。
訂正等ご指摘があればこちらのブログコメントでいただければ反映したいと思います。

下記のURLで公開しています。
https://www.dropbox.com/s/i4uink0gpta06b9/ADAU1401A_J.pdf?dl=0

 

ADAU1401Aのデータシートを勝手に日本語化

ADAU1401AはAnalogDevicesのSigmaDSPシリーズのチップです。

で、今年の前半に仕事でADAU1401Aを実験的に使った時、データシートを読む時に自分に必要な分だけ自力で翻訳したので、これを公開します。
AnalogDevice社はいくつDSPチップを発売してますが、SigmaDSPに関しては日本語での情報がほとんどなく、安価で扱いやすい興味深いチップなのにもったいないと個人的には歯がゆかったので、微力にでもなればと思い稚拙な日本語ですが公開します。
ちなみに写真のような実験をしてました。

また、ADAU1401AはSigmaDSPでは最もメジャーなADAU1701の車載向け用のチップなので機能的には変更/追加はないのでADAU1701の日本語データシートとしても読めるとおもます。


なお、これは私が個人的におこなったものですのでAnalogDevices社とはまったく関係ありません。
この勝手な日本語版を公開に先立ってAnalogDevices社への許認可も行っておりませんので、権利関係で消える場合があるかもしれませんのであしからず。
訂正等ご指摘があればこちらのブログコメントでいただければ反映したいと思います。

下記のURLで公開しています。
https://www.dropbox.com/s/i4uink0gpta06b9/ADAU1401A_J.pdf?dl=0



それではよい新年を!!

みんな大好き気象観測

昨年の夏から連続稼動させている、ご家庭気象観測。
センサーはBME280。秋月のブレイクアウト基板のヤツ
FRDM-K64F(mbed化済み)で気温、湿度、気圧を常時計測してawsに置いてるPostgreSQLに貯めてる。

とりあえず、回路図。
書き忘れてるけどI2Cのとこは(たしか)2kΩの抵抗でプルアップ。


回路図(PDF)

貯めた気象情報はこんなふうに表示。

blackfin の Mac開発環境 (gcc 6.3.0)

自分用のメモ。

■目的
Interface誌の別冊
「音遊び!Blackfin DSP基板でディジタル信号処理の部屋」の付属基板「IFX-49」をmacで開発するためのgcc/ライブラリの類をできるだけ最新(2017-02-17時点)にするためのメモ。

なお、Blackfin-toolchainはgcc4.3か4.5のみのサポートのため、下記のようにgcc6.3.0をインストールするのはオススメできません。こんなブログを参考にする人はいないと思うのですが、これはあくまでgcc6.3.0がインストールできた!といって自己満足した方法ですのあまり本気にしないでくださいね。

■参考にしたURL
http://rohi.hatenablog.com/entry/2015/05/19/DSP%E5%9F%BA%E6%9D%BF%E7%94%A8%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92Mac%E3%81%A7%E9%96%8B%E7%99%BA%E3%81%99%E3%82%8B
http://blog.livedoor.jp/ooonzzz555/archives/cat_1244809.html

ほぼこのサイトに書いてある通り。多謝。多謝。


■インストール先ディレクト
/usr/local/bfin-elf

export PATH=$PATH:/usr/local/bfin-elf/bin


binutils
https://ftp.gnu.org/gnu/binutils/binutils-2.27.tar.bz2

      • -

tar xjf binutils-2.27.tar.bz2
cd binutils-2.27
./configure --target=bfin-elf --without-newlib --prefix=/usr/local/bfin-elf --disable-nls --disable-shared
make
make install


gcc 1回目
https://ftp.gnu.org/gnu/gcc/gcc-6.3.0/gcc-6.3.0.tar.bz2

      • -

tar xjf gcc-6.3.0.tar.bz2
cd gcc-6.3.0
mkdir build
cd build
../configure --disable-multilib --enable-languages=c --with-gmp --with-gmp-include=/usr/local/include --with-gmp-lib=/usr/local/lib --with-isllib=/usr/local/lib --with-mpfr --with-mpc --prefix=/usr/local/bfin-elf --target=bfin-elf --disable-shared --disable-threads --disable-nls --with-newlib --without-headers --with-gnu-as --with-gnu-ld
make all-gcc
make install-gcc


■newlib
ftp://sources.redhat.com/pub/newlib/newlib-2.5.0.tar.gz
最新はnewlib-2.5.0だけど、ビルドに失敗するのでとりあえず2.2.0-1でやってみる。

ftp://sourceware.org/pub/newlib/newlib-2.2.0-1.tar.gz

      • -

tar zxvf newlib-2.2.0-1.tar.gz
mkdir build-newlib
cd build-newlib
../newlib-2.2.0-1/configure --target=bfin-elf --prefix=/usr/local/bfin-elf
make all
make install


gcc 2回目
cd gcc-6.3.0/build
../configure --disable-multilib --enable-languages=c --with-gmp --with-gmp-include=/usr/local/include --with-gmp-lib=/usr/local/lib --with-isllib=/usr/local/lib --with-mpfr --with-mpc --prefix=/usr/local/bfin-elf --target=bfin-elf --disable-shared --disable-threads --disable-nls --with-newlib --with-gnu-as --with-gnu-ld --disable-libssp
make all
make install


gdb
http://ftp.gnu.org/gnu/gdb/gdb-7.12.1.tar.gz

      • -

tar xjf gdb-7.12.1.tar.gz
mkdir build-gdb
cd build-gdb
CFLAGS="-O1" CC="clang -std=gnu89" ../gdb-7.12.1/configure --prefix=/usr/local/bfin-elf --target=bfin-elf --enable-sim-bfin
make all
make install


ldr
https://osdn.net/projects/sfnet_adi-toolchain/downloads/2014R1/2014R1-RC2/src/blackfin-toolchain-2014R1-RC2.src.tar.bz2/

      • -

mkdir blackfin-toolchain-2014R1-RC2
mv blackfin-toolchain-2014R1-RC2.src.tar.bz2 blackfin-toolchain-2014R1-RC2/
cd blackfin-toolchain-2014R1-RC2

tar xjf blackfin-toolchain-2014R1-RC2.src.tar.bz2
tar xjf uClibc.tar.bz2 uClibc/include/elf.h
tar xjf ldr-utils.tar.bz2
cd ldr-utils
cp ../uClibc/include/elf.h .
./configure --prefix=/usr/local/bfin-elf CFLAGS="-Wno-gnu-designator"
make
make install
ln -s /usr/local/bfin-elf/bin/ldr /usr/local/bfin-elf/bin/bfin-elf-ldr


■libdsp
(PATH に /usr/local/bfin-elf/bin が通ってること)

cd blackfin-toolchain-2014R1-RC2
tar xjf libdsp.tar.bz2
cd libs
make CROSS=bfin-elf-
make CROSS=bfin-elf- install DESTDIR=/usr/local/bfin-elf/bfin-elf

rm libdsp/libbfdsp.a
make CROSS=bfin-elf- LIBC_HAS_NO_CMATH=1
make CROSS=bfin-elf- LIBC_HAS_NO_CMATH=1 install DESTDIR=/usr/local/bfin-elf/bfin-elf

    • -

一応、これでツール類はすべてビルドされるが、まだBlackfinを触りはじめたばっかりなので、なにか問題あるかもしれない。


[追記 2017-02-19]
上記の方法だとbfin-gdbproxyが入らないみたいだ...

gcc6.3.0でサンプルをコンパイルすると一部動かないものがあるみたいです。少なくともUSB DACのサンプルコードは動作しませんでした。

体温を測りたいのさ!!

前回のつづきです。

前回 : 体温を測りたいのさ!

前置き

ブログを書くにあたってこの体温計の名称がないとなんとも書きづらいのでサーミスタの型番からBLE103AT-11と呼ぶことにします。

体温計の続き...

一応、温度は測れるようになったので、使い勝手を考えて他に必要な機能を検討することにした。

体温の変化を記録するのに常にiPhoneでデータを取り続けるのは現実的に厳しそう。BLEはちょこちょこ接続が切れるし、iPhoneの電源が常にONってのも前提とはできない。
なので、BLE103AT-11はスタンドアロンでデータを記録しておいて、iPhoneがつながったときに記録したデータを転送する方法にしようと考えた。

てことは、BLE103AT-11自身が定期的に温度を測ってメモリに保存して置かなければならない。BLE103AT-11が、それように(だいたい)正確な時間も保持しておく必要がある。

計測データと時間データをまとめて送れるようなBLEのサービスやキャラクタリスティックがあるかどうか調べてみたが、ピッタリくるようなものはないみたいなので、これは自分でキャラクタリスティックを決めてサービスを定義することにした。
Temperature Measurementキャラクタリスティックが使えそうです!なのでこっちを使う方向で!(2015.10.20)


ただ時間に関しては Current Time Service (CTS) なるものがあるようなので、まずは「時間」についてはこのCTSを使ってどうにかしようと思う。

で、CTSってなに?

大雑把にいうと BLEデバイスが自分自身のもつ時計機能によって日時を提供するサービスで、それに伴ったキャラクタリスティックもいくつか定義されている。
詳細はBLEのデベロッパポータルあたりを参照。
https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx

この仕様をみると1秒以下の時間とかタイムゾーンの扱いとかいろいろと細かいところもあるのだけど、CTSを名乗るには「現時点の日時」を返せるだけで、とりあえずOKのようだ。これはキャラクタリスティックの "Current Time"で実現する。

BLEの規格によるとCTSはCurrent Timeキャラクタリスティックの Read、NotifyとCCCD(Client Characteristic Configuration Descriptor)が最低限サポートしなければならないようだが、BLE103AT-11はそれ自身がRTC(Real Time Clock)を持っていないので、なんらかの方法で起動直後に日時を設定する必要がある。
一旦BLE103AT-11に日時が設定できれば、あとはTickerで 1秒毎に割り込んで擬似的にRTCを実現できる。この設定はCurrent TimeキャラクタリスティックのWriteで実現することにした。Current Timeキャラクタリスティックに Writeを用意して、ときどき外部(今回はiPhone)から設定してあげれば現実的なのではないかなと。

てことでCTS実装

mbed BLE用にCurrent Time Serviceを実装してみたのがこちら。
https://developer.mbed.org/users/ohneta/code/BLE_CurrentTimeService/

で、これCCCDの部分がよくわからなくて未実装のままだが、ソースコードを読んでみた限りではmbed BLEライブラリがなんかいい感じでCCCDをサポートしてくれているっぽい。
ただmbed BLEではonUpdatesEnabled/onUpdatesDisabledのコールバック関数のポインタはGapオブジェクトが持つので、複数のサービスをサポートする場合はどのサービス/キャラクタリスティックへのNotifyなのかを判断するすべが必要なようだ。そこんとこがよくわからなかったのでonUpdatesEnabled/onUpdatesDisabledは未実装のままで公開した。

あと特筆すべきWriteのサポート! wてか、これがないとベースとなる時間が設定できませんからねw


Writeで書き込んだ日時をepoch timeに変換して1秒ごとにupdateするだけの簡単なコードを書いて、2日目終了。
あー、なんか疲れた、、、本当は体温計を作ろうとしていたのに、なにやってんだろ、おれ(^^;;;

体温を測りたいのさ!

動機

最近、時々何日間にもわたって微熱が続くことがあって、なんだか自分の健康に自信が持てなくってきている。身体が怠くなってきてから体温計で測ってみると、38℃台なんてことがあった。
そんなことになってるので、自分の体温のモニタリングに興味が湧いたので、簡易なものを作ってみることにした。

実験

温度を測るということで、家にLM61BIZという温度センサがあったので利用できるかなと3つ並べて同時に計測してみた。仕様範囲内(±2℃)とはいえ、結構な計測値のばらつきがでたので、こいつの利用は断念。

そこでご家庭用体温計のことをネットでいろいろ調べたところ、センサにはNTCサーミスタなるものを使っているとのこと。NTCサーミスタを求めてネットを物色したところ、秋月電子にSEMITECの103AT-11というものを発見。これを実験してみることにした。
http://akizukidenshi.com/catalog/g/gP-07257/

最終的にはBLEでリモート計測したいので、マイコンは仕事でも使っているのスイッチサイエンスの「HRM1017 BLEモジュールピッチ変換基板」を利用。
https://www.switch-science.com/catalog/1814/

これでまず実験をしてみた。

サーミスタは温度変化で抵抗値が変わるので、VccとGNDの間に3.3KΩの抵抗とサーミスタを直列に接続し、分圧抵抗としてマイコンのADコンバータで電圧を測定することで、サーミスタの抵抗値を測ってみた。
回路図はこんな感じ。

LEDは動作確認のためだけにつけてある。常時つけてるとHRM1017からの出力電流不足になる(らしい)ので注意。

計測した電圧は単純に見ただけではチンプンカンプンなので、温度を計算するために下記のようにした。(サーミスタの仕様書を参照)

AnalogIn    aIn103AT(P0_1);

float vcc = 3.3;    // Vcc値
float r1 = 3300;    // 分圧抵抗R1
    
uint16_t tmpVolt = aIn103AT.read_u16();  // 10bitデータ (0x000 - 0x2FF)
float vIn = ((float)tmpVolt / 1024.0) * vcc;    // 計測値から電圧(V)に変換
float r = r1 * vIn / (vcc - vIn);                         // 電圧からサーミスタの抵抗値を計算
float t = 1.0 / (log(r/10000.0) / 3435.0 + (1.0 / (25.0 + 273.15))) - 273.15;   // サーミスタの仕様から実際の温度に変換

(NTCサーミスタはほんと計算式大切よ♡)

これで値をシリアル出力で見ながら他の気温計と比較したり、サーミスタの温度を上げ下げしてみてイケそうなことを確認。
また、計測間隔は分単位で問題ないだろうから、測定していない時にサーミスタへの電流を止めたい。ということで、サーミスタに流す電流はPIOから供給することにした。これなら計測したい時だけでPIOをONにすることでセンサに電流が流れるので省電力になるだろうという目論見。
ホントならPIOはFETをON/OFFするようにして電流をしっかり確保したほうがいいんだろうけど、まっ、まだ実験だしw動いたのでこれでOKとしとく。

どこを測るか

実験で温度計測はうまくいけそうなので、身体のどこを測るかを考えた。
体温や体温計のことを調べると、ワキの下、口内、直腸、耳の中などで計測するのがよさ気だが、どこも常時このセンサをつけておくには憚れる場所ばかりである。唯一ワキの下だけがなんとかなりそうな場所だが、そこで正確に体温を測るにはワキを10分くらい閉めておかなければならない。そばにいる人に絶対訝しがられるので、これまた無理w
体温の分布図があるサイトをみたところ、下腹部あたりならだいたいワキと同じくらいの体温なので、そのあたりにサーミスタをとり付けば測れそうだと仮定。ズボンのベルトバックルの後ろあたりにサーミスタを入れてみたところ、ワキの下より約1 ℃程度低い温度だったので、この位置で体温を測ることにした。マイコンを入れておくケースをズボンのポケットに入れたりベルトに固定できるようにしとけば、訝しがられたり憚れることもなかろう。。。たぶんw

プロトタイプ(?)

測定場所とセンサ、回路が決まったのでとりあえずプロトタイプをつくってみる。

ケースはズボンポケットにいれていても大丈夫そうなものを選ぶ。

マイコンはピンが邪魔になるのでハンダを吸い取り外しておく。

電池はCR2023一択でw

ケースにサーミスタのリード線を通す穴をあけ、マイコンの基板をそのまま利用して電池、サーミスタ、抵抗をハンダ付けする。


ケースが小さいので基板は固定しないでそのまま放り込んでおく。リード線たちがいい具合にバランスをとってくれてケース内では安定している模様w
ただ電池が他の配線に接触しないように絶縁だけはしっかり。

ファームウェアのプロトタイプはmbed HRM1017として作成。
BLEペリフェラルとして、Health Thermometer Serviceをサポート。
他にもサポートしたいGATTがあるのがだが、とりあえず動作させてから考えることに。
あと、電池駆動のときはVccが3Vになるので、前述のサーミスタの温度変換式ではそれも考慮しておく。


iPhoneのアプリも体温データが取得できることだけができるものでいいので、とりあえず作ってみた。
iOSのBLEアプリはいままでもいくつか作っているので、そのライブラリを使って組んだだけ。 UXもなにもあったものじゃないw

センサを下腹部に仕込んでアプリを動かしてデータを取得してご家庭用体温計で測った値とと比べてみたりと、ここまで作って1日目終了。


まだやる?

iPhoneと接続されていない時でも体温を測りたいのでマイコン側でバッファリングしたり、それをしだすと計測した時間が正確に知りたくなるけどマイコンにRTCがないのでBLEのCTS(Current Time Service)を仕込んでみたり、、、
アプリもそれらに対応したり、体温変換をグラフ表示してみたり、、と、まだまだやらないとなー(^^;