Raspberry Pi Pico で Si4735 DSP ラジオ製作

最近は ATMEGA328P 終了の兆しが見えてきて、もうちょっとフラッシュやメモリの大きいマイコンに移行したいと思っていました。5V ならまだ Arduino MEGA2560 とかあって GPIO もたくさんあるので使っていく予定ですが、それ以外は Raspberry Pi Pico 中心でいいかなと思い始めるようになりお試しで使ってみました。前から ESP32 とかも持っているのですが ESP-IDF に慣れないのと、ESP-IDF は x.x のリリースされたバージョンに対しても更新をかけてきます。commit 番号によっては動かなくなったりもします。 Raspberry Pi Pico は現在 RP2040 チップだけなので SDK のリリースもシンプルです。ビルドも cmake のインタフェースなので理解できました。また Raspberry Pi Pico は MicroPython も動作するので、C/C++ で書くほどの物でない場合は MicroPython を使用する手も有りで、SDK の持つ基本的なGPIO操作やハイレベルAPIもポーティングされているので、とっかかりは MicroPython から始めるのいいと思いました。

Raspberry Pi Pico の基本をやるとき思いついたのが Si4735 DSP ラジオです。過去 ATMEGA328P にキャラクタ液晶つけて動かしたことがあったのですが、これなら i2c が動けばラジオチップは動くので、ラジオチップを動かすところから始めました。

試作用基板作成

ブレッドボードでやり始めたのですが LEDチカチカ程度とは違い配線が面倒。ということで Raspberry Pi Pico 用に GPIO ピンをピンヘッダに出す基板を作成。Raspberry Pi Pico が2個乗っかているのは一個は動作用でもう一つは PicoProbe という C/C++ で使うデバッガです。MicroPython では使用しません。ピンヘッダを3列出しているので、本来の信号線を配線するのに加えて Analog Discovery のロジックスコープもつけられます。これをMDF板に貼り付けて液晶とTTGOラジオといわれる基板も付けました。

開発環境選定

開発環境は最初から MicroPython に決めていました。初めてなので C/C++ SDK に慣れていなかったためです。また、ラジオの周波数表示などを液晶に出すため、グラフィック環境も欲しいということでググっていたら LVGL というグラフィックライブラリをみつけました。これも本家は C で書かれていますが、lv_micropython という MicroPython に LVGL がバインドされたものがあったので、これなら使えそうと思いました。gitgub の https://github.com/lvgl/lv_micropython にリポジトリがあります。

ファームウエアは ubuntu / Raspberry Pi OSなど Linux の環境であればリポジトリに書いてある手順通りにやれば作成できます。MSYS2 MinGW64 では MicroPython のクロス環境ビルド途中で、Windows のコマンドライン長限界を超えるものがあってエラーになります。make の変数を与えれば分割ビルドできそうなのですが、面倒なので やっていません。

プロトタイプ開発

python IDE の thonny を使って MicroPython のコードを書いていきます。GPIO/SPI/i2c などの使い方は MicroPython のドキュメント https://micropython-docs-ja.readthedocs.io/ja/latest/ に、LVGL グラフィックスライブラリは https://docs.lvgl.io/master/index.html にあります。

少しコーディングしては RUN させるというトライ&トライです。その結果フォントの組み込みなどの方法も理解出来て写真のようにいろいろなウイジェットが使えるようになりました。

  • 周波数をテンキーから入力して選局
  • 表示されいる周波数からステップチューニング
  • AM・FMなどバンドスキャン
  • 選局リストから放送局をタップすると選局

が主な機能です。

本番用基板作成

ここまで出来たら残るは本番用基板です。今回は ILI9341 の液晶に大きさを合わせました。上から液晶・ラジオ基板・マイクロスピーカーを貼り付ける基板の3枚です。

基板は何回か作り直ししましたが、それっぽい感じに仕上がりました。

回路図やアプリケーション本体などは、https://github.com/ngc6589/Si4735_Radio_RaspberryPiPico にて公開しています。

関西ハムフェスティバル 2016 行ってきました

2016-07-17 09.23.11

