エントリー

カテゴリー「電子工作」の検索結果は以下のとおりです。

ページ移動

低抵抗測定器を完成させる(ハード)

こつこつ進めてはいたのだけど,ようやく簡易低抵抗測定器を完成させるところまで持ってきた

ケルビンクリップ

中華から購入したケルビンクリップを使用

IMG_20180415_180250818.jpg

周波数特性を気にする事がないため同軸にする必要もないので普通(少しは太い)のケーブルで作製

定電流回路

(基本は)LM317で定電流を生成するわけだが定電流値をmAにするかが悩みだった

結局,電源電圧の関係もあって80mA前後になるように調整できるようにした

IMG_20180218_163352.jpgIMG_20180415_141518075.jpg

普通の半固定抵抗で良いかと思って実験したが電流値が安定しないので多回転半固定抵抗にした(縦置きが良かったのだけど手持ちが横置きだった)

定電流用電源

4端子法を使用する上で2つの電源系統は個別にする必要があり,定電流用の電源はニッケル水素の3.6Vバッテリーを使用した

IMG_20180419_193734554.jpg

本体AVR用(低電圧測定)電源

今回の本体AVR用電源は5Vの必要がある

前々から考えていたダイソーの電子ライターとUSB電源の中身(DCDC)を連結して5Vを得る

IMG_20180419_193808831.jpg

このリポは200mAH程度であるが低消費電力であるため十分であることとUSBによって充電機能が付いているので便利

本体基板

実装の余裕があったので全部まとめてしまった

IMG_20180419_193831271.jpgIMG_20180419_193900089.jpg

今回,電源部分にはPHコネクタを利用し圧着にはエンジニアのPA-21を使用

IMG_20180422_141309653.jpg

高価なペンチであるが定評通り綺麗に圧着でき満足している

ケース

一番苦労するケースはダイソーのプラケースに落ち着く(プラなんで加工作業が軽減)

IMG_20180419_193948340.jpgIMG_20180419_202829778.jpg

出力端子,スイッチは下側にした(当初は上側で考えていたが測定対象が上側にくるのでこのほうが扱い易い)

外観

表示LCDは16x2と8x2を利用できるようにしている

IMG_20180419_203050340.jpg

回路図

HighTester_回路図.png

補足,実験(前回)からの変更点など

  • 定電流の調整に可変抵抗(R7)を追加
  • 定電流回路にバッテリー正常確認用としてLEDを追加
  • 電流制限のためR5,R6を追加 ← 間違いであってはいけない(回路図は更新)
  • 入力電源のリップル低減のためC1(22μF)を追加
  • 16MHzのセラロックを使用
  • LCDはI2C接続

5V昇圧DCDCを評価の続きの続き

ダイソー モバイルバッテリーのリップルが多かったのを出力側へコンデンサ追加で改善できるはずなので試してみた

バッテリーの充電等なら問題にならないが,マイコンの電源では基準電圧等の影響もあるため簡単に解消できるなら試しておこうと思うし,折角簡単に手に入る5V昇圧DCDCを見捨てるのも勿体ないためである(中華DCDCよりコンパクトというのも理由の1つ)

先ずは不要なパーツを外し付けられていたパーツを付け直してみた

IMG_20180224_182950283.jpgIMG_20180224_183003718.jpg

早速オシロで計測したが結果は変わらず

IMG_20180318_172223590.jpgIMG_20180318_171335073.jpg

そこで出力側に1μFを付けてみたがほとんど変化なし

IMG_20180318_171600036_BURST000_COVER.jpgIMG_20180318_171609473.jpg

10μFにしたところ少しは改善

IMG_20180318_171633550.jpgIMG_20180318_171651692.jpg

22μFにアップして効果あり

IMG_20180318_171758250.jpgIMG_20180318_171815650.jpg

もう少しなんとかなるか細かい波を小で押さえるため22μF+1μFにしてみるが変わらず

IMG_20180318_171940031.jpgIMG_20180318_171950983.jpg

22μF+0.1μFで少しの変化はあったが影響するほどではない

IMG_20180318_172132404.jpgIMG_20180318_172153934.jpg

出力に22μFを付ける位で良さそうで,もう少し頑張るなら22μF+0.1μFとする

大抵はマイコン側の電源ラインの違いところで0.1μFを付けているので22μFだけで十分と思われる

DSO138に付けたロータリエンコーダ

