SSブログ
前の10件 | -

pico PIOオシレータ実験 uSDXに使えるか? [pico]

今年初めての投稿です!
おもしろいwebサイトを見つけた。

webサイト.png

picoのPIOで90度の位相差を発信させている。早速私のプログラムに挑戦。サイトでは公式C/C++ SDKとPythonを使っているようですが、私はArduinoIDEで!
私のスケッチでは発信周波数に誤差があります。何度かスケッチを書き換えて誤差が最小になるように変更しましたが、それでも満足な結果にはなりませんでした。
このテストをしてみようとインスピレーションを与えてくれたwebサイトの記事を読んでいると
“To compensate for the coarse frequency resolution in the oscillator, a high-resolution frequency shifter is implemented in the software. (The 32-bit phase accumulator has a theoretical resolution of a little over 0.0001 Hz which should be ample.)”
と説明されていたので、ファームゥエアをダウンロードして周波数の測定をしました。下の表がその結果です。
pico PIC 発信周波数測定.jpg
表の左がそのサイトのファームウエア、右が私のスケッチの結果です。14MHz以下では私のスケッチの精度が良いですが、18MHz以上になるとどちらも同様に精度が悪くなります。分周には限度があって、特に高い周波数では十分な分周ができないようです。
下の写真はwebサイトのファームウェアをダウンロドして使用している写真。画面右のOLEDの表示と周波数カウンターの表示が違う。

FFO00.jpg

VFO01.jpg

下の写真は私のスケッチで発信周波数を表示。
出力波形は90度の位相差を正確に発信できています。

pico_PIO_OSC.jpg

非常に興味のあったテーマでしたが、この結果を見るとAMラジオ放送では問題ないでしょうが、アマチュア無線で使うことは難しいのではないかと思います。
pivcoだけでできると非常にコンパクトにな、SDRの学習用としては面白いですね!

このテストはここまでにして、やはりSi5351などを使用するのが順当だろうという結論に至りました。

本家のサイトへのリンクは“https://github.com/dawsonjon/101Things/tree/master

私のテストプログラムです。

quadrature_wave_pio.h
#ifndef QUADRATURE_WAVE_PIO_H
#define QUADRATURE_WAVE_PIO_H

#include <hardware/pio.h>

// 直交波を生成するPIOプログラムを定義する
#define quadrature_wave_wrap_target 0
#define quadrature_wave_wrap 3

static const uint16_t quadrature_wave_program_instructions[] = {
    0xe001, // 0: set pins, 1 (Set GPIO0 high, GPIO1 low)
    0xe003, // 1: set pins, 3 (Set both GPIO0 and GPIO1 high)
    0xe002, // 2: set pins, 2 (Set GPIO0 low, GPIO1 high)
    0xe000, // 3: set pins, 0 (Set both GPIO0 and GPIO1 low)
};

#if !PICO_NO_HARDWARE
static const struct pio_program quadrature_wave_program = {
    .instructions = quadrature_wave_program_instructions,
    .length = 4,
    .origin = -1,
};

static inline pio_sm_config quadrature_wave_program_get_default_config(uint offset) {
    pio_sm_config c = pio_get_default_sm_config();
    sm_config_set_wrap(&c, offset + quadrature_wave_wrap_target, offset + quadrature_wave_wrap);
    return c;
}
#endif

// void quadrature_wave_program_init(PIO pio, uint sm, uint offset, uint pin);
void quadrature_wave_program_init(PIO pio, uint sm, uint offset, uint pin, float frequency);

#endif // QUADRATURE_WAVE_PIO_H


pico_PIO_VFO_10.ino
/*
pico VFO test JR3XNW
*/
#include 
#include "pico/stdlib.h"
#include "hardware/pio.h"
#include 
#include 

#include "quadrature_wave_pio.h"

#include 
#include 

// U8g2コンストラクタで使用するディスプレイドライバーを指定
// この例ではI2C接続のSSD1306 128x32を使用
U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

// Rotaryエンコーダーのピン
const int PIN_A = 21; // GPIO2
const int PIN_B = 20; // GPIO3

Rotary rotary = Rotary(PIN_A, PIN_B);

// 周波数の最小値と最大値
const double FREQ_MIN = 3500000.0; // 3.5MHz
const double FREQ_MAX = 30000000.0; // 30MHz
const double FREQ_STEP = 1000.0; // 10kHz

uint64_t frequency = FREQ_MIN;

// 周波数設定を含む quadrature_wave_program_init 関数の定義
void quadrature_wave_program_init(PIO pio, uint sm, uint offset, uint pin, double initial_frequency) {
  pio_sm_config c = quadrature_wave_program_get_default_config(offset);

  sm_config_set_set_pins(&c, pin, 2);
  pio_gpio_init(pio, pin);
  pio_gpio_init(pio, pin + 1);
  pio_sm_set_consecutive_pindirs(pio, sm, pin, 2, true);

  const double base_clock = 125000000.0;
  double clkdiv = base_clock / (4 * initial_frequency);  // クロック分周値の計算

  // クロック分周値を設定
  sm_config_set_clkdiv(&c, clkdiv);

  pio_sm_init(pio, sm, offset, &c);
  pio_sm_set_enabled(pio, sm, true);
}

