ソースに絡まるエスカルゴ

貧弱プログラマの外部記憶装置です。

【Unity/Arduino】UnityとArduinoの加速度センサを連携してみた

rikoubou.hatenablog.com

 前にUnityとArduinoをSerialで連携させるのをやってみました。

 今度は照度センサではなく、加速度センサを連携させてUnity上の立方体をぐりぐり動かすというのをやっていこうと思います。


1:材料/開発環境
■開発環境

■材料


2:Arduino側の準備
 以下のように回路を組みます。加速度センサのデータシート通りの回路です。
f:id:rikoubou:20180208161502p:plain

 ArduinoUnoに以下のスケッチを書き込みます。

/**
 * Arduino UnoでのKXSC7-2050加速度センサーのスケッチ
 */
const int X_PIN = A3;
const int Y_PIN = A4;
const int Z_PIN = A5;

/* 加速度センサの値の構造体 */
struct Coordinate {
  long cx;
  long cy;
  long cz;
};

/* 角度の構造体 */
struct Angle {
  int ax;
  int ay;
  int az;
};

void setup() {
  Serial.begin(115200) ;
}

void loop() {
  Coordinate c = getCoordinate();
  // showCoordinate(c); // ここのコメントアウトを外して最大値・最小値を記録してください
  Angle a = angleCalculation(c);
  showAngle(a);

  delay(50) ;
}

/**
 * 加速度センサーの値を取得する関数
 */
Coordinate getCoordinate() {
  Coordinate c;
  long x = 0, y = 0, z = 0;

  // 各データを100回読込んで平均化する
  for (int i = 0; i < 100; i++) {
    x = x + analogRead(X_PIN);  // X軸を読込む
    y = y + analogRead(Y_PIN);  // Y軸を読込む
    z = z + analogRead(Z_PIN);  // Z軸を読込む
  }

  c.cx = x / 100;
  c.cy = y / 100;
  c.cz = z / 100;
  return c;
}

/**
 * センサの値から各座標の角度を計算する関数
 */
Angle angleCalculation(Coordinate c){
  // 以下のx,y,zの最大値最小値は各自で測定してください
  int MAX_X = 524, MAX_Y = 514, MAX_Z = 526;
  int MIN_X = 222, MIN_Y = 214, MIN_Z = 227;

  // 各座標の1度あたりの角度を計算
  float oneAngleX = (MAX_X - MIN_X) / 180.000;
  float oneAngleY = (MAX_Y - MIN_Y) / 180.000;
  float oneAngleZ = (MAX_Z - MIN_Z) / 180.000;

  // 各座標の角度を計算
  Angle a;
  a.ax = (c.cx - MIN_X) / oneAngleX - 90;
  a.ay = (c.cy - MIN_Y) / oneAngleY - 90;
  a.az = (c.cz - MIN_Z) / oneAngleZ - 90;
  return a;
}

/**
 * 角度を表示する関数
 */
void showAngle(Angle a) {
  Serial.print(a.ax);
  Serial.print(",");
  Serial.print(a.ay);
  Serial.print(",");
  Serial.println(a.az);
}

/**
 * 加速度センサーの値を表示する関数
 */
void showCoordinate(Coordinate c) {
  Serial.print("x:");
  Serial.print(c.cx);
  Serial.print(" y:");
  Serial.print(c.cy);
  Serial.print(" z:");
  Serial.println(c.cz);
}

 Aduino IDEのシリアルモニタを立ち上げて「115200bps」を選択するとコンマ区切りでx,y,zの角度が表示されます。

 角度を計算する関数「angleCalculation」での各座標の最大値、最小値が環境によってブレがあるので、loop関数内でコメントアウトしてあるところを有効にし、加速度センサを傾けて各自で計測して書き換えてください。


3:Unity側のシリアル読み込み準備
rikoubou.hatenablog.com
 前回の記事の3、4の手順でSerialHandlerのスクリプトをアタッチさせたGame Objectまで作成します。


4:TextとCubeを追加する
 Hierarchyで右クリックをし、UI→Textを選択してTextを追加します。
f:id:rikoubou:20180208172027p:plain

 位置やフォントサイズなどを適宜調節して画面上で見えるようにします。
 自分は以下のように設定しました。
f:id:rikoubou:20180208172308p:plain

 続いてHierarchyで右クリックをし、3D Object→Cubeを選択してCubeを追加します。
