エントリー

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

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で電圧降下もない)

 

低価格で入手できる5V昇圧DCDCを評価してみる

拙者はAVRを3.3Vで使用すること多いが稀に5Vで使うことがある

単純に5Vを用意すれば良い訳だが運用でなるべく以下のバッテリ(2種)を組み込んで利用したい

(1)秋月のNiMHバッテリ3.6V(使用電圧範囲3~3.8V位)

IMG_20180211_205856.jpg

  • コンパクトながら830mAhと容量があるので長く使用できる

(2)100均ライターから取り出したリポ(使用電圧範囲3~4.2V位)

IMG_20180211_205906.jpgIMG_20180211_210759.jpg

  • 基板ごと取り出してヒーター部を外す
  • タクトスイッチは付け替え電源スイッチとする
  • このままUSB充電できるので便利
  • 容量は少ないので低消費電力運用時利用となる

そこでポータブル用途として使うのを前提に扱い易い5V昇圧DCDCを検討してみた

昇圧回路の自作

最初に思いつくのは基板上に昇圧回路を組み込んでしまうことだ

そのためのパーツとしてHT7750Aを購入してあるのだがデータシートのように性能がでないようである

WS000028.png

気の迷いさん,電気の迷宮さんを参考にさせてもらっても面倒そうに思える

なので今回は(HT7750A版を含めて評価してみようと思ったが止め)100均の昇圧商品や既に購入してある中華のDCDCボードなど出来合いの物だけで評価する

チョイスした昇圧ボード

評価してみる昇圧ボードは以下の3つ

(1)USB charger

IMG_20170701_134325.jpgIMG_20170701_135725.jpgIMG_20180211_205629.jpg

  • セリアの商品
  • 単3アルカリ乾電池または充電池×2個使用
  • DC5.0/最大出力不明(おそらく100~200mA位)

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

IMG_20170627_192257.jpgIMG_20170627_192558.jpgIMG_20180211_205715.jpg

  • ダイソーの商品
  • 単3アルカリ乾電池×2個使用
  • DC5.0/500mAh(最大出力)

(3)中華のDCDCボード(Rasbee DC-DC 2A Boost ステップアップ 転換モジュール)

IMG_20180211_205731.jpg

  • 中華製品
  • 1個(税込み)100円(以下)
  • 最大出力電流:2A
  • 入力電圧:2V~24V,最大出力電圧:>28V
出力5V50mA固定で入力電圧を変動させ効率の測定

WS000029.png

  • AVRで使用される電力での効率測定
  • 中華は2Vから動作仕様
  • 使用するバッテリの電圧範囲である3~4V間で中華は90%近く優秀だがダイソーは75%で電圧が高い程よろしくない
入力電圧3.0V,3.6V,4.2Vでの負荷変動による出力電圧と効率の測定

(1)セリア USB charger

WS000030.png

  • 3.6Vと4.2Vは値が同じ
  • 140mAを超えると電圧が保てないので止め

WS000031.png

  • 140mAを超えると電圧が保てないので止め

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

WS000032.png

WS000033.png

(3)中華 DCDCボード

WS000034.png

WS000035.png

  • 出力電圧は無負荷で5.03Vにしてある
  • 安定した出力電流が得られていた
評価結果

ダイソーのモバイルバッテリーは500mAまで出力できるのだが効率が悪いので入力に余裕が必要

50mA位の出力ならどれを選択しても出力電圧は問題はないだろう

出力電圧を調整でき安定した電流を流せる中華のDCDCボードがコストパフォーマンスも高く抜けている

その他

IMG_20180212_100633.jpg

オシロによる波形測定を忘れていたので後で追加する

ページ移動

ユーティリティ

検索

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

過去ログ

Feed