« 2021年6月 | トップページ | 2021年8月 »

2021年7月

2021年7月31日 (土)

16bit A/Dコンバータ LTC2460 サーミスタ103JTを使った温度測定で・・・

502ATサーミスタを使った温度計は基準電圧外付けの
LTC1864 16bit A/Dコンバータを使っていました。
その後、応答速度の速いサーミスタ「103JT」に対応
させようとしたところ、
A-DコンバータのVref値が精度に影響をという問題が
出てきたのです。

Vrefを下げたかった理由・・・サーミスタの自己発熱
による温度測定値への影響を少なくしたかったから。

103JTの熱放散定数=0.7mW/℃
形状の大きな103AT-11では3mW/℃
高精度品103APだと1.2mW/℃
と、103JTが圧倒的に発熱に敏感なんです。
   ※そのかわりに応答が早い。

2.5VだったVrefを1.25Vにすると、サーミスタの発熱
(電力消費)は1/4に。
直列抵抗を10kΩとして、基準電圧を変えた時の発熱を
グラフにしてみました。

Cap046
直列抵抗10kΩの値が25℃のサーミスタ抵抗値と同じに
なるんで、その時が電力消費のピーク。
25℃から離れると発熱は小さくなります。
5Vで使うなんてもってのほか
2.5Vでも0.2℃ほど発熱による積み上がりが発生します。
0.1℃内に押さえようとすると、Vref=1.25Vで使いたくな
るのです。
ところがA/Dコンバータが1.25Vでは言うことを聞いてくれ
ません。

そこで、1.25Vの基準電圧を内蔵した16bit A/Dコンバータ
LTC2460を試したのですが、今度は・・・
電源電圧を5Vで使うと誤差が大きくなる」という問題に
当たります。
データシートにはこんなグラフが出ていて、
  2.7Vなら誤差は大きくないぞ
っと、訴えています。

Ltc2460_err1

しかたなしに、この温度計、A/D部をこんな具合にしました。

Tt1

A/Dのために2.7V電源を作り、5Vで動くArduinoのATmega328Pと
のインターフェースのためにレベル変換ICを入れました。

サーミスタの直列抵抗Rsに0.1%品を使うことで、無調整
(Vrefの値に関係なく)A/D値からサーミスタの抵抗値を
計算できます。
抵抗値が分かればサーミスタの「温度-抵抗値表」から
温度を求められます。
これで、無調整でそこそこの精度が出ています。

しかし「2.7Vの別電源を用意する」というのが面白くあり
ません。
Vref=1.25Vで使える5V動作の「安いA/Dコンバータ」、
これがなかなか無いんです。

試しと、LTC2460を5Vで使って「補正を行ってみる」
という方法を試してみました。

これが電源電圧を変えた時の変動です。
Ltc2460
2.7Vなら「0を中心に5LSBくらい」なのが、
5Vにすると傾きが大きくなり、60LSBくらい。
60/65536はざっと1/1000。
これでは、16bit A/Dコンバータの値打ちがありません。

結論を出すには早いのですが、ざっと・・・
 ・2点キャリブレーションでは、ちょいと精度が不足。
 ・1kΩ:20kΩで合わせると、25℃に近いところの0.1℃桁
  はピッタリだが、60℃ほどのところで0.1℃ほど低くなる。
   ※温度が高くなるということは抵抗値が小さくなって
    A/D値の読みも小さくなる。
 ・サーミスタの精度を生かすためにも、抵抗値として0.1℃
  は合わせ込みたいけれど、ちょい能力不足か。

cal点を4点くらいにするか、無理に16bit A/Dを使うより、
素性の良い12bit A/Dを使う方が良いかもしれません。

※参
ピピちゃん温度計・ヒータ制御 (Arduino  103JT  Vref=1.1V)

・103JTサーミスタの抵抗値変化と16bit A/Dで取り込んだ
 時のA/D値の変化
2a
抵抗値は「対数グラフ」で右肩下がりに。
温度が上がるほど、A/D値のちょっとの変化が
温度の変化につながります。

25℃~26℃の1℃差だと
 「10000.00Ω~9629.63Ω」で 抵抗値差370Ω
 A/D値が「32768~32149」で 差は619

温度が上がって70℃~71℃だと
  抵抗値が「2224.00Ω~2159.31Ω」で 差は65Ω。
  A/D値が「11923~11638」で 差は285

25℃付近だと0.1℃変化するときのA/D値の変動は「60」くらい。
それが70℃あたりになると「28」ほどで0.1℃変化しちゃいます。
温度が高いほうがA/D値の変化に敏感になるわけです。