f:id:rikoubou:20180208172349p:plain

 このCubeの位置や大きさなども適宜調節します。
 自分は以下のように設定しました。
f:id:rikoubou:20180208172634p:plain


5:加速度の値を反映させるための空のGameObjectを作成する
 Hierarchyで右クリックをし、Create Emptyを選択してからのGameObjectを追加し、名前を「SerialCube」に変更します。
f:id:rikoubou:20180208172759p:plain

 次にScriptフォルダを右クリックし、Create→C# Scriptを選択して「SerialCube」という名前でスクリプトファイルを作成します。

 SerialCubeを開いて以下のソースコードを記述します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class SerialCube : MonoBehaviour {

	public SerialHandler serialHandler;
	public Text text;
	public GameObject cube;

	// Use this for initialization
	void Start () {
		//信号を受信したときに、そのメッセージの処理を行う
		serialHandler.OnDataReceived += OnDataReceived;
	}

	// Update is called once per frame
	void Update () {

	}

	/*
	 * シリアルを受け取った時の処理
	 */
	void OnDataReceived(string message) {
		try {
			string[] angles = message.Split(',');
			text.text = "x:" + angles[0] + "\n" + "y:" + angles[1] + "\n" + "z:" + angles[2] + "\n"; // シリアルの値をテキストに表示

			// Vectorは前から順番にx,y,zだけど、そのままセットすると
			// Unity上の回転の見た目が変になるので、y,zの値を入れ替えている。
			Vector3 angle = new Vector3(float.Parse(angles[0]), float.Parse(angles[2]), float.Parse(angles[1]));
			cube.transform.rotation = Quaternion.Euler(angle);
		} catch (System.Exception e) {
			Debug.LogWarning(e.Message);
		}
	}
}

 SerialCubeの記述が完了したら、SerialCubeのソースをHierarchyの「SerialCube」にドラッグ&ドロップして追加します。
f:id:rikoubou:20180208173409p:plain

 追加したらHierarchyの「SerialCube」を選択し、InspectorにあるSerialHander、Text、CubeにそれぞれのGameObjectを設定します。
f:id:rikoubou:20180208173503p:plain


6:Unityで実行する
 ArduinoとPCをUSBケーブルで接続した状態で作成したUnityのプロジェクトを実行します。
 加速度センサを傾けると以下のようにUnity上のCubeも傾きます。


 以上がUnityと加速度センサを連携してみた結果です。
 現実の傾きと画面上の傾きが連動するというただそれだけですが、実際にやってみるとなかなか楽しかったです。


・参考資料

【Blender/Sculptris】Sculptrisで作成したモデルとテクスチャをBlenderに取り込む

rikoubou.hatenablog.com

 前回の記事でSculptrisでモデルを作成してモデル本体の「.objファイル」とテクスチャの「.pngファイル」を作成しました。

 今回はそれらのファイルをBlenderに取り込むまでをやっていこうと思います。


1:Blenderをインストールする
www.blender.org

 上記Blenderの公式ページからOSに合ったBlenderをダウンロードしてインストールします。(※自分はMacOSBlender 2.79の環境でやっています)


2:Blenderを立ち上げて.objファイルをインポートする

 Blenderをインストールして起動させると以下のような画面になります。
f:id:rikoubou:20180129133635p:plain

 左上にある「File」→「import」→「Wavefront(.obj)」をクリックし、読み込ませたい.objファイルを選択してインポートします。
f:id:rikoubou:20180129133825p:plain

 するとキューブに埋没してますが、.objファイルが読み込まれて画面に表示されます。
f:id:rikoubou:20180129134200p:plain

 キューブが邪魔なので右側にあるアウトライナーの「Cubeを右クリックしてDelete」もしくは「Cubeの横にある目のアイコンをクリックして非表示」にします。(以下の画像ではCube自体をDeleteで削除しています)
f:id:rikoubou:20180129134516p:plain

 これでキューブが消えて読み込んだモデルのみになります。
f:id:rikoubou:20180129134711p:plain


3:Blenderにテクスチャファイルを読み込ませる

 モデルの読み込みができたので、今度は作成したテクスチャファイルを読み込ませます。

 右側にあるアウトライナーのモデルを選択、テクスチャのアイコンをクリックして「Newボタン」をクリックします。
f:id:rikoubou:20180129135624p:plain

 するとTextureが追加されます。追加されたTextureの「Openボタン」をクリックして、読み込ませたいテクスチャファイル(.png)を開きます。
