投稿日

I wanna IoT 罠! 狩猟罠を遠隔操作する!「IoTプロトタイピングコーナー」作品ご紹介【SORACOM Discovery 2025】

こんにちは、ソリューションアーキテクトの 守谷(ニックネーム: moris) です。

2025年7月16日に開催されたIoTカンファレンス「SORACOM Discovery 2025」では、ソラコム社員やユーザーグループの方々が「自分たちの身近な課題をIoTで解決する」ことを目指した作品を展示する「IoTプロトタイピングコーナー」があり、多くのお客様で賑わっていました。

私は狩猟を趣味としており、狩猟免許も持っています。せっかくの機会なのでIoTと狩猟を組み合わせたプロトタイピングに挑戦してみました。こちらのブログでは、「I wanna IoT罠」と銘打って展示された狩猟罠IoT をご紹介します!

IoT罠とは?

何はともあれ、動くものを見ていただきましょう。金属の格子で作られた四角形は、タヌキやアライグマを捉える小型の「箱罠」です。
今回作成した IoT罠のWebアプリから「Run」ボタンを押すと、通信ネットワークで繋がった罠が遠隔で作動します。

Webアプリの画面

罠が作動する様子 (横から)

罠が作動する様子 (上から)

※罠の入り口に、消音のためにクッションを挟んでいます。閉まる瞬間にかなり大きな音が鳴るため。

箱罠は本来、中に入った動物が踏み板を踏むことで罠の入口を支えているフックが外れ、重力とバネの力で扉が閉まる、という仕組みになっています。

今回のプロトタイピングでは、マイコンとサーボモーターを使い、遠隔操作でフックを外し任意のタイミングで罠を作動させる、という仕組みを実装してみました。

狩猟罠とは?

日本で行われる狩猟には幾つかの種類があります。

  • 銃猟: 装薬銃(いわゆる実銃) や 空気銃(一定以上の空気圧でペレットを射出するもの) を用いる狩猟
  • 罠猟: 地面などに設置した罠を用いる狩猟
  • 網猟: 様々な種類の網を用いて鳥などを捕獲する狩猟

今回紹介する罠とは、このうち罠猟で使用が許可された法定猟具のことを指します。これらを使用して狩猟を行うには、対応した狩猟免許が必要となります。
ちなみに罠というと多くの方が想像されるトラバサミは禁止猟具で、狩猟に使用することはできません。

よく使われる罠には以下の種類があります。

  • くくり罠: シカ、イノシシなどが対象

    出典: イノホイオンラインショップ (2025年7月18日閲覧) https://inohoi.com/products/133
  • 箱罠 (小型) : アライグマ、タヌキなどが対象

    出典: イノホイオンラインショップ (2025年7月18日閲覧) https://inohoi.com/products/74
  • 箱罠 (大型): シカ、イノシシ、熊などが対象

    出典: イノホイオンラインショップ (2025年7月18日閲覧) https://inohoi.com/products/3

狩猟罠の課題

罠猟においては、設置した罠を最低でも1日1回は見回ることが求められます。これは罠にかかった動物を速やかに止め刺し・回収して腐敗を避けたり、錯誤捕獲(捕獲対象でない動物や捕獲してはいけない動物がかかってしまうこと)が起きた際に速やかに放獣する必要があるためです。

このため狩猟者は猟場(罠の設置場所)付近に居住する必要があり、都市部在住者にとって狩猟を始める大きなハードルの一つとなっています。
この問題を解消するため、動物が罠にかかったことを通知する仕組みがいくつか提案されています。

わなの作動を通知するIoT装置を製作し、野生鳥獣の捕獲を促進 – ソラコムIoT事例
LINEに通知が届くIoT箱罠 – SORACOM (ソラコム) IoT DIY レシピ (※レシピ中で利用しているLINE Notifyはサービス終了)

通知機能は見回りの手間を省き、大変便利ではありますが、罠の作動自体は自動(動物が板を踏む、といった動作に対して作動)であるためまだ課題は残っています。

  • 錯誤捕獲
  • 罠は作動したが、動物に逃げられてしまう「空弾き」
  • 忙しい日でも掛かってしまったら回収に向かわなければならない予測不能性

これらを解決するには通知だけでなく「遠隔操作」が必要になります。
ボタンひとつで猟場の罠を作動させる、そのような仕組みを構築したい、と考えました。

IoT罠の構成

箱罠の動作原理

箱罠にもいろいろな種類があります。

  • 踏み板式
  • 釣り餌式
  • 猪・鹿・熊などの大型獣向けの大型タイプ
  • アライグマ・ハクビシン・アナグマなど小型獣向けの小型タイプ

