IV-27M ゴーストの出具合をみてみた

7 セグ LED やニキシー管など複数の桁をダイナミック表示する時に発生するのがゴーストです。うちとこの Blog では IN-12B ニキシー管ダイナミック点灯のテスト、主にゴースト対策 という記事でも過去とりあげたことがあります。今回は蛍光表示管なのですが、IV-27 はダイナミック点灯で使用するのが前提なのでゴーストは出にくい印象

2014-07-19 10.18.22

蛍光表示管にかける電圧を定格の24V を 30V まであげて、ブランキングタイム無し、0.5ms ごとに桁をドライブするパターンでうっすらとゴースト出たという次第。輝度差のあるのをデジカメで撮影するの難しいのでみにくくてすいません。

2014-07-19 10.21.23-2

電圧は 30V で同じ、0.5ms ごとに桁をドライブするのも同じでブランキングタイム 100μs 入れますとかなり改善します。

ゴースト出にくくて助かります。

IV-27M 蛍光表示管を Arduino で動かしてみる。

土曜日に基本の点灯まで行いました IV-27M 蛍光表示管ですが、シフトレジスタにデータ流す順番とかの整理もかねて配線を一部やりなおしました。とりあえずブレッドボードに乗っている部品から下記の回路図を書き出しもしました。

IV-27M CLOCK01

これに、Arduino UNO を接続しまして、シリアルポートから受信した数字を表示するようにプログラムを作成。これは、仕込んでおきたかった機能で、ゴースト確認用に数文字おきに表示とかしたいときなど便利です。
24V ではブランキングタイム入れてない状態でもゴーストほとんど出てないですが、24V の電源をもう少しあげてみたらハッキリ出るかも知れないので、一応ということです。

#include <SPI.h>
#include <stdio.h>
#include <string.h>

/* ------------------------------------------------------------
 -- Grobal Variables
 ------------------------------------------------------------ */
unsigned int msCount = 0;
boolean msCountOVF;
unsigned char vfdDigit = 0;
unsigned char vfdSeg[14];
unsigned char vfdDot[14];
char str01[20];

String inputString = "";     // a string to hold incoming data
boolean stringComplete = false;  // whether the string is complete


/* ------------------------------------------------------------
 -- Interrupt hundler (every 0.5ms)
 ------------------------------------------------------------ */
ISR(TIMER2_COMPA_vect) {

  sendVfd();
  msCount++;
  if(msCount >= 2000) {  // 1seconds 
    msCount = 0;
    msCountOVF = true;
  }
  // Reset interrupt flag and counter.
  TIFR2 &= ~(1<<OCF2A);
}

/* ------------------------------------------------------------
 -- Initial Setup
 ------------------------------------------------------------ */
void setup() {

  pinMode(4, OUTPUT);  // SCLR
  pinMode(5, OUTPUT);  // RCK

  // initialize SPI
  SPI.begin();
  SPI.setClockDivider(SPI_CLOCK_DIV2);
  SPI.setDataMode(SPI_MODE0);
  SPI.setBitOrder(MSBFIRST);

  //
  Serial.begin(9600);

  // Setup TIMER2
  // a. Disable the Timer/Counter2 interrupts by clearing OCIE2x and TOIE2.
  // b. Select clock source by setting AS2 as appropriate.
  // c. Write new values to TCNT2, OCR2x, and TCCR2x.
  // d. To switch to asynchronous operation: Wait for TCN2xUB, OCR2xUB, and TCR2xUB.
  // e. Clear the Timer/Counter2 Interrupt Flags.
  // f. Enable interrupts, if needed.

  // TIMSK2 2=OCIE2B 1=OCIE2A 0=TOIE2
  // Disable interrupt enable
  TIMSK2 &= ~(1<<OCIE2B);
  TIMSK2 &= ~(1<<OCIE2A);
  TIMSK2 &= ~(1<<TOIE2);
  // ASSR – Asynchronous Status Register
  // 6=EXCLK 5=AS2 4=TCN2UB 3=OCR2AUB 2=OCR2BUB 1=TCR2AUB 0=TCR2BUB  
  // AS2=0 CLKIO,  AS2=1 TOSC1
  ASSR &= ~(1<<AS2);
  // Waveform Generation Mode set to NORMAL mode WGM22,21,20=0
  TCCR2A &= ~(1<<WGM20);
  TCCR2A |= (1<<WGM21);
  TCCR2B &= ~(1<<WGM22);
  // TCCR2B – Timer/Counter Control Register B
  // 7=FOC2A 6=FOC2B 3=WGM22 2=CS22 1=CS21 0=CS20
  // CS22 CS21 CS20 Description
  // 0    0    0    No clock source (Timer/Counter stopped).
  // 0    0    1    clkT2S/(No prescaling)
  // 0    1    0    clkT2S/8 (From prescaler)
  // 0    1    1    clkT2S/32 (From prescaler)
  // 1    0    0    clkT2S/64 (From prescaler)
  // 1    0    1    clkT2S/128 (From prescaler)
  // 1    1    0    clkT2S/256 (From prescaler)
  // 1    1    1    clkT2S/1024 (From prescaler)
  TCCR2B |= (1<<CS22);
  TCCR2B &= ~(1<<CS21);
  TCCR2B &= ~(1<<CS20);
  TCNT2 = 0;
  OCR2A = 124; // 16MHz / 64 = 4us. 4us * 125 = 0.5ms
  // Clear interrupt flag
  // TIFR2 – Timer/Counter2 Interrupt Flag Register
  // 2=OCF2B 1=OCF2A 0=TOV2
  TIFR2 &= ~(1<<OCF2A);
  // TIMSK2 2=OCIE2B 1=OCIE2A 0=TOIE2
  // Enable interrupt
  TIMSK2 |= (1<<OCIE2A);
}