f:id:rikoubou:20180129140037p:plain

 読み込ませるとPreviewのところにテクスチャが表示されます。
f:id:rikoubou:20180129140230p:plain

 ただこれだけではモデルに反映されないので、次の手順でモデルにテクスチャを適用させます。


4:Blenderのモデルにテクスチャファイルを適用させる

 3の手順まで終わったら、Defaultと表示されている右側のアイコンをクリックして「UV Editing」を選択します。
f:id:rikoubou:20180129140538p:plain

 すると以下のようなUV(テクスチャ)編集画面になります。
f:id:rikoubou:20180129140749p:plain

 右下にある「Object Mode」を「Edit Mode」に切り替えます。
f:id:rikoubou:20180129140943p:plain

 Edit Modeに切り替えたら、その横にある「Mesh」→「UV Unwrap」→「Unwrap」を選択します。
f:id:rikoubou:20180129141408p:plain

 次に左画面の下にある「Open」をクリックして再び同じテクスチャファイル(.png)を開きます。
f:id:rikoubou:20180129141650p:plain

 ここまでできたら「Default」画面に切り替えます。
f:id:rikoubou:20180129141805p:plain

 Default画面に切り替わると、こんな感じになっているはずです。
f:id:rikoubou:20180129142016p:plain

 モデルが表示されている画面の下にある「Edit Mode」を「Object Mode」に切り替えます。
f:id:rikoubou:20180129142111p:plain

 「Object Mode」と表示されている右横のシェーダーをクリックし「Material」を選択します。
f:id:rikoubou:20180129142414p:plain

 これでようやくモデルにテクスチャが適用されて色がつきます。やったー!
f:id:rikoubou:20180129142601p:plain


 以上がSculptrisで作成したモデルとテクスチャをBlenderに取り込んだ流れです。

 テクスチャの取り込み部分が手順が多いですが、これでBlenderへの取り込みができるようになりました。

 別のソフトで作成したファイルでも拡張子が対応していれば同じ手順で取り込みが可能だと思います(未検証)。


 次の記事では取り込んだこのモデルをアニメーションさせるところまでやりたいと思っています。


・参考資料

【Sculptris】Sculptrisで3Dモデリングやってみた

 こんにちは、割と早いスパンでの更新です。

 昨今バーチャルYoutuberというのが流行ってますね。自分も最近彼ら彼女らの動画を見ていて「3Dやってみるか」と思い立ちました。

 何もわからないままとりあえずググってみたところ、Sculptrisという無料のモデリングツールを紹介しているページを見つけ、それに従ってなんとかモデルを作成するところまでできました。

 今回は全く3Dをやったことがない素人の自分がモデリングをやってみたその備忘録です。


1:Sculptrisをインストールする
pixologic.com
 上記がSculptrisの公式ページです。「Free Download」ボタンをクリックしてOSを選択した後、いくつかの情報を入力するとダウンロードが開始されます。
 ダウンロード後はインストーラーに従ってインストールすればOKです。


2:Sculptrisでモデルを作成する
yamakatu.blog.so-net.ne.jp
 こちらのブログ様の「モデリングソフト Sculptris 使い方 1〜7」に従って操作をしていけばモデルを作成することができます。

 ちなみに2時間程度で作成した自分の人生初モデルはこちらです。
f:id:rikoubou:20180120215248p:plain

 適当にペイントまでしたのがこちら。
f:id:rikoubou:20180120215312p:plain


3:Sculptrisで作成したモデルデータを保存する
yamakatu.blog.so-net.ne.jp
 こちらの「他のソフトで引き続きモデリングする時は」の記事に従って.objファイルとして保存します。この.objファイルは「物体の情報のみで色情報は含まれていない」ので注意が必要です。
 色の情報はPAINTモードで「show advanced tools」をオンにして「SAVE TEXMAP」をクリックすることで色データの.pngファイルを保存します。

 これら.obj、.pngのファイルを別のソフトに読み込ませることで、作成したモデルを動かしたりすることができるようになります。


 以上が人生初の3Dモデリングの備忘録です。調べれば素人の自分でも簡単に3Dモデリングができる今の時代は素晴らしいと感じました。非常にわかりやすい操作説明をまとめていただいた引用元のブログ様に感謝です。

 次はこのモデルをBlenderに読み込ませて簡単なアニメーションをさせるところまでやりたいと思っています。


・参考資料


・次の記事
rikoubou.hatenablog.com

