USB-C 2.0 ソケットテスターの作成

# はじめに

USB-C 2.0のソケットをPCBにハンダ付けした際に、各端子がブリッジせずちゃんとハンダ付けされたかを確認するためのツール『USB-C 2.0 ソケットテスター』作成した。

> 実はもう随分前に作成したのですが、記事にするのを忘れていました

![IMG_1896_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/7984a566-171c-18e1-4b87-c5e21bd4166c.png)


<img width="300" alt="10-TYPE-C-31-M-12-8-94-7-3-usb-smd.jpg_Q90.jpg_.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/a61899f7-10c9-c0fb-1e6a-79e0c967af1c.png">

USB-C（2.0）ソケットのリード線は0.5ミリピッチと非常に狭いため、手ハンダしたとき、見た目でパッと判断できないハンダ不良を起こしている場合がある。以前は汎用のデジタルテスターの導通チェックで確認していたが、両手がふさがり非常に面倒なため、専用のテストツールを作成した。


# 使い方

![IMG_1896.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/7209cacb-260c-e20e-b7ec-8582fbc04ec5.png)

- 左上のUSB-Cソケットに5V電源をつなぎ、右下から伸びるUSB-Cケーブルを、テストしたい基板上のUSB-Cソケットにつなげる

- テストしたい基板上の5V(VBUS)、GND、D+、D-、CCの各ランドにテストリード（プローブ）を当てる。該当するLEDだけが光れば（ブザーが鳴れば）正しくハンダ付けされている。2つ以上のLEDが光ったり、逆に何も光らないときは、ハンダ不良があることを示す。

　　　　**2つ以上のLEDが光る：** ブリッジしている
　　　　**何も光らない：** USB-Cの端子とPCBが導通していない

- USB-Cソケットは両面対応のため、USB-Cケーブルを一度抜いて裏返し、再度刺してもう一度テストする。

:::note warn
部品実装後は、正しくハンダ付けできていても5V/GND/CC等が同時に点灯することがあるため、マイコンや電子部品をハンダ付けする前に、USB-Cソケットだけ単独でチェックすること
:::


<i>ランドにプローブをちゃんと当てるため、ブザーも鳴動させ、視線を動かさなくても確認できるようにした。</i>



![IMG_1900.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/71e1e208-7280-e7dc-ddb1-371b6dbd4401.png)


# 配線図

_USBの5V+を`RAW`ピンに入れることで、3.3Vへの降圧は不要_

![circuit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/a76b03cd-71a2-c106-3494-c4f097fe31fc.png)




# Arduinoスケッチ

USBの各信号線に対応した（Pull_Upしている）デジタルピンを読み出して、Lowの時に、該当するLEDが接続されたピンをHIGHにする、単純なプログラム。
ブザーはArduino標準の`tone`関数でLEDピンに応じた周波数を指定する。ブザーはアナログ(PWM)出力できるピンに接続する必要がある。

プログラム起動時に、LEDとブザーを一通り光らせて(鳴らして)、このテスター自身のLED不良がないことを教えるようにしている。


```C++:sketch.ino
#define A3 17
#define buzzer A3

#define in_vbus    2
#define in_gnd     3
#define in_d_minus 4
#define in_d_plus  5
#define in_cc      6

#define led_vbus     8
#define led_gnd      9
#define led_d_minus 10
#define led_d_plus  11
#define led_cc      12

#define tone_c3  131
#define tone_d3  147
#define tone_e3  165
#define tone_f3  175
#define tone_g3  196
#define tone_a3  220
#define tone_b3  247
#define tone_c4  262
#define tone_d4  294
#define tone_e4  330
#define tone_f4  349
#define tone_g4  392
#define tone_a4  440
#define tone_b4  370
#define tone_c5  392

int tones[] = {
  tone_c3 ,
  tone_e3 ,
  tone_g3 ,
  tone_c4 ,
  tone_e4 ,
  tone_g4 ,
};

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(in_vbus, INPUT_PULLUP);
  pinMode(in_gnd, INPUT_PULLUP);
  pinMode(in_cc, INPUT_PULLUP);
  pinMode(in_d_plus, INPUT_PULLUP);
  pinMode(in_d_minus, INPUT_PULLUP);
  pinMode(led_vbus, OUTPUT);
  pinMode(led_gnd, OUTPUT);
  pinMode(led_cc, OUTPUT);
  pinMode(led_d_plus, OUTPUT);
  pinMode(led_d_minus, OUTPUT);

  for (int n=0; n<5; n++) {
    digitalWrite(n + led_vbus, HIGH);
    tone(buzzer, tones[n], 80); 
    delay(80);
  }
  for (int n=0; n<5; n++) {
    digitalWrite(n + led_vbus, LOW);
  }
  tone(buzzer, tones[5], 300); 
  delay(300);
  digitalWrite(LED_BUILTIN, HIGH);
}

void ifOn(int pin) {
  bool isOn = (digitalRead(pin) == LOW);
  if (isOn) {
    tone(buzzer, tones[pin - in_vbus], 300); 
  }
  digitalWrite(pin - in_vbus + led_vbus, isOn);
}

void loop() {
  ifOn(in_vbus);
  ifOn(in_gnd);
  ifOn(in_cc);
  ifOn(in_d_minus);
  ifOn(in_d_plus);
  delay(10);
}
```

|テスト対象|デジタル入力ピン|LED出力ピン|ブザー周波数|
|:-:|:-:|:-:|:-:|
|VBUS|2|8|131|
|GND|3|9|165|
|D-|4|10|196|
|D+|5|11|262|
|CC|6|12|330|


# おわりに

当初苦しんだ、USB-Cソケットのハンダ付けも何度か経験すると、失敗無く手はんだできるようになってきたが、確認は必須作業となっており、このテスターは非常に役立っている。
一点改善ポイントとして、最近、このテスター自身の電源にUSB-Cケーブルを挿すのが面倒だなと感じており、乾電池(充電池)仕様に変えようかと考えている。

**以上**