Quantcast
Channel: JH7UBCブログ
Viewing all 440 articles
Browse latest View live

再びArduino

$
0
0
 7MHz用アカギスタンダード(AS40)の製作が終わり、次のテーマに進むことにします。
 
 次の目標は、AD9834DDSの制御です。
 
 まず、Arduinoでの制御を試します。
 
 これに関しては、JA2GQPさんがブログで紹介していますので、それを参考にしてやってみます。
 
 JA2GQPさんもFMCA(福島マイクロコンピュータ同好会)MLのメンバーで、AD9834DDSチップと変換基板を分けていただきました。ありがとうございます。
 
イメージ 1
 
チップと変換基板は、まだハンダ付けしていません。まず、このハンダ付けから始めますが、これが老眼の私には第一関門です。
 
そのことをMLに書いたら、「そんないに難しくありませんよ」とのコメント。教えていただいた方法でやってみましょう。
 
久しぶりにArduinoを引っ張り出してきました。私のArduinoは、クッキーの缶に入っています。(USBケーブルもちょうど良い具合に入ります) 良い感じでしょ。
 
イメージ 2
 
イメージ 3
 
 ちょっとした小物も入ります。
 
 家庭菜園ももう少しで終了しますので、家の中にいることが多くなります。
 
 ぼちぼちやろうと思います。
 
 Arduinoでうまく制御できたらPICでの制御に移ります。PICは、PIC16F883(または、886)を使用する予定です。
 
 PICでの制御ができるようになったらトランシーバに搭載する予定です。
 
 それは、来年になっちゃうかな....
 
 

カマキリ

$
0
0
 秋晴れの一日でした。
 
 玄関の戸をふと見ると、カマキリがいました。
 
イメージ 1
 
 お腹が大きくメスで、卵を産み付ける場所を探しているようです。
 
 そう言えば、カマキリが卵を産む高さでその年の雪の深さが分かると昔から言われています。
 
 カマキリは最初1mくらいの高さにいたのですが、だんだん下がってきて50cmくらいの高さに降りてきました。
 
 でも、結局卵は産みませんでした。
 
 ということで、今年が雪が多いのか少ないのか、分かりません。
 
 秋ですね。

Arduinoでロータリーエンコーダ

$
0
0
 今日は、Arduinoでロータリーエンコーダを使うスケッチを試しました。
 
 Arduinoでロータリーエンコーダを使うスケッチは、以前にPICでロータリーエンコーダを使う時にwsnakのブログのスケッチを参考にさせていただきました。
 
 今回は、JA2GQPさんのダウンロードサイトからダウンロードしたライブラリを試しました。(Arduino AD9850 DDSの中にあります)
 
 ライブラリは、rotary.hを使いました。原典は、Ben Buxton氏の「Buxtronix」というウェブサイトにあります。
 
スケッチは、次のとおりです。
 
イメージ 1
 
 Arduinoとロータリーエンコーダを接続して動作をチェック。たいへんよく動作します。
 
 ロータリーエンコーダのA,B端子をArduinoの2,3番ピンに接続しました。
 
 ロータリーエンコーダは、秋月電子で販売しているRE-160F-40E3-20A-24Pです。(200円)
 
イメージ 2
 スケッチをArduinoに書き込み、RUNするとエンコーダの回転方向によって、「Right」「Left」をシリアルモニタに表示します。
 
イメージ 3
 このスケッチは、Arduinoの割り込み処理を利用しています。
 
 ピンの状態が変化した時に割り込みが生じ、ISR(Interrupt Service Routine)で処理を行った後、再びメインルーチンに戻ります。
 
 ロータリーエンコーダの動きに応じてかなり確実に動作しますが、Right と Leftが逆?
 
 AとBの接続を逆にすると正常。
 
 実際にどのようにエンコーダの信号を処理しているのか、プルアップは必要ないのか、など分からないところも多いです。
 
 とにかく、このライブラリとスケッチでロータリーエンコーダの処理ができます。
 
 ついでに、Arduinoの割り込み処理について、ちょっと勉強しておこうと思います。
 
 10/10追記
 
 プルアップは、ライブラリの中で行われるので、外付けのプルアップ抵抗は必要ありません。
 
 秋月のロータイr-エンコーダーでは、Right と Leftが逆になるようです。
 
 aitendoのエンコーダでは、スケッチのとおりになるようです。
 

A1CC

