JJ1WKN Log

自作や移動運用関連のログです。

ElekinoCanDo/Std(ATmega168P版ElekinoCanDo)の試作 その4

2015-10-28 | Tanukino
その4

ElekinoCanDo/Stdはお蔵入りかと思ったのですが、悪あがきをしています。
コマンドとしては、最低限メモリー書き込みと確認だけあればいいので、その他のコマンドは思い切って削除することにしました。
コマンドを1つずつ削除すると、プログラムサイズが小さくなって行きますが、適当に削除しているので、必要な動作に影響する部分を削除しているかもしれません。

そこで「びんぼうでいいの」でテスト環境を構築して、動作の確認をしながら不要コマンドを削除するこにしました。


Pコマンド以外のコマンドと、メモリー内容確認コマンドのP4以降(なぜかP5までしか実装されていないようです)を削除した時点で目標達成です。
--
スケッチが プログラムストレージ領域の 15,978バイト (49%) を使用しています。最大は 32,256バイト です。
--

コマンドの削除は void command_mode () 内の削除したいコマンドのcase文をbreak文までコメント化すればいいようです。
--
// case 12: // A - Iambic mode
中略
// break;
--

ATmega328Pの「びんぼうでいいの」では、メモリー書き込み、再生、送信は動作しています。

ボードをATmega168P/Int.4MHzに変更してコンパイルした結果は、なぜか4バイト小さくなりました。
--
スケッチが プログラムストレージ領域の 15,974バイト (97%) を使用しています。最大は 16,384バイト です。
--

あとは実機でのテストです。

---------------------------------------------------------------------------------------
追記です。

実機でのテストはOKで、ブログ用の撮影も終わったのですが、スリープしません。
そういえば、テストのためにスリープ機能を入れていないのを忘れていました。
スリープ機能を入れたら124バイトオーバーしています。
--
スケッチが プログラムストレージ領域の 16,508バイト (100%) を使用しています。最大は 16,384バイト です
--

もう少しダイエットに励みます。

---------------------------------------------------------------------------------------
追記です。

メモリ リピート機能を削除して、ギリギリですが押し込みました。
送信機系統切替機能も不要なので削除したかったのですが、どこを削除するか分かりませんでした。
送信機系統2は無効にしてありますので、送信機系統は1のママです。
--
スケッチが プログラムストレージ領域の 16,374バイト (99%) を使用しています。最大は 16,384バイト です。
--
使用率は99.93%でATmega168Pの容量をほぼつかいきりました。

というわけで紆余曲折しましたが、ElekinoCanDo/Stdは封印から覚めることができました。


中身です。


送信回路の確認ができるように、パドル側のコネクタに送信確認用のLEDを付けました。
LEDの電源はElekinoCanDo/Stdから拝借しています。半田付けはせず、抵抗の足のテンションで5V端子に接続しています。

ElekinoCanDo/Std(ATmega168P版ElekinoCanDo)の試作 その3

2015-10-26 | Tanukino
その3です。

ElekinoCanDo/StdをUSB充電器に押し込みました。

メモリー数が3個になった以外は同じです。


パドルをつないで動作確認をしてみましたが、コマンドSWとコマンドモード表示LEDは正常に動作しました。
メモリーを書き込もうとPを打ったところ、♪トトツーツートト、アレ、まさにトトツーツートトです。
サイドトーンの周波数を変更するFコマンドは正常に動作していますので、メモリー書き込みだけが動作しないようです。

色々調べてみたところ、原因は//#define FEATURE_MEMORIESでした。
最新バージョンではkeyer_features_and_options.hファイルの構成が変わっていたので、見落としていました。
FEATURE_MEMORIESを追加したところ、案の定ATmega168Pのサイズをかなりオーバーしてしまい、ElekinoCanDo/Stdの目論見は見事に外れてしまいました。
--
スケッチが プログラムストレージ領域の 19,706バイト (120%) を使用しています。最大は 16,384バイト です。
--
使わないコマンドを削ったとしても、3322バイトのダイエットはかなり厳しそうです。

