50メガAM はあまりに相手局がいないので、確実に相手がいる7メガCWのポケトラを作ってみることで検討してみます。

当然、カセットテープのケースに入れて、電池内蔵、ホイップアンテナです。

まずは、これまで製作したポケトラをベースで実用になるかの実験をしてみました。

DSPはAM用だし、帯域も広いし、そのままでは当然CW受信はできません。

今回は、7メガのアンテナ入力を受信アンプ、ミキサーで10.498MHzに変換して、500Hz幅のクリスタルフィルターを通してDSPラジオに入力して聞いてみます。

BFOの周波数は、10.499MHzで、これはSGからワニ口クリップで空中結合させています。

系統は、

イメージ 1



受信してみると、
https://youtu.be/rRcHrtpZSz0

問題なく聞こえます。しかし、以下のような問題がありますので、他の受信回路も検討する必要がありそうです

1. BFOのレベルが弱いと強い信号は復調できない。また、BFOレベルを上げるとAGCが動作して感度が下がる

2.BFOの信号のため、DSP ICから受信レベルのデータが受信信号強度として使えない。

昔のラジオのICとか探してみようと思います。しかし、スペースに収まるか…??

昨夜は、仕事帰りに少し時間があったので海岸近くの公園でラジオとトランシーバー持って聞いてみました。

少し小高い丘なので、ラジオはよく聞こえました。50メガは平日なので、やはり出てる方はおられないですね。

カセットケースシリーズ、3台並べてみました。次は相手局が多くて微弱電波でも交信が期待できる7メガ電信でも作ってみようかと…


イメージ 1


イメージ 2



現時点のプログラム貼っておきます。


簡単にソフトの制御監視の仕様をまとめると、


1kHzステップのみ


レベルは、dBμV表示。0~70dBくらいまで誤差は1dB以下です。


IF受信周波数は、10.7MHz固定。


周波数は、50メガ直接発振。初期周波数は、50.550MHz



DSPラジオのICを使用していますので、FMラジオ受信機能とか、簡単に追加できるのですが、モチベーションが次の製作に移りつつありますので、いつになるのか…(笑)


//*********************************
//**                             **
//**   50MHz AM transceiver      **
//**   20160827       7L4WVU     **
//*********************************

 

#include <Rotary.h>
#include <si5351.h>
#include <Wire.h>
#include <ST7032.h>
#define M6955_ADDR 0x20//
int dev_addr = M6955_ADDR >> 1; //arduino
 

ST7032 lcd;
float freq;
int channel, listen_freq, initial_num, channel_num;
int channel_upper_bits;
int channel_lower_bits;
int rssi, pga, pgalevel_rf, pgalevel_if, read_byte;
 
void i2c_write(int reg, int value)
{
  Wire.beginTransmission(dev_addr);
  Wire.write(reg);
  Wire.write(value);
  Wire.endTransmission();
  delay(3);
}
 
int i2c_read(int reg)
{
  Wire.beginTransmission(dev_addr);
  Wire.write(reg);
  Wire.endTransmission();
  Wire.requestFrom(dev_addr, 8);
  read_byte = Wire.read();
  return Wire.read();
}
 
#define F_MIN        100000000UL               // Lower frequency limit
#define F_MAX        5000000000UL
 
#define ENCODER_A    2                      // Encoder pin A
#define ENCODER_B    3                      // Encoder pin B
#define ENCODER_BTN  5
 

Si5351 si5351;
Rotary r = Rotary(ENCODER_A, ENCODER_B);
volatile uint32_t bfo = 1070000000ULL; //start in usb
volatile uint32_t vfo = 5055000000ULL / SI5351_FREQ_MULT; //start freq - change to suit
 
boolean changed_f = 0;
 

/**************************************/
/* Interrupt service routine for      */
/* encoder frequency change           */
/**************************************/
ISR(PCINT2_vect) {
  unsigned char result = r.process();
  if (result == DIR_CW)
    set_frequency(1);
  else if (result == DIR_CCW)
    set_frequency(-1);
}
/**************************************/
/* Change the frequency               */
/* dir = 1    Increment               */
/* dir = -1   Decrement               */
/**************************************/
void set_frequency(short dir)
{
  if (dir == 1)
    vfo += 1000;
  if (dir == -1)
    vfo -= 1000;
 
  changed_f = 1;
}
/**************************************/
/* Read the button with debouncing    */
/**************************************/
boolean get_button()
{
  if (!digitalRead(ENCODER_BTN))
  {
    delay(20);
    if (!digitalRead(ENCODER_BTN))
    {
      while (!digitalRead(ENCODER_BTN));
      return 1;
    }
  }
  return 0;
}
 
