M5StickCPlusで8ServoHAT1.1を作動させるのに沼ったのでメモ

どーも、まるです。

今日は7月に買ったまま脳波アートの制作に熱中し放置していた、8ServoHATをそろそろ使おうとしたら色々と躓いたのでポイントをまとめておきます。

前書き:日本だけ名称ぐちゃぐちゃ問題

Twitterにぽちぽち難航過程を呟いてたので、この記事では要点をざっくり紹介していきます。

今回使ったもの

今回使ったものは、
・M5StickC
・8チャンネルサーボドライバHat
・180°Servo HAT x2
・360°Servo HAT x2
・3Dプリントにて自作したホムンクルスモデル
です。

今回はM5StickCを使用していますが、M5StickCplusでも勿論動かせます。
というか、その方が簡単でっした。

ボールキャスターは以下のものを使いました。
やっぱり世界のTAMIYAは最高ですね。

8Servos Hatは生産終了品

まず、日本ではよく知らない人からしたら販売終了したと思われがちなのですが、2020年製のものは確かに取り扱い終了ですが名称を変えたものが2022年になって発売されています。

和訳だとまるで別物製品のようになっており、後継機として探してもHITしなくて難航しました。

現在販売されているのは8チャンネルサーボドライバHat!

Marutsuやスイッチサイエンスでは8チャンネルサーボドライバHatとなっている

そして見つけたのがこちらの8チャンネルサーボドライバHatです。

驚くべきことに、Githubのドキュメントを見ていると「8Servos Hatv1.1」というのが公式の系譜のようです。名称全然違うじゃん・・!

そして、こちらの製品ではv1.0(8Servos Hat)のサンプルコードそのままでは動きません。

引用しているヘッダーファイル名も"IIC_servo.h" → "Hat_8Servos.h"に変更されており、公式の名称的にはv1.1となっているもののその差はM5StickCとM5StickCPlus位あると思ったほうが良いです。後継種であるものの、完全互換性はありません。

つまり、最近購入された方はv1.1のコード、ドキュメントを探す必要があります。
(まずこれに気付くのに暫くかかった..)

自分の場合は更に、8Servos HAT(1.0)より先に販売終了したM5StickCを使って最新の8チャンネルサーボドライバHat(v1.1)を動かそうとしたのが間違いでした・・・。

v1.1はM5StickC/Cplusの両方に対応しているものの、デフォルトだとCplusのSampleが出回っているので(そりゃあそう)古いStickCで新しいServoHatを動かすというドMじみたことを気付かずやっていたのでした。

冒頭に載せたように一応動作はしましたが、同じような悲劇に見舞われる方が少しでも減るようこの記事を書くことにしました。

普通に8ServoHAT(v1.1)を買って何か作りたいという人も、この記事を読めば大抵何とかなります。

逆に、過去(1年以上前)の記事の8ServoHATだと中身がそもそも違うので、現在市場で販売されている8ServoHATv1.1にサンプルをそのまま書き込んでも動作せず、参考にならない可能性が高いので注意しましょう。

私は今回、こちらの方のブログを参考にしていましたが、サーボがちっとも動いてくれず原因特定に苦戦しました。(v1.0用のサンプルコードを参考にされていた為)

では早速始めていきます。

8ServoHAT1.1の使い方

サーボモータの指定方法

レジスタマップは以下になります。

こちらより引用

サンプルコード

サンプルコードはこちらにあります。

v1.1で使える関数

使える関数はこちらです。

ライブラリとなるHat_servos.cppの内部に記述すれば、自分で増やすことも可能です。

/// 使える関数一覧 ===================================================
//drive.ほにゃららで以下実行可能
//指定されたレジスタアドレスに特定の長さのデータを書き込み
//writeBytes(uint8_t addr, uint8_t reg, uint8_t *buffer,uint8_t length)
//特定の長さのデータを指定されたレジスタ アドレスに読み込み
//readBytes(uint8_t addr, uint8_t reg, uint8_t *buffer,uint8_t length)
//特定のサーボの角度を設定
//setServoAngle(uint8_t index, uint8_t deg)
//すべてのサーボの角度を設定
//setAllServoAngle(uint8_t deg)
//特定のサーボのパルスを設定
//setServoPulse(uint8_t index, uint16_t pulse)
//すべてのサーボのパルスを設定
//setAllServoPulse(uint16_t pulse)
//すべてのサーボの電源をオン
//enableServoPower(uint8_t state)
//特定のサーボの角度を取得
//getServoAngle(uint8_t index)
//特定のパルスの角度を取得
//getServoPulse(uint8_t index)
// ==============================================================

bootloader.bin exit status 1 エラーが出た場合

また、exit status 1エラーが出た場合、Arduino IDE側でボードやポートの指定を間違えている可能性があります。TypeCケーブルを抜き差しして、ポート番号等にミスがないか今一度確認しましょう。

cmd /c if exist "C:\\Users\\xxx\\Downloads\\8SERVOS(M5C)\\partitions.csv" 
COPY /y "C:\\Users\\xxx\\Downloads\\8SERVOS(M5C)\\partitions.csv"
        "C:\\Users\\xxx\\AppData\\Local\\Temp\\arduino_build_844722\\partitions.csv"

cmd /c if not exist "C:\\Users\\xxx\\AppData\\Local\\Temp\\arduino_build_844722\\partitions.csv"
     if exist "C:\\Users\\xxx\\Documents\\ArduinoData\\packages\\m5stack\\hardware\\esp32\\2.0.3\\variants\\m5stick_c\\partitions.csv"
      COPY "C:\\Users\\xxx\\Documents\\ArduinoData\\packages\\m5stack\\hardware\\esp32\\2.0.3\\variants\\m5stick_c\\partitions.csv"
            "C:\\Users\\xxx\\AppData\\Local\\Temp\\arduino_build_844722\\partitions.csv"