$
0
0
 A1クラブがやっているA1CCに申請してみました。
 
 A1CCとは、DXCCをもじって、A1クラブのメンバーと何局交信できたかを競います。
 
 現在、A1クラブの会員は、2774人です。集計してみると、当局JH7UBCは、そのうち688局と交信していました。
 
 昨日、申請を行い、今朝結果を見るとMIXで34位、CWで32位でした。
 
イメージ 1
 
 まだ、約1/4の局との交信なんですね。なお、ランキング・トップのJH2CMH局は、MIXで1307局です。すごいですね。
 
 私は、開局からのLOGをHamlogで管理していますので、次のような手順で、集計しました。
 
 まず、A1クラブのホームページから、集計用のソフトa1aa_a1cc.exeをダウンロードしておきます。(説明pdfファイルも一緒にダウンロードして、それを参考にします)
 
 Hamlogのメニューから「検索」→「複合条件検索と印刷」→CSVファイルを選び、検索なしで出力します。
 このとき、LOGLISTというファイル名にしました。
 
 集計ソフト、a1aa_a1cc.exeを実行するとファイルを指定する画面になり、a1user.txtとLOGLIST.csvを指定し、集計ボタンを押すと、ちょっと時間がかかりますが、集計結果の画面が現れます。
 
 これを自分でやろうと思えば、たいへんです。集計ソフトを作ってくれたJR1CPBに感謝です。
 
 集計結果の画面から申請ができるのですが、なぜか、うまく行きませんでした。
 
 そこで、A1クラブのホームページの申請画面から申請を行いました。
 
 次回は、今月末のLet's A1コンテスト参加後に申請したいと思います。
 
 さて、Let's A1コンテストでどの程度局数を伸ばせるか楽しみです。
 
 

IchigoJam EEPROM

$
0
0
 IchigoJamにEEPROMを装着しました。
 
使用したEEPROMは、1Mbit I2C シリアルEEPROM 24FC125(秋月電子で250円)です。
 
 「ボクにもわかる IchigoJam マイコンボード」のサイトの情報を元に回路を描くと
 
イメージ 1
 
 パスコン104(0.1μF)は、なくとも大丈夫だと思いますが、念のためつけました。
 
 なお、24FC1025の7番ピンWPは、GNDに落とせば、書き換え可、Vccに接続すれば、ライトプロテクトになります。今回は、GNDに接続して常時書き換え可能にしてあります。
 
 自作のIchigoJamボードに実際にEEPROMを装着した様子です。
 
イメージ 2
 
 電源を入れると問題なく動作しました。
 
 私のIchigoJam BASICのバージョンは、まだ 1.01ですので、FILES命令は、次のようになります。
 
 FILES だけの場合は、0から3まで表示
 FILES 0 とすると全ファイルを表示
 FILES n とするとn個のファイルを表示
 
 これで、4+127個のプログラムを保存することができるようになりました。
 

ArduinoでAQM0802A

$
0
0
 秋月電子からI2C接続のLCD AQM0802Aを購入しました。今回は、ピッチ変換キットを購入しました。(600円、AQM0802A単体なら320円)
 
イメージ 1
 
変換基板には、AQM0802Aを動作させるためのプルアップ抵抗やコンデンサが実装されています。
 
イメージ 2
 
まず、基板にLCDモジュールと細ピンヘッダをハンダ付けします。
 
イメージ 3
 
LCDモジュールのピンは、ハーフピッチで、うまくハンダ付けできるかと心配したのですが、何とかうまくできました。
 
最初、小さなハンダこてでトライしたのですが、隣同士がくっついてしまう、いわゆるブリッジ状態になってしまいました。
 
ハンダ吸い取り線を使おうかとも思いましたが、少し大きめにハンダこて(60W)を使って、ピンとピンの間をハンダを再度溶かすようにして動かすと、ハンダがピンの方にまとまり、ブリッジが解消されました。
 
ハンダはある程度温度を上げると表面張力により丸くなろうとします。その性質を使えば良いようです。
 
次に細ピンヘッダをハンダ付けして出来上がりです。
 
ArduinoとAQM0802Aとの接続は次のようにします。
 
イメージ 4
 
ブレッドボードを使って配線しました。
 
イメージ 5
 
I2Cを使うには、Wire.hライブラリをincludeする必要があります。更に、I2C接続のLCD用のライブラリが必要です。
 
これについては、GitHubにLiquidCrystal_I2C.hというライブラリが公開されていますので、サンプルスケッチで試してみましたが、うまく表示しませんでした。コントラストを設定するコマンドがないからかも知れません。
 
そこで、「オレ工房」さんが公開しているI2C液晶のArduinoライブラリST7032をダウンロードして、使わせていただきました。(オレ工房さん ありがとうございます。)
 
