Category tech.

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 デジタルボリューム

保育園からの要請でミシンした。型紙をレンタルするから作ってこい、みたいなのりなんだけど、完全なレシピは用意してくれないので、最大限忖度して作らないといけなかった。というか時間なくて保育園に預けてるんだから作らなくても買えるようにしてほしい。

まぁそれはともかく、仕様が雑なので外注するのも難しいわけで、結局作ったほうが早い。

「エプロン」と書いてあったけど、構造的にはノースリーブワンピースのようなもので、袖口とかが存在する。「服」は小物と違って曲線で立体的なので素人には難しい。

型紙から 10mm 縫いしろをつけて裁断し、完全に同様の例はないものの既存の本を参考にしながら以下の手順で完成とした。

  • 前身頃・後ろ身頃をそれぞれ裁断
  • 周囲をジグザグですべてかがる
  • 表あわせで前身頃・後ろ身頃を縫いあわせる
  • 袖口・襟などを内側に 10mm 折ってステッチ
  • うらがえす
  • 袖口と襟をパイピング
  • 後ろにゴムをつける (つけかたが分からなかったので適当にミシンで2往復した)

布団カバーを作ったときに余っていた布を使ったので生地が若干うすい。あとやたらシックな感じになった。

同じ布・バイアステープで給食帽もつくった (写真はない)。こちらのページを参考に直径40cmで、バイアステープでゴムを入れる部分をつくった。両折りではなく縁取り用のバイアステープを使ったので広げながら縫ったけどなんとかなった。

ググった

「前身頃」「後ろ身頃」

この用語を初めて聞いたのでググった。それぞれ服の前のパーツ・後のパーツの意味らしい。

バイアステープの処理

バイアステープで縁取り(パイピング)するのが初めてだったので、「バイアステープ 処理」「バイアステープ 縫い終わり」とかでググった。買ったのは縁取り用に折られているバイアステープ 11mm。

やらなくても直接的に服の機能にあまり問題はないけど、袖や首まわりは肌にあたる可能性があり、かがった部分が直接露出しているとあんまりよくなさそう。またカーブしている部分は縫いしろに切り込みを入れたりするので、本体だけでは綺麗に処理できず、パイピングすると相当綺麗に仕上るように見える。あと袖とかはバイアステープで処理すると形が安定する模様。

例によって本とかにも「何のためにパイピングするか」ということは書いてないことが多いので、何らかの目的を持ってこれを行うのだということが書いてあるものが欲しくなる。

  1. トップ
  2. tech
  3. 最近のミシン - エプロン

12月中旬から自宅回線に異常が発生していて困っていた。

最初の症状:上りが異常に遅い

最初の症状は上り速度が異常に遅いという症状。下りで70Mbps出ても上りは0.6Mbpsとかがザラ。この時点では明確な症状といえず、プロバイダに連絡するも軽くあしらわれる。この時点では上りだけおかしいので回線異常とは思わずプロバイダ側になんらかの制限がかけられているのでは?と疑っていた。

不規則に回線不通

12月下旬の年末ぎりぎりあたりから回線そのものが不通となる自体が発生。PPPoEセッションが一切張れず、ルータを外してノートPC直結でPPPoEもダメだったため、回線異常であると切り分け。

さすがに症状が明確なのでNTTに連絡したりしていたが、特定の時間になると回復したりして「今起きてます」という状態がつくれず連絡しても「問題なさそうなんですが…」とか言われて困る。

宅内VDSL端末の交換

ただ、宅内VDSL端末(集合住宅なので共有ONU・共有VDSL端末と電話回線経由で宅内VDSL端末を繋ぐ構成)の不具合かもしれないので交換しますということになり交換。しかし交換翌日に再度同様の現象が発生したため、原因は宅内VDSL端末ではないことがわかる。このときは、やはり時間で回復したので連絡せず。

完全な回線不通

ある日、不通になったのち一向に回線が回復しないという自体がたまたま土曜日に発生し、即座に電話すると回線調査が入り、共有ONUから応答がないという旨を伝えられる。

その後すぐに担当者が来訪することとなった。調査の結果、宅内VDSL端末から共有ONUまでのリンクは問題なく (宅内VDSL端末側のLinkが点灯していたため) 共有ONUの電源部がフリーズのため再起動でとりあえず復帰。内心「これはまた発生するだろうな」と思ったけど、NTT設備なのでこっちからONU交換してくれとは言えず、再起動だけで帰ってもらう。

共有ONU交換

その後6日間ぐらいは回線異常にはならなかった。しかし再度現象が発生したため営業時間外ながら即座に電話をかけてみると、録音対応ではあったものの10分程度でコールバックがきて再度担当者がくることとなった。

今回は2人担当者が来訪し、片方は共有設備、片方は宅内端末およびユーザ(自分)対応という構成だった。作業時には既にリンクが回復していたため、宅内から見る限り共有設備は正常といわれ内心解決しないのではないかと緊張が走る。

その後2人とも共有設備を見にいった。しばらくたって、共有設備ONUがフリーズしておりデータ送り出しができない状態であったため、この設備を交換したといわれる。「この状態でなんで通信できていたかわからない」とも言っていた。

ひとまずこれで異常は回復したとみられる。アップロード帯域が異常に狭い現象も再現しなくなった。

ひかり回線異常のノウハウ

現象が発生し次第に即座に連絡する。

NTT側は過去の回線状況はわからないらしいので、回線の不具合が発生したら即座にひかりサポートセンターに連絡を入れる必要がある。時間外は録音と書いてあるので翌営業日対応なのかと思いきや、縮退運用しているだけで担当者は裏にいるみたいで一応即座に調べてコールバックしてくれる。

状況を監視する

自宅内に常時外部と通信しているちょうどいい Raspberry Pi があったため、これに mackerel-agent を入れて、年末から監視を開始した。mackerel-agent は特に設定せずとも connectivity を監視してアラートを出してくれる。ネットに繋ってる Raspi があれば一瞬でできるので便利だった (本来の用途ではないが)。

あとアラートにメモを書けるので対応状況をメモったりしていたのと、アラート対応という形にすると、半ば機械的にNTTに電話したりするメンタルになるのでキレにくくなって精神的にも良かった。

固定回線はオワコンだなと思う

回線異常のときいちいちNTTの担当者を家に召喚する必要があるとかキツい。ハードがマンション共有部や宅内にあるから、こういうことになっている。

モバイル回線は外の基地局との通信なのでこういったことはない。固定回線も窓の外から家に中にWiFi吹いてくれればいちいちこっちで応対する必要がない。

  1. トップ
  2. tech
  3. 固定回線異常との戦い