が、基本的には以下のような仕組みで箱罠の扉が閉まり、動物を閉じ込めるようになっています。

  • 開放された扉が閉まるのを、小さなフックなどで固定して防ぐ
  • 動物の動作を何らかの方法で検知する(踏み板を踏む、餌を吊るしたワイヤーを引っ張る)
  • フックが外れ、扉が重力やバネの力で素早く閉まる

つまり、動物の動きを検知し、フックを外すだけの動作を起こすことができれば良いと言えます。

IoT罠の仕組み

IoT罠は以下のように動作します。

  • ハンターがカメラで動物の様子を確認
  • ハンターが手元でWebアプリを操作
  • WebアプリがSORACOM APIを実行
  • SORACOMからマイコンにコマンドが送信
  • マイコンがコマンドを実行、モーターを駆動
  • モーターによってフックが外れ、蓋が閉まる

それぞれについて詳しく紹介していきます。

カメラで動物の様子を確認

Discovery 2025の展示では、ソラカメを罠に設置し、リアルタイム画像をPCで確認していました。

ソラカメはSORACOM Onyx(USB型LTE通信アダプタ)を挿したラズパイ(Raspberry Pi)にWi-Fi接続しています。
同時に、コントロールBoxにあるマイコンもWi-Fiでラズパイからソラコムに接続しています。
LTE回線を一本に束ねることで、運用コストを削減するためこのような構成になっています。

デバイス側構成図

通知について
SORACOM Fluxを用いてソラカメの画像を判定し、動物が写っている場合はSlackに通知を出すといった仕組みも作成しました。
以下はそのFluxアプリの構成になります。