関ハム 2016 に行ってきました。場所は池田市の市民会館です。廃局してコールサイン無しなのですが、この手のイベントは結構ひさしぶりな気がします。今日は、PUP さんと会えるかな?ということでお出かけです。

2016-07-17 10.01.54

会場をひとまわりして Si4735 ラジオ発見。関ハムでこんなん展示してるの1箇所しか無いですから間違いありません。隣の抵抗類は、北神電子サービスさん のスペースの売り物です。
簡単にご挨拶だけしてあとは世間話をしつつ時間が流れます。プログラムの修正などはわかる範囲でのポイントなどをお話したりしてました。また時を同じくしてこちらのブースに来られたレーザーカットをはじめに、プリントサービスなどをやっておられる、「利助屋」 さんとも少しお話させていただきました。

Si4735 ラジオの原型は私のところで作成して公開しましたが、JG3PUP さんは基板作成+短波受信改造されて公開。いくつかの派生バージョンの基板をもとに現在は DIP 版ラジオを設計されていま
す。

2016-07-17 10.00.08

テスト版入手された 旅の途中 さんが中波のイメージ対策でアンテナまわりの回路改良などを web ページ内の pupさんのFRISK_Si4735Radio_Full_DIP Ver にて改良点などを公開されたりしています。

Si4735 ラジオモジュールを使った記事は 2013 年のものですが、今もネタとして生きているのをこの目で見ることが出来て嬉しかったです。

Si4735 Frisk ラジオの製作 Take2 その2

先週は、AF部が動くことを確認したところで時間切れとなりました。今週も製作の続きを行います。前週ではイヤホンアンプの動作確認が OK なところを確認して終ったので、引き続きアンプ回りの部品を取り付けていきました。最初は、音量調整用のボリュームからです。

2015-11-28 12.45.07

このボリュームは外れが多いとのことなので、余分に購入してテスターで確認。ダイヤルを回してテスターの針もスムーズに動けば大丈夫でしょうという感じで良品をピックアアップして基板にはんだ付けしました。

これ以降は組み立て順を箇条書きにして省略…

  • リチウムポリマー電池の充電回路と動作確認
  • LM4881 アンプ回路とイヤホン端子の配線と動作確認
  • レバースイッチは後から付けるのは困難を極めるので早めに基板に付けてしまう
  • 3.3V レギュレーター、VDD 出力用トランジスタスイッチ回路。これも単体テスト
  • Si4735 の音声出力からイヤホンアンプ経路上の部品を配線
  • Si4735 周辺パーツを配線
  • ATMega328p 周辺パーツを取り付け
  • Si4735 はんだ付け
  • ATMega328P はんだ付け
  • ATMega328p プログラミング用 ISP ケーブルを配線 & HEX 書き込み
  • 液晶取り付け

2015-11-28 17.35.56
この時点で、液晶に表示はされます。

  • アンテナ入力から、高周波アンプ、Si4735入力までの経路を配線
  • タクトスイッチ、ロータリーエンコーダーなど取り付ける

という手順で、動くところまで来ました。

2015-11-29 10.11.512015-11-29 10.12.02

動作確認 OK。FM は短いロッドアンテナでも十分感度良い、AM はこんなもんでしょう的な感度。15cm 程度のロッドアンテナでまともに聞こえるわけがありません。SW はラジオNIKKEIの競馬中継が十分聞こえたのでよしよし。というところです。
一回目の製作で失敗して、2回目の製作でしたがうまく動いてホッとしています。

FRISK は普段口にしないため、ケースはありません。一旦ここまでの状態で完成とします。

Si4735 Frisk ラジオの製作 Take2

2015/10/25 製作を始めたのはいいのですが、前回はミッションアボートしてしまいました。pupのブログ で開発されている FRISK ラジオ基板の「ぼっちワークショップ」の続きです。

2015-11-21 12.02.27
2015-11-21 12.03.19

もう一度基板と回路図とにらめっこ。とにかく、リポ電池の充電回路は必要なので一番最初に作ります。

2015-11-22 11.51.08
2015-11-22 11.51.15

