PICマイコン Feed

2015年5月 4日 (月)

TFT LCDによるアナログメーター1

<カテゴリー:PICマイコン

AadigitaltestPICのマイコンを使用して、アンテナチューナーのコントローラーやATUの製作を行ってきましたが、この過程で、SWR計も作ってきました。 PICマイコンに少し、慣れたころ、このマイコンのAD入力にCAA-500のインピーダンス検出DC信号や、SWR検出DC信号を加え、アンテナアナライザーによるインピーダンスやSWRのデジタル表示にトライし、RやXの表示も行えるところまで実験ができましたので、次の目標は、オール自作のアンテナアナライザーと決めました。 左の画像は、CAA500のセンサー基板に、PIC16F1939を使用した自作のマイコンボードとLCDディスプレーを接続し、マイコンで周波数や、SWR、インピーダンス、R、Xを表示させている実験風景です。

アンテナアナライザーのセンサー部分や、広帯域発振回路など、なんとかなりそうですが、これをメカニカルアナログメーターや、キャラクタ表示の液晶で実現してもMFJやコメットと同じなので、面白く有りません。  そこで、マイコンでは、無理と言われる、液晶表示の疑似アナログメーターの実験を始める事にしました。 最近の車のインパネは高精細度の液晶によるスピードメーターやタコメーターがすばらしいデザインの元で実装されております。またKENWOODの最新モデルにも、液晶表示のアナログメーターが実装され、デジタル駆動にもかかわらず、非常にわかりやすいアナログメーターとなっています。 これらの最新技術のLCDアナログメーターに及ばないにしても、安いマイコンと、安い液晶でどこまで、液晶表示のアナログメーターが実現できるかの実験記です。

使うマイコンは、少し役不足ですが、ATUに使ったPIC16F1939。 これで160x128ドットのTFT液晶をドライブします。 液晶は262K色対応で、普通の写真を表示させても、遜色のないカラー画像が表示できるという中国製です。

とりあえずは、TFT LCDを初期設定し、画像や、文字を表示できるところまでトライします。

この実験ボードの配線図です。TFT-LCD.pdfをダウンロード

実験に使うマイコンはROMもRAMもグラフィックLCDをドライブするには小さすぎますので、今回は、基本動作を得とくする事が目的となり、実践版は次の試作までお預けとします。

試用するLCDはDisplaytechのDT018ATFTという品番で、液晶ドライブIC ILI9163Cが内臓されています。 このILI9163Cという台湾製のICはインターネット上でも良くみかけるST7735とコンパチで、ST7735用のイニシャルルーチンでちゃんと初期設定されてしまいます。初期設定が成功したら、後は、ILI9163Cのデータシートを読みながら、ああでもない、こうでも無いと試行錯誤する事になりますが、いつのまにか、文字表示や自作したイメージデータの表示が出来るようになりました。

Pic_lcd_demo

左の画像は、なんとか表示できるようになったので、SWR計の目盛をLCD上に表示させたものです。SWR検出信号をADにつなげば、赤色の指針がSWRを指します。

メーターの目盛は3角関数とピタゴラスの定理を駆使して、描かれており、ブリッジの不平衡電圧を角度に変えて、目盛と同じ式で指針を表示していますので、指示誤差は有りません。

150x50ピクセルくらいの範囲で描画していますので、あまりきれいではありませんが、実験機としては十分です。

ただし、大きな問題があります。

動作がおそろしく遅いのです。

指針が移動するのに、0.5秒くらいかかります。1度移動しようが、60度移動しようが0.5秒です。 これでは、全く使いものにはなりません。  これは、指針も3角関数と、ピタゴラスの定理でXYドットをいちいち計算して表示していたのが最大の原因です。  

これを、指針のドットのみ1度ごとのXYデータの配列として記憶させて置き、測定された指針角度から、このイメージデータを呼び出し、表示させる事にしました。 角度データは80度分必要ですが、とりあえず10度分だけ作って振らせてみました。 指針は赤色で描画した後、一度白色で再描画し、指針を一度消し、次に新しい位置に、赤で描画するという事を繰り返します。 このドット単位での書き換え動作は、目盛と指針が重なった場所の目盛表示を復帰させるのも、ドット単位で行えますので、復帰させるドット情報も簡単に計算できます。 しかし結果は、かなり早くなりましたが、指針のチラツキが目立つようになりました。 まだまだ、改善が必要です。

