4ch 分の音量を一括で変更したいと思ったが、4連ボリュームというのは入手性が極めて悪く、市販の2連ボリュームを改造して4連にしたりするようだ。

ということでそもそもアナログボリュームをやめてデジタルポテンションメータを使うことを検討しはじめた。デジタルボリュームならギャングエラーも少ないし、多チャンネル化もしやすい。インターフェイスも自由にできる (といってもアナログBカーブボリュームをADCして4ch分可変させる予定だが)

LM1972

秋月で売ってる中から選ぶと、実質的にはこれしかない。1つで2チャンネル分。これを使ってひとまず2ch分を作ってみる。

実装

回路図

後段のオペアンプは実際は手元にあった OPA2134 を使っている。単電源でも使えるが、今回は正負電源を用意する予定なのでVSSとGNDはわけてある。

基板

コード

さくっと書きこんで動かせるので Arduino Nano で実験。

  • ADC 0 から値を読んで、0から78dBの間を可変する (ミュートなし)
  • ADC 0 にBカーブ可変抵抗器をつける (0〜5V分圧可変)

という前提。以下のようなことに気をつける。

  • SPI は MODE 0。ローからはじまって立ちあがりで読む。
  • D10 SS を使ってるけど、マスターなので特にこのピンを使う意味はない
  • LOAD/SHIFT は1ch書きこむごとにオン/オフすること (16bit 書くごと)
  • DATA-OUT をデイジーチェーンして次の DATA-IN に繋げる場合は単に4ch分を連続して書きこむ

volumeToAttenuation() は 0〜1023 の値を 1dB ステップで 0〜78dB の設定値に変換する関数。48dB を境に減衰量が変わるので注意が必要。0.5dB ステップは使ってない。

#include <Arduino.h>
#include <SPI.h>

void setAttenuation(const uint8_t v) {
	// channel selection
	//     0x00 (channel 1) / 0x01 (channel 2)
	// attenuation setting
	//     0b00000000 (0) 0.0dB
	//     0b00000001 (1) 0.5dB
	//     0b00000010 (2) 1.0dB
	//     ...
	//     0b01100000 (96) 48.0dB
	//     0b01100001 (97) 49.0dB
	//     0b01100010 (98) 50.0dB
	//     ...
	//     0b01111110 (126) 78.0dB
	//     0b01111111 (127)  100.0dB (Mute)
	//     0b10000000 (128) 100.0dB (Mute)
	//     ...
	//     0b11111111 (255) 100.0dB (Mute)
	//
	// initial state is Mute
	digitalWrite(SS, LOW);
	delay(1);
	SPI.transfer(0x00);
	SPI.transfer(v);
	delay(1);
	digitalWrite(SS, HIGH);

	delay(1);

	digitalWrite(SS, LOW);
	delay(1);
	SPI.transfer(0x01);
	SPI.transfer(v);
	delay(1);
	digitalWrite(SS, HIGH);
}

uint8_t volumeToAttenuation(uint16_t v) {
	// volume 0%   -> 78dB (126)
	// volume 100% -> 0dB (0)
	uint8_t dB =  ((uint32_t)(1023 - v) * 78 / 1023);
	uint8_t att = 0;
	if (dB < 48) {
		att = 2 * dB;
	} else {
		att = 96 + dB - 48;
	}
	return att;
}

void setup() {
	Serial.begin(9600);
	Serial.println("setup");

	// LM1972 Pin / Arduino Pin
	//  (9) CLOCK <-> (D13) SCL
	//  (10) LOAD/SHIFT <-> (D10) SS
	//  (11) DATA-IN <-> (D11) MOSI
	pinMode(SS, OUTPUT);
	digitalWrite(SS, HIGH);
	SPI.setBitOrder(MSBFIRST);
	SPI.setClockDivider(SPI_CLOCK_DIV16);
	SPI.setDataMode(SPI_MODE0);
	SPI.begin();
}


uint8_t prevLevel = 255;
void loop() {
	uint16_t val = analogRead(0);
	uint8_t att = volumeToAttenuation(val);
	if (abs(att - prevLevel) > 1) {
		Serial.print("analogRead = ");
		Serial.print(val);
		Serial.print(" att = ");
		Serial.println(att);
		prevLevel = att;
		setAttenuation(att);
	}
}

