メインコンテンツへ移動

ハードウェア

Rustファームウェア搭載のオープンソースESP8266ロボットアーム

オープンソースのファームウェアは5サーボのESP8266アームで動作し、シミュレーターと同じ関節モデルを提供します。シミュレーターは実機とのシリアル、Bluetooth、ネットワーク接続を必要としません。

設計

方針はRust、C++はハードウェアライブラリ

依存関係は一方向です。外部ハードウェア関数を宣言するのは1つのcrateだけで、境界を通るのはバイトです。Arduino文字列、C++オブジェクト、ルート、JSON、アプリ状態は渡しません。

Rustが担当

  • 起動方針と協調型エグゼキューター
  • Hotaruのルーティングとプロトコル
  • HTTPの解析と応答
  • サーボの検証と状態

C++の担当

ArduinoまたはESP8266のシンボルが必要な処理のみ:

  • クロック、割り込みマスク、ウォッチドッグ、再起動、ヒープ、乱数、シリアル
  • Wi-Fiアクセスポイント/ステーションモード、低水準TCP/UDPハンドル
  • キャプティブDNSとSPIFFSハンドル
  • GPIO、PWM、サーボパルス書き込み、低水準OTA書き込み

Native WiFiClient, File, and Servo オブジェクトはC++側で整数ハンドルの背後に保持されます。組み込みArduinoファームウェアには通常のRust fn main(), がないため、ゲートウェイは戻り値のないCエントリーを1つだけ公開し、それを setup() calls once.

ワークスペース

クレート構成

hcr-gateway
アプリケーション本体。起動方針、ルーティング、およびArduinoが一度だけ呼び出す単一のCエントリーポイントを担当します。
hcr-http
no_std環境のHTTP解析と応答、およびHotaruプロトコル。
hcr-io-esp8266
プラットフォームのTCP上で動作するHotaruトランスポート。
hcr-rt-esp8266
ランタイム、時刻、クリティカルセクション。
hcr-platform
ワークスペース全体で共有するプラットフォームtraitと値。
ffi/hcr-ffi
外部ハードウェア関数を宣言する唯一のcrateであり、その上に安全なアダプターを提供します。

プロトコル

現在のデバイスAPIとhcr.v1サービス契約

Rustサービスは追加専用のhcr.v1エンベロープとJSON・CBORバインディングを使います。現在のESP8266 Rustゲートウェイは上限付きHTTP/JSONサーボAPIを提供し、MQTTは未実装です。

クライアント別のトランスポート割り当てと符号化
クライアント転送方式符号化
ブラウザーアプリ(現在)HTTPS request–responseJSON
Rustサービス契約hcr.v1 HTTPバインディングJSONとCBOR
ESP8266 Rustゲートウェイ(現在)デバイスのアクセスポイント上のHTTPJSON
MQTTデバイス経路(計画中)MQTT over TCP/TLSCBOR

エンベロープ内での関連付け

関連情報はMQTT 5プロパティに置きません。端末が3.1.1を選ぶ場合があり、HTTPバインディングにはプロパティ自体がないためです。部分的な方式を2つ持つより、どこでも動く1つの方式の方が確実です。

タイムスタンプは順序を決めない

端末時計は信頼できず、ESP8266がNTPへ接続できるのはルーター稼働時だけです。順序は送信側の時計ではなく、トピックごとのFIFOで決まります。

マイナーバージョンは追加のみ

任意フィールド、種類、トピックを追加できます。受信側は未知の内容を記録して破棄し、処理全体を失敗させません。