ArduinoでTZ-250Aの制御

Arduino に関するご質問などはこちらへ。

ArduinoでTZ-250Aの制御

投稿記事by santan » 2013年9月30日(月) 18:05

Arduino でLCDユニットTZ-250Aを制御するスケッチを
仕様書を見て作ったのですが、動かすと表示が真っ暗なままです。
手順としてはあっていると思うのですが・・・。
どうしても動かしたいので分かる方ご教授をお願いします。

仕様書はこちらです。http://www.originalmind.co.jp/useds/uploaddoc/37008.pdf

コード: 全て選択
int D0_Pin = 2; //データライン0 out
int D1_Pin = 3; //データライン1 out
int D2_Pin = 4; //データライン2 out
int D3_Pin = 5; //データライン3 out

int Bsy_Pin = 6; //BUSY信号 in
int Str_Pin = 7; //STROBE信号 out
int Rst_Pin = 8; //RESET信号 通常LOW out

//データの定義
int disp_0[8] = {0,0,0,0,0,0,0,1};
int disp_1[8] = {1,0,0,0,0,0,0,1};
int disp_2[8]= {0,1,0,0,0,0,0,1};
int disp_3[8]= {1,1,0,0,0,0,0,1};
int disp_4[8]= {0,0,1,0,0,0,0,1};
int disp_5[8]= {1,0,1,0,0,0,0,1};
int disp_6[8]= {0,1,1,0,0,0,0,1};
int disp_7[8]= {1,1,1,0,0,0,0,1};
int disp_8[8]= {0,0,0,0,1,0,0,1};
int disp_9[8]= {1,0,0,0,1,0,0,1};
int disp_A[8]= {0,1,0,0,1,0,0,1};
int disp_B[8]= {1,1,0,0,1,0,0,1};
int disp_C[8]= {0,0,1,0,1,0,0,1};
int disp_D[8]= {1,0,1,0,1,0,0,1};
int disp_E[8]= {0,1,1,0,1,0,0,1};
int disp_F[8]= {1,1,1,0,1,0,0,1};

int disp_H[8]= {1,0,0,0,0,1,0,1};
int disp_I[8]= {0,1,0,0,0,1,0,1};
int disp_J[8]= {1,1,0,0,0,1,0,1};
int disp_L[8]= {1,0,1,0,0,1,0,1};

int disp_O[8]= {0,0,0,0,1,1,0,1};
int disp_P[8]= {1,0,0,0,1,1,0,1};
int disp_S[8]= {0,0,1,0,1,1,0,1};
int disp_U[8]= {0,1,1,0,1,1,0,1};

int disp_BL[8]= {0,0,1,0,0,0,1,1};
int disp_RR[8]= {0,1,1,0,0,0,1,1};
int disp_RL[8]= {1,1,1,0,0,0,1,1};

void setup() {               
  // initialize the digital pin as an output.
  pinMode(D0_Pin, OUTPUT);
  pinMode(D1_Pin, OUTPUT);
  pinMode(D2_Pin, OUTPUT);
  pinMode(D3_Pin, OUTPUT);
  pinMode(Bsy_Pin, INPUT);
  pinMode(Str_Pin, OUTPUT);
  pinMode(Rst_Pin, OUTPUT); 
  init_pin();
  Serial.begin(9600);
}

// the loop routine runs over and over again forever:
void loop() {
  write_display('B');

  delay(1000);

}

void init_pin(){

  //各ピンLowにセット
  digitalWrite(D0_Pin, LOW);
  digitalWrite(D1_Pin, LOW);
  digitalWrite(D2_Pin, LOW);
  digitalWrite(D3_Pin, LOW);
  digitalWrite(Str_Pin, LOW);
  digitalWrite(Rst_Pin, LOW);

  //リセットかける
  digitalWrite(Rst_Pin, HIGH);
  delay(500);
  digitalWrite(Rst_Pin, LOW);
  delay(1000);
}