サンプルの「Hello World」のスケッチです。
 
コントラストの設定値は、30前後が見やすいようです。
 
実際の表示を見ると、1行8文字ですから、「hello, w」までした表示出来ません。
 
2行目は表示開始からの秒数です。
 
 なお、詳細は「オレ工房」さんの該当ページを見てください。
 
イメージ 6
 
AQM0802Aには、ST7032iというI2Cコントローラが使われています。ST7032.hは、このコントローラ用ですから、スレーブアドレスを省略することができます。
 
ちなみに、ST7032iを使ったI2C用LCDのアドレスは、0x3E(R/Wビットを加えると0x7C)です。

IchigoJamでAQM0802A

$
0
0
 I2C接続のLCD AQM0802AをIchigoJamに接続してみました。
 
接続は、次の回路図のとおりです。
 
イメージ 1
 
表示用のプログラムは、いつもお世話になっている「ぼくにもわかるIchigoJamマイコンボード」のサイトにあるデモプログラムを使いました。
 
イメージ 2
 
このデモプログラムでは、TV画面の左上の8文字、2列の文字がLCDに表示されます。
 
写真のように、無事表示されました。
 
とりあえず、IchigoJamでもI2C接続LCDが使えることが分かりました。
 
なお、詳細は「ボクにもわかるIcgigoJamマイコンボード」のサイトをご覧ください。

PICerFT

$
0
0
 PICerFT は、「電子工房」さんが公開しているPICとAVRマイコン用のライタです。
 
 PICerFTは、USBシリアル変換モジュールFT232RLを利用した安価で小型なライタで、FT232RLを利用して、USBの5Vから12V(または9V)を生成していますので、USBに接続するだけで使用できます。
 
 今年の6月に製作をして、メインのライタとして使用していますが、PICは、ブレッドボードにさして、ジャンパー線で接続していました。
 
 今回、秋月電子のPickit対応ICSP書き込みアダプターキットをまねて、PIC用のアダプターを作りました。
 
イメージ 1
 
PICerFT本体とアダプターは、6PのL型ピンソケットとL型ピンヘッダーで接続します。
 
40Pのゼロプレッシャーソケット(サトー電気から購入)を使い、配線は、ピンソケットをジャンパー線で接続します。
 
とりあえず、当面よく使う8ピンPICと18ピンPICへの配線が分かるようにラベルを貼りました。
 
ゼロプレッシャーソケットとピンソケット間の配線は、ハンダでブリッジして済ませましたが、けっこうな量のハンダを使いました。それにハンダこてが熱くなるとハンダが丸くなってしまってブリッジがうまくできません。
 
SOPのハンダ付けと違って、丸くなられると困るんですね。(笑)
 
イメージ 2
 
 完成して、PIC12F675に書き込みテストをしてみました。
 
 OK大丈夫です。
 
 PICerFTは、多くのPICに対応しています。更にAVRマイコンへの書き込みもできます。
 
 しばらくの間、メインライタとして使いましょう。
 
 

ArduinoでAD9834DDSその1

$
0
0
 AD9834DDSをArduinoでコントロールする実験を始めます。
 
 まず、ANALOG DEVICES社のAD9834(BRUS)の主な特徴です。
 
 ・2.3V~5.5V電源
 ・75MHzリファレンスクロックで0~37.5MHz出力
 ・サイン波/三角波出力
 ・内部コンパレータ
 ・3線式SPIインターフェース
 ・3Vで20mWの消費電力
 ・20ピンTSSOPパッケージ
 
 このTSSOPパッケージというのが、実に小さいのです。このチップを変換基板にハンダ付けする作業から始めました。
 
 Web上にSOP SSOPのハンダ付けに関する画像がいくつかあり、それを参考にハンダ付け作業をしました。
 
 まず、チップをセロテープでピンの位置を固定してから片側にハンダをたっぷり盛りました。(ハンダこては60W型を使いました。)
 
イメージ 1
 
イメージ 2
 
 セロテープをはがして、反対側にもハンダを盛りました。
 
イメージ 3
 
 ハンダ吸い取り線にハンダこてを当てて熱し、余分なハンダを吸い取ります。
 
イメージ 4
 
ルーペを使ってピンとピンの間にブリッジがないかどうか確認
 
イメージ 5
 
細ピンヘッダをハンダ付けして、完成です。
 
イメージ 6
 
念のため、テスターで各ピン間がショートしていないか確認しました。
 

ArduinoでAD9834DDSその2

