2011年02月27日
CMS102-A+ USB Audio (その3: アクリルケース製作)の続き。
自作USB Audio基板を使っていて、どうもLED点灯が地味。
アクリルケースのエッジを光らせてみたらどうだろう? 基板おさえ用レールに基板を挿入しやすくするための斜めカット部分がある。その斜め部分にLEDの光を入射したら、ケースのあちこちのエッジから出てこないだろうか? …と思いつき、早速やってみる。
ケースのレール斜め部分に対応する位置、オモテ側から直接にLEDの光が見えてしまわないよう、ハンダ面にチップLEDを実装。
基板A面の3φ LEDは撤去。
光路をあらかじめ考えていない後付けなので、アクリルLED工作としては良いデキとは言い難いかも知れないが、LEDが基板A面にあった時に比べ視認性は良くなった。
チップLEDに流す電流は、明るい部屋でカット&トライで決めた。
次からアクリル・ケースを利用する時は、LEDの光路やそのドライブについてあらかじめ検討してから基板製作することにしよう。
2011年02月22日
CMS102-A+ USB Audio (その2: 基板配線)の続き。
基板を小さくしたもののアルミ電解コンデンサの背が高いので、ケースはアクリルを切った貼ったして作成。寸法は現物合わせ。
何かがショートするとマズいので半田面をアクリル板で保護。のっぽなアルミ電解コンデンサの部分はハダカで、それより小さい部品だけに蓋がある構造。結果、スリッパのような形に。スリッパの親指部分にはミニUSBジャック用に穴が開いている。
スリッパ奥の左右に短いレールを設け、基板をくわえる。レール端は基板を挿入しやすいように斜めにカット。
反対側の3.5φヘッドホン・ジャック側の基板エッジの下は、高さ 3 mmの枕を設け基板を浮かせ、基板とケースの固定は結束バンド。
動作中は、LEDが1個光るだけ。けっこうジミ。
蛍光アクリル板を利用し、LEDで筐体のエッジも光るような工夫をするのも良いかも。
CMS102-A+ USB Audio (その4: LED変更)に続く。
2011年02月21日
CMS102-A+ USB Audio (その1: 回路図)の続き。
72×48 mmの片面ガラス・ユニバーサル基板を適当な大きさに切って利用することとし、部品配置を決める。
オーディオ出力のアルミ電解コンデンサ1000μFは、左チャネルと右チャネルを離して配置。
電子工作の話題を扱ったブログを拝見していると、たまに、OSコンやオーディオ用の高価な電解コンデンサなどを選んでおきながら、それらのコンデンサをぴたりと寄り添うように並べている例を見かける。電解コンデンサは電極箔と絶縁体を巻いたロールケーキのような構造になっているので、L成分を持っている。巻き構造の部品同士が近くにあると、それがコンデンサであってもトランス結合してしまい、チャネル・セパレーションや音質の悪化を引き起こしやすいので要注意。
どうしても近くに置かねばならない場合、部品を互いに斜めに倒したり、トランス結合しにくい工夫が必要。オーディオ回路の初歩。
![]() |
アルミ電解コンデンサ以外のコンデンサや、抵抗、フェライトビーズなどは1608サイズとし、基板のB面(半田面)に配置。左図はA面(部品面)からの透視。 |
| 実際の実装の様子を下に示す。 |
結果、過半数の部品が半田面(A面)に載り、部品面(B面)は大モノだけ。
アルミ電解コンデンサばかりが目立つし、1000μFがデカイっ! せめて、4.7〜10μFの小さなアルミ電解コンデンサは、チップ積層セラミック・コンデンサにすれば良かったと後悔。1608サイズの4.7μFを在庫している部品屋は多くはないが、2012サイズなら秋月電子の店頭に並んでいたような…。
ここまで出来たら、とりあえず火入れ。もちろん、動作ok。(って、火入れの前に、配線の最終確認くらいしようね)。
音量ツマミを外付けしたのは正解。最大にすると、ヘッドホンに十分過ぎる音量。ノイズや音質の測定はまだ行っていないが、高域がちょっと安っぽい印象。気になるノイズはない。
その3 アクリルケース製作に続く。
2011年02月20日
愛用しているノートPCのヘッドホン端子から音が出なくなった。修理も高くつきそうなので、外付けのUSBオーディオを利用することにした。
USBオーディオに希望する仕様としては、
- USBバスパワー給電
- 8Ω 3.5φミニジャック・ヘッドホン端子出力
- f特は20〜20 kHz程度
(小型のものは、50 Hz以下の低域が出ないものが多い) - USBからの制御だけではなく、外付けユニット上のダイヤルまたはボタンで、音量制御ができること
秋葉原の部品屋を探してみたところ、若松通商で C-Media社のUSB Audio IC CMS102-A+を見つけた。
さっそくCMS102-A+を利用することにして、回路設計。
基本的にはリファレンス回路のままで、労せずに動作しそう。