ATmega328Pにするなら、改良版のElekinoCanDoの方にすれば良いので、ATmega168Pで行くならメモリー無しということになります。
メモリー無しなら、コマンドボタン無しにしたかったのですが、速度調整にコマンドボタンは必要なので、コマンドボタン+LEDの中途半端な構成になりそうです。
速度調整を半固定VRに変更してSW無しの方がスマートかもしれません。

ElekinoCanDo/Stdはスタンダードの意味だったのですが、メモリー無しではスタンダードとは言えそうにありません。
ElekinoCanDo/Stdは幻として封印して、ElekinoCanDo/Bsにしようと思います。

このケースは2つ穴を追加してElekinoCanDoに変身させる予定です。

ElekinoCanDo/Std(ATmega168P版ElekinoCanDo)の試作 その1

2015-10-23 | Tanukino
早速ATmega168P版のElekinoCanDoを試作してみました。

ElekinoCanDoと区別するために、とりあえずElekinoCanDo/Stdという名称にしておきます。
ちなみに今後のElekinoCanDoシリーズは、メモリー無し版、3メモリー版(ElekinoCanDo/Std)、5メモリー/ワード単位編集版(現行ElekinoCanDo)、シリアル接続版の展開を予定しています。

機能的にはオリジナルのママなので、ワード単位でのメモリー書き込みなどはできません。
コスト削減効果は50円ですが、在庫のATmega168Pの活用ができるのがメリットです。
メモリー数はいくつでもいいのですが、ElekinoCanDoとの差別化のため3メモリーにしようと思います。

回路図です。
コマンドモード表示用LEDはD03に割り当てました。
他は同じです。


ブレッドボードでテストしてみました。
SLEEP機能の確認もできましたが、デフォルトの10分は長過ぎるので、3分にしようと思います。


以下、変更した設定です。
この設定でArduino IDE 1.6.3でコンパイルすると16kBに収まるので、ATmega168P版を実現できます。

<keyer_settings.h>
#define memory_area_end 511
#define go_to_sleep_inactivity_time 3

<keyer_features_and_options.h>
#define FEATURE_COMMAND_BUTTONS
#define FEATURE_SLEEP
#define OPTION_PROG_MEM_TRIM_TRAILING_SPACES
#define OPTION_DIT_PADDLE_NO_SEND_ON_MEM_RPT

クロックはElekinoCanDoと同様4MHzで省エネ設計を踏襲しました。

avrdudeを使用してArduino as ISPでブートローダー無しで書き込むテスト

2015-10-22 | Tanukino
K3NG Arduino CW KeyerをなんとかATmega168Pで動かそうと検討していましたが、keyer_features_and_options.hで機能を限定しても16KBの壁をクリアすることができませんでした。
スケッチを解析して使用しない機能を削れば実現できそうですが、複雑な内部構造のため断念していました。

一方arduino IDEの環境も年々進歩しており、arduino-0023、arduino-1.0、arduino-1.0.5-r2、arduino-1.6.3の4種類をライブラリなどの環境により使い分けています。
先日 Arduino IDE 1.6.3でK3NG Arduino CW Keyerの機能を限定してコンパイルエラーしてみたところ、下のように16KBの壁に肉薄していました。
--
スケッチが プログラムストレージ領域の 15,726バイト (51%) を使用しています。最大は 30,720バイト です
--

コンパイラも進歩しているようで、サイズもだいぶ小さくなってきました。
プロセッサをATMega168Pに変更してコンパイルしたところ、コンパイルサイズは変わりませんが、ATMega168Pに書き込むことができません。
--
スケッチが プログラムストレージ領域の 15,726バイト (109%) を使用しています。最大は 14,336バイト です
--

ブートローダー無しで書き込めば、ブートローダーの分だけ余裕ができるので、書き込めそうです。
そこで、ブートローダー無しで書き込みできる環境が整っている Arduino IDE arduino-1.0.5-r2でコンパイルしたところ、コンパイルサイズが少しオーバーして書き込めそうにありません。
--
コンパイル後のスケッチのサイズ:17,190バイト(最大容量32,768バイト)
--

