« 2020年4月 | トップページ | 2020年6月 »

2020年5月

2020年5月29日 (金)

オムロン製24時間タイマー「H2F-D」、アウトに

ガレージ仲間のFJKW君からのhelp。
「ゴム材プレスの制御盤を毎朝自動起動してるタイマーがアウトやねん」
「なんかしら、時間が遅れよんねん」
「なんとかして」っと。

モノはオムロン製 H2F-D 24時間デイリータイマー
しかし、生産終了品で同じものは入手できず。(2015年3月受注終了)

11_20200529163901

↑のように、朝5時半にタイマーがオンして、プレス機のヒータを余熱。
夕刻6時までオンを維持。こんな設定で運転してます。
制御盤は背の高さほど。
ヒータ用のごっついケーブルが出入りしてます。

工場が翌日休みの時は、盤の自動起動スイッチをオフして作業終了。
作業再開の時は、前日の晩にスイッチをオン。
そうしておけば、朝、勝手にヒータが温もっていて定刻から作業開始できるという仕掛けです。
土日月火~金と曜日ごとに設定できる週間タイマーは、休日やら土曜仕事の設定替えをするのが面倒とのことで、却下。

このタイマー、クォーツ式でして電池が内蔵されています。
停電でもちゃんと計時されます。 エラい!

オムロンで代替品を探しますと・・・みんな液晶表示でデジタル設定タイマー。
アナログのほうがエエ」というリクエストなんで、探しますとパナソニックで見つかりました。
昨晩、工場が止まってから交換作業を完了。

で、持って帰ってきたこの不良品のタイマー、何がおかしいのかバラしてみました。
まず・・・
バックアップ用の電池がアウト。
粉を吹いていました。

12_20200529163901

でも、これは停電時用のものなんで、時間遅れには関係ありません。
  (制御盤そのものは常時通電してるんで)

解体を進めますと・・・
基板の様子
13_20200529163901
部品面
16_20200529163901

ギヤの最終段。
14_20200529163901

不調の原因はこれでしょう。
駆動軸の2段目ギヤ(樹脂製)が劣化して軟化してました。
14a

ピンセットで軸から抜いてみると。ヤワヤワです。
簡単にばらけてしまいました。

15_20200529163901

どうやらこれが時間遅れの原因のようです。
古~い制御盤です。
このタイマーも、昔に一度交換したとのこと。
今回が2度目だと。

※似たような話
2019年2月27日 修理不能:松下電工製「ダイヤルタイマー」

| | コメント (3)

2020年5月28日 (木)

新型コロナ、緊急事態宣言解除後・・・

緊急事態宣言が解除され、ご近所の居酒屋さんにも活気が戻ってきている様子です。

  ※コロナで「集まるな!」っと言われても、ガレージには人がやってきて
   ました。来る人は決まってますんで家族のようなもの。

ちょっと過去記事を見てますと、こんなことを書いてました。
パンデミックというか、人類滅亡、文明崩壊関連。。。

2007年04月13日:「史上最悪のインフルエンザ・忘れられたパンデミック」
   まっとうな本。

2016年12月09日:「ロマノフの十字架」
   これは・・・「この本、読む気が失せました。」っと

2018年01月21日:撃墜された~  インフルB
   年に一回はヤラレてます。

2018年12月04日:『新・人は皆「自分だけは死なない」と思っている』
   防災関連。

2013年06月29日:「宇宙から恐怖がやってくる! 」
   これこそ人類滅亡。

2011年01月28日:火山:霧島・新燃岳
   地震、原発、台風、パンデミックと来たから次はコレか。

2016年04月20日:火山のパワー

2011年01月28日:火山:霧島・新燃岳

2007年10月04日:「まさかの墜落」

2006年09月01日:「失敗百選」

2011年05月19日:SimCity…メルトダウン

2010年01月24日:「軽石」「東京発掘物語」


コメント先も・・・
2006年9月3日:パンデミック - なんぎな日記


その後の2020年3月29日:BCGと新型コロナ が気になります。

| | コメント (0)

2020年5月23日 (土)

教訓:工具箱にヒューズを

今日の修理依頼はバネ工場の機械。
原因は簡単なものだったけど、回路図無しでのトラブルシュート。
制御の電気回路を知ってないと追いかけられないだろなぁ。

で、機械が動かなかった主原因は制御盤内ヒューズの断線。
飛ばしたのは依頼先のミス。
回路図無しでそれを見つけるのが一苦労。
  ガラス管ヒューズ、ぱっと見では切れてるか
  どうかが分かりません。

交換のための同スペックのヒューズをたまたま依頼先が
持ってたから良かった。
 (どっかに有るはずと、探しまくってくれた)

制御盤のトラブルで現場に出る時は「工具箱に予備ヒューズを」
っというのが今日の教訓。

※スカタンを考えて、テスター用のヒューズも。かな。
 テスター内に予備ヒューズが入ってるのばかりじゃ
 ないんで。


| | コメント (0)

2020年5月21日 (木)

JIS C8708:2019充放電実験回路

バックアップがわりにJIS C8708:2019充放電実験回路とそのスケッチ(Arduino-UNOのブートローダーを焼いたATmega328Pで動かしている)をアップしておきます。

まず回路図。
Baycyc3b
これまでどおり、24V→5VのDC-DCコンバータを乗せています。
その理由:
・回路を置く作業ラックにDC24Vの電源が来ているから。
   FA用途の回路をテストしたりするんで、その絡み。
・0.5C充電の必要から、基板にDC5Vを直だと電流が大きくなり、
 電源配線でのドロップが気になるから。
ということです。
5V電源を基板そばに置き、電源配線を端子台などでしておけば
DC-DCコンバータは不要でしょう。

ICが6つ。抵抗が35本。コンデンサ27個。スイッチ3つ。
液晶が一つ。ヒートシンクに付けたパワーMOS-FETが二つ。
むちゃくちゃ大がかりな回路じゃありません。

そしてこれがスケッチ。 ダウンロード - batcyc3c1.zip
ファイルタイプを「ino」ではなく「c」にしています。
  inoだとArduinoのIDEが立ち上がってしまうんで。

