RP2040-ZEROでDSPラジオ(3) | お父にゃんの電子工作

お父にゃんの電子工作

暇なおじさんが、電子工作(主にラジオ製作)をして勝手な感想を書く

以前にRP2040-ZEROを使ってMicroPythonでコードを書いてDSPラジオを作ってみた。

(DSPラジオICはAKC6955)

 

で、今回は同じくRP2040-ZEROを使ってArduino IDEを使ってコードを書いてみようと思う。

AKC6955を使ったラジオは以前にも作ってあるので、コードのかなりの部分は流用できるはずである。ただし、今回はMicroPythonで書いた場合との比較もしてみたいので、プログラム構造はMicroPythonで書いたのに合わせる。

 

1点、Arduino環境でラジオの設定(変数)をフラッシュROMに読み書きするにはどうすれば良いか、やり方が分からないので、ChatGPTに聞いてみた。

 
ここで、ハマりにハマった。
ファイルにして読み書きする方法や、フラッシュに直接書き込み読み込みする方法などを試したが、どれも上手くいかない。というか場合よってはポートが繋がらなくなり、BOOT SWを押しながら再起動してプログラムを書き込まなければならない。かなりうんざりしたが、しつこくChatGPTで質問し直すと、ファイルを扱うには、Arduino IDEの設定でファイルシステムに領域を割り当てておく必要が有ることが分かった。(知らなかった・・・)
ツールからFlash Sizeで、FSに領域を割り当てておく。
 
で、最終的に落ち着いたのは LittleFS.h を使う方法。追加でライブラリをインストールする必要が無く、ちょっと読み書きするだけの用途で使える。
ChatGPTがサンプルコードを書いてくれたので、ほぼそのまま使う。
 
LittleFS.h をインクルード
#include <LittleFS.h>
 
読み書きするファイルを指定
const char *filename = "/Radio_data.txt";
変数の読み書き部分のコード
//============================
//変数をフラッシュに書き込み
//============================
void writeVariablesToFile() {
   // データをファイルに書き込む
  File file = LittleFS.open(filename, "w");
  if (!file) {
    Serial.println("ファイルのオープンに失敗しました");
    return;
  }
  // 5つの変数を書き込み
  file.println(band_set);
  file.println(freq_set);
  file.println(mode_set);
  file.println(preset_no);
  file.println(volume_level);
 
  file.close();
  Serial.println("データを保存しました");
}
//============================
//変数をファイルから読み込み
//============================
void readVariablesFromFile() {
   // データをファイルから読み込む
  if (LittleFS.exists(filename)) {
    File file = LittleFS.open(filename, "r");
    if (file) {
      band_set = file.parseInt();
      freq_set = file.parseInt();
      mode_set = file.parseInt();
      preset_no = file.parseInt();
      volume_level = file.parseInt();
      file.close();
      Serial.println("データを読み込みました");
      Serial.print("読み込んだデータ: ");
      Serial.print("band_set:");
      Serial.println(band_set);
      Serial.print("freq_set:");
      Serial.println(freq_set);
      Serial.print("mode_set:");
      Serial.println(mode_set);
      Serial.print("preset_no:");
      Serial.println(preset_no);
      Serial.print("volume_level:");
      Serial.println(volume_level);
    }
    else {
      Serial.println("ファイルのオープンに失敗しました");
    }
  }
  else {
    Serial.println("ファイルが存在しません");
  }
}

 

ようやく、うまく動いた
 
ああ、ここまで来るのに、ずいぶんと時間がかかってしまった。
 
後は、前にMicroPythonで書いたラジオのコードを、Arduino用に書き換えていく。
出来たところで、コンパイルすると、何故か大量のエラーが発生。
{}の数が合ってないないとか";"が無いとかの初歩的なミスが多い。
まぁ、不注意なおじさんが書いたので・・・。
その他諸々、見直して修正する。
 
で、ようやくできた。
MicroPython版と見た目は同じだが、中身はArduinoのコードで動いている。
 
今回のコードは以下に置いておきます。
 
<回路図>
 
ちなみに、MicroPythonで書いた場合と、Arduinoで書いた場合のコード量(行数)を比較すると、以下になる。(LCDライブラリのコードはカウントしていない)
 
MicroPythonの場合:519行
Arduino IDEの場合:587行
 
コメントの行数が、Arduino版の方が多いことを差し引いてもMicroPythonの方が行数が少なく効率は良い。
実際にコードを書いたりデバッグする時間はMicroPythonの方が少ない気がする。
 
 
RP2040-ZERO(もどき)はとってもお安いうえに、いろいろ遊べてお勧め。
次に何か作るときは、MicroPythonで使ってみても良いかな・・・

 

 

 

「少しは学んだみたいだニャ」