DE0-Nano Quartus II 14.0 QSYS 入門1

Terasic の DE0-Nano ボードで、メモリマップド I/O のテストを PC 側のコンソールから出来るらしいので試してみます。

スクリーンショット 2014-08-31 09.53.13

DE0-Nano ボード付属 CD にあるサンプルプロジェクト DE0_Nano_GOLDEN_TOP フォルダをコピー・ペーストして作業用フォルダを作成します。DE0_Nano.qpf をダブルクリックして、Quartus II を立ち上げます。

スクリーンショット 2014-08-31 09.55.43

プロジェクトに作業フォルダ内の DE0_Nano.v ファイルを追加します。

スクリーンショット 2014-08-31 09.56.07

Project メニューから Add/Remove Files in Project でファイル追加を行います。

スクリーンショット 2014-08-31 09.57.09

Qsys を起動します。

スクリーンショット 2014-08-31 10.03.12

Qsys を起動して、JTAG to Avalon Master Bridge と PIO (Parallel I/O) を追加します。

JTAG to Avalon Master Bridge 追加時の設定変更なし
PIO (Parallel I/O) 追加時の設定変更なし(Direction が Output でなければ Output にする)

各コンポーネントの配線は、画面コピー参照

Export 名の設定は、PIO の出力を、FPGA のポートに付けないといけないので PIO external_connection 行にある export 欄をダブルクリックして export します。今回は名前変更せずそのまま使用しています。

PIO の S1 のメモリマップ上のアドレスを入れます。今回は試しに 0x8000_0000 にしました。アドレスのところをクリックして修正します。

スクリーンショット 2014-08-31 10.04.02
スクリーンショット 2014-08-31 10.04.20

設定が終れば、Generate -> Generate HDL を選択して Qsys の HDL を生成します。Generate ボタンを押すと処理開始ですが、作成した設定を保存していないので、セーブのダイアログが出ます。今回は qsysPio という名前で保存しました。

スクリーンショット 2014-08-31 10.05.02

Qsys の Generate が完了したら、 DE0_Nano.v に Qsys のインスタンス作成するためのコードを書かないといけません。 Generate -> HDL Example を選択して インスタンスするコードをクリップボードにコピーします。そして DE0_Nano.v を開いてペーストします。


    qsysPio u0 (
        .clk_clk                          (CLOCK_50),                          //                       clk.clk
        .pio_0_external_connection_export (LED)  // pio_0_external_connection.export
    );

endmodule

ファイルの最後に endmodule がありますが、その手前にペーストして、() 括弧の中を書き換えます。
クロック入力は、CLOCK_50 、LED 出力は LED という名前です。修正が終れば CTRL-S で上書き保存。

次に Qsys の Generate 時に保存した、qsysPio.qsys をプロジェクトに追加します。 DE0_Nano.v を追加したときと同じ手順で追加します。

Processing -> Start Compilation や、コンパイルボタンを押してコンパイルします。

スクリーンショット 2014-08-31 10.09.00

コンパイル完了したらプログラマで DE0-Nano ボードへ .sof ファイルを書き込みます


スクリーンショット 2014-08-31 10.30.37

書き込み完了すれば早速テストを行ってみます。Tools -> System Debugging Tools -> System Console メニューを選択してシステムコンソールを起動します。ALTERA の オンライン資料: Quartus II 開発ソフトウェア に Analyzing and Debugging Designs with System Console という pdf があり、これにコマンド説明があります。

% set master_path [lindex [get_service_paths master] 0]
/devices/EP3C25|EP4CE22@1#USB-0/(link)/JTAG/master_0.jtag/phy_0/master_0.master
% open_service master $master_path
% master_write_32 $master_path 0x80000000 0x55

という方法も動きますが、先程の PDF では open_service はサポートされなくなり claim_service を使ってとありますので注意必要です。

% set service_paths [get_service_paths master]
/devices/EP3C25|EP4CE22@1#USB-0/(link)/JTAG/master_0.jtag/phy_0/master_0.master
% set master_service_path [lindex $service_paths 0]
/devices/EP3C25|EP4CE22@1#USB-0/(link)/JTAG/master_0.jtag/phy_0/master_0.master
% set claim_path [claim_service master $master_service_path mylib]
/channels/local/mylib/master_1
% master_write_32 $claim_path 0x80000000 0x55

% master_write_32 $claim_path 0x80000000 0xaa