充電中の LED、スタンバイの LED の点灯を確認。電源回路は OK です。前回は、このあとマイコンのはんだ付けして、確認したら駄目という状況だったので、回路図的に単体で動作確認可能なアンプ部分から作ることにしました。

2015-11-22 15.20.59
2015-11-22 15.21.10

ほどなくして、アンプ部品もはんだ付け完了しました。電源、シャットダウン回路などをワイヤで飛ばして単体で動くように設定。
ケータイとこの基板を接続して音が出るか確認。結果 OK でした。

http://pup.doorblog.jp/archives/45753031.html

Frisk ラジオの製作1(Mission failed)

2015-10-23 22.10.15

何日か前に、pupのブログ のサイトを運営されている方から、Si4735 チップのラジオ基板あります。要ります?とのお知らせに、欲しいですと連絡し基板を送っていただくことに。部品も揃えて作りはじめたところです。頒布されるかわかりませんが、pupさんが現在基板化しているラジオの原型が私の記事のものなので、ご厚意で譲っていただいた次第なのです。

基本的に 新しいFRISKラジオの設計No.番外(備忘録の編集中) のページにて回路図や HEX ファイルなどが置いてありますので、この資料をもとに製作を始めます。

2015-10-24 17.09.51

充電池の充電回路を組みたてたところで一度チェック。問題なさそう

2015-10-25 09.42.25

次は AVR マイコンを貼り付けて HEX ファイルの書き込み。

スクリーンショット 2015-10-25 09.41.36

無事、書き込みが出来ました。

2015-10-25 13.54.32

このあとも引き続き組み立てを行なっていたのですが、0603 サイズの抵抗などが標準の大きさなので面実装に慣れていないと苦労します。動作確認出来そうなところで組んで通電しますも動作しませんでした。今週は時間切れなので、時間あるときの作業になりますが、抵抗・コンデンサを剥していってまともになるところからですかね。ぼちぼちやっていきましょう。

Si4735 ラジオモジュールの音声出力UPをねらってオペアンプ付けたけど失敗

2015-09-06 13.25.03

Si4735 ラジオモジュールの音声出力は弱いのでオペアンプ付けてみようと、ブレッドボードでテスト開始。LT1054 の電圧コンバーターで負電源作って±4.5Vくらい出せる電源を準備。これを 4558 オペアンプの電源にして増幅させてみました。結果からいくとマイコンボードのノイズ、USB HUB の電源ノイズなどもハッキリ聞こえるようになってしまいました。

ということで、この方法はいまいちだったのでフィルタ付けてみるとか考えたほうがいいかも知れません。I2S のデジタル出力もクロックさえ用意すれば出せそうなのですが、今のところ簡単に実験出来ないので今後の出来るときにやってみたいと思います。

PSoC4M Pioneer Kit で Si4735 ラジオモジュールコントロール その2

2015-08-30 09.09.19

ブレッドボードで組んでいる Si4735 ラジオモジュールのプログラムを少しづつ作っています。今日は、 CY8CKIT-044 の CapSense のスライド操作で音量を調節出来るようにプログラムを少し手直し。音量調整の基本部分が出来ました。

PSoC4M Pioneer Kit で Si4735 ラジオモジュールコントロール

2015-08-16 12.23.05

PSoC4M Pioneer Kit から Si4735 ラジオモジュールを動かすプロジェクトですが、周波数の表示装置を I2C 液晶から 7セグLEDに変更してみることにしました。というのは I2C 液晶が地味に大きいので配置に困ったことと、周波数わかればいいかということで、7セグ LED でもいいかということに。配置に困る理由は、上の写真手前にある緑色の基板が Arduino 用のシールド基板ですが、それと I2C 液晶と比較していただければ液晶のほうが幅大きくてはみだすからです。

2015-08-16 12.26.31

その結果、QDSP-6064 Bubble Display で周波数表示させてみようかということに。この LED は Sparkfun の Bubble Display – 7-Segment (4-digit) というやつです。国内のパーツショップでも取り扱われているので入手は簡単です。これを2つ使用して 8桁表示で使用することにしました。

