2021年11月27日 (土)

EEPROM I2Cのクロックを早くすると・・・

これが「Wire」ライブラリのデフォルト、100kHz
でのSDA、SCL信号波形。
6バイトのデータを書き込んでいます。
Ee003
プルアップ抵抗は2.2kΩ。
それを400kHzにすると。
Ee001
およそ4倍に増速。

2kバイトのチップなので、コマンドにアドレスの
上位3ビットを混ぜ、その後に下位アドレス8ビット
が続きます。

ch1の波形は、書き込み開始から終わりまでの時間。
ch1がHになってSCLが出てくるまでの時間が、
関数内での前処理にかかっている時間になります。

波形を拡大。まず100kHz。
Ee004
400kHzだと波形の立ち上がりが鈍って見えます。
Ee002
SDA、SCLラインのプルアップ抵抗を大きくすると
鈍りが大きくなります。
4.7kΩにした波形です。
このくらいならまだ大丈夫。
Ee000
プルアップ、1kΩだと電流を流しすぎの感じだし、
4.7kΩで400kHzだと立ち上がりの鈍りが気になります。
その中間で2.2kΩにしました。

その後、2kバイトのEEPROMから8kバイトのFRAMに交換。
「FM24C64」になると「コマンド+アドレス上位+アドレス下位」
の順で書き込みが始まり、その後にデータが続きます。

6バイトのデータを連続書き込みすると、ページ境界で分断される
ことがあるので、たまに、2回に分けて書き込みが行われます。
その時、FRAMだと「書き込み完了待ち」をしなくてすむので、
連続書き込みがスムーズに進みます。
  ※EEPROMだと4msほど待たなければならない。

あえて「書き込み完了チェック」を入れた様子がこの波形。
      (ACK、NACKの確認)
Ee101
6バイトのうち、前半で4バイト、後半で2バイトの書き込み
をしています。

FRAMなので、後半書き込み前の待ち時間が不要になります。
1回の書き込み完了確認で済んでいる様子が見えています。
   ※FRAMを使う前提ならこの待ちは不要
EEPROMだとACkが返ってくるまで4msほど待ちが続きます。

EEPROMよりFRAMのほうが便利、というところでしょうか。


| | コメント (0)

2021年11月26日 (金)

EEPROM、 2kバイトと4kバイトの間には壁がある (24LC16で)

タクトスイッチを押してみる …何万回も その4 続き
この回路に、外付けメモリー(FRAM:強誘電体メモリ)を増設。
スケッチをゴソゴソしてました。
   ※スケッチ:基がArduinoなんであえてこう呼ぼう

手持ちのFRAMで容量が大なのが16kビット=2kバイト。
サイプレスの「FM24C16B」という型番。
  ※32kバイトのFRAMはちょい高価。
   そのうち手配しときますわ。
使い方はI2C EEPROMの24LC16なんかと同じなんですが、
I2C EEPROMには「2kバイトと4kバイトの間に壁」がありま
すんで要注意。
これをちょっとまとめておきます。

よく使うEEPROM、32kバイトの24LC256でしょうか。
しかし、このスケッチをそのまま24LC16には移せません。
アドレスの指定方法が異なるのです。

32kバイトの24LC256のアドレスは0x0000~0x7FFF15bit
2kバイトの24LC16だと0x0000~0x07FF11bitになります。

24LC256だと、メモリアドレスの2バイトをこんな具合にH,Lバイト
2回に分けてコマンド送出します。

E14

ところが24LC16(これより小さいメモリ)だと、送出アドレスは
1バイト(下位の8bit:0x00~0xFF)だけになり、アドレスの上位は
コマンドの下位3ビットに含ませて指定しなければなりません。

E12

それが、「2kバイトと4kバイトの間の壁」です。
これを理解していないと、小容量EEPROMが使いこなせません。

2kバイト以下のはデバイスアドレスの下位3bitにメモリアドレスの
上位を混ぜるのです。
E11_20211126144301
メモリの大きさで、アドレスとして有効となるビット位置が
異なります。

さらに、この「壁」が、読み出しの時にも関係してくるのです。