16bit A/Dですんで60だとフルスケールの0.1%ほど。
28だと0.04%。 なかなかシビアです。
  12bit A/Dの1LSBが0.024%ですんで。

| | コメント (2)

2021年7月30日 (金)

ステッピングモータを「ゆっくり回す」

とある回転角センサーの様子を見る(仕事絡みのトラブルシュート)
ために作った「ステッピングモータをゆっくり回す回路」です。

Pg_stp_mot1

C-MOSのVCO・PLL IC、4046のVCO部だけを使います。
発振出力を4040で分周して、実験に適当な周波数を探り出します。

S22
ボリュームのツマミ、中央で発振停止。
左右に回すと回転方向が変わり、回した角度で速度が変わります。

元になったのはこれ↓
 ・アナログ入力で2相パルスの周波数と正転逆転を制御する発振器
もっと前がこれ↓
 ・2相パルスを手動で発生させるパルス発生器

今回は、ステッピングモータのドライバ pololu A4988 を乗せて、
モータと直結。
使ったモータはデジットで買った多摩川精器のTS3166N913

1回転400ステップと高分解能なところにA4988のマイクロステップ
機能でさらに1/16。
1回転が6400パルスとなってゆっくり回せます。
ギヤを介して減速すると、駆動方向(左右)を変えた時の
バックラッシュが気になりますし、直結だと素直に回ります。

ボリュームを使った正逆運転、「単電源で」っと回路を悩むより、
「-5V」を作ってしまう方が、アナログ回路を考えるとき面倒く
さくないです。

チャージポンプIC LM2776 、調子良く使えてますし。
 ・反転型チャージ・ポンプIC:LM2776

※マイコンを使えば1チップでできちゃいますが、
プログラムを組むという面倒な(!)作業をこなさなければ
なりません。
このくらいの「仕事」なら、ソフトウェア無しの工作でも
対応できます。

アナログ・デジタルmixというのが面白いかも。
  ※安価なA4988のドライバー基板があるから
   実現できた工作です。

| | コメント (1)

2021年7月28日 (水)

中華製のやすものボール盤 上部プラ製カバーのネジ止め部

ボール盤のベルトが断裂したのが2018年6月
モノタロウでベルトを買って  修理完了
  ※型番: HDP-10A

先日、これを使って穴開け作業をしてたら、突然
ガタガタ言い出したのです。

今度はなんや?」と調べますと、
上部のカバー、これのネジ止め部が破断してしまって、
ちゃんと固定できなくなっていました。
これが振動でガタガタと。

11_20210728084301
  拡大  タッピングビスでとめてあったのが破損。
12_20210728084301

内部に落ちてしまったプラ破片を取り除き、カバーは
テープで本体に固定。

パワーは無いけど、とりあえずまだまだ使えます。

| | コメント (0)

2021年7月26日 (月)

秋月の5V出力昇圧DC-DCコンバータXCL102の起動電流

秋月の5V出力昇圧DC-DCコンバータXCL102が起動に失敗 その原因追求

では、前段に入れた三端子レギュレータの電流リミットが原因でした。
XCL102の挙動、これをちゃんと見ておこうと再試験。

  ・XCL102だけで (三端子レギュレータなし)
  ・C1とC2の有無で
  ・負荷電流は前と同じ30mA
  ・電流検出波形レンジを1Vで1Aに
    ノイズで見にくくならないようオシロの
    サンプリングを高分解能モードで。
  ・供給する電源の電圧は3.3V

お手軽にブレッドボードで。
11_20210726105001

・C1、C2無し  無負荷 (XCL102)
Da022  

・C1なし C2=47uF 30mA負荷
Da026

・C1=47uF C2=47uF 30mA負荷
Da027

XCL103で C1=47uF C2=47uF 30mA負荷
Da028

※異常事態発生!
あれこれしている途中、こんな異常事態が発生。
XCL102の電源入力、ちょっと残留電圧が残った状態
3.3Vを加えたら・・・
起動直後、ピークが5Vをオーバーする出力波形
出ちゃいました。
Da021
    C1=C2=47uF 負荷電流30mAで

これはアカン!
残留していた電圧は0.6V手前。
この時、XCL102はオフしています。
これに3.3Vを印加。 するとオーバー電圧が!

何度もやりましたが、いつも出るわけではありません。
  ※出すのが難しい。
   でも、記録できちゃいました。

また、残留電圧があると起動に失敗(5Vが出ない)すること
がありました。
三端子レギュレータは外してますので、電源の電流不足
が原因ではりません。

