google-site-verification: google3bd66dd162ef54c7.html

USB Type A延長ケーブルの抵抗値を測ってみた

 以前書いたUSB用のチャージャー(カーチャージャー)の特性測定の記事の末尾にUSBケーブルも要注意!ということを書きました。つまりダメなケーブルを使うと、充電しながら使っているにもかかわらず、電池残量が減っていくという残念な状況になることだってあります。

 まあ最初のUSBの仕様では電源供給能力は0.5Aで、この値を前提にケーブルなども作られている訳で、そこにタブレットのように2A近くの電流を要求する物が出てくると、いろいろと問題が発生するという状況は理解できます。

 こういう事情を受けて、最近ではUSB-AからmicroUSBへの接続ケーブルは高電流対応ケーブルなんてのが出ていて、私も愛用しています。でも、高電流対応ケーブルは太くて使い難いので、長さをかせぐ部分はUSB-Aの延長ケーブルで済ませ、最後の20cmくらいを細いmicroUSBケーブルにすると使い易くなります。
 それ以外にもUSBのAコネクタが延長出来ると色々と便利なのですが、そもそもType-Aのオス/メスケーブルなんて規格上は存在しない物なので、真面目に作られていない(作っちゃいけない)気がします。

 でも使う身になって考えると、気になるのがUSB-A延長ケーブルの直流抵抗です。このへんを定量的に比較した情報が見当たらなかったので、実際にどれくらいの値なのか測って見ました。USBコネクタの端子にテスターの針を当てて抵抗を測っても安定した測定が出来そうもないので、簡単な測定アダプタを作ってみました。

▼測定の様子
測定中
 黄色のプラバイスで固定しているのは、100円ショップで売っているUSB電源スイッチという不思議な物の中身の基板。両側にUSBのオスとメスコネクタが付いているので、これを土台に測定治具を作りました。治具をバイスで固定しているのは、出来るだけ配線の接触状態が変化しないようにしっかりと固定するためです。

▼回路図
測定アダプタの回路図
 スイッチがありますが、これは使いません。右側のUSBコネクタの所で+5VとGNDをショートさせているので、抵抗計からはケーブルの往復の抵抗値が測定できるという回路になっています。

▼ゼロ調整用のアダプタ
ゼロ調整アダプタ
 抵抗はデジタルマルチメーター(DMM)で測定しますが、リード線の抵抗を補正する必要があります。そこで、こういうふうにUSB-Aのメスコネクタの電源ピン間をショートさせた物を作り、これを差し込んでDMMのヌル調整を行いました。

▼抵抗測定に使ったDMM、アドバンテストのTR6846
DMM
 0.376Ωを表示しています。表示の最小桁は1mΩですが、4端子測定では無いのでこのあたりは怪しいです。

 以下、測定結果を紹介します。測定回路から判るように抵抗値は往復の値です。

▼細めのケーブル、長さ2m
細線2mケーブル、抵抗が1Ω近くある
 真っ白でおしゃれなのですが、抵抗値は0.972Ωもあります。これに1A流すと0.97Vもの電圧降下になってシャレになりません。

▼短いケーブル、長さ0.5m
50cmだけど以上に抵抗が高いケーブル
 昔から持っている物で作りもしっかりしているので気に入ってたのですが、抵抗値は0.225Ω。長さから考えるとこの半分くらいになっていて欲しかったです。

▼グレーの長さ2mのケーブル
28/24AWGのケーブル
 これは抵抗が0.376Ωでまあまあの値。これなら1.5A流して電圧降下は0.55Vで、ギリギリ許せる範囲か?、いやちょっと許せないか、まあともかくギリギリ。
28と24AWG
 このケーブルにはマーキングが入っていて、28AWG/2C + 24AWG/2C と表示されています。これは信号にはAWG28を、電源には少し太いAWG24のワイヤを使っているということだと思います。ちなみに、信号は28AWG/2Cでは無く28AWG/1Pと書くのが正しい気がしますが、ツイストと線間の位置関係が正確に出来て無いのでこう書いてあるのでしょうか?詳しい方がいらっしゃったらコメントいただけると嬉しいです。

▼エレコムの2mのケーブル
エレコムのUSB-A延長ケーブル
 素性がはっきりした物を測ってみたかったので今回購入した物です。でも抵抗は0.832Ωもありました。これはダメです。涙;
両方がAWG28
 ケーブルのマーキングは28AWG/1PR AND 28AWG/2Cとなっています。つまり電源も信号と同じ(細い)線が使われているようで、これでは抵抗は下がりません。

 まあ高電流用に作られた物では無いので仕方ないんでしょうが、せめてケーブルのマーキングがパッケージの外から見えるようになっていたら、こういう外れを引かないで済んだのですが、、