読み出しのアドレスも、書き込みと同じように上位側はコマンドの
下位3ビットで指定します。
続いて読み出しコマンドを送出するのですが、この時にも書き込みと
同じように、デバイスアドレスに下位3ビットを加えておかなくては
ならないのです。
  ※長いこと使ってないと、これを忘れてしまって、
   「ありゃ?」っとなってしまうわけでして・・・

E13
この処理を忘れてデバイスアドレス(0xA0)だけを読み出し
コマンドに送ってしまうと、ページ0のデータが出てきて
しまい、0x01FF~0x03FFのページ1,2,3のデータが
読み出せません。

最初のアドレス指定コマンドと読み出し開始コマンドの
下位3bitは同じ値にしておかなくてはならないのです。

4kバイト以上の24LC32や24LC64、24LC256では2バイトで
アドレスを渡すので、ここらは気にしなくてかまいません。

・4kバイト以上のEEPROMでの書き込み例
 Wire.beginTransmission(DEV_ADR); // デバイスアドレス ★1
 Wire.write(mem_adr >> 8);     // メモリアドレス MSB
 Wire.write(mem_adr & 0xFF);    // LSB
 Wire.write(data);         // 1バイトデータ書き込み
 Wire.endTransmission();      // 転送開始
 delay(10);            // 書き込み時間待ち

・4kバイト以上のEEPROMでの連続読み出し例
 Wire.beginTransmission(DEV_ADR); // デバイスアドレス ★1
 Wire.write(mem_adr >> 8);     // メモリアドレス MSB
 Wire.write(mem_adr & 0xFF);    // LSB
 Wire.endTransmission();      // アドレスを転送
 Wire.requestFrom(DEV_ADR, qty)  // qtyバイトデータ要求 ★2
 for(i = 0; i < qty; i++){     // loop
   if(Wire.available())  bff[i] = Wire.read(); // bffにコピー
 }

2kバイト以下のEEPROMの場合、★1と★2を加工しなければなりません。
そして、忘れるのが★2の処理。
これをDEV_ADRだけで実行してしまうと、欲しいアドレスのデータが
出てこずにページ0のメモリが出てきちゃうのです。

なお、連続読み出しする場合のページ境界は意識しなくて大丈夫です。
0x00FFの次は0x0100のデータが、0x02FFの次は0x0300のが出て
きます。
  ※書き込みはページサイズが関係しますんで、
   連続書き込みは別の処理が必要です。 (ページライト処理)

  ※wireライブラリ、I2Cの送受バッファが32バイトなんで、
   長大な連続読み書きは一度にはできません。

  ※ライブラリWireのI2Cクロックは100kHzで、ちょい遅い。
   24LC256は400kHzで動作ok。
   setup()内でこんな具合にして高速化。
    Wire.begin();   // 外付けEEPROM用I2C
    Wire.setClock(400000L);  // 100kHz→400kHzに ちょい早く

小容量のEEPROMやFRAMを使う時は、ちょっと注意が必要
ということで。

※表はMICROCHIPの「I2C. シリアルEEPROM ファミリ データシート」
 より。

※もうひとつ: デバイスアドレスについて
一般的な24LC256などのEEPROM、データシートを見ると
0xA0 : 0b10100000」がデバイスアドレス(制御コード)
になってます。
ところが・・・ArduinoのWireライブラにに食わせるアドレスは
0x50 : 0b01010000」。
右に1ビットシフトした値を与えます。

これ、ライブラリ「twi.c」の中で
 twi_slarw = TW_WRITE;
 twi_slarw |= address << 1;
と、address値が左シフト処理されてI2C関連レジスタに
渡されるのです。
わざわざ、「なんでこうなった?」が不明。
誰か教えて!

※参考
ArduinoでI2Cの外付けEEPROMを使う(radiopench.blog)
Arduinoで外付けEEPROMを使う 続編

| | コメント (0)

400g級文鎮:ハンダ付け補助ツール4つ

製作元の佐藤テック君、
「文鎮になりそうな端材が出たんで作ったで~」っと昨晩。