入力に残留電圧があると、
  ・起動に失敗するかも。
  ・+5Vを越える電圧が出るかも。

どのくらいでどうだといところまで追いかけていませんが、
ちょっと心配です。

※追記
・0.6V弱の残留電圧といっても、トランジシタのバイアス電流
 程度のもの。 100ΩをGNDにつないだらほぼゼロに。

・XCL102の「CE」入力電圧が関係するかな。
 CEの判定が微妙で、電源投入時に働く何かが動かない
 ことがあるとか。

・再現しようとすると、手作業でじゃなく自動的な実験回路が
 いるかな。
 「たまたま出た」「それがうまいこと記録できた」ですから。

| | コメント (2)

ニトリの電動昇降食器乾燥機 リモコンを修理

ニトリの「電動昇降食器乾燥機」、そのリモコンの
スイッチが接触不良で困っているとの相談。

Ss11
「↓」スイッチが反応しなくなってしまったと。
メーカーに相談しても・・・
 ・サポート終了
 ・修理不能
 ・代替品無し
だと。

単純にスイッチが悪いのだろうと、修理を引き受けました。
導通チェックしてみると、「↓」スイッチは完全にアウト。
他の4つも不安定。 ということで、全数交換と判断。

でも、在庫している面実装タイプのタクトスイッチは2本足。
小さくて、この基板のパターンには合いません。
常用しているオムロンのB3F-1000(スルーホールタイプ)は
高さ4.3mmで、足を切っても背が高くてアウト。
ということで高さ3.1mmの面実装スイッチB3FS-1000」を
発注しました。
  ※現在、部品がすんなり入るかヒヤヒヤもの。

スイッチ基板にはマイコンが乗っていて、本体と通信で
やりとりしています。
リモコンしか来ていないので、ちゃんと直ったのかどうか、
こちらでは確認できません。
スイッチ交換後に返送して、試運転してもらったところ、
無事に回復したと入電。
めでたしめでたし。

※さまざまな電子機器、電子回路の修理依頼について:(有)アクト電子

| | コメント (0)

2021年7月25日 (日)

秋月の5V出力昇圧DC-DCコンバータXCL102が起動に失敗 その原因追求

秋月の5V出力昇圧DC-DCコンバータXCL102とXCL103
  (これにコメントしたトラブルとは関係ありません)

XCL102(PWM制御タイプ)を使って組んだ回路、ちょいと手直し
して「電源スイッチをオフしているときは外部電源に切り替え」
を試したみました。

元の回路は単3電池2本で動作。
5V電源の負荷側消費電流は30mAほど。
電池側の電流は3Vで50mAちょい。

こんな具合にDCジャックに三端子レギュレータを
くっつけて3.3Vを得ます。

D11_20210725145601

スイッチがオフの時、これをXCL102に供給すると
いう改造です。
  ※DCジャックからの直接電源供給でも
   良いのですが、使うACアダプタが
   5V出力のじゃなく6Vでも9Vでも大丈夫
   というふうにしたかった。
   で、三端子を入れたという次第。

とことが・・・何かの拍子、起動に失敗するのです。
電池側に切り替えてオンした時は大丈夫。
スイッチオフで三端子側で起動失敗が発生します。
   ※うまく起動することもある。

使った三端子は「LM2950A-3.3」。
TO-92パッケージの100mA出力タイプです。

これのチカラ不足かと推定して、ブレッドボード上で
あれこれ確かめてみました。
こんな回路で試行錯誤。

D12_20210725145701
ピーク電流に関連するC1とC2の容量を変えて起動を試します。

・C1、C2とも無しで。  (パスコンだけ)
Da000

・三端子レギュレータの出力(DCコンの入力)のC1を10uFに。
Da001

C1=10uFのままでDCコンの出力C2も10uFに。
Da002

・C1=10uFで、C2を47uFに。
Da003

C1、C2とも47uFに。
Da004
  ※起動に失敗。 この常態が生じていたようです。

・C1、C2=47uFのまま三端子レギュレータを
 0.5AタイプのTA48033Fに交換。
Da006

・TA48033Fで、C1、C2=10uFに。
Da007

パスコンの値で起動の状況が変わりました。
回路のノイズ減らしということで、ある程度の容量
のパスコンを電源ラインに入れたいところですが、
すると小電流タイプの三端子レギュレータでは起動の
失敗が発生しました。

0.5Aタイプの三端子にすると、起動の失敗は無くなりました。
しかし、電源投入時には思いのほか大きなピーク電流が生じる
ことが判明しました。
   ※ピーク電流、三端子を変えたから出たというわけでは
    なく、元々、生じています。
    このピーク電流に耐えられなければならないわけです。
    (max2Aくらいか。Cで変化。無負荷にしても発生)

