Thread間通信 Handler Message Looper(android studio)(Android)(備忘録)

メインスレッドが生成する二つのサブスレッドに於いて
SubThread1はSubThread2からの情報を受取り内部データを更新する。
SubThread2は何らかの情報を指定されたThreadに引き渡す役目を持つ。

SubThread1はインスタンスが生成され実行されるとLooperがループし、 メーセージを待つ。
また、SubThread1は自身のThreadで実行されるHandlerを生成し要求元へ引き渡す機能をもつ。
生成されたHandlerは他のThreadから送られてきたMessageの内容に従って特定の処理を実行するhandleMessage()を持つ。
このHandlerを生成する関数を複数種用意する事により、異なった機能を持たせる事ができる。

SubThread2はSubThread1が生成したHandlerを受け取り、自身が生成したデータをMessageに載せ、HandlerをsendMessage()でSubThread1に送る。
SubThread2は送ったハンドルを誰(Thread)が受け取りどの様に処理されるかは知らない。

メインスレッドはデータを処理する者(SubThread1)とデータを提供する者(SubThread2)の関係を制御するスレッドとなる。

※下記sampleはスレッドの実行順序の不正によるエラーは考慮していない。

■MainActivity

package jp.no4393.loopertest002;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;

public class MainActivity extends AppCompatActivity {

private SubThread1 subThread1;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

public void bt1onClick(View view){
Log.d("LT002","B1-----start.");
subThread1 = new SubThread1();
subThread1.start();
Log.d("LT002","B1-----end.");
}

public void bt2onClick(View view){
Log.d("LT002","B2-----start.");
SubThread2 st2 = new SubThread2(subThread1.getHandler());
st2.start();
Log.d("LT002","B2-----end.");
}
}





■subThread1

package jp.no4393.loopertest002;

import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;

public class SubThread1 extends Thread{

private String mark;
private Looper myLooper;

SubThread1(){
}

public void run(){
Log.d("LT002","T1 run.");
Looper.prepare();
myLooper = Looper.myLooper();
Looper.loop();
Log.d("LT002","T1 run end.");
}

public Handler getHandler(){
Log.d("LT002","T1 getHandler.");
mark = "SubThead1 getHandler.";
return new Handler(myLooper) {
public void handleMessage(Message msg) {
mark = String.valueOf(msg.what) + " mark=" + (String) msg.obj;
Log.d("LT002", mark);
}
};
}

}




■SubThread2

package jp.no4393.loopertest002;

import android.os.Handler;
import android.os.Message;
import android.util.Log;

public class SubThread2 extends Thread {

private Handler toHandler;

SubThread2(Handler toHandler){
this.toHandler = toHandler;
}

public void run(){
Log.d("LT002","ST2 run sendMessage.");
try{
Thread.sleep(2000);
}catch(InterruptedException e){}
Message msg = new Message();
msg.what = 123;
msg.obj = "ST2 run message obj. myThreadId=" + String.valueOf(Thread.currentThread().getId());
toHandler.sendMessage(msg);
Log.d("LT002","ST2 run end.");
}

}




■log

Button1をタッチ後、Button2を三回連続タッチした時のlog

