esp32 + LoRa をやってみた

# 買ったもの

いつも同じものがあるとは限らない...

https://www.aliexpress.com/item/10000151020525.html


内容

- esp32
- LoRa
- 915MHz
- OLEDディスプレイ
- CH9102X USB-serial

## 注意


自分は M1 Mac BigSur [11.6 (20G165)]を使ったが、そのままだとこのボードを認識しなかった。これはCH9102チップのUSBドライバがないためらしく、

https://github.com/Xinyuan-LilyGO/LilyGo-T-Call-SIM800/issues/139#issuecomment-904390716

ここのスレッドで説明されているように、認識させるには製造元のドライバを入れる必要があった。

https://qiita.com/shiura/items/e987004c23b1dbb7e9d7


# TTGO lilygo オフィシャル (と思われる)

https://lilygo.aliexpress.com/store/2090076

こっちで似たようなものを買ったほうが良いかも知れない


# とにかく分からん

どこの商品ページにも適当な画像と適当なリポジトリリンクとがあるだけのざっくりとした説明があるが、そもそも本当に内容が商品とあっているのかも分からん。

> 多分届いた時には送受信できるようにサンプルプログラムがボードそれぞれにアップロードされているはず？だが、そうとは思っていなかったので、片方先に開けたほうを下のgithubのコードで書き換えてしまって、余計に混乱した
もう一方の何もしてない方は通電させるとsenderとして動いていたが、receiver側は既に書き換えてしまっていたので、壊れているのか？コードが悪いのか？全然判断付かなかった

Test Code
https://github.com/LilyGO/TTGO-LORA32-V2.0/tree/LilyGO-868-V1.0

![H30e773c23d07426ca4b524ff86343fed9.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16757/9e876abc-66ee-f284-3380-23d67f9ecabb.jpeg)
![H9cf63887c869483f85382c2b37feaac31.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16757/0c76e351-f04e-78d2-2cb6-8b4a784bcabd.jpeg)

https://github.com/LilyGO/TTGO-LORA32-V2.0/tree/LilyGO-868-V1.0
↓リダイレクトされる
https://github.com/LilyGO/TTGO-LORA32/tree/LilyGO-868-V1.0

とりあえず

- sender
- receiver

それぞれのフォルダが有り

- ソースコード
- 謎のimages.h

がある。謎のimages.hは参照しているが使ってる様子すら無い...

ソースコードのGPIOピン番号と上の画像とで見合わせると、なんとなく番号同士はあっている様子。
が、ボードにアップロードしてもなんとも動かない...

## まずOLEDを表示させられるか（壊れてないか）

- アドレス
- SDA
- SCL

上の画像ではSDA=4、SCL=15につながっている様子で、[githubのコード][1]もそう。
試しに[適当なサンプルコード][2]でやってみるが、OLEDに何も表示されない。

```cpp
#include <Wire.h>
#include "SSD1306.h"//ディスプレイ用ライブラリを読み込み
 
SSD1306  display(0x3c, 4, 15); //SSD1306インスタンスの作成（I2Cアドレス,SDA,SCL）
 
void setup() {
 
  display.init();    //ディスプレイを初期化
  display.setFont(ArialMT_Plain_16);    //フォントを設定
  display.drawString(0, 0, "Hello World");    //(0,0)の位置にHello Worldを表示
  display.display();   //指定された情報を描画
}
 
void loop() {}
```

色々見ていくうちに[0.96インチ単色OLED(128×64,SSD1306,I2C)が載っているESP32マイコンボードで表示を試してみた][3]という似たような事をしているサイトが有り

> OLEDのリセット信号がESP32マイコンのGPIOに結線されている。
なので、自前でリセットの処理をしなくてはならない。

とあったのでやってみるとすんなり表示できた。
（画像ではリセットはGPIO16につながっている様子...）

