はじめに
本記事では、Jetson Orin Nano Super開発者キットにサーボモーターを接続し、「OpenClaw」から指示を出して動かすまでの手順を解説します。
実行環境
- ボード: Jetson Orin Nano Super 開発者キット
- OS/JetPack: JetPack 6.2.1
- フレームワーク: OpenClaw 2026.6.1
- LLM: gemma4:12b (別マシンのOllama環境からAPI経由で接続)
使用した部品
- サーボモーター: SG92R
- ブレッドボード、ジャンパ線
- 外部電源キット(例:秋月電子: ブレッドボード用マイクロBメスUSBコネクターDIP化キット)
- ※サーボモーターは駆動時に大電流が流れ、Jetsonが不安定になる原因になるため、外部電源の使用を推奨します
1. GPIO使用のセットアップ
Pythonパッケージ管理ツール「uv」のインストール
まずは、パッケージ管理を高速に行うため uv を導入します。
-
インストーラーの実行
curl -LsSf https://astral.sh/uv/install.sh | sh -
パスの反映
uvコマンドを有効にするため、環境変数を読み込みます。source $HOME/.local/bin/env -
動作確認
uv --version
uvプロジェクトの初期化
OpenClawのディレクトリ(ここでは ~/.openclaw とします)を uv プロジェクトとして初期化します。
cd ~/.openclaw
uv init --bare --name openclaw
jetson-gpioのインストールと権限設定
JetsonのGPIOを制御するためのライブラリを追加します。
cd ~/.openclaw
uv add jetson-gpio
sudo をつけずに一般ユーザー権限でGPIOを制御できるよう、ユーザーを gpio グループに追加します。
sudo usermod -aG gpio $USER
設定を反映させるため、一度Jetsonを再起動します。
sudo reboot
再起動後、正常にライブラリがインポートできるか確認します。
cd ~/.openclaw
uv run python -c "import Jetson.GPIO as GPIO; print(GPIO.VERSION)"
エラーが出ずにバージョン番号が表示されれば成功です。
2. GPIOピンのPWM有効化設定
サーボモーター(SG92R)の制御にはPWM信号が必要です。デフォルトでは無効になっている場合があるため、Jetsonの15番ピン(PWM1)を有効化します。
ターミナルから設定ツールを起動します。
sudo /opt/nvidia/jetson-io/jetson-io.py
-
Save and Rebootを選択すると、Jetsonが自動的に再起動し、ピン設定が適用される。
3. 回路接続(ハードウェア)
ピン配置・配線
SG92Rの信号線は以下の通りです。
- 茶色: GND
- 赤色: Vcc (外部電源5Vへ)
- 黄色: PWM信号 (Jetsonの15番ピンへ)
⚠️ 注意: 電源のGND(基準電位)を共通にするため、外部電源のGNDとJetsonのGNDピンを必ず接続(コモンGND)してください。
回路図(Mermaid)
4. サーボモーター制御スクリプトの作成
OpenClawのワークスペース内にスクリプトを配置します。
mkdir -p ~/.openclaw/workspace/gpio_py
nano ~/.openclaw/workspace/gpio_py/servo.py
servo.py の中身として、以下のような制御プログラムを記述します。
#!/usr/bin/env python3
import Jetson.GPIO as GPIO
import time
import subprocess
# ---------------------------------------------
# 設定値
# ---------------------------------------------
SERVO_PIN = 15 # サーボ信号線を接続している Jetson Orin Nano の GPIO ピン番号(BOARD 番号)
PWM_FREQUENCY = 50 # サーボ用 PWM 周波数(一般的に 50Hz)
RUN_DURATION = 10 # サーボを動作させる秒数(今回は 10 秒)
# ---------------------------------------------
# GPIO 初期化
# ---------------------------------------------
GPIO.setmode(GPIO.BOARD)
try:
subprocess.run(f'echo {SERVO_PIN} > /sys/class/gpio/export', shell=True, executable='/bin/bash')
subprocess.run(f'echo out > /sys/class/gpio/gpio{SERVO_PIN}/direction', shell=True, executable='/bin/bash')
except (FileNotFoundError, ProcessLookupError, PermissionError):
pass
# PWM 開始
pwm = GPIO.PWM(SERVO_PIN, PWM_FREQUENCY)
pwm.start(0)
# ---------------------------------------------
# サーボ角度設定関数
# ---------------------------------------------
def set_angle(angle):
"""
サーボを指定角度に動かす。
duty比は 0°→約2.5%、180°→約12% を基準に計算。
"""
duty = 2.5 + (angle / 180.0) * (12.0 - 2.5)
pwm.ChangeDutyCycle(duty)
time.sleep(0.3) # サーボが動くまで少し待つ
pwm.ChangeDutyCycle(0) # サーボ保護のため信号を一旦 0 に戻す
# ---------------------------------------------
# メイン処理
# ---------------------------------------------
print(f"サーボモーター動作開始({RUN_DURATION} 秒間)")
start_time = time.time()
try:
while time.time() - start_time < RUN_DURATION:
# 0° → 45° → 90° → 135° → 180° → 戻る
for angle in [0, 45, 90, 135, 180, 135, 90, 45]:
print(f"{angle}度へ移動")
set_angle(angle)
time.sleep(0.1)
except KeyboardInterrupt:
print("\nユーザーにより中断されました")
finally:
# PWM 停止と GPIO 解放
pwm.stop()
subprocess.run(f'echo {SERVO_PIN} > /sys/class/gpio/unexport', shell=True, executable='/bin/bash')
print("終了しました")
スクリプト単体での動作確認
まずはOpenClawを通さず、uv run で直接スクリプトが動かせるかテストします。
cd ~/.openclaw
uv run workspace/gpio_py/servo.py
サーボモーターが規定の角度に動けば成功です!動かない場合は配線やピン番号(BOARDとBCMの違いなど)を確認してください。
5. OpenClawからの実行とスキル化
OpenClawへの直接依頼
OpenClawのチャットインターフェース(またはCLI)から、以下のように直接実行を依頼してみます。
ユーザーからの指示:
uv run workspace/gpio_py/servo.py を実行してサーボモーターを動かして。
OpenClawがコマンドを実行し、サーボモーターが動作することを確認します。
「move-servo」スキルの作成
OpenClawの「スキル(Skill)」として登録し、簡単に実行できるようにします。
※当初、OpenClawと対話してスキルの生成を試みましたが、[tools] skill_workshop failed: name ,,, というエラーが発生したため、今回は手動でファイルを作成しました。
以下のディレクトリにスキル定義ファイルを作成します。
mkdir -p ~/.openclaw/workspace/skills/move-servo
nano ~/.openclaw/workspace/skills/move-servo/SKILL.md
SKILL.md の内容:
---
name: move-servo
description: Runs the servo control script to move a connected servo motor.
---
# Skill: move-servo
## Overview
Executes the servo control script located in `gpio_py/servo.py` using `uv run`.
When executed, the connected servo motor will move according to the script logic.
## Implementation
The following command is executed:
```bash
uv run gpio_py/servo.py
```
スキルの登録確認
スキルが登録されているかを確認します
openclaw skills list | grep move-servo
#出力
│ ✓ ready │ move-servo │ Runs the servo control script to move a connected servo │ openclaw-workspace │
スキルの実行依頼
スキル登録後、OpenClawに対して定義したスキル名で指示を出します。
ユーザーからの指示:
move-servo を実行してください
エージェントがスキルを認識し、内部でスクリプトを呼び出してサーボモーターが動作すれば完了です!
まとめ
Jetson Orin Nano Super と OpenClaw(LLM: Gemma 4)を組み合わせることで、自然言語の指示からハードウェア(サーボモーター)を制御する環境が構築できました。
手動でのスキル登録手順を踏むことで、LLMが自律的に実行できるタスクの幅を広げられることが分かりました。今後はカメラ画像や他のセンサーと連携させたエージェントシステムに拡張していきたいと思います!


