macsbug

Just another WordPress.com site

32ch Digital Analyzer for Arduino DUE + TFT 5int Touch Display

leave a comment »

32ch Digital Analyzer の表示装置に、TFT LCD 5インチ・タッチディスプレーを使用した。

 


応用例として、LRA-900 Low Range Altimeter の 32bit FLAG WORD Monitor を製作した。

LRA-900 is being high-performance and an expensive masterpiece product of the completeness.

 

due_TFT

 

 

 

FW_BOX_5int

 

 

 

 

 

 

 

 

 

 

 

 

 

 

FLAGは、MONITOR PROCESSOR FLAG WORD と ALTITUDE PROCESSOR FLAG WORD がある。
タッチ操作により、MONITOR か ALTITUDE に切り替える。
時間軸でモニターし、32bit をリアルタイムに把握する事ができる。

FW_mon_5int

 

 

 

 

 

 

 

 

 

 

 

 


5.0 inch TFT LCD Touch Displayについて。
 表示用IC(display controller)は、SSD1963 が使用されている。
 解像度は、800 x 480 dot。縦に32chの表示が可能。
 Arduino DUEとの接続は、DUE用のshieldを使用する。(MEGA2560は、MEGA用のshieldがある)
 タッチセンス機能があり入力や操作が可能。
 SD Card Holder が搭載されている。


32ch Digital Analyzer の機能について。
 1.  Free Run (電源ON時は、デモモードとなり、全画面をタッチすると測定モードになる)
 2.  MONITOR PROCESSOR FLAG WORD叉はALTITUDE PROCESSOR FLAG WORDを表示。(左名称部タッチ)
 3.  表示停止機能「PAUSE」ON/OFF。(デジタル表示部をタッチする)


購入方法:ebayから購入。(国内よりebayの方が安い)

 1.  Arduino DUE ($27,  JPY 2,962)

 2.  5.0 Inch TFT LCD module with touch for Arduino DUE or MEGA2560 ($50.99,  JPY 5,593):資料重要

 3.  CTE TFT LCD / SD card shield for Arduino DUE ($9.99,  JPY 1,096)


ケースについて。
 図面製作ツールは、3D CADの VectorWorks を使用。
 ケース製作は、MAKERBOT の Replicator 2X 3Dプリンターを使用。(2013年6月MAKERBOTより購入:$2,980)


スケッチ(プログラム)について。

DUE  PORT操作方法:信号の入出力はPORTを介して行われ、信号に応じて高速操作が必要になる。
 高速PORT操作には、以下の読み込みルーチンを使用した。
 Port manipulation PINx commands with Arduino Due

inline int PIN(int pin){                         // PIN:Port INPUT
  return !!(g_APinDescription[pin].pPort ->      // digitalReadDirect
        PIO_PDSR & g_APinDescription[pin].ulPin);//
}

TFT LCD Module with Touch:
 以下のディスプレー・ライブラリ、タッチ・ライブラリ−、タッチ・キャリブレーションを使用した。
 1.    UTFT   LibraryTFT Arduino and chipKit Universal TFT display library Manual :資料重要
   Controller は、SSD1963 を使用。LCD module nameは、CTE50。
   設定:UTFT myGLCD(CTE50,25,26,27,28); (name=CTE50、数値は、Pin番号)
 2. UTouch Library:UTouch myTouch(6,5,4,3,2):資料重要

 3.    UTouch Calibration Data Verification
   Calibrationの結果(X,Y,S)は、Document(書類)>libraries>UTouch>UTouchCD.h に記載する。
   Editor は、できれば、jedit X が望まれる。

// UTouchCD.h
// These calibration settings works with my ITDB02-3.2S.
// They MIGHT work on your display module, but you should run the
// calibration sketch anyway.
//#define CAL_X 0x00378F66UL
//#define CAL_Y 0x03C34155UL
//#define CAL_S 0x000EF13FUL
#define CAL_X 0x00444F19UL
#define CAL_Y 0x039FC194UL
#define CAL_S 0x801DF13FUL

補足:
 ebayで販売されている、5.0 Inch TFT LCD moduleの説明は丁寧でとても参考になります。
 UTFT Library は多種類のLCD Moduleを動作させる事ができ、マスターする事により即座に表示が可能になる。
 UTFT Libraryを開発された、Henning Karlsen氏に敬意を評すると共に、donationにて感謝の気持ちを伝えました。

 iPadを表示装置にするアイデアはとても良い。なぜなら大きさもデザインも良いしハードを組まなくて良い。
 必要なのは、Xcodeでのプログラム開発能力。これで、表示装置の開発は無用で、何でもできてしまう。
 WiFi UDP Protcol によりシリアル通信が可能でプログラムを製作し、TFT LCD Displayと同等に表示できた。
 私の脳みその問題だろうが、表示する所まではできたが、メモリーオバーフローの問題が未解決のXcodeのやりにくさ。
 Xcode:命令に対してメモリー管理をする命令が必要。これはXcodeがやって欲しいし、ARC機能ONでも効かない。

 他のプロトタイピングツール(Raspberry Piとか)を使用する場合、ポイントは表示装置とそのライブラリ−があるかという事。


