Arduino DDS contorol [Aruduino]
前回に続きいよいよDDSを動かすことに挑戦
ハードウェアとしては、前回のLCDの時が基本であるが、DDSとロタリーエンコーダを付加している。さらにLCDの接続部分で、前回は5Vと3.3VのレベルコンバーターにCD4010(CD4050)を使用していたが、今回は秋月で便利なコンバータモジュールを見つけたのでこれに変更した。このコンバータはフェアチャイルドのFXMA108という8bitの双方向通信が可能なものである。基板はDIPの変換基板についているのでユニバーサル基板やブレッドボードに簡単に取り付けられる。また信号が左右で対になっているので配線の引き回しが非常に楽になるという物だ。 注意としてはI2Cには使えない。SPI通信はOK。I2CはFXMA2102というモジュールが別途用意されているので、そちらを使用されたい。FXMA108は以下のリンク参照
http://akizukidenshi.com/catalog/g/gM-04522
DDSは、おなじみAD9850の中華DDS基板である。これについては多くの情報がNETで見られるのでそちらを参照されたい。
ロータリーエンコーダは、サトー電気の特価コーナーにある100STEP/1回転のものを使用した。100STEPのものでお値打ちなものはなかなか入手できないが、これはお買い得である。ノンステップである。詳細は以下HPにあります。
http://www.maroon.dti.ne.jp/satodenki/bargain00.html
今回の目標は、DDSを動作させロータリーエンコーダで周波数を変更し、LCDに周波数を表示することである。基礎技術としているので、周波数STEP変更は行っていない。また表示もただ表示するだけとなっている。これがクリアできれば、次の段階でより高度な制御を行っていくつもりである。
Arduinoのスケッチを以下に載せるが、ライブラリーについて注意点がある。似て非なるものが存在している場合がある。スケッチを公開する場合は極力ライブラリー情報も載せるべきと思う。
● LCD
<TFT_ILI9163C.h> https://github.com/sumotoy/TFT_ILI9163C
● SPI通信
<SPI.h> arduino標準
● フォント
< Adafruit_GFX.h> https://github.com/adafruit/Adafruit-GFX-Library
● エンコーダー
<Rotaly.h> https://github.com/brianlow/Rotary
エンコーダは<rotaly.h>というライブラリーもある。内容は同じであるが、「R」「r」と大文字小文字の違いである。arduinoでは大文字小文字の認識がしっかりしているのでこれを間違えるとコンパイルエラーとなる。今回大文字のものを使用しているのでスケッチも大文字で書いている。
● DDS
<EF_AD9850.h> http://elecfreaks.com/store/download/datasheet/breakout/DDS/EF_AD9850_library.zip
DDS用AD9850用ライブラリーはこれ以外に<AD9850.h>という物も公開されている。制御方法は異なるので注意が必要である。それぞれ特徴があり一長一短である。今回はEF-AD9850を使用した。
スケッチにつては極力コメントを入れてあるが、初心者なので間違いがあるかもしれない。もしお気づきのことがあればお知らせください。
Arduino IDE はVer.1.6.5を使用
スケッチ
/*
Arduino DDS(AD9850) Rotary Encoder TEST
2016.06.10 JA2NKD
*/
#include <SPI.h> // LCDで使われるSPI通信用ライブラリ
#include <Adafruit_GFX.h> // グラフィックや文字フォント用ライブラリ
#include <TFT_ILI9163C.h> // LCDを使うためのライブラリ
#include <Rotary.h> // エンコーダを使うためのライブラリ
#include <EF_AD9850.h> // AD9850を使うためのライブラリ
// Color definitions カラー設定(16bit)
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
// 1.44inch Color LCD Pin assign
#define __CS 10
#define __DC 9
#define __RST 8
int val; // 入力した文字のASCIIコード
long freq = 30000000; //DDSに送る周波数データ(初期設定値)
long freqold = 0; //周波数データの変化前のデータ
// AD9850 assign DDSモジュールとArduinnoの接続
int ddsreset = 4;//RESET
int fqup = 6;//FQ_UP
int clock = 7;//W_CLK
int data = 5;//DATA
// 各ライブラリにpin設定情報をを送る
TFT_ILI9163C tft = TFT_ILI9163C(__CS, __DC, __RST);
EF_AD9850 AD9850(clock, fqup, ddsreset, data);
Rotary r = Rotary(2, 3);
void setup() // 初期設定立ち上がり時1回だけ処理される
{
tft.begin(); // LCDと通信開始
tft.setRotation(1); // 画面を90度時計回りに回転
tft.fillScreen(BLACK); // 画面を黒で塗りつぶし
PCICR |= (1 << PCIE2); // エンコー割り込み設定
PCMSK2 |= (1 << PCINT18) | (1 << PCINT19); // エンコーダー割り込み設定
sei(); // 割り込み開始
AD9850.init();// AD9850の初期化
AD9850.reset();// AD9850リセット
AD9850.wr_serial(0x00, freq); // 周波数データを送る
}
void loop() { //メインプログラムを書く
writeTextdds();
}
ISR(PCINT2_vect){ //エンコーダ割り込み処理
unsigned char result = r.process(); // ライブラリからの戻り値格納
if (result) {
if (result == DIR_CW) { // 戻り値がDIR_CWと同じなら以下を処理
freq = freq + 100000; // 右回りの時 周波数を100K UP
}
else { // 戻り値がDIR_CWと同じでなければ以下を処理
freq = freq - 100000; // 左回りの時 周波数を100K DOW
}
}
}
unsigned long writeTextdds(){ // 周波数をLCDに表示、DDSにデータを送る
if (freq != freqold){ // 周波数に変化があれば以下を処理
tft.fillRect(10, 10, 100, 30, BLACK); // 表示か所を黒で塗りつぶし
tft.setCursor(10, 10); // 周波数表示位置にカーソル移動
tft.setTextColor(YELLOW); // 文字色設定
tft.setTextSize(2); // 文字サイズ設定
tft.println(freq); // 文字表示(改行あり)
AD9850.wr_serial(0x00, freq); // DDSに周波数データを送る
freqold = freq; // 新しい周波数をoldに格納
}
}
おわり
コメント 0