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


-
Mojiji
さんが
2026/01/31
に
編集
をしました。
(メッセージ: 初版)
-
Mojiji
さんが
2026/01/31
に
編集
をしました。
ログインしてコメントを投稿する