オプティカルロータリーエンコーダー② (早く回転するとステップが上がる仕組み)
- 2016/12/23
- 21:55

6m2号機をスイッチ無しの光学ロータリーエンコーダーに切り替えるには、下記のどちらかの条件を満たす必要がある。
① 周波数ステップを切り替えるボタンを実装(現在の秋月ロータリースイッチでは押ボタンスイッチ内蔵)
② ロータリーエンコーダーの回転スピードが上がるとVFOの変化が大きくなる機能
上記①はスペースの都合上行いたくない。
従って、②を実現する事になった。
まずは、既存のロータリーエンコーダーを使って試してみました。
試行錯誤の末、違和感のないフィーリングが得られました。
あとは、交換するだけですが、ケース加工などもあり、億劫になってきました。 秋月激安ロータリーエンコーダーでもOKな事が分かりました。 それと、ロータリーエンコーダー内蔵の押ボタンスイッチを何かに使えそうであります。
それと、光学式ロータリーエンコーダーにした場合、これまではあったクリック機能が無いので、ロック機能が必須になると思われます。
★試験用コード★ ------------------------------------------
// ロータリーエンコーダーのスピードに応じて増加幅を広げる UNOでの試験用(MEGAでは動かな)
#include <Rotary.h>
Rotary r = Rotary(2, 3);
long OLD_MILLIS;
long ROTARY_SPEED;
long ROTARLY_MAX = 50;
long OLD_ROTARY_SPEED;
void setup() {
Serial.begin(9600);
PCICR |= (1 << PCIE2);
PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
sei();
}
void loop() {
}
ISR(PCINT2_vect) {
unsigned char result = r.process();
if (result == DIR_NONE) {
// do nothing
}
else if (result == DIR_CW) {//-----------------------------------------
ROTARY_SPEED = millis() - OLD_MILLIS;
if (ROTARY_SPEED > ROTARLY_MAX) {
ROTARY_SPEED = ROTARLY_MAX;
}
ROTARY_SPEED = (ROTARY_SPEED - ROTARLY_MAX - 1) * (ROTARY_SPEED - ROTARLY_MAX - 1);
Serial.print("ClockWise ");
Serial.println(ROTARY_SPEED);
OLD_MILLIS = millis();
}
else if (result == DIR_CCW) {//---------------------------------------
ROTARY_SPEED = millis() - OLD_MILLIS;
if (ROTARY_SPEED > ROTARLY_MAX) {
ROTARY_SPEED = ROTARLY_MAX;
}
ROTARY_SPEED = (ROTARY_SPEED - ROTARLY_MAX - 1) * (ROTARY_SPEED - ROTARLY_MAX - 1);
Serial.print("CounterClockWise ");
Serial.println(ROTARY_SPEED);
OLD_MILLIS = millis();
}
}
★2号機組み込みコード★ ------------------------------------------
/*自作機2号機用コントロールプログラムJQ1SRN本プログラムの多くはネットで見つけた情報を参考にしております。コードの最適化などは考えていないため、効率が悪いコーディングになっていると思われます。ご注意ください。使用IOポート0: CAT TX1: CAT RX2: ロータリーエンコーダーA(基板1)3: ロータリーエンコーダーB(基板2) (基板3:GND)4: LCD , Refer to P186 Arduinoを始めよう5: LCD , Refer to P186 Arduinoを始めよう6: LCD , Refer to P186 Arduinoを始めよう7: LCD , Refer to P186 Arduinoを始めよう8: AD9850 DATA9: AD9850 RESET10: LCD , Refer to P186 Arduinoを始めよう11: LCD , Refer to P186 Arduinoを始めよう12: LCD , Refer to P186 Arduinoを始めよう13:周波数ステップ切替スイッチ(ロータリエンコーダスイッチ利用) ロータリー側コネクター6、5はGへ(基板4)14: F_LOCK周波数ロック、Mega以降追加 ★試にプルアップしてみた。外付け抵抗不要でよさそう。15:Freq Lock16:AD9850 FQ_UD17:AD9850 CLK22: INPUT: PTT from MIC, BUT, KEY24: OUTPUT: RELAY (with delay)26: MUTE54: A0(14) (Mega 54)スキャン開始、停止用押しボタンスイッチ55: A1(15) (Mega 55)VFO A/B切替スイッチ56: A2(16)(Mega 56) RIT ONスイッチ57: A3 (17)(Mega 57)TX検出、受信時にのみRIT-ON58: A4 (18)(Mega 58) HIGHを検出するとCW表示、LOW検出時はSSB表示59: A5(19)(Mega 59)電圧検出60: A8 RSSI read from IF44: 44 Gain Controle to change PIN Di*/
// ヘッダー関連 -----------------------------------
#include <FlexiTimer2.h> /// 1mS割り込み用 Mega用!!
#include <LiquidCrystal.h> /// LCD表示用
#include <EF_AD9850.h> //AD9850を使うためのライブラリ
#define BEAT 300 // 音の長さを指定
#define PINNO 15 // 圧電スピーカを接続したピン番号
#include <Wire.h>
#include <Adafruit_MCP4725.h>
#include <Rotary.h>
Adafruit_MCP4725 dac;
// 初期設定関連 -----------------------------------
// 初期周波数設定
volatile long X = 35840000; ///液晶に表示する数字、周波数Hz
volatile long Y = 35840000; /// RIT時のテンポラリー
volatile long TEMP_DELTA_FREQ; /// CW時の周波数ズラシ用
volatile long DISP_FREQ = 50150000; /// LCD表示周波数
volatile long DELTA_FREQ = DISP_FREQ - X; ///差分記憶
volatile long RIT_FREQ = 0; ///RIT用周波数
volatile long OLD_RIT_FREQ; ///RIT変化チェック用
volatile long XA; ///VFOテンポラリーメモリー
volatile long XB = 36177400; ///VFOテンポラリーメモリー ★電源ON時、VFO-Bにビーコン周波数がデフォルト設定が便利
//RotayEncorder
Rotary r = Rotary(2, 3);
long OLD_MILLIS;
long ROTARY_SPEED;
long ROTARLY_MAX = 20;
// LCDのポート設定
LiquidCrystal lcd(12, 11, 10, 7, 6, 5, 4); // デジタルポート番号、本参照
// 周波数ステップの切替ボタン設定
const int BUTTON = 13; /// ボタン、ステップ切替用
int val = 0; /// 状態変数、0か1、1の場合は10ステップ、0時は100ステップ
int old_val = 0; /// 前の状態を記憶
int state = 1; /// 現在のステート
int state_a = 0; /// VFO A 時のステップ
int state_b = 0; /// VFO B 時のステップ
int freq_step = 10; /// 周波数ステップ
// 周波数に小数点を入れる計算をするためのテンポラリメモリ
String TMP; //周波数表示に小数点入れるためのテンポラリ計算用
String TMP1; //周波数表示に小数点入れるためのテンポラリ計算用
String TMP2; //周波数表示に小数点入れるためのテンポラリ計算用
String TMP3; //周波数表示に小数点入れるためのテンポラリ計算用
///スキャン用ボタン設定
const int SCAN_BUTTON = 54; ///スキャンON/OFF用ボタン
int val2 = 0; /// 仮ステータス
int old_val2 = 0; /// 仮ステータス
int state2 = 0; /// 仮ステータス
///RIT用ボタン設定
const int RIT_BUTTON = 55; ///スキャンON/OFF用ボタン 16pin
int val3 = 0; /// 仮ステータス
int old_val3 = 0; /// 仮ステータス
int state3 = 0; /// 仮ステータス
///TX検出用ボタン設定
const int TX_DETECT = 57; ///TX
int val4 = 0; /// 仮ステータス
int old_val4 = 0; /// 仮ステータス
int state4 = 0; /// 仮ステータス
// モード検出用設定、リグのHWスイッチから電圧を検出する
const int MODE_DETECT = 58; ///検出ピン18番、A4
int val5 = 0; /// 仮ステータス
int old_val5 = 0; /// 仮ステータス
int state5 = 0; /// 仮ステータス
///VFO-AB 用ボタン設定
const int VFO_BUTTON = 56; ///VFO A B ボタン 15Pin
int val6 = 0; /// 仮ステータス
int old_val6 = 0; /// 仮ステータス
int state6 = 0; /// 仮ステータス
//周波数ロック機能
const int FREQ_LOCK = 14; ///スキャンON/OFF用ボタン
int val7 = 0; /// 仮ステータス
int old_val7 = 0; /// 仮ステータス
int state7 = 0; /// 仮ステータス
// 電圧測定用変数
const int VOLT = 5; /// ピン定義A5を使う
double volt_val = 0; /// 電圧入れる変数
char volt_1[2]; /// LCD電圧表示用変数 小数点より前
char volt_2[1]; /// LCD電圧表示用変数 小数点後
//AD9850 DDSモジュールとArduinnoの接続
int clock = 17;//W_CLK original 1
int fqup = 16;//FQ_UD , original 0
int data = 8;//DATA
int ddsreset = 9;//RESET
EF_AD9850 AD9850(clock, fqup, ddsreset, data);
/// CAT送信間隔用
volatile long SEND_CAT = 1;
/// RSSI
long RSSI_VAL = 0;
long RSSI_PIN = 8; // A8 pin
/// AGC
long AGC_VAL = 1900;
long AGC_PIN = 44; // 44 pin
long OLD_AGC_VAL = 1000;
long AGC_DELAY = 10000;
long AGC_TARGET = 550;
long HOLD_STAT = 0;
long HOLD_MAX = 35; // AGCホールドタイム
long HOLD_MAX_RESET = 200;
long AGC_TARGET_PREV = AGC_TARGET;
//PTT RELATED
int PTT_PIN = 22;
int PTT_STAT = 1;
int OLD_PTT_STAT = 1;
int PTT_RELAY = 24;
int PTT_MUTE = 26;
long MUTE_COUNT = 0;
long MUTE_COUNT_RX = 0;
long MAX_MUTE_COUNT = 2;
long MAX_MUTE_COUNT_RX = 7;
int MUTE_STAT = 0;
//カスタム文字 バー表示
byte METER1[8] = {
B10000,
B10000,
B10000,
B10000,
B10000,
B10000,
B10000,
};
byte METER2[8] = {
B10100,
B10100,
B10100,
B10100,
B10100,
B10100,
B10100,
};
byte METER3[8] = {
B10101,
B10101,
B10101,
B10101,
B10101,
B10101,
B10101,
};
// セットアップ、初回のみ実行 ----------------------------
void setup(void) {
Serial.begin(9600); /// CAT用
pinMode(2, INPUT); // ロータリーエンコーダーA デジポート2
digitalWrite(2, HIGH); // プルアップ
pinMode(3, INPUT); // ロータリーエンコーダーB デジポート3、Cはグラウンドへ!
digitalWrite(3, HIGH); // プルアップ
pinMode(BUTTON, INPUT); // ボタン、ステップ切替用
pinMode(SCAN_BUTTON, INPUT); /// スキャン用のボタン、トグル化する
pinMode(RIT_BUTTON, INPUT); /// RIT ON用
pinMode(TX_DETECT, INPUT); /// TX検出用
pinMode(MODE_DETECT, INPUT); /// MODE検出用
pinMode(FREQ_LOCK, INPUT); /// プルアップしてみる。
digitalWrite(FREQ_LOCK, HIGH); ///プルアップ設定はこれ。
pinMode(PTT_PIN, INPUT_PULLUP); /// PTT端子、検出
pinMode(PTT_RELAY, OUTPUT); /// 2SC1815経由でリレー制御
pinMode(PTT_MUTE, OUTPUT); /// LM386ミュート
// LCDのセットアップ
// 16文字×2行のLCDを使用します
lcd.begin(16, 2);
attachInterrupt(digitalPinToInterrupt(2), interrupt, CHANGE);
attachInterrupt(digitalPinToInterrupt(3), interrupt, CHANGE);
// AD9850セットアップ関連
AD9850.init();//AD9850の初期化
AD9850.reset();//AD9850リセット
AD9850.wr_serial(0x00, X); //周波数データを送る、初期周波数Xを設定
//MUTE 初期設定
digitalWrite(PTT_MUTE, HIGH);
/// スタートアップ画面 電源ONしたときに遊びで表示
/* lcd.home(); lcd.print("JQ1SRN YOKOHAMA"); delay(300); lcd.clear(); delay(100); lcd.home(); lcd.print("JQ1SRN YOKOHAMA"); delay(300); lcd.clear(); delay(100); lcd.home(); lcd.print("JQ1SRN YOKOHAMA"); delay(300); lcd.clear(); delay(100); */
lcd.home();
lcd.print("SRN-02 BY JQ1SRN");
lcd.setCursor(0, 1); // 横に14、下に1、の位置にカーソル移動
lcd.print("Ver:20161224-001");
/////////////////////////// 液晶表示文字数定規
delay(3000);
lcd.clear();
dac.begin(0x60); // MCP4725 DAモジュールのI2Cアドレス
}
// ループ、実行部分 --------------------------------ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー-
void loop(void) {
// LCDに文字を表示するための処理ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
DISP_FREQ = DELTA_FREQ + X; // DDSと表示周波数の差分を計算している
TMP = String(DISP_FREQ, DEC); /// 数値→テキスト変換
lcd.setCursor(6, 0); // 横に4、下に0、の位置にカーソル移動
TMP1 = TMP.substring(0, 2); // MHz部分表示VFOして、ピリオド
lcd.print(TMP1);
lcd.print(".");
TMP2 = TMP.substring(2, 5); // その後のKHZ表示
lcd.print(TMP2);
lcd.print(".");
TMP3 = TMP.substring(5, 9); // その後のHz表示
lcd.print(TMP3);
// lcd.print("Hz"); //VFO表示のためHz表示廃止
lcd.setCursor(0, 1); // 横に0、下に1、の位置にカーソル移動
// 周波数ステップ切替ボタン ---------------------------------
val = digitalRead(BUTTON); /// ステップ切替ボタン用シーケンス
if ((val == HIGH) && (old_val == LOW)) { /// ボタンが押されたの検出
state = 1 - state; /// 前とステート変更
}
old_val = val;
if (state == 1) { /// ステート1ならば、、、 ステップ10 暫定として
freq_step = 10;
} else { /// ステート0ならば、、、 ステップ100 暫定として
// X = X / 100; // 100ステップ時に10の桁をゼロにリセットして見た目をよくする
// X = X * 100; // 100ステップ時に10の桁をゼロにリセットして見た目をよくする
freq_step = 300;
}
// スキャン開始終了ボタン ---------------------------------
val2 = digitalRead(SCAN_BUTTON); /// ステップ切替ボタン用シーケンス
if ((val2 == HIGH) && (old_val2 == LOW)) { /// ボタンが押されたの検出
state2 = 1 - state2; /// 前とステート変更
}
old_val2 = val2;
if (state2 == 1) { /// ステート1ならばスキャンスタート、、、 処理A
X = X + 500;
AD9850.wr_serial(0x00, X); //周波数データを送る アップ
if (X > 36090000) { /// 35990000=50.300MHzでスキャンを50.150から再スキャン
X = 35840000; /// 35840000=50.150から再スキャン
}
} else { /// ステート0ならば、、、 処理B
/// digitalWrite(LED,LOW);
/// スキャンスイッチをもう一度押すと、なにもしない、スキャン停止する
}
// RITボタン ---------------------------------
val3 = digitalRead(RIT_BUTTON); /// ステップ切替ボタン用シーケンス
if ((val3 == HIGH) && (old_val3 == LOW)) { /// ボタンが押されたの検出
state3 = 1 - state3; /// 前とステート変更、RITがONの時State3は1となる
if (state3 == 1) {
lcd.setCursor(5, 1); // 横に0、下に1、の位置にカーソル移動
lcd.print("R "); // 表示、後でモードや他の情報表示に使う
lcd.setCursor(8, 1); // 横に0、下に1、の位置にカーソル移動
lcd.print(RIT_FREQ); // 表示、後でモードや他の情報表示に使う
lcd.print("Hz "); // 表示、後でモードや他の情報表示に使う
}
}
old_val3 = val3;
if (state3 == 1) { /// RITがONであれば
lcd.setCursor(5, 1); // 横に0、下に1、の位置にカーソル移動
lcd.print("R "); // RIT ON表示
if (RIT_FREQ != OLD_RIT_FREQ) { /// ロータリーエンコーダーが回って周波数が変わったら
lcd.print(" "); // 表示、後でモードや他の情報表示に使う
lcd.setCursor(7, 1); // 横に0、下に1、の位置にカーソル移動
lcd.print(RIT_FREQ); // 表示、後でモードや他の情報表示に使う
lcd.print("Hz"); // 表示、後でモードや他の情報表示に使う
OLD_RIT_FREQ = RIT_FREQ;
}
} else { /// /// RITがOFFであれば
lcd.setCursor(5, 1); // 横に0、下に1、の位置にカーソル移動
lcd.print(" "); // 表示、後でモードや他の情報表示に使う
Y = X;
RIT_FREQ = 0;
// RITがOFFの時だけ電圧表示する
volt_val = analogRead(VOLT); /// 電圧読み出し
volt_val *= 5; ///変換
volt_val /= 1024; ///変換
volt_val /= 30.2; /// 変換 元々30で、微調整で+0.2電圧微調整
volt_val *= 130;
dtostrf(volt_val, 2, 1, volt_1); //変換する値 ,変換後の総文字数,小数点以下の桁数(13.82->13.8),変換後格納する変数
lcd.print(volt_1); // 電圧をLCDに表示
lcd.print("V"); // 電圧をLCDに表示
if (atoi(volt_1) < 10.0 && atoi(volt_1) > 1.0 ) { // 電圧が10v以下になったらアラートを出す!
tone(PINNO, 262, BEAT) ; // ド
delay(BEAT) ;
tone(PINNO, 294, BEAT) ; // レ
delay(BEAT) ;
}
}
// PTT制御 ---------------------------------
PTT_STAT = digitalRead(PTT_PIN); /// 結果0=送信
//Serial.print("PTT---------------");
//Serial.println(PTT_STAT);
if (PTT_STAT == 0 && OLD_PTT_STAT == 1) { // 初回送信時実行 ★
digitalWrite(PTT_MUTE, LOW); // MUTEするーー>MUTE解除まで
MUTE_COUNT = 0;
digitalWrite(PTT_RELAY, HIGH);
OLD_PTT_STAT = PTT_STAT;
MUTE_STAT = 1;
}
if (PTT_STAT == 0 && OLD_PTT_STAT == 0 && MUTE_STAT == 1) { // MUTE解除までの時間
MUTE_COUNT = MUTE_COUNT + 1;
if (MUTE_COUNT == MAX_MUTE_COUNT)
{
digitalWrite(PTT_MUTE, HIGH);
MUTE_STAT = 0;
}
if (MUTE_COUNT > MAX_MUTE_COUNT) {
MAX_MUTE_COUNT = 50;
}
}
if (PTT_STAT == 1 && OLD_PTT_STAT == 0) { // 受信に切り替わり ★
digitalWrite(PTT_MUTE, LOW); // MUTEするーー>MUTE解除まで
MUTE_COUNT_RX = 0;
digitalWrite(PTT_RELAY, LOW);
OLD_PTT_STAT = PTT_STAT;
}
if (PTT_STAT == 1 && OLD_PTT_STAT == 1) { // MUTE解除までの時間
MUTE_COUNT_RX = MUTE_COUNT_RX + 1;
if (MUTE_COUNT_RX == MAX_MUTE_COUNT_RX)
{
digitalWrite(PTT_MUTE, HIGH);
}
if ( MAX_MUTE_COUNT_RX > MAX_MUTE_COUNT_RX) {
MAX_MUTE_COUNT_RX = 50;
}
}
// TX検出 ---------------------------------
val4 = digitalRead(TX_DETECT); ///送信検出
if (val4 == HIGH) { /// ボタンが押されたの検出 val4は送信時「1」となる
if (old_val4 != HIGH) { //LCD表示が点滅するのを防ぐ、RXからTXになった際だけ、このIF分入る
// digitalWrite(PTT_MUTE, LOW); // LOW MUTE
// delay(50);
// digitalWrite(PTT_MUTE, HIGH); // HIGH UNMUTE
lcd.setCursor(14, 1); // 横に14、下に1、の位置にカーソル移動
lcd.print("TX"); // 送信時にLCDにTXと表示
AD9850.wr_serial(0x00, X); //周波数データを送る アップ
old_val4 = val4;
if (state2 == 1) { /// スキャン中なら、PTTでスキャン停止
state2 = 0;
}
}
// delay(10);
} else { /// 受信時 val4がLOWである時
/// digitalWrite(LED, LOW);
lcd.setCursor(14, 1); // 横に14、下に1、の位置にカーソル移動
lcd.print("RX"); // 受信時にLCDにRXと表示
if (state3 == HIGH) { /// RITスイッチをチェックする、RITがONの時はこちら
//AD9850.wr_serial(0x00, Y); /// バックアップ:RIT補正の周波数データを送る アップ
/// CW時でかつ、RXの時だけ、受信周波数を800Hz下げる
if (val5 == HIGH) { /// CWモードと判断
TEMP_DELTA_FREQ = Y - 800;
AD9850.wr_serial(0x00, TEMP_DELTA_FREQ); //送信波を800HzだけUP
} else { // SSBモードの場合通常にY周波数を送る
AD9850.wr_serial(0x00, Y); //周波数データを送る アップ
old_val4 = val4;
}
} else { /// RIT が OFFの時はこちら
//AD9850.wr_serial(0x00, X); //周波数データを送る アップ
/// CW時でかつ、RXの時だけ、受信周波数を800Hz下げる
if (val5 == HIGH) { /// CWモードと判断
TEMP_DELTA_FREQ = X - 800;
AD9850.wr_serial(0x00, TEMP_DELTA_FREQ); //送信波を800HzだけUP
} else { // SSBモードの場合通常にY周波数を送る
AD9850.wr_serial(0x00, X); //周波数データを送る アップ
old_val4 = val4;
}
}
old_val4 = val4;
// delay(10);
}
// MODE検出 ---------------------------------
val5 = digitalRead(MODE_DETECT); /// モード検出ピンをチェック
if (val5 == HIGH) { /// ボタンが押されたの検出 val5は送信時「1」となる
if (old_val5 != HIGH) { //LCD表示が連続上書きされ点滅するのを防ぐ
lcd.setCursor(0, 0); // 左上座標
lcd.print("CW "); // CW表示
}
// delay(10);
} else {
lcd.setCursor(0, 0); // 左上座標
lcd.print("SSB"); // SSB表示
old_val5 = val5;
// delay(10);
}
// VFO ABボタン処理 ---------------------------------
val6 = digitalRead(VFO_BUTTON); /// VFOボタン定義
if ((val6 == HIGH) && (old_val6 == LOW)) { /// ボタンが押されたの検出
state6 = 1 - state6; /// 前とステート変更、ボタンONの時Stateは1となる
if (state6 == 1) { /// VFO B-> A
XA = X;
X = XB;
state_a = state;
state = state_b;
} else { /// VFO A - > B
XB = X;
X = XA;
state_b = state;
state = state_a;
}
}
old_val6 = val6;
if (state6 == 1) { ///
lcd.setCursor(4, 0); // 横に0、下に1、の位置にカーソル移動
lcd.print("B"); // 表示、後でモードや他の情報表示に使う
} else { /// ///
lcd.setCursor(4, 0); // 横に0、下に1、の位置にカーソル移動
lcd.print("A"); // 表示、後でモードや他の情報表示に使う
}
// 周波数ロック ボタン処理 ---------------------------------
val7 = digitalRead(FREQ_LOCK); /// VFOボタン定義
if ((val7 == LOW) && (old_val7 == HIGH)) { /// ボタンが押されたの検出
state7 = 1 - state7; /// 前とステート変更、ボタンONの時Stateは1となる
}
old_val7 = val7;
if (state7 == 1) { ///LOCKボタン押されて、LOCKステートに入っている
lcd.setCursor(3, 0);
lcd.print("*"); // LCDにロック時★マーク表示
} else { /// ///
lcd.setCursor(3, 0);
lcd.print(" "); // LCDの★マーク消す
}
// CAT出力 ---------------------------------
++SEND_CAT;
if (SEND_CAT > 20) {
Serial.print("FA000"); ///周波数
Serial.print(DISP_FREQ); ///周波数
Serial.println(";"); ///周波数
if (val5 == HIGH) { /// ボタンが押されたの検出 val5は送信時「1」となる
Serial.println("MD3;"); ///モード
} else {
Serial.println("MD2;"); ///モード
}
SEND_CAT = 1;
}
// AGC 処理 ---------------------------------
RSSI_VAL = analogRead(RSSI_PIN); /// 電圧読み出し
// RSSIバー表示
lcd.createChar(1, METER1);
lcd.createChar(2, METER2);
lcd.createChar(3, METER3);
if (RSSI_VAL < 200) {
lcd.setCursor(0, 1);
lcd.write(1); lcd.write(" ");
}
if (RSSI_VAL > 199 && RSSI_VAL < 241) {
lcd.setCursor(0, 1);
lcd.write(2); lcd.write(" ");
}
if (RSSI_VAL > 240 && RSSI_VAL < 283) {
lcd.setCursor(0, 1);
lcd.write(3); lcd.write(" ");
}
if (RSSI_VAL > 282 && RSSI_VAL < 325) {
lcd.setCursor(0, 1);
lcd.write(3); lcd.write(1); lcd.write(" ");
}
if (RSSI_VAL > 324 && RSSI_VAL < 366) {
lcd.setCursor(0, 1);
lcd.write(3); lcd.write(2); lcd.write(" ");
}
if (RSSI_VAL > 365 && RSSI_VAL < 408) {
lcd.setCursor(0, 1);
lcd.write(3); lcd.write(3); lcd.write(" ");
}
if (RSSI_VAL > 407 && RSSI_VAL < 450) {
lcd.setCursor(0, 1);
lcd.write(3); lcd.write(3); lcd.write(1); lcd.write(" ");
}
if (RSSI_VAL > 449 && RSSI_VAL < 491) {
lcd.setCursor(0, 1);
lcd.write(3); lcd.write(3); lcd.write(2); lcd.write(" ");
}
if (RSSI_VAL > 490 && RSSI_VAL < 533) {
lcd.setCursor(0, 1);
lcd.write(3); lcd.write(3); lcd.write(3); lcd.write(" ");
}
if (RSSI_VAL > 532 && RSSI_VAL < 575) {
lcd.setCursor(0, 1);
lcd.write(3); lcd.write(3); lcd.write(3); lcd.write(1);
}
if (RSSI_VAL > 574 && RSSI_VAL < 616) {
lcd.setCursor(0, 1);
lcd.write(3); lcd.write(3); lcd.write(3); lcd.write(2);
}
if (RSSI_VAL > 615 && RSSI_VAL < 658) {
lcd.setCursor(0, 1);
lcd.write(3); lcd.write(3); lcd.write(3); lcd.write(3);
}
if (RSSI_VAL > 657) {
lcd.setCursor(0, 1);
lcd.write(3); lcd.write(3); lcd.write(3); lcd.write(3);
}
//デバッグ用RSSIシリアル出力
//Serial.print("RSSI_VAL: "); ///周波数
//Serial.print(RSSI_VAL); ///周波数
//Serial.print(" "); ///周波数
// RSSIが550になるように、調整する
if (RSSI_VAL < AGC_TARGET) { // ホールド&リリースタイム、550以下の場合(弱電界)、Gへの抵抗上げる、オープン方向
//if (HOLD_STAT > HOLD_MAX) { //ホールド解除 *
if (AGC_TARGET - RSSI_VAL > 100) {
AGC_VAL = AGC_VAL - 10;
}
if (AGC_TARGET - RSSI_VAL <= 100 && AGC_TARGET - RSSI_VAL > 50 ) {
AGC_VAL = AGC_VAL - 10;
}
if (AGC_TARGET - RSSI_VAL <= 50 && AGC_TARGET - RSSI_VAL > 25 ) {
AGC_VAL = AGC_VAL - 1;
}
if (AGC_TARGET - RSSI_VAL <= 25 && AGC_TARGET - RSSI_VAL > 10 ) {
AGC_VAL = AGC_VAL - 1;
}
if (AGC_TARGET - RSSI_VAL <= 10 ) {
AGC_VAL = AGC_VAL - 1;
}
// if (HOLD_STAT == HOLD_MAX_RESET) { // ホールド解除 *
// HOLD_STAT = 0; //*
// } else { //*
// HOLD_STAT = HOLD_STAT + 1;//*
// }//*
//} else {//*
// HOLD_STAT = HOLD_STAT + 1;//*
//}//*
}
if (RSSI_VAL > AGC_TARGET) { // アタックタイム、550以上の場合(強電界)、Gへの抵抗下げる、ショート方向
HOLD_STAT = 0;
if ( RSSI_VAL - AGC_TARGET > 100) {
AGC_VAL = AGC_VAL + 10;//50
}
if (RSSI_VAL - AGC_TARGET <= 100 && RSSI_VAL - AGC_TARGET > 50 ) {
AGC_VAL = AGC_VAL + 10;//25
}
if (RSSI_VAL - AGC_TARGET <= 50 && RSSI_VAL - AGC_TARGET > 25 ) {
AGC_VAL = AGC_VAL + 1;//13
}
if (RSSI_VAL - AGC_TARGET <= 25 && RSSI_VAL - AGC_TARGET > 10 ) {
AGC_VAL = AGC_VAL + 1;//5
}
if (RSSI_VAL - AGC_TARGET <= 10 ) {
AGC_VAL = AGC_VAL + 1;
}
}
if (AGC_VAL > 4095) { //上限
AGC_VAL = 4095;
}
if (AGC_VAL <= 0) { //下限
AGC_VAL = 0;
}
if (state7 == 1) { ///LOCKボタン押されて、LOCKステートに入っている★暫定 後で削除
//AGC_VAL = 0; //0でPINダイオード電流最小、Gへはオープン、ATTとなっていない状態、スルー
//HOLD_STAT = 0;
AGC_TARGET = 250;
}else{
AGC_TARGET = AGC_TARGET_PREV;
}
dac.setVoltage(AGC_VAL, false);// DA制御
//AGCデバッグ出力
//Serial.print("AGC_VAL: ");
//Serial.print(AGC_VAL);
//for (int i = 0; i <= AGC_VAL / 50; i++) {
// Serial.print("*");
//}
//Serial.println(" ");
} /// ←Loop閉じるカッコなので注意、if文の終わりではない
// 割り込み時に実行されるプログラム ロータリー処理、周波数変更、AD9850アップデート --ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
void interrupt() {
if (state7 == 1) { /// F_LOCKされている
return;
}
unsigned char result = r.process();
if (result == DIR_NONE) {
// do nothing
}
else if (result == DIR_CW) { // 右回転
ROTARY_SPEED = millis() - OLD_MILLIS;
if (ROTARY_SPEED > ROTARLY_MAX) {
ROTARY_SPEED = ROTARLY_MAX;
}
ROTARY_SPEED = (ROTARY_SPEED - ROTARLY_MAX - 1) * (ROTARY_SPEED - ROTARLY_MAX - 1);
if ((state3 == HIGH) && (val4 == LOW)) { /// RITモードがONでRX状態ならば
RIT_FREQ = RIT_FREQ + 10;
Y = X + RIT_FREQ;
// AD9850.wr_serial(0x00, Y); /// 周波数データを送る アップ
delay(10);
} else { /// RITモードでない場合
//Serial.print("CounterClockWise ");
//Serial.println(ROTARY_SPEED);
X = X + ROTARY_SPEED * 10;
}
OLD_MILLIS = millis();
}
else if (result == DIR_CCW) { // 右回転
ROTARY_SPEED = millis() - OLD_MILLIS;
if (ROTARY_SPEED > ROTARLY_MAX) {
ROTARY_SPEED = ROTARLY_MAX;
}
ROTARY_SPEED = (ROTARY_SPEED - ROTARLY_MAX - 1) * (ROTARY_SPEED - ROTARLY_MAX - 1);
if ((state3 == HIGH) && (val4 == LOW)) { /// RITモードがONでRX状態ならば
RIT_FREQ = RIT_FREQ - 10;
Y = X + RIT_FREQ;
delay(10);
} else { /// RITモードでない場合
//Serial.print("ClockWise ");
//Serial.println(ROTARY_SPEED);
X = X - ROTARY_SPEED * 10;
}
OLD_MILLIS = millis();
}
}
//------------------------------------------
/* 過去割り込みルーチンバックアップ --ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーvoid interrupt() { if (state7 == 1) { /// F_LOCKされている return; } unsigned char result = r.process(); if (result == DIR_NONE) { // do nothing } else if (result == DIR_CW) { // 右回転 if ((state3 == HIGH) && (val4 == LOW)) { /// RITモードがONでRX状態ならば RIT_FREQ = RIT_FREQ + 10; Y = X + RIT_FREQ; // AD9850.wr_serial(0x00, Y); /// 周波数データを送る アップ delay(10); } else { /// RITモードでない場合 X = X + freq_step; // AD9850.wr_serial(0x00, X); //周波数データを送る アップ } } else if (result == DIR_CCW) { // 右回転 if ((state3 == HIGH) && (val4 == LOW)) { /// RITモードがONでRX状態ならば RIT_FREQ = RIT_FREQ - 10; Y = X + RIT_FREQ; // AD9850.wr_serial(0x00, Y); /// 周波数データを送る アップ delay(10); } else { /// RITモードでない場合 X = X - freq_step; // AD9850.wr_serial(0x00, X); //周波数データを送る アップ } }}*/
- 関連記事
-
-
アクリル板 100mmX100mm
-
ランド大量生産
-
ポリウレタン銅線への着色完了
-
大画面SPI液晶モジュール [M432B] ③ 組み立て備忘録
-
オプティカルロータリーエンコーダー④(粘土/パテでバランス)
-
伸縮チューブ
-
オプティカルロータリーエンコーダー③(取り付けました)
-
オプティカルロータリーエンコーダー② (早く回転するとステップが上がる仕組み)
-
オプティカルロータリーエンコーダー①
-
ArudinoMegaをAliexpressから調達
-
RD01MUS1
-
AliExpress 商品届かず
-
サインスマート(SainSmart) 1.8" TFT カラー LCD ②
-
サインスマート(SainSmart) 1.8" TFT カラー LCD
-
AitendoのFSTN液晶モジュール(128×64/SPI)
-