中華電源のスイッチの修理

中国製の安定化電源の電源スイッチが壊れたので修理しました。
以前、記事に書いた Wanptek NPS3010W という電源です。

プッシュ式の電源スイッチが壊れ、押し込んでも電源が入らなくなりました。分解してスイッチの型番を調べてみると、KDC-A04-1 というものでおそらく中国製。ネットで検索してみても国内での取り扱いは無さそうでした。(スイッチ1個をアリエクで購入するのはちょっと…)

代替品が無いか探してみたところ、ミヤマ電器の DS680KS というスイッチがこれとほぼ同じ形であることが分かりました。これならマルツやモノタロウで購入可能です。

というわけで、マルツで購入しました。左がミヤマ電器 DS680KS、右が KDC-A04-1 です。

ボタンの取り付けの互換性はバッチリでした。ところが、一つ見落としていた問題がありました。KDC-A04-1 は固定のための耳の穴がバカ穴ですが、DS680KSはM3のネジ穴でした。スイッチの固定にはタッピングビスを用いており、M3のネジ穴だとビスが通りません。しかたがないのでボール盤でネジ穴をつぶしてバカ穴にしました。(切り子が接点部に入らないように念のためマスキングテープで養生して加工しました。)

というわけで、うまくスイッチの交換ができました。

標準偏差、共分散、相関係数の簡潔な(?)計算方法

発端

相関係数を計算するC言語のコードを ChatGPT に書かせたところ、いささか奇妙な計算式のコードが生成された。本当に正しいのか検算してみたところ、たしかに正しかった。

おさらい

標準偏差、共分散、相関係数は次のように定義される。

平均を用いずに計算する方法

上記の定義ではいったん平均を計算している。
次の式では平均を用いずに標準偏差、共分散、相関係数を計算できる。

証明

標準偏差については次の通り。

共分散についても同様に示せる。

これらから、相関係数についても前述の式の通りとなる。

これは簡潔な計算方法か?

この計算式は直感的に分かりにくいし、じつのところたいして計算量が減るわけでもない。ただし、いったん平均を計算する必要が無いのでループが1回ですみ、コードが簡潔になる。

C言語のコード

相関係数を計算するC言語の関数を以下に示す。

double correl(const double x[], const double y[], int n)
{
    double sumX = 0, sumY = 0, sumXY = 0, sumX2 = 0, sumY2 = 0;
    for (int i = 0; i < n; i++) {
        sumX += x[i];
        sumY += y[i];
        sumXY += x[i] * y[i];
        sumX2 += x[i] * x[i];
        sumY2 += y[i] * y[i];
    }
    double numerator = n * sumXY - sumX * sumY;
    double denominator = sqrt((n * sumX2 - sumX * sumX) * (n * sumY2 - sumY * sumY));
    return numerator / denominator;
}

MIDIの Velocity と Expression について

困りごと

MIDIではノートの音の強さはノートオン時に Velocity で指定するが、バイオリンやフルートのような楽器の場合に、ノートの途中で音の強さを変化させるにはどうすればよいのか?

楽器の性質

打弦楽器(ピアノなど)、撥弦楽器(ギターなど)、打楽器(木琴、ドラムなど) は、音が鳴り続けることはなく、ノートオン直後から音は減衰していき、途中で音が強くなったりしない。いっぽうで、擦弦楽器(バイオリンなど)、管楽器(フルートなど)は、音を持続的に鳴らすことが可能であり (もちろん現実の楽器では弓の長さや肺活量など物理的な限界があるが) 、ノートの途中で音の強さに抑揚をつける奏法がありうる。

Velocity と Expression

しかし、MIDIでは Velocity はノートオン時のみに指定可能であり、ノートの途中で Velocity を変化させることはできない。そもそも Velocity とは鍵盤において ノートオン時の打鍵の強さ (実際には速さ) を示すパラメータであった。

これに対し、持続音に抑揚をつける場合には Expression を用いる。バイオリンでひと弓で演奏する音に抑揚をつけるには、Velocity を一定にしたうえで Expression を変化させる。

Expression を指令するコマンド

MIDIで Expression を指令するには Control Change メッセージで MIDI CC 11 を送る。値は 0~127 である。

日傘を購入

折りたたみの日傘買った。晴雨兼用で遮光・遮熱のやつ。いままで日傘なんて持ったことなかったけど、体が弱くなってるし今年の暑さはまじでヤバい。

東急ハンズで売ってた Wpc.IZA シリーズの中でいちばん大きいやつ。(TYPE: LARGE SLIM、直径61cm)
折りたたみ傘にしては、広げるとけっこう大きく、そのわりには軽い。色は白(裏地が黒)。
五千円ほどだった。

昼間に出歩くとき、有るのと無いのとではぜんぜん違う。直射日光が当たらないというのは、ずいぶんと体が楽である。もう男女に関係なく、今の日本の夏にはこれは必要だ。昔の日本とは違う。