このIC、内部コアは3.3Vで動作するが、電源入力は5V。アナログ電源(13 pin, A-GND 16pin)とディジタル電源(5 pin, D-GND 9 pin)は独立しており、コア用3.3Vは内部レギュレータで生成し、6 pinのREGV端子から外部にも出力される。ここには低域のパスコンを付す。
上記の電源ピンの他に、IC内部で利用されるリファレンス電圧(VREF 11 pin)にもパスコンを付しておく。
RCLやコネクタ以外に必要なのは、12 MHzの水晶だけ。
当たり前のことだが、パタンを引く時に、水晶とそれを接続するICピン間の配線に、他の配線がクロスしないように注意。

USB端子からのバス・パワー給電は、1608サイズの電源ライン用チップ・フェライトビーズで受ける。1608サイズのチップ部品は、2.54mmピッチのふたつのランドにちょうどうまくかかり、しかもランドの穴を邪魔しないので、万能基板での製作に便利だが、秋月電子の店頭には一回り大きいサイズしか見当たらない。店の人に1608がないか訊いたら、「まだ店頭には並べていないんですよ」と言って奥から出してくれた。
USB信号ラインの引き回しは、そのライン・インピーダンスにも注意すべきだが、このICはFull Speedなので、短く引き回せば、2本の信号線が等距離になるように注意するくらいで良いだろう。プラス側は、CM102-A+の3.3Vレギュレータ出力でプルアップ。
デジタル電源とアナログ電源(ともに5V)、それぞれのグランドも1608サイズの電源ライン用チップ・フェライトビーズを用いて直流的に接続し、1点アースを基本として引き回す。
直流抵抗を下げるため、60Ωのフェライトビーズを並列に使用。30Ωのフェライトビーズひとつと等価。
LEDは、CM102-A+のPDSW (Power Down Switch Control)出力に接続。こうすると、USBホストと接続された時に点灯するようになる。さらにPDSW出力をPAEN (Power Amp Enable)に入力し、電源投入時ではなくUSBがリンクしてからオーディオ・アンプ出力をイネーブルすることでバズ音を回避。
秋葉原電気街で部品調達する場合、高輝度タイプのLEDも従来型のLEDも価格差がない。消費電流軽減目的で高輝度タイプのLEDを使用したので、電流制限抵抗は3.3 kΩと大きな値、普通の明るさで光らせる。
GPIOは使用しない。ディフォルトで入力になっているのか、それとも、lowとhighのどれかを出力しているのかをデータシートから読み取れなかったので、10 kΩでプルダウンしておく。
CM102-A+の音量制御は、オーディオ信号を減衰させたり、アンプの負帰還量をボリューム制御する代わりに、VOLADJ端子の電圧をA/D変換で読み取り、指示値をテーブル・ルックアップしてアンプのゲインを制御する方式のようだ。可変抵抗はBカーブを選びたい。
C9〜C10は少し神経質過ぎる気もするし、ここのフェライトビーズは無意味に思える。あって邪魔になるものでもないので、リファレンス回路同様に。フェライトビーズは信号ライン用1 kΩがあればそれを使用したいが、手元に買い置きが無いからといって買い足すほど重要でもないだろう。今回は、オーディオ出力用に購入するフェライトビーズの余りを流用。
オーディオ出力のカップリング・コンデンサC14〜15Rは、低域を20 Hzから どっしり出したかったので、1000μFとした。負荷が8Ωと低いので、ここのフェライトビーズL8〜9は信号用では定格電流を超えてしまう。電源用フェライトビーズを利用。