備考

最初うっかり±15V、つまりVSS=-15V, VDD=15V をかけてしまい、燃やしてしまった (煙が出て、はんだが溶けてチップが脱落した)。LM1972 は絶対最大定格がVDD-VSS=15V、Typical 12V なので、定格の倍以上の電圧をかけていたことになる。あたりまえだけど定格は確認しないといけない。設計段階で回路図を書く前に気付くべきな、あまりにもしょうもないミス。自戒のためアホなことをしたことも書いておく。

運用上でのよくない点も災いした。

いつもは電源をはじめていれるときは安定化電源を電流制限 (CC) をかけつつオンにし、電流量を見るのだが、今回は正負電源を用意する必要があったため、初回から直接手元にあったトランス経由の電源回路へ繋いでしまった。おかげで異常に電流が流れていることに気付きにくかった。

ということで、正負電源を用意しやすくし、事故を減らすために電源を1台増やす予定。


結局 ±5V で試した。当然うまくいった。

  1. トップ
  2. tech
  3. LM1972 デジタルボリューム

3歳児検診のとき、自宅で視力検査とかをする。普通の検査と同様に、ランドルト環の方向を本人に示してもらうようなもの。しかし真面目に書いてある通りにやったら (練習→本番とやるのだが、本番はやりなおし不可)、ちゃんと答えてくれず、結果をそのまま提出したらひっかかってしまって、赤紙 (2月n日に検査するのできてください、という実際に赤い紙) がきた。

結果的には何の問題もなかった。一通り

  • 眼の写真? (両目を何らかの機械で撮影して数値を出してた)
  • ホログラム?なんていうかわからんけど、飛びだすカードで立体視の検査
    • ランダムに見えるカードだけど裸眼立体視できるようになってるやつ
    • 3つのオブジェクトが隠れているので、見つけてね、みたいな感じ
  • ライトを上下左右に追わせて眼球に動きをみる (斜視の検査?)
  • ランドルト環で視力をはかる
    • 「右」とか「左」とかは難しいので、ランドルト環の模型を持たせて、同じようにあわせる

をやった。

LM1972 デジタルボリューム | tech - 氾濫原 に書いたが、正負電源を簡単に用意できない環境だったのが一因で事故が起きたので、もう一台安定化電源を買った。(写真右が買ったもの)

メトロニクスの524Bという型番のものを買った。会社そのものが既にないので、いつ販売されていたモデルかすらわからない。少なくとも自分が小学生のころにはどっかの企業で償却されたものが手元にあったので30年ぐらい前のものではないかと思う。

なんとなく既存のものと同じのを並べたかったので、中古で売ってるのを探して買ってみた。送料もろもろ込みで5000円ぐらい。新品でもっと出力とれるものもあるけど、好みの問題です。インターフェイスがかっこいいんだよね。

チャイルドトレーラーを買ってみた。Burley Bee というもの。

なぜこれが必要か

ベビーカーを卒業して3ヶ月ほど経過したが、こどもがインフルエンザになったときに、病院まで連れていく方法があまりなくて困ったのがきっかけ。子どもも3歳になり体重も15kgぐらいになっている。

タクシーを使えばいいんだけど (実際、休日診療所は遠いのでタクシーをつかった)、かかり付けの小児科は距離が微妙で、タクシーを待っている時間に着いてしまうぐらいの近さだけど、一方で子どもを担いで行くには若干坂もあって遠い。

このときは親戚に子ども乗せ自転車 (子乗せママチャリ) を借りて小児科までいったが、これがだいぶ怖かったうえに疲れた。子どもを乗せると重くて漕ぎ出しでフラつくし、スタンドの上げ下げ時にコけそうになるしでめちゃくちゃ怖くて、二度とのりたくないと思った。安全第一で考えれば、子乗せママチャリなんてイカれた設計は許されるものではないと思った。

しかし子乗せママチャリに3人乗りで爆走してる人とかいるけど、怖くないんだろうか……

チャイルドトレーラー

