編集履歴一覧に戻る
Mojijiのアイコン画像

Mojiji が 2026年01月31日23時32分37秒 に編集

コメント無し

本文の変更

## 概要 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シリアル経由で送信します。 文字列出力は行わず、バイナリ通信に専念する構成としました。 ```cpp #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 として保存します。 ```cpp 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として保存します。 ```cpp 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は伏字にしています。 ```cpp 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側の処理を組み合わせることで、 比較的シンプルな構成でも柔軟な画像処理・通知が可能でした。

-

同様の構成を検討されている方の参考になれば幸いです。

+

同様の構成を検討されている方の参考になれば幸いです。 初めての挑戦、手探りで勉強しながら作成しました。 これからもっと勉強していきます。