編集履歴一覧に戻る
KazHatのアイコン画像

KazHat が 2021年03月01日17時41分09秒 に編集

コメント無し

本文の変更

概要 ==== ロータリーエンコーダを使用して使いやすいデジタル時計を作ることを目指しました。表示は見やすくするためできるだけ大きなサイズのディスプレイと考え、2.8インチのLCDを採用しています。 主な使用部品 ==== - PIC 18F26K22: 28ピンDIPパッケージというちょうどよいサイズ、64KBというPICとしては十分なメモリ(本当はもっとメモリは欲しいです)、電源は2.3V~5.5V対応と、どれをとっても使いやすいPIC。秋月電子で価格290円で購入。 - 2.8インチ SPI 240x320ドットLCD: eBayにて900円ほどで購入。電源電圧は5V、3.3Vどちらもいけます。ジャンパで切り替える仕様ですが、5V仕様のまま3.3Vでも動作させられました。インタフェースはSPI。 タッチにもなっていて、別インタフェースですが、SPIで接続できます。ただし、昨今のスマホと異なり抵抗膜タイプです。 完全独立してSDカードのスロットとインタフェースも搭載されいます。(今回は未使用) - RTC (リアルタイムクロック): RTC8025モジュール 秋月で450円で購入しました。I2Cインタフェースで接続。 - 温湿度センサ: AM2320 確かeBayで購入。価格は160円ほどだったと思います。秋月でも取り扱っていますが、少しお高い。 -40~80℃の範囲で0.1℃単位ですが0.5℃精度の温度計、0~99.9%の0.1%step、3%の精度の湿度計になっています。インタフェースは、I2Cまたは、SPIと両対応。 - ロータリーエンコーダ: 秋月にて購入した24クリックタイプ。ALPINEのEC12シリーズのもの。80円 DIP化基板(同秋月)60円を利用。 時間変更する時、アラーム時刻変更などの時に活用。 - 照度センサ フォトトランジスタNJL7502L。秋月で2個入り100円。 周囲光に応じてLCDのバックライトを調整するために使用。 - 圧電スピーカ 秋月にて13mmサイズのものを使用。30円。アラーム用に使用。 - スライドSW アラームのオンオフをコントロールするために使用。 - 電源 現状、PICKIT2から3.3V供給しています。最終形では、USB電源を3.3Vレギュレータで降圧して供給することを想定しています。 LCDのバックライト以外は、5Vでも動作するものばかりなので、5V電源、バックライトだけ何かしらの対応という解もあるかも。 回路図 ==== ![キャプションを入力できます](https://camo.elchika.com/de589cf1b03b0bae2b667e7aeb97c992a58d5ae1/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f31366135336537332d623631642d346264652d393364642d3464366364646238653162312f66386639626430632d336132392d343138312d626138392d623934356634363966613866/) 作成した回路 ==== ![キャプションを入力できます](https://camo.elchika.com/1ddcb6be6d112da1c35c49a02ff2ac4ffb6d4be9/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f31366135336537332d623631642d346264652d393364642d3464366364646238653162312f32373764333636372d346339632d343962322d613065612d623933303131303962653864/) 1枚のブレッドボードに乗りきらなかったので、2つに分かれています。配線が多すぎて銅配線されているかわかりにくいかもしれませんので、少し説明します。 左側のボードには、PIC、フォトトランジスタ、動作確認用緑色LED、バックライト制御用トランジスタが搭載されています。 左下に青と黒の配線が束になって画面外に出て行っていますが、これがLCDにつながっています。回路図で示したように主にPICと接続されています。 画面右側へ伸びている信号は、PICkit2との接続信号で、プログラムの書き込みに使用されますが、現状、電源供給もこちらから行っています。 右側のボードには、上から、圧電スピーカ、温湿度センサ、ロータリーSW、RTCが搭載されています。いくつか抵抗が見えますが、プルアップ抵抗です。詳しくは回路図をご覧ください。 なお、回路図にある、3.3Vレギュレータ、外部電源消失時のバックアップ電源のスーパーキャパシタは搭載されていません。ご了承ください。 動作 ==== 2つの画面モードをもっています。 ![キャプションを入力できます](https://camo.elchika.com/77ab938558c42ebef3f612417c08ff3b07babe5d/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f31366135336537332d623631642d346264652d393364642d3464366364646238653162312f61633334306436652d306162312d343231352d383537332d323033386630633431336265/) ![キャプションを入力できます](https://camo.elchika.com/f6def50921de1f63df43b4005ce2bcdd7dea6c5e/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f31366135336537332d623631642d346264652d393364642d3464366364646238653162312f33376461366437342d373739362d343836372d393131302d343262373431346565643234/) 切替はカレンダー部をタッチすることで行えます。 ケースはアクリル板とかで製作したいと思っていますが、まだチャレンジできていません。その辺にあった段ボールで作ったものなので、少し見栄えがよろしくありませんが、意外としっかりしています。LCDは、きちんとネジで止めてあります。 時刻を変更したい時は、時間の所を長押しすると、色が変わって変更できるようになります。ロータリーSWを回すと、普通の時計のように時刻を進めたり、遅らせたりできます。時刻の場合、1クリックで1分変更になりますが、早回しすると、2倍速~8倍速で進めることができるので、初期設定とかでたくさん変更しようとする場合も苦にならないようプログラムしています。 同様に、日付の所を長押しすると、押した場所によって、年、月、日の色が変わり、ロータリーSWで修正ができるようになります。 長押しすると、OK、Cancelボタンが出て、OK押すと設定した状態が反映されます。時間の設定の時は、OKで0秒スタートとなります。 通常の状態では、いつでもロータリーSWを回してアラーム時刻を変更できるようになっています。スライドSWでアラームのオン、オフができます。アラームなった時は、画面タップでスヌーズするようになっているので、目覚まし時計としての最低限の機能は有していると思っています。 通常は、時間の修正はほとんど必要ないので、使う機能として、アラーム時刻をロータリー、アラームのオンオフをスライドSWと2つのインタフェースだけで使えるのが人にやさしいと思っています。 過去に作った時計ではプッシュSWしかインタフェースとして持たせられず、ボタン数を最小限にしたため、長押しも2種類設けたり、かなりトリッキーなインタフェースになってしまっていました。また、時刻の調整もボタンだけで行うというのが、かなり使い勝手に影響していたなと思えたので、ロータリーSWは時計というものに対してよいインタフェースと思いました。 プログラムは、MPLAB X、XC8 (V2.20)を使って組み上げました。 プログラム自体はかなり長いので、割愛します。すでにプログラムは、64Kバイトの容量に対して87%のサイズになっているので、何か入れようとするとメモリの制限を気にしなくてはいけない状況になります。 日付、温度表示のフォントがギザギザなのは、8x8ドットレベルのフォントを見やすいように拡大表示したためです。大きなフォントを作ればよいわけですが、その分メモリを消費するので悩ましいです。8x8ドット文字なら、1文字8バイト、それを日付と同じ2倍サイズ、16x16ドットになると4倍の32バイトとメモリを食うのですよね。使う文字だけなら良いのですが、アルファベット+数字とか考えると100文字レベルのデータが必要になり、すぐKB(キロバイト)レベルの消費になってしまうのですよね。コンパイラもフリー版なので、最適化が十分されず大きめのコードを出すので、より制約を受けるのですよね。それが使用部品のPICの所に書いたメモリ問題なのですよね。

+

プログラムも構成をまず追記します。 ソースは、 main.c / main.h AlarmSound.c / AlarmSound.h Draw.c / Draw.h font.h LCD320x240color.c / LCD320x240color.h RTC8025.c / RTC8025.h TempHumidityAM2320.c / TempHumidityAM2320.h TouchXT2046.c / TouchXT2046.h その他MCCで生成されたソースファイル群がありadc, ccp5, device_config, epwm1, epwm3, ext_int, i2c2_master, interrupt_manager, mcc, memory, pin_manager, spi1, tmr0~6がcプログラムと、headerという形で構成されています。