設定パラメータ、前のよりちょい増やしています。
制御の操作で充放電の実行を中断した時、以前のバージョンでは
これを再開させる方法がありませんでした。
  (もういっぺん最初からになってしまう)
ちょっと不便なんで、「何サイクル目の充電あるいは放電から再開する」
という設定を設けておきました。
 "32 Brk cyc(50)"; 中断再実行時のサイクル (1~50)
 "33 Brk cnt(8)";  中断再実行時のサイクルカウント (1~8)
 "34 Brk dcg/chg"; 中断再実行時の放電(0),充電(1)区分
普通に最初から試験する場合はそれぞれに「0」を入れておきます。
cycとnct、どちらも0以外のときに試験再開の処理を行います。

| | コメント (0)

2020年5月20日 (水)

富士通HR-3UTC(1900mAh) JIS C8708:2019充放電実験開始

JIS C8708:2019充放電実験回路、3台体制でになり、
富士通HR-3UTC(1900mAh)の充放電実験、今日からスタートです。

11_20200520150801

初期の内部抵抗15mΩ。

5月11日に開始した富士通の黒:2450mAh は現在52サイクル目。
まだまだこれからです。
はてさて。

| | コメント (2)

2020年5月19日 (火)

パナソニックeneloopスタンダード単3 JIS C8708:2019充放電実験210サイクル目

4月6日にスタートした「パナソニックeneloopスタンダード単3(1900mAh)」のJIS C8708:2019充放電実験、現在210サイクル目です。
2020年4月6日:パナソニックeneloopスタンダード単3 JIS C8708:2019充放電実験スタート

200サイクル目前後の充電電圧変化をピックアップしました。
C0208
順調に「-ΔV」を検出できています。
ダイソーReVOLTES単3の場合、充電開始直後の「偽の-ΔV」が顕著になってきたのが200サイクルを越えた250サイクルあたり。
250サイクル直後の充電でこの偽の-ΔVに引っかかって充電を失敗(早期に充電停止)しています。
eneloop単3、0.5C放電での放電時間も今のところ115分あたりをキープしていますし、偽の-ΔV出現の徴候は出ていません。

以前の実験、市販の急速充電器と自作の放電器(1Ωの抵抗で1.0Vまで放電)では、574回で力尽きました。

Img20150707093416015
その時の内部抵抗などはこの記事↓を。
エネループ・スタンダード、力尽きる

はてさて、どうなりますか。


| | コメント (0)

Eimac 322と日立5F20RA

こんなのがやってきました・・・・
11_20200519110401
出窓 に飾っても「コレなにや?」やし・・・
どうしましょ。

左側のほうのスペックがわからん。

| | コメント (2)

2020年5月18日 (月)

基板修理の広告にこの素材はマズイやろ

ネットをうろうろしていて画面に現れた広告・・・
基板修理の案内。
21_20200518104601

括弧付きなんですが、「基盤」はちょいとなぁ。
で、この写真。 むむ。
22_20200518104701
これ、オシロのプローブかと思ったんですが、どう見ても
昔ながらの銅製コテ先のハンダゴテを握ってまっす。

検索すると・・・「ハンダゴテを握る」 (画像検索で)
ハンダ付け作業のフリー素材があるようなんですな。

↓お姉さんのは見たことがありました。
https://nlab.itmedia.co.jp/nl/articles/1802/27/news118.html
これ↓かな
https://temita.jp/twitter/57860

こんな広告されたら・・・修理を頼みにくい(笑)


| | コメント (2)

2020年5月17日 (日)

Arduino なんとかして誤用を正したい:A/Dの1/1023とmap関数

ちょっとまとめてみました。  (関連記事へのリンクも注目)
コメント歓迎!!  ご意見、お待ちしています。

==========================

◆A/Dコンバータのスケーリング方法

Arduino-UNOの内蔵A/Dコンバータは10bit。
0x0000~0x3FF:0~1023の数値が出てくる。
この値から、
  入力電圧値を求める時
  温度センサーなどのセンサー情報を処理する時
  AnalogWriteなどに値を渡す時
などの処理でのミスが目立つ

●基本的な知識:A/D変換データの意味

10bitのA/D変換値(ADC)と入力電圧(Vin)、そして基準電圧(Vref)
は以下の関係がある。
   ADC = (Vin / Vref) * 1024
   Vin = (ADC * Vref) / 1024
つまり10bit ADCの最大値1023は、Vref電圧より「-1LSB」だけ
小さい入力電圧(以上)の時に発生する。
変換値1023はVrefではない。
「Vref - 1LSB」の入力電圧、つまり「Vref * 1023 / 1024」が
ADC=1023での入力電圧となる。

結論:ADCからVinへのスケーリングは「1/1024」で計算しなけ
   ればならない。
   「1/1023」は間違いである。

※関連
2020年1月8日:ミスが広まる 1/1023 vs 1/1024


●基本的な知識:Vref電圧の実値

A/D変換器のVrefはAVCC電源(5V)、内蔵基準電圧(1.1V)、外部
基準電圧入力(AREF)に切り替えできる。

A/D変換を使って、入力電圧や温度センサーの測定値を求める
ときなどは、Vref電圧の実値が重要である。
「電源電圧 = 5V、内蔵基準電圧 = 1.1V」と決め打ちするのは
危険である。
A/D変換後、電圧や温度といった数値に直した値を評価する
時は、実際の電圧を測定し、その値をVref値とすべきである。

例えば・・・内蔵基準電圧=1.1Vは1.0V(min)~1.2V(max)と
データシートで規定されていて、1.1Vと決め打ちできないのは
あきらかである。
5Vや1.1Vで決め打ちして計算した電圧や温度、これを評価する
ときは、Vref値の誤差を含んでいるとの注意書きが必須である。
これを記していない記事は・・・「ちょっとなぁ~」

※関連
2019年3月22日:Arduinoのアナログ基準電圧入力


●間違った知識:map関数

map関数を使ってスケーリングを行う処理でのミスが目立つ。
mapは2点間の数値を元に線形補間を行う。