重さ410グラムで 65x50x16mm(厚み)。 同じのが4つ
  ※65mmはクリップの幅と同じ
フライス仕上げの「鉄」です。 塗装やメッキは無しで。

B11_20211126090401

端材を切り出し削り出して仕上げるのにちょい手間が
かかったんで、お代は1つ「1300円で」と。

M5のキャップボルトとワッシャ、それにゴム板
を添付します。
  ※クリップ口に接着すると、はさみこむ時に
   安定します。
  ※65mm幅のクリップはご自身で入手してくだ
   さい。

早い者勝ちです
  ※何個でもまとめてOK。
   ただ、クリックポスト(198円)の重量制限(1kg)
   超えた場合(2個までは大丈夫)はレターパック
   使います。

ご希望の方は、この記事にコメントしてください。
  (匿名でかまいません)
連絡の付くメールアドレスを記入してください。
その後、私の仕事場からメールしますのでお届け先を
返信してください。
代金+送料は到着後に振り込んで(振り込み先のメモを
同封します)ください。

文鎮:ハンダ付け補助ツール

| | コメント (4)

2021年11月24日 (水)

『で』は「でんでんタウン」ので 今冬はこの手袋で

寒くなってきました。
「手袋、なんかあるかな~」っと女房に聞いたら・・・
出してきてくれたのがこれ。
大阪日本橋「でんでんタウン」のロゴ入り手袋。

11_20211124095301
昔々、どこかでもらったものなんでしょうが、いつ頃のもの
なんでしょうね。
12_20211124095301
  ※この『で』のロゴマーク、ネットを探しても
   出てきません。

今冬の手袋は、これで行きますわ。

| | コメント (3)

2021年11月19日 (金)

タクトスイッチを押してみる …何万回も その4 続き

タクトスイッチを押してみる …何万回も その4の続き。
今朝、on/off回数98万回を越えてました。
まだ「オフ検出」(デジタル入力)は出ていません。
しかし、接点の接触状態を見ているA/D値が上昇して
いるタイミングがありました。
グラフにするとこんな感じ。

Cap21

固まって出現する傾向があるような。
  ・負荷はATmega328P入力ポートの内蔵プルアップ抵抗。
  ・Vref=1.1VにしてA/D変換。10bit。
  ・A/D値 0 と 1 を除外してリングバッファに記録。
      (200を越えるデータは捨てられる)
このままオフ検出が10回を越えるまで続けてみます。

※追記 134万回へ (11月20日朝)
Cap022
133万7千200回でA/D値が「64」まで上昇。
十分に「接触不良ぽい」事態になっていますが、まだ
デジタル入力はオフと認識していません。

こうなると、リングバッファの容量をもうちょい増やし
たいところです。
現在は200データ。
これより前のデータは捨てています。
外付けで「FRAM」を増設かな。

Twitterにスイッチを押している動画をアップ しました。
毎秒4回の「コツコツコツ・・・」。
雰囲気が伝わりますかな。

※追記 11月22日
朝、仕事場へ来たら「200万回」越え。
リングバッファの200データをグラフにすると、こんなの。
Cap25
そして、1回だけオフを検出していました。
  (リングバッファを出てしまっているので、
   グラフの範囲外)
停止条件が「10回検出」ですんで、まだまだ継続。

A/D値のピーク、1993540回目で937。
でも、ここではオフ検出していませんでした。

試しているスイッチ、「頑張っている」としか言えません。


※追記 11月24日
休み明け、オン・オフ回数が「266万回」。
2回のオフ検出」をしてました。
リングバッファに残っていたのはこんなデータ。
Cap26
今回はこれで終了。
スイッチの中がどうなっているか、これからバラしてみます。

※スイッチの中
ソレノイド駆動部とスイッチの間隔は「0.4mm」ほど。
  ※ついでのとき、隙間ゲージが買っときます。
21_20211124125601

中央より円周部の傷みが大きい感じ。
22_20211124125601
23_20211124125601
24_20211124125601
  ↑
この金属板、磁石にはくっつきませんでした。