他に選択肢はないか、と考えてみるとチャイルドトレーラーが浮かんだ。

 -

4.0 / 5.0

チャイルドトレーラーは既存の自転車のリアハブにアタッチメントをつけて牽引するタイプ。トレーラー側にタイヤがついており、静止時の重量はそっちのタイヤで支えている。

牽引する自転車が転倒しても、子どもが乗るトレーラーには影響がない。重心が低いので乗せたり降ろしたりするときに恐怖を感じることはない。というか3点支持で原理的に安定している。牽引するほうの自転車は重くならないので、ふらついたりすることはなく、普通に乗るのとバランスのとりかたは全く変わらない。

おおむね7歳ぐらいまでを想定したつくりらしい。トレーラー内に2人乗り (シートベルトが2つある) 。重さは45kgまでだけど、天井があるため1人乗りでも座高で制限をうけると思われる。

Burley Bee は本体重量 9kg。Honey Bee などグレード違いでベビーカーにもなるタイプのトレーラーもある。ただ、デカいのでベビーカーモードでも普通のベビーカーのように電車に乗ったりはできないと思ったほうがいい。徒歩で小児科いくときに使いたいとかならベビーカーにできたほうが楽かもしれないと思った。

牽引する感覚

前提としてクロスバイクでひいている。ママチャリでもひけるけど、坂のこととブレーキのことを考えると軽いギアが多くて制動力が高い (Vブレーキやディスクブレーキ) クロスバイクなどか、電動アシスト自転車 (車重が重いのに速度も出せるのでブレーキ制動力も高めに設計されている) が良さそうと思った。

漕ぎ出しが少しだけ重くなるが、ひと漕ぎして慣性がつけば、転がってくれるのでほとんど牽引している感覚はなくなる。本当についてきてるか?と不安になるぐらい。上りは相応に重くなるはずだが、早く走ろうと思わないのでギアを落とせば意外と気にならない。立ち漕ぎでバイク振るのも特に違和感なくできる。下りで押されるような感覚もなかった。

若干車体が左に寄るような設計になっているので、あまり車線の左側ぎりぎりを走ると電信柱や縁石にひっかかりそうで怖い。左側にミラーが欲しいと初めて思った。

トレーラーの最大のデメリットは法律

牽引すると「普通自転車」でなくなり、普通自転車で可能ないくつかの行為ができなくなる。

  • 歩道通行禁止
  • 「自転車を除く」の交通標識に従う必要がある
    • 一方通行や進入禁止で困ることがある
    • 交通標識における「自転車」は「普通自転車」のことなので、牽引した自転車は該当しなくなる
  • 交通のひんぱんな道路の通行禁止
  • サイクリングロードが走れない
    • 普通自転車専用通行帯は走れるらしい (謎)

厳密に守るとかなり難しいときがある。

例えば高架の自動車専用道路 (だいたい交通がひんぱんな道路) へ誘導され、平行する道路が「進入禁止 (自転車を除く) 」になっているような道路だと、どちらも通れないので困る。ややこしいマイナールートを探しだす必要がある。

平行する道路がとぎれて幹線道路に合流するような場合も困る。

橋みたいな必然的に交通が集中するところでも乗って通行することができない。

つまり普通自転車でも自動車でも困らない思わぬ行き止まりが頻発する。ユーザーが少ないせいなのでもっと流行ればいいと思う。


本当にどうしようもない場合、降りて歩くぶんには歩行者扱いとなるので、降りて歩道という手がある (乗って徐行はできないが降りるのは問題ないらしい)。

ということで初めて通るルートの場合、事前に自転車単体で走行して下見したほうが確実。ストリートビューでおおまかにルートを確認して、一回自転車単体で実走してみるぐらいの段取りをしたほうが良い。


速度も目安は直線で最大25km/h、曲がるときは8km/h以下。

自転車乗るとき腰が痛くなりがちだったので、プランクとスーパーマンみたいなやつと腹筋ローラーを多少やってる。腰に効果ある気がしてるけど、それよりもとにかくお腹が緩くなる。毎日うんこでるのはいいけど、通りこして夜中に下痢で起きたりする。