軽いのは良いけど、ちょっと風に弱いかなという気はする。まあ、折りたたみ傘はこんなもんか。あと、雨傘の折りたたみと違って、遮光タイプの日傘は生地が厚いので、折りたたむときにきれいにたたむのが少し難しい。こういう所に性格が出るものである。せっかく買った良いアイテムなのできちんと使いたい。

SocketCANのエラー通知フレーム

SocketCANとは?

SocketCANは、Linuxのソケット通信のAPIの拡張であり、ソケット通信と同様にCAN通信をおこなうことができる。 そのためLinuxでは、CAN通信のプログラムはソケットを使ったネットワークプログラムと同じように記述できる。

エラー通知フレームとは?

SocketCANでは、アプリケーションはエラーメッセージを、通常のCAN フレームと同じように、エラー通知フレームとして受け取ることができる。

CAN_ERR_FLAGビット

受信したフレームの CAN ID の CAN_ERR_FLAGビット (= 0x20000000U) が立っていたらエラーメッセージフレームである。
定数CAN_ERR_FLAG は linux/can.h で定義されている。

エラー種別

エラー通知フレームの CAN ID の 下位10ビットがエラー種別を示す。
そのビットマスクの定数は linux/can/error.h で定義されている。
詳細情報については後述する。

ビットマスク定数 ビットマスク値 エラー種別 詳細情報
CAN_ERR_TX_TIMEOUT 0x00000001U 送信タイムアウト(by デバイスドライバ) -
CAN_ERR_LOSTARB 0x00000002U 調停をロスト data[0]
CAN_ERR_CRTL 0x00000004U コントローラの問題 data[1]
CAN_ERR_PROT 0x00000008U プロトコル違反 data[2..3]
CAN_ERR_TRX 0x00000010U トランシーバ状態 data[4]
CAN_ERR_ACK 0x00000020U ACKが受信されない -
CAN_ERR_BUSOFF 0x00000040U バスがオフ -
CAN_ERR_BUSERROR 0x00000080U バスエラー(フレーム殺到か) -
CAN_ERR_RESTARTED 0x00000100U コントローラ再起動 -
CAN_ERR_CNT 0x00000200U 送信エラーカウンタ
受信エラーカウンタ
data[6]
data[7]

詳細情報

エラー通知フレームのデータ部(8バイト)にエラーの詳細情報が格納される。
そのビットマスクの定数は linux/can/error.h で定義されている。

data[0] : 調停ロスト

何番目のビットで調停をロストしたか。
CAN_ERR_LOSTARB_UNSPEC (=0x00) の場合は特定できず。

data[1] : CANコントローラのエラー状態
ビットマスク定数 ビットマスク値 説明
CAN_ERR_CRTL_UNSPEC 0x00 特定できず
CAN_ERR_CRTL_RX_OVERFLOW 0x01 受信バッファあふれ
CAN_ERR_CRTL_TX_OVERFLOW 0x02 送信バッファあふれ
CAN_ERR_CRTL_RX_WARNING 0x04 受信エラーの警告レベルに達した
CAN_ERR_CRTL_TX_WARNING 0x08 送信エラーの警告レベルに達した
CAN_ERR_CRTL_RX_PASSIVE 0x10 受信エラーパッシブ状態に達した
CAN_ERR_CRTL_TX_PASSIVE 0x20 送信エラーパッシブ状態に達した
CAN_ERR_CRTL_ACTIVE 0x40 エラーアクティブ状態に回復
data[2] : CANプロトコルのエラー種別
ビットマスク定数 ビットマスク値 説明
CAN_ERR_PROT_UNSPEC 0x00 特定できず
CAN_ERR_PROT_BIT 0x01 単一ビットエラー
CAN_ERR_PROT_FORM 0x02 フレームフォーマットエラー
CAN_ERR_PROT_STUFF 0x04 ビットスタッフィングエラー
CAN_ERR_PROT_BIT0 0x08 ドミナントビットを送信できず
CAN_ERR_PROT_BIT1 0x10 レセッシブビットを送信できず
CAN_ERR_PROT_OVERLOAD 0x20 バスオーバーロード
CAN_ERR_PROT_ACTIVE 0x40 アクティブエラー告知
CAN_ERR_PROT_TX 0x80 送信中にエラー発生
data[3] : CANプロトコルのエラー位置
ビットマスク定数 ビットマスク値 説明
CAN_ERR_PROT_LOC_UNSPEC 0x00 特定できず
CAN_ERR_PROT_LOC_SOF 0x03 フレーム先頭
CAN_ERR_PROT_LOC_ID28_21 0x02 IDビット 28 - 21 (SFF: 10 - 3)
CAN_ERR_PROT_LOC_ID20_18 0x06 IDビット 20 - 18 (SFF: 2 - 0 )
CAN_ERR_PROT_LOC_SRTR 0x04 RTR (SFF: RTR)
CAN_ERR_PROT_LOC_IDE 0x05 ID拡張
CAN_ERR_PROT_LOC_ID17_13 0x07 IDビット 17-13
CAN_ERR_PROT_LOC_ID12_05 0x0F IDビット 12-5
CAN_ERR_PROT_LOC_ID04_00 0x0E IDビット 4-0
CAN_ERR_PROT_LOC_RTR 0x0C RTR
CAN_ERR_PROT_LOC_RES1 0x0D 予約ビット 1
CAN_ERR_PROT_LOC_RES0 0x09 予約ビット 0
CAN_ERR_PROT_LOC_DLC 0x0B データ長コード
CAN_ERR_PROT_LOC_DATA 0x0A データ部
CAN_ERR_PROT_LOC_CRC_SEQ 0x08 CRC
CAN_ERR_PROT_LOC_CRC_DEL 0x18 CRCデリミタ
CAN_ERR_PROT_LOC_ACK 0x19 ACKスロット
CAN_ERR_PROT_LOC_ACK_DEL 0x1B ACKデリミタ
CAN_ERR_PROT_LOC_EOF 0x1A フレーム末尾
CAN_ERR_PROT_LOC_INTERM 0x12 休止中
data[4] : CANトランシーバのエラー状態
ビットマスク定数 ビットマスク値 説明
CAN_ERR_TRX_UNSPEC 0x00 特定できず
CAN_ERR_TRX_CANH_NO_WIRE 0x04 CANHが未接続
CAN_ERR_TRX_CANH_SHORT_TO_BAT 0x05 CANHがBATと短絡
CAN_ERR_TRX_CANH_SHORT_TO_VCC 0x06 CANHがVCCと短絡
CAN_ERR_TRX_CANH_SHORT_TO_GND 0x07 CANHがGNDと短絡
CAN_ERR_TRX_CANL_NO_WIRE 0x40 CANLが未接続
CAN_ERR_TRX_CANL_SHORT_TO_BAT 0x50 CANLがBATと短絡
CAN_ERR_TRX_CANL_SHORT_TO_VCC 0x60 CANLがVCCと短絡
CAN_ERR_TRX_CANL_SHORT_TO_GND 0x70 CANLがGNDと短絡
CAN_ERR_TRX_CANL_SHORT_TO_CANH 0x80 CANLがCANHと短絡
data[5] : 送信エラーカウンタ