$
0
0
 今年の2月、ArduinoでAD9850DDSを動かす実験をしました。記事はこちら
 
 今回使うAD9834をコントロールする方法は、それとはまったく違っています。
 
 AD9834の日本語データシート(pdf)を見て制御方法を勉強します。
 
 このデータシートは、AD9834BUR(最高クロック50MHz)ですが、今回使うAD9834BRUZ(最高クロック75MHz)と原理は同じだと思います。
 
 AD9834は、内部に周波数セット用のレジスタを2つ(FREQ0とFREQ1)、位相変調用のレジスタを2つ(PHASE0とPHASE1)そしてDDSをコントロールするためのコントロールレジスタを持っています。
 
イメージ 3
 
 
 AD9834のデータは16ビットで3線式のSPI通信で送ります。
 
 16ビットデータの最初の2ビット(D15,D14)で、データの収納先のレジスタを指定します。
 
 D15=0,D14=0(00)ならコントロールレジスタを01ならFREQ0を10ならREQ1を11ならPHASEレジスタを示します。
 
 更にPHASEレジスタは2つありますので、D13が0のときは、PHASE0を1のときは、PHASE1を示します。
 
 FSYNC,SCLK,SDATAのシリアルタイミングは、次の図のようになります。なお、詳細はデータシートを見てください。
イメージ 1
 FSYNCをLOWにしてからデータを送ります。16ビットのデータ(D15~D0)は、SCLKの立ち下がりで内部のシフトレジスタに送られます。
 
 D15から送り込むというのは、MSB(最上位ビット)から順に送るということです。Arduinoでは、shiftOutという関数でこれを行うことができます。
 
 さて、肝心な周波数データは、どのように計算するのでしょうか。
 
 これについては、前回のAD9850DDSの時と同じ計算で行うことができます。
 
 Arduinoは計算機能が強力ですので、簡単に計算できますが、今後PICでコントロールする予定なので、マスタークロックは、67.108864MHzに設定しています。
 
イメージ 2
 
 
 このことにより、一番下の行のとおり、希望周波数 f を32ビットの変数に格納して、左に2ビットシフトすれば、周波数データΔPhaseが得られることになります。
 
 実際にAD9834にデータを送る方法(プログラム)は、次回書きます。
 

ArduinoでAD9834DDSその3

$
0
0
 AD9834にデータを送る方法を説明します。
 
 AD9834へPSI通信で送るデータは、16ビット単位です。
 
 ですから、データは、コントロールワード+周波数データ(または、位相データ)の形で2回または3回送信します。
 
 コントロールワード(D15=0,D14=0)のD13が1の時は、28ビットモードで、コントロールワードに続く2回の連続した書き込みで周波数レジスタに完全なデータが書き込まれます。
 
 D13が0の時は、続いて書き込むデータを周波数レジスタの上位または下位に書き込みます。上位か下位かは、D12で指定します。
 
 周波数データの上位2ビット(D15,D14)は、01でFREQ0を10でFREQ1を指定します。
 
 以上をまとめると(28ビットモードのとき)次のようになります。
 
イメージ 1
 
 では、Arduinoでは、どのようにスケッチを書いたらよいのでしょう。
 
 Web上を検索しても日本語のサイトは、あまりヒットしません。そんな中、JA2GQPさんのブログにすばらしいスケッチが公開されていました。
 
 そのスケッチを参考にして(というよりコピーして)、とりあえずスケッチを書き、1MHzを発生させてみました。
 
イメージ 2
 
 
 回路図は、次のとおりです。
 
イメージ 3
 
マスタクロックには、SG-8002DB(67.108864MHz)を使いました。PLLですからそれほどの精度は望めませんが、値段も手頃なのでこれにしました。
 
 SG-8002DBに流れる電流は約16mA、AD9834は1MHz発生の時約40mAで、計、約56mAでした。
 
1MHzの出力波形です。AD9850DDSと比べるとギザギザが目立ちます。無負荷で0.6Vp-p程度の出力が得られました。
 
イメージ 4
 
SCLKとSDATAの波形です。
 
イメージ 5
 
 赤がSDATA、青がSCLKです。
 
 なお、コントロールワードのD1を1にすると(0X2002)、三角波を発生させることができます。1MHzの三角波です。
 
イメージ 6
 
 周波数を変えて実験をしました。上限は20MHz程度、下限は10Hz程度でした。スペックでは37.5MHzまで発生できるはずですが、 ??です。
 
 カウンタのせいか、ちょっと分かりませんが、20MHzまで使えれば、7MHzトランシーバのVFOとしては大丈夫でしょう。ただ、高調波が多いと思いますので、LPFは必須ですね。
 
 スケッチについては、次回書きます。