R10とR11で、負荷が接続されていなくても、アルミ電解コンデンサC14〜15の開放時に生じる可能性がある再起電圧を放電。一般的には100〜1kΩ。CM102-A+がフルパワーで出力している時にヘッドホンがつながれていない場合、このR10とR11でその出力を消費するので、その定格電力に注意。1608サイズの抵抗器は定格1/10 Wなので、100Ωだとギリギリ。
その2: 基板配線に続く。
2010年06月10日
秋月電子で扱っているPSoCたちに、CY8C21534-24PVXIが加わっていた。
Web (http://akizukidenshi.com/catalog/c/cpsocic/)では発売開始日は「2009/06/18」となっているので、私が気づかなかっただけかも。
2010年05月26日
debianベース、少しだけマルチメディア系パッケージをubuntuから逆輸入するという使い方をしていると、etchに近いのは、dapperだっけ? edgyだっけ? ふだん使っているマシンならsidベースなので、lucidから逆輸入すればokなのだが、中途半端に古い環境をいじりたいことが最近頻発。その際のメモが気づいたら年表のように見えた。ついでだから年表として完成させてみる。
| emdebian | debian | ubuntu | |
|---|---|---|---|
| 17 June 1996 | buzz | ||
| 12 December 1996 | rex | ||
| 05 June 1997 | bo | ||
| 24 July 1998 | hamm | ||
| 09 March 1999 | slink | ||
| 23 June 2000 | (First) | ||
| 08 July 2000 | (Second) | ||
| 15 August 2000 | potate | ||
| 19 July 2002 | woody | ||
| 20 October 2004 | warty | ||
| 08 April 2005 | hoary | ||
| 06 June 2005 | sarge | ||
| 13 October 2005 | breezy | ||
| 25 February 2006 | slind | ||
| 26 October 2006 | dapper (LTS) | ||
| 26 October 2006 | edgy | ||
| 08 April 2007 | etch | ||
| 19 April 2007 | feisty | ||
| 18 October 2007 | gutsy | ||
| 24 April 2008 | hardy (LTS) | ||
| 30 October 2008 | intrepid | ||
| 14 February 2009 | 1.0 (Crush/Grip) | lenny | |
| 23 April 2009 | jaunty | ||
| 29 October 2009 | karmic | ||
| 29 April 2010 | lucid (LTS) | ||
| Comming Soon | squeeze | ||
| Unstable | sid |
|
debianではないけれど、そういえば先週、Snow Leopard (Mac OS X)を手に入れた。 ちなみに一番古い現役マシンはWarp (IBM OS/2)だ。 |
2010年05月23日
Shell Scriptsなどの行頭に#!に続けて指定されるソフトウェアには、実際にどのように後続のテキストが渡されているのだろうか? 意外にもそれについての記載を探しても見当たらない。
論より証拠、簡単なスクリプトを書いて実験してみした。
/*
* test.c
*
* To compile this one:
* gcc -std=gnu99 -Wall -pipe -s -O3 -o test{,.c}
*/
#include<stdio.h>
int main(int argc,char**argv){
printf("argc=%i\n",argc);
for(int i=0;i
要するに、コマンドラインに与えられた引数と標準入力を表示するだけ。実験のため、次のようなスクリプトによって呼び出す。
#!test $* < /dev/random
#
# test.sh
#
1 2 3 4 5
実行結果は、以下のとおり。
> echo baz | ./test.sh foo bar
argc=5
argv[0]="test"
argv[1]="$* < /dev/random"
argv[2]="./test.sh"
argv[3]="foo"
argv[4]="bar"
== stdin: ==
baz
== EOF ==
つまり、
- argv[0]には、ふつうに呼び出されたソフトウェアのpathが入る
#!の行に引数があれば、(途中に空白があっても)、ひとつの引数として渡される
- 実行しているscript自身のpathが渡される
- scriptに渡された引数が続く
- 標準入出力はscriptから継承される
ということらしい。
man pagesやinfoのどこかに書いてありそうだが、どこに書いてあるのだろう?
続きを読む
2010年04月17日
os-proberは、主に、Debian GNU LinuxではブートローダGRUBのメニューを自動設定するのに用いられます。
私がふだん使っているThinkPadで実行すると、次のような結果を得ます。
# os-prober /dev/sda1:Microsoft Windows XP Professional:Windows:chain /dev/sda3:Windows NT/2000/XP:Windows1:chain
インストールされているLinux以外のOSがリストアップされますが、ここで/dev/sda3は、ThinkPadにもともとプリインストールされているThinkVantageのパーティション。できれば“Windows NT/2000/XP”の代わりに“Lenovo ThinkVantage”という検出結果を欲しいところです。
そもそも、どうやってOSを判別しているのだろう?
os-proberパッケージでインストールされたファイルの一覧 /var/lib/dpkg/info/os-prober.list (以下に抜粋)を見ると、どうも /usr/lib/os-probes/mountedに判別のためスクリプトがありそうだと見当がつきます。
/usr/lib/os-probes/mounted/70hurd /usr/lib/os-probes/mounted/90solaris /usr/lib/os-probes/mounted/20macosx /usr/lib/os-probes/mounted/10qnx /usr/lib/os-probes/mounted/20microsoft /usr/lib/os-probes/mounted/80minix /usr/lib/os-probes/mounted/40lsb /usr/lib/os-probes/mounted/30utility /usr/lib/os-probes/mounted/90linux-distro /usr/lib/os-probes/mounted/10freedos
ThinkVantage検出を追加
/usr/lib/os-probes/mounted/20microsoftあたりをパッチすれば何んとかなりそうですが、aptitude updateで折角のパッチがアップデートされては元も子もないので、以下のような新たな検出スクリプトを追加することに。
/usr/lib/os-probes/mounted/10lenovo:#!/bin/sh # Detects Lenovo ThinkVantage partition. . /usr/share/os-prober/common.sh # Weed out stuff that doesn't apply to us case "$3" in vfat) debug "$1 is a FAT32 partition" ;; msdos)debug "$1 is a FAT16 partition" ;; *) debug "$1 is not a FAT partition: exiting"; exit 1 ;; esac [ -e "$2/tpdiag.exe" ] || exit 1 label="$(count_next_label ThinkVantage)" result "$1:Lenovo ThinkVantage:$label:chain" exit 0
実行例:
# os-prober /dev/sda1:Microsoft Windows XP Professional:Windows:chain /dev/sda3:Lenovo ThinkVantage:ThinkVantage:chain
GRUBを再設定
update-grubで再設定できるはず。今回は、ふだんGRUBを再設定している手順、最新Linuxカーネル導入後の事後設定をdpkg-reconfigureにより実施した。
# dpkg-reconfigure linux-image-2.6.33.2 Running depmod. Examining /etc/kernel/postinst.d. Running postinst hook script /usr/sbin/update-grub. Generating grub.cfg ... Found linux image: /boot/vmlinuz-2.6.33.2 Found linux image: /boot/vmlinuz-2.6.33.1 Found Microsoft Windows XP Professional on /dev/sda1 Found Lenovo ThinkVantage on /dev/sda3 done
これでreboot後のGRUB Menuに、“Windows NT/2000/XP”の代わりに“Lenovo ThinkVantage”が表示されれば成功。
外部リンク
2010年03月28日
妙にシャラついた感じの音がすることを昨日記したが、とくにトークのサ行の発音やパーカッションの高周波成分が長めに続く印象。
単純な高域フィルタで取れるとは思えないが、シャラつき対策を試みてみる。
まず、特にシャラつきがひどい部分をFFTしてみる。
15.5〜16 kHzあたりに不自然なスペクトルあり。14.5 kHzくらいで 3 dBくらいの段差。
ためしに、このサンプルを--resample 32 --lowpass 14.5オプションでlameで圧縮してみる。(正しい実験の在り方としては、soxのような圧縮を伴わない手法でフィルタリングしてみるべきだが、今回は再エンコード結果も込みで結果を知りたかった)。lameは、--lowpass 14.5が指示されたことにより、トランジション・バンド 14581〜14968 Hzのポリフェーズ・ロウパス・フィルタを適用する。また、この場合、サンプリング周波数は32 kHzで十分なので、--resample 32を指定。
結果として、シャラつき感をなくすことはできなかったものの、かなり軽減できた。
ちなみに、試しに再エンコードしてみた番組の場合のVBR (--vbr-old)の様子は、こんな感じ↓。
Encoding as 32 kHz j-stereo MPEG-1 Layer III VBR(q=4)
Frame | CPU time/estim | REAL time/estim | play/CPU | ETA
33855/33855 (100%)| 1:32/ 1:32| 1:36/ 1:36| 13.125x| 0:00
32 [ 3] %
40 [ 1] *
48 [ 0]
56 [ 0]
64 [ 87] *
80 [ 1420] **********
96 [ 7157] %*************************************************
112 [ 9687] %******************************************************************
128 [ 7592] %%***************************************************
160 [ 5812] %%***************************************
192 [ 1614] %***********
224 [ 434] %***
256 [ 44] %
320 [ 4] %
-------------------------------------------------------------------------------
kbps LR MS % long switch short %
124.4 1.5 98.5 89.4 5.5 5.0
2010年03月27日
シャラつきは、サンプリングの折り返しエラーに起因することが多いが、あからさまに酷い折り返しエラーは今回のFFTによる観測では把握できなかった。
ではデータで語るために周波数特性を測定してみよう。試しに、radiko.jpで文化放送を選択し再生ボタンをクリック。(つまりプレーヤは、radiko.jpのページに張り付いているフラッシュ・プレーヤを利用)。PCのオーディオ出力(デジタル・ループバック)をFFTしてみた。15 kHzちょっとはコンスタントに出ているらしい。CD並みとはいかないが、AMラジオでは考えられない高音質。
16 kHz〜20 kHzあたりにもスペクトルが出ている。
この16 kHz〜20 kHzあたりがシャラつきなのかどうかを見たくて、ソノグラムを作成してみた。縦軸は周波数(24 kHzまで)、横軸が時間経過。スペクトルの強度を輝度(擬似カラー)で表示。

radiko.jp ソノグラム
フィルタ特性が(アダプティブに?)変わっており、20 kHzまで出ているようだ。コーデックがそのような特性になっているのか、radiko.jpのフラッシュ・プレーヤがそのような出力特性に作られているのかは不明。常に20 kHz帯域を確保できているわけではないし(コンスタントに出ているのは16kHzくらいまで)、この15 kHzを超えた部分がシャラつきの原因なのかもしれないが、このソノグラムからはそう断じることはできない。むしろ、ソノグラムだけを見る限り自然な帯域の伸びと見分けがつかない。
単純にFFTで観測された帯域に匹敵する高音質には聞こえないが、いままでのAM放送と比べたら雲泥の差の高音質であるのは間違いない。しかも、測定結果を省略するが、FM放送よりもホワイト・ノイズが少ないし、混変調ノイズは皆無である。
我が家のラジオはNHK専用になりそうだ。
radiko.jpのシャラつき対策 (2010年03月28日)に続く。