Arduino IDE 1.6.3環境でArduino as ISPを使用してブートローダー無しで書き込む方法を探してみました。
tadfmacさんのサイトArduino 1.6でATTiny85やATTiny44を開発できるようにしてみるの記事を見つけて設定してみました。
ようやく、ATmega168P/Int.8MHzでコンパイルできるようになり、思惑通りサイズ内に収まっています。
--
スケッチが プログラムストレージ領域の 15,730バイト (96%) を使用しています。最大は 16,384バイト です。
--

あとはArduino as ISPで書き込むだけですが、upload.toolが見つからないとのエラーで書き込むことができません。
何か設定が足りないようで、Arduino IDE 1.6.3環境でArduino as ISPを使用してブートローダー無しで書き込む方法は断念しました。

とはいうもののArduino IDE 1.6.3環境でコンパイルできるようになったので、hexファイルができているハズなので、これをAVRライターで書き込めば良さそうです。
最近はAVRライターとしてはArduino as ISPしか使用していなので、コマンドラインからavrdude.exeを使用して書き込む方法を探してみました。

しなぷすさんのArduinoISPを汎用AVRライタとして使う(1)に詳細な手順が掲載されています。
avrdude.exeはWinAVRのものを使うようですが、実績のあるArduino IDE arduino-1.0.5-r2から入手しました。
試してみた結果、avrdude.conf、avrdude.exe、libusb0.dllの3つのファイルを任意のフォルダーにコピーすれば動作しました。
コマンドラインで動作するので、バッチファイルを作っておけば毎回同じ設定で動作するので、便利です。

さてArduino IDE 1.6.3環境で作成されたHexファイルですが、コンパイルの最後に一時ファイルの場所が表示されます。
--
F:\arduino-1.6.3\hardware\tools\avr/bin/avr-objcopy -O ihex -R .eeprom C:\Users\wkn\AppData\Local\Temp\build6802101246601032149.tmp/k3ng_keyer.cpp.elf C:\Users\wkn\AppData\Local\Temp\build6802101246601032149.tmp/k3ng_keyer.cpp.hex
--
ここのhexファイルをコピーして使用すればOKです。
Tempフォルダには大量の一時ファイルが残っていたので、消しておきました。
ちなみにArduino IDE 1.7以降は自動的に削除されるようです。

というわけで、ATmega168PでK3NG Arduino CW Keyerが動作するようになりました。
ベースは2.2.2015101801で、以下の機能のみを実装しました。
#define FEATURE_COMMAND_BUTTONS
#define OPTION_PROG_MEM_TRIM_TRAILING_SPACES
#define OPTION_DIT_PADDLE_NO_SEND_ON_MEM_RPT

まだ動作確認をしていませんが、FEATURE_SLEEPを追加してもギリギリ行けそうです。
--
スケッチが プログラムストレージ領域の 16,264バイト (99%) を使用しています。最大は 16,384バイト です
--

FEATURE_POTENTIOMETERの追加は98%でOKでしたが、FEATURE_SLEEPを追加したらオーバーしたので、どちらか一方しか追加できません。
--
スケッチが プログラムストレージ領域の 16,198バイト (98%) を使用しています。最大は 16,384バイト です。
--

TG12864E Tanukino Antenna Analyzer の製作 その3

2015-10-16 | Tanukino
その3です。

グラフィックLCDのTG12864Eを使用したアンテナアナライザーを作っていますが、ポート不足は8MHz内蔵OSC版にすることによりなんとかなりそうです。

今回はSWRが表示されるので、抵抗を総動員して校正してみました。

測定結果です
Xが未知のインピーダンスで、アンテナ端子にソケットを付けて、抵抗を取り替えて測定しました。
FとRがAD変換の結果です。オペアンプで11倍に増幅した値で1024で1100mVです。
もう少し増幅した方が良さそうです。
S0が抵抗から計算したSWRで、S1がFとRから計算で求めたSWRです。