ArduinoでAD9834DDSその4

$
0
0
 AD9834をArduinoでコントロールするスケッチです。
 
 基本的には、JA2GQPブログの記事のスケッチを使わせていただきました。JA2GQPさん、ありがとうございます。
 
 AD9834に送る16ビットのデータは、MSB(最上位ビット)から順に送信します。
 
 Arduinoには、1バイト(8ビット)分のデータを1ビットづつ送る関数としてshiftOut()という関数があります。
 
 書式は、shiftOut(dataPin,clockPin,bitOrder,value) です。
 
 各ビットは、dataPinに出力され、その後clockPinが反転し、そのビットが有効になったことが示されます。
 
 例えば、dataPin=SDATA,clockPin=SCLK,bitOrder=MSBFIRST(最上位ビットから送り出す),value=wrk(16ビット)なら
 まず、wrkの値を右に8ビットシフトしてから上位8ビットを先に送信します。
 
 shiftOut(SDATA,SCLK,MSBFIRST,(wrk >> 8));
 
 次にwrkの下位8ビットを送信します。
 
 shiftOut(SDATA,SCLK,MSBFIRST,wrk);
 
 スケッチの全体像は、JA2GQPブログを見ていただくことにして、ここでは、スケッチの中でDDSにデータを送る関数 Fnc_Dds()について解説します。
 
setup()の前にDDS_CLK と TWO_E28を定義しておきます。
const unsigned long DDS_CLK = 56000000L; // AD9834 Clock 56Mhz
const unsigned long TWO_E28 = 268435456L; // 2^28
 実は、今回DDS_CLKを67108864=2^26にしたため、上の2行の記載が不要になりました。
 