void write_display(char disp_data){
  int i;
  int val = 0;
  int data[8];

  switch (disp_data){
  case '0':    memcpy(data, disp_0, sizeof(int) * 8);    break;
  case '1':    memcpy(data, disp_1, sizeof(int) * 8);    break;
  case '2':    memcpy(data, disp_2, sizeof(int) * 8);    break;
  case '3':    memcpy(data, disp_3, sizeof(int) * 8);    break;
  case '4':    memcpy(data, disp_4, sizeof(int) * 8);    break;
  case '5':    memcpy(data, disp_5, sizeof(int) * 8);    break;
  case '6':    memcpy(data, disp_6, sizeof(int) * 8);    break;
  case '7':    memcpy(data, disp_7, sizeof(int) * 8);    break;
  case '8':    memcpy(data, disp_8, sizeof(int) * 8);    break;
  case '9':    memcpy(data, disp_9, sizeof(int) * 8);    break;
  case 'A':    memcpy(data, disp_A, sizeof(int) * 8);    break;
  case 'B':    memcpy(data, disp_B, sizeof(int) * 8);    break;
  case 'C':    memcpy(data, disp_C, sizeof(int) * 8);    break;
  case 'D':    memcpy(data, disp_D, sizeof(int) * 8);    break;
  case 'E':    memcpy(data, disp_E, sizeof(int) * 8);    break;
  case 'F':    memcpy(data, disp_F, sizeof(int) * 8);    break;
  case 'H':    memcpy(data, disp_H, sizeof(int) * 8);    break;
  case 'I':    memcpy(data, disp_I, sizeof(int) * 8);    break;
  case 'J':    memcpy(data, disp_J, sizeof(int) * 8);    break;
  case 'L':    memcpy(data, disp_L, sizeof(int) * 8);    break;
  case 'O':    memcpy(data, disp_O, sizeof(int) * 8);    break;
  case 'P':    memcpy(data, disp_P, sizeof(int) * 8);    break;
  case 'S':    memcpy(data, disp_S, sizeof(int) * 8);    break;
  case 'U':    memcpy(data, disp_U, sizeof(int) * 8);    break;
  case '*':    memcpy(data, disp_BL, sizeof(int) * 8);    break;
  case ']':    memcpy(data, disp_RR, sizeof(int) * 8);    break;
  case '[':    memcpy(data, disp_RL, sizeof(int) * 8);    break;
  }


  //データ書き込み
  //①BUSY信号が0であることを確認
  while(val != 0){
    val = digitalRead(Bsy_Pin);
  }

    //LOWDATA書き込み
    digitalWrite(D0_Pin, data[0]);
    digitalWrite(D1_Pin, data[1]);
    digitalWrite(D2_Pin, data[2]);
    digitalWrite(D3_Pin, data[3]);
    //②データ送信準備完了
    digitalWrite(Str_Pin, HIGH);

    //③データ受信中になるまで待つ
    while(val != 1){
      val = digitalRead(Bsy_Pin);
    }
    //④データ送信完了
    digitalWrite(Str_Pin, LOW);

    //⑤⑥データ受信完了になるまで待つ
    while(val != 0){
      val = digitalRead(Bsy_Pin);
    }

    //⑦HIGHDATA書き込み
    digitalWrite(D0_Pin, data[4]);
    digitalWrite(D1_Pin, data[5]);
    digitalWrite(D2_Pin, data[6]);
    digitalWrite(D3_Pin, data[7]);
    //データ送信準備完了
    digitalWrite(Str_Pin, HIGH); 
    //データ受信中になるまで待つ
    while(val != 0){
      val = digitalRead(Bsy_Pin);
    }
    //データ送信完了
    digitalWrite(Str_Pin, LOW);
    //for (i =0; i<8;i++){
    //  Serial.print(data[i]);
    //}
    //Serial.print("\n");
}
santan
 
記事: 3
登録日時: 2013年9月29日(日) 21:18

Re: ArduinoでTZ-250Aの制御

投稿記事by senionetworks » 2013年10月01日(火) 11:00

santan さん、こんにちは、

コード: 全て選択
  int val = 0;
  int data[8];

  switch (disp_data){
  case '0':    memcpy(data, disp_0, sizeof(int) * 8);    break;
  ...
  case '[':    memcpy(data, disp_RL, sizeof(int) * 8);    break;
  }


  //データ書き込み
  //①BUSY信号が0であることを確認
  while(val != 0) {
    val = digitalRead(Bsy_Pin);
  }

の部分ですが、val の値は switch 文の前で 0 に設定されていて、switch 文の中では変更されませんから、while 文の直前では 0 です。ということは while(val != 0) { ... } の中の val = digitalRead(Bsy_Pin) は実行されません。

Bsy_Pin が LOW になるまで待つのであれば、例えば、
コード: 全て選択
while (digitalRead(Bsy_Pin) != LOW)
    continue;
のようにします。

ここで continue を使うのは趣味の問題で、次のように書いても同じです。
コード: 全て選択
while (digitalRead(Bsy_Pin) != LOW)
    ;

もし、変数 val に値を保持しておきたいのであれば
コード: 全て選択
do {
    val = digitalRead(Bsy_Pin);
} while (val != LOW);
とします。

Google の推奨コーディングでは continue を使うようです ;)

山口
senionetworks
 
記事: 115
登録日時: 2010年6月28日(月) 21:30

Re: ArduinoでTZ-250Aの制御

