2015年9月10日木曜日

GR-SAKURA HTTPサーバー GETメソッドでLED制御 (ハードウェア)

1.概要
HTTPサーバーとして動作しているGR-SAKURAボードに各種センサーやLEDを接続し、Webブラウザー経由でGR-SAKURAのセンサー情報を表示したりLEDのON/OFF制御を行う方法を紹介します。

2.GR-SAKURAとPC/LANの接続関係


3.GR-SAKURAと周辺部品との接続関係

4.ブラウザー表示とGR-SAKURA周辺部品の関係

2015年9月2日水曜日

GR-SAKURAのRTCを使う

GR-SAKURAボード上のRX63Nマイコンには、RTC(リアル・タイム・クロック)が搭載されています。
RX63Nには、腕時計にも使われている水晶発信子(32.768KHz)が接続されており、この発振パスルをカウントして正確な時刻を作ります。年・月・曜日とかの計算もハードウェアで行いますので、初期値をセットすれば、日付・時間を簡単に読み出すことができます。

下記に、GR-SAKURAボードとWebコンパイラ用のサンプルプログラムを添付します。

//GR-SAKURA用 プロジェクトテンプレート(Ver V2.02)
/* GR-SAKURA Sketch Template V2.02 */
/* RX63N RTC Test Program */
#include <Arduino.h>
#include <RTC.h>   //GR-SAKURAボードのRTCを使用する
#define INTERVAL 100

// myRTCに日付・時刻の初期値をセットする。詳細は gr_common\core\RTC.h

RTC_TIMETYPE myRTC = {15, 12, 31, 2, 23, 59, 30};
const char *WeekDay[7] = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};

void setup()
{ 
    Serial.begin( 115200 ); // シリアルモニタの通信速度
    pinMode(PIN_LED0,OUTPUT);
    pinMode(PIN_LED1,OUTPUT);
    pinMode(PIN_LED2,OUTPUT);
    pinMode(PIN_LED3,OUTPUT);
    rtc_set_time(&myRTC);  // RTCに初期値をセットしてRTCをスタート
}

void loop()
{
    digitalWrite(PIN_LED0, 1);
    delay(INTERVAL);
    digitalWrite(PIN_LED1, 1);
    delay(INTERVAL);
    digitalWrite(PIN_LED2, 1);
    delay(INTERVAL);
    digitalWrite(PIN_LED3, 1);
    delay(INTERVAL);
    digitalWrite(PIN_LED0, 0);
    delay(INTERVAL);
    digitalWrite(PIN_LED1, 0);
    delay(INTERVAL);
    digitalWrite(PIN_LED2, 0);
    delay(INTERVAL);
    digitalWrite(PIN_LED3, 0);
    delay(INTERVAL);

    rtc_get_time(&myRTC); // RTCレジスタ内容をmyRTCに読み出す

    Serial.print(myRTC.year);
    Serial.print("/"); 
    Serial.print(myRTC.mon);
    Serial.print("/"); 
    Serial.print(myRTC.day);
    Serial.print(" ("); 
    Serial.print(WeekDay[myRTC.weekday]); 
    Serial.print(")  "); 
    Serial.print(myRTC.hour);
    Serial.print(":"); 
    Serial.print(myRTC.min);
    Serial.print(":"); 
    Serial.println(myRTC.second);
}

2015年8月29日土曜日

S4AをGR-SAKURA HTTPサーバーにつなげる

1. S4A とは
S4Aは、「Scratch for Arduino」の略称で、MITがリリースしている Scratch Ver 1.4 を、Arduino ボードに接続しScrtachからArduinoボードに接続されているセンサーを読み取ったりモーターを駆動できるよに拡張されたアプリケーションソフトです。

Arduinoボードを使った組込みシステムの開発は、ボードや搭載されているワンチップマイクロコントローラーの細かい技術的知識がなくてもセンサーを読んだりモータを駆動したりと簡単にソフトウエア開発が可能です。しかしそのソフト開発にはC++言語を使うので、ある程度のC/C++言語の知識がないと開発ができない。

その点、Scratchは命令ブロックを積木のように組み合わせて制御プログラムの開発ができるので、小中学生のようなプログラミングに何の知識がない方々でも簡単なプログラム開発できます。

S4AはScratch機能をすべて継承し、Arduinoボードの制御機能を拡張し多くのセンサーを読んだりやモータを駆動できるように拡張されています。