10-30 09:07:02.110 4768-4768/jp.no4393.loopertest002 D/LT002: B1-----start.
10-30 09:07:02.110 4768-4768/jp.no4393.loopertest002 D/LT002: B1-----end.
10-30 09:07:02.110 4768-5001/jp.no4393.loopertest002 D/LT002: T1 run.
10-30 09:07:03.241 4768-4768/jp.no4393.loopertest002 D/LT002: B2-----start.
10-30 09:07:03.241 4768-4768/jp.no4393.loopertest002 D/LT002: T1 getHandler.
10-30 09:07:03.241 4768-4768/jp.no4393.loopertest002 D/LT002: B2-----end.
10-30 09:07:03.241 4768-5075/jp.no4393.loopertest002 D/LT002: ST2 run sendMessage.
10-30 09:07:03.812 4768-4768/jp.no4393.loopertest002 D/LT002: B2-----start.
10-30 09:07:03.812 4768-4768/jp.no4393.loopertest002 D/LT002: T1 getHandler.
10-30 09:07:03.822 4768-4768/jp.no4393.loopertest002 D/LT002: B2-----end.
10-30 09:07:03.822 4768-5107/jp.no4393.loopertest002 D/LT002: ST2 run sendMessage.
10-30 09:07:04.383 4768-4768/jp.no4393.loopertest002 D/LT002: B2-----start.
10-30 09:07:04.383 4768-4768/jp.no4393.loopertest002 D/LT002: T1 getHandler.
10-30 09:07:04.383 4768-4768/jp.no4393.loopertest002 D/LT002: B2-----end.
10-30 09:07:04.383 4768-5146/jp.no4393.loopertest002 D/LT002: ST2 run sendMessage.
10-30 09:07:05.244 4768-5075/jp.no4393.loopertest002 D/LT002: ST2 run end.
10-30 09:07:05.244 4768-5001/jp.no4393.loopertest002 D/LT002: 123 mark=ST2 run message obj. myThreadId=519
10-30 09:07:05.834 4768-5107/jp.no4393.loopertest002 D/LT002: ST2 run end.
10-30 09:07:05.834 4768-5001/jp.no4393.loopertest002 D/LT002: 123 mark=ST2 run message obj. myThreadId=520
10-30 09:07:06.385 4768-5146/jp.no4393.loopertest002 D/LT002: ST2 run end.
10-30 09:07:06.385 4768-5001/jp.no4393.loopertest002 D/LT002: 123 mark=ST2 run message obj. myThreadId=521





■環境
Thread間通信 Handler Message Looper(android studio)(Android)(備忘録)


Thread間通信 Handler Message Looper(android studio)(Android)(備忘録)


Thread間通信 Handler Message Looper(android studio)(Android)(備忘録)

スポンサーサイト

液晶交換成功(修理)(ZenFone Go ZB551KL)

液晶を破損させてしまったZenFone Go ZB551KLのLCD部分を交換しました。
アマゾンで4500円+送料。約5000円で修理出来ました。良かった!!



状況


液晶交換成功(ZenFone Go ZB551KL)
テーブルから落下して万力の角に当たり、液晶破壊。



調査


液晶交換成功(ZenFone Go ZB551KL)
裏蓋を外し、電池をとりだし、内部のカバーのネジを外す。
ネジは失わないように紙に貼り付けておきました。
このネジは星型ドライバーが必要です。



液晶交換成功(ZenFone Go ZB551KL)
結構、難いです。竹串を削ってマイナスドライバーの様にして開けました。



液晶交換成功(ZenFone Go ZB551KL)
基板部分は二層構造になっています。
上の写真の赤枠の部分、SIMとSDカードスロットの基板が二階になっています。
この部分は下の基板に両面テープで貼り付けてあります。



液晶交換成功(ZenFone Go ZB551KL)
取り外したところ。
赤矢印は残留したテープの粘着剤です。
この部分も竹串を隙間から差込ながら剥がしていきました。竹ってホントに便利な素材です。
この両面テープは取り除ないで、組み立ての時そのまま再利用しました。
この写真では分かり難いですが、二箇所に「突き当て」があり、連列用のコネクタの位置合わせがし易いようになっていました。



液晶交換成功(ZenFone Go ZB551KL)
液晶と基板を繋ぐコネクタを外します。
おそらく、右下赤丸が液晶用で、左上赤丸がタッチパネル用と思われます。
右端にチラッと見えているのが大活躍の竹串です。
この竹串をコネクタの下に差し入れて外します。


液晶交換成功(ZenFone Go ZB551KL)
フロントカメラを外しました。
ひょっとすると、外さなくてもいいかも知れません。



液晶交換成功(ZenFone Go ZB551KL)
基板を外したところ。
写真の下側が液晶とフレームが一体となった部分です。



液晶交換成功(ZenFone Go ZB551KL)
電池部のシールを剥がして、液晶のフレキシブルケーブルを露出させます。



液晶交換成功(ZenFone Go ZB551KL)
ドライヤーで液晶部分の周辺を熱して、粘着テープを緩め、竹串を薄く削って剥がしていきます。
剥がす位置は、サイド側側面からでなく上面の額縁状になっている枠(フレーム)と面(液晶)の所に竹串を差し込み剥がします。



