ゆるく楽しむプログラミング

ATTiny85でフリスクに入る抵抗測定器を作ってみる

前回作成した1号機はいくつか欠点があたので作り直してみました。
1号機の欠点1:基準抵抗が3KΩ固定なので小さい抵抗も大きい抵抗も無理がある
1号機の欠点2:測定対象抵抗がない時の動作が不安定 ※時々発狂する

欠点2はスケッチを修正すれば解決する問題ですが、ケースがなくてむき出しなのも気になっていたのでケース付きで作り直してみました。

ATTiny85はAmazonで買うとボッタクリ価格になりますので秋月電子通商とかで買った方が良いです。
ATTiny85にIPLを書き込んでArduino化する方法はコッチを参照してください。

基準抵抗の問題

Arduino(ATTiny85/ATMega328P)のADC(アナログ入力)の解像度は0~1023なので、基準抵抗と測定対象の抵抗値がかけ離れている場合、小さな違いの判別ができなくなります

基準抵抗が小さいと、大きな抵抗の差異が分からなくなる


基準抵抗が大きいと、小さな抵抗の差異が判別できない


128x32ドット OLED SSD1306の問題


 表示には128x32ドットのOLEDを使用します。
 OLED SSD1306の使い方は128x64ドットと同じですが
 表示行が32ドットしかないためチョット特殊な構造になっています。

 128x64ドットの上半分とか下半分とかなら簡単だったのですが
 偶数行だけ表示となっているため調整が必要です。


スペックシートに記載されているこのモードのグリーンのラインだけが使用されていて、オレンジのラインは繋がっていません。


偶数行しか表示されないので、こんな感じで普通にやったら文字が表示できません。


なので、こんな風に、表示前のデータを縦方向に2倍に引き伸ばして表示します。


何度も ATTiny85 に書き込みのは面倒なので、まずはArduinoUNOで仮組してスケッチのデバックを行います。


ArduinoUNOで動作確認が出来たらATTiny85でも確認


スイッチサイエンスでフリスクサイズの基板が購入できますので利用しました。
ケースも基板も削ったので、普通のユニバ―サル基板で良かったな… (´・ω・`)


REGISTER-CHECKER_ATTiny85.zip ※ATTiny85用
REGISTER-CHECKER.zip ※ArduinoUNO用 - ピン番号が違うだけです

※ <>を全角<>に置き換えています。コピペの際は注意してください。
  リストはメイン部分だけです。
  ZIPファイルにはSSD1306制御/表示用ビットマップデータも入っています。
#include "DISP7SEG.h"
#define ANALIZE_PIN A2
#define VCCCHECK_PIN A3
#define MODESEL 1

DISP7SEG disp ;
int mode ;

// ----------------------
// ----- セットアップ -----
// ----------------------
void setup() {
  Wire.begin();
  disp.init() ;
  mode = 0 ;

  pinMode(ANALIZE_PIN, INPUT);
  pinMode(VCCCHECK_PIN, INPUT);
  pinMode(MODESEL, INPUT);
}

void loop() {
  // ----- 抵抗値算出 -----
  mode = (digitalRead(MODESEL) == HIGH) ? 0 : 1 ;
  int vccData = analogRead(VCCCHECK_PIN) ;
  int readData = analogRead(ANALIZE_PIN) ;
  int r = 0 ;
  if ( mode == 0) {
    r = (vccData - readData) * (1000.0 / readData) ;
  } else {
    r = (vccData - readData) * (10000.0 / readData) ;
  }

  // ----- 表示用数値に変換 -----
  int n1 = 12 ;
  int n2 = 12 ;
  int n3 = 12 ;
  int n4 = 12 ;
  int range = 0 ;
  if (r > 0) {
    if (r < 1000) {
      n1 = r / 1000 ;
      n2 = (r % 1000) / 100 ;
      n3 = (r % 100) / 10 ;
      n4 = r % 10 ;
      if (n1 == 0) { n1 = 416 ; }
      if (n1 == 0 && n2 == 0) { n2 = 416 ; }
      if (n1 == 0 && n2 == 0 && n3 == 0) { n3 = 416 ; }
    } else {
      range = 1 ;
      n1 = r / 10000 ;
      n2 = (r % 10000) / 1000 ;
      n3 = 10 ;
      n4 = (r % 1000) / 100 ;
      if (n1 == 0) { n1 = 416 ; }
    }
  }

  // ----- 表示 -----
  // --- MODE
  disp.disp7SEG(4,0,13) ;
  if (mode == 0) {
    disp.dispFont16( 0,4,' ') ;
    disp.dispFont16( 8,4,'1') ;
  } else {
    disp.dispFont16( 0,4,'1') ;
    disp.dispFont16( 8,4,'0') ;
  }
  disp.dispFont16(16,4,'K') ;

  // --- 抵抗値表示
  disp.disp7SEG(28,0,n1) ;
  disp.disp7SEG(44,0,n2) ;
  disp.disp7SEG(60,0,n3) ;
  disp.disp7SEG(76,0,n4) ;

  // --- 単位表示
  if (range == 0) {
    disp.disp7SEG(100,4,14) ;
    disp.disp7SEG(113,4,214) ;
  } else {
    disp.dispFont16(100,4,'K') ;
    disp.disp7SEG(108,4,14) ;
  }

  // ----- 計測間隔
  delay(1000) ;
}

解説動画