◆まとめ
 今回の測定結果から見えてきたのは、ほとんどのUSBケーブルの芯線には信号/電源ともAWG28が使われているらしいということです。AWG28の抵抗は230Ω/kmくらいなので、上記の測定結果はあまり矛盾していないように思います。

 中には電源線に太い線を使った物も存在しているようです。今回の測定ではAWG24の物がありましたが、もっと太い物があると嬉しいです。今度秋葉原に行った時にバラ売りのUSBケーブルがあったら、電源線が太い物が無いか、探してみたいと思います。ちなみにたまたま見つけたこの資料によると電源側の線は太いものではAWG20の物があるようです。

ArduinoでI2Cの外付けEEPROMを使う

 Arduinoで作りたい物が無くなってしまいました。いや本当は雷センサーを仕上げたいのですが、当地では雷がほとんど発生していないのでデバッグが全く出来ないでいます。まあ夏になるまでには激しい雷雨の日があるんでしょうが、いつになることやらです。

 で、こういう時には将来に向けた準備をしましょう。ということで、買ったままになっていたI2C接続のEEPROMを動かしてみることにしました。

▼I2C EEPROM 24LC64
64k I2C EEPROM 24LC64
 容量は64kビット、つまり8kバイトです。MICROCHIP製で、以前秋月で買っておいた物です。

 Arduino UNOのCPUのATmega328Pには1kバイトのEEPROMが入っていて、不揮発な記憶領域として重宝します。でも大量にデーターを記録したい場合などは容量不足になるので、こういう外付けチップを使うと便利です。

▼回路図
ArduinoへI2C EEPROM接続回路
 Arduino UNOにI2C EEPROMを接続した回路です。文章で説明してもいいのでが、回路図書いたほうが間違いが無いです。

▼ブレッドボードで動かしてみる
ブレッドボード

 ここで必要になるのがテスト用のプログラムです。ネットを探すと先人の方が作られた作品がいろいろ出て来ますが、それらを参考に自分の好みに合わせて作ってみました。

▼I2C EEPROM動作確認用のスケッチ

/*
* I2C EEPROMの読み書きテスト
* 対応素子:24LC32, 24LC64, 24LC128, 24LC256, 24LC512
* 2015/06/24 ラジオペンチ http://radiopench.blog96.fc2.com/
*/

#include <Wire.h> //I2C ライブラリ

unsigned int startADR = 0x0000;
unsigned int endADR = 0x1FFF; // アドレス上限指定 (24LC64なら0x1FFF)
unsigned int ADR;
byte data;

void setup() {
Wire.begin();
Serial.begin(9600);

/*   // EEPROMに値を書き込みたい場合はコメントアウトを外す
Serial.print("Writing");
for (ADR = startADR; ADR <= endADR; ADR++) { // 全アドレス範囲に
data = ADR >> 3; // アドレスを適当に細工してデーターを作る
i2cEEPROM_write( 0x50, ADR, data); // データーを書き込む(アドレス/256の値)
if ((ADR & 0xFF) == 0) {
Serial.print('.'); // 書き込み進行中表示
}
}
*/ // ここまで

Serial.println();
Serial.println("EEPROM dump");

for (ADR = startADR; ADR <= endADR; ADR++) { // 全アドレス範囲をダンプ
if ((ADR & 0x00FF) == 0x00) { // 256バイト毎に
Serial.println(); // 一行開ける
}
if ((ADR % 16) == 0) { // 行の先頭なら
printADR(ADR); // アドレス表示
}
data = i2cEEPROM_read(0x50, ADR); // 外付けEEPROMから読み出し
Serial.print(data >> 4, HEX); // 上位4ビットを16表示
Serial.print(data & 0x0F, HEX); // 下位4ビット
Serial.print(" "); // データ間にスペース入れ
if ((ADR % 16) == 15) { // 行末なら
Serial.println(); // 改行
}
}
}

void loop() { // 無限ループで停止
}

void i2cEEPROM_write(int i2cADR, unsigned int eeADR, byte data ) {
Wire.beginTransmission(i2cADR); // i2cアドレス指定
Wire.write((int)(eeADR >> 8)); // EEPROM内アドレス指定 MSB
Wire.write((int)(eeADR & 0xFF)); // LSB
Wire.write(data);
Wire.endTransmission();
delay(5); // 書き込み完了待ち
}

byte i2cEEPROM_read( int i2cADR, unsigned int eeADR ) {
Wire.beginTransmission(i2cADR); // i2cアドレス指定
Wire.write((int)(eeADR >> 8)); // EEPROM内アドレス指定 MSB
Wire.write((int)(eeADR & 0xFF)); // LSB
Wire.endTransmission();
Wire.requestFrom(i2cADR, 1); // 1バイトデータリクエスト
while (Wire.available()) { //
data = Wire.read(); // データ受信
}
return data;
}