例えば、10bitのA/D値を8bit値に変換する時:analogReadして
analogWriteするような時、(最大値1023を255に変換する)この
ような記述を見かける。
   y = map(x, 0, 1023, 0, 255);

もともと、10bit→8bitの変換は、値を1/4するだけである。
  (四捨五入の話は別問題として)
この場合の補間式は 「y = 0.25x + 0」で、傾き1/4の線上
で 「x → y」の変換が行われる。
先ほどの「0, 1023, 0, 255」だと傾きが「255/1023」となり
本来の「256/1024」の補正線から外れる。
  256/1024 → 0.25
  255/1023 → 0.249266…

map関数の定義で、
  map(value, fromLow, fromHigh, toLow, toHigh)
   value:   変換したい数値
   fromLow: 現在の範囲の下限
   fromHigh: 現在の範囲の上限
   toLow:   変換後の範囲の下限
   toHigh:  変換後の範囲の上限
上限、下限という表記があるのでanalogRead、analogWrite
の最小、最大値を記入していると推測できる。
しかし、10bit→8bitの変換の時にその最大値を用いるのは
正しくない。

例えば、
   y = map(x, 0, 1023, 0, 255);
の時、10bitの半値である512を代入すると127が返ってくる。
正しい値は8bitの半値=128である。
また1LSB多い1024を代入しても256とならず255となってしまう。

※参考
  ・2019年4月3日:線形補間って「LERP」って言うんだ!

以下のように考えてもこれがミスであることがわかる。
この考えで8bit→10bitの変換をすると、
   y = map(x, 0, 255, 0, 1023);
と書くことになる。
これで「x=255」を変換すると「y=1023」が得られる。
一見正しいようだが(式どおりの答え)、当たり前に考えて255の
4倍である「1020」が正しい値である。

正しくは、
 10bit→8bit変換  y = map(x, 0, 1024, 0, 256);
 8bit→10bit変換  y = map(x, 0, 256, 0, 1024);
である。

10bit→8bit変換では以下の書式でも正しい値が得られる。
  y = map(x, 40, 1000, 10, 250);
「0,1024,0, 256」の直線の傾き=0.25と、オフセット=0は同じ
である。

※余談
本来のスケーリング処理は下限上限という意味ではなく、
2点の表示値(A/D値の読み)と、実際の測定値(外部電圧計など
での読み)というふうに、キャリブレーションをおこなった
結果の補正に用いる。
A/D変換回路に付随する回路、例えば基準電圧値の誤差や前置
アンプのゲイン誤差やオフセット誤差、これらを補正するた
めに線形補間を行う。

※以下の例題がおかしいのが根本原因か
http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=2743
https://www.arduino.cc/reference/en/language/functions/math/map/

※関連
2020年5月16日:Arduino 10bit A/D値をmap関数でスケーリングする例


※追記 2020-05-19
10bit→8bitの変換では数値が大きくて誤差が見えにくい。
そこで、極端な例として、3bit→2bitへの変換を考えてみる。
 map(x, 0, 7, 0, 3) …<a>
 map(x, 0, 8, 0, 4) …<b>

<a>がよく出ている例題「0,1023, 0,255」での方法。
変換前と変換後の下限値・上限値を指定している。

<b>が補間直線の傾きを考えて記したもの。
3bit→2bitなんで単純に0.5。 2で割れば良い。

結果は、
入力値 <a> <b>
 0   0  0
 1   0  0
 2   0  1
 3   1  1
 4   1  2
 5   2  2
 6   2  3
 7   3  3
----------------
 8   3  4
 9   3  4
 10   4  5
 11   4  5
 :    :
 16   6  8
 24   10  12
 32   13  16
 40   17  20

mapでは最大値を超えても変換結果が出てくる(線形補間だから)
ので、8以上の値を入れるとミスしているのが良く分かる。
また、四捨五入の問題でもないことが見える。

線形補間の式であるmap関数、「map(x, 0,1023, 0,255)」は
10bit→8bit変換におて根本的に間違った使い方をしていること
がわかっていただけたであろうか。


※さらに追記

英文のArduino Reference
https://www.arduino.cc/reference/en/language/functions/math/map/
を見てみると、
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Notes & Warnings

As previously mentioned, the map() function uses integer math.
So fractions might get suppressed due to this. For example, fractions
like 3/2, 4/3, 5/4 will all be returned as 1 from the map() function,
despite their different actual values.
So if your project requires precise calculations (e.g. voltage accurate
to 3 decimal places), please consider avoiding map() and implementing
the calculations manually in your code yourself.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
なんて書かれている。
google翻訳にかけると・・・
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
前述のとおり、map()関数は整数演算を使用します。
そのため、これにより分数が抑制される可能性があります。
たとえば、3 / 2、4 / 3、5 / 4などの分数は、実際の値が異なっ
ていても、すべてmap()関数から1として返されます。
したがって、プロジェクトで正確な計算が必要な場合(小数点以下3桁
まで正確な電圧など)は、map()を避け、手動でコードに計算を実装
することを検討してください。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
文末の「・・・yourself.」:自分でなんとかしろ!
っと言っているよう・・・

mapは悪くない。
線形補間を32bitの整数で実行している。
mapに与える数値をミスっているのが問題。

日本語解説で、下限・上限と記されているが
英文ではthe lower boundとthe upper bound 。
下限・上限としか言いようがないか・・・
数学的な言い回しだとどうなるんだろうか。

================================
それと、もうちょい。
  map(x, 0,1023, 0,255)  ・・・これが正しい例を紹介

これが、例えばA/D変換器のキャリブレーション結果で、
A/Dの値が「1023」の時にその入力電圧をテスターで計っ
てみたら「255.0mV」だった。  (精度表現のためあえて.0を追記)
この場合の変換式はこれで合っている。

このA/Dコンバータが実は10bitではなくもっと桁数が大きくって、
例えば12bitの分解能だったとする。
電圧を4倍の「1020.0mV」に上げてみると、A/D値も4倍になり
「4092」という測定結果になるはずである。(4095ではなく)
この場合のスケーリング値は「255/1023」で正しい

