9月7日の日本橋お買い物

2014-09-07 15.39.22

朝方思った以上に涼しかったので、自転車で日本橋へお買い物行きました。

  • DATA IMAGE F040346DSSWBG03 4.3inch 480×272 16:9 TFT 液晶(PSP 液晶みたいなやつ)
  • EPSON ディスプレイコントローラIC評価ボード
  • 2.8inch 320×240 TFT タッチスクリーン付き液晶
  • OV7670(FIFO付き)カメラモジュール
  • バブルディスプレイ QDSP-6064
  • ブレッドボード 1枚
  • 収縮チューブなど消耗品

最初は金曜日の夕方帰りしに日本橋寄って帰るつもりが駄目になり、土曜はお疲れさんと雨やったので家から出ずというやつ。で、日曜日の買い物となりました。液晶関係を購入していますが自己学習用のネタでございます。

2014-09-07 16.12.07

2014-09-07 16.14.26

俗に言う PSP 液晶ですが、ピンアサインなどは違う液晶です。それと買わんでも良かったのですが制御ボードも。制御ボードのほうにコネクタとヘッダピンの変換付いてるし、FPGA と、マイコン両方で動かしてみるんだったら持っててもいいか。という理由で購入。セットで買うと 5000 円になります。

2014-09-07 16.11.53

タッチパネル付き液晶が使えるようになると工作の幅は広がるかなー、という程度の理由で購入。過去キャラクタ液晶で設定メニュー出すようなものでも超メンドクサイのはわかっているので、タッチスクリーンのインタフェース作るときの規模感を体験しておきたいというのが無理矢理こじつけた理由。

2014-09-07 16.11.04

バブルディスプレイ QDSP-6064 は、1つのモジュールに 7セグ 4桁 はいっているちっちゃな表示器です。電源は 1.6V~最大2.0V までで使用するもののようです。完全にお遊びようになるかな。

2014-09-07 16.11.38

だいぶ前にトラ技かなんかに載ってたようか記憶があるのですが、カメラモジュールも購入。画素数の多そうなのが売り切れでお店に残ってたのは FIFO 付きの写真のものだけでした。カメラ側のタイミング気にせんで読み出せるのでこれでいいやと購入。

キットにつながりそうなものを買ってないなぁ。

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”]

電池一本で 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');
    } 
  }
}