SSブログ

Arduino DDS_VFO(2) [Aruduino]

DSCN3569.JPG

 前回に続いてVFO製作。今回はスイッチ関係とSメータ表示を付け加え完成としたい。
回路は前回掲載しているのでそちらを参照願いたい。説明のためスケッチの一部を以下に記載。これだけでは動作しないのでご注意。別途スケッチをダウンロード願います。




 最初にスイッチの取り込みや出力、アナログ取り込み等の設定をする。
 ポートを分かりやすい名称に設定(将来ポート変更があってもここで変更すれば簡単に修正できる)

 const byte s_meter=A0; // Sメータ値アナログ入力
 const byte modesw=A1;  // モード切替スイッチ(入力)
 const byte modeout=A2; // モード切替情報出力(出力)
 const byte stepsw=A3; // 周波数ステップ切替スイッチ(入力)
 const byte ritsw=A4; // RIT on/offスイッチ(入力)
 const byte txsw=A5; // 送信情報取り込み(入力)

 読み替えたI/Oをvoid setup()内で入出力プルアップ設定する
void setup() {
 pinMode(modesw,INPUT_PULLUP); // モード設定INPUTTプルアップ付き
 pinMode(modeout,OUTPUT); // モード情報を外部キャリア切替に出力(LSB,Low CW High)
 pinMode (stepsw,INPUT_PULLUP); // ステップ切替設定INPUTTプルアップ付き
 pinMode (ritsw,INPUT_PULLUP); // リットON/OFF設定INPUTTプルアップ付き
 pinMode(txsw,INPUT_PULLUP); // 送信情報(Low)INPUTTプルアップ付き


 メインプログラムのloop()内でスイッチ変化を読み取る
void loop(){
 if (digitalRead(modesw)==LOW){modeset();} //modeスイッチを押したときmodeset()サブルーチンに飛ぶ
 if (digitalRead(stepsw)==LOW){setstep();} // STEPスイッチを押したときsetstep()サブルーチンに飛ぶ
 if (digitalRead(ritsw)==LOW){setrit();} // ritスイッチを押したときsetrit()サブルーチンに飛ぶ
 if (digitalRead(txsw)==LOW){txset();} //送信情報が入力されたらtxset()サブルーチンに飛ぶ
 smeter(); //条件無しで毎回smeter()サブルーチンに飛ぶ

: 
 loop()内でスイッチ変化が検出されたときに各サブルーチンにジャンプしてそれぞれのプログラムを実行する。

 全部の内容を記載するのは大変なので代表的にmode変更サブルーチンを掲載します。その他スケッチ全体で何かご質問でもあれば、コメント欄やメールでも頂ければ幸いです。

 modeスイッチが押されたときに実行されるサブルーチン
void modeset(){ // サブルーチン宣言
  if (flagmode==0){ // モードフラグが「0」なら以下を実行
    flagmode=1; // モードフラグを「1」に変更
    ifshift=ifshiftCW; // IFshift周波数をCW用に設定
      digitalWrite(modeout,HIGH); // A2pinをHighにする。外部キャリア切替用信号
    }
  else{ // モードフラグが「0」で無ければ
    flagmode=0; // モードフラグを「0」に変更
    ifshift=ifshiftLSB; // IFshift周波数をLSBに変更
      digitalWrite(modeout,LOW); // A2pinをLowにする。外部キャリア切替信号
  }  
  tft.fillRect(5,41,36,14,BLACK); // 画面のモード表示部分を黒で塗りつぶし
  tft.setCursor(5,41); // カーソル位置設定
  tft.setTextSize(2); // 文字サイズを「2」に設定
  tft.setTextColor(MAGENTA); // 文字色をマゼンタに設定
  if (flagmode==0){tft.print("LSB");} // modeフラグが「0」ならばLSBと表示
  if (flagmode==1){tft.print("CW");} // modeフラグが「1」ならばCWと表示
  ddswrite(); // シフト周波数が変更となるのでDDSに書き込む   while(digitalRead(modesw) == LOW); // モードスイッチがOFFになるのを待つ
}

 このサブルーチンの中でmodeフラグというものが出てきている。これは現状の状態を記憶させるためのもので、色々な場面でこれを参照することにより、設定状態が判定できる。要するに旗を立てて目印とするものである。これを使うことによりすっきりとしたスケッチとなり、ミスも減る。これ以外にもritフラグ等を使用している。
 最後の行while文であるが、JA2GQPさんのスケッチから流用させていただいた。チャタリング防止に有効。これが無いとスイッチを押して離す間に何回も切替が実行されてしまう。

その他のサブルーチンもこんな具合で作っている。

Sメータであるが、思ったより旨く動いている。受信機AGCから0~5V位の電圧をA0pinからアナログ取り込み命令で受け取る。電圧は0~1023の数値に変換され変数に入る。このままでは旨くないので、これを50で割る。4V位をMAXとすればこれで0~15位の数値になる。これを15個の文字でSを表現している。丁度良い文字が無かったのでちょっと凝った書き方をしている。スケッチで見てください。さらに9以上は赤字にしてオーバーを示している。

 以上簡単であるが、解説とする。Arduino DDS-VFOの1号機完成である。更にプログラミングを勉強しメモリ等機能UPしたいと思う。

スケッチ ダウンロード先
http://yahoo.jp/box/FzCR1P
実動作ビデオ
https://www.youtube.com/watch?v=1dGlrlca9_I&t=14s

DSCN3577.JPG  DSCN3578.JPG


nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

Arduino DDS_VFO(1)Arduino DDS_VFO(3) D.. ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。