修理


で、無事分離出来た事を確認してアマゾンで「SKILIWAH® ASUS Zenfone GO ZB551KL修理用 5.5インチ 液晶LCD タッチパネル+フルLCD (フロントガラスデジタイザ) 修理用キット ブラック」を注文しました。



液晶交換成功(ZenFone Go ZB551KL)
到着。



液晶交換成功(ZenFone Go ZB551KL)



液晶交換成功(ZenFone Go ZB551KL)
フレームに残っている粘着テープのカス(赤矢印)を剥がします。



液晶交換成功(ZenFone Go ZB551KL)
フレーム側ではなくて、液晶側に両面テープを貼ります。(ダイソーのフィルムタイプ)
接着部分は非常に狭い(2mm位)のではみ出たテープはカッターで切り落とします。
竹串でよく押さえておきます。



液晶交換成功(ZenFone Go ZB551KL)
この程度の雑さ加減でもなんとかいけました。



液晶交換成功(ZenFone Go ZB551KL)
貼り付け完了。



液晶交換成功(ZenFone Go ZB551KL)
この後、フレームに基板を取り付けます。フレームには位置決めピンがありキッチリと収まるようになっています。
しかし、今回は写真の赤丸部分(おそらく近接センサー)の嵌まりが悪く、こちらを一番に嵌合させてから組み立てました。



後は、分解の逆手順で組み立てます。



液晶交換成功(ZenFone Go ZB551KL)
無事に表示しました。(画像はスクリーンショット)


感想


組み立て後、電源を入れる時はドキドキものでした。
万一電池から煙がと思うと、なおさらです。電池を素早く外せるようにダブを付けてから電源を入れました。
無事、表示した時はホッとしました。



ZenFone Go ZB551KLは分解や組み立てが易い部類ではないかと想像します。
お陰で無事、使えるようになりました。
いまは、疎通レベルのテストのみなので、これから各動作を確認しようと思っています。

いまひとつ(EasyWordMall DC-DC 3.2-35V 3A LM2596S 電源降圧モジュールレギュレータ [並行輸入品])

アマゾンでDC-DC降圧電源モジュールを送料無料の179円で買ってみました。

目的はリチュームイオン電池で単三2本用の機器の電源にする為です。

いまひとつ(EasyWordMall DC-DC 3.2-35V 3A LM2596S 電源降圧モジュールレギュレータ [並行輸入品])


■初期機構不良
購入直後のテストでは、写真青色のボリュームを回転させても出力電圧は微動だにしない。
時計方向、反時計方向に20回以上回してみても結果は同じ。
ボリューム周りの抵抗値や電圧を測ってみても抵抗値が変わっている様子はなし。

試しに固定抵抗器をボリュームに並列に接続すと、出力電圧はそれなりに代わりました。

ボリュームを取り外して調べる積りで、最後にボリュームを激しく回転させると正常に出力電圧を変更出来るようになりました。
ボリュームの内部で摺動子が引っかかっていた可能性があるかもしれません。


■無負荷時の入力側電流
入力4.1Vおよび5Vの時、無負荷で10mA消費しています。


結論


追加購入はしない事にしました。
理由は無負荷時の消費電流が大きい事、カタログによると低電圧での効率もあまりよくない事。
それなら、ドロップ型の三端子レギュレータで良さそうなので。

