====== 8-2 サーボをたくさん動かす ====== 講師はメカケモがすきです。 でもメカケモのきぐるみってほぼ見ないです。 講師はメカケモがすきでルク・ファートゥというきぐるみを作りましたが、メカケモが思ってたほどメジャーではないということを後から知りました。 あと講師はアニマトロニクスもすきです。 完成品はもちろんですが、中身がむき出しの状態を見てるとワクワクすることこの上ないです。 サーボモータの扱いについてちょっと詳しめに書いておけば、 メカケモを作ったりアニトロをやろうとする人がワンチャン現れないかな… という淡い下心希望を抱いてこのページを書くことにします。    {{:gimmickkouza:electronic_basic:8:8-5.png?300|}}    ===== サーボモータについてのもうちょっと詳しい知識 ===== ==== Arduinoでサーボを使う時にありがちな悩み ==== === Arduinoが出力できる電力がぜんぜん足りない === サーボモータは比較的大きな電力を必要とする電子部品です。 一方、Arduinoのピンが出力可能な電力は、機種にもよりますがあまり大きくはありません。 またArduinoのピンに過大な電力が流れてしまうと、Arduinoが壊れてしまう危険もあります。 最もベーシックなサーボ、SG90をひとつ繋げるぐらいなら大丈夫ですが、**複数個のサーボや電力消費の大きいつよつよサーボを直接Arduinoの5Vに繋げるのは避け、別の外部電源からサーボ動作用の電力を取り入れる必要**があります。 === サーボのつよさと動作電圧はだいたい比例する === SG90は5Vで動作する便利なサーボですが、そのパワーはお世辞にも強いとは言えません。 まぶたや眼球といった小さく軽いパーツを動かすことはできますが、**ロボットアームや翼といった大きく重いものは、ハイトルクなサーボでなければ動かせません。** サーボの傾向として、**トルクの高さと動作電圧(あとサーボの重量もね…)はだいたい比例して大きくなります。** なのでサーボの動作電圧に適合した電圧を印加できる電源を用意するか、どうしても電源電圧が動作電圧に満たない場合は、動作電圧まで昇圧する必要があります。 === Arduinoのピンが足りねえ!!! === サーボを使ったギミック、特にアニマトロニクスなんかを作ろうとする場合、だいたいサーボは複数個…というかたくさん使います。 そしてそこにスイッチやらセンサやら電飾やらを足していくと、Arduinoのピンが不足してしまうことがあります。 そんなことあるのか?って思いますか?今あなたの視界にあるArduinoはUnoR4ではないですか? そんなデカブツをきぐるみに搭載するのですか……? …そんなわけで、実際に実装するであろうNanoやNanoEvery、ProMicro等の小型ボードではArduinoのピンが不足してしまうことがあります!    ==== 複数のサーボモータを便利に使える「PCA9685」モジュール ==== {{:gimmickkouza:electronic_basic:8:8-6.png?400|}} そんなわけでこちらがPCA9685ドライバを積んだPCA9685モジュールになります。 サーボを複数台Arduinoに繋ぎたい場合は、こういったサーボドライバモジュールを使うことを強く勧めます。 先ほどの"Arduinoでサーボを使う時にありがちな悩み"も、サーボドライバを使うことで大部分が解決するか、解決しやすくなります。 PCA9685の特長は以下の通りです。 * ArduinoとはI2Cで接続する * この基板一枚に最大16個のサーボモータを繋ぐことができる   →つまり、ArduinoのI2Cピン一対から16個のサーボを動かすことができます    Arduinoのピンの節約にものすごく役立ちます    * それぞれの基板のI2Cアドレスを変えてさえいれば、複数枚のPCA9685を数珠つなぎに繋ぐことができる。   →最大62枚連結が可能で理論上は992個のサーボモータを動かすことができます    そこまでやるかどうかは別として、機能としてはすごい    * ターミナルブロックから5V-10V(ドライバには最大6Vって書いてあるけど、販売サイトの表記は最大10V)の外部電源を供給できる   →Arduinoからは供給できない大きな電力&5Vを超える電圧を印加する電源を接続できます == ターミナルブロックの使い方 == {{:gimmickkouza:electronic_basic:8:8-7.png?200|}} 緑色の四角いこいつがターミナルブロックです。 ここにPCA9685モジュールに電力を供給する電源を接続します。 ①ターミナルブロックの天面に埋め込まれているネジをマイナスドライバーで回して緩めます ②ターミナルブロック側面の穴に、 * 先端の被覆を剥いた状態の電線 * 穴に挿さる太さ&長さのピン(ジャンパ線やコネクタのピン)  といった配線をぶっ挿します ③マイナスドライバーでネジを回し配線を締め込みます  構造上、**力がかかると線がすっぽ抜けやすい**です  **抜けると場合によっては地獄を見る**ことになるのでしっかり締めましょう  (講師は地獄からの生還者なのでこいつがきらいです)       ===== 8-2-1_PCA9685_multiservo ===== {{youtube>PWfOkEtY8cA?large}}    ==== ライブラリのインストール ==== 今回は下記のライブラリを使いますので、インストールしておいてください。 * 「Adafruit PWM Servo Driver library」 by Adafruit 本資料、Adafruitにお世話になりまくりです。(電子工作自体割とそういうとこありますが) Adafruitについては本章ラストの電子目のページでもでらプッシュしておりますので、ぜひご一読いただければと思います。    ==== 配線図 ==== {{:gimmickkouza:electronic_basic:8:8-2-1.png?600|}}    だいぶにぎやかな配線図です。 電力が十分あればサーボは何個繋げてもOKです。図ではめんどくさいので3個にしてます。 ==注意ポイント①:ArduinoとPCA9685を繋ぐ部分== **ArduinoとPCA9685を繋ぐ部分は5V-VCCです。__V+には絶対に繋がないでください。__** V+は外部電源を供給することを主目的としたピンです。 このピンは基板内部でターミナルブロックと繋がっています。 ==注意ポイント②:PCA9685に繋ぐ電源について== PCA9685に繋ぐサーボモータ用の外部電源はとりあえず乾電池にしました。 図のAAAは単4ですが、AAつまり単3でもOKです。 どちらも4本だと1.5V*4=6Vの電源となります。 __(充電池は1本1.2Vなので今回は不適です)__ 電池ボックスから出ている電線の先端を剥けば、そのままターミナルブロックに挿せます。 ==注意ポイント③:Arduinoに繋ぐ電源について== PCA9685に繋いだ電源は、あくまでサーボモータ用の電源です。 Arduinoには、これとは別に電源を繋ぐ必要があります。 とはいえ、いつもと同じ要領…つまりArduinoのUSB-Cにケーブルを挿し、電源を繋げばOKです。    これ一本でも配線繋ぎ間違えるとやばいですね… 今一度[[gimmickkouza:electronic_basic:4:3_wiring#配線図の見方と実際の回路の作り方|]]をおさらいし、基本を忠実に守って気を付けて回路を作成してください。 ===使う部品リスト=== ^ 部品 ^ 個数 ^ | PCA9685 | 1個 | | サーボモータ | 任意の個数 | | 電池ボックス | 1個 | | 乾電池 | 必要な本数 |     /*部品表がほしいです。今回はオス-メスジャンプワイヤ初登場なので書いておいた方が親切かも? これ1本でも配線間違えるとやばいですね… ArduinoにはArduinoでTypeC給電しとかないと動かないのトラップ率高い?かも */ ==== サンプルコード解説 ==== サンプルコード8-2-1_PCA9685_multiservo.inoを開いてください。 #include #include Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40); //PCA9685のI2Cアドレスを入れる #define SERVOMIN 110 #define SERVOMAX 480 int angle; void setup() { pwm.begin(); pwm.setPWMFreq(50); } void loop() { for (int pin = 0; pin < 8; pin++) { angle = 0; angle = map(angle, 0, 180, SERVOMIN, SERVOMAX); pwm.setPWM(pin, 0, angle); delay(500); angle = 180; angle = map(angle, 0, 180, SERVOMIN, SERVOMAX); pwm.setPWM(pin, 0, angle); delay(500); } } 要点の解説をします。 == 23行目 == Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40); インスタンス生成をしています。 PCA9685を一枚だけ繋ぐ場合はデフォルトのI2Cアドレス「0x40」が自動で入るようになっています。 なので今回は空欄でOKですが、まあ入れておきます。 PCA9685を2枚以上繋ぐ場合は、このページ下部を参考にPCA9685に細工を加えたうえで、使う枚数分のインスタンスを生成し、( )内にそれぞれのI2Cアドレスを入れます。 == 45行目 == pwm.setPWM(pin, 0, angle); サーボを動かしているのはこの45行目です。ここがちょっとめんどくさいポイントです。 以前使用したServoライブラリではサーボを角度指定で動かしましたが、今回使うAdafruitのライブラリでsetPWM関数を使ってサーボを動かす際には、0~4096の幅でサーボの角度を指定する必要があります。 たとえばサーボをいきなり180度動かしたい場合は、pwm.setPWM(pin, 0, 4096);という指定をします。 しかしそれでは非常にわかりにくいので、map関数で実際の角度で指定ができるようにします。 まず前処理として、最小/最大パルス幅を求めます。 * 最小パルス幅… 0.5ms / 20ms(PMW周期) * 4096 = 102.4 * 最大パルス幅… 2.4ms / 20ms   * 4096 = 491.52 4096段階の時のパルス幅は102.4~491.52となります。余裕をもって110~480とします。 最終的に0~180の数値を角度として指定し、この110~480の帯域に割り付けるようmap関数で処理をしています。 (参考:http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=2743)    ちなみに動かすサーボはピン番号で指定(サンプルコードではfor文の変数pinの数値で指定)しますが、ピン番号は0番スタートです。 つまり一番左に繋いだサーボは0、一番右は15です。    ==== PCA9685を複数枚繋ぎたい場合の処理 ==== {{:gimmickkouza:electronic_basic:8:8-8.png?600|}}    ここに2枚のPCA9685があるじゃろ。 左のPCA9685は何も手を加えていないのでI2Cアドレスはデフォルトの(0x40)、 右はアドレス変更処理をしており、I2Cアドレスは(0x41)になっています。       {{:gimmickkouza:electronic_basic:8:8-9.png?400|}}    0x41のPCA9685です。 小さくて見にくいのですが、PCA9685の基板の右上にはA0~A5のアドレスジャンパセクションがあります。 任意のアドレスジャンパにはんだを盛ってブリッジすれば、この基板のI2Cアドレスを変えることができます。 例えば、こちらの0x41の基板右上では、「A0」アドレスジャンパがブリッジされています。    I2Cアドレスの割り当て規則としては、まず16進数のI2Cアドレスを2進数に変換、2進数末尾の6ケタの数字をA0~A5のアドレスジャンパセクションに対応させ、「0」はそのまま、「1」が来るところの欄をはんだブリッジする…という要領のようです。 0x42であれば2進数末尾6ケタは000010なのでA1をブリッジ、 0x43なら000011なのでA0とA1をブリッジ、 0x44は000100なのでA2をブリッジ…といった感じです。  Adafruit PCA9685 16-Channel Servo Driver Chaining Drivers(Adafruit):  https://learn.adafruit.com/16-channel-pwm-servo-driver/chaining-drivers       ===== 5V以上の電源をどうやって確保するか ===== 先述の通り、ハイトルクなサーボは動作電圧が高いです。 Arduinoの電源として鉄板のモバイルバッテリーは、一般的なものであれば出力電圧は5Vです。 PCA9685に5V以上の電圧を供給したい場合は、電源の選定に頭を悩ませることになります。 ここでは、講師が今までに検討してきた電源や使用した電源について、備忘を兼ねて解説します。    ==== そもそも5Vを昇圧すればいいんじゃね? ==== **はい、ごもっともです。** それをしないのは個人的になんとなく厭だからです。 一応言い訳をさせていただきますと、きぐるみに実装するにあたって少しでも部品の点数は減らしたいという思想があります。 それはきぐるみに実装するスペースがシビアであるということや、部品が多くなるほど部品ごとや各部品間でのトラブルが起きるリスクが増えるのではないかという考えを背景にしています。(あと普通に電圧周りのことを考えるのはダルいです) もしあなたがそういった思想や怠惰な精神と無縁であれば、昇圧は有効な手段です。 実際講師もデメリットやリスクを天秤にかけたうえで、どうしても変圧をしなければならない場面では変圧をすることもあります。    ==== 変圧を利用せずに5V以上の電圧を作る ==== === その1:単3/単4乾電池 === サンプルコードの配線図でも使用している通り、乾電池は簡単手軽に5V以上の電圧を用意することができます。 通常の乾電池単3 or 単4であれば、1.5Vの組み合わせで6V、7.5V、9V…を作成可能です (エ○ループ等の充電池の場合は一本1.2V程度なので、最低5本からで5V、7.2V、8.4V…です) また乾電池は国際的に規格が統一されており、呼び方こそ違えど海外でも安定して入手することができます。 (ちなみに日本の単3は米国ではAA、単4はAAA) __国内イベントでも海外コンでも緊急時に強く、非常に頼りになる__存在です。 いきなり最強候補の乾電池ですが、デメリットもあります。 それは使っていると電圧が降下していくという特性です。 これにより、容量MAXの乾電池でサーボの動作電圧ギリギリの電圧を作ってしまうと、動作中に電圧が低下してサーボが動かなくなってしまう可能性があります。 乾電池でサーボを動かしたい場合は、動作電圧よりも多少余裕を持った電圧を作る方が無難でしょう。 == 単3/単4乾電池のメリット == * 1.5V(充電池は1.2V)刻みで電圧を作成可能 * 規格が統一されており国内外を問わず入手可能。性能も安定している == 単3/単4乾電池のデメリット == * 使っていると電圧が降下していく    === その2:9V乾電池 === {{:gimmickkouza:electronic_basic:8:8-10.png?200|}} 画像引用元:https://amzn.asia/d/gA2rrvJ 品名でネタバレしていますが、9Vの電圧を出せる乾電池がこの世には存在します。 9V電池や角電池と呼ばれる、ちょっと変わった四角い乾電池です。かわいいね。 そのままで9V(実際は9V以上出ているっぽいですが)を用意することができる一方、使い方や用途次第ではありますが、容量はあまり大きくないようです。 (参考リンク:https://misoji-engineer.com/archives/9v-battery-capacity.html) また9V電池も使い続けると電圧が降下するので注意が必要です。 == 9V乾電池のメリット == * 一本そのままで9Vを利用できる == 9V乾電池のデメリット == * 乾電池なので単3/単4と同じく電圧降下がある * 容量が少なめ(困るかどうかは使い方と用途次第)    === その3:18650電池 === {{:gimmickkouza:electronic_basic:8:8-11.png?200|}} 右2本が18650電池。左はサイズ比較用の単3エネル○プ    18650電池は充電池(一般的にはリチウムイオン)の一種です。 単3電池よりもふたまわりぐらい大きめで、専用の充電器で繰り返し充電して使うことができます。 一本が3.7Vなので、2本使えば7.4Vを得ることができます。 保護回路がついているものとついていないものがありますが、**保護回路付きを強く勧めます。** また2024年3月現在、長さが規格とは微妙に違うなどのトラブルや、法外な大容量を騙った製品などが多く見受けられます。 ざっくり言うと__中華製のうさんくさい製品や業者がとても多いので、その辺を見極められる人向け__です。 == 18650電池のメリット == * 一本3.7V。2本組み合わせれば7.4V * 容量が大きめ(一本1200~3300mAhぐらい) == 18650電池のデメリット == * 現状うさんくさい製品が非常に多い。玄人向け     === その4:ラジコン用バッテリー === {{:gimmickkouza:electronic_basic:8:8-12.png?200|}} 文字通り、ラジコン或いは電動ガン用のバッテリーです。 講師がルク・ファートゥの制作時にお世話になったバッテリー(画像は現物)でもあります。 リチウムポリマー(Li-Po)/リチウムフェライト(Li-Fe)/ニッケル水素(Ni-MH)の3種類があります。種類によって電圧が異なる他、容量は個別の製品によります。 充電に際しては専用の充電器で正しく充電してください。 **このバッテリーは取り扱いに非常に注意が必要です。 充電の仕方や取り扱いを誤ると、発火・爆発するおそれがあります。** 一般的に、リポよりはリフェの方が安全性が高いと言われています。**講師もリポはおすすめしません。** ちなみにバッテリから出ている配線の先にはラジコン用の規格のコネクタがついています。 電子工作で使うにはコネクタを切断(線は絶対に一本ずつ切断してくれよな!)してむき線をターミナルブロックに挿… …せればいいのですが、だいたいターミナルブロックに入らないぐらいの太い線なので、どこかの何かをひと工夫してどうにかしてやる必要があります。 == ラジコン用バッテリーのメリット == * 高い電圧を1本のバッテリーで用意できる == ラジコン用バッテリーのデメリット == * 爆発する危険性が高い(特にリポ) * 電子工作に転用するには配線の加工が必須と思われる。できない人は手出し無用で。    === そのXX:USB PD対応モバイルバッテリー === 先日MicroMakerFaireKariyaに行ってきたんです。刈谷。 そしたらなんか「USB PDのパワーを手に入れよう」って書いてあるんです。 もうね、アホかと。バカかと。 お前らな、なんで講師が「USB PD使えばいいんじゃね」ってことに気づかせてあげねーんですか。 USB PDだよ。USB PD。 よーしパパUSB1本で最大100W(20V/5A)供給しちゃうぞー、とか言ってるの。もう見てらんない。 きぐるみ電子工作ってのはな、もっと殺伐としてるべきなんだよ。 いつ充電池の爆発が始まってもおかしくない、 刺すか刺されるか、そんな雰囲気がいいんじゃねーか。 女子供は、すっこんでろ。 で、やっとブースに辿り着けたと思ったら、ブースの主が、「この"USB PDトリガー"を使えばUSB PD電源から好きな電圧を取り出せるんですよ~」、とか言ってるんです。そこでまたブチ切れですよ。 あのな、リポなんて今日び流行んねーんだよ。ボケが。 得意げな顔して何が、「できない人は手出し無用で」。 講師は本当に電子工作を布教したいのかとと問いたい。問い詰めたい。小1時間問い詰めたい。       そんなわけで、講師はまだ挑戦していないのですが、USB PD対応のモバイルバッテリーから5V以上の電圧の電力を取り出す手段があるみたいです。 そのうち挑戦してみたいところです。 ちなみに"USB PDトリガー"は下記のBoothから購入することができます。  電圧表示付き USB PDトリガー(suzan_works):  https://booth.pm/ja/items/5385432 ---- ちなみに、電熱ベスト用のモバイルバッテリーでは7.4Vなどの電圧で出力可能なものも存在するみたいです。 こちらも講師は使ったことはないので、保証は致しかねます。 {{:gimmickkouza:electronic_basic:8:8-13.png?400|}}