UMEHOSHI ITA TOP PAGE    COMPUTER SHIEN LAB

UMEHOSHI ITA基板に取り付けたESP32のMicroPythonで、WiFiによる遠隔操作する。(サーバー側)

esp32側をpythonでTCPサーバーにし、それを付けたUMEHOSHI ITA基板側のモータ制御ROM関数を呼び出してモータを動かす構成の紹介です。
これでPCからWifiを介し、esp32で次の制御を行います。
その制御は、ファイルの転送、esp32側のファイルリスト取得、Pythonファイルの実行です。
よって、Pythonファイルがモータ制御であれば、Wifiを介した遠隔でモータ制御ができます。

ロボットのハード構成

ロボットのハード構成は、こちらのページで紹介しています。

UMEHOSHI ITA基板に取り付けたESP32のMicroPythonのインストールとMicroPythonの実行

MicroPythonのインストールは、こちらのページで紹介している内容で行います。

これを行うには、UMEHOSHI ITAをスルーモードで行います。
この状態は、PCとUSBで接続してPC側の「Tera Term」のターミナルで、MicroPythonの会話モードが動作できます。
UMEHOSHI ITAをスルーモードにする操作:
  SW1とSW2を押し、SW1を離してLED1が消灯に変わるまでSW2を押す。約3秒)

UMEHOSHI ITAをスルーモードとは、接続したUSBでPCから送った情報がそのままUARTを介してESP32に送られるモードで、逆にESP32が出力した情報はPCへ送信されます。

この状態で、PC側のampyコマンドを使うことにより、ESP32へのファイル転送操作やESP32側でのpythonプログラムの実行ができす。
ampyの使い方は、こちらのページで紹介しています。

UMEHOSHI ITA基板のモータ制御プログラムのEEPROM化と、その初期化関数及びUART1コマンドモード起動のEEPROM化

EEPROM化は、こちらのページで紹介している内容で行います

これを行うには、UMEHOSHI ITAをUART1コマンドモードで行います。
この状態は、UARTでUMEHOSHI ITAで、UART1やUSBで受信した'S'、'R'、'G'から始まる文字列命令「UME専用Hexコマンド」を処理できます。
 (なおUMEHOSHI ITAをUART1コマンドモードにする操作は、
   SW1とSW2を押し、SW1を離してLED1が消灯し、それから点灯に変わるまでSW2を押す。約4秒)

このROM化により、PCとUSBで接続してPC側の「Tera Term」のターミナルEEPROM内のエントリーポイントの文字列を送るだけで、対応する関数を起動できます。
例えば、「Tera Term」からEEPROMのブザーを鳴らすエントリポイントを実行する"R009D020D00003B"の文字列を送ると、 START:9D020D00の応答文字列で応答すると共にブザーが鳴ります。
R009D020D00003B
START:9D020D00

なお、ESP32の起動メッセージなど余計な文字列も表示されますが、それは無視してください。
このUMEHOSHI ITAをUART1コマンドモードでは、 ESP32がUMEHOSHI ITAをのUART1に接続されるため、 ESP32のMicroPythonのprintで出力した'S'、'R'、'G'から始まる文字列は UMEHOSHI ITAの命令「UME専用Hexコマンド」として処理さているのです。


さて 上記操作は UMEHOSHI ITAをUART1コマンドモードにするために約4秒が必要になっていますが、 その待ち時間無しで初めからUART1コマンドモードで起動させます。
同時にエコーモードオフと、前述のEEPROM内の モーターのPWM制御などの初期化関数AdrStart(0x9D020010番地)を行う次の関数を、ROM化します。
それには、次のコードをumehoshiEditの開発ツールで実行させます。

#include <xc.h> 
#include "common.h"

#define BASE_FUNC   0x9D020000 // EEPROM領域配置用(パワーONでないリセット操作の実行アドレス)
#define AdrEsp32Init (BASE_FUNC+0x1000)	// ESP32 の初期化関数
#define AdrStart     (BASE_FUNC+0x0010) 	// アプリの起動時の初期ルーチンのアドレス

// ESP32 の初期化関数 起動アドレス:0x9D020000+0x1000=0x9D021000 
// この0x9D021000を0x9D03fff4番地に記憶しておく予定。
// これで、パワーオン時でSW2(白)スイッチが押した時に実行する。
__attribute__((address( AdrEsp32Init ))) void Esp32Init(void);
void Esp32Init()
{
	_set_int_var(_SPECIFIED_flagEcho, 0); // エコー制御変数を0にして、エコーをOFFにする。
	_set_int_var(_SPECIFIED_uart_command_mode , 1); // UARTコマンドモードに指定する変数を1。
	_set_int_var(_SPECIFIED_mode_change_request , 1); // 上記コマンドモードへの変更要求 
	void (*func)(void) = (void (*)(void) )AdrStart;//モーター制御の初期化関数アドレスの設定
	func(); // 上記モーター制御の初期化
}
上記をumehoshiEditの開発ツールで実行することで、 「エコーOFF、UARTコマンドモード指定、モーター制御の初期化関数」を実行するEsp32Init関数が、0x9D021000番地のROM領域に書き込まれます。

最後に、0x9D021000番地のEsp32Init関数を起動時にSW2(白)で実行できるようにROMの0x9D03fff4番地に記憶します。
それには、「UME専用Hexコマンド」として「S049D03FFF4000010029D63」の文字列をUSBで送ることで実現できます。
(これは_nvm_write_word(a,d)のAPIで実現されています)
この「S049D03FFF4000010029D63」をUSBに送る方法は、umehoshiEditの開発ツールの[Communiaction]タブ内で 直接にキー入力します。
(この[9D03FFF4]番地に[9D021000]の1ワード(4byte)を設定するコマンド文字列を求める方法は、 このページで紹介しています。)