DC-DCコンバータ、起動後の特性だけでなく電源オン時の
挙動にも注意が必要です。

電子回路、まずは電源回路がしっかりしていないといけません。
初めての回路は、オシロでの確認が必須です。


※続き
秋月の5V出力昇圧DC-DCコンバータXCL102の起動電流
    ↑
  異常現象に遭遇! どうしたものか・・・

| | コメント (2)

2021年7月23日 (金)

トラ技9月号に掲載

トラ技の9月号に記事が掲載されます。
   さっき著者校正をメールしたとこ。

8月号の次号予告ページを見ると・・・
011_20210723111001

「サンワ」のデジタルテスターが2台写っています。
これ、私のところの・・・
しかし、これを使った記事は紙数の関係でボツに。
  (次の機会にということに)
電流検出アンプを使った電流測定絡みの記事が載ります。

| | コメント (0)

2021年7月18日 (日)

頭頂部の危機。 ヘルメットを買うときはハンモックを選ぶこと!

最近は現場仕事も多くなく、「ヘルメット+安全靴」を
装着することはあまりありません。
もともと電子回路屋はそんな危険な所には行かない
わけですが、現場建屋までの移動とか、メカ屋さんに
連れられての動作確認などでは必須の装備です。
  ※場合によってはフルハーネスの安全帯まで。

金曜日、久しぶりの現場作業。
その時のヘルメットは1年ほど前に「モノタロウ」で
買ったものでした。
  ※滅多に使うものじゃなし、しっかり考えて
   選んだものじゃありません。

たまたま・・・なのか・・・
 ・私の頭:散髪した直後。
 ・私の頭:この歳になり、頭頂部の毛が不足
      始めている。

ヘルメットをかぶり続けていると、なんか違和感。
頭頂部がムズムズするのです。

ヘルメットのハンモックを見て納得。
ハンモックの中心が頭頂部にまともに接触する構造
なんです。
頭頂部がこれでこすれます。

こんな様子。
31_20210718085401

右側のが今回のヘルメット。
「頭のてっぺん」に触れる構造が分かるかと。

左側のは、「地域防災リーダー」のヘルメット。
長いこと使ってましたが、これはしっくりなじんでました。

ということで、ヘルメットを選ぶときはハンモックの構造も
重要だということで。

| | コメント (4)

2021年7月13日 (火)

タカチのプラケース「SW-125」に回路を組み込む

常用ツールは基板むき出しじゃなく
やはり「ケースに入れておかないと」・・・
ということで、今回使ったのはタカチのSW-125
11_20210713134301
ボタンスイッチ3つに8文字x2行の液晶が付きます。

液晶をケース裏面からネジで取り付けたんですが、
厚みがけっこうあって、基板と接触しないよう
空間をとらなけりゃなりません。
12_20210713134301
その高さが11mm。
そうするとスイッチのボタンが短くって表に
出てきません。

14_20210713134301
13_20210713134301

今回は基板にかませものの基板をもう一枚かまして
スイッチのハンダ部分を持ち上げました。

スイッチの頭にかぶせて押さえつけるような凸状のボタン
あれば良いんでしょうが・・・

基板回路の配線はこれからごそごそ。

これ↓は、電池ボックス付のケース。
2021年4月 8日:タカチのプラケース「LC135H-M2」
あんまし使いやすくありませんでした。