次に、文字フォントと同じように8x16の書き換え可能なドットパターンを用意し、この範囲に含まれる目盛のドットに加えて、指針のドットも書き込み、これを指針角度に応じて、画面上に再描画させる動作を実験しました。この場合、指針の移動に伴い、旧指針を消すという動作と消えた目盛の復帰動作が不要になりますので、面を書き換える時間増より、コマンド切り替えの回数減少から、LCD側の動作速度がかなり早くなります。 また、ちらつきもほとんど無くなる事も判りました。 ただし、LCDにカラードットを書き込む前のドットパターン作成作業は複雑になりますので、マイコンのクロックを上げたり、16bit RISCタイプに変えるなど、対応が必要になると思われます。

次は、マイコンを16bit品に変え、かつLCDも320x240ドット品に変えて、動作速度の改善に取り組みます。

同じようなLCDをお使いになりたい時の為に、このLCD用の初期設定ルーチンだけですが、以下に示します。

void lcd_CMD(unsigned char CM) {//1-byteコマンド
      RS = 0;
      WR = 0;
      LATD =CM;
      WR = 1;
      RS = 1;
     }
void lcd_DATA(unsigned char DA) {
      WR = 0;
      LATD = DA;
      WR = 1;
     }

void init_LCD() {
      lcd_CMD(0x01);//ソフトリセット
       __delay_ms(120) ;
      lcd_CMD(0x11);//Sleep Out
      __delay_ms(120) ;
      lcd_CMD(0x36);
      lcd_DATA(0xC8);
      lcd_CMD(0x2A);
      lcd_DATA(0x00);
      lcd_DATA(0x00);
      lcd_DATA(0x00);
      lcd_DATA(0x9F);
      lcd_CMD(0x2B);
      lcd_DATA(0x00);
      lcd_DATA(0x00);
      lcd_DATA(0x00);
      lcd_DATA(0x7F);
      lcd_CMD(0x36);
      lcd_DATA(0xAC);
// lcd_CMD(0x29);//Display ON このコマンドは画面クリアーの後が良い。
      lcd_CMD(0x2C);
      __delay_ms(200) ;
 }

TFT LCDによるアナログメーター 2 に続く。

INDEXに戻る

2014年6月20日 (金)

エレキー回路の自作(PIC12F675)

 

<カテゴリ: PICマイコン >

再開局したころから、オートアンテナチューナー(ATU)を模索し、これを自作しようともくろみましたが、挫折が多くて今だに手づかずの状態です。 ここにきて、再度ATUの自作に挑戦しようと思いますが、ATUはそのコントローラーをマイクロコンピューター(マイコン)で作る必要が有り、マイコン開発は避けて通れない状況です。 現役時代はマイコン屋に仕様書を出して、バグを見つけては、ソフト屋をいじめるのが仕事でしたので、自らマイコンソフトを開発した事はありませんでした。 そこで、インターネットでも情報の多いPICマイコンの勉強を始める事にしました。

ハムがマイコンのソフト開発を勉強しようと思えば、最初の教材は、「エレキー」と相場が決まっています。 以下見よう見まねで作ったエレキー回路を紹介します。 なお、ソースファイルは、あまりにも恥ずかしくて公開する自信はありませんでしたが、かなりの方がこの記事にアクセスいただいておりますので、未熟ながら記事の最後の行でダウンロードできるようにしました。

Pickit3_2

使用するマイコンは、開発事例の多い「PIC12F675」とします。秋月で80円で売っていました。 開発環境はMPLAB IDEとHI-TECH Cそれに書き込みアダプターPICkit3です。 書き込みアダプター以外は無償アプリです。

