
上に見えるのが子機、下に見えるのが親機です。子機は色んなセンサーがついてるので大きめですが、親機は受信してlcdに表示するだけなので小柄です。なお、lcdは手元に1個しかないので、子機だけに装着しています。
親機にloraの受信コードを書いたのですが、受信しませんでした。何故なんだろう?
もう自力でどうにもならないのでAIと相談しながらやってみる事にしました。そしたらAIちゃんは「pic16f1827の18番ピンに刺し変えて」とか言っちゃうんですよ。pic16f1827のデータシートを見ると18番ピンにはtxもrxも無いんです。7番ピンと8番ピンが正解じゃないか!
しかし、受信できない。
有線なら受信できるのか?
ならば「loraを介せずに、有線で通信はできるのか?」と思い、一旦pic16f1827以外のパーツを取り去りました。
■子機
pic16f1827
- 空き
- 空き
- 空き
- 空き
- ブレッドボードの-へ
- 空き
- 空き
- 親機picの8番へ
- 空き
- 空き
- 空き
- 空き
- 空き
- ブレッドボードの+へ
- 空き
- 空き
- 空き
- 空き
ブレッドボードへmb102で5v供給
※子機と親機のブレッドボードのgnd同士は導線で繋がっている
■親機
pic16f1827
- 空き
- 空き
- 空き
- プルアップ抵抗10k,snapへ
- ブレッドボードの-へ
- 空き
- 空き
- 子機picの8番へ
- 空き
- 空き
- 空き
- snapへ
- snapへ
- ブレッドボードの+へ
- 空き
- 空き
- 空き
- 空き
ブレッドボードへmb102で5v供給
※子機と親機のmb102は同一のもの。
//■子機
#include <xc.h>
#pragma config FOSC = INTOSC, WDTE = OFF, PWRTE = ON, MCLRE = ON, CP = OFF
#pragma config BOREN = ON, CLKOUTEN = OFF, IESO = OFF, FCMEN = OFF
#pragma config WRT = OFF, STVREN = ON, BORV = LO, LVP = ON
#define _XTAL_FREQ 4000000
void init_uart(void) {
OSCCON = 0x6A;
ANSELB = 0x00;
APFCON0 = 0x00; // 子機はデフォルトの8番(TX)から送信
TRISB2 = 0; // 8番(TX)を出力
TXSTAbits.BRGH = 1; // 高速モード
BAUDCONbits.BRG16 = 0; // 8bitタイマー
SPBRG = 25; // 9600bps
RCSTAbits.SPEN = 1;
RCSTAbits.CREN = 1;
TXSTAbits.TXEN = 1;
}
void putch(char c) {
while(!TRMT); // 送信完了を待つ
TXREG = c;
}
void main(void) {
init_uart();
unsigned char id = 1;
unsigned char val = 123;
while(1) {
putch(id);
putch(val);
__delay_ms(1000);
}
}
//■親機
#include <xc.h>
#pragma config FOSC = INTOSC, WDTE = OFF, PWRTE = ON, MCLRE = ON, CP = OFF
#pragma config BOREN = ON, CLKOUTEN = OFF, IESO = OFF, FCMEN = OFF
#pragma config WRT = OFF, STVREN = ON, BORV = LO, LVP = ON
#define _XTAL_FREQ 4000000
unsigned char id, val;
void init_uart(void) {
OSCCON = 0x6A;
ADCON0 = 0x00;
ANSELB = 0x00; // 8番(RB2)をデジタルに
APFCON0 = 0x01; // RXSEL=1で8番ピン(RB2)をRXに設定(LCDが7番ピンを使う為)
TRISB2 = 1; // 8番ピンを入力に設定
TXSTAbits.BRGH = 1; // 高速モード
BAUDCONbits.BRG16 = 0;
SPBRG = 25; // 9600bps
RCSTAbits.SPEN = 1;
RCSTAbits.CREN = 1;
}
char uart_read(void) {
if (RCSTAbits.OERR || RCSTAbits.FERR) {
RCSTAbits.CREN = 0;
RCSTAbits.CREN = 1;
}
while(!PIR1bits.RCIF); // データが届くのを待つ
return RCREG;
}
void main(void) {
init_uart();
while(1) {
id = uart_read();
val = uart_read();
if(id == 1) { //ブレークポイント
NOP();
}
}
}
やはり無線にしたい
でも、目的は遠隔地で受信する事なので、やはりloraを介したい。
次は無線化を試みます。
■子機
pic16f1827
- 空き
- 空き
- 空き
- 空き
- ブレッドボードの-へ
- 空き
- 空き
- プルアップ抵抗10k,loraのrxへ
- 空き
- 空き
- 空き
- 空き
- 空き
- ブレッドボードの+へ
- 空き
- 空き
- 空き
- 空き
E220-900T22S(JP)-EV2
M0 ブレッドボードの-へ
M1 ブレッドボードの-へ
RX picの8番へ
TX 空き
AUX 空き
VCC ブレッドボードの+へ
GND ブレッドボードの-へ
ブレッドボードへmb102で5v供給
※子機と親機のブレッドボードのgnd同士は導線で繋がってない(実用時は遠隔ゆえgnd共有が不可能な為)
■親機
pic16f1827
- 空き
- 空き
- 空き
- プルアップ抵抗10k,snapへ
- ブレッドボードの-へ
- 空き
- 空き
- loraのtxへ
- 空き
- 空き
- 空き
- snapへ
- snapへ
- ブレッドボードの+へ
- 空き
- 空き
- 空き
- 空き
E220-900T22S(JP)-EV2
M0 ブレッドボードの-へ
M1 ブレッドボードの-へ
RX 空き
TX pixの8番へ
AUX 空き
VCC ブレッドボードの+へ
GND ブレッドボードの-へ
ブレッドボードへmb102で5v供給
※子機と親機のmb102は同一のもの。
//■子機
#include <xc.h>
#pragma config FOSC = INTOSC, WDTE = OFF, PWRTE = ON, MCLRE = ON, CP = OFF
#pragma config BOREN = ON, CLKOUTEN = OFF, IESO = OFF, FCMEN = OFF
#pragma config WRT = OFF, STVREN = ON, BORV = LO, LVP = ON
#define _XTAL_FREQ 4000000
void init_uart(void) {
OSCCON = 0x6A;
ANSELB = 0x00;
APFCON0 = 0x00; // 子機はデフォルトの8番(TX)から送信
TRISB2 = 0; // 8番(TX)を出力
TXSTAbits.BRGH = 1; // 高速モード
BAUDCONbits.BRG16 = 0; // 8bitタイマー
SPBRG = 25; // 9600bps
RCSTAbits.SPEN = 1;
RCSTAbits.CREN = 1;
TXSTAbits.TXEN = 1;
}
void putch(char c) {
while(!TRMT); // 送信完了を待つ
TXREG = c;
}
void main(void) {
init_uart();
unsigned char id = 1;
unsigned char val = 123;
while(1) {
putch(id);
putch(val);
__delay_ms(1000);
}
}
//■親機
#include <xc.h>
#pragma config FOSC = INTOSC, WDTE = OFF, PWRTE = ON, MCLRE = ON, CP = OFF
#pragma config BOREN = ON, CLKOUTEN = OFF, IESO = OFF, FCMEN = OFF
#pragma config WRT = OFF, STVREN = ON, BORV = LO, LVP = ON
#define _XTAL_FREQ 4000000
unsigned char id, val;
void init_uart(void) {
OSCCON = 0x6A;
ADCON0 = 0x00;
ANSELB = 0x00; // 8番(RB2)をデジタルに
APFCON0 = 0x01; // RXSEL=1で8番ピン(RB2)をRXに設定
TRISB2 = 1; // 8番ピンを入力に設定
TXSTAbits.BRGH = 1; // 高速モード
BAUDCONbits.BRG16 = 0;
SPBRG = 25; // 9600bps
RCSTAbits.SPEN = 1;
RCSTAbits.CREN = 1;
}
char uart_read(void) {
if (RCSTAbits.OERR || RCSTAbits.FERR) {
RCSTAbits.CREN = 0;
RCSTAbits.CREN = 1;
}
while(!PIR1bits.RCIF); // データが届くのを待つ
return RCREG;
}
void main(void) {
init_uart();
while(1) {
id = uart_read();
val = uart_read();
if(id == 1) { //ブレークポイント
NOP();
}
}
}
loraを介すので回路が変わりましたが、コードは同じです。
これでうまく行く筈……。

と思いきや、いつまで待っても親機で受信しません。
私ではもうコードにも配線にも原因が見つけられません。
他に原因があるとすれば、E220-900T22Sのアンテナ同士が近すぎる事。
今は写真の通り15cmくらいしか離れていません。
これは手元でデバッグしやすくする為なのですが、本来アンテナ同士は何メートルも離れている筈。
E220-900T22S(JP)-EV2のページはこちら
https://dragon-torch.tech/wp-content/uploads/2024/11/DS241012JA_E220-900T22Xv2_Rev.1.0.2.pdf
そしてE220-900T22S(JP)、E220-900T22L(JP)のデータシートがありました。
https://dragon-torch.tech/wp-content/uploads/2024/11/DS241012JA_E220-900T22Xv2_Rev.1.0.2.pdf
しかし、最短距離という記載はありません。
最短距離が無いなら15cmでも送受信できそうですが、次回は2~3mくらい離して検証してみます。
それでも受信できないとなれば、もう、どうすればいいのやら……。