// 関数:所望の周波数に対して分周値を設定
void set_frequency(PIO pio, uint sm, uint64_t frequency) {
  const double base_clock = 125000000.0; // Picoの基準クロック周波数(125MHz)

  double clkdiv = base_clock / (frequency * 4.0); // 4は波形のステップ数
  // 分周値を計算し、PIOのクロック分周器に設定
  pio_sm_set_clkdiv(pio, sm, clkdiv);

  // デバッグのための分周値の表示
  printf("Frequency: %f Hz, Clock divider: %f\n", frequency, clkdiv);
}

// Rotaryエンコーダーからの入力を処理する関数
void checkRotaryEncoder() {
  unsigned char result = rotary.process();
  if (result) {
    if (result == DIR_CW && frequency < FREQ_MAX) {
      frequency += FREQ_STEP;
    } else if (result == DIR_CCW && frequency > FREQ_MIN) {
      frequency -= FREQ_STEP;
    }

    Serial.print("Frequency: ");
    Serial.print(frequency);
    Serial.println(" Hz");

    // ここで周波数を設定する関数を呼び出す
    set_frequency(pio0, 0, frequency);
  }
}

void isr() {
  checkRotaryEncoder();
}

void setup() {
  rotary.begin();
  u8g2.begin();
  // 割り込みの設定
  attachInterrupt(digitalPinToInterrupt(PIN_A), isr, CHANGE);
  attachInterrupt(digitalPinToInterrupt(PIN_B), isr, CHANGE);

  // 初期周波数を3.5MHzに設定
  quadrature_wave_program_init(
    pio0,
    0,
    pio_add_program(pio0, &quadrature_wave_program),
    0,
    3500000.0  // 初期周波数
  );
}

void loop() {
  checkRotaryEncoder();
  u8g2.clearBuffer();         
  u8g2.setFont(u8g2_font_8x13B_tr); // フォントを選択
  u8g2.setCursor(0, 15); // カーソル位置を設定
  u8g2.print("Freq: ");  // テキストを描画
  u8g2.print(frequency); // 変数frequencyの値を描画
  u8g2.print(" Hz");
  u8g2.sendBuffer();      // ディスプレイに内容を送信
}

ヘッダファイルを同じフォルダに入れてコンパイルしてください。テストしているArduino IDEのバージョンは2.21です。 2024/1/25 スケッチを修正しました。

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

pco版TriBand uSDX 受信と送信 [pico uSDX]

pco版TriBand uSDX 受信部分のプログラムは、TriBandの二つのプッシュスイッチにVFOの可変ステップと、音量をセット。画面では小さくて見にくいですが、右上のSメーターの下にボリューム表示。


RX_0.jpg

ひとまず受信部分はここまでとして送信プログラムをまとめていきます。
TinySAで送信時の波形を確認。

TX_1.jpg

波形は意外ときれいですが、音質が非常に悪い!
SSBの生成にあるのか、PWMの問題なのかこれから詰めていきます。なんとか正月休みの間に目星をつけて、年明けにはバンドスコープ・ウォーターフォール表示のuSDXモノバンドトランシーバーとして公開できればいいなと思っていますが、初めてのSDRプログラムなので予測がつきません。
ハードはuSDXのTriBando基板をもとに、若干のCR数値と配線の変更で動作します。


タグ:USDX Pico
nice!(0)  コメント(2) 

Raspberry PiでFT8 [FT8]

Raspberry PiでFT8をセットアップしました。移動用にいいかな?

ラズベリーパイFT8.jpg



タグ:ADX FT8 Raspberry Pi
nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

pico版 uSDX 変換ボード [pico uSDX]

Atmega328をpicoに変換するボードを作りました。といってもユニバーサル基板ですが。いま、KiCadを勉強中なので一番最初のプリント基板に挑戦してみようと思っています。
これは7MHzのテスト中です。OLEDの画面を上下反対にしたので、ロータリーエンコーダが左にきています。変換ボードの背が高すぎるので仕方がないです。基板化すればケース内に収まるようにできるでしょう。

これは14MHz版です。USBを受信できるようにしたのとVFOの変更です。

スケッチなどはGitHubにアップします。
https://github.com/JR3XNW/pico-SDR



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

pico版 uSDX 送信プログラム

送信部のプログラムがなんとか機能するようになりました。ハードウエアはuSDXを使っているので、PE2NNZのブログ記事のアイデアを元にしました。http://pe1nnz.nl.eu.org
受信部も送信部もライブラリーを使ってできるだけ簡単でわかりやすいプログラムにするために、uSDXのファームウェアとは全く違うものです。
TinySAで見た送信時の波形です。

SSB_TX.jpg