【Unity/Arduino】UnityとArduinoを連携してみた

 明けましておめでとうござます。ブログのネタがないまま放置していたら気づいたら年が明けていました。

 久々の記事ですがタイトルにある通りUnityとArduinoを連携させてみました。

 具体的にはArduinoで取得した照度センサーの値をシリアルでUSBから送り、Unityの画面上に表示させるというものです。

 では説明していきます。


1:材料/開発環境
■開発環境

■素材


2:Arduino側の準備
 以下のようにArduino側の回路を組みます。
f:id:rikoubou:20180116164959p:plain

 Arduino Unoに以下のスケッチを書き込みます。

void setup() {
  Serial.begin(115200);
}
 
void loop() {
  int v = analogRead(0);
  Serial.println(v);
  delay(1000);
}

 Aduino IDEのシリアルモニタを立ち上げて「115200bps」を選択すると
1秒ごとに照度センサーの値が表示されます。

 照度センサーのところを指で押し付けたり離したりすると値が変化します。


3:Unityで新しいプロジェクトを作成&ビルド設定
 Arduino側の準備ができたら次にUnityを立ち上げて新しいプロジェクトを作成します。

 新しいプロジェクトを作成したらFile→Build Settingsをクリックします。
f:id:rikoubou:20180116170258p:plain

 立ち上がった画面の下にあるPlayer Settingsボタンをクリックして
出てきたInspectorのOther Settingsにある「Api Compatibility Level」を
「.NET 2.0」に変更します。
f:id:rikoubou:20180116170525p:plain


4:空のGameObjectを作成しSerialHandlerスクリプトをアタッチする
 Hierarchyを右クリックし「Create Empty」を選択して空のGameObjectを追加します。
 その空のGameObjectの名前を「SerialHandler」に変更します。

 次にAssetsを右クリックし、Create→FolderでScriptフォルダを作成します。

 そのフォルダの中に入って再び右クリックし、Create→C#Scriptを選択して
「SerialHandler」の名前でスクリプトファイルを作成します。

 作成されたスクリプトファイルをダブルクリックして以下のようにソースを記述します。(ポート名のところは適宜変更してください)

using UnityEngine;
using System.Collections;
using System.IO.Ports;
using System.Threading;

public class SerialHandler : MonoBehaviour
{
	public delegate void SerialDataReceivedEventHandler(string message);
	public event SerialDataReceivedEventHandler OnDataReceived;

	public string portName = "/dev/tty.usbmodem1421"; // ポート名(Macだと/dev/tty.usbmodem1421など)
	public int baudRate    = 115200;  // ボーレート(Arduinoに記述したものに合わせる)

	private SerialPort serialPort_;
	private Thread thread_;
	private bool isRunning_ = false;

	private string message_;
	private bool isNewMessageReceived_ = false;

	void Awake()
	{
		Open();
	}

	void Update()
	{
		if (isNewMessageReceived_) {
			OnDataReceived(message_);
		}
		isNewMessageReceived_ = false;
	}

	void OnDestroy()
	{
		Close();
	}

	private void Open()
	{
		serialPort_ = new SerialPort(portName, baudRate, Parity.None, 8, StopBits.One);
		//または
		//serialPort_ = new SerialPort(portName, baudRate);
		serialPort_.Open();

		isRunning_ = true;

		thread_ = new Thread(Read);
		thread_.Start();
	}

	private void Close()
	{
		isNewMessageReceived_ = false;
		isRunning_ = false;

		if (thread_ != null && thread_.IsAlive) {
			thread_.Join();
		}

		if (serialPort_ != null && serialPort_.IsOpen) {
			serialPort_.Close();
			serialPort_.Dispose();
		}
	}

	private void Read()
	{
		while (isRunning_ && serialPort_ != null && serialPort_.IsOpen) {
			try {
				message_ = serialPort_.ReadLine();
				isNewMessageReceived_ = true;
			} catch (System.Exception e) {
				Debug.LogWarning(e.Message);
			}
		}
	}

	public void Write(string message)
	{
		try {
			serialPort_.Write(message);
		} catch (System.Exception e) {
			Debug.LogWarning(e.Message);
		}
	}
}

 ソースの記述が終了したらSerialHandlerのスクリプトファイルを
SerialHandlerのオブジェクトにドラッグ&ドロップしてアタッチします。
f:id:rikoubou:20180116171948p:plain