GPSアンテナ部分(ZenFone Go ZB551KL

注意:この記事の内容に裏付けはありません。私の想像です。


GPSアンテナ部分(ZenFone Go ZB551KL

水色丸はボディー(裏蓋ではありません)に印刷または貼り付けたGPSのアンテナと思われる部分。
赤丸は基板とアンテナとの接続用接点。


GPSアンテナ部分(ZenFone Go ZB551KL)

赤丸は基板とアンテナとの接続用接点。
水色丸はボディー表面側のアンテナと繋がっている接点。


ZenFoneの弱点はGPSの感度の悪さですが、さてその原因は何処でしょう。


基板の金属部分が汚れていますが、これは両面テープを剥がした跡です。
この金属部分の上にSIMやSDカードのスロット基板が貼り付けてあります。

System.out.print()の出力先(android studio)(Android)(備忘録)

USB接続でNEC N-03E(Android 4.1.2 API 16)に接続してテスト。
Android Studio 2.2.1


■テスト目的
System.out.print()の出力先について。

■結果
Android Monitorのlogcatに表示される。


■MainActivity

package jp.no4393.printtest001;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

public void buttonOnClick(View view){
System.out.println("println 001.");
System.out.println("println 002.");
System.out.print("print 101.");
System.out.print("print 102.");
System.out.println("println 201.");
}

}





■出力結果(logcat)

10-16 11:12:43.324 17265-17265/jp.no4393.printtest001 I/System.out: println 001.
10-16 11:12:43.324 17265-17265/jp.no4393.printtest001 I/System.out: println 002.
10-16 11:12:43.324 17265-17265/jp.no4393.printtest001 I/System.out: print 101.print 102.println 201.

スレッドでTextViewの更新(post)(android studio)(Android)(備忘録)

TextViewはUIスレッド(メインスレッド)でないと更新できない。

サブスレッドでTextViewを更新する一例。
ポイント : textView1.post(new Runnable(){});


■MainActivity

package jp.no4393.processthreadtest001;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.util.logging.Logger;

public class MainActivity extends AppCompatActivity {

private Logger logger;
private TextView textView1;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

logger = Logger.getLogger("PTTest001");
logger.info("onCreate 001.");

textView1 = (TextView)findViewById(R.id.textView1);
}

public void buttoun1onClick(View view){
logger.info("buttoun1onClick 001.");
((Button)view).setText("buttoun1onClick");

SubThread subThread = new SubThread(logger);
subThread.textView1 = textView1;
Thread thread = new Thread(subThread);
thread.start();

}

}




■subThead

package jp.no4393.processthreadtest001;

import android.widget.TextView;
import java.util.logging.Logger;


public class SubThread implements Runnable {
private Logger logger;
public TextView textView1;

public SubThread(Logger logger){
this.logger = logger;
}

public void run(){
logger.info("subThead.run 001.");
textView1.post(new Runnable(){
public void run() {
textView1.setText("Runnable setText.");
logger.info("Runnable 101.");
}
});
logger.info("subThead.run 002.");
}

}




■log

10-16 18:13:30.182 24965-24965/jp.no4393.processthreadtest001 I/PTTest001: onCreate 001.
10-16 18:13:32.875 24965-24965/jp.no4393.processthreadtest001 I/PTTest001: buttoun1onClick 001.
10-16 18:13:32.875 24965-25170/jp.no4393.processthreadtest001 I/PTTest001: subThead.run 001.
10-16 18:13:32.875 24965-25170/jp.no4393.processthreadtest001 I/PTTest001: subThead.run 002.
10-16 18:13:32.885 24965-24965/jp.no4393.processthreadtest001 I/PTTest001: Runnable 101.

android.os.AsyncTaskの実行スレッド(android studio)(Android)(備忘録)

UDPを使用する事があり、AsyncTask の onPostExecute を実行するスレッドについて確認してみました。

class WhoIsTask extends AsyncTask で AcyncTask のサブクラスを定義して各箇所で LOG を出力し、
実行しているスレッドIDを調べました。


■結果
doInBackground は WhoIsTask のインスタンスを実行しているスレッドで実行される。
onPostExecute は whoIsTask.executeOnExecutor した MainActivity のスレッドで実行される。


