Mojijiのアイコン画像
Mojiji 2026年01月31日作成 (2026年01月31日更新) © MIT
製作品 製作品 閲覧数 41
Mojiji 2026年01月31日作成 (2026年01月31日更新) © MIT 製作品 製作品 閲覧数 41

Spresense純正カメラで撮影した画像をUSB経由でMacに転送し、Discordへ通知する

Spresense純正カメラで撮影した画像をUSB経由でMacに転送し、Discordへ通知する

概要

Sony Spresenseと純正カメラを用いて画像を撮影し、
SDカードを使用せずにUSBシリアル通信でMacへ画像データを転送、
Pythonで画像変換後、Discordへ自動送信する仕組みを作成しました。

SDカードのフォーマットやファイルシステムの制約を避けたい場合の
一例として共有します。


実現したいこと

  • Spresenseで撮影した画像を取得する
  • SDカードを使わずにPCへ画像を保存する
  • 撮影結果をDiscordに通知する

作ったもの

  • Spresense純正カメラで画像を撮影
  • RAW画像データをUSBシリアルでMacへ送信
  • Mac側でPNG画像に変換
  • Discord Webhookを使って自動投稿

使用したもの

ハードウェア

  • Sony Spresense メインボード
  • Spresense 純正カメラモジュール
  • MacBook(USB接続)

ソフトウェア

  • Arduino IDE(Spresense対応)
  • Python 3.11

使用ライブラリ(Python)

  • pyserial
  • pillow
  • numpy
  • requests

システム構成


システム構成

本システムは、以下の流れで動作します。
1. Spresenseに接続した純正カメラで画像を撮影する
2. 撮影した画像をRAW形式で取得する
3. USBシリアル通信を用いてMacへ画像データを送信する
4. Mac側でRAW画像をPNG形式に変換する
5. 生成した画像をDiscordへ自動送信する

実装内容

Spresense側プログラム(Arduino)

Spresenseでは、カメラから取得した画像をRAW形式で扱い、
画像サイズ(4バイト)と画像データ本体をUSBシリアル経由で送信します。
文字列出力は行わず、バイナリ通信に専念する構成としました。

#include <Camera.h> static bool sent = false; void cam_cb(CamImage img) { if (sent || !img.isAvailable()) return; sent = true; uint32_t size = img.getImgSize(); uint8_t* buf = img.getImgBuff(); Serial.write((uint8_t*)&size, 4); Serial.write(buf, size); } void setup() { Serial.begin(115200); delay(1000); theCamera.begin(); theCamera.startStreaming(true, cam_cb); } void loop() {}

Mac側:画像データ受信(Python)

USBシリアル経由で画像サイズとRAWデータを受信し、
image.raw として保存します。

import serial import struct ser = serial.Serial("/dev/tty.usbserial-XXXX", 115200) size_bytes = ser.read(4) size = struct.unpack("<I", size_bytes)[0] data = ser.read(size) with open("image.raw", "wb") as f: f.write(data)

画像変換(RAW → PNG)

RGB565形式のRAW画像をRGB888に変換し、PNGとして保存します。

from PIL import Image import numpy as np W, H = 320, 240 with open("image.raw", "rb") as f: data = f.read() arr = np.frombuffer(data, dtype=np.uint16).reshape((H, W)) r = ((arr >> 11) & 0x1F) << 3 g = ((arr >> 5) & 0x3F) << 2 b = (arr & 0x1F) << 3 rgb = np.dstack((r, g, b)).astype(np.uint8) img = Image.fromarray(rgb, "RGB") img.save("image.png")

Discordへ送信

DiscordのWebhookを利用して、生成した画像を自動投稿します。
※Webhook URLは伏字にしています。

import requests WEBHOOK_URL = "https://discord.com/api/webhooks/XXXXXXXX" with open("image.png", "rb") as f: files = {"file": f} requests.post(WEBHOOK_URL, files=files)

動作結果

  • Spresenseで撮影した画像をPCに保存できることを確認
  • PNG画像として正しく表示されることを確認
  • Discordチャンネルに画像が自動投稿されることを確認

工夫した点

  • SDカードを使わず、USBシリアルのみで完結
  • バイナリ通信に徹し、文字出力を排除
  • PC側で柔軟に画像処理・外部連携が可能
  • 外装はPCと一緒に持ち運びしやすいようにミニ紙袋を使用

今後の拡張

  • ボタンやセンサーを用いた撮影トリガー
  • 画像差分検知による通知制御
  • Wi-Fi接続によるスタンドアロン化

ライセンス

  • MIT License

おわりに

Spresenseのカメラ機能とPC側の処理を組み合わせることで、
比較的シンプルな構成でも柔軟な画像処理・通知が可能でした。
同様の構成を検討されている方の参考になれば幸いです。
初めての挑戦、手探りで勉強しながら作成しました。
これからもっと勉強していきます。

ログインしてコメントを投稿する