/* ------------------------------------------------------------
 -- Main loop
 ------------------------------------------------------------ */
void loop() {

  int i;
  int charLen;
  // serial input done
  // 9600 bps
  // help&#91;RET&#93; -> print help message
  // HH MM SS[RET] -> set time
  //
  if (stringComplete == true) {
    //Serial.println(inputString); 
    if(inputString.equals("help\r")) {
      Serial.println("help: I'm alive");
    } 
    else {
      for(i = 0; i < 14; i++) {
        vfdSeg&#91;i&#93; = 0;
        str01&#91;i&#93; = 0;
      }
      charLen = inputString.length();
      if(charLen > 15) {
        charLen = 15;
      }
      inputString.toCharArray(str01, charLen);
      for(i = 0; i < 14; i++) {
        convVfdSeg(i);
      }
    }
    inputString = "";
    stringComplete = false;
  }

}

/* ------------------------------------------------------------
 -- sendVfd
 ------------------------------------------------------------ */
void sendVfd() {

  unsigned int vfdBit;
  unsigned char vfdBitH;
  unsigned char vfdBitL;

  // HC595 SCLR(negedge: shift register clear)
  digitalWrite(4,LOW);
  digitalWrite(4,HIGH);  

  // HC595 RCK (posedge: data latch)
  digitalWrite(5,LOW);
  digitalWrite(5,HIGH);

  // send to shift register
  vfdBit = (1 << vfdDigit);
  vfdBitL = vfdBit & 0x00FF;
  vfdBitH = (vfdBit >> 8);
  //if(vfdDot[vfdDigit] != 0) {
  //  digit |= 0x80;
  // }

  SPI.transfer(vfdBitH);
  SPI.transfer(vfdBitL);
  SPI.transfer(vfdSeg[vfdDigit]);  


  // HC595 RCK (posedge: data latch)
  digitalWrite(5,LOW);
  digitalWrite(5,HIGH);  

  vfdDigit++;
  if(vfdDigit > 13) {
    vfdDigit = 0;
  }
}

/* ------------------------------------------------------------
 -- sendVfd
 ------------------------------------------------------------ */
void convVfdSeg(int digit) {

  switch(str01[digit]) {
  case '0': 
    vfdSeg[digit] = 0xFC; 
    break;
  case '1': 
    vfdSeg[digit] = 0x60; 
    break;
  case '2': 
    vfdSeg[digit] = 0xda; 
    break;
  case '3': 
    vfdSeg[digit] = 0xf2; 
    break;
  case '4': 
    vfdSeg[digit] = 0x66; 
    break;
  case '5': 
    vfdSeg[digit] = 0xb6; 
    break;
  case '6': 
    vfdSeg[digit] = 0xbe; 
    break;
  case '7': 
    vfdSeg[digit] = 0xe0; 
    break;
  case '8': 
    vfdSeg[digit] = 0xfe; 
    break;
  case '9': 
    vfdSeg[digit] = 0xe6; 
    break;
  case '-': 
    vfdSeg[digit] = 0x02; 
    break;
  }
}


/*
  SerialEvent occurs whenever a new data comes in the
 hardware serial RX.  This routine is run between each
 time loop() runs, so using delay inside loop can delay
 response.  Multiple bytes of data may be available.
 */
