スキータイム計測機 開発日誌

とある大学生の競技スキー用タイム計測機の開発日誌です。とかいいつつ関係ないことも書きます。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PICで無線モジュール(MU-1N、MU-2)を使う

個人で無線が使えるようになると電子工作の幅がグッと広がります。
今では無線モジュールが通販で買えるので、それを使えば数百m程度のシリアル通信であれば簡単に行うことができます。


今回はサーキットデザインの無線モジュール、「MU-1N」および「MU-2」(互換性あり)の使い方を紹介します。
こんなモジュールです。


2011-02-03-1



すごくちっちゃいです。
このモジュールはPICと同じように5V電源で使用でき、かつUSARTでコマンドが送れるのでPICで扱うにはうってつけです。

ピンは多いですが、電源、GND、TXとRX、CTSさえつなげば快調に動きます。
TXRXはPICのUSARTのピンへ、CTSはGNDに接続してください。


このモジュールには様々なコマンドがありますが、まず使用テストとしていいのがシリアルナンバーを問い合わせるコマンドだと思います。

@SN\r\n

とUSARTで送信すれば向こうからシリアルナンバーが、

*SN=C12345678\r\n

といった感じに返ってきます。コマンドについては取扱説明書に詳しくあります。


ブレッドボードでこんな感じに適当につなぎます。
2011-02-03-2


そしてシリアルナンバーのコマンドを送り、それを液晶の2行目に表示させました。
(液晶にはMU-1NとありますがこのシリアルナンバーはMU-2のものですね)

2011-02-043



シリアルナンバーを液晶に表示させるプログラムを載せておきます。
PICは18F2550、コンパイラはC18です。
しかし16FでもCCSでも基本は変わりません。

#include <p18f2550.h>
#include <delays.h>
#include "usart.h"//一部の関数をいじったためプロジェクトのフォルダに持ってきた
#include <stdio.h>//必要なかったかも
#include <stdlib.h>必要なかったかも
#include "lcdlib18.h"//LCD関数群
#include "keyboard.h"//キーボード関数群


//コンフィギュレーション
#pragma config FOSC = INTOSC_EC
#pragma config FCMEN = OFF
#pragma config PWRT = ON
#pragma config BOR = OFF
#pragma config VREGEN = OFF
#pragma config WDT = OFF
#pragma config PBADEN = OFF
#pragma config MCLRE = OFF
#pragma config LVP = OFF
#pragma config DEBUG = OFF


//USARTコマンド類
char sn[] = "@sn\r\n";
char dt[] = "@dt01a\r\n";

void main(void)
{
    char cmd;//USART受信用
int keynum=0,i;
char snbuf[16],etcbuf[5];
OSCCON = 0x72;//8MHz
LATA = 0;//LED消灯
TRISA = 0b00100000;//A5のみ入力
LATB = 0;
TRISB = 0;
//TXピンのみすぐにHにする!しないとMU-1NがLをスタートビットと勘違いしてしまう
LATC = 0b01000000;
TRISC = 0b10000111;//RX、C0,1,2のみ入力
ADCON1 = 0x0F;//allデジタル入出力

lcd_init();
lcd_cmd(0x0D); //ブリンクON、カーソルOFF
   lcd_cmd(0x06); //メモリ書き込みでアドレス+1
lcd_clear();
lcd_strrom("USART sn MU-1N");

//USART設定
//19200bps、割込あり
OpenUSART(USART_TX_INT_OFF & USART_RX_INT_ON &//RXの割込をONする
USART_ASYNCH_MODE & USART_EIGHT_BIT &
USART_CONT_RX & USART_BRGH_HIGH, 25);

//ここから割り込み設定(優先順位なし、USART受信時のみ割込)
RCONbits.IPEN = 0; //優先順位無効
PIE1bits.RCIE = 1; //RX受信割込有効
//優先順位なしなので優先順位の設定はしない
INTCONbits.PEIE = 1; //周辺割込許可
INTCONbits.GIE = 1; //全体割り込み許可

while(1)
{
keynum = Keyboard_Input1();//待つ
putrsUSART("@sn\r\n");//シリアルデータコマンド送信
Delay10KTCYx(0);
} //無限ループ
}

/************ここからUSART受信割込処理******************/
#pragma interrupt isr1 //高位指定(低位の場合interruptlow)
#pragma code highisr = 0x08 //開始番地指定
void highisr_direct(void) //ジャンプベクタ
{ _asm goto isr1 _endasm } //ジャンプ
#pragma code
void isr1(void)
{
char cmd;
static int bufcounti=0;
static char isrbuf[16];
PIR1bits.RCIF = 0; //割込フラグクリア!

//ここからユーザー処理
cmd = ReadUSART();       //一文字取得
isrbuf[bufcounti++] = cmd;   //バッファに貯めていく
if(cmd == 0x0a)         //MU-1N,MU-2の終了文字
{
isrbuf[bufcounti-2] = 0;//CRLFを無視して終端文字を入れる
lcd_DltLine16(2);    //2行目消去、先頭へ
lcd_strram(isrbuf);   //受信内容をそのまま表示
bufcounti = 0;
LATAbits.LATA0 = ~LATAbits.LATA0;//LEDの出力を反転
}
}



このような感じです。
ところどころ別ソースの関数がありますが、

LCDにRAMのデータを表示させる関数lcd_strram()は、

void lcd_strram(char *str){
while(*str != 0x00){ // 文字列の終わり判定
lcd_data(*str); // 文字列1文字出力
str++; // ポインタ+1
}
}


となります。こちらは後閑哲也氏の「電子工作のための PIC18F本格活用ガイド」などが参考になると思います。


また、keynum = Keyboard_Input1();などのキーボード用の関数は、秋月で売っている4×3のキーボードを使うために作った関数です。
これについては後日また書こうと思います。
この関数はキーボードのキーを何か押すまでまってその数字を返してくれるので、何か押したらコマンド送信、を繰り返します。

また、USART関連の関数をプロジェクトフォルダに持ってきたのは、
デフォルトのUSART送信関数はヌル文字まで送ってくれるためです。
MU-1NなどのモジュールはCRLFが終端文字でヌル文字は必要ありません。
別にあっても動きますが気持ち悪いのでUSART関数を一部変更しました。



うまく使うためにいくつか注意すべき点(嵌りやすい点)があって、


1.TXピンはプログラムが始まってすぐにHにすること。
USARTのTXピンは何もコマンドがないときはHです。なのでLのままだとモジュール側がコマンドが始まったと勘違いして誤動作します。

2.LCDに送る文字列にはかならず終端文字('\0')を入れること
LCDの送信関数が終端文字を最後に決めているので、それをいれておかないと文字化けします。
MU-1Nなどの無線モジュールは最後に'\0'は来ません。
そのかわりCRLF(0x0d,0x0a)が来ますので、最後の0x0aがきたら0x0dの部分に終端文字\0を入れてください。



といったところです。


ちなみにこれらのモジュールは、
1.サーキットデザイン直販
http://www.circuitdesign.jp/

2.フルタカパーツオンライン
http://www.furutaka-netsel.co.jp/index.html

といったところで手に入れることができます。
スポンサーサイト

FC2Ad

まとめ

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。