基本的にはこちらのレシピ ( https://soracom.jp/recipes_index/32474/ ) に従って設定しました。
AIアクションでは、GPT4.1-nanoを使い、ソラカメで取得された静止画から写っている動物を判定しています。
プロンプトは以下となります。

# リクエスト内容 【モーション検知画像の説明】 
カメラからモーション検知機能によって取得された静止画が入力されます。

# 出力内容
"description": 静止画の説明文です。動物や、プリントされた動物の写真があればそれに着目して説明してください。
"is_animal_included": 画像に動物の画像が含まれていたら true を返してください。生きている動物及び、プリントされた動物写真でも true を返してください。
動物やその写真が写っていない場合はfalseを返してください。
"animal_type": 動物の種類を判定してください。以下の中からいずれかを選んでください。
  * "tanuki": 日本のタヌキ
  * "araiguma": アライグマ
  * "cat": 猫
  * " anaguma": アナグマ
  * "hakubishin": ハクビシン
"number": 動物の数を判定してください。

#出力形式
必ず以下のJSON構造および指定の型に従ってフォーマットすることとし、配列やリストとして構造化はしないで下さい。 

{ "description": string,
  "is_animal_included": boolean,
  "animal_type": "tanuki" | "araiguma" | "cat" | "anaguma" | "hakubishin",
  "number": integer
}

「プリントされた動物写真」とわざわざ入れているのは、展示会のために動物の写真を罠の中に入れて、うまく判定できるようにするためです。
正確に測定はしていませんが、このプロンプトで、動物の写真を罠に入れた場合、判定の成功率は感覚的に7~8割と言ったところでした。
タヌキをアライグマと判定したり、猫をタヌキと判定するなど、異なる種類の動物を正確に判定できないことも多いです。
タヌキとアライグマの判定は人間でも難しいかもしれませんが、ハンターならば確実にできないといけません。

アライグマは特定外来生物なので、タヌキより厳しい取り扱いが必要です。例えば、アライグマを捕獲後に生きたまま運搬すると外来生物法違反となります。
参考: https://www.env.go.jp/nature/intro/1law/regulation.html

より性能のよいAIモデルやプロンプトを工夫することで、この辺りの精度は上げられると思います。

最後のチャネルに、Slack通知の他もう一つアクションを加えています。
これは AIによる動物判定の結果、判定された動物が捕獲対象であった場合、IoT罠を待受状態にするための処理です。
この状態遷移については別の項で説明します。

Webアプリを操作して罠を起動する

Slackで通知を受けた後、カメラ映像を確認しつつ、ここぞというタイミングでWebアプリを操作して罠を作動させます。
Webアプリは以下のような画面です。

Webアプリはこの画面のみです。上部の検索欄で検索条件を指定すると、その条件に当てはまるSIMの一覧が表示されます。
ここでは1つのSIMのみが表示されています。

罠ステータスはマイコンの状態を表しています。左がマイコンの「現在の状態」、右がWebアプリから指定する「あるべき状態」となります。真ん中のチェックマークは右と左が一致していることを示しています。
罠ステータスにはSleepやReadyのような状態があり、普段はSleepして消費電力を抑えていますが、ReadyになるとHTTPサーバが立ち上がり、SORACOMからのRemote Command (HTTP)を受け取れるようになります。

IoT罠のワークフローは以下のようになります。

  1. 設置
    • 箱罠を設置し、IoT罠のモーターとフックをワイヤなどで接続。マイコンを起動する
    • マイコンが起動するとWifi接続などの初期化処理を行なった後、自動的にSleep状態となる
    • 獲物がかかるまで箱罠を放置する
  2. 設置後
    • Sleep状態でもマイコンは定期的に SORACOM metadata サービスに接続し、自身の「あるべき状態」を確認する
    • 同時に、自身の「現在の状態」を Harvest Data に格納する
  3. 動物が箱罠に近づいた時
    • カメラ等からの通知が猟師に届く。猟師は写った動物が捕獲対象であることを確認する。
      • 捕獲対象でない場合はそのまま放置する
    • 猟師はWebアプリの「Get Ready」ボタンを押下する。マイコンの「あるべき状態」が Ready になる
    • マイコンが次に metadata サービス に接続し、自身の「あるべき状態」が Ready であることを確認する
    • マイコンが Ready 状態に遷移し、HTTPサーバを立ち上げる
  4. 獲物が十分深く箱罠に入った時
    • 猟師はカメラを確認しつつ、動物が箱罠に入ったタイミングで 「Run」ボタンを押下する
    • Remote Command (HTTP) がマイコンに送信され、モーターが作動。箱罠の扉が閉まる
    • マイコンは Triggered 状態に遷移する
  5. 獲物を回収した後
    • 猟師は箱罠を再設置する
    • Webアプリの「Initialize」ボタンを押下する。マイコンの「あるべき状態」が Sleep になる
    • マイコンが次に metadata サービス に接続し、自身の「あるべき状態」が Sleep であることを確認する
    • マイコンが Sleep 状態に遷移する (2の状態になる)

ワークフローを図示すると以下のようになります。一度罠が作動すると、獲物の回収や罠の扉を開けてフックを再度設定する必要があります。再設置作業を完了した後、「Initialize」ボタンを押すことで再びSleep状態に戻るようになっています。

システムの全体像は以下となります。
このWebアプリはほとんどClaude Codeに書いてもらいました。ログイン画面や検索機能など、手で実装するとそれなりの工数がかかりますが、LLMの力を借りることでサクッと作ることができました。
背後でAPIプロキシとして動作するLambdaが動いており、それ経由でSORACOM APIを呼び出しています。WebアプリからAPIを直接呼び出さないのはCORSの関係です。
マイコンとWebアプリとのデータのやり取りなどは Flux や Harvest Data, metadata サービスなど、SORACOMの機能を使うことで最小限のコストで実現することができました。

マイコンによるモーター駆動、PWM制御

今回使用したデバイスは

です。
リニアアクチュエータに使われているサーボモーターはFS90で、WioTerminal の背面のGPIOピンから、ジャンパワイヤを使ってサーボモーターを制御します。
サーボモーターは必要な電流量が大きいので、WioTerminal からの給電では動かないようです。なので、マイコンの電源とは別に単三電池から電力を供給してあげます。

出典: https://wiki.seeedstudio.com/ja/Wio-Terminal-Getting-Started/ のピンアウト図をもとに筆者作成

マイコンを制御するプログラムも、Webアプリ同様そのほとんどを Claude Code に生成してもらいました。
しかし、状態制御やWifi接続、モータ制御、Remote Command受信のためのWebサーバ立ち上げなど、色々と機能を追加したせいか、かなり膨大なコードになってしまいました。もう少しシンプルな設計・実装にできたと思いますが、今回は時間もなかったのでとりあえず動けば良いの精神で完成に漕ぎ着けました。
とはいえモータ制御の部分は参考になるかもしれませんので、一部抜粋しておきます。
ログ出力や異常系処理のコードは省略しています。

モータ制御部分

// ServoService.h
class ServoService
{
private:
  // サーボ制御用定数(FS90仕様)
  static const int servoPin = D3;
  static const int minPulse = 544;          // 最小パルス幅 (μs) - FS90仕様
  static const int maxPulse = 2400;         // 最大パルス幅 (μs) - FS90仕様
  static const int servoFreq = 50;          // PWM周波数 50Hz
// ... 省略


// ServoService.cpp
bool ServoService::begin()
{
  // ピンをPWMモードに設定
  pinMode(servoPin, OUTPUT);
  // サーボを0度位置に初期化
  moveToPosition(0);

}

void ServoService::moveToPosition(int angle)
{

  // 角度をパルス幅に変換
  int pulseWidth = angleToPulse(angle);

  // 確実に動作させるため5回送信
  for (int i = 0; i < 5; i++)
  {
    writePulse(pulseWidth);
    delay(20); // 20ms間隔
  }
  delay(1000); // サーボが位置に到達するまで待機
}

void ServoService::writePulse(int pulseWidth)
{
  // パルス幅を範囲内に制限
  pulseWidth = constrain(pulseWidth, minPulse, maxPulse);

  // 手動でPWM信号を生成(50Hz = 20ms周期)
  unsigned long startTime = micros();
  digitalWrite(servoPin, HIGH);
  delayMicroseconds(pulseWidth);
  digitalWrite(servoPin, LOW);
}


// Remote Command を受けてモータを動かす関数
void ServoService::triggerAction()
{
  // 高速で180度に移動
  moveToPosition(180);
}

ポイントとしては、PWM信号を5回送信していることです。このマイコン上では同時にWiFiやWebサーバを動かしており、それらの割り込みのタイミングによってはサーボモータに送信したPWM信号がうまく働かない、ということが起きていたようです。
実際にこの5回送信対策を入れてからは安定してサーボモータが動くようになりました。

※サーボモータは角度を指定して動作するので、同じ角度を示す信号を何度送っても動作に影響はありません。

モーターによってフックが外れ、蓋が閉まる

上記のコードにより、サーボモータが回転、ワイヤを引っ張って罠のフックを外します。

実用に向けた課題

Discovery 2025 のプロトタイピングコーナーで展示した IoT罠を紹介してきましたが、実用に向けての課題も色々と浮き彫りになりました。
モータでフックを引っ張る以上、IoT罠の筐体を固定しなければいけませんが、今回はケースの都合上、こちらもワイヤを格子に巻きつけるなどして固定する必要がありました。
素早く設置するためには、ケース自体に固定用のネジ穴やバンドを通す溝が必要になるでしょう。
また、今回はワイヤーがケースのケーブルグランドを通じて前後に移動することで罠のフックを引っ張りましたが、これだと雨などによる水滴や虫、粉塵などがケース内部に侵入する可能性が高いです。

ケーブルグランドの様子

駆動部分がある以上完全な防水は難しいですが、例えばモーターの回転軸を延長してケーブルグランドに通し、ケースの外側で回転させれば防水性は高まるはずです。
穴を下向きに開けることで水が入りにくくしても良いかもしれません。
電池交換についても課題があります。今回はプロトタイプということで作業のしやすさを優先し、大きめのケースに電池やマイコン、モーターなどの部材を全て格納しました。
罠という性質上、屋外で汚れた手で電池交換を行う可能性が高く、このままではやはり粉塵や水がマイコンに接触するリスクがあります。
電池の格納部分とマイコンの格納部分を分け、電池交換をしやすくする必要があるでしょう。

大型罠への応用

今回使用したのはアライグマなどを対象とした小型の箱罠ですが、同様の仕組みで大型の罠にも適用が可能です。
大型の罠では扉の重量をワイヤで支え、そのワイヤの反対の先端にストッパーをつけて箱罠の格子に引っ掛けます。獲物が踏み糸を踏むことでストッパーが外れ、扉が重力で落ちます。このストッパーを外す部分をモーターにやらせる、というイメージです。
他にも様々なストッパーの方式がありますが、基本的には獲物が踏み糸を踏むことでストッパーが外れ、扉の支えがなくなる、という仕組みですので、ストッパーを外す動力をモーターに置き換えるのは難しくないと思います。

大型の箱罠のストッパー イメージ図

まとめ

いかがでしたでしょうか。
以前から、こうしたシステムのイメージは頭の中にありましたが、実際に作ってみることで具体的な機能や課題が明らかになりました。
電子回路やケースの加工など、これまで不案内だった分野も一から取り組み、自分自身の成長にも大いに繋がったと思います。

鳥獣による被害が大きくなる昨今、監視・検知だけでなく力学的・機械的な動作を伴う IoT ユースケースの一例として、IoT罠は大きな可能性を秘めています。私自身も一人の狩猟者として、さらに実用的なシステムを追求していきたいと思います。

それでは!

― ソラコム守屋 (moris)