void printADR(unsigned int a) { // アドレスを4桁表示
String b = "";
if (a < 0x1000) {
b = "0";
}
if (a < 0x100) {
b = "00";
}
if ( a < 0x10) {
b = "000";
}
Serial.print(b);
Serial.print(a, HEX);
Serial.print(" ");
}

 プログラムの最初のコメントアウトしてある部分(18~7行)でEEPROMにデーターを書き込んでいます。書き込むデータはアドレスの値に細工して作っています(21行)が、ここはいろいろな方法(式)を試すと面白いと思います。なお1バイト書くのに約5msかかるので、8kバイトのチップ全体に書き込むには40秒くらいかかります。

 プログラムの後半の部分でEEPROMの全データーをシリアルにダンプするようになっています。

▼表示例
EEPROM dump

0000 00 00 00 00 00 00 00 00 01 01 01 01 01 01 01 01
0010 02 02 02 02 02 02 02 02 03 03 03 03 03 03 03 03
0020 04 04 04 04 04 04 04 04 05 05 05 05 05 05 05 05
0030 06 06 06 06 06 06 06 06 07 07 07 07 07 07 07 07
0040 08 08 08 08 08 08 08 08 09 09 09 09 09 09 09 09
0050 0A 0A 0A 0A 0A 0A 0A 0A 0B 0B 0B 0B 0B 0B 0B 0B
0060 0C 0C 0C 0C 0C 0C 0C 0C 0D 0D 0D 0D 0D 0D 0D 0D
0070 0E 0E 0E 0E 0E 0E 0E 0E 0F 0F 0F 0F 0F 0F 0F 0F
0080 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 11
0090 12 12 12 12 12 12 12 12 13 13 13 13 13 13 13 13
00A0 14 14 14 14 14 14 14 14 15 15 15 15 15 15 15 15
00B0 16 16 16 16 16 16 16 16 17 17 17 17 17 17 17 17
00C0 18 18 18 18 18 18 18 18 19 19 19 19 19 19 19 19
00D0 1A 1A 1A 1A 1A 1A 1A 1A 1B 1B 1B 1B 1B 1B 1B 1B
00E0 1C 1C 1C 1C 1C 1C 1C 1C 1D 1D 1D 1D 1D 1D 1D 1D
00F0 1E 1E 1E 1E 1E 1E 1E 1E 1F 1F 1F 1F 1F 1F 1F 1F

0100 20 20 20 20 20 20 20 20 21 21 21 21 21 21 21 21
0110 22 22 22 22 22 22 22 22 23 23 23 23 23 23 23 23
0120 24 24 24 24 24 24 24 24 25 25 25 25 25 25 25 25

以下、指定番地までダンプ

 EEPROMの全領域をダンプ表示するプログラムは、何か問題が起きた時の調査ツールとして役立つと思います。

 このプログラムは24LC64用に書いてありますが、アドレシング方法が同じ24LC32, 24LC128, 24LC256, 24LC512でも使えるはずです。但しアドレス上限を指定している endADRの値(10行目)は修正が必要です。

▼I2Cバスの波形
I2Cバス波形
 1バイト読み出す時の波形で、上がクロック(SCL)、下がデータ(SDA)波形。読み出しに500μsちょっとかかっています。

▼波形拡大
波形拡大
 クロック周期は10μs、つまり100kHzで動いていました。この速度にプルアップ抵抗の1kΩは充分に効いていて、綺麗な波形です。

◆まとめ
 ということで、I2CインターフェイスのEEPROMを動かすことが出来ました。

 このチップにはページ書き込みや連続読み出し機能など、高速で読み書きを行う機能が付いています。でもそういうのは、めったに使うことは無さそうなので、テストプログラムは省略しました。本当にそういう機能が必要になった時にプログラムを作れば充分だと思います。またArduinoで動かす場合、素子の速度の限界まで使い倒すなんてことはあまりやらないと思います。
カレンダー
05 | 2015/06 | 07
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 - - - -
プロフィール

ラジオペンチ

Author:ラジオペンチ
電子工作を中心としたブログです。たまに近所(東京都稲城市)の話題など。60過ぎて視力や器用さの衰えを感じつつ日々挑戦!
コメントを入れる時にメールアドレスの記入は不要です。なお、非公開コメントは受け付けていません。

記事が気に入ったらクリックを!
最新記事
カテゴリ
最新コメント
リンク
FC2カウンター
検索フォーム
月別アーカイブ
RSSリンクの表示
QRコード
QRコード