DSO138に付けたロータリエンコーダ・・・使えない訳でではないのだが早く回すと今一つの動作なのは感じていた

そこでロータリエンコーダ制御プログラムの修正を行うことにした

//DSO138改造
//ロータリエンコーダを取り付け V1.40
//
// ロータリエンコーダの回転を割込みで処理
// A・B軸割込みを全て受けて前回と今回でインデックス処理し回転カウントを蓄積
// メインループでは蓄積された量によってボタンをエミュレートする回数を決める
// 蓄積が少ない多いでロータリエンコーダの回転速度を判定し
// 初回をある程度の回数をボタン1回とし残りはボタン1回とする数を変動する
// 現在は2段階にしている
//
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <util/delay.h>

#define EN_A PB0
#define EN_B PB1
#define OUT1 PB2
#define OUT2 PB3

#define BTNON_TIME_US   (20000)   //ボタンON時間
#define BTNOFF_TIME_US  (10000)   //ボタンOFF時間
#define RT_FIRST_COUNT  (3)       //初回回転カウント数(クリック付きでは1クリック4なので4以下が望ましい)
#define RT_NEXT_COUNT   (2)       //初回以降の回転カウント数

//回転方向テーブル
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
// 0 + - 0 - 0 0 + + 0 0 - 0 - + 0
// 0: 静止,無効,+: 右,-: 左
static const int dir[] = { 0, 1, -1, 0, -1, 0, 0, 1, 1, 0, 0, -1, 0, -1, 1, 0 };
static int count = 0;
static int prev = 0;

//ロータリー動作割込み:前回値と今回値でインデックスを作り回転方向を蓄積
ISR(PCINT0_vect) {
int current = (PINB&0x03);
if(prev != current) { //チャタリング対応
int index = ((prev<<2) + current) & 0x0f;
count += dir[index];
prev = current;
}
}

void setup() {
//内蔵のプルアップ抵抗を有効にする場合は、DDRxで該当のピンを入力にした後
//そのピンをHIGHに設定する(有効にしない場合はLOWに設定する)
DDRB = (_BV(OUT1)|_BV(OUT2)); //pinMode(OUT1, OUTPUT); pinMode(OUT2, OUTPUT);
PORTB |= _BV(EN_A); //pinMode(EN_A, INPUT_PULLUP);
PORTB |= _BV(EN_B); //pinMode(EN_B, INPUT_PULLUP);
PORTB |= _BV(OUT1); //digitalWrite(OUT1, HIGH);
PORTB |= _BV(OUT2); //digitalWrite(OUT2, HIGH);

GIMSK |= (1<<PCIE); //PCINT割込みを有効
PCMSK = _BV(EN_A) | _BV(EN_B); //割込み許可ポートの設定
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
}

void loop() {
int dt;
boolean cont_flg = false; //連続中フラグ
int cont_cnt = 0; //連続中の前回残りカウント

for(;;) {
cli(); //割り込み禁止
dt = count;
count = 0;
sei(); //割り込み許可

if(dt == 0) {
//今回カウントが0なら回転を止めたと判断
//残りもリセットしてスリープ,残りカウントはクリアしないほうが良さそう
cont_flg = false;
// cont_cnt = 0;
sleep_mode();
} else {
dt += cont_cnt;
if(cont_flg) {
//継続
if(dt > 0) {
//右回転(+)
while(dt >= RT_NEXT_COUNT) {
PORTB &= ~_BV(OUT1); //digitalWrite(OUT1, LOW);
_delay_us(BTNON_TIME_US);
PORTB |= _BV(OUT1); //digitalWrite(OUT1, HIGH);
_delay_us(BTNOFF_TIME_US);
dt -= RT_NEXT_COUNT;
}
} else {
//左回転(-)
while(dt + RT_NEXT_COUNT <= 0) {
PORTB &= ~_BV(OUT2); //digitalWrite(OUT2, LOW);
_delay_us(BTNON_TIME_US);
PORTB |= _BV(OUT2); //digitalWrite(OUT2, HIGH);
_delay_us(BTNOFF_TIME_US);
dt += RT_NEXT_COUNT;
}
}
cont_cnt = dt;
} else {
//初回
//クリック1回分のカウントがあれば実行
if(dt >= RT_FIRST_COUNT) {
//右回転(+)
PORTB &= ~_BV(OUT1); //digitalWrite(OUT1, LOW);
_delay_us(BTNON_TIME_US);
PORTB |= _BV(OUT1); //digitalWrite(OUT1, HIGH);
_delay_us(BTNOFF_TIME_US);
cont_cnt = dt - RT_FIRST_COUNT;
cont_flg = true;
} else if(dt + RT_FIRST_COUNT <= 0) {
//左回転(-)
PORTB &= ~_BV(OUT2); //digitalWrite(OUT2, LOW);
_delay_us(BTNON_TIME_US);
PORTB |= _BV(OUT2); //digitalWrite(OUT2, HIGH);
_delay_us(BTNOFF_TIME_US);
cont_cnt = dt + RT_FIRST_COUNT;
cont_flg = true;
} else {
cont_cnt = dt;
}
}
}
}
}