void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read(); 
    // add it to the inputString:
    inputString += inChar;
    Serial.write(inChar);
    // if the incoming character is a newline, set a flag
    // so the main loop can do something about it:
    if (inChar == '\r') {
      stringComplete = true;
      Serial.write('\r');
      Serial.write('\n');
    } 
  }
}

IV-27M 蛍光表示管点灯試験

2014-07-12 11.54.16

土曜日、朝からお昼までのワークで点灯試験というか基本回路の確認まできたところの状態。朝一は、あるていどちゃんと配線したほうがいいよなーと思いつつ作業初めましたが、途中でブチギレ。結局スパゲティになっちゃいました(笑)

2014-07-12 08.36.55

作業開始直後の切れる前に IV-27M 蛍光表示管のリード線をはんだ付け。ブレッドボードからジャンプワイヤ刺せるようにしておきました。

そのあと、ブレッドボードに 74HC595 のシフトレジスタと、TD62783 のソースドライバを配線して蛍光表示管と接続します。CPU は Arduino UNO です。以前作成した LD8113 蛍光表示管キットのテスト用に組んだ簡単な Arduino スケッチがあるのでを流用して 6 桁から 14 桁まで増やす修正入れて書き込み。最後にブレッドボードに組んだシフトレジスタと接続して完成でございます。

点灯させてみた感じは、14桁ダイナミック点灯したわりには明るさあったのがラッキー。ヒーター直流点灯も左右で極端に明るさ違ういうこともないのでラッキー。Aruduino UNO の USB 給電でも問題なく動いているので消費電力も低めかな。というのもラッキーなところです。
気になる点が減ったので、よかったです。数少ないけど頒布品にしましょうかねぇ。

IV-27 (ИВ-27) VFD (蛍光表示管) のピンアサインを調べた

2014-06-28 14.59.55-1

ピンアサインがわからないと使えませんので仕方なく調査開始。ブレッドボードに MC34063A を使用した 5V から 24V に昇圧するコンバーターと、パーツボックスに1個だけあった 3.3V 三端子レギュレータを配線して電源まわり完成でございます。

蛍光表示管はカソード(ヒーター)さえわかれば、ピンアサインを調べるのはなんとかなります。そしてヒーターは電線が繋っているのでテスターであたればわかります。それ以外がアノードとグリッドです(笑)
で調べた結果は以下のとおり。見直ししていないので保証はありません。すいません。

IV-27_pinAssign2

一覧に、IV-27M と IV-27 を載せてます。M サフィックスなしが古いやつです。IV-27M は比較的リード線の状態もマシなので不良はなさそうですが、届いた荷物に数個混ってた IV-27 は胡散臭い感じします。そしてピンアサインも違うので困ったものです。つか前回の記事にあげたデータシートと全然違ったので、あわてて前の記事から表消すなども困ったことです。さらに、ピンアサイン調査で既に2個不良発見というエゲツナイ状態。↓の写真のように半分しか表示されないとか、点灯しないとかです。
ヒーター電圧の確認は、電池で3V かけてみて赤くならず、電池一本追加で赤くなりました。データシートには 3.15V と 5.15V があったのですが。3Vのほうが正解だったようです。

2014-06-28 12.53.20-1

問題の無い管はヒーター以外に全部電圧かけてあげれば全部光ます。

2014-06-28 15.00.07-2

とりあえず、ピンアサインはだいたいわかったんでよしとしましょう。

IV-27 (ИВ-27) VFD (蛍光表示管) が届いた

2014-06-25 19.53.34

IV-27 ロシア製蛍光表示管が届きました。記号1桁数字13桁の合計14桁ある表示管です。買ったのはちょっとだけです。こんどの休みにヒーター電圧の確認はしておきたいなーと思うところです。この VFD より短かい IV-21 という 8桁やつはキットで売られてるのも見たことがあるのですが、この VFD って透き通っているというイメージがありました。届いた物の中(いちばん向こう側)は、古いのかして透き通ってないやつも混じっていました。これは別に取っておこうかしらと思うところ。

いつぞやの休みのときにロシア語のデータシートから写してみたものですが、キリル文字ローマ時変換で、現在使われていない文字とがたくさん出てきてたいへん苦労しました。セグメントなどは7セグ準拠におきかえています。空欄は翻訳出来ずに現物見ないとわかりせん状態であけてあります。
とにかくヒーター電圧の確認からですね。3.15V と書いているものと 5.15V と書いてあるデータシートがあるためです。ダイナミック点灯などうまくいけば、頒布品に加えられるかも知れませんがまだ先になりそうです。

事前に調べたピンアサインが全然違ったため画像は削除しました(2014.06.28)