cmd /c if not exist "C:\\Users\\xxx\\AppData\\Local\\Temp\\arduino_build_844722\\partitions.csv"
 COPY "C:\\Users\\xxx\\Documents\\ArduinoData\\packages\\m5stack\\hardware\\esp32\\2.0.3\\tools\\partitions\\default.csv"
  "C:\\Users\\xxx\\AppData\\Local\\Temp\\arduino_build_844722\\partitions.csv"
        1 �‚̃t�@�C�����R�s�[���܂����B

cmd /c IF EXIST "C:\\Users\\xxx\\Downloads\\8SERVOS(M5C)\\bootloader.bin"
 ( COPY /y "C:\\Users\\xxx\\Downloads\\8SERVOS(M5C)\\bootloader.bin"
     "C:\\Users\\xxx\\AppData\\Local\\Temp\\arduino_build_844722\\IIC_servo.cpp.bootloader.bin"
)ELSE (
     IF EXIST "C:\\Users\\xxx\\Documents\\ArduinoData\\packages\\m5stack\\hardware\\esp32\\2.0.3\\variants\\m5stick_c\\bootloader.bin"
 ( COPY "C:\\Users\\xxx\\Documents\\ArduinoData\\packages\\m5stack\\hardware\\esp32\\2.0.3\\variants\\m5stick_c\\bootloader.bin"
  "C:\\Users\\xxx\\AppData\\Local\\Temp\\arduino_build_844722\\IIC_servo.cpp.bootloader.bin" 
  ) ELSE (
     COPY /y "C:\\Users\\xxx\\Documents\\ArduinoData\\packages\\m5stack\\hardware\\esp32\\2.0.3\\tools\\sdk\\esp32\\bin\\bootloader_dio_80m.bin"
      "C:\\Users\\xxx\\AppData\\Local\\Temp\\arduino_build_844722\\IIC_servo.cpp.bootloader.bin" ) )

\bootloader.bin �̎g����������Ă��܂��B
exit status 1

他になんか修正対応した気がするのですが、何をしたか覚えてないのでこれで直らない場合は、引き続き試行錯誤してみましょう。もしかしたら、私のTwitter漁れば何か残してたかも。

また機会とニーズがあれば別途記事にします🥺

(オマケ)360°/180°サーボモータの挙動の違い

また、180° サーボは角度を制御できますが、速度は制御できません。
対し、360° サーボは速度と方向を制御できますが、角度は制御できません。

Connecting the 360° will control the speed and direction, and connecting the 180° servo will control the angle(360° servo duty cycle 0~7.075 clockwise rotation ,greater than 7.625 counterclockwise rotation,the relationship between rotation speed and duty cycle is nearly linear)

docs.m5stack.com

動作が異なるので、組みたいものによってどちらが必要か注意して買いましょう。

最後に

という訳で、今回は8サーボモーターの沼り方、もとい触り方について紹介しました。

無事、2,3日かけて動くようになったのが。こちら。

この前方にのってるキモいのは何だ、と言われそうですが、これは大脳皮質ホムンクルスモデル(ラテン語homunculus;小さな人、ミニチュア人間を意味)と呼ばれる、人体の各部位の運動機能を処理する脳の領域と割合の神経学的「地図」に基づいて人体に歪ませてマッピング(表現)したものです。キモくありません。

全身からの体性感覚情報を伝える神経線維は、大脳皮質の頭頂葉のさまざまな領域で終末を迎え、身体の表象地図を形成してゆきます。ふつくしいですね…。

こんな感じで、M5Stack業界は成長の速度が著しく1・2年前の記事やドキュメントが宛にならないということが結構ザラにあります。

過去にM5StickC用の学習本が日本でもリリースされたようですが、情報がすぐ使えなくなってしまうからなのか、Cplusは発売して2年経つ今でも刊行される気配がないです。

やっぱり今は大抵調べたらWebで解決できてしまう時代なので、Githubを漁るのが一番早くて確実な方法な気がしますね。ではまた。

あ、電子工作好きなかたはTwitterフォローしてくれると電子工作系の記事が増えていきますので、是非よろしくです!

お読みいただきありがとうございました。

まる。

━━━━━━━━━━━━━━━━━
■未経験OK!大学生インターン募集中!
プログラミングやITなど
興味ある方ご連絡ください‎。
(๑ > ﻌ <`)و✧
━━━━━━━━━━━━━━━━━
Python歴5年のフルスタックエンジニア&ヨギー。
大学は心理学専攻、趣味はヘルスケア全般。
最近は自作脳波デバイスの設計とそれを使ったインタラクティブアート生成に勤しみ中。

↓アートとか日常。
Instagram:@malmal0v0

お仕事のご依頼はDM又はメールにて。

まる。をフォローする
その他の記事はこちら
[Touchdesigner]1秒に1増加する変数をPythonで書く方法
【Touchdesigner】e-06って?値に英字が入る理由を解説
教育訓練給付金で45万円付与!4ヶ月で未経験からエンジニアを目指せるディープロ(DPro)を解説
【4人に1人が盗み見被害!?】意外と知られていない、公共フリーWiFiの危険性と対策について解説
開発終了した筋電によるジェスチャー操作デバイスMyo armbandをどこまで使えるか検証してみる(2023年)

タイトルとURLをコピーしました