/**************************************/
/* Displays the frequency             */
/**************************************/
void display_frequency()
{
  uint16_t f, g;
 
  lcd.setCursor(0, 0);
  f = vfo / 1000000;
  if (f < 10)
    lcd.print(' ');
  lcd.print(f);
  f = (vfo % 1000000) / 1000;
  lcd.print(f);
  lcd.print("kHz");
}
 
void setup()
{
  Wire.begin();
  lcd.begin(8, 2);
  lcd.setContrast(25);  //
  i2c_write(0x00, 0b10000000); //on,fm,tune,no-seek,no-seekup,no-mute,rsv,rsv
  i2c_write(0x01, 0b01010001); //AM,FM
  i2c_write(0x06, 0b11111101); //Volume
  i2c_write(0x09, 0b00000111); //Volume with I2C I2C
  i2c_write(0x02, 0b01001000); //10.7 upper
  i2c_write(0x03, 0b01011100); //10.7 lower
  //freq = 10700;//
  
  pinMode(4, INPUT);
 
  si5351.set_correction(11000); //calibration
 
  //initialize the Si5351
  si5351.init(SI5351_CRYSTAL_LOAD_6PF, 0); //default crystal frequency of 25Mhz.
  si5351.set_pll(SI5351_PLL_FIXED, SI5351_PLLA);
  si5351.set_pll(SI5351_PLL_FIXED, SI5351_PLLB);
 

  si5351.drive_strength(SI5351_CLK0, SI5351_DRIVE_8MA); //you can set this to 2MA, 4MA, 6MA or 8MA
  si5351.drive_strength(SI5351_CLK2, SI5351_DRIVE_8MA); //
 
  pinMode(ENCODER_BTN, INPUT_PULLUP);
  PCICR |= (1 << PCIE2);           // Enable pin change interrupt for the encoder
  PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
  sei();
  display_frequency();  // Update the display
}
 

void loop()
{
  si5351.set_freq((vfo * SI5351_FREQ_MULT) - bfo, SI5351_PLL_FIXED, SI5351_CLK0);
  si5351.set_freq((vfo * SI5351_FREQ_MULT) , SI5351_PLL_FIXED, SI5351_CLK2);
 
  if (digitalRead(4) == HIGH) {
    si5351.output_enable(SI5351_CLK0, 0);
    si5351.output_enable(SI5351_CLK2, 1);
    i2c_write(0x00, 0b00000010); //on,fm,tune,no-seek,no-seekup,no-mute,rsv,rs
    delay(10);
  }
 
  else   {
    si5351.output_enable(SI5351_CLK0, 1);
    si5351.output_enable(SI5351_CLK2, 0);
    i2c_write(0x00, 0b10000000); //on,fm,tune,no-seek,no-seekup,no-mute,rsv,rs
    delay(10);
  }
 

  // Update the display if the frequency has been changed
  if (changed_f)
  {
    display_frequency();
    //delay(10);
    changed_f = 0;
  }
  lcd.setCursor(0, 1);
  lcd.print("R: ");
  
  i2c_read(0x18);
  pga = 0;
  pgalevel_rf = 0;
  pgalevel_if = 0;
  delay(10);
  pga = read_byte;
 
  pgalevel_rf = (pga >> 5 & 0b00000111);
  pgalevel_if = (pga >> 2 & 0b00000111);
 
  i2c_read(0x1b);
  delay(10);
  rssi = read_byte;
  rssi = (rssi & 0b01111111);
 
  rssi = 102 - rssi - 6 * pgalevel_rf - 6 * pgalevel_if;

  if (rssi < 10 && rssi > -1)
  {
    lcd.setCursor(3, 1);
    lcd.print(" ");
    lcd.print(rssi);
  }
 
  else if (rssi < -9) {
    lcd.setCursor(2, 1);
    lcd.print(" --");
  }
  else
  {
    lcd.setCursor(3, 1);
  }
 
  lcd.print(rssi);

  lcd.setCursor(5, 1);
  lcd.print("dBu");
 
}
 
 
 
 
 

 

↑このページのトップヘ