まず、この開発環境構築でトラブリました。メインで使用しているPCはWindows7 64bitバージョンですが、アプリをインストールしてPICkit3を接続してもPICkit3がコネクト状態になりません。USBドライバーがうまくインストールされないようです。Helpをたよりにインターネットで調べていくと、Windows7の64bit版はトラブルらしく、わざわざ解決方法が絵入りで説明されていましたが、私のPCの表示とは一致しません。1日、ああでもないこうでも無いといじったあげく、64bit版を諦めて、Windows XP 32bit版に開発環境を構築する事にしました。インストールが完了し、PICkit3をつなぐと、簡単に認識され、かつファームウェーアーのアップデートを行うということで「OK」をクリックすると、アップデートされ、かつこのPICkit3が正常につながったとコメントがでました。 試に、このファームウェーアーをアップデートしたPICkit3を64bit版のPCにつないでみましたら、こちらも正常に動作するようになりました。  結局、マイクロチップが公式に言っている64bit PCによる不具合ではなく、自社のファームウェーアーにバグが有ったようですね。

やっとPICの開発の勉強ができる環境が整いましたので、PIC12F675の英文データシートとグーグル翻訳を駆使して、ハードの設計を行いました。グーグル翻訳の日本語はほとんど意味が判りません。翻訳された日本語文の中から、判らない単語のみピックアップして、後は英語の原文で理解するのが早いですね。

Elekey675

 上が、このエレキーの全回路図です。 ドットとダッシュの入力端子はマイコンの中の約20KΩの抵抗でプルアップしてあります。送信機に接続されるキー出力はN-MOS FETのオープンドレインとして可能な限り消費電流を減らしました。 また、キーイングのスピード調整は10KΩの可変抵抗で分圧された電圧をマイコンのA/Dコンバーターで読み込み連続可変できるようにし、かつこの可変抵抗器に加える電圧もマーク信号の時だけ加える事により電流を押さえます。 A/Dコンバーターへの信号源出力インピーダンスは10KΩ以下が推奨されていますので、可変抵抗器は20KΩでもOKですが、手持ちが無かったので10KΩとなっています。また、方形波ですが760Hzのサイドトーン信号も出力しています。このサイドトーン信号を実際に使う時は、この端子の後に2段くらいのCRフィルターを設けて高調波を少なくすると聞きやすい音になります。 電源は乾電池3本の4.5Vを想定しています。 CNP1のコネクターはPICkit3を接続する端子で、開発が終われば不要になります。

省電力の配慮をしたのに、SLEEPモード時の消費電流は360μAもあります。乾電池につなぎっぱなしで液漏れせずに使用できる消費電流は、過去の経験から140μAまではOKでしたが、メーカーの判らない100円ショップの電池でも安心していられるのは50μAくらいまでです。SLEEPモードにはいる手順が悪いのか、初期設定が悪いのかと、変更、コンパイル、確認を10数回も繰り返しましたが、一向に改善しません。 もしかしたら、ICが不良品?と予備のマイコンと交換したら、あっさりと直ってしまいました。 動作はすべて正常なのに、SLEEP状態の電流が多いという現象に遭遇しましたら、まず最初にマイコンチップを疑った方が早く解決できそうです。 ICは最初からの不良品ではなく、私が壊したと思われます。なぜなら、一度ラッチアップさせ、マイコンがアッチッチになった事がありましたので。

Elekey675b

最終的な消費電流は以下のようになりました。

マーク出力状態  1.4mA

スタンバイ状態   0.78mA

スリープ状態       1μA以下

マーク信号の出力が終わってから、約3秒後にスリープ状態へ移行します。

左の画像はスタンバイ状態での消費電流を測定したものですが、スリープ状態では、テスターの針はほとんどゼロを指します。 開発ボードにはLEDも見えますが、実際は使っていません。

一応完成したので、キーイングすると、今までのCK-100Aに比べて非常に打ちにくく、さらに時々スリープモードから復帰しません。 CWの短点はコンテストの時など40m秒くらいの長さしかなく、時には35m秒くらいの速さになる事もありますので、通常のチャタリング吸収手法は使えず、とりあえずチャタリング対策なしで設計していました。 キーを自作のキーに変えると、さほど気にならないのですが、GHDのキーにすると、打ちにくさが目立ちます。 そこでGHDキーのチャタリング波形をチェックしてみました。