スケッチ

//=========================================================================
// LRA-900 FLAG WORD Analyzer for Arduino DUE + 800x480 Display
//=========================================================================
// ORG    2013.12.30  32bit ARM Cortex-M3 CPU + TFT + Touch          s.ono
// REV 1  2014.02.03  FLAG WORD     : LRA-900
// REV 2  2014.02.05  FLAG WORD     : LRA-900
// REV 3  2014.02.05  FLAG WORD     : 429 input
//-------------------------------------------------------------------------
// ARINC 429    : 1 Word 32 bit                       : 2.54  msec
// ARINC 429    : 1 cycle                             :  80   usec         
//-------------------------------------------------------------------------
// Arduino DUE  : Atmel SAM3X8E ARM Cortex-M3 CPU     : 32bit 84MHz
// Arduino DUE  : 1 cpu clock cycle : 1sec/84MHz      :  11.9 nsec
// Arduino MEGA : 1 cpu clock cycle : 1sec/16MHz      :  62.5 nsec
//-------------------------------------------------------------------------
// Arduino MEGA : digitalWrite   : 44 CPU CLOCK CYCLE : 2.750 msec
// Arduino MEGA : PORTB _BV(PBx) :  3 CPU CLOCK CYCLE : 187.5 nsec
// Arduino DUE  : digitalWrite   : 44 CPU CLOCK CYCLE : 523.6 nsec
// Arduino DUE  : digitalRead    : 30 CPU CLOCK CYCLE : 357.1 nsec
// Arduino DUE  : DirectPort Read: 26 CPU CLOCK CYCLE : 307.7 nsec
//-------------------------------------------------------------------------
// UNO,MEGA :
// if(bit_is_set(PIND,PIND2)){PORTB=_BV(1)|_BV(2);// D2=HIGH->D9,D10 HIGH
// }else{ PORTB &= ~_BV(1) & ~_BV(2);}        // D2 not HIGH->D9,D10 LOW
// DUE :
// if ( digitalRead(2) == HIGH){ digitalWrite(13,HIGH);}
// Arduino DUE   : Port manipulation PINx commands with Arduino Due
//                 http://forum.arduino.cc/index.php?topic=129868.15
//-------------------------------------------------------------------------
// Arduino Due       (84MHz) : Arduino 1.5.2
//-------------------------------------------------------------------------
// 5.0" 800x480 TFT LCD Module, Controller : SSD1963
// UTFT   Library: http://henningkarlsen.com/electronics/library.php?id=51
// UTouch Library: http://henningkarlsen.com/electronics/library.php?id=55
// UTouch Calibration Data Verification
//               : http://henningkarlsen.com/electronics/t_cal_verify.php
//=========================================================================
// mode 0 : Free RUN  : RECEIVER, LED DISP, DRAW DISP
// mode 1 : PAUSE     : PAUSE ON/OFF
//=========================================================================
// Binary sketch size: 48,828 bytes (of a 524,288 byte maximum) - 9% used
//=========================================================================
#include <UTFT.h>                                // UTFT   Routine
#include <UTouch.h>                              // UTouch Routine
extern uint8_t SmallFont[];                      // Small Font
extern uint8_t BigFont[];                        // Big   Font
extern uint8_t SevenSegNumFont[];                // SevenSegNumFont
UTFT   myGLCD(CTE50,25,26,27,28);                // TFT set
UTouch myTouch(6,5,4,3,2);                       // Touch setup
//-----------------------------------------------// Receiver
int const RA = 9;                                // 429A input port
int const RB = 8;                                // 429B input port
int const DA = 10;                               // DISABLE input port
String n = "00000000000000000000000000000000";   // nul data
String b = "00000000000000000000000000000000";   // Receiver 32bit
String c = "00000000000000000000000000000000";   // 32bit buffer
int ax;                                          // Read 429A data
int bx;                                          // Read 429B data
//-----------------------------------------------// Display
int d = 5;                                       // x division
int H;                                           // Hi Level
int L;                                           // Lo Level
int x1 = 210;                                    // Analyzer x start pos
int bk = 0;                                      // background color R.G.B
int pa;                                          // Parity bit
String parity;                                   // Parity:ODD/EVE
//-----------------------------------------------// Touch
int mode = 0;                                    // Loop mode:0,1
int f_mode = 0;                                  //
//=========================================================================
inline void POUT(int pin, boolean val){          // POUT:Port OUTPUT
  if(val) g_APinDescription[pin].pPort ->        // digitalWriteDirect
        PIO_SODR = g_APinDescription[pin].ulPin; //
  else    g_APinDescription[pin].pPort ->        //
        PIO_CODR = g_APinDescription[pin].ulPin; //
}                                                //
//=========================================================================
inline int PIN(int pin){                         // PIN:Port INPUT
  return !!(g_APinDescription[pin].pPort ->      // digitalReadDirect
        PIO_PDSR & g_APinDescription[pin].ulPin);//
}                                                //
//=========================================================================
void setup() {                                   //
 //Serial.begin(115200);
 pinMode( 8, INPUT);                             // 429B
 pinMode( 9, INPUT);                             // 429A
 pinMode(10, INPUT);                             // DISABLE INPUT
 pinMode(13, OUTPUT);                            // LED 13 OUTPUT
 digitalWrite(13,LOW);                           // Pin 13 LOW
 //----------------------------------------------//
 myGLCD.InitLCD();                               // LCD Initialize
 myGLCD.setFont(SmallFont);                      // Font : smallfont
 myGLCD.clrScr();                                // LCS Clear
 myTouch.InitTouch();                            // Touch Initialize
 myTouch.setPrecision(PREC_EXTREME);             // Touch Sence MAX
 myGLCD.setColor(bk,bk,bk);                      // panel background color
 myGLCD.fillRect(0, 0, 800, 480);                // panel all fill
 //----------------------------------------------//
 bit_info();                                     // 1/0 info
 led_set();                                      // LED setup
 mon_flag_word_set();                            // Monitor Flag Name set
 scope_set();                                    // Analyzer Scope set
}                                                //
//===============================================//=======================
void loop() {                                    //
 while (myTouch.dataAvailable() == true) {       // interupt Touch
   mode = touch(mode,x1);                        // MODE READ
   delay(150);                                   //
 }                                               //
 if ( mode == 1 ){ goto pass;}                   // -> Receiver
 //goto sim;
//-----------------------------------------------//---------------------
 // 32 bit Reciver                               // mode = 0 only
 //----------------------------------------------// --------------------
 d1:  ax = PIN(DA); if ( ax == 0 ){ goto d1 ;}   // Disable check
 b = n;                                          // null set
 for ( int i=0; i<32; i++ ){                     // 32 bit
 p1: ax = PIN(RA); bx = PIN(RB);                 // 429A,B READ
     if (( ax == 0 ) && ( bx == 0 )){ goto p1;}  // 0 LOOP
     if ( ax == 1 ){ b[i] = '1';                 // 1 store
 p2:   if ( PIN(RA) == 1 ){ goto p2;}            // H Level ck
       goto p4;                                  // next
     }                                           //
 p3: if ( PIN(RB) == 1 ){ goto p3;}              // H Level ck
 p4:;                                            // next
 }                                               //
 //sim:
 //for (int i=0; i<32; i++ ){b[i]=random(48,50);}  // 32bit = 0 to 31 gen
 //delay(100);
  //---------------------------------------------// --------------------
  pa = b[0];                                     //
  for ( int i=1; i<32; i=i++){ pa = pa ^ b[i];}  //
  if ( pa == 1 ){ parity = "ODD";}               // odd parity (1)
  if ( pa == 0 ){ parity = "EVE";}               // eve parity (0)
  myGLCD.setColor(255,255,255);                  // LABEL color white
  myGLCD.print(parity, 55, 29);                  // parity disp
  // 32 bit display------------------------------//---------------------
  myGLCD.setColor(65,105,225);                   // color blue
  myGLCD.fillRect(x1,40,x1+d,474);               // Draw Clear bar
  //---------------------------------------------// --------------------
  for ( int i=0; i<32; i++ ){                    // 32bit=(0)1-(31)32
    if (b[i] == '1'){myGLCD.setColor(0,255,0);}  // LED color green '1'
    if (b[i] == '0'){myGLCD.setColor(255,165,0);}// LED color orange
    H = 13*i + 51; L = 13*i + 56;                // LA H/L POS
    myGLCD.fillRect(28,H,43,L);                  // LED bit fill
    //-------------------------------------------// --------------------
    myGLCD.setColor(255,255,255);                // LA bit color white
    if (b[i]!=c[i]){myGLCD.drawLine(x1,L,x1,H);} // LA bit CG V-line
    if (b[i]=='0'){myGLCD.drawLine(x1,L,x1+d,L);}// LA bit 0 level LO
    if (b[i]=='1'){myGLCD.drawLine(x1,H,x1+d,H);}// LA bit 1 level HI
    //-------------------------------------------// --------------------  
    c[i] = b[i];                                 // store bit "0/1"
  }                                              // end of to 32 bit
  x1 = x1 + d;                                   // x inc
  if ( x1 > 780 ){ x1 = 210;}                    // x pos max,start
 d2:  ax = PIN(DA); if ( ax == 1 ){ goto d2 ;}   // Disable check
 pass:;                                          //
}                                                // end of loop
//===============================================//========================
// Touch Routine                                 //
//=========================================================================
int touch(int mode, int x1){                     // Touch
  long xt, yt;                                   // a,y position
  myTouch.read();                                // TOUCH READ
  xt = myTouch.getX();                           // X TOUCH
  yt = myTouch.getY();                           // Y TOUCH
  // PAUSE ---------------------------------------------------------------
  if ( xt > 300 & xt < 800 & yt > 40 & yt < 480){// PAUSE MODE AREA
    if ( mode == 0 ){                            //
      mode = 1;                                  // MODE 1
      myGLCD.setColor(200,200,255);              // Draw bit Clear
      myGLCD.fillRect(x1,40,x1+5,474);           // Draw bit Clear
      delay(100);                                // WAIT
    }                                            //
    else{mode = 0;delay(50);}                    // MODE 0, FREE RUN, WAIT
  }                                              //
  // FLAG NAME ---------------------------------------------------------------
  if (xt > 0 & xt < 100 & yt > 0 & yt < 480){    //
    if ( f_mode == 0 ){                          //
      alt_flag_word_set();                       // Altitude FLAG Word
      f_mode = 1;                                //
      delay(100);                                //
    }                                            //
    else{                                        //
      mon_flag_word_set();                       // Monitor  Flag word
      f_mode = 0;                                //
      delay(100);                                //
    }                                            //
  }                                              //
  return mode;                                   // mode(0/1) retuern
}                                                //
//=========================================================================
void led_set(){                                  //
 String bn;                                      // LED 1-32 bit NO
 for (int y=1; y<33; y++){                       // LED 1-32 bit NO
   myGLCD.setColor(255, 255, 255);               // LED 1-32 bit NO
   bn = " " + String(y);                         // LED 1-32 bit NO
   if (y < 10) { bn = "  "+String(y);}           // LED 1-32 bit NO
   myGLCD.print(bn, LEFT, 35 + y*13);            // LED 1-32 bit NO
 }                                               // LED 1-32 bit NO
  //---------------------------------------------//
  for (int y=50; y<460; y+=13){                  // LED waku 1-32
    myGLCD.setColor(255,255,255);                // LED waku 1-32
    myGLCD.fillRect(27, y, 44, y+7);             // LED waku 1-32
  }                                              // LED waku 1-32 kage
}                                                //
//=========================================================================
void alt_flag_word_set(){                        // MONITOR Processor Flag Word
  String msg[32] = {                             // FLAG WORD 32BIT LIST(0 to 31)
  "PAD (always high)","ALTIMETER STATUS",        //
  "MONITOR STATUS","COUNTER MODES",              //
  "PAD (always low)","INPUT (Discreate)",        // "INPUT (Discreate:Arinc,AID,ANT,flag)"
  "UART","BIN ALT COMPARIS",                     // "BINARY ALTITUDE COMPARISION"
  "SELF TEST","SELF TEST DELTA",                 //
  "SELF TEST ERROR","LIFSPDR","HIFSPDR",         //
  "LIFSPST","LO IF SIG PRES",                    // "LO IF SIGNAL PRESENCE"
  "HI IF SIG PRES",                              // "HI IF SIGNAL PRESENCE"
  "40 FOOT AID","57 FOOT AID","80 FOOT AID",     //
  "RAM TEST (CK OK)",                            // "RAM TEST (RAM CHECKS OK)"
  "ROM TEST (CK OK)",                            // "ROM TEST (ROM CHECKS OK)"
  "SDI (LSB)","SDI (MSB)","FRONT SELF TEST",     // "FRONT PANEL SELF-TEST"
  "MATH","VALID DATA","CURR ALT MODE(LSB)",      // "CURRENT ALTIMETER MODE-(LSB)"
  "CURR ALT MODE(MSB)",                          // "CURRENT ALTIMETER MODE-(MSB)"
  "BAND SW(LSB)","BAND SWITCHES","BAND SW(MSB)", //
  "PARITY"};                                     //
  //---------------------------------------------//
  myGLCD.setColor(0,0,0);                        // panel background color
  myGLCD.fillRect(0, 0, 400, 12);                // panel all fill
  myGLCD.setBackColor(0,0,0);                    // moji background color
  myGLCD.setColor(255, 255, 255);                //
  myGLCD.setFont(BigFont);                       //
  myGLCD.print(" LRA-900 Altitude Processor Flag Word",LEFT,1);
  //---------------------------------------------//  
  myGLCD.setColor(0,0,0);                        // panel background color
  myGLCD.fillRect(55, 50, 198, 460);             // panel all fill
  int mc = 0;                                    //
  myGLCD.setFont(SmallFont);                     //
  myGLCD.setColor(255,255,255);                  // Flag word "LABEL"
  myGLCD.setBackColor(0,0,0);                    //
  for (int y=50; y<460; y+=13){                  // LED waku 1-32
    myGLCD.print(msg[mc],55,y-2);                // Flag word "LABEL"
    mc++;                                        //
  }                                              // LED waku 1-32 kage  
}                                                //
//=========================================================================
void mon_flag_word_set(){                        //
  String msg[32] = {                             //
  "PAD (always high)","ALTIMETER STATUS","MATH", //
  "COUNTER MODE","PAD (always low)","SELF-TEST", //
  "SELF-TEST DELTA","SELF-TEST ERROR","MONITOR", //
  "PASS COUNTER","MODE ERROR","UART","SSM",      //
  "BIN ALT COMPARIS",                            // "BINALY ALTITUDE COMPARISION",
  "VALID DATA","LIFSPST","INPUT",                //
  "CURR ALT MODE(LSB)",                          // "CURRENT ALTIMETER MODE-(LSB)",
  "CURR ALT MODE(MSB)",                          // "CURRENT ALTIMETER MODE-(MSB)",
  "LO IF SIG PRES",                              // "LO IF SIGNAL PRESENCE"
  "HI IF SIG PRES",                              // "HI IF SIGNAL PRESENCE"
  "LIFSPDR","HIFSPDR","PAD","40 FOOT AID",       //
  "57 FOOT AID","80 FOOT AID","RAM PASS LOW",    //
  "RAM PASS HIGH","ROM PASS","POWER","PARITY"};  //
  //---------------------------------------------//
  myGLCD.setColor(0,0,0);                        // panel background color
  myGLCD.fillRect(0, 0, 400, 12);                // panel all fill
  myGLCD.setBackColor(0,0,0);                    // moji background color
  myGLCD.setColor(255, 255, 255);                //
  myGLCD.setFont(BigFont);                       //
  myGLCD.print(" LRA-900 Monitor Processor Flag Word",LEFT,1);
  //---------------------------------------------//
  myGLCD.setColor(0,0,0);                        // panel background color
  myGLCD.fillRect(55, 50, 198, 460);             // panel all fill
  int mc = 0;                                    //
  myGLCD.setFont(SmallFont);                     //
  myGLCD.setColor(255,255,255);                  //
  myGLCD.setBackColor(0,0,0);                    //
  for (int y=50; y<460; y+=13){                  // LED waku 1-32
    myGLCD.print(msg[mc],55,y-2);                // Flag word "LABEL"
    mc++;                                        //
  }                                              //
}                                                //
//=========================================================================
void bit_info(){                                 //
  myGLCD.setFont(SmallFont);                     //
  myGLCD.setColor(255, 255, 255);                // 1/0 info
  myGLCD.print("10",29, 23);                     // 1/0 info
  myGLCD.setColor(255,255,255);                  // 1/0 waku
  myGLCD.fillRect(27, 37, 44, 44);               // 1/0 waku
  myGLCD.setColor(0, 255, 0);                    // 1   color
  myGLCD.fillRect(28, 38, 34, 43);               // 1   fill
  myGLCD.setColor(255, 165, 0);                  // 0   color
  myGLCD.fillRect(36, 38, 43, 43);               // 0   fill
}                                                //
//=========================================================================
void scope_set(){                                //
  myGLCD.setColor(255,255,255);                  // LA WAKU WHITE kage
  myGLCD.drawRect(199, 39, 791, 475);            // LA WAKU WHITE kage
  myGLCD.setColor(65,105,225);                   // LA BACK GROUND
  myGLCD.fillRect(200, 40, 790, 474);            // LA BACK GROUND
}                                                //
//=========================================================================



		

Written by macsbug

9月 30, 2014 @ 2:14 pm

カテゴリー: Arduino

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。