10-16 12:52:19.541 9124-9124/jp.no4393.amefurictrl I/Amefurictrl001: onCreate 001. Thread ID=1
10-16 12:52:19.541 9124-9124/jp.no4393.amefurictrl I/Amefurictrl001: onCreate 001. Process myPid=9124
10-16 12:52:19.541 9124-9124/jp.no4393.amefurictrl I/Amefurictrl001: onCreate 001. Process myTid=9124
10-16 12:52:19.541 9124-9124/jp.no4393.amefurictrl I/Amefurictrl001: onStart 001. Thread ID=1
10-16 12:52:19.541 9124-9124/jp.no4393.amefurictrl I/Amefurictrl001: onStart 001. Process myPid=9124
10-16 12:52:19.541 9124-9124/jp.no4393.amefurictrl I/Amefurictrl001: onStart 001. Process myTid=9124
10-16 12:52:19.541 9124-9124/jp.no4393.amefurictrl I/Amefurictrl001: WhoIsTask 001. Thread ID=1
10-16 12:52:19.541 9124-9124/jp.no4393.amefurictrl I/Amefurictrl001: WhoIsTask 001. Process myPid=9124
10-16 12:52:19.551 9124-9124/jp.no4393.amefurictrl I/Amefurictrl001: WhoIsTask 001. Process myTid=9124
10-16 12:52:19.551 9124-9178/jp.no4393.amefurictrl I/Amefurictrl001: doInBackground 001. Thread ID=1088
10-16 12:52:19.551 9124-9178/jp.no4393.amefurictrl I/Amefurictrl001: doInBackground 001. Process myPid=9124
10-16 12:52:19.551 9124-9178/jp.no4393.amefurictrl I/Amefurictrl001: doInBackground 001. Process myTid=9178
10-16 12:52:19.691 9124-9124/jp.no4393.amefurictrl I/Amefurictrl001: onPostExecute 001. Thread ID=1
10-16 12:52:19.691 9124-9124/jp.no4393.amefurictrl I/Amefurictrl001: onPostExecute 001. Process myPid=9124
10-16 12:52:19.691 9124-9124/jp.no4393.amefurictrl I/Amefurictrl001: onPostExecute 001. Process myTid=9124




■ソース概要

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

logger = Logger.getLogger("Amefurictrl001");
logger.info("onCreate 001. Thread ID=" + Thread.currentThread().getId() );
logger.info("onCreate 001. Process myPid=" + android.os.Process.myPid());
logger.info("onCreate 001. Process myTid=" + android.os.Process.myTid());


@Override
protected void onStart() {
super.onStart();

logger.info("onStart 001. Thread ID=" + Thread.currentThread().getId() );
logger.info("onStart 001. Process myPid=" + android.os.Process.myPid());
logger.info("onStart 001. Process myTid=" + android.os.Process.myTid());

whoIsTask = new WhoIsTask(logger);
whoIsTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);