※制御スケッチ変更予定
・10回のオフ検出で停止ではなく、1回に戻す。
・I2CのFRAM(8kバイトのが手持ちである)を使って、リングバッファを
 大きく。 200コ→1365コに。


| | コメント (0)

2021年11月18日 (木)

パナソニックeneloopスタンダード単3「BK-3MCC」60%(72分)放電で偽の-ΔV出現

パナソニックeneloopスタンダード単3「BK-3MCC」60%(72分)放電実験、
2000回に到達したのが8月29日
現在の充放電回数2600回。
放電時間はすでに72分(定格の60%)を切っています。
そして、充電開始直後「偽の-ΔV」 が出現しています。
その様子です。

E11_20211118123401

電池電圧の変化をチャートレコーダー(ナダ電子製プリンタシールド)
記録したものです。
  ※チャートレコーダー 箱に入れたのが2014年
   長期間記録のための必須ツールです。

とりあえずこのまま2800回まで続けてみます。
eneloopスタンダード単3「BK-3MCC」新JISでの寿命試験
では「1050」サイクルで実験終了。
パナソニックの製品仕様では「約600回」。

| | コメント (0)

2021年11月17日 (水)

トルクスネジはキライ!

届いた修理依頼品。
ご自身で「修理に挑戦」ということで、ケースを開封する
のに「ネジを緩めようとした」痕跡が・・・

61_20211117170601
専用工具を使わず、イジリ防止用突起をよけて
マイナスドライバーを使って回されたようです。
無理したんで、突起が曲がっちゃっています。

こうなると、専用工具がネジ頭に入りません。
ナベ頭なんで「ネジザウルス」の出番となるんですが、
プラケースの端がじゃましてはネジザウルスは使えません。
結局、こちらでもマイナスドライバー。

修理後はこれは使わず、全数、普通のナベ頭のプラスネジに
交換しちゃいました。

 

| | コメント (0)

2021年11月16日 (火)

あちゃ~。電池押さえのスポンジがモロモロに

しばらくぶりのリコーCaplio GX100用リングライト

電池の状態をチェックしておこうとフタを開けたら、
電池押さえのスポンジ(モルトプレーンという名称かな?)
がモロモロになっていて、ひどいことに。

21_20211116121101
22_20211116121101

最初は、「アチャ~ 電池の液漏れ!?」かと思ったんですが、
電池はどれも大丈夫でした。

リングライト回路図 (16LED)


| | コメント (2)

タクトスイッチを押してみる …何万回も その4

タクトスイッチを押してみる …何万回も その3の続き。
スケッチにちょっと手を加えて。

・先日の続きから。
   スイッチはそのままで換えていない。

・「10回」の接触不良検出(デジタル入力ポートでのオフ検知)
 (連続しなくても)で、異常発生と判定して停止。

・リングバッファに200回分のサイクルとA/D値をログ。
   記録するA/D値は「2以上のもの」(0と1は飛ばす)

・10bit A/D値のMSB部(空いている)を使って、接触不良
 回数を同時に記録。

・内蔵EEPROMに接触不良が生じたサイクル番号を記録。
   (10コ)

結果、こんなデータが得られました。
まず、リングバッファ(200データ)の様子。

#  cyc A/D off
 193378  2 リングバッファの先頭
 193382  3
 193904  2
  :
 193905  5
  :
 193934  4
 193936  2
 193938  4
 193939  2
 193942  5
 193945  2
 193963  2
 193988  6
 193989  6
 194016  2
  :
 199110  2
 199118  7
 199120  14
 199121  3
 199125  8
 199127  3
 199128  14
 199129  14
 199130  17
 199131  7
 199132  9
 199138  6
 199140  4
 199143  2
 199146  15
 199151  3
 199154  12
 199155  20
 199156  12
 199157  13
 199158  12
 199159  10
 199160  4
 199161  6
 199162  13
 199163  10
 199166  6
 199167  14
 199169  10
 199173  3
 199665  7
 199666  2
 199673  17
 200010  2
  :
 205996  3
 205998  2
 206005  5
 206298 1023  2 2回目の接触不良検出
 206500  2
 206510  2
 206517  2
 206518  2
 206549  2
 206668 1023  3 連続して接触不良が発生
 206669 1023  4
 206670 1023  5
 206671 1023  6
 206672 1023  7
 206673 1023  8
 206674 360
 206675 1023  9
 206676 1023 10 接触不良10回検出で停止

