Azure Sphere MT3620 Grove ShieldでGrove LEDを光らすメモ

Azure Sphere MT3620 Grove ShieldでGrove LEDを光らすメモです。

Azure Sphere側の準備

Azure Sphere MT3620 Development Boardでデバイス登録するまでのメモでデバイス登録が済んでいるので、

で、Wi-Fi設定を行ってLED点滅のサンプルを動かしておきます。

これでもかなり嬉しかったんですが、特につまづくところもなかったので、ここはサラッと来ます。

Azure Sphere MT3620 Grove Shieldを装着

私は共立エレショップさんからAzure Sphere MT3620 Grove Shieldを購入しました。

Azure Sphere MT3620 Grove Shield / #103990343

image

届きました。

image

このようなフォルム。

image

装着口は穴が分かりやすい形になっています。逆には刺さらなくていいですね。

image

がしゃーん。

image

Grove LED赤をGPIO0に挿し込んでおきます。

Blinkのコードを修正する

LEDで点滅しているのは、main.cのInitPeripheralsAndHandlersのところです。

static int InitPeripheralsAndHandlers(void)
{
    struct sigaction action;
    memset(&action, 0, sizeof(struct sigaction));
    action.sa_handler = TerminationHandler;
    sigaction(SIGTERM, &action, NULL);

    epollFd = CreateEpollFd();
    if (epollFd < 0) {
        return -1;
    }

    // Open button GPIO as input, and set up a timer to poll it
    Log_Debug("Opening MT3620_RDB_BUTTON_A as input\n");
    gpioButtonFd = GPIO_OpenAsInput(MT3620_RDB_BUTTON_A);
    if (gpioButtonFd < 0) {
        Log_Debug("ERROR: Could not open button GPIO: %s (%d).\n", strerror(errno), errno);
        return -1;
    }
    struct timespec buttonPressCheckPeriod = {0, 1000000};
    gpioButtonTimerFd = CreateTimerFdAndAddToEpoll(epollFd, &buttonPressCheckPeriod,
                                                   &ButtonTimerEventHandler, EPOLLIN);
    if (gpioButtonTimerFd < 0) {
        return -1;
    }

    // Open LED GPIO, set as output with value GPIO_Value_High (off), and set up a timer to poll it
    Log_Debug("Opening MT3620_RDB_LED1_RED\n");
    gpioLedFd = GPIO_OpenAsOutput(MT3620_RDB_LED1_RED, GPIO_OutputMode_PushPull, GPIO_Value_High);
    if (gpioLedFd < 0) {
        Log_Debug("ERROR: Could not open LED GPIO: %s (%d).\n", strerror(errno), errno);
        return -1;
    }
    gpioLedTimerFd = CreateTimerFdAndAddToEpoll(epollFd, &blinkIntervals[blinkIntervalIndex],
                                                &LedTimerEventHandler, EPOLLIN);
    if (gpioLedTimerFd < 0) {
        return -1;
    }

    return 0;
}

Visual Studioで定数でGPIO0が出てくるので、MT3620_RDB_LED1_REDを置き換えます。

image

正直、定数持っているか分からなかったので、コードヒント嬉しいです。

image

置き換えました。

	Log_Debug("Opening MT3620_RDB_GROVE_GPIO0\n");
    gpioLedFd = GPIO_OpenAsOutput(MT3620_GPIO0, GPIO_OutputMode_PushPull, GPIO_Value_High);
    if (gpioLedFd < 0) {
        Log_Debug("ERROR: Could not open GPIO: %s (%d).\n", strerror(errno), errno);
        return -1;
    }
    gpioLedTimerFd = CreateTimerFdAndAddToEpoll(epollFd, &blinkIntervals[blinkIntervalIndex],
                                                &LedTimerEventHandler, EPOLLIN);

このような感じです。他は変えていません。

いざ書き込み!!→Permission denied でNG

いざ書き込み!!

Remote debugging from host 192.168.xx.xx
Blink application starting
Opening MT3620_RDB_BUTTON_A as input
Opening MT3620_RDB_GROVE_GPIO1
ERROR: Could not open LED GPIO: Permission denied (13).
Closing file descriptors
Application exiting

Child exited with status 0

Permission deniedが出て、だめだった・・・。なにかが足りないようです。

いろいろ調べてみたところmanifestも直す必要

そのままの文言で調べたところ、

Azure Sphere application manifest | Microsoft Docs

こちらにいきつきました。

どうやら、AndroidやHoloLensのように、Manifestファイルで、ちゃんとピン利用を開放する必要があるようです。おおう、なんてセキュア・・・!

image

こちらでapp_manifest.jsonファイルを修正します。

{
  "SchemaVersion": 1,
  "Name" : "Mt3620Blink2",
  "ComponentId" : "            ComponentId              ",
  "EntryPoint": "/bin/app",
  "CmdArgs": [],
  "TargetApplicationRuntimeVersion": 1,
  "Capabilities": {
    "AllowedConnections": [],
    "Gpio": [ 8, 9, 10, 12 ],
    "Uart": [],
    "WifiConfig": false
  }
}

こちらが元ファイル。たしかにGpioのところに0がありません。他はLED用のピンでしょうか。ComponentIdは伏せてあります。

{
  "SchemaVersion": 1,
  "Name" : "Mt3620Blink2",
  "ComponentId" : "            ComponentId              ",
  "EntryPoint": "/bin/app",
  "CmdArgs": [],
  "TargetApplicationRuntimeVersion": 1,
  "Capabilities": {
    "AllowedConnections": [],
    "Gpio": [ 0, 8, 9, 10, 12 ],
    "Uart": [],
    "WifiConfig": false
  }
}

0を加えて書き込みます。

動かしてみる

実際に動かしてみます。

無事動きました!!

これで、いままでのGroveの資産が、少なくともデジタル入出力レベルでは使えそうと思えてきました。

引き続き、IoT的にオンラインと連携できるように頑張ってまいります。

それでは、よきAzure Sphere MT3620 Grove Shield Lifeを!!!