やまちゃんのオーディオブログ

真空管アンプ、最近は資金調達のためのFX,MetaTrader4ネタもやっています。

ラズベリーパイB

ラズベリーパイBのi2s外部クロックでサンプリング周波数に応じたgpio出力

投稿日:2017年7月29日 更新日:

ラズベリーパイB(モデル1)です。すいません。
もはや中国のalliexpressなどでしか入手できないかもしれません。

<追記:ラズベリーパイ0へ応用できるかもしれません。>

以前の記事の通り、ラズベリーパイBでi2s信号を取り出すことをやっている。
外部のクロックから入力するので、外部クロックの周波数、オシレータを変更しなければならない。
サンプリング周波数ごとのgpio出力を試みた。
「三日坊主な私がいつまでブログやれるか...( ̄~ ̄;) 」さんの「Raspberry pi I2S PCM1716でハイレゾ再生」を参考にします。64倍FS固定なので、
44.1kなら、22.5792M/(44.1k*64)が分周比となり、74VHC161などの分周されたQ出力を選択するようにします。
192kなら、24.576M/(192k×64)が分周比となる。
88.2k、176.4kがあるので、2×4入力切替の74VHC153などで信号を切り替えます。その際、3種類の信号を切り替えるので、2ビットを要します。

以下の17、14,15はGPIO番号で、空いているGPIOの番号を指すものとします。
おそらくこのようにすれば動くのではないかと。
ここの17はオン・オフでオシレーターを切り替える。オンの時、一方はコンプリメタリーMOSFETをつないでNOTの論理回路にし、オフにする。オフの時、他方のコンプリメタリーMOSFETの出力はONになる。
14,15は、分周比選択のための信号切り替えのための2ビット出力で、74VHC153などの2ビット入力に入力する。ピン番号としてはこのとおり3つ使用するが、番号を互いに交換してももちろん構わない。

int myerr = gpio_request_one(17, GPIOF_OUT_INIT_LOW, “MyTest”);
if (myerr == 0) {
if (sampling_rate == 48000 || sampling_rate == 96000 ||sampling_rate == 192000 ) {
gpio_set_value(17, 0);
} else {
gpio_set_value(17, 1);
}
gpio_free(17);
}
int myerr = gpio_request_one(14, GPIOF_OUT_INIT_LOW, “MyTest”);
if (myerr == 0) {
if (sampling_rate == 44100 || sampling_rate == 48000) {
gpio_set_value(14, 0);
if (sampling_rate == 88200 || sampling_rate == 96000) {
gpio_set_value(14, 1);
}
if (sampling_rate == 176400 || sampling_rate == 192000) {
gpio_set_value(14, 0);
}
gpio_free(14);
}
int myerr = gpio_request_one(15, GPIOF_OUT_INIT_LOW, “MyTest”);
if (myerr == 0) {
if (sampling_rate == 44100 || sampling_rate == 48000) {
gpio_set_value(15, 0);
if (sampling_rate == 88200 || sampling_rate == 96000) {
gpio_set_value(15, 0);
}
if (sampling_rate == 176400 || sampling_rate == 192000) {
gpio_set_value(15, 1);
}
gpio_free(15);
}
おそらく以上の通りして動作を確認したという記憶があるが、ピン番号はあいまいで忘れました。また、このままコピっても、全角文字コードのエラーが出るかもしれない。
動作確認は、aplay(2017年のトラ技の連載「高品位Linuxサウンド・アプリケーション・プログラミング超入門」参照、フォーマット変換が必要) or aplayex(当サイトの過去記事参考)で、44.1k、96k音源を切り替える。グラウンドと、LED+100オーム?の抵抗を接続し、その点灯で確認できる。74vhc163の先は、192系列、44.1k系列の出力があり、2つを切り替える必要があるが、おそらく?ダイオードの逆止弁で代用できないかと考えている。
このピン番号をファイルの情報を読み取り適宜変更しようと考えたが、カーネルでファイルを読み込むのは相当難しく手に負えないので諦めた。

この論理回路を構成するには、fpgaで構成できないか考えている。de1-socの場合、元から、DACが接続されており音声出力ジャックがあるので、簡単に構成できるのではないかと。

-ラズベリーパイB

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

no image

ラズベリーパイのi2s外部クロック、その後3-2(2018年度版)

11 カーネルソースの編集 編集すべきは、以下の3つ。 (1) rpi-dac.c  (snd_soc_rpi_dac) (2) bcm2835-i2s.c (snd_soc_bcm2835_i2s) …

no image

ラズベリーパイ nanoでの行番号の表示の仕方

find / -name “nano*”で、nanorcを探す。 私のラズベリーパイの場合、 /etc/nanorcで発見できた。 nano /etc/nanorcで、設定ファ …

no image

ラズベリーパイのi2s外部クロック、その後7(2018年度版)

過去記事では、ラズパイ2のi2s方式での音楽再生について、ラズパイ側がクロックスレーブとなる形式(ラズパイの外部からクロックを供給する形式)で再生するためのi2sのドライバーの改造方法、FPGAを用い …

no image

ラズベリーパイのi2s外部クロック、その後4(2018年度版)

13 ラズパイの信号に応じて、クロックを切り替えるボード  この点をどのようにするか、基板を起こす方法もあるけれど、試行錯誤が多いと思えるので、 FPGAを用いて、プログラム的に、信号切り替え、分周な …

no image

ラズベリーパイのi2s外部クロック、その後5(2018年度版)

とりあえず、デバイス:de0-soc、DAC:wm8731用のクロックジェネレータのプロジェクトを公開。de0-socの開発CDに含まれているmy first fpgaを参考にした。 (図をクリックす …

[最近の記事]
2017年7月
 1
2345678
9101112131415
16171819202122
23242526272829
3031