M5stackからGeminiにアクセス！Cloud Functionsで実現するIoT連携



# はじめに
このチュートリアルでは、M5StackとCloud Functions、そして大規模言語モデルGeminiを連携させて、IoTデバイスからAIの力を活用したアプリケーション開発を行う方法を説明します。


# M5stackとは？
MsStackは、Wi-FiやBluetooth、カラー液晶などを搭載した小型マイコンモジュールです。拡張性が高く、プログラミング初心者でも簡単に電子工作やIoTを始められます。価格は手頃で、教育現場にも最適です。

# Cloud Functionsとは？
Cloud Functionsは、Google Cloud Platform上でコードを実行できるサーバーレスプラットフォームです。イベント駆動型で、コードを書けばすぐに実行でき、サーバー管理の必要がありません。HTTPリクエストやデータベース変更など、様々なイベントに対応できます。

# Gemini, Cloud Functionsと連携するマルチモーダルAI
Geminiは、Google AIが開発した大規模言語モデルで、テキスト、コード、画像、音声など様々な情報を理解し処理することができます。Cloud Functionsと連携することで、M5stackからGeminiへHTTPアクセスを行い、AIの力を活用したアプリケーション開発が可能になります。

# Cloud Functionsの設定
1\. <B>Google Cloud Consoleにアクセス、ログインします。</B>

2\. <B>左側のメニューから「サーバレス」を選択し、「Cloud Functions」を選択します。</B>

3\. Cloud Functionsの画面が表示されます。
![Cloud Functions01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826679/90bf26cf-0513-34dc-1806-a3dac1a8b6ac.png)

4\. <B>「ファンクションを作成」を選択します。</B>
+ 関数名に<code>gemini</code>、リージョンに<code>us-central1</code>を設定します。
+ トリガーのタイプは<code>HTTPS</code>で、認証は<code>未認証の呼び出しを許可</code>を選択します。


![Cloud Functions02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826679/4b147856-f5cd-69d1-9d1a-32f6775ba551.png)

5\. <B>「ランタイム、ビルド、接続、セキュリティの設定」を開き、「割り当てられるメモリ」を<code>512MiB</code>に変更します。</B>

![Cloud Functions03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826679/0184671f-8150-e919-fadb-96ba6e0cd3a3.png)

6\. <B>「ファンクションの作成」画面で、ランタイムを<code>Python 3.12</code>、エントリポイントを<code>gemini</code>に設定します。</B>

![Cloud Functions04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826679/174370d7-3005-b7cf-6abe-efd85fb38193.png)

7\. <code>main.py</code><B>と</B><code>requirements.txt</code><B>の内容をコピペして貼り付けます。</B>
+ <code>vertexai.init(project="project_id", location="us-central1")</code>は自分の環境に合わせて変更してください。

```python:main.py
import functions_framework
import vertexai
from vertexai.language_models import CodeGenerationModel
import json
@functions_framework.http
def gemini(request):
  print("Received data (raw):", request.data)

  try:
    data = json.loads(request.data)
    prefix = data.get("prompt")
  except json.JSONDecodeError as e:
    print(f"JSONデータの解析エラー: {e}")
    return None

  # Vertex AI の初期化
  vertexai.init(project="project_id", location="us-central1")
  
  # 予測に使用するパラメータ
  parameters = {
    "candidate_count": 1,
    "max_output_tokens": 1024,
    "temperature": 0.9
  }
  
  # モデルのインスタンスを作成
  model = CodeGenerationModel.from_pretrained("code-bison")
  
  # 予測を実行
  response = model.predict(
    prefix,
    **parameters
  )
  
  # 結果を返します
  return response.text
```
```python:requirements.txt
functions-framework==3.*
vertexai
```
8\. <B>「デプロイ」ボタンをクリックします。</B>
+ デプロイが完了すると、URLが表示されます。このURLをM5Stackで使用します。
![Cloud Functions05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826679/d26b04c8-d111-ad75-c33a-f34387704a02.png)

# M5stackからの利用
UIFlow 2.0では、以下のブロックを使用してCloud Functionsを呼び出します。
<code>prompt</code>にGeminiに聞きたいことを入れてください。
1\. <B>httpリクエストブロック</B>
+ URLにデプロイしたCloud FunctionsのURLを、<code>prompt</code>にGeminiに聞きたい内容を入力します。
+ httpリクエストブロックの応答変数に、Geminiからの回答が出力されます。
![Cloud Functions06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826679/0d4914ee-8491-cfe8-cd13-82178078a2be.png)

# 後片付け
Cloud Functionsは、使用時間に応じて課金されます。
課金が発生しないようにするには、使用していないCloud Functionsは削除する必要があります。

1\. <B>Cloud Functionsの一覧から<code>gemini</code>を選択して削除します。</B>
![Cloud Functions07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826679/3c6c0c9a-d2b8-472f-9ab7-8883c42e0552.png)

# おわりに
M5Stack、Cloud Functions、Geminiを組み合わせることで、AIの力を活用したIoTアプリケーションを簡単に開発できることがわかりました。

M5Stackの拡張性とCloud Functionsの使いやすさ、そしてGeminiの強力な機能が、無限の可能性を秘めていると感じました。

これからも、この技術を活かして、様々なアイデアを実現していきたいです。