10bit→8bitの変換、つまり数値を単純に1/4するだけの計算で
この値を使っているからおかしいわ
けだ。

================================
  以下はコメントに対するお答え
     2020年5月17日 (日) 16時40分 タナカ さん

※map関数の中で二つの上限値を+1なんて処理をしたら、本来の
線形補間ができなくなっていまう。
mapのコードそのものは変更しなくてよい。
「下限・上限」というから間違うのか。
重要なのは変換直線の傾きとオフセット。
それを決める2点のX,Y位置。
この一次関数って、中学生の問題?
しっかりしろエンジニア!

================================
※追記 コメントに書いたが本文にも載せておく。

mapが浮動小数点を許すのなら・・・
map(x, 0, 1023.0, 0, 255.75)で解決だ。

この補正値は256.0/1024.0と同じ0.25。

================================

■関連記事ピックアップ:居酒屋ガレージ日記から

2020年5月2日:Arduino 放置したポートが及ぼす電源電流変化
2020年4月25日:Arduino やっぱり気になる放置ポート
2020年2月10日:ArduinoのanalogWrite 1/255なの?
2020年2月4日:Arduinoのタイマー OCRレジスタは「n」じゃなく「n - 1」の値を設定せよ
2013年04月25日:AVRマイコンのAREFピン
2013年05月02日:AVRマイコンのAREFピン #2

 

| | コメント (17)

2020年5月16日 (土)

Arduino 10bit A/D値をmap関数でスケーリングする例

Arduino-UNOのA/Dは10bit 。 0~1023の値が出てきます。
この値のスケーリング例題に、しばしば「map関数」が使われてます。
こんな具合・・・

  int val = analogRead(0);
val = map(val, 0, 1023, 0, 255);
analogWrite(9, val);

0~1023の値を0~255の値に置き換えようというもくろみです。 
本来は、単純に「1/4」すれば良いだけ。
   ※10bitの上位8bitを使う。 2bit右シフトで。

しかし、このmap()の値だと10bitの半値512がうまく変換できないのですよね。
128になりません。
mapは整数計算ですんで、127になってしまいます。
  ※四捨五入の話とは別問題

そこで、「map関数」を浮動小数点にしてみました。
(val, 0, 1023, 0, 255) と (val, 0, 1024, 0, 256)の違いを見てもらいましょう。

※シリアルモニターを起動していろんな数値を入力できるようにしてあります。

//  「map」を浮動小数点にしてみる

/***** mapをfloatに *****/
float mapf(float x,
float in_min, float in_max,
float out_min, float out_max)
{
return (x - in_min) *
(out_max - out_min) / (in_max - in_min)
+ out_min;
}

/***** シリアル1行入力 *****/
#define RXBF_SIZ 16 // 文字バッファ文字数
char rx_bff[RXBF_SIZ+1]; // 受信文字バッファ (+null)
byte f_rxok; // 受信データありフラグ
/***** シリアル1行受信 *****/
// CRでターミネート f_rxokを1に
// BSで1文字戻す
// 1行文字入力に使えるSerialEventというのがあるらしいが・・・
void rxbff(void)
{
static byte cnt = 0; // 受信文字数
char c;
if(Serial.available()){ // 受信データあり
if(f_rxok == 0){ // 前データ受信処理した
c = Serial.read(); // 1文字読み出し
if(c == '\r'){ // CR?
rx_bff[cnt] = '\0'; // nullを最後に
Serial.println(); // 改行
f_rxok = 1; // 受信成功
cnt = 0; // 最初から
}
else if(c == '\x08'){ // BS?
if(cnt > 0){
cnt--; // 1文字戻す
Serial.print("\b \b"); // BS,space,BS
}
}
else{ // 文字
if((cnt < RXBF_SIZ) && // バッファサイズ内
(isprint(c))){ // 表示可能文字0x20~0x7E
Serial.write(c); // エコーバック
rx_bff[cnt] = c; // バッファに入れる
cnt++; // 1文字進める
}
}
}
}
}

/***** SET UP *****/
void setup()
{
Serial.begin(9600);
Serial.println("Test float-map");
}
/***** LOOP *****/
void loop()
{
float d;
while(1){
rxbff(); // 1行受信処理
if(f_rxok){
d = atof(rx_bff);
Serial.print("float-map:");
Serial.print(mapf(d, 0,1023, 0,255), 4); // ★1
Serial.print(" ");
Serial.println(mapf(d, 0,1024, 0,256), 4); // ★2
f_rxok = 0;
}
}
}

/***** 結果 *****
10bit→8bitの変換なんで単純に1/4したら良いだけ
それを0~1023→0~255で変換するものだから・・・
Test float-map
0 0はゼロ
float-map:0.0000 0.0000
1023 1023は255
float-map:255.0000 255.7500
512 半値の512は違いが出る
float-map:127.6246 128.0000
4 4/1024も
float-map:0.9971 1.0000
8 8/1024も
float-map:1.9941 2.0000
12 12/1024も
float-map:2.9912 3.0000
1020 1020/1024も
float-map:254.2522 255.0000
*****/

いかがでしょうか?

この10bit A/D値を元にした勘違い、むちゃ広まっていますよ。
入力の最小・最大を0~1023にするから端数が発生。
たとえば、map(val,  40, 1000,  10, 250) っと中間値の
ポイントを指定してもミスなく計算してくれます。 →線形補間
map関数は、入力値に対するリミットを処理していませんので、
mapの中で指定するin_min、in_max(最小・最大)を越えても
正しく計算してくれるのに0~1023が最小・最大だと思ってしま
うからややこしい。
困ったことです。

本来、10bit→8bitのスケーリングでの定数は「256/1024 = 1/4」。
傾き「1/4」の直線に乗っています。
  「y = ax + b」   a=0.25b=0

それが map(val, 0, 1023, 0, 255)だと補正直線の傾きが
255/1023」。
  a=0.249267  ・・・補正直線の傾きが異なります
これ、数学というより算数。

この間違い、誰か、どないかしてほしい!!!

※関連
2020年1月8日:ミスが広まる 1/1023 vs 1/1024
2020年2月10日:ArduinoのanalogWrite 1/255なの?
2019年4月3日:線形補間って「LERP」って言うんだ!