投稿記事by santan » 2013年10月01日(火) 20:35

こんばんは。
山口さん。回答ありがとうございます。
指摘の箇所を修正してみました。
もう一度ソースを見返してみたらSTROBE信号の切り替えが一部間違ってましたorz
これで動くと思いきや動かず。
壊れたかと思い別のユニットで試すも駄目でした :cry:
testモードでは動くので壊れてはいないはず・・・。

コード: 全て選択
int D0_Pin = 2; //データライン0 out
int D1_Pin = 3; //データライン1 out
int D2_Pin = 4; //データライン2 out
int D3_Pin = 5; //データライン3 out

int Bsy_Pin = 6; //BUSY信号 in
int Str_Pin = 7; //STROBE信号 out
int Rst_Pin = 8; //RESET信号 通常LOW out

//データの定義
int disp_0[8] = {0,0,0,0,0,0,0,1};
int disp_1[8] = {1,0,0,0,0,0,0,1};
int disp_2[8]= {0,1,0,0,0,0,0,1};
int disp_3[8]= {1,1,0,0,0,0,0,1};
int disp_4[8]= {0,0,1,0,0,0,0,1};
int disp_5[8]= {1,0,1,0,0,0,0,1};
int disp_6[8]= {0,1,1,0,0,0,0,1};
int disp_7[8]= {1,1,1,0,0,0,0,1};
int disp_8[8]= {0,0,0,0,1,0,0,1};
int disp_9[8]= {1,0,0,0,1,0,0,1};
int disp_A[8]= {0,1,0,0,1,0,0,1};
int disp_B[8]= {1,1,0,0,1,0,0,1};
int disp_C[8]= {0,0,1,0,1,0,0,1};
int disp_D[8]= {1,0,1,0,1,0,0,1};
int disp_E[8]= {0,1,1,0,1,0,0,1};
int disp_F[8]= {1,1,1,0,1,0,0,1};

int disp_H[8]= {1,0,0,0,0,1,0,1};
int disp_I[8]= {0,1,0,0,0,1,0,1};
int disp_J[8]= {1,1,0,0,0,1,0,1};
int disp_L[8]= {1,0,1,0,0,1,0,1};

int disp_O[8]= {0,0,0,0,1,1,0,1};
int disp_P[8]= {1,0,0,0,1,1,0,1};
int disp_S[8]= {0,0,1,0,1,1,0,1};
int disp_U[8]= {0,1,1,0,1,1,0,1};

int disp_BL[8]= {0,0,1,0,0,0,1,1};
int disp_RR[8]= {0,1,1,0,0,0,1,1};
int disp_RL[8]= {1,1,1,0,0,0,1,1};

void setup() {               
  // initialize the digital pin as an output.
  pinMode(D0_Pin, OUTPUT);
  pinMode(D1_Pin, OUTPUT);
  pinMode(D2_Pin, OUTPUT);
  pinMode(D3_Pin, OUTPUT);
  pinMode(Bsy_Pin, INPUT);
  pinMode(Str_Pin, OUTPUT);
  pinMode(Rst_Pin, OUTPUT); 
  init_pin();
  Serial.begin(9600);
}

// the loop routine runs over and over again forever:
void loop() {
  write_display('1');
  delay(1000);
  write_display('D');
  delay(1000);
}

void init_pin(){

  //各ピンLowにセット
  digitalWrite(D0_Pin, LOW);
  digitalWrite(D1_Pin, LOW);
  digitalWrite(D2_Pin, LOW);
  digitalWrite(D3_Pin, LOW);
  digitalWrite(Str_Pin, LOW);
  digitalWrite(Rst_Pin, LOW);

  //リセットかける
  digitalWrite(Rst_Pin, HIGH);
  delay(100);
  digitalWrite(Rst_Pin, LOW);
  delay(600);
}


