PICから始めよう、遊ぼう、楽しもう、PICキットの構築
周辺モジュールA群 製作編その1
PICキット 周辺モジュールの製作
周辺モジュールと言っても、簡単なものばかりで、製作にてこずる事はありません。
と言うより、笑っちゃう様な物ばかりです・・・
まずは出力装置である、7セグメントLED表示器を作ります。
これが無いと、PICが何をやっているのか分からず、つまんないです
各モジュールの使用方法は「PICキットの遊び方」で紹介していく予定です。
周辺モジュールと言っても、簡単なものばかりで、製作にてこずる事はありません。
と言うより、笑っちゃう様な物ばかりです・・・
まずは出力装置である、7セグメントLED表示器を作ります。
これが無いと、PICが何をやっているのか分からず、つまんないです
各モジュールの使用方法は「PICキットの遊び方」で紹介していく予定です。
NO-003 MAX2719 8桁7セグLEDモジュール(SPI接続)
これは製作しません、買った方が簡単ですし、結構安価に販売されています。
当局はAitendoで購入、ついでに安価なクリスタル(8MHZ、12.8MHZ等)買いました。
購入してそのままモジュールとして使用します。
接続コードの応力で転がってしまうので、板等に固定した方が扱い易いかな・・・
接続は、VDD、GND、CLK、LAT、DATの5ピンです。
これ専用の5ピン接続コードがあると良いです。
それは、このモジュール側は5ピン、反対側は3ピンのSPI用と2ピンの電源用とに
分かれているのが良いです。
もちろん、2ピン電源用と3ピンSPIと、別コードでもOKです。
制御プログラムは基本プログラムに存在します。
詳細は、基本プログラム・ソースファイルを参照して下さい
これは製作しません、買った方が簡単ですし、結構安価に販売されています。
当局はAitendoで購入、ついでに安価なクリスタル(8MHZ、12.8MHZ等)買いました。
購入してそのままモジュールとして使用します。
接続コードの応力で転がってしまうので、板等に固定した方が扱い易いかな・・・
接続は、VDD、GND、CLK、LAT、DATの5ピンです。
これ専用の5ピン接続コードがあると良いです。
それは、このモジュール側は5ピン、反対側は3ピンのSPI用と2ピンの電源用とに
分かれているのが良いです。
もちろん、2ピン電源用と3ピンSPIと、別コードでもOKです。
制御プログラムは基本プログラムに存在します。
詳細は、基本プログラム・ソースファイルを参照して下さい
NO-004 モジュール間接続コード
ピンソケットと配線コードで作ります。
2,3,4,5、6ピンの各種ケーブルを製作します。
と言うか、実験している内に必要に迫られて、だんだんと増えてきます
簡単に製作できるので、暇な時に各種作っておくと便利です。
6ピンケーブルは、ICSPケーブルとしてPicKit3との接続用としても使用します。
この場合、片方はピンヘッダとなります。
当局は両端ピンソケットの片方側に「両端ロングピンヘッダ」を差し込んで使用してます。
ピンソケットと配線コードで作ります。
2,3,4,5、6ピンの各種ケーブルを製作します。
と言うか、実験している内に必要に迫られて、だんだんと増えてきます
簡単に製作できるので、暇な時に各種作っておくと便利です。
6ピンケーブルは、ICSPケーブルとしてPicKit3との接続用としても使用します。
この場合、片方はピンヘッダとなります。
当局は両端ピンソケットの片方側に「両端ロングピンヘッダ」を差し込んで使用してます。
NO-005 電源分配モジュール
各種モジュールを接続すると、電源ピンが不足してきます。
そのために、5V安定化電源から、このモジュールで分配します。
何の事も無い簡単な回路ですが、無いと意外と困ります。
各種モジュールを接続すると、電源ピンが不足してきます。
そのために、5V安定化電源から、このモジュールで分配します。
何の事も無い簡単な回路ですが、無いと意外と困ります。
NO-006 8MHZ水晶発振モジュール
秋月で売っている16ホール両面基板を2枚連続で使用します。
水晶と固定コンデンサ1個、トリマコンデンサ1個で構成されています。
CPUモジュールにそのまま差し込んで使用するように作っています。
これはシステムクロック生成用で、正確かつ安定した発振をします。
また、トリマで周波数を微調整を可能です。
4XPLL使用で、32MHZ駆動となります。
これが無くともPICは最高32MHZクロックを、低精度ですが内部で生成できます。
その場合、RA4,RA5はI/Oとして使用可能です。
秋月で売っている16ホール両面基板を2枚連続で使用します。
水晶と固定コンデンサ1個、トリマコンデンサ1個で構成されています。
CPUモジュールにそのまま差し込んで使用するように作っています。
これはシステムクロック生成用で、正確かつ安定した発振をします。
また、トリマで周波数を微調整を可能です。
4XPLL使用で、32MHZ駆動となります。
これが無くともPICは最高32MHZクロックを、低精度ですが内部で生成できます。
その場合、RA4,RA5はI/Oとして使用可能です。
NO-007 32.768KHZ水晶発振モジュール
タイマ1用の時計用水晶発振子です。
NO-006と同じピン使用ですので共存できません。
システムクロックとは別個に動作するので、便利
ただし、システムクロックは内部発振となります。
タイマ1用の時計用水晶発振子です。
NO-006と同じピン使用ですので共存できません。
システムクロックとは別個に動作するので、便利
ただし、システムクロックは内部発振となります。
NO-008 ボリウムモジュール
5KΩボリウムとLEDと、トグルスイッチが付いています。
VDDライン、GND、そして、ADC入力、スイッチ入力の2+2ピンとなります。
LEDで減圧しますので、VFの大きいLEDはNGです。
当局使用のLEDのVFは1.7V~1,8V位です。
よってプルアップ電圧は3,3Vとなり、ちゃんと「H」と認識します。
VDD=3.3Vの場合、LEDに抵抗を並列接続すれば使用できますが、光りません。
用途はADCで使用する事を想定しています。
ただし、普通のボリウムですので、せいぜい8bitの解像度が操作性の限界と思います。
当局は7~8bitの解像度でのADC取込みで使用しています。
5KΩボリウムとLEDと、トグルスイッチが付いています。
VDDライン、GND、そして、ADC入力、スイッチ入力の2+2ピンとなります。
LEDで減圧しますので、VFの大きいLEDはNGです。
当局使用のLEDのVFは1.7V~1,8V位です。
よってプルアップ電圧は3,3Vとなり、ちゃんと「H」と認識します。
VDD=3.3Vの場合、LEDに抵抗を並列接続すれば使用できますが、光りません。
用途はADCで使用する事を想定しています。
ただし、普通のボリウムですので、せいぜい8bitの解像度が操作性の限界と思います。
当局は7~8bitの解像度でのADC取込みで使用しています。
NO-009 4bitスイッチモジュール
スイッチモジュールと言いながら、実際にスイッチとして使用しているのは、
コストダウンのためピンヘッダを使用したジャンパピンそのものです。
これにショートさせたピンソケット(ジャンパピン)を差し込んでスイッチ代わりにします。
ジャンパピンは自分で作っても良いですし、秋月でも安価に売っています。
まさに当局らしい、アマチュア品ですね。
回路の抵抗値は5KΩ~22KΩなら何でもOKです。
このモジュールのもう一つの用途は、プルアップです。
PICを入力モードにしている場合、端子解放では入力値は変動しかなり不安定となります。
これを一意に安定化させるために、プルアップやプルダウンを行います。
出力モードでの端子解放・放置はPIC破壊のリスクがあります。
この辺は、回路図には反映されてない場合がありますが、注意事項です。
スイッチモジュールと言いながら、実際にスイッチとして使用しているのは、
コストダウンのためピンヘッダを使用したジャンパピンそのものです。
これにショートさせたピンソケット(ジャンパピン)を差し込んでスイッチ代わりにします。
ジャンパピンは自分で作っても良いですし、秋月でも安価に売っています。
まさに当局らしい、アマチュア品ですね。
回路の抵抗値は5KΩ~22KΩなら何でもOKです。
このモジュールのもう一つの用途は、プルアップです。
PICを入力モードにしている場合、端子解放では入力値は変動しかなり不安定となります。
これを一意に安定化させるために、プルアップやプルダウンを行います。
出力モードでの端子解放・放置はPIC破壊のリスクがあります。
この辺は、回路図には反映されてない場合がありますが、注意事項です。
ロータリーエンコーダ基本処理
PIC16F1705基本プログラムに、
RE処理ルーチンを加えています。
メインルーチン部分をRE用にしました。
16f1705_basic_max7_re01.asm
ここでは、入力ピンは、
REA ⇒ RA0
REB ⇒ RA1
の設定となっています。
状況に応じて、I/Oポートを変更します
メインループ及び「RE_DATA」部分は、
16f1823_basic01.asm
16f1828_basic01.asm
に、そのままコピペ可能です。
NO-011 ロータリーエンコーダ(RE)モジュール
PICのI/Oを2ポートを使用します。
入力は、VDD、REA、REB、GNDの4ピンとなります。
REはクリックタイプとノンクリックタイプがあり、用途に応じて使い分けます。
1パルスずつ使用するには、ノンクリックタイプの方が使い勝手が良いです。
1パルスを抽出するには、ハードウエアで行うか、ソフトウエアで行うかですが、
ここではソフトウエアで行います。
(1)ロータリーエンコーダ 入力パルス処理ルーチン
REはPIC側からは、2つのメカニカルスイッチがON-OFFしてる様に見えます。
そのON-OFFタイミング(位相差)で、1パルスのみならず回転方向を認知できます。
REはPICの速度に対して大変遅い動作なので、割込み等で長時間(数ms以上)
放置しない限り、パルスの取りこぼしは、あまり起こらないです。
メインループの中で、このルーチンを呼び出し続けるのが基本的使用方法です。
1)32bitアップダウンカウントルーチン
右回転でアップカウント、左回転でダウンカウントします。
動作詳細はソースファイルを参照して下さい。
a)引数
基本的に下記の変数は、最初に初期値を設定するのみです。
通常、呼び出して、戻り値を読むだけ
FDA0~FDA3:32bitアップダウンカウンタ
RESP0~RESP2:24bitカウントステップ
REDAT:保存ビットデータ
b)戻り値
FDA0~FDA3の32bit
c)結果フラグ
Wreg=0:状態変化無
Wreg=1:状態変化有
e)呼び出し方法
CALL RE_DATA
2)入力ポート
デジタル入力の設定とし、2ポート使用します。
a)ポート初期設定
TRISx=1(入力設定)、ANSELx=0(デジタル設定)
b)変数初期設定
FDA(x):スタート時の表示値で、正の整数値を指定
ここから指定ステップでアップダウンします。
RESP(x):REの1カウントで変化する数値を指定
この指定ステップ数でFDA(x)が変化します
REDAT:クリア(=0)しておきます
c)使用方法
メインループ内でひたすら呼び出します。
REが回転・カウントした場合、Wreg=1となって戻ってきます。
FDA(x)はREASP(x)で指定したステップで、1カウント分U/Dしています。
PICのI/Oを2ポートを使用します。
入力は、VDD、REA、REB、GNDの4ピンとなります。
REはクリックタイプとノンクリックタイプがあり、用途に応じて使い分けます。
1パルスずつ使用するには、ノンクリックタイプの方が使い勝手が良いです。
1パルスを抽出するには、ハードウエアで行うか、ソフトウエアで行うかですが、
ここではソフトウエアで行います。
(1)ロータリーエンコーダ 入力パルス処理ルーチン
REはPIC側からは、2つのメカニカルスイッチがON-OFFしてる様に見えます。
そのON-OFFタイミング(位相差)で、1パルスのみならず回転方向を認知できます。
REはPICの速度に対して大変遅い動作なので、割込み等で長時間(数ms以上)
放置しない限り、パルスの取りこぼしは、あまり起こらないです。
メインループの中で、このルーチンを呼び出し続けるのが基本的使用方法です。
1)32bitアップダウンカウントルーチン
右回転でアップカウント、左回転でダウンカウントします。
動作詳細はソースファイルを参照して下さい。
a)引数
基本的に下記の変数は、最初に初期値を設定するのみです。
通常、呼び出して、戻り値を読むだけ
FDA0~FDA3:32bitアップダウンカウンタ
RESP0~RESP2:24bitカウントステップ
REDAT:保存ビットデータ
b)戻り値
FDA0~FDA3の32bit
c)結果フラグ
Wreg=0:状態変化無
Wreg=1:状態変化有
e)呼び出し方法
CALL RE_DATA
2)入力ポート
デジタル入力の設定とし、2ポート使用します。
a)ポート初期設定
TRISx=1(入力設定)、ANSELx=0(デジタル設定)
b)変数初期設定
FDA(x):スタート時の表示値で、正の整数値を指定
ここから指定ステップでアップダウンします。
RESP(x):REの1カウントで変化する数値を指定
この指定ステップ数でFDA(x)が変化します
REDAT:クリア(=0)しておきます
c)使用方法
メインループ内でひたすら呼び出します。
REが回転・カウントした場合、Wreg=1となって戻ってきます。
FDA(x)はREASP(x)で指定したステップで、1カウント分U/Dしています。
↑ バックライト無なので、見ずらいです
アッセンブラ版制御ルーチン群 Ver1.0
MSSP(I2Cマスタ)を呼び出します
AQM1602v1.asm
MSSP_I2C_02b.asm
XC8版制御関数群 Ver1.0
AQM1602v1.h
AQM1602v1.c
MSSP02b.h
MSSP02b.c
XC8版AQM1602サンプル
PIC16F1823MSSP_TEST01A.c
PIC16F1705MSSP_TEST01.c
注1)
このソースファイルだけでは動作しません
前述のXC8用ライブラリが必要です。
LEDモジュールを発光させますので、
モジュールが無い場合はソースを変更、
或いはRA4-5ピンをオープンにして下さい
PIC16F1823を使用して動作確認しています
注2)
PIC16F1705版は内容的には同じですが、
PPSレジスタ処理が追加されています。
↑ 文字表示させたところ
割と見易いです
NO-012 AQM1602XA 16桁2行LCD表示モジュール(I2C接続)
秋月で売っている、安価なシリアル接続の16桁2行液晶モジュールです。
これも製作はしません、そのまま使用します。
場合によっては、簡単な自立スタンド等に装着するのも良いかと思います。
AQM1602のマニュアルでは3.3Vが標準使用電圧のようですが・・・
CPUモジュールに直接接続するため、電源電圧は5Vを想定しています。
もちろん、PICもAQM1602も3.3vでも普通に動作します。
ただし、AQM1602初期設定ルーチンの変更が必要です。
バックライトや文字発光がないので、見づらいですが、電力消費がわずかです。
実験・試作用としては十分ですし、電池駆動の機器に使用する場合は有効です。
この手の液晶は、英文字・カナ等表示できる文字種や表示文字数も多く、便利です。
PIC電源電圧が5Vでも3.3Vでも直接駆動可能で、ハードウエア的にも使い易いです。
他の同様な液晶を使用するにしても、制御ルーチンは概ね同じなのも良い点です。
アッセンブラ制御プログラム(Ver1.0)
PIC内臓モジュールである、MSSP(I2C)を使用します
(1)使用変数
1) DSP_ADR : 80H~8FH、C0H~CFH
表示位置アドレスを指定します
1行目の最左側位置は80Hで、最右側位置は8FHとなります。
2行目の最左側位置はC0Hで、最右側位置はCFHとなります。
2) MSADx : 文字列格納アドレス
MSAD0は格納アドレス下位8ビット、MSAD1は上位8ビット
文字列最後にエンドコード00Hが必要です。
(2)主要サブルーチン
1) WRTD :Wレジスタのデータを送信
2) WRTC :WレジスタのLCDコマンドを送信
3) PUTW : Wレジスタの文字コードをDSP_ADRで指定した位置に表示する
4) PUTL : MSADxで指定されたアドレスの連続文字データをLCDに表示、
表示位置開始位置はDSP_ADRで指定
5) PUTL1 : MSADxで指定されたアドレスの連続文字データをLCD1行目に表示
表示開始位置指定はできず、必ず先頭(最左側)から表示
6) PUTL2 : MSADxで指定されたアドレスの連続文字データをLCD2行目に表示
表示開始位置指定はできず、必ず先頭(最左側)から表示
7) CLRLCD : 全画面を消去
8) INIT3_LCD : AQM1602を初期設定します
VDD=3V、2行表示の普通文字です
9) INIT5_LCD : AQM1602を初期設定します
VDD=5V、2行表示
XC8による制御関数群
PIC内臓モジュールMSSPを使用しますので、MSSP制御関数群も必要です。
(1)AQM1602制御関数群
1) AQM_INIT5(void)、AQM_INIT3(void)
VDDが5Vと3.3Vの場合のLCDのイニシャライズを行います
AQM_INIT5がVDD=5V用、AQM_INIT3がVDD=3.3V用となっています
引数:無
返値:無
2) AQM_CMD(unsigned char)
LCDコマンドを送信します
引数:8bitのLCDコマンド
返値:無
3) AQM_WRTD(unsigned char)
LCDデータ(文字コード)を送信・表示します
事前に表示開始位置アドレスを送信しておく事が必要です
連続送信しても表示位置はLCD側が自動インクリメントします
printf()等で使用する低レベル関数はこれを指定します
引数:8bitのLCDデータ
返値:無
4) AQM_PUTC(unsigned char1,unsigned char2)
指定の表示位置に1文字を表示します
引数1:文字コード1バイト
引数2:表示位置アドレス1バイト
返値:無
5) AQM_PUTL(unsigned char1配列,unsigned char2)
指定の表示位置から文字列を表示します(最大32文字)
引数1:文字列格納配列アドレス
引数2:表示開始位置アドレス
返値:無
6) AQM_PUTL1(unsigned char配列)
LCD1行目の最左側から文字列を表示(最大16文字)
引数:文字列格納配列アドレス
返値:無
7) AQM_PUTL2(unsigned char配列)
LCD2行目の最左側から文字列を表示(最大16文字)
引数:文字列格納配列アドレス
返値:無
8) AQM_CLRLCD(void)
LCDの表示をクリア
引数:無
返値:無
秋月で売っている、安価なシリアル接続の16桁2行液晶モジュールです。
これも製作はしません、そのまま使用します。
場合によっては、簡単な自立スタンド等に装着するのも良いかと思います。
AQM1602のマニュアルでは3.3Vが標準使用電圧のようですが・・・
CPUモジュールに直接接続するため、電源電圧は5Vを想定しています。
もちろん、PICもAQM1602も3.3vでも普通に動作します。
ただし、AQM1602初期設定ルーチンの変更が必要です。
バックライトや文字発光がないので、見づらいですが、電力消費がわずかです。
実験・試作用としては十分ですし、電池駆動の機器に使用する場合は有効です。
この手の液晶は、英文字・カナ等表示できる文字種や表示文字数も多く、便利です。
PIC電源電圧が5Vでも3.3Vでも直接駆動可能で、ハードウエア的にも使い易いです。
他の同様な液晶を使用するにしても、制御ルーチンは概ね同じなのも良い点です。
アッセンブラ制御プログラム(Ver1.0)
PIC内臓モジュールである、MSSP(I2C)を使用します
(1)使用変数
1) DSP_ADR : 80H~8FH、C0H~CFH
表示位置アドレスを指定します
1行目の最左側位置は80Hで、最右側位置は8FHとなります。
2行目の最左側位置はC0Hで、最右側位置はCFHとなります。
2) MSADx : 文字列格納アドレス
MSAD0は格納アドレス下位8ビット、MSAD1は上位8ビット
文字列最後にエンドコード00Hが必要です。
(2)主要サブルーチン
1) WRTD :Wレジスタのデータを送信
2) WRTC :WレジスタのLCDコマンドを送信
3) PUTW : Wレジスタの文字コードをDSP_ADRで指定した位置に表示する
4) PUTL : MSADxで指定されたアドレスの連続文字データをLCDに表示、
表示位置開始位置はDSP_ADRで指定
5) PUTL1 : MSADxで指定されたアドレスの連続文字データをLCD1行目に表示
表示開始位置指定はできず、必ず先頭(最左側)から表示
6) PUTL2 : MSADxで指定されたアドレスの連続文字データをLCD2行目に表示
表示開始位置指定はできず、必ず先頭(最左側)から表示
7) CLRLCD : 全画面を消去
8) INIT3_LCD : AQM1602を初期設定します
VDD=3V、2行表示の普通文字です
9) INIT5_LCD : AQM1602を初期設定します
VDD=5V、2行表示
XC8による制御関数群
PIC内臓モジュールMSSPを使用しますので、MSSP制御関数群も必要です。
(1)AQM1602制御関数群
1) AQM_INIT5(void)、AQM_INIT3(void)
VDDが5Vと3.3Vの場合のLCDのイニシャライズを行います
AQM_INIT5がVDD=5V用、AQM_INIT3がVDD=3.3V用となっています
引数:無
返値:無
2) AQM_CMD(unsigned char)
LCDコマンドを送信します
引数:8bitのLCDコマンド
返値:無
3) AQM_WRTD(unsigned char)
LCDデータ(文字コード)を送信・表示します
事前に表示開始位置アドレスを送信しておく事が必要です
連続送信しても表示位置はLCD側が自動インクリメントします
printf()等で使用する低レベル関数はこれを指定します
引数:8bitのLCDデータ
返値:無
4) AQM_PUTC(unsigned char1,unsigned char2)
指定の表示位置に1文字を表示します
引数1:文字コード1バイト
引数2:表示位置アドレス1バイト
返値:無
5) AQM_PUTL(unsigned char1配列,unsigned char2)
指定の表示位置から文字列を表示します(最大32文字)
引数1:文字列格納配列アドレス
引数2:表示開始位置アドレス
返値:無
6) AQM_PUTL1(unsigned char配列)
LCD1行目の最左側から文字列を表示(最大16文字)
引数:文字列格納配列アドレス
返値:無
7) AQM_PUTL2(unsigned char配列)
LCD2行目の最左側から文字列を表示(最大16文字)
引数:文字列格納配列アドレス
返値:無
8) AQM_CLRLCD(void)
LCDの表示をクリア
引数:無
返値:無
NO-013 SC1602BSLB 16桁2行LCD表示モジュール
5V動作のパラレル接続LCDモジュールです。
SC1602Dも同様に使用できます。
表示文字数が多いので、7セグLEDより多彩な表現が可能です。
制御に最低7ピン使用するので、14ピンPICでは空きピンが少なくなり苦しくなります。
また、コントラスト用ボリウムが必要で、CPU基板との相性が悪いです。
よって、コントラスト調整ボリウムを乗っけた、中継基板を使用します。
バックライトがありますので、NO-12:AQM1602より見易いです。
画像を見ると一目で解りますが、
配線数が多く、引き回しが面倒
I/Oポートも多く使うので、ピン数の多いPICが必要
制御プログラムは簡単
LCD価格は安価
中継基板を使うなんてナンセンス
以上もろもろより、PICキットの様な構成に使うのは難がある
これはモジュール化する意味は無いと思われます。
結局、このLCDはNO-014LCDモジュールの部品として使用する事になり、
中継基板はジャンク箱行
この番号は別物に変更するかもしれません。
5V動作のパラレル接続LCDモジュールです。
SC1602Dも同様に使用できます。
表示文字数が多いので、7セグLEDより多彩な表現が可能です。
制御に最低7ピン使用するので、14ピンPICでは空きピンが少なくなり苦しくなります。
また、コントラスト用ボリウムが必要で、CPU基板との相性が悪いです。
よって、コントラスト調整ボリウムを乗っけた、中継基板を使用します。
バックライトがありますので、NO-12:AQM1602より見易いです。
画像を見ると一目で解りますが、
配線数が多く、引き回しが面倒
I/Oポートも多く使うので、ピン数の多いPICが必要
制御プログラムは簡単
LCD価格は安価
中継基板を使うなんてナンセンス
以上もろもろより、PICキットの様な構成に使うのは難がある
これはモジュール化する意味は無いと思われます。
結局、このLCDはNO-014LCDモジュールの部品として使用する事になり、
中継基板はジャンク箱行
この番号は別物に変更するかもしれません。