5:Textを作成しSerialLightスクリプトをアタッチする
 Hierarchyを右クリックしUI→Textを選択してTextを追加します。
 追加したTextをクリックしInspectorのFontSizeや座標位置、表示範囲などを調整します。

 自分の設定値はこんな感じにしました。
f:id:rikoubou:20180116172840p:plain

 次にAssetsのScriptフォルダを右クリックし、Create→C#Scriptを選択して
「SerialLight」の名前でスクリプトファイルを作成します。
 作成されたスクリプトファイルをダブルクリックして以下のようにソースを記述します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class SerialLight : MonoBehaviour {

	public SerialHandler serialHandler;
	public Text text;

	// Use this for initialization
	void Start () {
		//信号を受信したときに、そのメッセージの処理を行う
		serialHandler.OnDataReceived += OnDataReceived;
	}
	
	// Update is called once per frame
	void Update () {
		
	}

	/*
	 * シリアルを受け取った時の処理
	 */
	void OnDataReceived(string message) {
		try {
			text.text = message; // シリアルの値をテキストに表示
		} catch (System.Exception e) {
			Debug.LogWarning(e.Message);
		}
	}
}

 ソースの記述が終了したらSerialLightのスクリプトファイルを
Textのオブジェクトにドラッグ&ドロップしてアタッチします。
f:id:rikoubou:20180116173335p:plain

 次にアタッチしたTextオブジェクトをクリックしてInspectorを表示させます。
 SerialHandlerとTextのところの右にある○をクリックして
それぞれオブジェクトを対応させます。
f:id:rikoubou:20180116173700p:plain
f:id:rikoubou:20180116173708p:plain


6:Unityで実行する
 ArduinoとPCをUSBケーブルで接続した状態で作成したUnityのプロジェクトを実行します。
 すると以下のようにTextオブジェクト部分に照度センサーの値が表示されるようになります。
f:id:rikoubou:20180116174040p:plain

 センサー部分を指で押し付けたり離したりすると値が変動するのがわかると思います。


 以上がArduinoとUnityを連携してみた内容です。
 シリアルの値をUnity上で取得して反映できることがわかったので、色々なことに使えそうですね。


・追記
 以下の記事で今度は加速度センサと連携させてみました。
rikoubou.hatenablog.com


・参考資料

【mbed】mbedでLチカをやってみた

www.switch-science.com

 スイッチサイエンスなどで売られているmbedを手に入れたので、とりあえずボードに載っているLEDをLチカさせてみました。その時の備忘録です。

mbedを始めましょう!("Let's get started!" in Japanese)

 基本的には上記ページにある通りにやっていけばOKです。大まかな手順としては次のようになります。

  1. mbedのアカウントを作成する
  2. ソースコードを検索する
  3. コードをコンパイルしてダウンロードする
  4. mbedにダウンロードしたファイルをコピーし、実行する

 ではそれぞれの解説です。


1:mbedのアカウントを作成する
 最初にmbedとPCをUSBケーブルで繋ぎます。するとUSBメモリとして認識されるので、その中にある「MBED.HTM」をダブルクリックして開きます。
f:id:rikoubou:20171030131506p:plain

 するとmbedのログインページが開かれるので、右側にある「Sign up」をクリックしてアカウントを作成します。アカウント作成はmbedを始めましょう!のページを参考にしてください。
mbedを始めましょう!("Let's get started!" in Japanese)


2:ソースコードを検索する
 アカウントが作成が終了した先のページの上部にある「Code」をクリックします。
f:id:rikoubou:20171030132121p:plain

 検索欄に「HelloWorld」と入力して検索し、一番上に出てきたソースコードをクリックします。
f:id:rikoubou:20171030132701p:plain

 表示されたページの右側にある「Import into Compiler」をクリックします。
f:id:rikoubou:20171030132909p:plain

 色々尋ねられますが、何も変更せずimportボタンをクリックします。これでソースコードのインポートは完了です。
f:id:rikoubou:20171030133035p:plain


3:コードをコンパイルしてダウンロードする
 今回importしたソースコードはmbedの表面に実装されているLEDをチカチカさせるものです。importした中にある「main.cpp」ファイルがその中身になります。
 mbedに書き込むためには画面上部にある「コンパイル」をクリックします。
f:id:rikoubou:20171030133259p:plain

 コンパイルに成功すると「○○.bin」というファイルがダウンロードされます。


4:mbedにダウンロードしたファイルをコピーし、実行する
 3でダウンロードしたbinファイルをmbedの「MBED.HTM」があるところにコピーします。
 コピーが完了した後、mbedの真ん中あたりにあるリセットボタンを押すと、binファイルが実行されます。