Elekey675c

左の画像はGHDキーでキーダウンしたときのマイコンのGP4端子の波形です。一応1KΩと0.01μFのフィルターは入っていますがノイズを押さえる効果があっても、チャタリングの吸収は出来ておりません。  チャタリング吸収の為に、通常20~30m秒かけて、入力変化があったと判定させますが、この期間は次の入力を受け付けない訳で、短点、長点メモリーというエレキーには欠かせない機能が制限を受けます。 従い、このキーを受け付けない期間は出来るだけ短くする必要があります。 この為、タイマー0を使ったKey入力の状態チェックは約4m秒くらいで行っていました。 GHDキーのチャタリングを、デジタルストレージオシロで十数回測定した結果、上の画像が一番ひどいチャタリングで幅は5m秒くらいあります。 その為、チャタリング発生中に次のキー状態をチェックする事になり、多重割り込みが発生したり、キー入力を誤判定していたものでした。

キーのチャタリングで5m秒はかなり優秀な方で、手入れが悪いと、10m秒くらいになる事もあります。 よって余裕をみて、タイマー0で割込みが発生してから、約15m秒は次の割込みを禁止し、短点、長点メモリーも機能している事を確かめて、とりあえず逃げました。

ソフト屋からみると、かなり低レベルの部分でトラブりましたが、とりあえず勉強になりました。

しばらく使っていましたが、どうもしっくりいかないので、キー入力のチェック間隔を約16m秒にした上で、割り込み処理中にあった15m秒の割り込み禁止期間は廃止し、かつ長点の長さを従来の3短点から3.3短点に変更しました。 これで、28ワード/分のコンテストスピードでも違和感なく打電できるようになりました。

エレキー用HEXファイルをダウンロード

HEXファイルは説明なしで更新しております。気になる方は最新のファイルをご利用ください。

Eleky675d_2

Elekey675case_2

出来上がったエレーキーは、小さな透明ケースに収納し、FT-450を使った移動運用時に持っていくことにしました。 50MHz 50W運用で時々誤動作がおこりますので、キー出力ラインにLCのフィルターを追加してあります。 LもCもジャンク箱から最初に掴んだものを取り付けましたので、定数は吟味しておりません。

ワンチップマイコンでは無く、プログラムの不要なICによるエレキーの製作はエレキー回路の追加 で紹介しております。

とりあえず、PICマイコンの開発ができるようになりましたので、本来の目的である、ATUの開発に着手しました。 バリコン式ATUの自作 1 を参照下さい。

スリープモードへの入り方、復帰の仕方のみ、ソースファイルを抜粋しました。

void interrupt TimerSleep( void ) {
     if (T0IF == 1) {             // タイマー0の割込み?
          TMR0 = 0x00 ;         // タイマー0の初期化
           if ((GP5 == 0) && (dashfg == 1)) {  
                dotmemofg = 1;
                dashmemofg = 0;
                }
      if ((GP4 == 0) && (dotfg == 1)) {  
             dashmemofg = 1;
             dotmemofg = 0;
             }
       slpcount++;//スリープカウンター
       T0IF = 0;
       }
 if (GPIF == 1) {//sleep modeからの割り込みチェック
       cnt0 = 0;
       GPIF = 0;
       GPIE = 0;
       } 
}

以下main()の中のループの一部です。

if (slpcount > 200) {//スリープカウントが200を超えたら
  GPIF = 0;
  GPIE = 1;
  asm ("sleep");//スリープモードへ
  asm ("nop");//スリープモードから復帰した時のダミー命令
  GPIE = 0;
  }

...

全ソースファイル elekey12f675.cをダウンロード (バグ修正済み)

2017年2月追記

このエレキーの電池は100円ショップの単4アルカリ乾電池3本でしたが、2年8か月でとうとう力尽き、2017年2月に新品と交換しました。

 

2020年11月

プログラムにバグが発見されましたので、XC8用に書き換えて修正しました。

elekey_XC8_version.cをダウンロード

2024年4月

エレキーのWPM速度を表示出来る新エレキーを作り始めました。

 

INDEXに戻る