Xに対するS0とS1のグラフを描いてみました。
50Ω付近では合っていますが、離れると低めのSWRとなります。
DDSの出力とのマッチングが取れていないせいでしようか。
バッファアンプを追加してATTを入れれば改善できそうですが、今後の課題として、校正値を利用して、補正してみることにします。


測定されるSWRが低いので、補正用の倍率を掛けてあげれば良さそうです。
Xの値は不明なので、Xと相関がありそうなFと倍率をグラフにしてみました。
微妙に折れ曲がっていますが、4つの区間に分割して直線補間することにしました。


4つの区間の直線の方程式を算出して補正した結果のS2とS0のグラフです。
ほぼ重なっているので、この方式で補正できそうです。


TG12864E Tanukino Antenna Analyzer の製作 その2

2015-10-10 | Tanukino
その2です。

グラフィックLCDのTG12864Eを使用したアンテナアナライザーを作っていますが、グラフィックLCDに13ポート、DDSモジュールのSD9850Mに4ポート、VSWR測定と設定用VRに3ポート、SW用に1ポートの合計21ポートとなり、20ポートしかないArduinoではどうしても1ポート足りません。

122X32モノクログラフィックLCDシールドのように、MGLCDライブラリのシリアル接続機能を使用する手もありますが、Arduinoが2個必要となり複雑になるので、あと1ポート不足ということで、奥の手を使うことにしました。

Arduinoは通常16MHzのクリスタルかセラロックを使用しますが、8MHzの内部CR発振回路にすると、クリスタルを接続する端子がD20とD21として使えるので、合計22ポート使用できるようになります。
今回は、あと1ポート足りないので、この方式で試してみることにします。
8MHz内蔵OSC版のArduinoのブートローダーを書き込むこともできますが、PCとシリアル接続するためのD0ポートを使用するので、デバッグには利用できません。
ターゲットボードへ直接スケッチを書き込めるメリットはありますが、今回はグラフィックLCD表示関連のユーザインタフェースのデバッグはほぼ完了しているので、AVRの抜き差しで対応することとして、ArduinoISPを使用して直接書き込むことにしました。

回路図です。
今回は、ADコンバータのレファレンスを内部リファレンスの1.1Vに変更しました。

DDSモジュールのポートは適当に割り当ててみましたが、ポートの変更が必要になるかもしれません。
これから試作してみますが、NGならシリアル接続を検討しようと思います。

周波数設定用VRをセンスするアナログポートにSWを付けて、電圧の変化でSWが押されたかどうかを判定してもいいかもしれません。
SWの増設ならアナログポート1つあればなんとかなりますね。

TG12864E Tanukino Antenna Analyzer の製作 その1

2015-10-09 | Tanukino
グラフィックLCDのTG12864Eにお絵かきできるようになったので、早速Tanukino Antenna Analyzerを作ろうと思います。
先ずは、ユーザインタフェース部分を作りました。

例によって、びんぼうでいいのに接続してテストします。


開始画面です。
Tanukinonoのロゴから36x47サイズのBMPファイルを作り、ライブラリ付属のツールでヘッダーファイルに変換します。
配列の型を const uint8_t に変更しないとコンパイルエラーとなります。
21文字x8行あると、色々な表示ができます。
SWを押すと次の画面に進みます。


以降はAQM1248A-RN版と同じで、スキャン開始・終了周波数をMHz、100kHzの順に入力します。





この画面でSWを押すとスキャンが開始されます。


スキャン画面です。
スキャン周波数の他にVSWRと、0から121のスキャンIDが表示されます。
今回はY軸にVSWR値を表示するので、122データとしました。
VSWR値はダミーで、スキャン中に手動でVRを操作しています。


スキャンが終了すると、最小のVSWR値と、その時の周波数が表示されます。


SWを押すとグラフが表示されます。
今回はY軸のラベルと目盛線を追加しました。


ここでSWを押すと開始画面に戻ります。