早速 PSoC4M Pioneer Kit で 7セグドライブしようとコンポーネントを探してみましたが PSoC4 では 7セグ用コンポーネントが消えたみたいです。仕方ないので諦めてコーディングすることにしました。タイマー割り込みを発生させて一定期間で桁のドライブする仕様にして、周波数を表示させてみました。なんとか動いたのでOKかなというところです。音量調節は左右スワイプ、バンド切り替えは上下スワイプでプログラムしたら基本機能のインプリは終ります。

Cypress Bridge Control Panel から Si4735 ラジオモジュールの動作確認

2015-08-12 20.01.58

PSoC4M Pioneer Kit と Si4735 ラジオモジュールを接続した動作確認をやりはじましたが、いまいち動作が安定しませんでした。こういうときは、Bridge Control Panel というのを使用して i2c でエラー(NACK) が発生しているか確認するのが早いです。

PSoC4M のボードには KitProg というのが付いていて普段はマイコンのプログラミングに使用しますが、それ以外にもデバッガ、USB-UART Bridge, USB-I2C Bridge という機能も提供しています。今回は USB-I2C Bridge を使用します。

USB-I2C Bridge は Bridge Control Panel という Windows アプリから I2C のデバイスにデータの write/read をするものです。マイコンで試行錯誤する手間が省けるので大変便利です。

スクリーンショット 2015-08-12 20.01.15

上の写真のようにブレッドボードに Si4735 ラジオモジュールを差して、PSoC4M ボードの SDA/SCL 端子、電源を接続します。マイコン側は何もしなくて良いので、Lチカでもなんでもいいです。

Bridge Control Panel の上側のテキストボックスに送信する予定のコマンドを入れます。カーソルを送信したいデータの行に移動してリターンキーを叩けば i2c に送信されます。そして、送信結果は下側のテキストボックスに表示されます。

w 11+ 20+ 00+ 22+ 6A+ p r 11+ 80+ p 

結果の最終行を例にしますと
W : データ送信開始(Start コンディション)
11: デバイスのアドレス
+ : ACK が返ってきた
20: データ送信
+ : ACK が返ってきた
00: データ送信
+ : ACK が返ってきた
22: データ送信
+ : ACK が返ってきた
6A: データ送信
+ : ACK が返ってきた
p : 送信終了(stop コンディション)
r : 受信開始(start コンディション)
11: デバイスのアドレス
+ : ACK が返ってきた
80: データ受信
+ : ACK 送信
p : 受信終了(stop コンディション)
という内容です。

+ のかわりに – が表示されたら NACK が返ってきたことが一発でわかります。今回はプルアップ抵抗間違えて Si4735 ラジオモジュールが上手くうごきませんでしたが、これで動作確認してみたら NAK が返ってきたりしてるのがわかったので原因を調べるのに役立ちました。

Si4735 ラジオモジュールのサンプルコード更新です

Blog のアクセスログ見てますと以外に Si4735 のキーワードで見に来ていただいているようで、感謝でございます。去年サンプルのソース公開してから置いたままになっていましたが、そろそろ突っ込まれそうなので、先に修正しとこうと。

修正点は FM モードの初期化で、ディエンファシス(de-emphasis) 設定が USA(75μs) になったままなのを、Europe, Australia, Japan(50μs) にするものです。修正点は下記1行足すだけです。

ソースの zip ファイルは Si4735 ラジオモジュールの Blog 記事一覧 のダウンロードリンクに入れておきます。

$ diff -p Si4735_old.cpp Si4735.cpp
*** Si4735_old.cpp      2013-03-30 07:55:13.405302200 +0900
--- Si4735.cpp  2013-03-30 07:36:54.382828800 +0900
*************** void Radio::begin(char mode) {
*** 24,29 ****
--- 24,30 ----
                FMPowerOn();
                setProperty(0x1400, 0x1DB0);    // FM_SEEK_BAND_BOTTOM 76.0MHz
                setProperty(0x1401, 0x2328);    // FM_SEEK_BAND_TOP 90.0MHz
+               setProperty(0x1100, 0x0001);    // FM_DEEMPHASIS
                break;

                case AM: