Arduinoで何か作ってみる! 【2020.2.11】




 今更の感があるのですが、はやりのArduinoに関して少しいじってみようと思います。そういえば、これを最後に、AVRとかでプログラムすることが絶えて久しい状況です。もっとも、なにか「制御」をする要求が、「最近の」無線機自作活動に無かったことは事実です。しかし、流石にそうも言っていられなくなっているようです。BASCOMもいつまで使えるかわかりませんし・・・・

 2〜3年くらい前になりましょうか? Si5351の使われ始めとともに、これをArduinoでコントロールすることが流行りはじめ、カラー液晶が安く出回り始めたのと軌を一にして、これを搭載したSi5351VFOが大いにもてはやされました。当時、私はSi5351の特性をいろいろ調べたうえで「固定用SSB無線機には使わ(え)ない」という判断をしていました。理由はいろいろありますが、ま、一言でいうと、偏屈者もののPWZのお気に召さない・・・理由にはなっていないかもしれませんが、これが理由です(笑)。もし、「これだけSi5351がポピュラーになってるのに何言ってんだよ!」と凄む方が居たら、当時の私の記事を読んで理由を探ってください(笑)。

 さて、それはともかく、ほっておくと時代遅れになりそうなので、周回遅れも甚だしいのですが、その「昔の流行り」に私も手を染めておくことにしました。ただし、今回のSi5351の用途は、無線機用ではありません。この記事が最後まで続くとすれば、それがわかることになりますが、色々な理由で途中ギブアップも大いにあるので、ここでは伏せておくことにします(大笑)。

 いつものごとく前置きが長いのですが、何度も書くように、このHPはPWZの日記に近いものです。すなわち、その時々の心情の推移も記録しておいて、後になって、懐かしく眺めたいという「PWZの」要望を満たすように書いています。ですから、PWZ以外には全く興味のない事柄もウダウダ書いてしまう羽目にもなります。ま、そんな駄文を読むのが面倒な人は、遠慮なく読みとばして、図と写真だけを見るだけで十分でしょう。

 巷には、簡単なSSBエキサイターの記事で、蘊蓄を数か月にわたって書き続けている例(笑)もありました。CQ2019年12月号が当該記事の最終号だったと思いますが、なんと、回路図も、特性も出さずに、原稿が終わりというのを立ち読みした覚えがあります。これって、ジジイのグダグダ話を3か月にわたって掲載していたというわけ?と、まったくびっくりしすぎて二の句が継げませんでした。CQ誌もここまで来てしまったかぁ。。。。。。ですね。要は、年を食うと、何かヒトクサレ言わないと実行動に移れないという、悲しい性(サガ)は誰でも持っているということ言いたかったのですが、流石に大脱線しました(大笑)。

 おっと、本題です。Arduinoをいじり始めるには、どうしようか思ったのですが、書店で、入門書を見てみると、「おいおい、この内容で2500円とか3000円とかかかるなんて、ほとんどぼったくりの世界だな!」というのが、最初の感想でした。たかだかAVRでCライクな開発環境を用意するには、ネットで十分すぎるほど事例があるし、IDEの解説ももちろんネットにあります。この状況で、「紙の本を買う」動機はどこから来るのだろうと思ったのが、最初の感想です。とか言ってるうちに、開発環境は稼働し始めました。

 肝心のArduinoですが、けっこう種類も多いようで、小型のNanoからI/Oが50本以上にも及ぶものまで、結構そろっているようですね。一番基本の本家のUnoは、だいぶ前の製品なので、ちょっと新しめのこれにしてみました。





Uno互換機で名前が「びんぼーでいーの」とは!



 なんと、名前が「びんぼーでいいの」というらしく、値段は、付属品コミコミで本家マイナス1000円くらいですね。名前の通りなら、本家の半値以下でないと「名が体を現す」ことにならないと思わないではないですが(一体どっち?)、実装をみると、けっこうしっかりできているので、こちらの方が本家よりいいかも・・・と思い始めています。最初のとっかかりはこれで行きます。。





こんな感じで「動作評価用に」実装していくつもり

安く仕入れたガラエポ端材を継はぐ


 上図に簡単に固定した様子を示しておきます。最初は、これも流行りの「接続穴あきブレッドボード」でお茶を濁そうかと思ったのですが、私にはどうしてもこのブレッドボード利用の踏ん切りがつきません。リード線や部品とブレッドボードの接触特性(こんなものがRFに使えるのか?)は、問題ないとは聞いていますが、PWZ的には「生理的にイヤ」です。ブレッドボードで実験してOKならば本チャンのしっかり配置&実装ということなのでしょうが、私としては、できる限り、「本チャンにそのまま移行できる実装状態で実験したい」という気持ちが強く、「実験でもはんだごてで配線する」スタイルを変えません。

 なので、実験だけで終わってしまうと、ブレッドボード方式だとブレッドボードは再利用可能なので無駄にはなりませんが、PWZ法だと、無駄になることおびただしいです(苦笑)。なので、なるべく、実験だけで終わりにせず、最後(ケースイン)まで続けられるように努力をしています。結果として、実験から完成までどえらく時間のかかった例もありますが、これは仕方のないことですかね。ブレッドボードは、比較的小規模回路を作ってみて、動作が確認できたら、以上終了!という用途には極めて便利だと思いますが。

 一応、Arduino I2Cレベル変換&試用Si5351回路、2.8インチSPI液晶表示機、10キーボードがありますが、ロータリーエンコーダやら、AD9952DDSやらも搭載していくつもりです。

 このI2Cレベル変換は、3.3Vの Nanoを使えばSi5351をダイレクト接続できるのですが、実は、Si5351だけでなくAD9952DDSもいじっているので、5VのArduinoを選択した結果です(もっとも3.3VのNanoで5V系のDDSもたぶんドライブできるとは思いますが、ま、キワモノは狙いません:笑)。同じ基板にピンソケットを実装したSi5351基板(10ピンSSOPからDIP10ピンへの変更基板)を挿抜できるようにしてありますが、これはあくまで、Si5351の「動作確認用」であって、実際のSi5351は離れた場所で、「超厳重にシールドしたうえで」動作させたいと思っています。

 まずは、このI2Cレベル変換基板に挿入したSi5351で、動作確認を行いました。実は、Si5351は4個も変換基板に搭載したのですが、何たることか、このうち2個までは不動でした。これは、0.5mmピッチSSOPのはんだ不良のような気がしたので、再度、ピンにはんだをてんこ盛り(当然ピン間はブリッジ)して、そのあとはんだ吸い取り線で、しつこくはんだを取り除くと、しっかり全数(といっても4個ですが)が動作し始めました。めでたしめでたしです。





はんだブリッジを改修して復活したSi5351



 こんな不具合を経験したくないなら秋月のSi5351搭載基板を使うのがいいかもしれません。ただし、私の場合、25MHzのXtalを使うのは実験の途中までとし、ある時点からは、外部信号でSi5351をドライブしようと思っているので、Xtalが搭載されてないSi5351モジュールという形を選びました。

 まずは、Si5351をArduinoで動かすところから始めてみます。まぁ、この話題は、ネット上にくさるほど転がってるので、そのどれかに倣えばいいのですが、ほとんどが、「こんなことできました」みたいなブログ記事なので、あまり参考になりません。その中で、何度かコメントのやり取りをさせていただいた、JA2NKDさんのブログは、ダウンロードサイトもあったりして、「ものを作る」情報が満載です。PWZのサイトみたいに、中途半端な日記風記述ではなく、NKDさんのサイトは、「資料通りに作れば、ちゃんと動く」という貴重な情報が満載です。なので大いに参考にさせていただきました。この場を借りてお礼申し上げます。

 ということで、基本的なSI5351動作がわかる、RFツートーンジェネレータスケッチとライブラリをベースに開始しました。Si5351に、周波数情報を含むコマンドを与えて、まずは基本動作を探っていきます。

 Si5351を動かすには、Si5351a0.hなるヘッダーファイルを用意して、あとはコマンド

    si5351a_freq(0,vfo_out,_8mA,XTAL_FREQ);

 を唱えればいいということがわかりました。DDSの時も、ビット長を決めたシリアル信号送出コマンドがわかれば、あとは一気呵成でしたから、Si5351も同じアプローチをすることになります。昔は、このヘッダーファイルの動作に相当する部分を、しこしこBASCOMで作っていて、七転八倒していたのですが、Arduinoはライブラリがそろっているので、同じことをやるにしても、ずいぶんと楽な感じがします。

 実際の動作もあっけなく確認できました。さすが、初心者の味方のArduinoです。

 さて、次はカラーLCDに行こうかと思っていたら、ひょんなところで、互換Aruduinoの超安物があることを知りました。アマゾンをぶらぶらしていたら、なんとArduino Nano(パチモノ)が3個1300円とかで売ってることを見つけてしまいました(Ali Expressだともっと安いようですね、でも今は注文しても物流が止まっているから来ないでしょうが)。評判を見ると、そこそこ使えるような雰囲気じゃないですか。Nanoはたしか3.3V動作なので、Si5351、カラーLCDともに、レベルコンバータ(5V−3.3V)なしにダイレクト接続できますから、これは、超便利です。





パチモンNanoは3個で1300円くらい
Ali Expressならもっと安い!


 ということで、さっそくポチって見ました。で、接続しようかと、USB−マイクロUSBコネクタを刺そうとしたら、「あれ、形状が違う!」ということで、今やどこで使われているのか知らない、USB-ミニUSBコネクタが要るじゃないですか。これも、1本300円くらいで買えるので、3本まとめて買ってつなぎ込みます。あとはラクショーだろうと思ったのですが、ここで、つまずきます。というのも、ドライバのインストールが必要なのですが、CH340/341という「支那製」ドライバなので、最初はサイトにアクセスするのさえもはばかられて、どこかの「自由主義圏」に該当ドライバが転がってないか探しました。しかし、支那製ボードに搭載するUSBドライバは、これが多いのはわかりましたが、支那以外では、DLできるところが見当たりません。

 下手に支那製ドライバなんざインストールした日には、PC内情報が駄々洩れにならないか危惧していたのです。しかし、今の私のPCには、個人情報に関わるものは極力というか、考えられる限り全てにおいて、除去してありますので、最悪、PC内情報が洩れても、ま、被害はそうおおきいものではないと思い直して、「えいや」とインストールしてしまいました。これって、けっこう心臓に悪いですね(ここまで用心する人間は稀かも:笑)。で、繋ぎこんで、ボードはNanoを指定し、チップは328pで、動作確認のためにLチカプログラムを書き込んでみたのですが、書き込みで失敗してしまいます。


スケッチの書き込み中にエラーが発生しました
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x4a

    (このあと10回繰り返したログが残る)


 あちゃーですが、ネットを見ても、CH340さえインストールすれば、動作OKとしか書いてなくて、一瞬、「屑をつかんだか?」と思いました。支那モノをいじるときは、動作しないと、常にこういう感情に陥りますね。ただ、なんとなくネットをぶらぶらすると、IDEでプロセッサチップの選択を328p(Old Bootloader)とする必要があるという記述を見つけたので、このパチモンNanoもコネクタがUSB-ミニなんて古いコネクタを使ってるんだから、Loaderも古いのだろうと、328p(Old Bootloader)を選択したら、あっさり書き込みが終了しました。なんともまぁ、ハードの値段は安くても、こういった面倒なことがあるので、支那モノを使う時には、それなりの余計な稼働が生じてしまうのですね。

 ということで、なんだか動きそうなので、この小型の基板を流用して、「びんぼー」よりさらに「ど」安価なパチモンNanoをコントローラに使ってみることにします。





パチモンNanoをびんぼーの代わりにしてみる?

下の各種配線は2.8インチLCDへのSPI接続ぼための制御線




 まず、上記にあるように、Si5351の試験基板といういで立ちで作ってみました。一応、マイコン電源(USB由来)とSi5351の供給電源を共有するのは、いかにもRF工作的には恥ずかしいので、外部から3.3Vを供給しています。ペリフェラル(周辺回路)の3.3V系の電流が増えてきたら、このレギュレータにも簡易な放熱器でもつけるつもりでいます。もっとも、このSi5351の実装は引き回しも長く、アースもしっかりしていないので、RF基板としては最悪の状況に近いです。本チャンでは、Si5351をソケットから外して、I2Cラインだけ延長して、最終実装基板に信号を導くつもりです。

 動作は・・・というと、びんぼーの時のスケッチで動作を確認しています。なので、ふつーに動いていました。実はここにはまたまた大きな罠が潜んでいたのですが、この時点で気づくことはできませんでした。

 ということで、次はほいほいとTFTのLCDの接続です。これも、ネットにはいたるところに情報が転がっているので、スケッチとヘッダーファイルと関連した.cppファイルをもってきて、ささっと表示ができるようになりました。ここまでは極めて順調です。ところがです!LCDを初期表示させたあと、Si5351に周波数データを書き込むと、

そこでLCD表示がリセットされちまいます。

 これには参りました。DDSのAD9850も持ってきて、繋ぎこんでみても、やっぱりDDSに周波数設定した瞬間にLCDがリセットされるという、なんだかワケワカメな動作になっちまいました。いろいろネット情報を見ていたのですが、チェックをしている過程で、どうも、NANOのVDDは3Vで供給していたのですが、これが間違いだったようなのです。

 Vinに3Vを供給しても、USB給電で、実際は3.3Vより高い4.5Vくらいが供給されています。そうです、このNanoは5V物だったのですよ。これから考えると、LCDのコントロールピンは同電圧がダイレクトに印加されていることになり、よくも壊れずに動いていたなぁ、とびっくりしました。規格外電圧の制御信号がLCDに加わっていたので、どうも、Si5351やAD9850を制御すると、なにか変な動作でLCD表示がリセットされてしまっていたのでしょう。これに気が付くまでに3日も費やしてしまいました。なお、このNanoはUSB給電時は基板上のリセットボタンが有効でしたが、USBケーブルを外す(Vinに3.3V給電)とリセットが効かなくて、これも、変だなぁと思っていました。Nano=3.3V動作という固定観念があったためです。

 まずは、いったん5V動作の「びんぼーでいいの」に戻して、各インターフェースはそれ用の変換ICあるいは変換回路をかまして、正規の電圧で動作をさせることにしました。LCDは3.3V動作ですから、SPIの異電圧変換基板(秋月で売ってる)を、また、Si5351へは2N7000のレベル変換回路を介して動作させたところ、表示が飛ばずに、Si5351とAD9850に周波数設定ができるところまで持ってきました。やれやれです(ふぅ)。


<続きです> 【2020.2.22】

 さーて、ここまできたら、次はロータリーエンコーダ(以下RE)で「周波数可変動作」に移ります。これも、まずはネット検索ですが、Rotary.hとRotary.cppを用いるのがデファクトのようです。しっかりGitHubに使用例までも出てるので、「らっくしょー」だろうと思って、動作させてみました。ところが、なんとも動作がオカシイのです(またかい?)

 それは、REの回転動作の検出と表示がぎくしゃくして、かなりREの検出が歯抜けになってしまっていて、まったく実用的ではないのです。これは、昔、AVRで7セグLED(高速)を、秋月の安物25クリックREで動かしたときにも起きました。当時はRE検出に私の考えた回転方向&パルス数検出アルゴリズムを使っていて、それが、秋月安物REとアンマッチだったことで起こっていました。今回は、どうもSPI接続の液晶の反応が鈍くて書き込みに時間がかかり、RE検出(割り込み)とうまくマッチしなかったように見えます。

 どうしようかと思っていたのですが、ネット上ではそんな話はあまり聞こえてこないので、PWZの移植ミスかなぁ?と思っていました。ただし、LCDの反応の遅さは、相当に気になるので、なにかいい方法はないかと見ていると、どうもキャラクタセットに、Adfruitの「ギザギザフォント」を使っている例があまりなくて、みなさん、スムーズな造形のフォントを使っています。なので、私もこちらのフォントに変えてみました。





Adfruitよりなめらかなフォント(ゴシック調?)


 このフォントは、多くのスムーズな字体の種類があるようですが、ものによってはかなりのメモリ領域を占有します。最初は2種類くらいは搭載可能だろうと高をくくっていましたが、下記の表示だけで、メモリ使用率は70%に達してしまい、ゴシックと明朝(下)は同時に使用することができませんでした。





Adfruitよりなめらかなフォント(明朝体様)

文字が一部重なっているのは位置設定をまじめにやってなかったから
28ポイントの一つ前のゴシック調表示と上記の36ポイントの明朝体表示を「交互に」
表示して比較しようとしたが、スケッチ容量が32MBを超えてコンパイルできなかった
フォントでこれだけメモリを消費するとは思わなかった


 なので、あきらめて、一種類のフォントで我慢することにしました。それで、REを回して周波数設定と周波数表示をするプログラムを簡易的に組んでみたところ、「まぁ、許せるレベル」にまで書き込み速度が向上し、とりあえず、この状態で一服することにしました。これからの表示の高速化については、いろいろ調べていきますが、ダイヤルを廻して気持ちのいいフィーリングの無線機を作るわけではないので、まずは、残った機能の実装を優先させることにします。ただし、どうも、このカラー液晶LED(SPI)は表示スピードを上げるのは、なかなかむつかしそうで、今までのような(7セグを使った)高速表示器を作るには難儀するかもしれません。

 次は、テンキーインターフェースです。今回のアプリケーションには、周波数の「ダイレクト設定」が必須で、REによる周波数変更は「従」と考えています(なので、若干SPI液晶の表示スピードが遅くともなんとか我慢できるのです)。テンキーインターフェースは通常4×4の16Keyか5×5の25Keyで構成するのですが、これまでのキーによる接続検出法では、16キーで8ビット、25キーで10ビット分のI/Oを消費してしまい、Uno/Nano系のArduinoでは非常に使い勝手がわるいことになります。昔、AVRとBASCOMで使っていたAtmelの40ピンAVRみたいな多I/Oの機種が安く使えるならともかく、Uno/Nanoではこの方法は全く選択支に入ってきません。

 で、探してみるとあるものなのですねぇ。ここには1ビットで16キーを分別するキーボードがありました。アナログポートにつながる10ビットA/Dコンバータで、キーが押されたらその時の出力電圧を読み取ることで、16段階を区別するというものです。人間の動作に比べて、A/Dコンの変換スピードは十分速いので、多分これで十分な検出スピードが得られると思います。





タクトSWでテンキーボードを作る

白が数字、赤/黄がSi5351/AD9952の選択、緑が周波数ステップ選択、黒がリセット





キーボード裏面のゴチャゴチャ配線



 裏面はごちゃごちゃしています。RE24系列の抵抗が必ずしも全品なかったので、例えば910Ωなんて500+200+200Ωなんてので代替していますので、値も必ずしも合っていませんが、実際に作り上げてインターフェースをしてみると、オリジナルのスケッチで動作することがわかりました。このキーボードインターフェースはけっこうお値打ちものですね。

 さて、これで、構成するほぼ全てのパーツがそろいました。実は、DDSはAD9850ではなくて、AD995Xを使おうと思っているので、ヘッダーファイルの変更が必要になりますが、おいおい作っていくことにしましょう。まだ、Cプログラムは初心者なので、BASCOMと違って少し敷居が高いのですが、食わず嫌いでいるといつまでも身につかないので、ぼちぼち&じっくり取り組むことにしましょう。

 まずは手始めに作ったのが、テンキーによる周波数設定プログラムです。入力された2〜8桁のデータを表示して周波数に変換し、Si5351とAD9850に同じ周波数を書き込む部分です。簡単なので、これができたら、次はAD9951へのコントロールを始めます。

 下図はLCD表示のレイアウトです。最初からきっちりとレイアウトを決めて作りこむなんて芸当は、Arduino のスケッチの一作目からはできませんから、見た目はまったく冴えません(苦笑)。先にも書きましたが、フォントを2種類書き込もうとすると、32MBのFLASHメモリーでは足りないので、一種類だけで我慢しています。なので、表示が「単調」になってしまっています。まずは、テンキーから入力された「文字」を8桁の周波数に変換して教示させてみたところです。これからREを回せば周波数を変化させることができます。

 REを回転させるとき、表示をスキップして、DDS/5351の周波数変化だけを行わせると、かなりのスピードで周波数変化させることができますが、周波数変化を逐次的に表示させると、がくっと反応が鈍いものになります。高速化の検討を行っていないので、まだ、なんとも言えませんが、SPI接続の液晶では、いままで使ってきたBASCOM-AVRとL“E”Dの組み合わせには、到底、操作フィーリングでは敵いません。もちろん、これにはスムースに回転する、多パルス/回転のREが当然のごとく必要です。これは「無線機」に使うことを考えると、絶対に譲れませんね。


 次に、ファンクションをいくつか実装しました。まずは、アクティブなデバイス(DDS/5351)を選択できるように、2つのSWを割り当てるとともに、それに従い、アクティブな方の周波数設定ができるようにしました。また、同じく、アクティブなデバイスにむけて、REを回したときの周波数ステップ幅を設定できるキーSW、デバイスをリセット(出力ダウン)できるキーSWを増設しました。

 周波数表示は8桁以下をカンマ区切り無しに入力し、8桁入れ終わらないと先に進めないという、マンマシンインターフェースの観点から見たら「最低な」仕様にしました。CもArduino IDEも初心者なので、最初からマンマシンインターフェースを便利に作るには、時間がかかりすぎると思って、「人間様が機械に合わせる」ことにしています(笑)。例えば、「赤/黄キーで、アクティブデバイスを選択し(*が表示される)たあと、緑キーでステップ周波数の入力要求をします。例えば周波数ステップサイズを1kHzにするには、「00001000」(=1000Hz)を入力することになります。ま、いつかは、カンマを表示したり、作業のための追加機能を実装するのでしょうが、今は、あまり深入りしません。まずは、全体としての動作確認が先決です。





表示の様子

周波数可変設定(真ん中のライン表示)はもう1文字投入すると設定されてしまって表示クリアされてしまうので
1文字残して写真を撮った。これで、0を投入すれば、周波数可変量は1kHzになる。



 このあとは、DDSをAD9952するための方策を考えてみることにします。さっそく、ArduinoでAD9952をコントロールしている例がないかネットをぶらついてみました。スケッチを一件発見したのですが、どうも、初心者ではアルゴリズムが読み解けなかったので、すでにあるAD9850のヘッダーファイルを改造してみようと思い立ちました。このヘッダーファイルはAD9850とEF_AD9850の二種類あって動かし方が違うのですが、後者の方が動作がわかりやすくて、改造しやすいように思ったので、この方針で臨むことにします。

 まずはEF_AD9850の制御法と昔からBASCOMで動かしていた制御法をじっくり比較してみます。BASCOMでAD9952をどのように動かしていたのか、失念していたのですが、9850と9951は周波数設定のための制御ワードが32ビットで同じですから、その周りの制御ワードをちょこっと変えれば、EF_AD9952.hができるだろうと思いました。まずは、元のファイル(iniファイル、hファイル、cppファイル)の9850という文字を9952に変更して、乱暴にもコンパイルしてしまうと、当然のことながらエラーは出ません。ここから、中身をちょいちょいと変更すればいいわけです。

 ここで、EF_AD9850.cppの中身をのぞいてみます。すると、周波数設定のためのコマンドw0(=&H00)とそれに続く32ビットの位相データをLSB firstで送信していることが見て取れます。32ビットの位相データは8ビットごとに区切って、そのw4〜w1を順次LSBファーストでArduinoのポートをオンオフしているというわけです。AD9850のデータシートにあるような動作を愚直にやっていますね。これは極めて分かりやすいです。

 ところが、AD9952用に適用するのは、そのままではできません。というのも、995xはイニシアル状態ではMSBファーストでアドレス設定後インストラクション、さらにはアドレス設定後に生成周波数の位相ステップデータを受け取るというシーケンスになっています。LSBファーストにするには、MSBファーストの状態(信号やりとり)で、アドレスが&H00のインストラクション(3Bytes)のLSBファーストビットをオンしなければなりません。やってできないこともないですが、なんだかこんがらがりそうですね。なので、今回のEF_AD9952.cppの方をMSBファーストに改造してしまいます。バイトデータを方向が逆に送り出すだけですから、データ送出のためにビットシフト方向を変えれば簡単にできます。なので、こちらの方向で行くことにしましょう。

 EF_AD9850.cppからEF_AD9952.cppと改めて、周波数設定動作に関してみれば、周波数データを収容するレジスタの8ビットアドレス(&H04)と、それに続く位相ステップ量(32ビット)をMSBファーストで書いていけばいいわけです。オリジナルのEF_AD9850.cppから少しの変更でEF_AD9952.cppを作ることができます。以下にコードを晒しておきます。ここは完全自作ではなくて、既存のコードの変更ですから気楽に晒すことができます。完全自作だと、コードから作成者の「センス」がわかるらしいですが、私の場合は、ソフトというかアプリというかは超初心者(=センスゼロ)なので、自作コードは気心の知れた人にしか開示する気はありません(笑)。出来損ないプログラムは恰好の嘲笑の対象ですからね(笑)。



以下はEF_AD9952.h ----タブが抜けてしまい見苦しいがご容赦を

/*********************************************************************
** Device: AD9952
** File: EF_AD9952.h
*********************************************************************/

#ifndef __EF_AD9952_H__
#define __EF_AD9952_H__

#include "arduino.h"
#include <avr/pgmspace.h>


class EF_AD9952{
public:
EF_AD9952(int D_CLK, int D_STRB, int D_REST, int D_BitData);
void init(void);
void reset(void);
void wr_serial(unsigned char w0,double frequence);
void wr_parrel(unsigned char w0,double frequence);

private:
int BitData, STRB, REST, Mode, CLK;

};

#endif

以下はEF_AD9952.cpp----タブが抜けてしまい見苦しいがご容赦を

/*********************************************************************
** Device: AD9952
** File: EF_AD9952.cpp
*********************************************************************/

#include "EF_AD9952.h"


EF_AD9952::EF_AD9952(int D_CLK, int D_STRB, int D_REST, int D_BitData)
{
pinMode(D_REST, OUTPUT);
pinMode(D_STRB, OUTPUT);
pinMode(D_CLK , OUTPUT);
pinMode(D_BitData, OUTPUT);

CLK = D_CLK;
STRB= D_STRB;
REST= D_REST;
BitData = D_BitData;
}


void EF_AD9952::init(void)
{
digitalWrite(REST, 0);
digitalWrite(STRB, 0);
digitalWrite(CLK, 0);
digitalWrite(BitData, 0);
}