| | コメント (2)

2020年5月15日 (金)

Arduino-UNO + SDカードでシリアルデータロガー 完成形 今度こそ

2020年4月24日:Arduino-UNO + SDカードでシリアルデータロガー 完成形 の続き。
   (↑まだ完成じゃなかった)
回路図。
Sd1

2つのシリアル入出力のコネクタ部を変更。
・TX出力はパラ出し。 同じものを出力。
・RX入力はダイオードを入れてパラに。
  (同時入力はできないけれど)
・ハード的にエコーバック。

JPでエコーバック(制御ソフトでの)の有無を切り替えられるよ
うにしたけど、文字抜けの危険性があるので、RXD→TXDと
マイコンからのTXDをダイオードで合成。

バックアップ代わりのスケッチ:ダウンロード - rxbff_sd1a2.zip
   ※ファイルタイプを「.ino」ではなく「.c」にしてます。

 

| | コメント (0)

2020年5月14日 (木)

近接スイッチが壊れた!

ご近所の工場からのHELP。
「近接センサーが壊れたようだ・・・」

自動機の位置決めで使われている近接センサー。
それがアウトになって、自動運転できずというトラブル。
現場訪問前に写真を送ってもらいました。

11_20200514175001
  ↑持って帰ってきてからこっちで撮った写真

松下製。 型番が「AN9141」。

資料がないかパナソニックにメールで相談しましたら、 
  (かいつまんで)
『かなり昔の松下電工時代の近接センサと思われ、残念なが
 ら仕様等の分かる資料はみつからなかった』
っと。

ということで現場へ行って実物を確認。
壊れたセンサー、ちょっと特殊なものでした。
磁気近接センサー」。
装置に同じものがいくつか使われているんで、動くものを持って
帰ってきました。
・3線式
・電源は24V。
・赤黒が電源+/-で、白が信号。
   今風のセンサー色分け、茶:+、青:-、黒:SIG
   これ、キライです。 これってどこから来たの?
・磁石の「N極」を接近させると反応。
・出力はNPNで負荷は電源間に。
・磁石なしで常時オン。 磁石接近でオフ。
 ということで「B接」動作。

磁石の極性はこんなツールで確認。
  2018年6月4日:磁石でオン/オフ
作ってて良かった役立つ現場ツールかと。

さて、これの代品がありません。
位置調整できる細いスライドレールに仕込んであって、
電線もその中に通してあります。

あれこれ調べたら、アサ電子工業 というところが見つかりました。
問い合わせたら「B接」への対応もOKとのこと。

ここ、オルダム継手 を作っています。
普通のカップリング、ここのを使ったことがあるような記憶が。

| | コメント (5)

2020年5月12日 (火)

ダイソーReVOLTES単3 JIS C8708:2019充放電試験(-ΔV検出有) サイクルごとの充放電時間

50サイクルごとの0.2C放電カーブ(定格で5時間=300分)よりこのグラフのほうが電池の劣化具合がよく分かるかもしれません。
毎サイクルごとの
 ・0.5C充電時間(-ΔV検出で停止)
   電池が元気な間は132分で停止。
 ・0.5C放電時間(1.0Vまで放電)
