PIC harmony を使ってESP-WROOM-02 と通信

こんばんは、ファルコンM です。

 

PIC のharmony ライブラリを使って、ESP-WROOM-02と通信する方法。

harmony はPIC32bit で使えるライブラリ。

 

開発環境

  • マイコン PIC32MZ0512EFE064

PICのポート設定

  • UART TX … PIN45 RD11
  • UART RX … PIN44 RD10
  • ESP-WROOM-02 の電源 … PIN61 RE1 ( ※ こちらの環境特有 )

 

プロジェクト作成

MPLAB を立ち上げ File → New Project を選択する。

Categories : Microchip Embedded、Projects : 32-bit MPLAB Harmony Project を選択する。

 

 

Project Location にプロジェクトのパス、Project Name にプロジェクト名、Target Device でマイコンを選択する。

Project Name は Test_32bitと入力する。

Target Device は今回使用する PIC32MZ512EFE064 を選択する。

Finish を押すと、プロジェクトが作成される。

 

Harmony の設定

 

プロジェクトを作成したら、Harmony のビューが自動的に立ち上がる。立ち上がらないときは、Tools → Eembedded → MPLAB Harmony Configurator を選択する。

 

Options → MPLAB Harmony & Application Configuration → Device & Project Configuration で PIC32MZ0512EFE064 Device Configuration を選択する。

ここで、コンフィグレーションビットを設定する。

DEVCFG0 で Background Debugger Enable( DEBUG ) をON にする。これを設定しないとデバックができない。

また、ICE\ICD Comm Channel Select を設定する。デバッカとマイコンが繋がるポートを選択。これは、回路図を見て設定する。

私の環境は、デバッカとつなぐピンは PGEC2、PGED2 を使用していたので、ICS_PGx2 とした。

 

 

Options → MPLAB Harmony & Application Configuration → Harmony Framework Configuration → Drivers を選択。

USART で上記設定をする。

USART Driver Instance0 にチェックを入れ、Band Rate を115200 に変更しただけ。

 

 

PinSettings で設定を変更する。44、45、61 ピンでFunction で選択する。

44ピン U1RX、45ピン U1TX、61ピン GPIO_OUT とした。

61ピンは Name も変更した。Name を変更しないと、コード出力した時、ポート設定の定義が出力されない。

 

Options → MPLAB Harmony & Application Configuration → Application Configuration を選択。wifi アプリケーションを追加する。

Number of Applications を2とする。

新しく Application 1 Configuration が出るので、Application Name にwifi と入力する。

 

以上でharmony の設定が完了した。コード生成のボタンを押してコードを生成する。( ↑の写真の左から5番目のボタン。

 

ソースコード修正

 

  1. 起動したら、ESP-WROOM-02 の電源を入れる
  2. ESP-WROOM-02 から”ready\r\n” を受信したら、起動完了

するだけのプログラム。

 

以下を修正する。

 

wifi.h

 

// enum 追加
typedef enum
{
    WIFI_STATE_START_INIT=0,
    WIFI_STATE_START_EXE,
    WIFI_STATE_START_ALLRECEIVE,
    WIFI_STATE_START_DONE,
} WIFI_STATES_START;

// WIFI_DATA 構造体にメンバを追加
typedef struct
{
    - 略 -

    DRV_HANDLE usartHandle;
    WIFI_STATES_START stateStart;
    uint8_t idxStartRecv;
    void (*callbackStart)();

} WIFI_DATA;

// 外部関数のプロトタイプ宣言
void WIFI_Initialize ( void );
void WIFI_Start( void (*callback)(void) );

wifi.c

// 定義
#define D_WIFI_READY                                        "ready\r\n"

// 内部関数宣言
static void startTasks(void);
static void receiveData(const SYS_MODULE_INDEX index);

// WIFI_Tasks 関数にコード追加
void WIFI_Tasks ( void )
{
    - 略 - 
        case WIFI_STATE_SERVICE_TASKS:
        {
            startTasks();   // 追加
            break;
        }
    - 略 - 
}

// 関数追加
void WIFI_Start( void (*callback)(void) )
{
    if( wifiData.stateStart != WIFI_STATE_START_INIT )
    {
        return;
    }
    
    // USART 開始
    wifiData.usartHandle = DRV_USART_Open(DRV_USART_INDEX_0, DRV_IO_INTENT_READWRITE|DRV_IO_INTENT_BLOCKING );
    if ( wifiData.usartHandle == DRV_HANDLE_INVALID )
    {
        return;
    }
    
    // 受信コールバック設定
    DRV_USART_ByteReceiveCallbackSet(DRV_USART_INDEX_0, receiveData);
    
    // コールバック設定
    wifiData.callbackStart = callback;
    
    wifiData.stateStart = WIFI_STATE_START_EXE;
    
    // Wifi モジュール電源ON
    PowerOn();
    
    return;
}

static void startTasks(void)
{
    switch(wifiData.stateStart)
    {
        case WIFI_STATE_START_ALLRECEIVE:
        {
            if( wifiData.callbackStart != NULL )
            {
                wifiData.callbackStart();
            }
            wifiData.stateStart = WIFI_STATE_START_DONE;
            break;
        }
        default:
            break;
    }
    return;
}

static void receiveData(const SYS_MODULE_INDEX index){
    uint8_t data;
    
    if(!DRV_USART_ReceiverBufferIsEmpty(wifiData.usartHandle))
    {
        data = DRV_USART_ReadByte(wifiData.usartHandle);
        if( data == D_WIFI_READY[wifiData.idxStartRecv])
        {
            wifiData.idxStartRecv++;
        
            if( wifiData.idxStartRecv >= strlen(D_WIFI_READY))
            {
                wifiData.stateStart = WIFI_STATE_START_ALLRECEIVE;
            }
        }
        
    }
}

app.c

// 内部関数宣言
static void callbackStart(void);

// コード追加
void APP_Tasks ( void )
{
    -略-
    case APP_STATE_SERVICE_TASKS:
    {
        WIFI_Start(callbackStart);
        break;
    }
    -略-
}

// コールバック関数の追加
static void callbackStart(void)
{
    return;
}

 

以上。このコードを動かせば、wifi モジュールと通信できる。

 

デバックできない場合は、こちらの記事を参考に。

 

 

スポンサードリンク



コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です