uSDXのTriBandの基板を使っているので、Atmega328からpicoに変換するドーターボードを作ってみました。ユニバーサル基盤を使いましたが、KiCadの勉強も兼ねてプリント基板を発注してみようかなと思っています。

変換基板.jpg

並行して始めたのがILI9341を使って、320x240でカラー表示にすることです。表示のためのプログラムが全く違うのと、ピクセル数の違いなどがあるので表示のテストプログラムを始めました。
まずは、ADC入力からのデータをリアルタイムに画面表示するところから!


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

144MHz uSDXの実験 [144MHz uSDX]

144MHzuSDXのテストをしています!
uSDXと書きましたが、コンセプトを引き継いでいるという意味で、CPUはRaspberry pi picoに,
ミキサICはPI5C3253(SFT3253)と同じですがダブルで使用して、Si5351の出力回路も変更しています。回路図は書き直してアップします。
144MHzの無線機を持っていないのでTinySAの信号をアンテナ端子に接続して受信テストです。感度が非常に悪いので、プリアンプが必要になります。7MHzの受信でバンドスコープとウォーターフォールのプログラムをしたので流用しました、表示は7MHzと同じデザインです。

144MHz.jpg

オシロの波形です。私のオシロ測定限界もあると思いますが、波形がなまっているいること、リサージュ波形もこんな感じでいいのか???

波形.jpg

リサージュ.jpg

144MHzを位相制御してなんとか発信はしています。これからテストをしていきます。



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

uSDX 4行表示に変更 [uSDX]

uSDXのOLEDバージョンは2行表示ですが、縦に伸ばしたフォントで気持ち悪いので4行表示にしました。
1行目に表示されていたCWのデコードを4行目に移動させてSメータの表示にかかわらず行いっぱいにデコードされるようにしました。

4_line.jpg

変更するのは3箇所です。

32行のコメントを取ります。
32 #define CONDENSED 1 // Display in 4 line mode (for OLED and LCD2004 modules)

001.jpg

4080行あたりの変更追加
コールサインは変更してください。
4083 lcd.setCursor(10, 2); lcd.print("JR3XNW");

002.jpg

5200行あたりの変更追加です。
5200 uint8_t i = cw_event - 1; if(15 - i + 1){ lcd.setCursor(15 - i, 3); lcd.print(out[15 - i]); cw_event++; } else cw_event = false; // CW-Desoder in line 3

003.jpg

文字は小さくなりますが、かえって見やすくなったように思います。

バージョンuSDC_xを使っているので、他のバージョンではこの通りでないかも、スケッチ内を検索して調べてください。

タグ:OLED USDX
nice!(0)  コメント(0) 

uSDXのSi5351モジュール [uSDX]

uSDX1.02のSi5351をモジュールに変更しようとしたら、モジュールが発信していない!中華製の安いものを買ったので不良品かと思ったが、せっかく買ったので調べてみようと、まずI2Cのアドレスが違うのかと思ったが0x60で問題ない。
そこで思いついたのが端子!SDAとSCLを疑った。二つの接続を入れ替えてテストすると発信した!なんということだ、こんなことがあるのか。
中華製では、前にもBS170を購入して使ってみたが全く動作しないので調べたら、NPNトランジスタだった。
中華製を使うには、冒険心が必要です。

uSDX1.02.jpg

Si5351.jpg



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

pico版uSDXの実験 [pico uSDX]

一ヶ月ぶりの更新です。GitHubを作り替えたり、送信部のプログラムに悩んで時間が経ってしまいました。
uSDX TriBandの基板も少し変更して、pico版uSDXとして受信はできるようになりました。
picoのスケッチや回路図(配線図)などは私のGitHubにアップしているので興味を持たれた方は見てください。
https://github.com/JR3XNW/pico-SDR

uSDX_pico02.jpg

pico2uSDX02.jpg

SDRのプログラムは初めてなので、試行錯誤しながら進めています。整理されていないところもあるかもしれませんので、あくまで参考に見ていただければと思います。

今は送信部のスケッチをテストしています。マイク入力の代わりにpicoの内部で1kHzのサイン波を作って、SSB変調してE級アンプで出力させる予定です。


nice!(0)  コメント(0) 

pico版SDR受信機パートⅡ

昨年作った直行ミキサにつないで受信テスト。いくつかの改良点はあるが一応受信機として機能しています。

そこで、uSDX TriBandoのATmega328を取り外してpicoを接続。もともとuSDXに触発されてプログラムを作り始めたので、基本設計はuSDXを真似ているので取り替えは可能です。受信されていますが感度が悪い。これはATmega328とpicoの動作電圧の違いがあるので、同じようには動作しないことは分かっていました。回路上のCRの数値の変更とプルアップでpicoに対応できるのではないかと思っています。次に送信部分のプログラムを検討していますが、uSDXと同じE級アンプを駆動するようにしたいので、テストベースとしてuSDX TriBandoが使えるようにしたいと思っています。

uSDX_pico01.jpg

uSDX_pico02.jpg



nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー
前の10件 | -

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