そして、
 ・充電終止電圧(-ΔV検出電圧
   元気な間は1.6~1.7Vくらいまでで止まってる。
   ヘタってくると振れ幅が大きく。
   周囲温度変化の影響も大。

この3データの変化を示しています。
V517_20200512173401  

50サイクルごとの放電グラフはこんな具合。
G500

充放電サイクル数で見比べてみると・・・
 ・100回までは初期性能を維持。
 ・150回を越えると、ちょっと劣化してきたんとちゃうか。
 ・250回で半分くらいやん。
 ・あとは惰性やで・・・

毎1~49サイクルの充放電、ともに「0.5C」となかなかの大電流。
劣化による内部抵抗の増大、この影響が大きく出てしまいます。
  ※放電時、起電圧はあっても、内部抵抗で出力電圧がドロップ。

充電時間(赤線)で特徴的なのが50サイクルごとの飛び上がり。
0.2C放電の直後、電池が空っけつということで充電時間が伸びるのでしょう。
しかし、その直後の0.5C放電での時間は延びません。
ゆっくり放電で電池を空っけつにしても、劣化しだした電池が復活するわけじゃありません。

また、「偽の-ΔV」に引っかかったので250サイクル直後。
ダイソーReVOLTES単3 JIS C8708:2019充放電試験(-ΔV検出有)250サイクル目
グラフから劣化がひどくなってきたタイミングであることがわかります。

ReVOLTESが終わって、現在進行中なのがパナのエネループ・スタンダードと富士通の2450mAh。
はたしでどうなりますか。

※追記
新しいJIS C8708:2019、これの寿命判断、JIS C8708:2013と変わらず「50サイクルごとの0.2C放電」。
この放電時間で判定します。
0.2C放電だと内部抵抗が上がっても放電はしてくれるわけで(すぐ1.0Vまで下降ということはない)「まだ大丈夫(かも)」が続きます。
ところが実際の運用では、内部抵抗の上昇で「急速充電器がエラー判定して充電できない」となってしまうのです。
JIS C8708:2019での毎サイクル1~49の0.5C放電こそが注目すべきデータではないかと思っています。
ReVOLTESの実験では、これまでどおり0.2C放電のデータは残しましたが、途中の0.5C放電はところどころしか残していませんでした。
そして・・・顕著な偽の-Δ、これが出ても市販の急速充電器は充電してくれるのか?
ここらも、実験課題かな。


| | コメント (0)

2020年5月11日 (月)

富士通HR-3UTHC 2450mAh JIS C8708:2019充放電試験 開始

2020年5月6日:ダイソーReVOLTES単3 JIS C8708:2019充放電試験(-ΔV検出有) 500サイクル目で終わります
の次に、富士通の高容量単3ニッケル水素充電池HR-3UTHC(2450mAh)JIS C8708:2019による充放電実験を始めています。

11_20200511091401

初期の内部抵抗は「17mΩ」。
  使用機材:交流定電流方式で電池の内部抵抗を計ってみる

電池に巻き付けているのは温度センサーLM35。
それを電池電圧とともにチャートレコーダー で記録。
12_20200511091401

今朝出社したら8サイクル目の充電が終わったところ。
7サイクル目のデータ、充電電流0.5Cでの充電時間が125分(-ΔV検出による充電停止)。
0.5Cでの放電時間が116分。
容量的には定格の97%。
2450mAh→2368mAhとちょっと損した感じ。

※0.5C=1225mAという大きな電流だから電池の電池ホルダー
 電極での接触抵抗や内部抵抗の影響が大。
 もう一つの回路で実験中のエネループ・スタンダード
 の7cyc目の時間を見てみると、充電ジャスト120分、
 放電112分と似たような感じ。
 エネループ・スタンダード、150サイクル目でも、
 充電127分/放電116分と健闘中。

大容量のニッ水電池で「これはいいぞ」というのに出会ってない
ので、今後の変化が楽しみ。


※参考
■■■ 電池あれこれ ■■■
東芝「THE IMPULSE」 TNH-3G JIS C8708試験その後
ダメな子電池「エネループ・プロ」JISの耐久特性
充電条件を変えたエネループ・プロのJIS耐久試験(800回目)


| | コメント (0)

2020年5月 9日 (土)

SDカードの消費電流と受信割込バッファの増大

ハイサイド電流測定回路を使ってArduino-UNO + SDカードでシリアルデータロガー 完成形 の消費電流(SDカードアクセスの時、瞬間的に電流が流れる)を見てみました。

9600bpsで垂れ流しの受信電文をログしています。
一時バッファ(まとめてSDカードに書き込むためのバッファ。シリアル受信割込バッファとは別)は320バイト。
ですんで、連続受信していると330msくらいでこの一時バッファがいっぱいになり、SDカードへのアクセスが発生します。
そして、その書き込みバイト数を数えていて、まとまったらSDカードの「フラッシュ」を実行。
この時に電流が流れて、少々長い待ち時間が発生します。

オシロ波形のch1がSDカードへのアクセスが発生した時に出すパルス。
ch2がそのアクセスランプ(Lで点灯)で、シリアルデータを読み取った時(Serial.read→一時バッファへ)にも光らせています。
ch3が電流波形で1divが20mA。

01_20200509091001
↑では、ざっと100msの処理時間が発生。
この間の受信処理は割り込みが頼りです。


アクセスしているところをちょい拡大。
02
9600ボーでの受信処理パルスが判別できます。
時間軸1div 20msに20発ほど。

SDカード処理完了直後を拡大してみると・・・
03_20200509091101
カード処理完了直後、処理中に受信バッファに溜まったデータをまとめて読み出して一時バッファに保存している様子が見えます。

ここでの問題。
・SDカードアクセス処理中のシリアル受信データの確保は、
 受信割り込みに頼るしか無い。

・受信バッファのデフォルトが64バイト。
 1文字1msとしてざっと64msぶん。

・SDカード処理時間以上の受信割込バッファサイズの増大が必要。
 さもないと受信データを失ってしまう。

・SDカードの処理がどのくらいの時間か調べてみると・・・
  ・昔の1G、2GのSDカード 100~140ms
  ・x4速のSD HC  30~35mS
  ・x10速のSD HC  15~20mS (瞬間的な電流が増える)
    ※遅いカードは64msをはるかに越える。
     カードにあるフォルダやファイルの状態でも
     処理時間が変わる(長くなる方向で)

・受信割込バッファサイズの増大方法、ネットであれこれ調べたら・・・
   HardwareSerial.h の中の
   SERIAL_RX_BUFFER_SIZE の設定値を大きくすれば良い。
   どこにある HardwareSerial.h を触れば良いかが問題。
   私とこの現状環境では、
   C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino
   だった。 ※これ、あれこれあるみたい
   うまく行ったかどうかは↓として確認出来る。
    Serial.println(SERIAL_RX_BUFFER_SIZE);

SDカードの処理区分ごと(busy待ち)に受信処理を走らせる、自前のSDカード処理を書けば良いのでしょうが・・・
受信割込バッファサイズを大きくするより方法がありません。
現在256バイトに設定しています。


◆ネットにあるArduinoのSDカードロガー製作例を見て感じる問題点を少々。

・SD.begin(chipSelect))をsetup()内で一回きり。
だもんで、
・運転中はカードは抜いてはいけない。
・カードを抜くのはいったん電源オフしてから。
・電源をオンしたままでのカード挿入もできない。
・カードの交換も無理。
・ログの書き込み動作を一旦停止する方法があるか?
・もしそれがないと、いつ電源を切ったらよいの?
   (いつ書き込みが行われるのかわからない)
・シリアルデータを記録するものなら、受信データ線のコネクタ
 を抜いて対処か。

こんなあんなで、作ってみたのが
Arduino-UNO + SDカードでシリアルデータロガー 完成形
  ↑からも、エコーバックの有無を設定するジャンパーを増やしたりと、ソフトは変えてます。
エコーバックすると、送信側にも受信と同じだけの割り込み処理バッファが必要なので。

| | コメント (0)

2020年5月 6日 (水)

ダイソーReVOLTES単3 JIS C8708:2019充放電試験(-ΔV検出有) 500サイクル目で終わります

偽の-ΔVに惑わされたりしましたが、ダイソーReVOLTES単3 の「-ΔV検出有」でのJIS C8708:2019充放電試験を500サイクル目で終わります。

11_20200506101001

「-ΔV検出有」での放電グラフはこのように。
G500
同じJIS C8708:2019ですが、-ΔVではなく「132分充電」ではこんなグラフ。
0400a
JIS C8708:2007(2013)でのゆっくり充放電だとこんな具合。
R1000_20200506070501

市販の充電器(BQ-390)と自作放電器(1.0Ω抵抗での放電)での充放電サイクルはこんなグラフ。
Rev300_20200506070601
実験終了後の電池の内部抵抗309mΩまで上がっていました。