2. GR-SAKURAボード
メード・イン・ジャパンの高機能版Arduinoボードです。Arduinoの基本機能をすべて継承し、Web上でソフト開発ができる開発環境を備えています。

GR-SAKURAのWeb開発環境は、開発テンプレートが「GR-SAKURA_Stetch_V2.02.zip]にアップデートされました。スケッチリファレンスもアップデートされ、「Ethernet サーバー」にはHTTPサーバーとして動作するサンプルプログラムが添付されています。

3.GR-SAKURA IoTセンサーサーバー
S4A 1.6 の【調べる】 (http://) 機能(下記の赤点線)は、おもしろい命令だ。インターネット上にあるIoTサーバーの情報を取り込む命令が備わっています。

GR-SAKURAの「Ethernet サーバー」サンプルコードを修正して、S4AからGR-SAKURAにつながったセンサー情報をS4Aで使用できるようなデモを紹介します。

3.GR-SAKURA センサー端子(A0 - A6)をS4Aで読む
GR-SAKURAボードをサンプルコード ”Ethernet サーバー” を使ってHTTPサーバーとして動作させる。この時、S4Aでデータを取得しやすくするために下記の用に変更する。

サンプルコードの43~59行目の変更:
client.print(":"); // this is for S4A client.print(analogRead(0)); // this is for S4A client.print(":"); // this is for S4A client.print(analogRead(1)); // this is for S4A client.print(":"); // this is for S4A client.print(analogRead(2)); // this is for S4A client.print(":"); // this is for S4A client.print(analogRead(3)); // this is for S4A client.print(":"); // this is for S4A client.print(analogRead(4)); // this is for S4A client.print(":"); // this is for S4A client.print(analogRead(5)); // this is for S4A client.print(":"); // this is for S4A 
/*
client.println("<!DOCTYPE HTML>"); client.println("<html>"); // output the value of each analog input pin for (int analogChannel = 0; analogChannel < 6; analogChannel++) { int sensorReading = analogRead(analogChannel); client.print("analog input "); client.print(analogChannel); client.print(" is ");
client.print(sensorReading); client.println("<br/ >"); } client.println("</html>"); */

4. GR-SAKURA HTTPサーバーの起動
修正したサンプルコードをビルドし、GR-SAKURAに書き込みます。そしてUSBシリアルポートを立ち上げます。
そして任意のキーボーをたたくと、GR-SAKURAのIPアドレスが表示されます。このときLANケーブルを接続する場合は、DHCP環境でないとうまくIPアドレスが取得することができません。


今使ってるLAN環境ではルーターはGR-SAKURAに上記のようなIPアドレスを付与しました。

5.S4Aサンプルプログラム
GR-SAKURAのIPアドレスが分かったので、これを使って下記のようなS4Aのスクリプトを作成します。

このとき、Arduino1は、下記のようなスクリプトを準備ください。もし、GR-SAKURAとS4Aを同一PCで実行している場合、USB COMポートが衝突する場合があります。


S4Aのスクリプトブロック が取得するデータは、

 のような形式で受信します。 : によってデータ区切られており、先頭データがA0ピンのアナログ入力値になります。

 http_data[1] = A0ピンのアナログ値
 http_data[2] = A1ピンのアナログ値
 http_data[3] = A2ピンのアナログ値
 http_data[4] = A3ピンのアナログ値
 http_data[5] = A4ピンのアナログ値
 http_data[6] = A5ピンのアナログ値


6.GR-SAKURAのUSBシリアルポート(HTTPモニタ)
このとき、GR-SAKURAボードが接続されたUSBシリアルポートからは、S4AがGR-SAKURA を読むたびに下記のような情報が出力されます。



7. センサーを接続
GR-SAKURAボードのA0~A5ピンにセンサーを接続すれば、S4Aのサンプルスクリプトが4秒おきにGR-SAKURAを読みに行きます。 センサーは、0V~3,3Vの電圧を出力するタイプにしてください。サンプルスクリプトを応用すれば楽しいIoTセンサーネットワークを制作することができます。

2015年7月20日月曜日

GR-TSUBAME用モータ・ギヤモジュールの作成

名刺大の1から9までの番号カードを巻き上げる駆動ユニットを作製したい。これを複数台連ねてデジタル時計でも作りたい。赤外線反射センサーを付けカードの継目を検知し巻き上げをストップする機構にする。このセンサーとモーターでカードの表示位置を制御する。

駆動系外観図





使用する部品

Power's インラインカラー 内径3mm x 4個



② Power's ステンレスシャフト150mm×3mm x 4本








2015年7月16日木曜日

モータの固定と動力伝達

まず、もらったモータの仕様がよくわからない。モーターをよく観察するとボディにこんな刻印が!

RS-385PW 2270
905035 CHINA
MABUCHI SAMPLE

さっそく、ググって見るとスペック発見! 

さて、このモータどうやって固定するか!? さっそく秋葉原のROBOT SHOPをブラウズしてまして、よさそうな固定具を発見しました。

3mm シャフトに動力を伝えるなら、1個ギアをかませれば簡単かもしれない。


モータ仕様と固定方法

簡単ギアシステム

2015年7月15日水曜日

GR-TSUBAMEボードを入手した。

ルネサスナイト7に参加しGR-TSUBAMEボードを頂きました。ボードと一緒にエンコーダ付のモータも2個頂きました。GR-KURUMIが搭載できるソケットが付いているのでとりあえずつなげて見た。

GR-KURUMIを搭載するとき差し込む方向で少々困惑したが、多分写真の方向だろう。

さて、GR-TSUBAMEはGR-SAKURA やGR-KURUMIと接続しモーター制御できる子ボードです。GR-KURUMI用には専用ソケットがあり、そこにKURUMIボードを挿入すればすぐに使えますが、GR-SAKURAはケーブルを引き出す必要があります。

GR-KURUMIがこのボード接続で占有されるピンはSCLAピンとSDAAピンのみなので、逆にGR-KURUMIもセンサー等を搭載した別ボードで準備し、線を引出GR-TUBAMEをモーターモジュールとして接続する方が、電源分離等を考えると賢い選択になるかもしれない。

さて、GR-TUBAMEの基本技術情報として下記の資料がある:




2014年12月16日火曜日

くるみラップライマー

概要

GR-KURUMIマイコンボードを使て、くるみラップタイマーを制作しました。


これは、マイコンカーレース等でマイコンカーのラップライムを計測するために使用します。赤外線距離センサーを使って、マイコンカーがラップタイマーの前を通過すると赤外線距離センサーの計測値が変化するので、それを利用してラップライムのオン・オフを制御します。くるみラップタイマーの前をマイコンカーが通過した時点からラップタイムがスタートし、またマイコンカーが返って来てセンサーの前を横切りるとタイマーがストップします。ラップライムクリアスイッチでリセットでき、カウントスタートの状態に戻ります。


赤外線距離センサーには、写真のような箱のような反射壁が必要で40cmほど離して置いてください。

プログラムは外部割込みやタイマー割込みは使用せず、millis( )タイマーでLEDをダイナミック点灯しています。赤外線距離センサーは,loop() 内で計測していますが、毎回1ms以内に計測しています。ソフトウェアの変更なしで、Arduino-ProMini等への移植も可能で確認済みです。


部品

赤外線センサー: SHARP GP2Y0A21YK
8セグメントLEDモジュール: WSN233 (www.wsnak.com)
プッシュスイッチ: A0ピン(アナログ値で読む)

ソースコード

// Applicable Segment LED Module: WSN233 (www.wsnak.com)
//  LED Pin <--> KURUMI Pin
#define COM1 11
#define COM2 12
#define COM3 13
#define COM4 5
#define SEG_A 2
#define SEG_B 3
#define SEG_C 4
#define SEG_D 6
#define SEG_E 7
#define SEG_F 8
#define SEG_G 9
#define DOT A3

// Applicable Infra-red Distance Sensor: Sharp GP2Y0A21YK
#define IRD A1      // Infeared Distance Sensor Port

// Super Sonic Distance Sensor
#define Echo 10
#define Trg A2



// Applicable Tact-switch: SFE-COM-00097 (Switch-Science)
#define PUSH_SW A0  // Push Switch Port.  Read the switch state by analog. Push < 10 
#define PUSH_SW1 A1

#define CALIB 0   // Calibration Mode
#define WAIT_CAR 1
#define GO 2      // Car cross the sensor and wrap-timer started
#define FINISH 3  // Car cross the sensor and wrap-timer stopped
#define AGAIN  4  // Switch to GO mode


unsigned long Blinking = 0;
unsigned long Interval = 0;
int Seg1 = 17, Seg2 = 17, Seg3=17, Seg4 = 17; // Display Value for Segment LEDs
int SegPoint = 1;
unsigned long Sec1 = 0;
int Mode;                               // Flow Control with SW and IRD
int IrdLevel = 0x100;
int CarIsHere = 0;                // 1 -- Car is Here


void setup( ) {    
  Serial.begin(9600);  
  Init_Led_Seg();
  Mode = CALIB;        // Set Caribration mode 
}

void loop() {      // Do not use delay()  in loop()
  LedDrive();        // Seg-LED driver. 
  RunMode();
}

void RunMode(){
  switch (Mode) {
    case CALIB:
      CalibrationMode();
      break;
    case WAIT_CAR:
      WaitCar();
      break;
    case GO:
      GoMode();
      break;
    case FINISH:
      FinishMode();
      break;
    default:
      break;
  }
}

void CalibrationMode(){
  Seg1 = 17;
  Seg2 = 17;
  Seg3 = 17;
  Seg4 = 17;
  if (analogRead(PUSH_SW) > 10) {
     if((millis() - Interval > 100) ) {
          Interval = millis();
          Serial.println(analogRead(IRD));
     }
     Mode = CALIB;
  } else {
   Seg1 = 0;
   Seg2 = 0;
   Seg3 = 0;
   Seg4 = 0;
   Mode = WAIT_CAR;
  } 
}
void WaitCar(){
  if (analogRead(IRD) > 200) {
    CarIsHere = 1;
  }
  if (analogRead(IRD) < 200 && CarIsHere == 1){
    CarIsHere = 0;
    Mode = GO;
  }
}
  
void GoMode() {
    if (analogRead(IRD)> 200){
      Mode = FINISH;
    } else {
      if((millis() - Interval > 10) ) {
          Interval = millis();
          if (++Seg1 > 9){
            Seg1 = 0;
            Seg2++;
          }
          if (Seg2 > 9){
            Seg2 = 0;
            Seg3++;
          }
          if(Seg3 > 9) {
            Seg3 = 0;
            Seg4++;
          }
          if (Seg4 > 6){
            Seg4 = 0;
          }
        }
    }
}

void FinishMode(){
  if (analogRead(PUSH_SW) < 10) {
    Mode = CALIB;  
  }
}
      
void LedDrive(){
  if(micros() - Blinking > 1000) {
    Blinking = micros();
    switch (SegPoint++){
      case 1:
        Led(1, Seg1);
        break;
      case 2:
        Led(2, Seg2);
        break;
      case 3:
        Led(3, Seg3);
        break;
      case 4:
        Led(4, Seg4);
        break;
      case 5:
        Led(4, Seg4);
        break;
      default:
        SegPoint = 1;
    }
  }
}

void Led(int com, int n){        // 'n' must be 0x0 to 0x10 (OFF)                            
  digitalWrite(COM1, LOW);          // 'com' must be 1 to 3, and other number is OFF  
  digitalWrite(COM2, LOW); 
  digitalWrite(COM3, LOW); 
  digitalWrite(COM3, LOW); 
  switch(n){
    case 0:
      digitalWrite(SEG_A, HIGH);
      digitalWrite(SEG_B, HIGH);    
      digitalWrite(SEG_C, HIGH);    
      digitalWrite(SEG_D, HIGH);
      digitalWrite(SEG_E, HIGH);    
      digitalWrite(SEG_F, HIGH);    
      digitalWrite(SEG_G, LOW);    
      digitalWrite(DOT, LOW);      
      break;
     case 1:
      digitalWrite(SEG_A, LOW);
      digitalWrite(SEG_B, HIGH);    
      digitalWrite(SEG_C, HIGH);    
      digitalWrite(SEG_D, LOW);
      digitalWrite(SEG_E, LOW);    
      digitalWrite(SEG_F, LOW);    
      digitalWrite(SEG_G, LOW);    
      digitalWrite(DOT, LOW);      
      break;
    case 2:
      digitalWrite(SEG_A, HIGH);
      digitalWrite(SEG_B, HIGH);    
      digitalWrite(SEG_C, LOW);    
      digitalWrite(SEG_D, HIGH);
      digitalWrite(SEG_E, HIGH);    
      digitalWrite(SEG_F, LOW);    
      digitalWrite(SEG_G, HIGH);    
      digitalWrite(DOT, LOW);      
      break;
    case 3:
      digitalWrite(SEG_A, HIGH);
      digitalWrite(SEG_B, HIGH);    
      digitalWrite(SEG_C, HIGH);    
      digitalWrite(SEG_D, HIGH);
      digitalWrite(SEG_E, LOW);    
      digitalWrite(SEG_F, LOW);    
      digitalWrite(SEG_G, HIGH);    
      digitalWrite(DOT, LOW);      
      break;
    case 4:
      digitalWrite(SEG_A, LOW);
      digitalWrite(SEG_B, HIGH);    
      digitalWrite(SEG_C, HIGH);    
      digitalWrite(SEG_D, LOW);
      digitalWrite(SEG_E, LOW);    
      digitalWrite(SEG_F, HIGH);    
      digitalWrite(SEG_G, HIGH);    
      digitalWrite(DOT, LOW);      
      break;
    case 5:
      digitalWrite(SEG_A, HIGH);
      digitalWrite(SEG_B, LOW);    
      digitalWrite(SEG_C, HIGH);    
      digitalWrite(SEG_D, HIGH);
      digitalWrite(SEG_E, LOW);    
      digitalWrite(SEG_F, HIGH);    
      digitalWrite(SEG_G, HIGH);    
      digitalWrite(DOT, LOW);      
      break;
    case 6:
      digitalWrite(SEG_A, HIGH);
      digitalWrite(SEG_B, LOW);    
      digitalWrite(SEG_C, HIGH);    
      digitalWrite(SEG_D, HIGH);
      digitalWrite(SEG_E, HIGH);    
      digitalWrite(SEG_F, HIGH);    
      digitalWrite(SEG_G, HIGH);    
      digitalWrite(DOT, LOW);      
      break;
    case 7:
      digitalWrite(SEG_A, HIGH);
      digitalWrite(SEG_B, HIGH);    
      digitalWrite(SEG_C, HIGH);    
      digitalWrite(SEG_D, LOW);
      digitalWrite(SEG_E, LOW);    
      digitalWrite(SEG_F, LOW);    
      digitalWrite(SEG_G, LOW);    
      digitalWrite(DOT, LOW);      
      break;
    case 8:
      digitalWrite(SEG_A, HIGH);
      digitalWrite(SEG_B, HIGH);    
      digitalWrite(SEG_C, HIGH);    
      digitalWrite(SEG_D, HIGH);
      digitalWrite(SEG_E, HIGH);    
      digitalWrite(SEG_F, HIGH);    
      digitalWrite(SEG_G, HIGH);    
      digitalWrite(DOT, LOW);      
      break;
    case 9:
      digitalWrite(SEG_A, HIGH);
      digitalWrite(SEG_B, HIGH);    
      digitalWrite(SEG_C, HIGH);    
      digitalWrite(SEG_D, HIGH);
      digitalWrite(SEG_E, LOW);    
      digitalWrite(SEG_F, HIGH);    
      digitalWrite(SEG_G, HIGH);    
      digitalWrite(DOT, LOW);      
      break;
    case 10:  // Charracter A
      digitalWrite(SEG_A, HIGH);
      digitalWrite(SEG_B, HIGH);    
      digitalWrite(SEG_C, HIGH);    
      digitalWrite(SEG_D, LOW);
      digitalWrite(SEG_E, HIGH);    
      digitalWrite(SEG_F, HIGH);    
      digitalWrite(SEG_G, LOW);    
      digitalWrite(DOT, LOW);      
      break;
    case 11:    // Character B
      digitalWrite(SEG_A, LOW);
      digitalWrite(SEG_B, LOW);    
      digitalWrite(SEG_C, HIGH);    
      digitalWrite(SEG_D, HIGH);
      digitalWrite(SEG_E, HIGH);    
      digitalWrite(SEG_F, HIGH);    
      digitalWrite(SEG_G, HIGH);    
      digitalWrite(DOT, LOW);      
      break;
    case 12:    // Character C
      digitalWrite(SEG_A, HIGH);
      digitalWrite(SEG_B, LOW);    
      digitalWrite(SEG_C, LOW);    
      digitalWrite(SEG_D, HIGH);
      digitalWrite(SEG_E, HIGH);    
      digitalWrite(SEG_F, HIGH);    
      digitalWrite(SEG_G, LOW);    
      digitalWrite(DOT, LOW);      
      break;
    case 13:    // Character d
      digitalWrite(SEG_A, LOW);
      digitalWrite(SEG_B, HIGH);    
      digitalWrite(SEG_C, HIGH);    
      digitalWrite(SEG_D, HIGH);
      digitalWrite(SEG_E, HIGH);    
      digitalWrite(SEG_F, LOW);    
      digitalWrite(SEG_G, HIGH);    
      digitalWrite(DOT, LOW);      
      break;
    case 14:    // Character E
      digitalWrite(SEG_A, HIGH);
      digitalWrite(SEG_B, LOW);    
      digitalWrite(SEG_C, LOW);    
      digitalWrite(SEG_D, HIGH);
      digitalWrite(SEG_E, HIGH);    
      digitalWrite(SEG_F, HIGH);    
      digitalWrite(SEG_G, HIGH);    
      digitalWrite(DOT, LOW);      
      break;
    case 15:     // Character F
      digitalWrite(SEG_A, HIGH);
      digitalWrite(SEG_B, LOW);    
      digitalWrite(SEG_C, LOW);    
      digitalWrite(SEG_D, LOW);
      digitalWrite(SEG_E, HIGH);    
      digitalWrite(SEG_F, HIGH);    
      digitalWrite(SEG_G, HIGH);    
      digitalWrite(DOT, LOW);      
      break;
    case 16:    // Chareacter .
      digitalWrite(SEG_A, LOW);
      digitalWrite(SEG_B, LOW);    
      digitalWrite(SEG_C, LOW);    
      digitalWrite(SEG_D, LOW);
      digitalWrite(SEG_E, LOW);    
      digitalWrite(SEG_F, LOW);    
      digitalWrite(SEG_G, LOW);    
      digitalWrite(DOT, HIGH);      
      break;
    case 17:    // '-' Minus
      digitalWrite(SEG_A, LOW);
      digitalWrite(SEG_B, LOW);    
      digitalWrite(SEG_C, LOW);    
      digitalWrite(SEG_D, LOW);
      digitalWrite(SEG_E, LOW);    
      digitalWrite(SEG_F, LOW);    
      digitalWrite(SEG_G, HIGH);    
      digitalWrite(DOT, LOW);      
      break;    
    default:    // OFF
      digitalWrite(SEG_A, LOW);
      digitalWrite(SEG_B, LOW);    
      digitalWrite(SEG_C, LOW);    
      digitalWrite(SEG_D, LOW);
      digitalWrite(SEG_E, LOW);    
      digitalWrite(SEG_F, LOW);    
      digitalWrite(SEG_G, LOW);    
      digitalWrite(DOT, LOW);      
      break;
  }
  switch(com){ 
    case 1:
      digitalWrite(COM1, HIGH); 
      digitalWrite(COM2, LOW); 
      digitalWrite(COM3, LOW); 
      digitalWrite(COM4, LOW);
      break; 
    case 2:
      digitalWrite(COM1, LOW); 
      digitalWrite(COM2, HIGH); 
      digitalWrite(COM3, LOW); 
      digitalWrite(COM4, LOW);
      break; 
    case 3:
      digitalWrite(COM1, LOW); 
      digitalWrite(COM2, LOW); 
      digitalWrite(COM3, HIGH); 
      digitalWrite(COM4, LOW);
      break; 
    case 4:
      digitalWrite(COM1, LOW); 
      digitalWrite(COM2, LOW); 
      digitalWrite(COM3, LOW); 
      digitalWrite(COM4, HIGH);
      break; 
    default:
      digitalWrite(COM1, LOW); 
      digitalWrite(COM2, LOW); 
      digitalWrite(COM3, LOW); 
      digitalWrite(COM4, LOW);
      break; 
    }
}
  
void  Init_Led_Seg(){
  pinMode(COM1, OUTPUT);  
  digitalWrite(COM1, LOW); 
  pinMode(COM2, OUTPUT);  
  digitalWrite(COM2, LOW); 
  pinMode(COM3, OUTPUT);  
  digitalWrite(COM3, LOW); 
  pinMode(COM3, OUTPUT);  
  digitalWrite(COM3, LOW); 
   
  pinMode(SEG_A, OUTPUT);  
  digitalWrite(SEG_A, LOW);   
  pinMode(SEG_B, OUTPUT); 
  digitalWrite(SEG_B, LOW);     
  pinMode(SEG_C, OUTPUT);  
  digitalWrite(SEG_C, LOW);       
  pinMode(SEG_D, OUTPUT); 
  digitalWrite(SEG_D, LOW);        
  pinMode(SEG_E, OUTPUT);  
  digitalWrite(SEG_E, LOW);     
  pinMode(SEG_F, OUTPUT); 
  digitalWrite(SEG_F, LOW);     
  pinMode(SEG_G, OUTPUT);  
  digitalWrite(SEG_G, LOW);       
  pinMode(DOT, OUTPUT); 
  digitalWrite(DOT, LOW);      
 }