FPGAの差動入力でAD変換

はじめに

XilinxのXcell Journal 94号に掲載されている「1つのザイリンクス FPGA で数百の信号をデジタル化する方法」がとてもおもしろそうだったので実際に実装してみました。
Xcell Journal 日本語版
差動入力1つと抵抗,コンデンサがそれぞれ1つだけでΔ変調器型のADCを作ることができるため1つのFPGAにたくさん搭載することができます。
今回はVivado2015.4で開発してZyboで動かしました。

仕組み

回路図は下のようになります。差動アンプの+側にアナログ信号を入力し,-側にはRCローパスフィルタの出力を接続しています。+側と-側の電位を比較してアンプから0または1の信号が出力され,そのパルスがローパスフィルタを通してフィードバックされます。そうすると+側と-側の電位差がほぼ0となるところで安定します。このとき,デジタル出力から出るパルスはディジタルローパスフィルタを通すことでAD変換をすることができます。
f:id:taltalp:20160619043945p:plain

ソースコード

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
library UNISIM;
use UNISIM.VComponents.all;

entity adc is
    Port ( clk_240m: in STD_LOGIC;
	   sigin_p : in STD_LOGIC;
           sigin_n : in STD_LOGIC;
           sigout : out STD_LOGIC;
           LED : out STD_LOGIC);
end adc;

architecture Behavioral of adc is
    signal sig : std_logic;