% master_write_32 $claim_path 0x80000000 0x33

% close_service master $claim_path

ということで、claim_service 版で 0x8000_0000 に値を書き込みして LED の表示が変るかやってみます。

2014-08-31 10.27.12

2014-08-31 10.27.22

無事動いてよかったです。

PERIDOT ボードで、サンプルの Lチカ を動かしてみた

先日 Make 大垣で購入しました PERIDOT ボードですが、とりあえず何か動かしてみようと思い Github のディレクトリを見ていたらサンプルがビルド済みで公開されていたので、とにかく使ってみることに。今回は
\peridot-master\fpga\sample_ledlampy
ディレクトリのオンボード LED を明くしたり暗くしたりする PWM の LED 点滅サンプルです。

スクリーンショット 2014-08-27 21.24.40

PERIDOT は、Quartus II の開発環境入れてなくても書き込み出来ます。PERIDOT ボードを USB ポートに接続しますとシリアルポートのドライバがインストールされます。今回は Windows 7 Home 64bit ノート PC でやってみましたが、差しただけで COM ポートのドライバが入りました。

次は chrome ウエブストアから PERIDOT RBF-WRITER を入れます

スクリーンショット 2014-08-27 21.31.44

chrome ブラウザで PERIDOT RBF-WRITER を起動すると、上の画面が表示されます。PERIDOT の COM ポート番号があっていることを確認して接続ボタンを押すと PERIDOT ボードと接続され

スクリーンショット 2014-08-27 21.32.02
2014-08-27 21.31.56

PERIDOT ボードに接続しました。 という表示に変わると同時にボード上の CONFIG LED が点灯します。この状態になれば、RBF ファイルを書き込み出来ます。

スクリーンショット 2014-08-27 21.32.24

\peridot-master\fpga\sample_ledlampy\output_files\sample_ledlampy.rbf を PERIDOT RBF-WRITER に D&D すると書き込みが始まります。書き込みが無事終了したら、スイッチを AS 側にしてリセットボタン押せば走り出します。