void write_display(char disp_data){
  int i;
  int val = 0;
  int data[8];

  switch (disp_data){
  case '0':    memcpy(data, disp_0, sizeof(int) * 8);    break;
  case '1':    memcpy(data, disp_1, sizeof(int) * 8);    break;
  case '2':    memcpy(data, disp_2, sizeof(int) * 8);    break;
  case '3':    memcpy(data, disp_3, sizeof(int) * 8);    break;
  case '4':    memcpy(data, disp_4, sizeof(int) * 8);    break;
  case '5':    memcpy(data, disp_5, sizeof(int) * 8);    break;
  case '6':    memcpy(data, disp_6, sizeof(int) * 8);    break;
  case '7':    memcpy(data, disp_7, sizeof(int) * 8);    break;
  case '8':    memcpy(data, disp_8, sizeof(int) * 8);    break;
  case '9':    memcpy(data, disp_9, sizeof(int) * 8);    break;
  case 'A':    memcpy(data, disp_A, sizeof(int) * 8);    break;
  case 'B':    memcpy(data, disp_B, sizeof(int) * 8);    break;
  case 'C':    memcpy(data, disp_C, sizeof(int) * 8);    break;
  case 'D':    memcpy(data, disp_D, sizeof(int) * 8);    break;
  case 'E':    memcpy(data, disp_E, sizeof(int) * 8);    break;
  case 'F':    memcpy(data, disp_F, sizeof(int) * 8);    break;
  case 'H':    memcpy(data, disp_H, sizeof(int) * 8);    break;
  case 'I':    memcpy(data, disp_I, sizeof(int) * 8);    break;
  case 'J':    memcpy(data, disp_J, sizeof(int) * 8);    break;
  case 'L':    memcpy(data, disp_L, sizeof(int) * 8);    break;
  case 'O':    memcpy(data, disp_O, sizeof(int) * 8);    break;
  case 'P':    memcpy(data, disp_P, sizeof(int) * 8);    break;
  case 'S':    memcpy(data, disp_S, sizeof(int) * 8);    break;
  case 'U':    memcpy(data, disp_U, sizeof(int) * 8);    break;
  case '*':    memcpy(data, disp_BL, sizeof(int) * 8);    break;
  case ']':    memcpy(data, disp_RR, sizeof(int) * 8);    break;
  case '[':    memcpy(data, disp_RL, sizeof(int) * 8);    break;
  }


  //データ書き込み
  //①BUSY信号が0であることを確認
  while (digitalRead(Bsy_Pin) != LOW)
    continue;
   
    //LOWDATA書き込み
    digitalWrite(D0_Pin, data[0]);
    digitalWrite(D1_Pin, data[1]);
    digitalWrite(D2_Pin, data[2]);
    digitalWrite(D3_Pin, data[3]);
    //②データ送信準備完了
    digitalWrite(Str_Pin, HIGH);

    //③データ受信中になるまで待つ
  while (digitalRead(Bsy_Pin) != HIGH)
    continue;
   
    //④データ送信完了
    digitalWrite(Str_Pin, LOW);

    //⑤データ受信完了になるまで待つ
  while (digitalRead(Bsy_Pin) != LOW)
    continue;
   
    //⑥HIGHDATA書き込み
    digitalWrite(D0_Pin, data[4]);
    digitalWrite(D1_Pin, data[5]);
    digitalWrite(D2_Pin, data[6]);
    digitalWrite(D3_Pin, data[7]);
    //⑦データ送信準備完了
    digitalWrite(Str_Pin, HIGH);
   
    //⑧データ受信中になるまで待つ
  while (digitalRead(Bsy_Pin) != HIGH)
    continue;
   
    //⑨データ送信完了
    digitalWrite(Str_Pin, LOW);
   
   
    for (i =0; i<8;i++){
      Serial.print(data[i]);
    }
    Serial.print("\n");   
}
santan
 
記事: 3
登録日時: 2013年9月29日(日) 21:18

Re: ArduinoでTZ-250Aの制御

投稿記事by yamaguch » 2013年10月02日(水) 11:15

こんにちは、

仕様書を見てみました。
D0 - D3 の 4 本のラインのうち、どちらの端が LSB なのかが書かれていませんが、D0 を LSB だと仮定すると
'1' を表示するときには、LOW = 1, HIGH = 8 ですから、最初に送るのは
D0 = 1, D1 = 0, D2 = 0, D3 = 0
次に送るのは
D0 = 0, D1 = 0, D2 = 0, D3 = 1
となります。santan さんのスケッチはこうなっているようですね。

もし、D3 が LSB だとすると、D0, D1, D2, D3 の順序が逆になるので
最初に
D0 = 0, D1 = 0, D2 = 0, D3 = 1
次が
D0 = 1, D1 = 0, D2 = 0, D3 = 0
となります。こちらも試してみればいかがですか?

山口
yamaguch
 
記事: 482
登録日時: 2010年7月06日(火) 17:37

Re: ArduinoでTZ-250Aの制御

投稿記事by santan » 2013年10月02日(水) 18:03

こんばんは。

解決しました。

問題は、回路のほうにありましてデータライン4本のうち
端子の圧着がうまくいない配線1本とヘッダピンへのはんだ付けが
取れているもの1本がありましたorz
基本が全くなってませんでした :cry:

山口さんご指摘のwhile 文を修正したスケッチで無事に動きました!

これからライブラリ化に挑戦しようと思います。

大変ありがとうございました。
santan
 
記事: 3
登録日時: 2013年9月29日(日) 21:18


Return to Arduino 質問箱

cron