JIS C8708:2019充放電試験(-ΔV検出有)での充放電サイクル、充電は-ΔV検出 、放電は1.0Vまでと電池の状態で充放電時間が変化します。
実験開始直後、電池が元気な時は1日あたり6回くらいの充放電サイクル。
それが、
  200サイクル目 7回/日
  300サイクル目 12回/日
  400サイクル目 17回/日
  500サイクル目 19回/日
と、1サイクルあたりの時間がどんどん短くなってきます。

充放電サイクルが進むごとに内部抵抗が増大。
放電のとき、早くに1.0Vまで到達。
まだエネルギーは残ってるけど電圧ドロップで引き出せない状態に。
-ΔV充電では、出て行ったエネルギー分だけ充電。
サイクル時間が短くなる現象の理由、こんなところでしょう。

この電池の寿命、内部抵抗の増大が大きな原因かと。
定格1300mAhの電池ですんで、1~49サイクルでの0.5C放電の電流は650mA。
内部抵抗が0.3Ωだとすると、充電が始まっていきなり0.2Vほどのドロップが生じます。
50サイクルごとの0.2C放電は0.26A。この場合はざっと0.08Vのドロップ。
グラフから、元気な時との寿命末期の電圧差で内部抵抗の増大が推測できるのでは。

JIS C8708:2019充放電試験、寿命末期になってくると十分に放電されないため充電時間も短い。
そのために、「サイクルをかせげる」状態が続くのでは。
JIS C8708:2007(2013)では、充電しすぎで電池を痛めている感じがしました。
JIS C8708:2019では50サイクルごとのゆっくり充放電の結果だけではなく1~49サイクルでの状態も参考にすべきかと。
日常の急速充電器を使っての充放電では、1~49サイクルの結果が寿命になるわけですから。


あと、1~49サイクルでの0.5C充放電時間の変化をまとめてみます。
          ↓
  ※ReVOLTESサイクルごとの0.5C充放電時間の変化 (2020-05-12)


それと、次に実験する電池を選ばなくてはなりません。
富士通の1900mAhと2450mAhのを買ってきてあるんですが、料理するの、どちらがいいですか?


※追記
もう1セットの実験回路ではパナのeneloop(スタンダード)の充放電実験(JIS C8708:2019)を続けています。
12_20200507084901
現在158サイクル目。
E150
劣化のきざし、まったく無し。
放電持続時間も、ほぼ300分:5時間で「0.2C放電」ぴったし!という性能。
  ※電圧スケールの上端、ReVoltesでは1.4Vでしたが
   あえて1.5Vにしています。

※eneloopに関し追記(2020-06-01)

現在273サイクル目。
250サイクル目に実行した0.5C放電のグラフが得られましたが、
↑のとほぼ同じ。
劣化にきざしはありません。
気温が上昇してきたせいか、放電開始時の電圧が少し上がってまして
絶好調という感じです。

富士通の黒/白も「面白いデータが出てきた」というところまで
充放電回数が進んでいません。
  黒:118サイクル目  白:58サイクル目

さて、新JIS C8708:2019による充放電、どうなりますか。


| | コメント (0)

2020年5月 5日 (火)

修理:文化シャッターのリモコンSTX8901G

過去あれこれ電動シャッター用リモコンを修理しています。
  ※さまざまな電子機器の修理依頼について:(有)アクト電子

その多くの故障が電池の液漏れ。
アルカリ電池を使っていると、ひどいのに出くわします。

今回は文化シャッターのリモコン。STX8901G。
11_20200505105401
CR2032リチウム電池で動きます。
2台やってきまして、どちらも作動せずという症状。

まず1台。これは電波が出てませんでした。
発振回路から追いかけますと・・・
水晶発振子の片足につながるパターンが剥離。

12_20200505105401

21_20200505130601
22_20200505130601

リモコンを落下させた衝撃かなにかでしょう、足のハンダ2点でしか固定されていなかったのが原因かと。
水晶のツバを基板に落とし込めるように溝穴がつくってあります・
水晶を基板に接着、あるいは外装を基板GNDにハンダしておけばこうはならなかったのにと。
この水晶発振子の周波数、なかなかのもの。
最終的には310MHz台の電波になるんですが・・・

もうひとつの故障はマイコンの動作クロック源になっているセラロック。
これが倍の周波数で弱々しく発振してました。
13_20200505105401
発振レベルが足らなくてマイコンが動いていない感じ。
倍の周波数でというのも、初体験の故障かな。
400KHzの手持ち品が無かったので、一般的な455kHzのセラミック発振子に付け替えてみました。
そしたらちゃんとしたレベルで発振して動作しだした(電波の変調音が聞こえる)のでこの発振子が原因と判断。
さて問題は400kHz品の入手。
  ※ムラタ、もう作ってないようなんですが・・・
あれこれ探したら aitendo さんで発見。
2台とも無事に修理完了。
依頼主さんところでの動作確認もok。

このリモコンの変調はAM。
14_20200505105401

MAX4003を使った電波チェッカ で変調音が聞こえます。
東洋シャッター電波リモコン TS-2C はFM。
だもんで電波が出ていることはわかりますが、変調音は聞こえません。


| | コメント (2)

2020年5月 2日 (土)

Arduino 放置したポートが及ぼす電源電流変化

2020年4月25日:Arduino やっぱり気になる放置ポートで、未処理のI/Oポートに関して「やっぱりあかんやろ」っと意見しました。
入力回路のシュミットゲート、入力電圧がスレッショルドに近づいた時、具体的にどのくらいの電流が流れるのか電源電流の変化として計ってみました。

そのためのツールがこれ。

Ina1

11_20200502175601

2019年3月29日:TIの電流検出アンプ
2019年5月14日:TIの電流検出アンプ 入荷 置き換えてみた

で紹介しました「INA199」。
このゲイン50倍のICを使って電流検出回路を作りました。
電源のハイサイド側に入れて電流を測定します。
電流検出抵抗を1Ωにすれば、出力電圧0.1Vで2mAの電流が測定できます。

Arduino-UNOのATmega328Pにこんなスケッチを書きます。