void EF_AD9952::reset(void)
{
digitalWrite(CLK, 0);
digitalWrite(STRB, 0);
digitalWrite(REST, 1);
digitalWrite(REST, 0);
digitalWrite(REST, 1); //AD9952基板はアクティブローとした

byte cw1=B00000001;
byte cw2=B00000000;
byte cw3=B00000000;
byte cw4=B00000110;
unsigned char j;

//write cw1
for(j=0; j<8; j++)
{
digitalWrite(BitData, (cw1<<j)&0x80);
digitalWrite(CLK, 1);
digitalWrite(CLK, 0);
}
//write cw2
for(j=0; j<8; j++)
{
digitalWrite(BitData, (cw2<<j)&0x80);
digitalWrite(CLK, 1);
digitalWrite(CLK, 0);
}
//write cw3
for(j=0; j<8; j++)
{
digitalWrite(BitData, (cw3<<j)&0x80);
digitalWrite(CLK, 1);
digitalWrite(CLK, 0);
}
//write cw4
for(j=0; j<8; j++)
{
digitalWrite(BitData, (cw4<<j)&0x80);
digitalWrite(CLK, 1);
digitalWrite(CLK, 0);
}
digitalWrite(STRB, 1);
digitalWrite(STRB, 0);

}

void EF_AD9952::wr_serial(unsigned char w0,double frequence)
{
unsigned char i,w;
long int y;
double x;

//Calculate the frequency of the HEX value
x=4294967295/131.053;//Suitable for 131M Crystal
frequence=frequence/1000000;
frequence=frequence*x;
y=frequence;

//write w0
w=w0;
for(i=0; i<8; i++)
{
digitalWrite(BitData, (w<<i)&0x80);
digitalWrite(CLK, 1);
digitalWrite(CLK, 0);
}

//write w1
w=(y>>24);
for(i=0; i<8; i++)
{
digitalWrite(BitData, (w<<i)&0x80);
digitalWrite(CLK, 1);
digitalWrite(CLK, 0);
}
//write w2
w=(y>>16);
for(i=0; i<8; i++)
{
digitalWrite(BitData, (w<<i)&0x80);
digitalWrite(CLK, 1);
digitalWrite(CLK, 0);
}
//write w3
w=(y>>8);
for(i=0; i<8; i++)
{
digitalWrite(BitData, (w<<i)&0x80);
digitalWrite(CLK, 1);
digitalWrite(CLK, 0);
}
//write w4
w=(y>>0);
for(i=0; i<8; i++)
{
digitalWrite(BitData, (w<<i)&0x80);
digitalWrite(CLK, 1);
digitalWrite(CLK, 0);
}

digitalWrite(STRB, 1);
digitalWrite(STRB, 0);
}

 このコードは「私の」AD9952モジュール用なので、リセット信号がアクティブロー(ただしAD9952チップはアクティブハイ)になっています。そのあたりは、もし、このファイルをお使いになる場合は必要に応じて書き換えてください。さて、これで、当初の目標だったArduinoいじりに必要な周辺機器用の制御プログラムが、大略完成しました。構成は↓のような状況です。また、実際の動作に関してもREの回転に対して、表示スピードが遅すぎますが、今回の用途は無線機のダイヤルを想定していないので、なんとか良しとしましょう。改善はこのあと実施していきます。最後に動きの動画をどうぞ。





全体の様子

RE、Binbo、Si5351,10-Key,TFT-LCD、AD9952、AD9850、電池を搭載
AD9850をソケットから抜けば、そのソケットからAD9952用制御信号を取り出せる





周波数可変の様子(ちょっとトロイ)



注:Arduino Uno/Nano/BinboのI2C端子はSDAがA4,SCLがA5でした。修正いたします。

回路図



 一応、AD9952とSi5351の発振波形を以下に示しておきます。電源系統、アース系統がしっかり考えられていないので、これから本来の目的に向けて、強化していくわけですが、「単に配線した」だけだと、こんなレベルの信号が得られましたという感じにみてください(大笑)。





Si5351発振波形




AD9952発振波形