public class WhoIsTask extends AsyncTask {

public WhoIsTask(Logger logger){
super();
this.logger = logger;

logger.info("WhoIsTask 001. Thread ID=" + Thread.currentThread().getId() );
logger.info("WhoIsTask 001. Process myPid=" + android.os.Process.myPid());
logger.info("WhoIsTask 001. Process myTid=" + android.os.Process.myTid());


@Override
protected Integer doInBackground(Integer... value){
logger.info("doInBackground 001. Thread ID=" + Thread.currentThread().getId() );
logger.info("doInBackground 001. Process myPid=" + android.os.Process.myPid());
logger.info("doInBackground 001. Process myTid=" + android.os.Process.myTid());


@Override
protected void onPostExecute(Integer result) {
logger.info("onPostExecute 001. Thread ID=" + Thread.currentThread().getId() );
logger.info("onPostExecute 001. Process myPid=" + android.os.Process.myPid());
logger.info("onPostExecute 001. Process myTid=" + android.os.Process.myTid());


カメラ(ZenFone Go ZB551KL)

カメラ(ZenFone Go ZB551KL)

赤丸はZenFone Go ZB551KLのリアーカメラ。
青丸はフロントカメラ。

スマホのカメラってそこそこ綺麗に撮れますよね。
コンデジならフルサイズ並に撮れるハズとついつい思ってしまいます。

レーザーポインターを作る(ReFaXi ゴールデン レーザーダイオードモジュールヘッドの10本)

アマゾンで10本送料込み628円で売っていたレーザーダイオードモジュールでプレゼン用のポインターを作ってみました。

レーザーポインターを作る(ReFaXi ゴールデン レーザーダイオードモジュールヘッドの10本)

ボディーはダイソーの単三3本用のLEDライトを流用しました。
理由は単三が腐るほどあるのと、スイッチの位置が安全性と操作性の理由からこのライトになりました。

レーザーポインターを作る(ReFaXi ゴールデン レーザーダイオードモジュールヘッドの10本)

モジュールはガムテープを巻きつけて太さを調整し、ミラーにグルガンで固定しました。

レーザーポインターを作る(ReFaXi ゴールデン レーザーダイオードモジュールヘッドの10本)

夜なら200m先でも十分な明るさでポイント可能でした。
勿論そんな使い方はしませんが。

何に使うかはヒ・ミ・ツ!



目に入ると大変危険なので要注意!!

184円のデジタル電圧計で温度計を作る(KKHMF 赤 DC3.2V-30V デジタル電圧計 適用6V 12V 電気自動車オートバイ)

184円のデジタル電圧計で温度計を作る(KKHMF 赤 DC3.2V-30V デジタル電圧計 適用6V 12V 電気自動車オートバイ)


アマゾンで売っていた送料無料の184円のデジタル電圧計。
電源は被測定物から取るという電圧計で主にバッテリーなどの電圧を測定する為のものです。

送料込みで184円であまりに安いのと、きっと電源と測定端子は切り離せると踏んで2個購入しました。



184円のデジタル電圧計で温度計を作る(KKHMF 赤 DC3.2V-30V デジタル電圧計 適用6V 12V 電気自動車オートバイ)
到着した物(右側)の裏面はこんなものです。
ケースの両端を広げて、下側から7セグLEDを押すと簡単に外れます。
上の写真の左側が外れた中身です。



184円のデジタル電圧計で温度計を作る(KKHMF 赤 DC3.2V-30V デジタル電圧計 適用6V 12V 電気自動車オートバイ)
(1)上の写真で赤丸のチップ抵抗が電圧測定用の分圧とLPFを兼ねた部分です。
(2)ピンクの丸のチップコンデンサー(1uF)はLPF用です。
(3)青矢印は電圧測定の為の入力端子です。
(4)緑矢印は電圧測定端子を電源に繋いでいるプリントパターンです。
※したがって、ここを切り離せば任意の電圧測定が出来ます。
(5)白矢印はICの入力端につながっていて、ICはここの電圧を測っています。
(6)黄矢印はICのGND端です。
※したがって、正確に言うと、ICは黄矢印(ICの一番ピン)と白矢印の間の電圧を測っている事になります。
※ICは測定した電圧の12.35倍を7セグLEDに表示しています。(という事は感度は10倍以上上げられると言うことになります)
(7)赤丸のチップ抵抗「6201」は本来、トリマ抵抗で表示電圧を校正する目的だったと思われます。コスト削減の為固定抵抗になったようです。
※従って、この6201を10Kのトリマー抵抗に変えればICの性能をフルに引き出す事が出来そうです。ただし、後述するように単にトリマーに変更し倍率を調整しても、オフセットがあるのでフルにICの性能は引き出せません。



184円のデジタル電圧計で温度計を作る(KKHMF 赤 DC3.2V-30V デジタル電圧計 適用6V 12V 電気自動車オートバイ)
上の写真は前述の緑矢印部分のプリントパターンを切断し、入力端子部分を開放した時の表示の様子です。
(1)入力端子部を開放しても、GNDに落としてみても、写真のようにテスターに接続しても0.03Vを表示します。
※ここでいうGNDとは電源コネクタの(-)端子のハンダ付け部分を基準としています。
(2)入力端子部とGND間に接続されたテスターは3.8mVを表示しています。本来なら0.0mVのはずです。
※したがって、この入力回路の何れかで起電力が発生している事になります。



184円のデジタル電圧計で温度計を作る(KKHMF 赤 DC3.2V-30V デジタル電圧計 適用6V 12V 電気自動車オートバイ)
IC、電源、入力回路付近を拡大したものです。ただし、入力回路の一部チップ抵抗「1202」(12Kオーム)は取り外してあります。
(1)上述の0.03V(30mV)のオフセットはICの入力端子では、30/12.35=2.43mVです。
(2)そのオフセットはICのGNDピン(青丸印)と入力ピン部(黄丸印)に掛かっている事になります。
(3)要因1は基盤のGNDパターンの導体抵抗と本機器の回路全体に係る電流による起電力です。
(3-1)関連するGNDパターンを黒矢印で示しています。
(3-2)黄丸印とその上部のランドの間に取り外した抵抗が入っているのですが、厳密にはその抵抗以外に黒矢印のGNDパターンで発生する抵抗も含まれています。
(3-3)しかも、そのGNDパターンは電源回路のGNDでもあるので大きな電流が流れている事になり、大なり小なり起電力が発生します。
(3-4)上部のGNDパターンに流れる電流では結果的にマイナス方向へのオフセットが発生し、下部のGNDパターンではプラス方向へのオフセットが発生します。
(4)もう一つの要因2はICの入力端からのリーク電流によるオフセットです。
※結論を先に述べるとリーク電流によるオフセットも発生しますが、この回路では12Kの抵抗を使いギリギリリークによるオフセットを1デジット以下になるように設計してありました。



温度計化


以前秋月で買ったLM35を組み合わせて温度計にしました。

184円のデジタル電圧計で温度計を作る(KKHMF 赤 DC3.2V-30V デジタル電圧計 適用6V 12V 電気自動車オートバイ)
お見苦しい図ですみません。

オフセット問題を解決する為、センサー部分のGNDは前出の写真にある青丸印のICの一番ピンに無理矢理ハンダ付けしました。
VRの摺動子端子は黄丸印に接続しています。
電源の+5Vは基板の電源用コネクタの後部から取り出しています。
ちなみに、電源は単三4本です。

184円のデジタル電圧計で温度計を作る(KKHMF 赤 DC3.2V-30V デジタル電圧計 適用6V 12V 電気自動車オートバイ)
上の写真は、温度計用の分圧用VRと温度センサー接続用のヘッダーピンです。

写真ではVRが100Kとなっています。当初100Kで試しましが、オフセットが6デジット出たのでICのリーク電流と判断し10Kに変更しました。



184円のデジタル電圧計で温度計を作る(KKHMF 赤 DC3.2V-30V デジタル電圧計 適用6V 12V 電気自動車オートバイ)
無事、オフセット対策は完了しました。


184円のデジタル電圧計で温度計を作る(KKHMF 赤 DC3.2V-30V デジタル電圧計 適用6V 12V 電気自動車オートバイ)
温度センサーを接続してゲインを調整しました。
因みにこのセンサーは10mV/℃(←あっ、手書きの図は丸の位置が違うゴメン)なので小数点の位置は違いますが
光っている点を黒シールで隠し、赤点のシールを然るべき所に貼ればいいじゃん。


感想


送料込みで184円なので、色々組み込みに使えます。
中国も何時迄もこの値段で出せなくなるでしょうから、今のうちに使えそうなものは買い込んでおくに限ります。

オフセットについては設計者も承知の上だと思われます。入力回路の抵抗値をみてもそれは伺えます。
本来の用途であれは最低3V程度からの使用が前提なので0.03は1%の誤差と言うことになるのでGOとしたのではないでしょうか。
お知らせ
■注意:Google Chrome以外のブラウザでは動作しない事もあります。
お好みに応じて
画像だけの表示でいいよ
やっぱり全部表示して
背景は黒がいいな
背景を元に戻して
サブジャンル
メモリアルマップ
My Favorite Photo
検索フォーム
プロフィール

otsu.usiwakamaru

Author:otsu.usiwakamaru
五条の橋でひらりひらりと欄干を飛び渡る牛若丸のように、興の向くまま電子回路にプログラミングに写真にと飛び回っています。

プロフィール詳細

カレンダー
09 | 2016/10 | 11
- - - - - - 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 31 - - - - -
キーワード
クリックしたキーワードの記事のみ表示します。

電池 試み IXY デザイン  改造 3D ミッキー 

最新記事
月別アーカイブ
全記事表示リンク

全ての記事を表示する

おすすめプログ(新着記事)
リンク


にほんブログ村
カテゴリ
ART (1)
橋 (0)
PIC (2)
カウンタ
訪問者数(UU)

アクセス数

現在の閲覧者数

tael no013用