接触状況が悪くなっているのでしょう、2と3が多数出現
しています。(途中省略)
そして、 206668サイクルから連続して接触不良が起こりました。

EEPROMに記録した接触不良が生じたサイクル数。

#off   cyc
# 1  51745
# 2  206298
# 3  206668
# 4  206669
# 5  206670
# 6  206671
# 7  206672
# 8  206673
# 9  206675
# 10  206676

最初の接触不良、51745サイクルのは、リングバッファ内に
は入っていません。

出てきたデータをグラフにしてみました。
縦軸がA/D値。 対数目盛にしています。
右上端に固まって出ている「○」が異常検出のタイミングです。
Cap003_20211116094201
A/D値が接触抵抗を示すわけですが、今回検出したのは
大きくても2桁。

さて、新品のスイッチに換えて実験を継続します。

※スケッチ
  ・ダウンロード - sw_life_test3b.txt

※GNUPLOTのスクリプト
  ・ダウンロード - taktsw4.txt

※リングバッファのデータ:cyc数とA/D値
  ・ダウンロード - 20.txt

※試したタクトスイッチの中 (秋月の各色100コ入)
11_20211116115901
中心より外周がこすれている感じ。
12_20211116115901

このテストより先、すでにン十万回の開閉を行っています。
でも、異常停止するまでに、ちょいと回数がかかりました。
1回目と2回目の間も15万回。
なにかの拍子、接触状態が回復するのかも。
接触不良を検知した直後、ちょっとだけ開閉を休むとかしたら
もっと回数が伸びるとか。

ソレノイドの下端が押しボタンを押す力も影響しそうです。
   ※押し過ぎはきっと良くないでしょう。
「何グラムで押す」とか、うまく規制できれば良いんでしょうが、
メカ細工をどうしたものか・・・

どんなもんでしょね。

※11月17日 08時50分
昨日に交換した新しいスイッチでの試験、すでに30万回。
まだ大丈夫です。

発端はこのトラブル↓
2021年11月6日:トラブル遭遇:3点  スイッチ、プラグ、電線
回路試験用のジグで使っていた秋月のスイッチでの生じた
接触不良です。
普通に指先で押さえるんで、ン万回も押してません。
内蔵プルアップ抵抗という軽い負荷で接触不良が発生。
グニグニすればオンしていたんですが、普通の操作(指先でpush)
では反応しないということが続いたんで、交換。
そして、この実験につながりました。

なんなんでしょね。
単にon/off回数でもなさそうだし。
ハンダ付けの熱とも考えにくい。

新品スイッチの保管、ビニール袋に入れて部品箱に入れてます。
それを回路に組み込んだら、室内ですが、そのへんにほったらかし。
仕事場、そりゃたまにはパネルの穴開けで油も使いますし、潤滑剤
として「シリコンスプレー」も使います。
洗浄に「IPA」や「大阪魂」も使います。
置いてある基板には直接はかかりませんが、たまに室内で使うケミカル
用品のガスが悪さをしてるのかな?

それとも、ほんとにたまたま調子の悪いスイッチに遭遇してる?

| | コメント (2)

2021年11月15日 (月)

タミヤ★★ミニ四駆用充電池「NEO CHAMP」950mAh 開始

イジめるニッ水電池がやってきた。
EBLの単3(2800mhA)が終わったんで、次は
ミニ四駆 単3形ニッケル水素電池 ネオチャンプ(950mAh)
65_20211115151701

「黒」というとエネループ・プロ や、富士通の2450mAh
大容量電池のイメージですが、これは950mAh。
充電式エボルタお手軽モデル(1000mAh) がなんとなくもうひとつ
だったんで、「エネループ・ライト」あたりの性能が出てくれればと・・・


| | コメント (0)

«EBL 単3 2800mAh 電池イジメ終了!