使用しているロータリエンコーダはクリック付きの物であり1クリックで4回のカウントが出るので単純に4回を1回として数えるだけとかクリックを無視して全カウントを数えるとか試行してみたが操作性が良くならなかった

ロータリエンコーダの動作を得てもボタンのエミュレート処理の方で遅延が発生するためリアルタイムに処理できないためである

テストプラグラムでは右回転だけしていてもチャタリングや高速回転で処理が追い付かない場合もあるのか左回転と判断してしまう事もあることが判っている

そこで最終的に回転結果をQue化にすることにした

Queといっても1つずつ取り出して処理する必要はないので回転数をカウントしておくカウンタであり溜まったカウンタの数から回転速度を想定しボタンエミュレートする

今回は2段階速度の判定で操作性が十分になった

最後に

プログラムは難しいものでないので速攻で出来た・・・のだけど・・・実は思うように動作しないバグがあって情けないことに解決まで3時間位掛かった

デバッグコードが埋め込めないので動作予想できる範囲でコードをコメントアウトしながらデバッグした結果

以下が問題だったことがやっとこさ判る

static const byte dir[] = { 0, 1, -1, 0, -1, 0, 0, 1, 1, 0, 0, -1, 0, -1, 1, 0 };

サイン付きデータなのにサイン無しのbyteになっていたのである

書き換え前はサイン無しデータ(元は-1は2)だったので変更するのを忘れてしまっていた

しかしこれはコンパイラでwarning出して欲しい(それともメッセージ設定があって設定するのをミスってるのかな?)

バッテリー電圧測定器

セリアのUSBチャージャーの殻(シガーソケット)を使ってバッテリー電圧測定器を作製する

IMG_20180221_194527.jpgIMG_20180221_195203.jpg

中身は数年前にこばさんのUSB充電器で可変電源の製作そのままに可変電源を作製

IMG_20180222_194924.jpgIMG_20180222_194941.jpg

余りの殻が片付けしていたら出てきたって訳だ(捨てないで置いてあった)

IMG_20180221_195549.jpg

この殻に小型電圧計を仕込んでシガーソケットでのバッテリー電圧測定器にしてやろうって目論見

作製手順

(1)USB出力コネクタ部分を広げて小型電圧計が入るようにする

IMG_20180221_194646.jpgIMG_20180221_195634.jpg

(2)小型電圧計をホットボンドで固定して+-端子とケーブルで繋ぎ半田付け

(3)ー端子はハメ込みで,+端子はバネが必要なので良い具合の位置にホットボンドで固定した

IMG_20180222_194826.jpg

(4)組み立てて完了

IMG_20180222_195502.jpg

端子側のリングによる固定と中央部のはめ込みで上下は止まっているが,USB出力コネクタ側の左右に止めカギがあったのを削り取ったため強化としてLEDがあった部分の穴をネジ止めしてみた

使用状態

こんな感じで使う

IMG_20180222_195616.jpgIMG_20180223_175817285.jpg

ページ移動

ユーティリティ

検索

エントリー検索フォーム
キーワード

新着コメント

Re:ArduinoIDEでFTDIチップでの書き込みエラー
2026/01/16 from 権限がありません
Re:ArduinoIDEでFTDIチップでの書き込みエラー
2026/01/15 from admin
Re:ArduinoIDEでFTDIチップでの書き込みエラー
2026/01/14 from 権限がありません
Re:NOAA受信システム復旧
2025/06/11 from admin
Re:NOAA受信システム復旧
2025/06/11 from とおりすがり

過去ログ

Feed