1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Jetson Orin Nano Super開発者キットとOpenClawでサーボモーターを動かす

1
Posted at

はじめに

本記事では、Jetson Orin Nano Super開発者キットにサーボモーターを接続し、「OpenClaw」から指示を出して動かすまでの手順を解説します。

実行環境

  • ボード: Jetson Orin Nano Super 開発者キット
  • OS/JetPack: JetPack 6.2.1
  • フレームワーク: OpenClaw 2026.6.1
  • LLM: gemma4:12b (別マシンのOllama環境からAPI経由で接続)

使用した部品


1. GPIO使用のセットアップ

Pythonパッケージ管理ツール「uv」のインストール

まずは、パッケージ管理を高速に行うため uv を導入します。

  1. インストーラーの実行

    curl -LsSf https://astral.sh/uv/install.sh | sh
    
  2. パスの反映
    uv コマンドを有効にするため、環境変数を読み込みます。

    source $HOME/.local/bin/env
    
  3. 動作確認

    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
  1. ツールが起動したら、Configure Jetson 40pins Header を選択します。
    JetsonExpansionHeaderTool.png

  2. 次に Configure header pins manually を選択します。
    Configure_header_pins_manually.png

  3. ピン一覧から pwm1 (15) にカーソルを移動し、Spaceキーでチェック [*] を入れます。
    enable_pwm1_15.png

  4. 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が自律的に実行できるタスクの幅を広げられることが分かりました。今後はカメラ画像や他のセンサーと連携させたエージェントシステムに拡張していきたいと思います!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?