(ここではLチカのソースコードを書き込んでいるのでLEDが点滅します)


 以上がmbedでのLチカまでの方法です。PCがネットに繋がってさえいれば開発環境をインストールする必要がないので、手軽に電子工作を始められる感じはあります。
 ただArduinoなどに比べると値段が5000円以上とちょっと高いので悩みどころという印象です。

 しかし、環境構築をしなくてよい上にソースコードを検索してすぐに試すことができるのは非常に強力だと思うので、mbedもこれから触っていきたいと思います。

【Googleドキュメント】Googleドキュメントで目次を自動生成させる方法

 最近Googleドキュメントでちょっとした書類を作成する場合が出てきたので、備忘録として目次を自動生成させる方法を残しておきます。

 結論から言うと、以下の方法でできます。

  1. 見出し1〜3のどれかで見出しを作成する。
  2. 「挿入」→「目次」→「ページ番号のついた目次画像」を選択する。

1:見出しを作成する
 見出しにしたい文章を選択した状態で以下のように書式を出して「見出し1」〜「見出し3」のうちのどれかを選択すると、見出しが作成されます。
f:id:rikoubou:20171026172055p:plain


2:目次を作成する
 いくつか見出しを作成した後、以下の画像のように「挿入」→「目次」→「ページ番号を付いた目次画像」を選択すると目次が作成されます。
f:id:rikoubou:20171026172325p:plain


 以上、簡単な手順ですがちょっと使わないと忘れてしまうので記録しておきました。


・参考資料
googledocument.blog.fc2.com

【python】UDP通信の方法【ESP32】

 最近ネタがなかったのでサボっていましたが、今回pythonを使ってUDP通信ができるということを知ったのでその備忘録です。また、以下の記事の応用で、スマホではなくpythonからUDPで値を送ってみました。

rikoubou.hatenablog.com



1:pythonUDP通信を行う方法
 結論から言うと以下のプログラムでできます。(python3系)

・send_udp.py

from __future__ import print_function
import socket
import time
from contextlib import closing

def main():
  host = '192.168.4.1' # IPアドレス
  port = 10000 # ポート番号
  sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  with closing(sock):
    while True:
      message = 'A'.encode('utf-8') # 送る文字列(ここでは「A」という文字列を送っている)
      print(message)
      sock.sendto(message, (host, port))
      time.sleep(1)
  return

if __name__ == '__main__':
  main()


2:pythonからUDPで送信された内容をESP32で受信する
 先に挙げた記事内容のスケッチほぼそのままです。

・ESP32_UDP.ino

#include <WiFi.h>
#include <WiFiUdp.h>

const char ssid[] = "ESP32_wifi"; // SSID
const char pass[] = "esp32pass";  // password
const int localPort = 10000;      // ポート番号(pythonのポート番号に合わせる)

const IPAddress ip(192, 168, 4, 1);       // IPアドレス(pythonのIPアドレスに合わせる)
const IPAddress subnet(255, 255, 255, 0); // サブネットマスク

WiFiUDP udp;

void setup() {
  Serial.begin(115200);

  WiFi.softAP(ssid, pass);           // SSIDとパスの設定
  delay(100);                        // 追記:このdelayを入れないと失敗する場合がある
  WiFi.softAPConfig(ip, ip, subnet); // IPアドレス、ゲートウェイ、サブネットマスクの設定

  Serial.print("AP IP address: ");
  IPAddress myIP = WiFi.softAPIP();
  Serial.println(myIP);

  Serial.println("Starting UDP");
  udp.begin(localPort);  // UDP通信の開始(引数はポート番号)

  Serial.print("Local port: ");
  Serial.println(localPort);
}

void loop() {
  if (udp.parsePacket()) {
    char c = udp.read();
    Serial.println(c); // UDP通信で来た値を表示
  }
}

 ESP32に上記スケッチを書き込むと「ESP32_wifi」という名前のSSIDWiFiが飛ぶようになります。pythonを実行するPCで「ESP32_wifi」に接続し、その後「send_udp.py」を実行するとシリアルモニタに「A」という文字列が1秒ごとに表示されます。


 非常に簡単ですが、スマホだけでなくPCからでもUDP通信ができることがわかったので、何か面白いことに役立てたいと思っています。


・参考資料
Pythonでネットワークプログラミング | saito's memo