エントリー

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

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

5V昇圧DCDCを評価の続き

前回の低価格で入手可能な5V昇圧DCDCの続きでオシロスコープで観た結果を追加

環境

入力3.6Vで5Vの昇圧出力,負荷はセメント抵抗で100Ω(50mA)と50Ω(100mA)の出力波形を観察した

IMG_20180218_164655.jpg

出力波形

オシロスコープの表示は縦目盛りを0.5Vにして5Vが中央になるように(0Vは画面下方外)スクロールしている

尚,左が100Ω(50mA),右が50Ω(100mA)の結果

(1)セリア USB charger

IMG_20180218_171101.jpgIMG_20180218_171348.jpg

(2)ダイソー モバイルバッテリー

IMG_20180218_171506.jpgIMG_20180218_171707.jpg

(3)中華 DCDCボード

IMG_20180218_171910.jpgIMG_20180218_172020.jpg

結果

セリアのリップルは問題になる程ではないが100mAになると大きくなっているのが判る

ダイソーはリップルが多く(0.30V位だけど)出力500mAまで使えるのは良いが使うのにためらいを感じる

ダイソーのボードを観るとコイルが基板から浮いているので影響しているのかもしれない

IMG_20180218_182658.jpg

中華はオシロスコープのノイズのみで実質リップルは観られない(50mA→100mAで電圧降下もない)

 

ページ移動

ユーティリティ

タグクラウド

検索

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

Feed