begin

    -- 差動入力
    ibufds_1_i : IBUFDS
        generic map(
            DIFF_TERM => FALSE,
            IBUF_LOW_PWR => FALSE,
            IOSTANDARD => "DEFAULT"
        )
        port map(
            O => sig,
            I => sigin_p,
            IB => sigin_n
        );
    
    process (clk_240m) begin
        if (clk_240m'event and clk_240m='1') then
            sigout <= sig;
        end if;
    end process;

    LED <= sig;
end Behavioral;

I/O Planning

ピンアサイン時にいくつか注意点があるため各ピンについて説明をしていきます。
clk_240m : 240MHzのクロックを入れます。zyboの場合PS側からPL側に供給される100MHzまたはPL側に直接供給される125MHzの信号からClocking Wizard等を用いて240MHzを生成します。
sigin_p, sigin_n : 差動入力に対応したピンに割り当てる必要があります。またI/O StdはTMDS_33に設定しました。
sigout : ここから出た信号はRCローパスフィルタに繋がります。LVCMOS33に設定し,Drive Strengthを16に設定しました。 Xcellの内容には24に設定したと書かれていますが,zynq-7010では16が最大なようです。これをオーバーしないように外付けの抵抗の値を決める必要があります。また,Slew TypeはFastにOff-Chip TerminationはNONEに設定しました。
LED : どこでもいいのですが,今回はとりあえずLEDにデジタル信号を入れてみました。

回路

上に示す回路図のRとCは下記のように設定しました。
R = 10kΩ
C = 33pF
3.3Vの電圧をRCに入力するときに16mAの電流値を超えないように設定しています。周波数特性は特に気にせず適当に決めています。

実験

アナログ入力に可変抵抗器で0~3.3Vまでの信号を入力してLEDの光り方をみてみました。
電圧が低いと暗くなり,電圧が高くなると明るくなります。原理はPWM調光と同じような感じです。(PDM信号)

まとめ

FPGAを使ってADCがとても簡単に、しかも大量に実装することができます。FPGAの差動入力にアナログ信号を入れようという考えは非常に面白いですね。

ESP-WROOM-02を赤外線リモコンに(2.解析編)

前回、ESP-WROOM-02で赤外線通信を行うための準備をしました.
taltalp.hatenablog.jp

今回は実際に回路を組んで、赤外線リモコンのコードを解析してみようと思います。
(といってもサンプルプログラムを動かすだけです)

続きを読む

ESP-WROOM-02を赤外線リモコンに

今回はESP-WROOM-02で赤外線通信をする方法について書きます。

ESP-WROOM-02の基本的な使い方についてはこちらをご覧ください。
taltalp.hatenablog.jp

1.今回の目標

ESP-WROOM-02で赤外線通信を出来るようにする。
時間があればスマホなどからブラウザで操作できる「IoTリモコン」的なものを作りたい。(そのうち作ります)

2.ライブラリの用意

Arduinoの赤外線ライブラリはKen Shirriff氏が作成したArduino-IRremoteが有名ですが、これをそのままESP-WROOM-02で動かそうとしてもうまく行きません。
ESP8266用に書き換えられたライブラリがあるのでそちらを使います。
github.com
こちらからリポジトリをダウンロードして展開してください。
展開したディレクトリの名前を「IRremoteESP8266」に変更して、(Arduinoがあるディレクトリ)/librariesにそのディレクトリを移動します。

3.実際に使ってみる

ArduinoIDEを開いてファイル > スケッチブックの例 > IRremoteESP8266 にデモがいくつかあります。
これを編集していけば良さそうです。

4.今後の予定

次回はこのライブラリを使ってIoTリモコンを作ってみようかと思います。
今回は赤外線受光モジュールが手元に無かったためサボリ気味な記事になってしまいましたので、次回はちゃんと作例を紹介しようかと思います(笑)

4.余談

・ESP-WROOM-02で赤外線通信をする際、delayなどを用いて信号を生成しようとするとWDTによって本体にリセットがかかりうまく行きませんでした。
どうやらdelayは長過ぎるとダメなようで、定期的に何かしら命令を実行してあげないとリセットされてしまうようです。
・ESP-WROOM-02に載っているESP8266EXにはIrDAインターフェースが載っているらしいのですが、そこにどうやってデータを送ればいいのか、SDKのソースを見てもそれらしいものが見つかりませんでした。
最初、IrDAインターフェースが載っているから簡単に赤外線通信が出来るだろうと思って買ったのですが、結局よくわからないままライブラリを使うことにしました。

ESP-WROOM-02をArduinoで開発する

ESP-WROOM-02Arduinoで使う手順です。

1.使用した環境

Windows7
Arduino 1.6.5
ESP-WROOM-02(秋月電子)

2.Arduinoの設定

こちらのリポジトリを参考にArduinoIDEの環境を作って行きます。
github.com

1.Arduino IDEの「ファイル」→「環境設定」を開く
2.Additional Boards Manager URLs に
http://arduino.esp8266.com/stable/package_esp8266com_index.json
を入力して「OK」
3.「ツール」→「ボード」→「Boards Managers」から「esp8266 platform」を検索してインストール
4.「ツール」→「ボード」→「Generic ESP8266 Module」を選択

3.回路の作成

今回の回路は下図のようにしました。
f:id:taltalp:20160318202800p:plain
※回路図が間違っていたため修正しました.
注意するのは+3.3Vの電源電流です。
ESP-WROOM-02Wi-Fiモジュールですので、Wi-Fiの電波を飛ばすときにかなりの電流を消費(数百mA程度)するようです。電源電流が足りないとESP-WROOM-02にスケッチを書き込むことが出来ません。今回は3.3V/1.5AのNJM2396F33を使用しています。また、書き込みにはシリアル通信を使用しますので、TXD,RXDには115200Hz対応のUSBシリアル変換基板を接続しました。

4.サンプルスケッチの書き込み

1.ArduinoIDEの「ファイル」→「スケッチの例」→「esp8266」→「Blink」を開く。
2.ソースコードの「BUILTIN_LED」を「13」などに書き換える。(ESP-WROOM-02のIOxxピンのxxが対応)
3.ESP-WROOM-02のIO13にLEDを接続する。
4.「ツール」の各項目を以下のように設定

項目y
Flash Mode QIO
Flash Frequency 40 MHz
Upload Using Serial
CPU Frequency 80 MHz
Flash Size 4M(3M SPIFFS)
Upload Speed 115200
ポート 適当なポート

5.RSTスイッチとIO0のスイッチを同時押ししてから、リセットスイッチを先に話すと書き込みモードになります。
この作業をしてからでないと書き込みに失敗します。

6.「マイコンボードに書き込む」ボタンを押す

ここで接続がうまくいくとコンソールに「・・・・・・・・・」と表示されて書き込みを行っていることがわかります。
「warning: espcomm_sync failed」などが表示された場合は回路が間違っているか、電源の電流不足が考えられますのでそのあたりをもう一度確認してみてください。


ここまででLEDが点滅すればESP-WROOM-02Arduinoとして使う実験は成功です。

ST7735メモ

aitendoで販売されているTFT液晶ST7735を使ってみました。
使用方法について簡単に紹介します。

f:id:taltalp:20151107223021j:plain

1.概要

今回使用したTFT液晶はaitendoのキャリーボード付き液晶ZY-FGD1442701V1-PCBです。
128px×128pxの1.44インチ液晶で、MPU搭載ですのでマイコンからでも簡単に制御することが出来ます。

2.ピン配置

液晶キャリーボードのピン配置は液晶モジュールのピン配置とは異なっているようです。
キャリーボードの方のピン配置を下記に載せます。

続きを読む

ニキシー管時計の制作

前回、ニキシー管を点灯させる実験をしました。
taltalp.hatenablog.jp

前回実験で登場した回路を用いて「ニキシー管時計」を制作しました。

f:id:taltalp:20150928030047j:plain

ハンダ付けが下手だったり、実験中に焦がした抵抗をそのまま使っていたりだとか、いろいろとひどいですがなんとか動きます。
動画もアップしました。


今回作った回路はなんの面白みもない時刻表示をするだけの回路です。
PICマイコンを用いて6このニキシー管をダイナミック点灯させて表示しています。
ダイナミック点灯なので、すべてのニキシー管が点いているように見えますが、実際には1つずつしか点いていません。
なのでニキシー管の電源回路から取り出す電流は前回のニキシー管実験の時とほぼ変わりません。

また、今回はRTCに時刻をカウントさせているため、PIC側はダイナミック点灯をしながら、一定時間ごとにRTCから時刻データをもらっているだけです。

写真には写っていませんが、中央の3ピンの端子に押しボタンスイッチが2つ接続されます。
これは時刻設定用です。

回路図

電源回路
f:id:taltalp:20151009011401p:plain
上の記事で説明したとおりです。
半固定抵抗で170Vあたりが出るように調整します。

表示部
f:id:taltalp:20151009011421p:plain
ニキシー管6つ分です。フォトカプラを使って桁を選択して、IC74141で数字を選択します。
R3の20kΩ抵抗は必ず入れてください。これがないとニキシー管に過剰に電流が流れて、数字の切替時に管内で火花が飛び散りました。

メインボード
f:id:taltalp:20151009011432p:plain
マイコンは自宅にたくさんあったのでPIC18F14K50を使いました。RTCを使っているので回路はとても簡単です。
2つの押しボタンスイッチで時刻を設定します。

PICに書き込むソースコードはあまりにも汚いので公開できません。



基板がむき出しだと時計として使いにくいですし、なにより170Vの電圧が出ているため危険ですので、後日ケースを作成する予定です。

高電圧を用いますので、制作する場合は自己責任でお願いします。