void Fnc_Dds(double frquency){
//unsigned long wrk = frquency * TWO_E28 / DDS_CLK; //wrkは、DDSに送る周波数データ(32ビット)
上の行の記載が不要になり下のようにfrequencyを2ビット左にシフトするだけでOKです。
ただし、引数frequencyのデータ型は、unsigned longにしなければなりません。
unsingned long wrk = frequency << 2;
unsigned int wrk1,wrk2,wrk3;
wrk1 = 0x2000;       //wrk1は、コントロールデータで、28ビットモード
wrk2 = wrk & 0x3fff;    //wrk2は、周波数データの下位14ビットを取り出したもの
wrk2 = wrk2 | 0x4000;   //wrk2にFREQ0を指定するビットを付け加える
wrk3 = wrk >> 14;     //右に14ビットシフトする。
wrk3 = wrk3 & 0x3fff;   //wrk3に周波数データの上位14ビットをセットする。
wrk3 = wrk3 | 0x4000;  //wrk3にFREQ0を指定するビットを付け加える。
 
digitalWrite(SCLK,HIGH); // SCLKをHIGHにする。
digitalWrite(FSYNC,LOW); //FSYNCをLOWにする。データ送信開始
 
shiftOut(SDATA,SCLK,MSBFIRST,(wrk1 >> 8)); //コントロールデータを送信
shiftOut(SDATA,SCLK,MSBFIRST,wrk1);
 
shiftOut(SDATA,SCLK,MSBFIRST,(wrk2 >> 8)); //周波数データの下位14ビットをFREQ0レジスタに送信
shiftOut(SDATA,SCLK,MSBFIRST,wrk2);

shiftOut(SDATA,SCLK,MSBFIRST,(wrk3 >> 8)); //周波数データの上位14ビットをFREQ0レジスタに送信
shiftOut(SDATA,SCLK,MSBFIRST,wrk3);
 
digitalWrite(FSYNC,HIGH); //FSYNCをHIGHにする、(データ送信終了)
 
 

Let's A1コンテスト

$
0
0
 当局JH7UBCは、本日14:00から19:59まで、Let's A1コンテストに参加します。
 
 バンドは、7MHzと3.5MHzで、モードはCWです。
 
 縦振電鍵など単一接点のキーが条件のコンテストです。
 
 コンテストナンバーは、RST+CW従事者免許取得年の下2桁。
 
 コールが聞こえましたらコールよろしくお願いします。
 
 
コンテストを終えて
 
 今年もフルタイム参戦できました。交信いただいた各局、ありがとうございました。
 
 14:00から18:00ころまでは、7MHzで運用し、その後3.5MHzにQSYしました。
 
 今年は、のんびり楽しもうと思い、最初は比較的スローテンポで入りましたが、やはりだんだん気合いが入ってきます。
 
 終わってみれば、昨年を若干上回るスコアになりました。
 
 ほとんどの時間は、CQを出し続けましたが、呼ばれ具合からちょっと考えたことがあります。
 
 自分も含めて、バンド内をワッチする時は自然に周波数の低い方から上の方にダイヤルを回します。
 
 ということは、CQを出す周波数としては、低い方が有利ではないかと思ったのです。
 
 これってどう思いますか?

県北430CQ大会結果

$
0
0
 第25回県北430CQ大会の結果がJI7FYK局から届きました。
 
イメージ 1
 
 当局JH7UBCは、9位と最近の定位置です。Hi
 
 やはり、上位は移動運用を行った局ですね。
 
 ただ、うれしかったのは、固定部門ってのがあって、それではDX賞とマルチ賞でそれぞれ2位でした。
 
 また、来年も頑張りましょう。

ArduinoでAD9834DDSその5

$
0
0
 ArduinoでAD9834DDSをコントロールする基本的なスケッチはできましたので、次はロータリーエンコーダーで周波数を変更できるようにし、LCDで周波数を表示するようにします。つまり、VFO化します。
 
 ロータリーエンコーダーについては、既に実験を終わっています。記事はこちら
 
 ロータリーエンコーダーの制御スケッチでは、Arduinoの割り込み機能を使っています。
 
 PCICR |= (1 << PCIE2);
  PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
  sei();
 
 ・
 ・
  ISR(PCINT2_vect){
 
 }
 
 の部分です。
 
この記述について、私が持っている唯一のArduinoの参考書「Arduinoをはじめよう」を調べましたが、分かりませんでした。
Web上でもArduinoの割り込みに関する記事は多くありません。いろいろ調べて、ようやく理解できました。
 
 私と同じようにArduinoの割り込みで悩んでいる方のために、分かったことを記録しておきたいと思います。
 
 まず、基本的なことですが、Arduino UNOは、AVRマイコンATmega328Pを使った小さなマイコンシステムであるということです。つまり、Arduino UNOの正体はATmega328Pなのです。
 
 そこで、ATmega328Pの説明書を読むと、このマイコンにはたくさんの割り込みがあります。
 優先順位(プライオリティ)の高い方から (最初の数字は割込ベクトル番号)
 
1 リセット
2 外部割込要求0
3 外部割込要求1
4 ピン変化割込要求0
5 ピン変化割込要求1
6 ピン変化割込要求2
7 ウォッチドックタイマ完了
8~11 タイマカウンタ2関係割込
12~14 タイマカウンタ1関係割込
15~17 タイマカウンタ0関係割込
 
以下省略
 
 今回使うのはピン変化割込要求2です。これは、ピンの状態(電圧)が変化した時に割込要求を生じます。
 
 この割込を有効にするのが
 PCICR(Pin Change Interrupt Control Register)という内部レジスタです。このレジスタは、8ビットで、ビット0~2がPCI0~PCI2に対応します。
 
 ここで、PCI0は、PCINT0~7に、 PCI1は、PCINT8~14、PCI2は、PCINT16~23に対応します。
 
イメージ 1
 
 ロータリーエンコーダは、PCINT18とPCINT19に接続しますので、PCI2を有効にします。
 
 その記述が、 PCICR |= (1 << PCIE2); です。
 
 次に、PCI2のグループのどのピンをモニタするかを記述しているのが、
 
 PCMSK2 |= (1 << PCINT18) |  (1 << PCINT19); です。
 
 PCMSK(Pin Change Enable Mask Register)は、0から2の3つあります。
 
 なお、<<は左にシフトする演算で、それぞれのビットまで1を左にシフトして、PCICR、PCMSK2とORをとることにより、それぞれのビットを1にします。
 
 PCICRとPCMSKレジスタの各ビットの内容です。
 
イメージ 2
 
 最後に
ISR(){
_}
は、Interrupt Service Routineで、割込を生じた時(今回は、PCINT18またはPCINT19ピンの状態に変化が生じた時)に、ここに書かれたスケッチが実行され、再び元のプログラムに戻ります。
 
 sei();は割込全体を有効にする関数です。
 
 

ArduinoでAD9834DDSその6

$
0
0
 
 AD9834DDSの初期バージョンが一応できました。
 
 AD9834で希望周波数を発生し、周波数は、I2C LCD AQM0802に表示します。
 
 周波数ステップは、以前にPICで製作したAD9850DDS SGと同じように、STEPボタンを押すたびに
 
 1MHz→100KHz→10KHz→1KHz→100Hz→10Hz→1MHzと循環するようにしました。
 
 ロータリーエンコーダーを右(時計回り CW)に回すとステップ周波数の値だけ周波数が上がり、左(反時計回り CCW)に回すと周波数が下がります。
 
 回路図です。
 
イメージ 1
 
 Arduino UNOとブレッドボー上の配線の様子です。
 
イメージ 2
 
スケッチの一部を紹介します。(JA2GQP局のスケッチを使わせていただいています)
 
//Main Program
void loop() {
  if(digitalRead(SW_STEP) == LOW){
    Fnc_Stp();
  }
  Fnc_Dds(FREQ);
  Fnc_Lcd();
  delay(100);
}
 
//割り込みサービスルーチン
ISR(PCINT2_vect){
  unsigned char result = r.process();
  if(result){
    if(result == DIR_CW){
      FREQ = FREQ + STEP;
    }
    else{
      FREQ = FREQ - STEP;
    } 
    }
  }
 
//STEPボタンが押された時の処理
void Fnc_Stp(){
  if(STEP == 10){
    STEP = 1000000;
  }
  else{
    STEP= STEP / 10;
  }
  delay(250);
  Fnc_Step_Disp();
  while(digitalRead(SW_STEP) == LOW){
    delay(250);
  }
}
 
 これで、任意の周波数を発生できるようになりました。
 
 発生できる周波数の上限を測定すると約23.6MHzでした。マスタークロックの半分まではいきません。
 
 将来7MHz CWトランシーバーのVFOとして使いたいと考えています。その場合は、16MHz台を発生させる予定なので、このAD9834DDSで大丈夫だと思っています。
 
 なお、ここまでのArduinoでAD9834DDSの記事をまとめてJH7UBCホームページに掲載します。

ArduinoでAD9834DDSその7

$
0
0
 ArduinoでAD9834DDSをコントロールし、希望の周波数を発生させることができるようになりましたが、周波数とSTEPの表示が気になります。
 
 周波数は、左づめの表示なので、これを右づめで表示で来るようにし、STEPも右側に表示できるように改良しました。
 
イメージ 1
 
 周波数の右づめ表示については、Arduinoの数字を文字列に変換する関数sprintf()を使いました。
 
 ただ、Arduino UNOでは、int(正数)を文字列に変換することしかできません。つまり、32767までの数字までなら文字列に変換できます。
 
 そこで、周波数データ(8桁)を上位4桁と下位4桁にわけて表示させることにしました。
 
 しかし、2つの問題点が出てきました。
 
 例えば、「300」の場合、「0 300」と表示されます。そこで、上位4桁が0の場合は、"    "を表示させることにして、いわゆる0消しをしました。
 
 それから、「7000000」の場合、下位4桁が「0」と表示されるため「700   0」と表示されます。そこで、下位では、スペース' 'を逆に'0'に変換しています。
 
 スケッチです。
イメージ 2

PIC16F883その1

$
0
0
 ArduinoでAD9834DDSをコントロールする作業が一段落しました。
 
 次は、PICでのコントロールに挑戦します。
 
 使うPICは、PIC16F883にしました。
 
 なぜ、このPICかというと、まず安い。秋月で150円です。それから、入出力ポートが多い。24ポート使えます。
 
 WeB上には、あまりこのPICの使用例がないので、勉強を進める過程をブログに書いていこうと思います。
 
 このPICのファミリーは、PIC16F882/883/884/886/887です。主な違いは
     PIC      Flash SRAM EEPROM I/O A/D
PIC16F882 2048 128     128         28    11
PIC16F883 4096 256     256         24     11
PIC16F884 4096 256     256         35     14
PIC16F886 8192 368     256         24     11
PIC16F887 8192 368     256         35     14
で、882/883/886は28ピン、884/887は、40ピンです。
 
 まず、Lチカから始めます。
 
 PIC16F883は、今まで勉強したPIC16F84や16F88と比べると次のような点が違います。
 
 SFR(Special Function Register)が、BANK0~BANK3の4つあります。それだけ、いろいろな設定ができるようです。どのレジスタがどのバンクにあるか覚えるのは至難の業です。そこで、レジスタのバンク指定は、BANK DETECTIVEを使うことにします。つまり、BANKSEL BANK名と書くと自動的にBANKを指定してくれます。
 
 RB0のタクトスイッチを押すとRA0のLEDが点灯するプログラムです。(RB0は10KΩでプルアップ)電源は単3電池×2=3Vです。
 
イメージ 1
 
 ブレッドボードです。
 
イメージ 2
 
アセンブラ・ソースリストです。
 
    LIST P=PIC16F883
    INCLUDE P16F883.INC
 
;--------------------------------
;コンフィギュレーションの設定
;--------------------------------
 __CONFIG _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOREN_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDTE_OFF & _INTOSCIO 
 __CONFIG _CONFIG2, _WRT_OFF
 
    ORG  0X00
    GOTO SETUP
    ORG  0X04
 
SETUP
    BANKSEL ANSEL
    CLRF ANSEL ;アナログモードを使用しない
    CLRF ANSELH
    BANKSEL OSCCON
    MOVLW 70h
    MOVWF OSCCON ;CLOCK=8MHz
    BANKSEL TRISA
    CLRF TRISA ;RAは全て出力
    MOVLW 0FFh
    MOVWF TRISB ;RBは全て入力
    CLRF TRISC ;RCは全て出力
    BANKSEL PORTA
    CLRF PORTA  ;POARAクリア
    CLRF PORTB  ;PORTBクリア
    CLRF PORTC  ;POATCクリア
 
MAIN
    BTFSC PORTB,0  ;PB0が0になったらスキップ
    GOTO LEDOFF  ;RB0が1ならLEDOFFへ
LEDON
    MOVLW 01h
    MOVWF PORTA  ;RA0=1
    GOTO MAIN
LEDOFF
    MOVLW 00h
    MOVWF PORTA  ;RA0=0
    GOTO MAIN
 
    END
 
今回は、内部オシレータを使い、8MHzにセットしています。
方法は、CONFIGで、 _INTOSCIOとして、OSCCONに70hをセットします。
MOVLW 70h
 MOVWF OSCCON
 
PORTBは、ウィークプルアップできるので、やってみましたが、不安定なので、プルアップ抵抗をつけました。
 
 

6m VKが聞こえる

$
0
0
 夕方6mバンド(50MHz帯)をワッチすると、VK4AGMのCWが、50.100MHzで599で入感していました。
 
 さっそくコールして、599のレポートをもらいました。
 
 VK4AGMは、オーストラリアのブリスベンの局です。
 
 ちなみに、当局は、4elヤギ(20mH)に100Wでした。
 
 彼(George)によると夏以来、初めてのJA オープンとのこと。
 
 50MHzでDXが聞こえる季節ですね。
 
 最近は、7MHzでのQRP運用が中心ですが、たまには、50MHzもワッチしたいと思います。

PIC16F883その2

$
0
0
前回と同じ回路で、スイッチを押すと1秒ごとにLEDが点滅するプログラムです。
まず、100usのルーチンを作り、それを利用して1sのルーチンを作ります。
これらのタイマールーチンは、様々な場面で活用することができます。
 
CONFIGとSETUPは同じです。
レジスタは、20hから確保します。
 
;----------------------
;レジスタ
;----------------------
     CBLOCK 020h
     CNT1s ;1sカウンタ
     CNT5ms ;5msカウンタ
     CNT100us ;100usカウンタ
     ENDC
 
MAINプログラムは、RB0に接続されたタクトスイッチを押すと1秒ごとにLEDがON・OFFします。
 
MAIN
     BTFSC PORTB,0    ;RB0=0(スイッチが押されたら)ならLED_BLINKへ
     GOTO MAIN    ;RB0=1ならMAINへ
LED_BLINK
     MOVLW 01h
     MOVWF PORTA   ;LED ON
     CALL wait1s    ;1秒待つ
     MOVLW 00h
     MOVWF PORTA   ;LED OFF
     CALL wait1s    ;1秒待つ
     GOTO MAIN
 
;==============================
; タイマールーチン
;============================== 
;--------------------
; 1s WAIT
;--------------------
wait1s
     MOVLW d'200'
     MOVWF CNT1s
wait1s_loop
     CALL wait5ms
     DECFSZ CNT1s,F
     GOTO wait1s_loop
     RETURN
;--------------------
; 5ms WAIT
;--------------------
wait5ms
     MOVLW d'50'
     MOVWF CNT5ms
 wait5ms_loop
     CALL wait100us
     DECFSZ CNT5ms,F
     GOTO wait5ms_loop
     RETURN
;--------------------
; 100us WAIT
;--------------------
 wait100us
  ;1サイクル(4クロック)0.5us
  ;100us=0.5us×200サイクル
      MOVLW d'65' ;1
      MOVWF CNT100us ;1
 wait100us_loop
      DECFSZ CNT100us,F ;1
      GOTO wait100us_loop ;2
      RETURN   ;2+1 
Viewing all 440 articles
Browse latest View live