```cpp
#include <Wire.h>
#include "SSD1306.h"//ディスプレイ用ライブラリを読み込み
 
SSD1306  display(0x3c, 4, 15); //SSD1306インスタンスの作成（I2Cアドレス,SDA,SCL）
 
void setup() {
  pinMode(16, OUTPUT);
  digitalWrite(16, LOW);
  delay(100);
  digitalWrite(16, HIGH);
  delay(100);
 
  display.init();    //ディスプレイを初期化
  display.setFont(ArialMT_Plain_16);    //フォントを設定
  display.drawString(0, 0, "Hello World");    //(0,0)の位置にHello Worldを表示
  display.display();   //指定された情報を描画
}
 
void loop() {}
```

とりあえずOLEDは生きている。

> 後からサンプルコードをよく見ると、[同じことはしてた][8]

## 肝心なLoRaが動かない

ディスプレイは生きてるし、シリアルモニターでloop内も動いてる様子だけど、[ここのpacketSize][4]が入ってこない。
[周波数違いだろう][5]とは検討をつけているが、本当にsender側は915MHzで動いてるのかすらわからない。

一旦指定されていたリポジトリ（LilyGO-868-V1.0）は無視して、[LilyGO-V1.0-915タグ][12]を見てみると、周波数ぐらいしか違わない。ので、変えてみる。
が、`#define BAND    915E6`でも状況は同じ。

相当悩んでネットで色々見てみるけど、同じボード買った人の記事がないし、壊れてるのかなーとか思いながら[ソースコードをよくよく見ると][9]

```cpp
  if (!LoRa.begin(868E6)) { // !!!!
```

### ベタ書き！

なので、

```diff_cpp
-  if (!LoRa.begin(868E6)) {
+  if (!LoRa.begin(BAND)) {
```

こう変えてアップロードしてみたら...すんなり受信しだした。

915MHz送信側のコードも[同じようにベタ書き][10]

868MHzのサンプルコード送信側はなぜか[433MHz][11]...


## 因みにimages.h

こう言う感じにすると"HELTEC"のロゴが出る。

```cpp
#include "SSD1306.h"
#include "images.h"
#include <Wire.h>

SSD1306 display(0x3c, 4, 15);

void setup() {
  pinMode(16, OUTPUT);
  digitalWrite(16, LOW);
  delay(50);
  digitalWrite(16, HIGH);

  display.init();

  display.clear();
  display.drawXbm(0, 0, logo_width, logo_height, logo_bits);
  display.display();
}

void loop() {}
```

[1]: https://github.com/LilyGO/TTGO-LORA32/blob/LilyGO-868-V1.0/OLED_LoRa_Reciver/OLED_LoRa_Reciver.ino#L15
[2]: https://wak-tech.com/archives/825
[3]: http://kako.com/blog/?p=47864
[4]: https://github.com/LilyGO/TTGO-LORA32/blob/LilyGO-868-V1.0/OLED_LoRa_Reciver/OLED_LoRa_Reciver.ino#L67
[5]: https://github.com/LilyGO/TTGO-LORA32/blob/LilyGO-868-V1.0/OLED_LoRa_Reciver/OLED_LoRa_Reciver.ino#L13
[6]: https://github.com/LilyGO/TTGO-LORA32/blob/LilyGO-V1.0-915/OLED_LoRa_Receive/OLED_LoRa_Receive.ino#L13
[7]: https://github.com/LilyGO/TTGO-LORA32/blob/LilyGO-V1.0-915/OLED_LoRa_Receive/OLED_LoRa_Receive.ino#L13
[8]: https://github.com/LilyGO/TTGO-LORA32/blob/LilyGO-868-V1.0/OLED_LoRa_Reciver/OLED_LoRa_Reciver.ino#L41-L44
[9]: https://github.com/LilyGO/TTGO-LORA32/blob/LilyGO-V1.0-915/OLED_LoRa_Receive/OLED_LoRa_Receive.ino#L52
[10]: https://github.com/LilyGO/TTGO-LORA32/blob/LilyGO-V1.0-915/OLED_LoRa_Sender/OLED_LoRa_Sender.ino#L39
[11]: https://github.com/LilyGO/TTGO-LORA32/blob/LilyGO-868-V1.0/OLED_LoRa_Sender/OLED_LoRa_Sender.ino#L43
[12]: https://github.com/LilyGO/TTGO-LORA32/tree/LilyGO-V1.0-915