送信エラーの回数

data[6] : 受信エラーカウンタ

受信エラーの回数

エラー通知フレームを有効にする設定 (抜粋)

    int m_socket;
    if ((m_socket = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0) {
        // エラー処理
    }
    ...(中略)...
    // エラー通知フレームを有効
    can_err_mask_t err_mask = 0x1FF; // 全てのエラー
    //can_err_mask_t err_mask = ( CAN_ERR_CRTL | CAN_ERR_ACK );
    if (setsockopt(m_socket, SOL_CAN_RAW, CAN_RAW_ERR_FILTER, &err_mask, sizeof(err_mask)) < 0) {
        // エラー処理    
    }

参考


キーボードのキーキャップを染色

ほしい色のキーキャップが品切れだったので、染色液で染色してみました。

(左:染色前(クリームイエローとチリレッド)、右:染色後(イエローとレッド))

今回染めたキーキャップはMBK Choc Low-Profile Keycapsです。黄色と赤色がほしかったのですが品切れでした。かわりにクリームイエローとチリレッドを購入しましたが、やはりほしい色とは違うなと感じました。

そこで「プラ染め太郎」で染色してみることにしました。

染め方

  • キーキャップを中性洗剤(花王キュキュットとか)で洗っておきます。
  • 染色液をよく振ってから20倍に希釈します。
  • IHコンロで染色液を80℃まで加熱します。温度計で温度を確認します。
  • キーキャップを染色液に漬け、箸でかき混ぜながら70℃~80℃で3分~9分程度煮ます。
  • キーキャップを拾い上げます。 (お玉があったほうがよかったかも。)
  • ぬるま湯に入れ中性洗剤で水洗いしてから乾かします。


注意点(1)

  • 特に強い臭いはありませんが、十分な換気をしましょう。
  • 過熱時に蒸気を直接吸い込まないように、マスクをしたほうがよいかも。
  • 染色液が手につくと落ちにくいので、薄手のゴム手袋があればしたほうがよいかも。

注意点(2)

今回、IHコンロはドリテックのピッコリーノを使用しましたが、定温モードで加熱するには800ml以上の内容物がないと温度が上がり過ぎます。大さじ1 (15ml) を 300mlに希釈したのでは少なすぎで、沸いてしまいました。


参考

メモ:円筒型のリチウムイオン電池

円筒型リチウムイオン電池のサイズ名は、直径(mm単位で2桁)+ 長さ(0.1 mm単位で3桁)

  • 14500 : 単三と同サイズ (保護回路内蔵のものはやや長い)
  • 10440 : 単四と同サイズ
  • 16340 : 太短いやつ (CR123A 3V リチウム一次電池と同サイズ)
  • 18650 : 大きめのやつ
  • その他 : 26650/17670/18500/18350/17500

関連記事