昔に作ったのあれこれ↓
2021年3月 7日:時報発生回路 【Pu Pu Pu Pi~】
2021年3月23日:中波振幅変調電波発生回路 いわゆるAMワイヤレスマイク
2020年4月24日:Arduino-UNO + SDカードでシリアルデータロガー 完成形
2020年9月26日:手組みするときは片面基板で:1kHz PWM発生回路
2018年9月23日:6LEDタイプのMAX4003 RFデテクタ
2017年7月27日:ノコギリ波発生回路をケースに入れる
100円FMラジオをワイヤレスマイクに
2012年03月08日:マイクアンプ  (マイクアンプ回路図発掘


| | コメント (2)

2021年7月 9日 (金)

コネクタやリレーが入ってこない

世界的な樹脂の供給不良のせいで、コネクタやリレーが入手難に
例えば秋月でも・・・
JSTのXHコネクタが品種によってアウト!
Jj1

同僚も「オムロンのG2Rリレーがあかん!」っと
悲鳴を上げておりました。
そんな中、彼が
  『XHコネクタ互換品を中国で買ってみたで~』っと。

一つもらってじっくり眺めてみました。
ぱっと見の違い。  (赤文字「C」が中華製の)
JSTのは両サイドの足が、基板挿入後の抜け防止に
曲げ加工がしてあります。
J11
中華製のはストレート。
J12
  ↓本家 JST製
J13

コンタクトを挿入する側の形状、似てはいますが
本家のほうが安心できそうです。
J14
  ↓本家 JST製
J15

コンタクトがこんな具合。
J21
電線外皮をつかむところがちょい短いか。

AWG22の電線を圧着してたところ。
J22

電気的な接触の具合ですが、コネクタを嵌合させて直流1Aを流し、
その電圧ドロップを計ってみました。
  (1Aなので1mVが1mΩ。四端子法で測定)
あれこれ試してみましたが大きな違いはありませんでした。
本家も中華も3mΩ台(4mΩまで行かない)で安定していました。

J23
  (コンタクトにクランプした電線長に
   よるドロップを含めての抵抗)

この供給不安定、元に戻るのはいつになるのか・・・

| | コメント (0)

2021年7月 8日 (木)

Arduinoの言語環境は「C++」。 vsprintf()で

Arduinoの言語環境は「C++」。「C」とはちょっと違う。
オブジェクトにクラス、メソッド、継承・・・
  ・・・きちんと理解できていません。
     例題を参考にしてごそごそと。

Win環境だと古~いBorland C++Builderが使い慣れている
んですが、Winという世界でのプログラムはマイコンを使い
こなす環境とは全く違います。

Arduinoでの「C++」らしい処理、こんなページを見つけました。
  ・日記/2020-06-18/Arduino で printf() を使いたい

クラス「Print」に対する実行関数を指定して、
「vsprintf()」で書式指定文字列を付加し、シリアル出力や
液晶表示を行うという手法です。
  ・・・なるほどです。

シリアル出力と先日のI2CインターフェースのACM0802液晶
使って動きを確かめてみました。 (スペースに全角使ってます)

// Wireと液晶制御のヘッダーファイル
#include <Wire.h>        // I2C
#include <j3LCD_ACM0802_I2C.h> // LCD制御ヘッダーファイル

// LCDという名を指定するとともにI2Cアドレスを指定
j3LCD_ACM0802_I2C LCD(0x3C);  // I2Cアドレスを設定

// クラス「Print」へのポインタ 2つ TxとDispという名で
Print *Tx  = &Serial;   // シリアル出力
Print *Disp = &LCD;    // 液晶表示

/*****  セットアップ     *****/
void setup(){
  Serial.begin(9600);  // シリアル通信
  Wire.begin();     // I2C開始
  LCD.begin(8, 2);    // 液晶開始 文字数と行数
}
/***** LOOP   *****/
void loop(){
long t, tn;
  Serial.println(F("Tx TEST")); // タイトル表示
  LCD.print(F("DispTest"));   // 「.print」を使ったいつもの書式で
  t = millis() / 100L;  // 0.1秒
  while(1){
   tn = millis() / 100L;
   if(t != tn){     // 変化?
    t = tn;
    Tx->println(t);    // 0.1秒ごとにシリアル出力
    LCD.setCursor(0, 1); // 液晶表示位置
    Disp->print(t);    // 「->」でオブジェクトに対するprint実行
   }
  }
}

Serial.println()LCD.print()と同じことが、「->」という記述で
実行できます。

これを使って、vsprintfです。

/***** Printクラスへの書式付シリアル出力   *****/
// *cp : &Serial &LCDなど実行する関数のアドレスを入れるポインタ
void cpPrintf_P(Print *cp, const char *s, ...)
{
va_list vp;
char bff[40];          // バッファを確保
  va_start(vp, s);
  vsnprintf_P(bff, sizeof(bff), s, vp); // PSTRで書式を指定
  cp->print(bff);       // cpへ出力
  va_end(vp);
}

実際使うのは「vsnprintf_P」。
 「n」付でバッファのオーバーランを避け、
 「_P」付で書式指定文字でのRAMエリア増大を防いで、
という処理です。
先ほどの出力している3行、こうなります。

  cpPrintf_P(&Serial, PSTR("%ld.%ldsec\r\n"), t/10, t%10);
  LCD.setCursor(0, 1);
  cpPrintf_P(&LCD, PSTR("%6ld.%ld"), t/10, t%10);

書式付指定できるので1秒桁と0.1秒桁の処理が簡単に済ませられます。

ただ、毎回「&Serial」「&LCD」を付けるのが面倒かとも。

2種類しか使わないのなら、それぞれへ出力する、
「TXprintf_P」と「LCDprintf_P」を別個に作っておくほうが
(ちょいプログラムのスペースが無駄にはなるけど)
良いかなぁとも思います。


※関連
2018年2月20日:「vsprintf()」で数値出力を
2021年7月7日:秋月のI2C液晶表示器 ACM0802C-NLW-BBW-IIC 文字表示ライブラリ


| | コメント (0)

パナソニック 充電式エボルタお手軽モデル BK-3LLB 1000mAh 1200サイクル目

2020-12-25に始めたパナソニック製
 「充電式エボルタお手軽モデル BK-3LLB」(1000mAh)
JIS C8708:2019充放電試験、1200サイクルを過ぎました。

11_20210708131501

50サイクルごとの0.2C放電(電流200mA)のグラフはこんな感じ。

Cap007

800サイクル目 と比べると、劣化が進んでる感じがします。
まぁ、まだまだ続けます。

充放電の条件は異なりますが、「エネループ・ライト」がこれ↓
  ・2017年8月25日:電池イジメ エネループ・ライトとROC製Ni-Cd(700mAh)
     充電 主としてBQ-390
     放電 1Ω抵抗で
これは「頑張ったなぁ」という気がします。
  ※テストした人間も。
    自動でテストしてくれませんので。
      充電器にセット→放電器にセット→データ保存
    の繰り返し。
今回の実験装置は400サイクルは自動でOK。


| | コメント (0)

2021年7月 7日 (水)

秋月のI2C液晶表示器 ACM0802C-NLW-BBW-IIC 文字表示ライブラリ

秋月の液晶表示器 ACM0802C-NLW-BBW-IIC、I2Cのプルアップ抵抗
で、うだうだ言ってました文字表示のライブラリをまとめておきました。
zip圧縮
  ・ダウンロード - j3lcd_acm0802_i2c.zip

対応品↓
 ・秋月 ACM0802C-NLW-BBW-IIC

この→16文字x2行のACM1602NI-FLW-FBW-M01 でも、
使えると思います。(まだ買ってないので、たぶん)
コントローラが異なる「AQM・・・・」には対応していません。

・プログラムの記述方法
#include <Wire.h>         // I2C用ヘッダーファイル
#include <j3LCD_ACM0802_I2C.h> // LCD制御ヘッダーファイル
j3LCD_ACM0802_I2C LCD(0x3C); // (1)コンストラクタ LCD I2Cアドレスを設定

void setup() {
  delay(50);      // 電源on時の50ms wait
  Wire.begin();    // (2) I2C開始
  LCD.begin(8, 2);  // (3) LCD初期化 文字数、行数設定 (8文字x2行)
    :

(1) コンストラクタでIC2アドレスを設定。
(2) I2Cの初期化はこのライブラリの中では行っていないので
  Wire.begin()が別に必要。
(3) LCD.begin()で文字数と行数を設定。

制御関数は「LiquidCrystal」とほぼ同じ。

サンプルに「lcdprintf」と「lcdprintf_P」関数
(書式指定機能付き液晶表示)を示しておきました。
lcdprintf_Pは「PSTR("")」を使って書式設定するので
書式の文字列を入れておくRAM領域を削減(ROMに配置)できます。


・参考:
  ・「vsprintf()」で数値出力を
      「vsnprintf_P()」を使っています。

B12_20210707145301

2021年7月8日:Arduinoの言語環境は「C++」。 vsprintf()で

| | コメント (0)

2021年7月 2日 (金)

秋月の液晶表示器 ACM0802C-NLW-BBW-IIC、I2Cのプルアップ抵抗

いつもはパラレルインターフェースの液晶表示器を
使うんですが、今回初めて、I2Cインターフェースのを
手に入れてみました。
   ・秋月のACM0802C-NLW-BBW-IIC
2本でインターフェースできるんで、パラレル品よりラクチン。
11_20210702171801
ところが・・・
パラレルインターフェース品だと、Arduinoのライブラリ
LiquidCrystal」を使えば悩むことはありません。
「みなさん、I2Cのだとどうしてるの?」と探しますと・・・
ズバリのがありません。
3.3Vでも5Vでも使える「AQM」シリーズのなら、
「I2CLiquidCrystal」や「LiquidCrystal_I2C」が使えそう
なんですが、ACM0802C-NLW-BBW-IICとは制御(初期化方法)
がちょい異なります。
  ※ACM0802C-NLW-BBW-IICのほうが昔からの
   HD44780と同じで拡張されていない。
  ※アカンと判断したライブラリ・・・
    時間待ちに「delay()」を使ってるもの。
    delay()はタイマー0の割り込みが絡んでるんで。

そこで、「LiquidCrystal」を手直ししてライブラリ化。
あれこれして動くようになりました。
   ※そのうちまとめますんで。
    「delayMicroseconds」  も絡みました。

試行錯誤の途中、I2Cの信号をオシロで見ていて
「ちょいとこれはどうしたもんだ」な事態に気が付きました。

ACM0802C-NLW-BBW-IICのI2Cライン、液晶基板上に「2.2kΩ
のプルアップ抵抗が乗っています。
12_20210702171801

液晶制御ICのLレベル駆動能力がちょい不足しているようで、
2.2kだと十分に引っ張り切れていないのです。

Image000_20210702171801  
液晶が出力する信号は、I2Cの「ACK」
これがGNDレベルからちょっとだけ浮いてしまいます。
Arduino-UNOのATmega328PはACKとして認識してますが、
もうちょいLレベルを下げたいところ。
I2Cのスピードも遅いですし、10kΩくらいで良いのではと。

駆動レベルを確かめるのに、もうちょい負荷を重してみるとどうやと、
SDAラインに2.2kΩの抵抗を並列につなぐとこうなりました。

Image001_20210702171801
Arduinoが出力するLレベルも持ち上がってしまいました。


※busyフラグを読みたかった
ライブラリ「LiquidCrystal」は「R/W」信号をつないでも
液晶の「busyフラグ」は読んでくれません。
  だからR/WはGND接続というのが定石。
busyをチェックできれば、タイマー待ちにせず、最速で動かす
ことができるんですが・・・
このACM0802C-NLW-BBW-IICもダメでした。
読めるかなと思って試してみましたが(コマンド表にはあるんで)、
バスが反応しませんでした。

※参考:ラジオペンチblog
ArduinoでI2Cキャラクタ液晶を使う(その1) 基本動作確認
ArduinoでI2Cキャラクタ液晶を使う(その2) ライブラリの選定
ArduinoでI2Cキャラクタ液晶を使う(その3) 最終動作確認

※悩みどころ
・液晶のイニシャル処理に「I2Cの初期化:Wire.begin()」を入れてしまっても
 良いものか。
 メイン側の「setup()でしてね」のほうが、良いように思うが。

・AQMシリーズの拡張命令はどうしよう。
   とりあえずほっとこうかと。

  今回のACM0802のI2Cアドレスは0x3C~0x3F。
    SA1、SA0の設定で4種選べる。
  ACM1602になると0x50固定。
  AQM1602だと0x3E。

※追記 SDA、SCLのプルアップ抵抗を10kΩにしたら、
Image002
ACK信号の浮き上がり、0.24Vほどに。

抵抗なしにしてATmegaの内蔵プルアップ抵抗にすると、
Image003
この抵抗値、40kΩくらい。
波形の鈍り具合から見て、これはちょいかわいそう。

※追記 待ち時間について
I2Cの「ACM0802」、コマンドやデータ書き込み後の
待ち時間、このような表になっています。
Dd2
内部クロックが「540kHz」とずいぶん高速な
値が記されているのです。

対し、従来型のパラレル・インターフェースの
「ACM0802」ではこんな具合。
Dd1_20210706102701
190kHz、270kHz、350kHzと3種類のクロック
での時間が記されています。

I2CのACM0802、実際のクロック周波数は?
っと調べてみました。
基板上、「RF」と記されて抵抗があります。
(値は91kΩ)これで内部クロック周波数を
決めているのだろうと、オシロのプローブを
当てると・・・「370kHz」くらいの三角波
が出てました。

ということは、上の表ではなく下表の350kHzあたり
を参考にして時間を決めるということになるかと
思います。
画面クリアだと1.5~2msちょいは待ちたい。
データだと40μs~50μsは必要かと。

※I2Cインターフェース液晶 8文字x2行文字表示ライブラリ
 まとめておきました。
秋月のI2C液晶表示器 ACM0802C-NLW-BBW-IIC 文字表示ライブラリ
お試しください。

| | コメント (0)

2021年7月 1日 (木)

Arduino-UNOでのdelayMicrosecondsの設定は16383までだ!

Arduinoでまたもや注意点を。
落とし穴にはまりました。

Arduinoでの時間待ち関数、あれこれ用意されていますが
  ・μ秒単位の設定で。
  ・ソフトのループで処理してる。
  ・割り込みを止める処理内でも使える。
という「delayMicroseconds」が便利かと。

  delay()はタイマー0のオーバーフロー割り込みを使ってるんで、
  ちょいキラいで、簡単なテスト的プログラムの他は私は使いません。

delayMicrosecondsの関数プロトタイプを見ると、
   void delayMicroseconds(unsigned int us)
となっていて、「unsigned int」、16ビットのword値で設定できる
ことがわかります。
つまり、最大が「65535」で「65ミリ秒ちょい」が最大値だと思っちゃう
わけです。
ところが・・・
Arduino-UNOのような16MHzクロックで動いているAVRマイコンでは
この「us」値を4倍にしてループカウンタの値を得ているのです。
そしてそのループカウンタはwordのまま。
ということは「us」値として設定できる有効な最大値は16383

ソース「wiring.c」を見ると、
 #elif F_CPU >= 16000000L   // クロック16MHz
    :
   us <<= 2; // x4 us, = 4 cycles  // us値を4倍に
    :
   L1:sbiw us, 1  // 機械語で減算 4クロックでloop
     brne L1
    :
こんな処理になっているのです。

関数のプロトタイプを見ただけでは「us」の最大が16383
だなんて気が付きません。

wordの最大65535に近い「delayMicroseconds(50000)」と
50mS待ちをやってみると
  50000*4 = 2000000 → & 0x0FFFF → 3392
3msちょいになってしまい、望んだ50mSとはかけ離れた
待ち時間になってしまいます。

Arduinoの関数リファレンスを見れば、
  ・16383マイクロ秒以内の値を指定する
  ・数千マイクロ秒を超える場合はdelay関数を使え
と記されているんですが、こんな落とし穴があるとは
ついさっきまで気が付きませんでした。

※参考
 ・Arduinoから「タイマー0」を取り上げる(ユーザーが使う

※追記
delay()が32bit値で設定できるんで、delayMicrosecondsも
32bitで時間設定できるよう、こんな関数にしておけばいかがでしょうか。

/***** 1us delay  *****/
// delayMicrosecondsの最大値16383(0x3FFF)で
// 処理を区分
void delay1us(uint32_t us)
{
uint32_t cnt, i;
uint16_t m;
  if(us < 16384L){           // 16383までなら
    delayMicroseconds((uint16_t)us); // そのまま
  }
  else{            // 16384以上
    cnt = us >> 13;     // 1/8192
    m  = (uint16_t)us & 0x1FFF;  // あまり 0~8191
    for(i = 0; i < cnt; i++){    // loop    
      delayMicroseconds(8192);  // 8192usで
    }
    if(m != 0){           // 残り
      delayMicroseconds(m);
    }
  }
}

cnt回ループするところでの遅れが積み重なるんで、遅れが気になる
なら delayMicroseconds(8192 - 10); などとちょい補正を。


※さらに追記
液晶表示制御ライブラリ「LiquidCrystal.cpp」の中、105行目に・・

// according to datasheet, we need at least 40ms after power rises
// above 2.7V before sending commands.
// Arduino can turn on way before 4.5V so we'll wait 50
  delayMicroseconds(50000);
    :
私と同じ50ms待ちを発見。  実害は無いでしょうけど。



| | コメント (2)

パナソニックeneloopスタンダード単3「BK-3MCC」60%(72分)放電で1600回目

パナソニックのeneloopスタンダード単3の新JISでの寿命試験、
この0.5C放電サイクル(1~48サイクル目)を
2時間=120分ではなく、「72分(60%)で止めると」
どうなるかを始めたのが昨年の11月7日。
今年の3月5日に800サイクル、5月3日に1200サイクルを終えています。
今朝、1600サイクル目に達しました、途中経過を示しておきます。

◆50サイクルごとの0.2C放電
Cap001_20210701091901
◆72分間の0.5C放電
Cap003_20210701100101
劣化のきざし・・・まだまだ大丈夫そうです。
大電流放電で、1.2V以上をどれだけ維持できるかあたりが
寿命の目安かと。
内部抵抗が大きくなると、一気にドロップしますんで。

定格どおりの120分放電だとこんな結果。
 ・パナソニックeneloopスタンダード単3「BK-3MCC」新JISでの寿命実験終了

それを72分にすると・・・「10倍~6倍に寿命が延びるのか?
を検証しているのです。

大容量のものでは良い結果が得られてません。
 ・エネループ・プロ(BK-3HCD:2500mAh) 60%放電での実験終了
 ・東芝インパルス TNH-3A(2400mAh) 60%(72分)放電で




| | コメント (0)

« 2021年6月 | トップページ | 2021年8月 »