void setup() {
  PORTB = 0b00000000;   // data off
  DDRB = 0b00111110;   // PB5~PB1出力 PB0入力
  PORTC = 0b00000000;   // data off
  DDRC = 0b00111111;   // PC5~PC0
  PORTD = 0b00000000;   // data off
  DDRD = 0b11111111;   // port指定
}
void loop() {
  cli();     // 割り込み禁止
  while(1){    // PB0の状態をPB1に出力
    if(PINB & (1 << PORTB0))  PORTB |= (1 << PB1);
    else            PORTB &= ~(1 << PB1);
  }
}

PB0だけを入力にして他のポートは全部出力。
そして、PB0を入力してその状態をPB1にコピー。
PB1をオシロで見ると、PB0のH/L状態(スレッショルドを越えるか)がわかります。
CPUはUNO基板から取り外して単独で実行。

PB0に発振器から三角波を入力し、その振幅とDCバイアスを変えて様子を見ます。
その結果・・・ ざっと1mA弱の電源電流変化が観察できました。

Cur000

Cur001

Cur002

Cur003

Cur004


※追加実験  入力ポートを増やす
↑のはPB0だけが入力ポート。

スケッチをこのようにしてPC0とPC1(A/D入力ポート)を入力に変更。
  PORTC = 0b00000000;   // data off
  DDRC = 0b00111100;   // PC5~PC2出力、 PC1,0入力

まず、PC0、PC1をGNDにつないだ状態でPB0に三角波(↑と同じ)。
Cur03
   オシロ、電流波形はACで観察

次に、PB0=PC0=PC1と3つをパラって三角波。
3ポートとも同じ信号を入れます。
すると・・・
Cur04
電流が増加。
それぞれのポートでシュミット回路が働いていると想像できます。

さらに、スケッチを変更。
DIDR0レジスタを操作して、PC0とPC1のデジタル入力を禁止します。
  PORTC = 0b00000000;   // data off
  DDRC = 0b00111100;   // PC5~PC2出力 PC1,0入力
  DIDR0 = 0b00000011;   // ★デジタル入力禁止
A/D変換する時、これは必須。
  これ、analogRead()が自動的にやってくれてるのか?

すると・・・
Cur05
ということに。


| | コメント (4)

Arduino ポートの初期化と通信設定

2020年4月25日:Arduino やっぱり気になる放置ポート に絡んで、ArduinoのI/Oポートの初期化、こんな方法(3ポートいっぺんに記述)を提案しました。
// I/Oイニシャル
  PORTB = 0b00011100;   // data/pull up
  DDRB = 0b00101111;   // port指定
  //     |||||+---- PB0 IO8  out 赤LED (Lでon)
  //     ||||+----- PB1 IO9  out 緑LED (Lでon)
  //     |||+------ PB2 IO10  out CS カードアクセス時Lに
  //     ||+------- PB3 IO11  out MOSI カードDI
  //     |+-------- PB4 IO12  in MISO カードDO
  //     +--------- PB5 IO13  out SCLK
  PORTC = 0b00000000;   // data/pull up
  DDRC = 0b00111111;   // port指定
  //     |||||+---- PC0 AD0  out -
  //     ||||+----- PC1 AD1  out -
  //     |||+------ PC2 AD2  out -
  //     ||+------- PC3 AD3  out -
  //     |+-------- PC4 AD4  out -
  //     +--------- PC5 AD5  out -
  PORTD = 0b10000011;   // data/pull up
  DDRD = 0b01111110;   // port指定
  //    |||||||+---- PD0 IO0  in RXD
  //    ||||||+----- PD1 IO1  out TXD
  //    |||||+------ PD2 IO2  out -
  //    ||||+------- PD3 IO3  out -
  //    |||+-------- PD4 IO4  out -
  //    ||+--------- PD5 IO5  out -
  //    |+---------- PD6 IO6  out -
  //    +----------- PD7 IO7  in SW入力 pull up

PortBとPortCがそれぞれ6ビット、PortDが8ビット。
「pinMode(1, OUTPUT);」などと一つずつ記述するのではなく、まとめてやってしまおうという方法です。
合計20ビットのポートの状態を6行で記述できます。

さて、そこで「どうしたら」というのがPortDの「RXD」と「TXD」の二つ。
PD0のRXDは受信なので入力、PD1のTXDは送信なので出力です。
ポートを初期化した後に「Serial.begin(9600);」と通信設定するのは納得できるでしょうが、通信設定した後にポートを初期化したらRXDとTXDのH/L状態がおかしくならないかという心配が残ります。

これ、心配ご無用。
シリアル通信を有効にしたら、
 ・PD0:RXD DDRDのDDD0の状態にかかわらず入力に。
 ・PD1:TXD DDRDのDDD1の状態にかかわらず出力に。
になります。
 ※この時PORTD0ビットでPD0のプルアップ制御が可能。

ですので、先にポートを初期化したい時はこんな具合に。
  PORTD = 0b00000011;  // TXD,RXD pull up
  DDRD = 0b11111110;  // RXDだけ入力 TXDはHを出力 他は出力
  Serial.begin(9600);   // 通信設定

あるいは、これでもok。
  PORTD = 0b00000011;  // TXD,RXD pull up
  DDRD = 0b11111100;  // TXDとRXDは入力 他は出力
  Serial.begin(9600);   // 通信設定

しかし、これを、
  PORTD = 0b00000000;  // portD全部Lに
  DDRD = 0b11111111;  // 出力指定
  Serial.begin(9600);   // 通信設定 TXD,RXD L→Hに
こうしちゃうと、TXDとRXDのラインに不要なLパルスが出てしまいます。
   (3uSくらいのLパルスが出現)

先に通信設定してもok。
  Serial.begin(9600);   // 通信設定
  PORTD = 0b00000000;  // TXD,RXD 0にしてもH/L変化しない
  DDRD = 0b11111111;  // 全部出力にしてもRXDは入力
この場合、後で設定するポートの初期化でTXDとRXDがLになりそうですが、ポートの出力回路がシリアル回路側に切り替わっているので、Lになってしまうことはありません。

 

| | コメント (0)

« 2020年4月 | トップページ | 2020年6月 »