文書の表示以前のリビジョンバックリンクPDF の出力全て展開する/折り畳むODT 出力文書の先頭へ この文書は読取専用です。文書のソースを閲覧することは可能ですが、変更はできません。もし変更したい場合は管理者に連絡してください。 ====== ワイヤレスLCD(赤外線データ通信) ====== ===== 概要 ===== LCDは製作する装置に内蔵して利用するのが一般的です。 しかし、離れた場所に設置するような装置では、常時LCDに表示する必要はありません。 つまり、確認する必要が生じた時のみ、LCDを持って行き接続し、データを表示をさせれば良い事になります。 そうすることにより、装置の小型化や低消費電力化を図ることが出来ます。 通常は、装置とLCDの接続は、コネクタ(ケーブル)で行いますが、今回は、赤外線を利用(ワイヤレス)して、非接触でデータ通信を行い、LCDにデータを表示させました。 非接触のメリットは、 * コネクタの抜き差しの手間が省ける。 * 雨天であっても、装置に近づけるだけでデータが表示できる。(つまり装置の蓋を開ける必要がない) 等が考えられます。 {{:imgpaste:202004:htmikan-20200430-144854.png?500}} クライアント側に実装する、ユーザアプリケーションのために、「ワイヤレスLCD制御ライブラリ」を提供します。 ライブラリの仕様は、mikroCコンパチブルとしました。従って、関数名さえ変更すれば、どちらのライブラリでも同じように動作させることが出来ます。 |<500px>| ^ mikroC版LCD制御ライブラリ ^ ワイヤレスLCD制御ライブラリ\\ <ユーザアプリケーションより呼び出します> ^ | Lcd_Init | Lcd_Init_Remote | | Lcd_Out | Lcd_Out_Remote | | Lcd_Out_Cp | Lcd_Out_Cp_Remote | | Lcd_Chr | Lcd_Chr_Remote | | Lcd_Chr_Cp | Lcd_Chr_Cp_Remote | | Lcd_Cmd | Lcd_Cmd_Remote | ===== 動作原理 ===== ワイヤレスLCDは、 * LCDのサービス(機能)を提供する側【サーバ(Server)】 * LCDのサービスを利用する側【クライアント(Client)】 より構成されます。(クライアント・サーバ方式) {{:imgpaste:202004:htmikan-20200430-145115.png?500}} ===== 動作原理(ハードウェア) ===== ◎赤外線の送信 高輝度赤外線LED(OSIR5113A)を使用します。 <赤外線LED(OSIR5113A)> {{:imgpaste:202004:htmikan-20200430-145222.png}} ◎赤外線の受信 テレビ・ビデオ等のリモコンに使用されている受光モジュール(SPS-443)を使用します。 ピンフォトダイオード、アンプ、フイルター回路が内蔵されています。 38kHzの副搬送波で振幅変調された赤外線のみを検出する事(ノイズ対策)が出来ます。 <赤外線リモコン受信モジュール(SPS-443)> {{:imgpaste:202004:htmikan-20200430-145229.png}} ◎副搬送波(38kHz)の発生 PIC内蔵のCCPモジュールをPWMモードで使用し、38kHzを発生させます。 ===== 動作原理(ソフトウェア) ===== ◎提供関数(クライアント側) * Lcd_Init_Remote();\\ LCDを初期化します。 * Lcd_Out_Remote(char row, char column, char *text);\\ 行(row)と列(column)を指定して、LCDに文字列(text)を表示します。 * Lcd_Out_Cp_Remote(char *text);\\ カレントカーソルに、LCDに文字列(text)を表示します。 * Lcd_Chr_Remote(char row, char column, char out_char);\\ 行(row)と列(column)を指定して、LCDに文字(out_char)を表示します。 * Lcd_Chr_Cp_Remote(char out_char);\\ カレントカーソルに、LCDに文字(out_char)を表示します。 * Lcd_Cmd_Remote(char out_char);\\ LCDにコマンド(out_char)を送信します。 ※mikroCコンパチブルにしましたので、詳細については、其方(HELP)を参照してください。 ※動作確認のため、クライアント側には、PIC16F88を使用しましたが、他のPICでも同様に動作します。 ◎メイン処理 スイッチ(SW1)の設定により、サーバ側、クライアント側を切り替え、各処理を呼び出します。 SW1=GND→サーバ側(Lcd_Server関数) SW1=Vdd→クライアント側(Lcd_Client関数) ◎クライアント処理 副搬送波(38kHz)を発生させるために、CCPモジュールをPWMモードで初期化します。 A/D変換を行い、サーバ側に表示データを送信します。 ※ユーザアプリケーションは、このクライアント処理を修正して、実装します。 ◎サーバ処理 LCDおよびUSARTを初期化します。 クライアントからのデータを受信します。 受信データを解析し、LCDを制御します。 ===== 回路図 ===== {{:imgpaste:202004:htmikan-20200430-145426.png}} ===== ソースコード ===== <code c remote_lcd.c> //********************************************************************** /* <ワイヤレスLCD(赤外線データ通信)> */ //********************************************************************** //■マクロ定義 #define BYTE unsigned short #define WORD unsigned int #define DWORD unsigned long // sbit SW at RA5_bit; #define EOF 0x00 // sbit LED at RB1_bit; #define ON 1 #define OFF 0 //LCD sbit LCD_RS at RB6_bit; sbit LCD_EN at RB7_bit; sbit LCD_D7 at RA1_bit; sbit LCD_D6 at RA0_bit; sbit LCD_D5 at RA7_bit; sbit LCD_D4 at RA6_bit; sbit LCD_RS_Direction at TRISB6_bit; sbit LCD_EN_Direction at TRISB7_bit; sbit LCD_D7_Direction at TRISA1_bit; sbit LCD_D6_Direction at TRISA0_bit; sbit LCD_D5_Direction at TRISA7_bit; sbit LCD_D4_Direction at TRISA6_bit; //********************************************************************** //■関数宣言 extern void main(); extern void Lcd_Server(); extern void Lcd_Client(); extern void Lcd_Init_Remote(); extern void Lcd_Out_Remote(char row, char column, char *text); extern void Lcd_Out_Cp_Remote(char *text); extern void Lcd_Chr_Remote(char row, char column, char out_char); extern void Lcd_Chr_Cp_Remote(char out_char); extern void Lcd_Cmd_Remote(char out_char); extern void Lcd_Send_Chr(unsigned short dt); extern void Lcd_Send_Str(unsigned short* pData); //********************************************************************** //■メイン関数 void main() { OSCCON = 0b01110000; TRISA = 0b11111111; TRISB = 0b00001100; // LED = OFF; // if (SW == 1) { Lcd_Client(); } else { Lcd_Server(); } } //********************************************************************** //■ワイヤレスLCDサーバ関数 void Lcd_Server() { char dt, cnt, buf[32]; // ANSEL = 0b00000000; // Lcd_Init(); Lcd_Cmd(_LCD_CURSOR_OFF); Lcd_Cmd(_LCD_CLEAR); for (cnt = 0; cnt < 16; cnt++) { Lcd_Chr(1, cnt + 1, 0xFF); Delay_ms(50); } for (cnt = 0; cnt < 16; cnt++) { Lcd_Chr(2, cnt + 1, 0xFF); Delay_ms(50); } Delay_ms(1000); Lcd_Cmd(_LCD_CLEAR); // Uart1_Init(1200); // while(1) { cnt = 0; while (1) { if (Uart1_Data_Ready() != 1) { continue; } // dt = Uart1_Read(); if (dt != EOF) { buf[cnt] = dt; cnt++; } else { buf[cnt] = 0x00; LED = ~LED; break; } // if (cnt == 32) { cnt = 0; continue; } } // switch (buf[0]) { case 'A': Lcd_Out(buf[1], buf[2], &buf[3]); break; case 'B': Lcd_Out_Cp(&buf[1]); break; case 'C': Lcd_Chr(buf[1], buf[2], buf[3]); break; case 'D': Lcd_Chr_Cp(buf[1]); break; case 'E': Lcd_Cmd(buf[1]); break; } } } //********************************************************************** //■ワイヤレスLCDクライアント関数 void Lcd_Client() { char buf[16]; WORD ad; // ANSEL = 0b00001111; // Lcd_Init_Remote(); // while (1) { ad = Adc_Read(0); ad = ad * 4.8828125; WordToStr(ad, buf); Lcd_Out_Remote(1, 1, buf); Lcd_Out_Cp_Remote("mV"); // ad = Adc_Read(1); ad = ad * 4.8828125; WordToStr(ad, buf); Lcd_Out_Remote(1, 9, buf); Lcd_Out_Cp_Remote("mV"); // ad = Adc_Read(2); ad = ad * 4.8828125; WordToStr(ad, buf); Lcd_Out_Remote(2, 1, buf); Lcd_Out_Cp_Remote("mV"); // ad = Adc_Read(3); ad = ad * 4.8828125; WordToStr(ad, buf); Lcd_Out_Remote(2, 9, buf); Lcd_Out_Cp_Remote("mV"); // Delay_ms(100); } } //********************************************************************** //■ワイヤレスLCD初期化関数 void Lcd_Init_Remote() { Pwm1_Init(38000); // 38kHz duty=50% Pwm1_Set_Duty(PR2 / 2); Pwm1_Stop(); } //********************************************************************** //■ワイヤレスLCD文字列出力(行列指定)関数 void Lcd_Out_Remote(char row, char column, char *text) { Lcd_Send_Chr('A'); Lcd_Send_Chr(row); Lcd_Send_Chr(column); Lcd_Send_Str(text); Lcd_Send_Chr(EOF); } //********************************************************************** //■ワイヤレスLCD文字列出力(カレント位置)関数 void Lcd_Out_Cp_Remote(char *text) { Lcd_Send_Chr('B'); Lcd_Send_Str(text); Lcd_Send_Chr(EOF); } //********************************************************************** //■ワイヤレスLCD文字出力(行列指定)関数 void Lcd_Chr_Remote(char row, char column, char out_char) { Lcd_Send_Chr('C'); Lcd_Send_Chr(row); Lcd_Send_Chr(column); Lcd_Send_Chr(out_char); Lcd_Send_Chr(EOF); } //********************************************************************** //■ワイヤレスLCD文字出力(カレント位置)関数 void Lcd_Chr_Cp_Remote(char out_char) { Lcd_Send_Chr('D'); Lcd_Send_Chr(out_char); Lcd_Send_Chr(EOF); } //********************************************************************** //■ワイヤレスLCDコマンド出力関数 void Lcd_Cmd_Remote(char out_char) { Lcd_Send_Chr('E'); Lcd_Send_Chr(out_char); Lcd_Send_Chr(EOF); } //********************************************************************** //■ワイヤレスLCDデータ送信(1文字)関数 void Lcd_Send_Chr(unsigned short dt) { short cnt; //start-bit Pwm1_Start(); Delay_us(833); Pwm1_Stop(); //data-bit(LSB.....MSB) for (cnt = 0; cnt < 8; cnt++) { if ((dt & 0b00000001) != 0) { Delay_us(833); } else { Pwm1_Start(); Delay_us(833); Pwm1_Stop(); } // dt >>= 1; } //stop-bit Delay_us(833); // Delay_ms(10); } //********************************************************************** //■ワイヤレスLCDデータ送信(文字列)関数 void Lcd_Send_Str(unsigned short* pData) { while (*pData != 0x00) { Lcd_Send_Chr(*pData); pData++; } } //********************************************************************** </code> ===== 動作確認 ===== 下側:ワイヤレスLCD(クライアント)です。※左下が、赤外線LEDです。 上側:ワイヤレスLCD(サーバ)です。※左上が、赤外線リモコン受信モジュールです。 {{:imgpaste:202004:htmikan-20200430-145540.png?500}} 左側:ワイヤレスLCD(クライアント)です。 右側:ワイヤレスLCD(サーバ)です。 {{:imgpaste:202004:htmikan-20200430-145551.png}}{{:imgpaste:202004:htmikan-20200430-145555.png}} ワイヤレスLCD(クライアント)から送信された表示データを、ワイヤレスLCD(サーバ)でLCDに表示します。 {{:imgpaste:202004:htmikan-20200430-145601.png}}{{:imgpaste:202004:htmikan-20200430-145605.png}} <callout type="warning" title="著作権表示 copyright notice"> このページは稲崎様の閉鎖したHPのコピーで、著作権は稲崎様にあります。[[elechobby:picdic:picdic|詳細]] This page is a copy of Mr. Inasaki's closed website, and the copyright is held by him.[[elechobby:picdic:picdic|Details]] </callout> elechobby/picdic/pic16f88/144.txt 最終更新: 2025/10/17 14:29by 127.0.0.1