[vine url=”https://vine.co/v/MlwlJiH6qWm”]

Ogaki Mini Maker Faire 2014 見学に行ってまいりました


より大きな地図で Ogaki Mini Maker Faire 2014 を表示

2014/8/23,24 に開催される make 大垣の初日見学行ってきました。最寄り駅を出発したのは8時すぎのようです。移動自体は在来線のため特に写真も無く来た電車に乗るパターンで移動。
08:05 瓢箪山駅 (Hyotanyama Sta.)
08:23 生駒駅 (Ikoma Sta.)
08:38 大和西大寺駅 (Yamato Saidaiji Sta.)
09:20 近鉄 京都駅 (Kintetsu Kyoto Sta.)

京都駅までは、電車乗り継ぎつつ移動。京都駅でコーヒー休憩入れつつきっぷを購入。JR西日本とJR東海をまたぐので面倒でもきっぷ必要です。ここから10時発の新快速乗車。

09:59 京都駅 (Kyoto Sta.)
10:53 米原駅 (Maibara Sta.)
11:31 JR 大垣駅 (Ōgaki Sta.)

米原の乗り換えは人多かった。休日の乗り換え連絡通路が殺伐した雰囲気はまいどのこと。

11:51 アクアウォーク大垣
11:51 紅虎餃子房 アクアウォーク大垣店

2014-08-23 11.54.54
大垣の駅北にショッピングモールがあり、お昼ごはんはモール内でいただきました。この日は黒ごまの担々麺です。

make 大垣見学
買った頒布物の写真
2014-08-24 08.32.10
Ikkei さんのちっちゃいーの v2.7 以前買ったやつよりかは相当バージョンがあがっています。ちっちゃいーのは大垣で EOS になるかもとのことです。

2014-08-24 08.32.56
J-7SYSTEMS Osafune さんの PERIDOT ボード。Cyclone IV 搭載ボード。開発環境はWebベースのクラウドコンパイラとChromeアプリケーションで連動出来るスグレモノです。インプリ中のプロジェクトなので Github のコミットに要注意です

2014-08-24 08.32.24
Twitter の TL でニコニコ技術部の方が工作スペースの片付けアイデアをまとめられました。大垣で見付けたので速攻で印刷物1冊いただきました。
ちょっと見ただけですが、いやはや、いろいろ工夫されてます。これは楽しいです。

2014-08-24 08.33.49
紙のからくりカミカラさんからペーパークラフトを一つ。ただ組むだけでなく輪ゴムの力で変形するのがとてもおもしろいです。思わず買いました。

2014-08-23 22.28.48

会場入口に Make の物販もあるので、ノート買おうと思っていたら、無かった。かわりに黒バッグを購入。

あとはヒゲキタさんのプラネや、戦車など大物展示も含めグルット何周かしたところで会場を離脱しました。このあとは大須へ行きます。

14:35 JR 大垣駅 (Ōgaki Sta.)

岐阜駅のチェックイン忘れてますね。JR から名鉄に乗り換えます。なんでかというと展望車に乗りたいから(笑)
2014-08-23 15.10.47

15:15 発の豊橋行きに乗車。ところが、大気の状態が不安定という状態で前が見えません。枇杷島カーブあたりでやっとこさ雨マシになってきたという感じで残念。

15:52 名鉄 金山駅 (Meitetsu Kanayama Sta.)
16:02 上前津駅 (Kamimaezu Sta.)
16:06 第1アメ横ビル
16:26 第2アメ横ビル

大須行くんなら金山から地下鉄で2駅の上前津が便利ですな。このあと駆け足で大須のパーツショップを見て名古屋駅へ

17:14 近鉄名古屋駅 (Kintetsu-Nagoya Sta.)
17:26 まぐろ小屋本店 サンロード店

19時発大阪なんば行き特急のきっぷを購入。あとは軽くビールとおつまみいただいて帰宅の途

21:04 近鉄 鶴橋駅 (Kintetsu Tsuruhashi Sta.)
21:32 瓢箪山駅 (Hyotanyama Sta.)

事故もなく、傘も使わずに済んだことと、暑くなかったのが幸いし疲れもほとんどなしという申し分ない散歩でございました。

電池一本で Lチカ (LEDチカチカ)

台風の影響で朝から強い雨、午後からは一旦止んだのでいいのですが、なかなか外に出るに出られずという感じで家ひきこもり。今年の夏なまとまった休みにしていないので、週末の Blog 更新は簡単に出来るもの中心です。

電池一本で LED 点灯は、所謂ジュールシーフというブロッキング発振で電圧を得て LED を光らすのが検索すると事例たくさん出てきます。私とこの Blog でも 2012年11月にやってました。 電池1本で LED 点灯 です。今回は、違う回路で点滅というか一瞬光るのを繰り返す回路を組みました。100μF のコンデンサに 1.5V 溜めておいて、2SA1015 が ON になると 電池の 1.5V とコンデンサの 1.5V があわさって 3V 発生します。これで LED が一瞬光ります。黄色のメモには書いてないですが PNP トランジスタのコレクタ抵抗は 1k です。

[vine url=”https://vine.co/v/MVXKBQebT5a”]

IN-9 VU メータキットの中身を少し変更いたします

2014-08-03 08.11.58

IV-9 VU キットですが先日売り切れとなりました。 IN-9 はまだあるので部品揃えて 2014年10月目標で再開出来るようにしたいと思っています。次回頒布分からは一部仕様を変更させていただきます。

  • LED を面実装から 3mm 砲弾型 LED に変更し、カスタマイズしやすいようにします。
  • LED の明るさ調整用半固定抵抗を追加します
  • LED の光源が基板から5mmほど上に移動するので 遮光のプラ板をアクリル板に直接ネジ止めするよう変更します

これの変更で、IN-9 ネオン管を固定するナイロンクリップ丸見えになる問題はありますが、アクリルマウントは今まで以上に大きく見えるようになるのでいいかなと思っています。

2014-08-03 09.25.20

面実装 LED から砲弾型 LED に変更したところ。面実装 LED のあらゆる方向に散る眩しい光とは違い多少は抑えられます。

2014-08-03 10.11.32

黒いプラ板をアクリルマウントの幅にカットして取り付けてみて様子を見る。下からのモレはプラ板を短かく切ってしまったからです。

2014-08-03 10.15.00

裏から見たらこんな感じです。

私の1号機を改造して様子を見ているため最終完成型ではありません。あくまでイメージです。

mbed HRM1017 マイコンをいじり始めたけど、今日はこれくらいにしといたるモードへ

2014-07-27 11.22.43

写真の右下にある、ブレッドボードに差さっていなのが HRM1017 です。日本橋のシリコンハウスで買いました。スイッチサイエンスさんとこの mbed HRM1017 を仕入れておられたのがたまたま目にはいった次第。詳細はスイッチサイエンスさんのページを見てください。

商品の紹介ページには下記リンクがあり参考になります。
mbed HRM1017をはじめよう
mbed HRM1017とiPadをBLEで接続してみた!

IMG_0208

たまたま手持ちのセンサ類が、参考リンクにあるものとは違ったので温度表示はしないけど、ちゃんと iPad mini と接続できることを確認しました。私の手持ちセンサは、Adafruit の BMP180 という温度、気温センサが搭載されているやつです。これを使うようにしてやれとソースいじりはじめても上手く温度が出ない。

仕方なく違う mbed ボード LPC1768 をひっぱりだしてきて I2C キャラクタ液晶接続し、下記ソースを作成し動かしてみたところ表示は出来るので壊れてはいないというのが一番最初の写真

#include "mbed.h"
#include "I2cLCD.h"
#include "BMP180.h"

I2cLCD lcd(p22,p20,p8);
BMP180 bmp180(p22, p20);

main () {
    float pressure, temperature;
    
    lcd.printf("hello");
    while(1) {
        lcd.cls();
        bmp180.normalize();
        pressure = bmp180.read_pressure();
        temperature = bmp180.read_temperature();
        lcd.printf("%f\n",pressure);
        lcd.printf("%f\n",temperature);
        wait(1.0);
        ;
    } 
}

ほな、このソースを HRM1017 に書いてやれば I2C の動作確認出来るハズと、ポート番号書き換えて接続仕直すも動かんという状態。オシロで電圧あたってみても、動作確認用の LED ポートはほぼ1秒毎に Hi/Low を繰り返すのでプロセッサは動いてる。I2C のクロックはプルアップ出来てるけど、データはプルアップ出来ていないというところで中断。(休憩)

2014-07-27 16.16.57

本当に駄目なのか、構成をシンプルにして、embed オンラインコンパイラのプロジェクトに入れたライブラリのソースを見つつ、違う人が書いた BMP180 のライブラリに変更してやっとこさ動き出しました。

IMG_0210

動いたのでよしとしましょう。とりあえず、mbed のライブラリ調べるのでえらいめにあいました。今日はこれくらいで…

Terasic DE0-Nano 購入しました。

2014-07-20 16.30.26

日曜日、ふと思い付きで京都方面へお出かけ。目的は、↓の写真にある

2014-07-20 09.18.24

2014-07-20 10.50.17

電電宮という電気の神さんと、京都御苑内にある技芸上達の白雲神社にお参りでした。私の場合は朝早めに出て午後になったら早々に撤収するのがパターンなのですが、この日にかぎって帰りにわざわざ日本橋に寄って最初の写真にある FPGA ボードを買って帰った次第。

最初の写真左側 10年いきませんが Xilinx Spartan-3 (Spartan-3Eではない)のボード。右の小さなボードが DE0-Nano 。40ピンの GPIO コネクタのピン数はちょっと少なくなりますが、基板サイズはちっちゃくなってコンパクトです。搭載されている石は DE0 の Cyclone III と違い Cyclone IV です。Altera の Quartus II Web エディションで楽しめます。残念なのは、Xilinx の Spartan-6 が ISE 14.7 以降はサポートしないのと同じような感じで DE0-Nano の Cyclone-IV も Quartus II 14.0 以降はおそらくサポートされなさそう。ということろでしょうか。まぁ、書籍執筆される方は、開発ソフトのバージョン固定出来るので入門本書きやすいでしょう。

2014-07-21 08.40.06

今日は、HDL だけの LED チカチカを組んで書き込む練習だけしました。FPGA 使ってややこしいことする予定は無く自己学習でございます。

真空管 6189w で Lチカ (LEDチカチカ)

Twitter で真空管 Lチカやった、いうのを見て私もつられてやってみました(笑) 見たのは 6J6 で作られていたのですが、手持ちの関係で 6189W(12AU7) です。 B電圧に AC アダプタ使いましたが 24V ではちょっと LED 暗かった。結果的に電源を準備して 100~140V でだいぶ明るくなりました。

勢いでやってしまった

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 の電源をもう少しあげてみたらハッキリ出るかも知れないので、一応ということです。

[vine url=”https://vine.co/v/MxXXwtDiqDg”]

#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');
    } 
  }
}