差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
gimmickkouza:electronic_basic:6:1_servo_pwm [2024/06/16 12:33] – [6-1-3_analogWrite] matsuhachigimmickkouza:electronic_basic:6:1_servo_pwm [2024/06/21 18:12] (現在) – ★7-3へのインターナルリンク追加 lutamesta
行 9: 行 9:
 DCモータには2つの端子があり、一方に電源の+側、もう一方に-側を繋ぐと回転します。 DCモータには2つの端子があり、一方に電源の+側、もう一方に-側を繋ぐと回転します。
 接続を逆にすると逆回転する他、電圧が高くなるほど回転が速くなる性質があります。 接続を逆にすると逆回転する他、電圧が高くなるほど回転が速くなる性質があります。
 +
 +<panel type="info" title="まつはちさんからのアドバイス">
 +DCモータは位置制御ができない、高い電圧・電流が必要など、初心者が扱うにはちょっとコツがいります。
 +特にR4からは各GPIOピンに8mAまでの電流しか流せなくなったので、DCモータを使う場合はモータードライバやトランジスタ、MOSFETなどを使う必要があります。
 +2024年6月現在、"Arduino DCモータ" で検索すると出てくる作例は殆どがR3を使ったものです。R4では同じように扱えない点にご注意ください。
 +</panel>
 +/*<panel type="info" title="まつはちさんからのアドバイス">
 +R4からはGPIOピンで8mAしか流せなくなったのでモータードライバやトランジスタ、MOSFETなどを使う必要があります。
 +位置制御ができない、高い電圧・電流が必要など、初心者が扱うにはちょっとコツがいります。
 +Arduino DCモータ で調べると大体落ちてるのはR3のサンプルなので、ご注意を。
 +</panel>*/
  
 == ステッピングモータ == == ステッピングモータ ==
行 20: 行 31:
 電子工作用途ではサーボモータの方が種類が多く、一般的に使われている印象があります。 電子工作用途ではサーボモータの方が種類が多く、一般的に使われている印象があります。
  
-<alert type="danger">実際に扱う際は初心者にはかなりくせがある…(最低4本ピンがあり、どこにどれを差したらいいか分からない。電圧も足りない。モータードライバ必須。そして重い。なので使わないほうがいいと思いますよほど精度が必要でもない限り…ちなみに精度は高くても分解能が低いやつもある。</alert>+<panel type="info" title="まつはちさんからのアドバイス"> 
 +最低4本ピンがあり、どこにどれを差したらいいか分かりづらく、電圧も足りない。扱うにはモータードライバが必須。そして重い。 
 +……といった具合で、初心者が扱うにはかなりくせがあるモータです。 
 +よほど精度が必要でもない限り、使わなくてもいいと思います。 
 +(ちなみに精度が高くても分解能が低い製品もあります) 
 +</panel> 
 +/*<alert type="danger"> 
 +実際に扱う際は初心者にはかなりくせがある…(最低4本ピンがあり、どこにどれを差したらいいか分からない。電圧も足りない。モータードライバ必須。そして重い。なので使わないほうがいいと思います…とか書いてもいいかもです。 
 +よほど精度が必要でもない限り…ちなみに精度は高くても分解能が低いやつもある。</alert>*/
  
 == サーボモータ == == サーボモータ ==
行 29: 行 48:
 トルクが高いものほど動作電圧が高くなります。 トルクが高いものほど動作電圧が高くなります。
 電子工作では、ロボットやアニマトロニクスの制作などでよく使われています。 電子工作では、ロボットやアニマトロニクスの制作などでよく使われています。
 +本項ではこちらのモータを使用します。
 +
 +<panel type="info" title="まつはちさんからのアドバイス">
 +サーボモータはDCモータ、ステッピングモータと比べて扱いやすいモータです。
 +
 +サーボモータはモータードライバが中に内蔵されていて、実際の中身はDCモーターだったりします。
 +こちらの記事がわかりやすいのですが、普段サーボモータと呼んでいるものはラジコンサーボという部類のモータです。
 +https://qiita.com/hsgucci/items/1ae0dbeb0438db8a23fa
 +
 +また、サーボモータの中にも、PWM形式とシリアル制御形式の2種類があります。
 +電子工作で一般的に使われているのは、PWM形式のラジコンサーボです。
 +</panel>
 +/*<alert type="danger">
 +追加です。
 +回転「角度」が制御できるタイプと、回転「速度」が制御できるタイプがあることを書いとくと親切そうです
 +サーボモータはモータードライバが中に内蔵されていて、実際の中身はDCモータだったりします
 +
 +これがわかりやすいのですが、普段サーボモータと呼んでいるものはラジコンサーボという部類です。
 +https://qiita.com/hsgucci/items/1ae0dbeb0438db8a23fa
 +
 +また、サーボモータの中にも、PWM形式と、シリアル制御形式の2種類があって、普段使うのは、PWM形式のラジコンサーボとなります。
 +上記に比べてサーボモータは扱いやすいからこれ使いますよってのがあったほうがいいです。
 +</alert>*/
    
 /*<alert type="danger">回転「角度」が制御できるタイプと、回転「速度」が制御できるタイプがあることを書いとくと親切そうです</alert>*/ /*<alert type="danger">回転「角度」が制御できるタイプと、回転「速度」が制御できるタイプがあることを書いとくと親切そうです</alert>*/
行 42: 行 84:
 (下記に販売ページのリンクを掲載しておきますので、リンク先にあるデータシートのPDFをご確認ください) (下記に販売ページのリンクを掲載しておきますので、リンク先にあるデータシートのPDFをご確認ください)
  
- マイクロサーボSG-90の販売ページ(秋月電子通商):+ マイクロサーボSG-90の販売ページ(秋月電子通商):
  https://akizukidenshi.com/catalog/g/g108761/  https://akizukidenshi.com/catalog/g/g108761/
  
行 59: 行 101:
 {{:gimmickkouza:electronic_basic:6:6-1-1.png?600|}} {{:gimmickkouza:electronic_basic:6:6-1-1.png?600|}}
      
 +===使う部品リスト===
 +^ 部品                                                                  ^ 個数  ^
 +| SG90 | 1個   |
 +
 SG90から出ているワイヤには、メス型のコネクタがついているかと思います。 SG90から出ているワイヤには、メス型のコネクタがついているかと思います。
 両端がオスピンになっているワイヤを挿し込むことで、Arduinoと接続することができます。 両端がオスピンになっているワイヤを挿し込むことで、Arduinoと接続することができます。
 3本出ているワイヤのうち、橙色はD11へ、赤色は5Vへ、茶色はGNDへ繋いでください。 3本出ているワイヤのうち、橙色はD11へ、赤色は5Vへ、茶色はGNDへ繋いでください。
- +   
-完全に余談ですけどSG90のワイヤの配色、P型・D型色覚の人には判別が大変なのではないかと思うんですがどうなんでしょうね。+完全に余談ですけどSG90のワイヤの配色、P型・D型色覚の人には見にくいのではないかと思うんですがどうなんでしょうね。
 ちなみに正規品のSG90であれば3本の線のうち真ん中が必ず5Vになるようです。 ちなみに正規品のSG90であれば3本の線のうち真ん中が必ず5Vになるようです。
 とはいえロット違いや将来的に変更が生じる可能性がないとも言えないので、参考程度に… とはいえロット違いや将来的に変更が生じる可能性がないとも言えないので、参考程度に…
-<alert type="danger">面倒じゃなければ写真が欲しいかもです。ワイヤの配色ひどいですよね…真ん中が5Vになるので絶対にショートしないところはポイント高い</alert> 
  
 +{{:gimmickkouza:electronic_basic:6:img_6513.jpg?200|}}
 +SG90のワイヤ。
 +P型・D型色覚でない自分でもパッと見わかりにくいんじゃ(byるためすた)
 +真ん中が5Vになるので絶対にショートしないところはポイント高い(byまつはちさん)
 +
 +/*<alert type="danger">面倒じゃなければ写真が欲しいかもです。ワイヤの配色ひどいですよね…真ん中が5Vになるので絶対にショートしないところはポイント高い</alert>*/
 +  
 ==== PWMの仕組み ==== ==== PWMの仕組み ====
 実際に動かす前に、サーボモータを動かすのに必要な仕組み、「PWM」について説明します。 実際に動かす前に、サーボモータを動かすのに必要な仕組み、「PWM」について説明します。
行 78: 行 130:
 (厳密に言うとR4シリーズにはアナログ出力の機能があります(後述)が、他のシリーズのArduinoでは使えない機能なので、PWMの使い方も履修しておいた方がいいかと思います) (厳密に言うとR4シリーズにはアナログ出力の機能があります(後述)が、他のシリーズのArduinoでは使えない機能なので、PWMの使い方も履修しておいた方がいいかと思います)
      
-=== PWMの基本 ===+=== PWMの基本1:analogWriteの場合=== 
 +サーボモータの説明をする前に、よりベーシックな"analogWriteを使ったPWM"についての説明をします。 
 +  
 Arduinoが出力できる電圧は0Vか5Vのどちらかです(いわゆるデジタル出力です)  Arduinoが出力できる電圧は0Vか5Vのどちらかです(いわゆるデジタル出力です) 
-PWMでは、この**0Vと5Vの電圧を高速で切り替えて出すことによって、"0Vと5Vの中間の電圧"を疑似的に作り出し**ます。+analogWriteのPWMでは、この**0Vと5Vの電圧を高速で切り替えて出すことによって、"0Vと5Vの中間の電圧"を疑似的に作り出し**ます。
 **"中間の電圧"の値は、0Vと5Vを出力する長さの割合**によって決まります。 **"中間の電圧"の値は、0Vと5Vを出力する長さの割合**によって決まります。
  
-{{:gimmickkouza:electronic_basic:6:6-5.png?400|}}+{{:gimmickkouza:electronic_basic:6:6-1-pwm6.png?500|}} 
 +/*{{:gimmickkouza:electronic_basic:6:6-5.png?400|}}*/
  
-上の図はPWMのモデル図です。 +上の図はanalogWriteのPWMのモデル図です。 
-HIGH(5V)とLOW(0V)を3:2の割合の長さで出すことによって、3Vの出力を疑似的に作り出しています。+PWM周期の中でHIGH(5V)とLOW(0V)を3:2の割合の長さで出すことによって、3Vの出力を疑似的に作り出しています。 
 +HIGHとLOWの割合によって出力される電圧は変わります。
 以上がPWMの基本です。 以上がPWMの基本です。
  
行 93: 行 149:
 本項ではanalogWriteのサンプルコードもご用意しておりますので、後ほどご覧ください。 本項ではanalogWriteのサンプルコードもご用意しておりますので、後ほどご覧ください。
  
-=== PWM:サーボモータの場合 === +/*<alert type="danger">ちなみにanalogWriteのOWM周波数は490Hzです。(約2ms)5番ピンと6番ピンで出すときだけ980Hz(約1ms)サーボモータのPWMよりずっとはやい周期で制御してます。</alert>*/ 
-さて、サーボモータもPWMによって制御可能な部品ですが、こちらはもう少々複雑な仕組みです。+ 
 +=== PWMの基本2:サーボモータの場合 === 
 +さて、サーボモータもPWMによって制御可能な部品ですが、こちらはanalogWriteとは若干の違いがあります。
 説明の為に、先程のSG90のデータシートの図を掲載します。 説明の為に、先程のSG90のデータシートの図を掲載します。
  
行 102: 行 160:
 図の中央には少し盛り上がってから下がり、右端で再度隆起しているグラフがあります。 図の中央には少し盛り上がってから下がり、右端で再度隆起しているグラフがあります。
  
-まず一番下の薄青緑で塗られた「20ms(50Hz) PWM Period」はPWM信号の周期を表します。+まず一番下の薄青緑で塗られた「20ms(50Hz) PWM Period」はSG90サーボモータのPWM信号の周期を表します。
 色付けされた1周期分の幅が20ms(=20ミリ秒)です。 色付けされた1周期分の幅が20ms(=20ミリ秒)です。
 この20ミリ秒の周期の中で、何ミリ秒の間HIGHにするかでサーボの動きを指定することができます。 この20ミリ秒の周期の中で、何ミリ秒の間HIGHにするかでサーボの動きを指定することができます。
行 109: 行 167:
 つまり、20msのPWMの周期うち、HIGHにする時間を0.5msにすると最小角度の0度、2.4msにすると最大角度の180度になるように、内部のギアが動く仕様になっています。 つまり、20msのPWMの周期うち、HIGHにする時間を0.5msにすると最小角度の0度、2.4msにすると最大角度の180度になるように、内部のギアが動く仕様になっています。
 ちなみに90度にしたい場合は、0.5msと2.4msの中間の1.45msの間HIGHにすればOKです。 ちなみに90度にしたい場合は、0.5msと2.4msの中間の1.45msの間HIGHにすればOKです。
-<alert type="danger">これみんな躓くので、上の図のPWM(analogWriteとかで出力されるのはこっち)が周期のすべてを使ってDuty比を決めてるのに対し、異なり、特定の周期の一部の範囲だけのDuty比を使っているのがサーボモータなど、具体的な説明はばっちりなのでこれに加えて抽象度高い説明があったほうがいいかもしれない・・・こないだTaiYOさんにも説明したんですがめっちゃ大変だった‥‥</alert>+/*<alert type="danger">これみんな躓くので、上の図のPWM(analogWriteとかで出力されるのはこっち)が周期のすべてを使ってDuty比を決めてるのに対し、異なり、特定の周期の一部の範囲だけのDuty比を使っているのがサーボモータなど、具体的な説明はばっちりなのでこれに加えて抽象度高い説明があったほうがいいかもしれない・・・こないだTaiYOさんにも説明したんですがめっちゃ大変だった‥‥</alert>*/
  
 +=== analogWriteのPWMとサーボモータのPWMって結局何がどう違うの? ===
 +==analogWriteはPWM周期全体がデューティーサイクル==
 +最初の図をもう一度出します。
 +
 +{{:gimmickkouza:electronic_basic:6:6-1-pwm1.png?500|}}
 +
 +analogWriteでのPWMは、PWM周期の全体がデューティーサイクルとなります。
 +どういうことか、可視化してみましょう。
 +
 +{{:gimmickkouza:electronic_basic:6:6-1-pwm3.png?500|}}
 +
 +PWM周期のうちのHIGHにする幅の割合によって出力電圧が決まります。
 +先程は3Vを出力電圧としましたが、HIGHの幅が狭ければもっと低い電圧が出力されます。
 +
 +{{:gimmickkouza:electronic_basic:6:6-1-pwm4.png?500|}}
 +
 +PWM周期の全ての幅=デューティーサイクルの幅なので、PWM周期のすべて100%をHIGHにすることだってあります。
 +
 +{{:gimmickkouza:electronic_basic:6:6-1-pwm7.png?500|}}
 +/*<alert type="danger">ちなみにanalogWriteのOWM周波数は490Hzです。(約2ms)5番ピンと6番ピンで出すときだけ980Hz(約1ms)サーボモータのPWMよりずっとはやい周期で制御してます。
 +Duty100%を使うこともありますよ!6-1-3_analogWrite.inoでint DUTY = 255;にしてるのがまさにそれ
 +</alert>*/
 +
 +==サーボはPWM周期のほんの部分がデューティーサイクル==
 +analogWriteの図に対応するサーボモータのPWMの図も召喚してみましょう。
 +
 +{{:gimmickkouza:electronic_basic:6:6-1-pwm2.png?500|}}
 +
 +サーボモータのPWMでは、PWM周期のうちごく一部分の範囲だけがデューティーサイクルとなっています。
 +PWM周期のうちデューティーサイクル外の部分については、出力を操作することはありません。
 +デューティーサイクルの最小値~最大値の中で幅を指定することによって、サーボモータの動作が変わります。
 +  
 +==そもそも両者は速度感からして違うんじゃな==
 +SG90サーボのPWM周期は50Hz、つまり20msでした。
 +つまりこんな感じ。
 +
 +{{:gimmickkouza:electronic_basic:6:6-1-pwm8.png?500|}}
 +  
 +それに対して、analogWriteのPWM周期は490Hz、約2msです。
 +(ちなみに5番ピンと6番ピンで出すときだけは980Hz(約1ms)です)
 +つまり、analogWriteのPWMはサーボモータのPWMよりずっとはやい周期で制御しています。
 +先程のサーボの図にanalogWriteを足して速度感の違いを可視化してみると、こんな感じです。
 +
 +{{:gimmickkouza:electronic_basic:6:6-1-pwm9.png?500|}}
 +
 +  
 ==== サンプルコード解説 ==== ==== サンプルコード解説 ====
 サンプルコード6-1-1_Servo_PWM.inoを開いてください。 サンプルコード6-1-1_Servo_PWM.inoを開いてください。
-<alert type="danger">+/*<alert type="danger"> 
 +int servo_PIN = 11;  pinMode(Servo_PIN, OUTPUT);で大文字小文字がまじってコンパイルエラーになります。 
   delay(20);                     //20ms待機する   delay(20);                     //20ms待機する
 これ、正しくは これ、正しくは
行 121: 行 227:
 delayMicroseconds(20000-pulse_WIDTH);としないのは、delayMicrosecondsは16383usまでしか動作しないためです delayMicroseconds(20000-pulse_WIDTH);としないのは、delayMicrosecondsは16383usまでしか動作しないためです
 https://kimudiary.com/arduino/arduino%E3%81%A7%E3%82%B5%E3%83%BC%E3%83%9C%E3%83%A2%E3%83%BC%E3%82%BF%E3%82%92%E5%8B%95%E3%81%8B%E3%81%99/ https://kimudiary.com/arduino/arduino%E3%81%A7%E3%82%B5%E3%83%BC%E3%83%9C%E3%83%A2%E3%83%BC%E3%82%BF%E3%82%92%E5%8B%95%E3%81%8B%E3%81%99/
-</alert>+ 
 +私は試してみたときこのコンパイルエラーに引っかかりました。 
 +This library only supports boards with an AVR, SAM, SAMD, NRF52 or STM32F4 processor. 
 +サーボライブラリが古かったみたいで、新しくIDEインストールしてれば起きないのかもしれませんが… 
 +https://python-beginner.blog/arduinounor4-sg90-error/ 
 +</alert>*/
  
 <code> <code>
行 128: 行 239:
  
 void setup() { void setup() {
-  pinMode(Servo_PIN, OUTPUT); //D11をデジタル出力に設定する+  pinMode(servo_PIN, OUTPUT); //D11をデジタル出力に設定する
 } }
  
行 135: 行 246:
   delayMicroseconds(pulse_WIDTH);//pulse_WIDTHで設定したミリ秒待機する   delayMicroseconds(pulse_WIDTH);//pulse_WIDTHで設定したミリ秒待機する
   digitalWrite(servo_PIN, LOW);  //D11をLOWにする   digitalWrite(servo_PIN, LOW);  //D11をLOWにする
-  delay(20);                     //20ms待機する+  delayMicroseconds(10000-pulse_WIDTH); //まず10msからパルス幅を引いた時間分delayする 
 +  delayMicroseconds(10000); //残りの10msぶんdelayする(delayMicrosecondsは16383usまでしか動作しないため)
 } }
 </code> </code>
行 146: 行 258:
 delayMicrosecondsは更に短い単位の"マイクロ秒"で待機時間を指定することができます。 delayMicrosecondsは更に短い単位の"マイクロ秒"で待機時間を指定することができます。
  
 +===このスケッチを実行しようとするとコンパイルエラーが出てしまう人のための情報===
 +ArduinoIDEにインストールされているServoライブラリが古い場合、R4でServoライブラリを使用しようとするとエラーが出る場合があります。
 +(逆に言うと、本講座資料の実践の為に新しくArduinoIDEをインストールした人ではこのエラーは恐らく出ないかと思います)
 +  
 +「警告:ライブラリServoはアーキテクチャavr, megaavr, sam, samd, nrf52, stm32f4, mbed, mbed_nano, mbed_portenta, mbed_rp2040に対応したものであり、アーキテクチャrenesas_unoで動作するこのボードとは互換性がないかもしれません。」
 +
 +もしくは
 +
 +「This library only supports boards with an AVR, SAM, SAMD, NRF52 or STM32F4 processor.」
 +  
 +Arduinoに6-1-1を書き込もうとしてこれらのエラーが出た場合は、下記の手順でServoライブラリをアップデートしてください。
 +
 +==手順1:ライブラリマネージャを開く==
 +{{:gimmickkouza:electronic_basic:6:6-11.png?400|}}
 +ライブラリマネージャを開きます。
 +ArduinoIDEの左側に並んでいるアイコンのうち、上から三つめがライブラリマネージャです。
 +
 +==手順2:ライブラリを探す==
 +{{:gimmickkouza:electronic_basic:6:6-12.png?400|}}
 +アイコンをクリックするとライブラリマネージャが出現します。
 +今回はServo用のライブラリを探したいので、検索欄に「Servo」と打ち込みます。
 +(この画像は6-2の使い回しなので、別の文字列が入っていますがお気になさらず…)
 +打ち込むと検索ワードに該当するライブラリがズラーっと下に現れます。
 +
 +==手順3:公式のライブラリを見つけてインストールする==
 +{{:gimmickkouza:electronic_basic:6:6-1-1_servo_pwm_arduino_ide_2.2.1_2024_06_18_22_00_42.png?400|}}
 +今回はArduino公式がリリースしているライブラリをインストールします。
 +検索結果の中から、__**ライブラリ名が「Servo」開発者が「by Michael Margolis, Arduino」のものをインストール**__してください。
 +(だいたい検索結果の最上位に出てくるかと思います)
 +ライブラリのバージョンは最新版で大丈夫です。
 +  
 +参考リンク:https://python-beginner.blog/arduinounor4-sg90-error/
 +  
 +===そんなわけでコード解説に戻ります===
 == 1行目 == == 1行目 ==
 <code> <code>
行 164: 行 310:
 それ以外の角度は…パルス幅を計算して求めてください… それ以外の角度は…パルス幅を計算して求めてください…
  
-<alert type="danger">+また、map関数を使う方法もあります! 
 +[[gimmickkouza:electronic_basic:8:2_pca9685|]] で出てきますので、よければこちらもご覧ください。 
 + 
 +/*<alert type="danger">
 高度なやり方だと、map関数で変換もできると思います。(要確認) 高度なやり方だと、map関数で変換もできると思います。(要確認)
 http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=2743 http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=2743
-</alert>+</alert>*/
  
 == 5行目 == == 5行目 ==
 <code> <code>
-pinMode(Servo_PIN, OUTPUT); //D11をデジタル出力に設定する+pinMode(servo_PIN, OUTPUT); //D11をデジタル出力に設定する
 </code> </code>
 D11を出力モードにします。何の変哲もないデジタル出力の設定です。 D11を出力モードにします。何の変哲もないデジタル出力の設定です。
行 193: 行 342:
 パルス幅の時間分HIGHにしたので、D11をLOWにします。 パルス幅の時間分HIGHにしたので、D11をLOWにします。
  
-== 12行目 ==+== 12・13行目 ==
 <code> <code>
-delay(20);                     //20ms待機する+delayMicroseconds(10000-pulse_WIDTH); //まず10msからパルス幅を引いた時間分delayする 
 +delayMicroseconds(10000); //残りの10msぶんdelayする(delayMicrosecondsは16383usまでしか動作しないため)
 </code> </code>
 11行目を終えてすぐloop文の先頭に戻ると、PWMの1周期が終わらないうちにHIGHが再度出力されてしまいます。 11行目を終えてすぐloop文の先頭に戻ると、PWMの1周期が終わらないうちにHIGHが再度出力されてしまいます。
-なので、delayを使ってPWMの1周期に相当する20ミリ秒の間、ここで待機します。+なので、PWMの1周期を終えるまで、ここで待機します。 
 + 
 +待機する時間は20ms(SG90のPWM1周期)からパルス幅(本コードでは変数pulse_WIDTHの数値)を引いた残りです。 
 +そんなわけで delayMicroseconds(20000 - pulse_WIDTH); …と言いたいところですが、ここで一つプチ落とし穴です。 
 +__delayMicrosecondsで扱える最大の時間は16383us__です。 
 +なので、delayMicrosecondsの引数に20000usを突っ込むことはできません。 
 +ここは少し面倒ですが、2回に分けてdelayMicrosecondsをかける必要があります。 
 + 
 +1回目のdelayMicrosecondsは10msからpulse_WIDTHの数値を引いた時間分待機させます。 
 +続く2回目のdelayMicrosecondsで、残りの10msぶん待機させます。 
 +この2行の記述により、本来記述たかった delayMicroseconds(20000 - pulse_WIDTH); と同じ効果を実現できます。
      
      
 ===== 6-1-2_Servo_library ===== ===== 6-1-2_Servo_library =====
 +{{youtube>PuH5LhkhHpY?large}}
 +  
 サーボモータはパルス幅を指定して動かすだけでなく、「ライブラリ」を使うことでもっと簡単に、直感的に動作させることができます。 サーボモータはパルス幅を指定して動かすだけでなく、「ライブラリ」を使うことでもっと簡単に、直感的に動作させることができます。
      
行 213: 行 375:
 そのため、有名な電子部品や人気な電子部品は、リリース元の異なる複数のライブラリがある場合があります(LEDテープなんかがそうですね) そのため、有名な電子部品や人気な電子部品は、リリース元の異なる複数のライブラリがある場合があります(LEDテープなんかがそうですね)
 **あるライブラリのルールは、そのライブラリを使っているプログラムの中でしか使えないので、注意が必要です。** **あるライブラリのルールは、そのライブラリを使っているプログラムの中でしか使えないので、注意が必要です。**
 +  
 ==== 配線図 ==== ==== 配線図 ====
 {{:gimmickkouza:electronic_basic:6:6-1-1.png?600|}} {{:gimmickkouza:electronic_basic:6:6-1-1.png?600|}}
行 219: 行 381:
 回路は直前の6-1-1で作ったものをそのまま流用できます。 回路は直前の6-1-1で作ったものをそのまま流用できます。
 何もいじらなくてOKです! 何もいじらなくてOKです!
-  + 
 +===使う部品リスト=== 
 +^ 部品                                                                  ^ 個数 
 +| SG90 | 1個   | 
 ==== サンプルコード解説 ==== ==== サンプルコード解説 ====
 サンプルコード6-1-2_Servo_library.inoを開いてください。 サンプルコード6-1-2_Servo_library.inoを開いてください。
行 321: 行 487:
 ---- ----
 <text background="danger"> サーボをArduinoにたくさん繋げて動かしたいぜ!!!!と思ったそこのアナタ! <text background="danger"> サーボをArduinoにたくさん繋げて動かしたいぜ!!!!と思ったそこのアナタ!
-サーボをたくさん繋げる方法は第8章で出てくるのでそっちも見てくれよな!!!!! </text>+サーボをたくさん繋げる方法は第8章、 [[gimmickkouza:electronic_basic:8:2_pca9685|]] で出てくるのでそっちも見てくれよな!!!!! 
 +**間違ってもArduinoに沢山のサーボを直接繋げたらダメだぞ!!!!!!!**</text>
      
 <panel type="warning" title="Tips:R4シリーズの特権・DACによるアナログ出力機能"> <panel type="warning" title="Tips:R4シリーズの特権・DACによるアナログ出力機能">
行 333: 行 500:
 Arduino UNO R4 Minima Digital-to-Analog Converter (DAC)(Arduino公式): Arduino UNO R4 Minima Digital-to-Analog Converter (DAC)(Arduino公式):
 https://docs.arduino.cc/tutorials/uno-r4-minima/dac/ https://docs.arduino.cc/tutorials/uno-r4-minima/dac/
 +  
 +またDACについてはこちらのページでまつはちさんが補足してくれています:[[gimmickkouza:electronic_basic:7:3-r3-r4|]]
 +
 </panel> </panel>
      
      
 ===== 6-1-3_analogWrite ===== ===== 6-1-3_analogWrite =====
-PWMを使った疑似的なアナログ入力で、LEDの明るさを調節してみましょう! +6-1-3と6-1-4はLEDを使ったanalogWriteのサンプルコードとなっております。 
-<alert type="danger">サーボモータのページなのにanalogWriteでの制御が登場するのが気になるので一言ほしいです+サーボモータの使い方ではありませんが、せっかくPWMについて学習したのですから、ぜひこちらも実践してみてください! 
 +そんなわけで、PWMを使った疑似的なアナログ入力で、LEDの明るさを調節してみましょう! 
 + 
 +analogWriteのPWMについてもう一度おさらいしておきたい方は、本ページを上の方~~~までスクロールしてください。 
 +講師はとても親切なのでインターナルリンクも貼っておきますよ。**親切なので。** 
 +[[gimmickkouza:electronic_basic:6:1_servo_pwm#PWMの仕組み|]] 
 + 
 +/*<alert type="danger">サーボモータのページなのにanalogWriteでの制御が登場するのが気になるので一言ほしいです
 https://curiouser.sakura.ne.jp/lutamesta/doku.php/gimmickkouza/electronic_basic/6/1_servo_pwm#pwmno%E5%9F%BA%E6%9C%AC https://curiouser.sakura.ne.jp/lutamesta/doku.php/gimmickkouza/electronic_basic/6/1_servo_pwm#pwmno%E5%9F%BA%E6%9C%AC
 こことの関連性も書きたい こことの関連性も書きたい
-</alert> +</alert>*/ 
 +  
 ==== 配線図 ==== ==== 配線図 ====
 {{:gimmickkouza:electronic_basic:6:6-1-3.png?600|}} {{:gimmickkouza:electronic_basic:6:6-1-3.png?600|}}
行 348: 行 525:
 今回使う関数はanalogWriteですが、あくまで__"PWMを使い疑似的にアナログ出力をする"ものなので、アナログソケットではなくPWM対応の「~」がついたデジタルソケットを使います。__ 今回使う関数はanalogWriteですが、あくまで__"PWMを使い疑似的にアナログ出力をする"ものなので、アナログソケットではなくPWM対応の「~」がついたデジタルソケットを使います。__
 またいつものことですが、LEDの抵抗はお使いになるLEDの仕様に合わせたものを計算してお選びください。 またいつものことですが、LEDの抵抗はお使いになるLEDの仕様に合わせたものを計算してお選びください。
 +
 +===使う部品リスト===
 +^ 部品                                                                  ^ 個数  ^
 +| 砲弾型LED球  | 1個   |
 +| 抵抗器\\ (抵抗値は使うLEDのデータシートをもとに各自計算してください)  | 1個   |
      
 ==== サンプルコード解説 ==== ==== サンプルコード解説 ====
 サンプルコード6-1-3_analogWrite.inoを開いてください。 サンプルコード6-1-3_analogWrite.inoを開いてください。
-<alert type="danger">使う部品の表が欲しい</alert>+/*<alert type="danger">使う部品の表が欲しい
  
 +LEDの何なのか書いたほうがわかりやすい
 +ledPinとか
 +</alert>*/
 <code> <code>
-int LED = 10; //LEDはD10に挿す+int LED_PIN = 10; //LEDはD10に挿す
 int DUTY = 255;//デューティサイクルを設定(0~255) int DUTY = 255;//デューティサイクルを設定(0~255)
  
 void setup() { void setup() {
-  pinMode(LED,OUTPUT);//(PWMの場合pinModeは実は省略可能)+  pinMode(LED_PIN,OUTPUT);//(PWMの場合pinModeは実は省略可能)
 } }
  
 void loop() { void loop() {
- analogWrite(LED,DUTY);//D10にDUTYの値を出力+ analogWrite(LED_PIN,DUTY);//D10にDUTYの値を出力
 } }
 </code> </code>
行 375: 行 560:
 == 5行目 == == 5行目 ==
 <code> <code>
-pinMode(LED,OUTPUT);//(PWMの場合pinModeは実は省略可能)+pinMode(LED_PIN,OUTPUT);//(PWMの場合pinModeは実は省略可能)
 </code> </code>
 PWMは出力しかしないので、実はpinModeの記述は省略することができます。 PWMは出力しかしないので、実はpinModeの記述は省略することができます。
行 382: 行 567:
 == 9行目 == == 9行目 ==
 <code> <code>
-analogWrite(LED,DUTY);//D10にDUTYの値を出力+analogWrite(LED_PIN,DUTY);//D10にDUTYの値を出力
 </code> </code>
 PWM出力をするときに使うanalogWrite関数です。 PWM出力をするときに使うanalogWrite関数です。
行 400: 行 585:
      
 配線は6-1-3と同じ、そのままの状態でOKです。 配線は6-1-3と同じ、そのままの状態でOKです。
 +
 +===使う部品リスト===
 +^ 部品                                                                  ^ 個数  ^
 +| 砲弾型LED球  | 1個   |
 +| 抵抗器\\ (抵抗値は使うLEDのデータシートをもとに各自計算してください)  | 1個   |
      
 ==== サンプルコード解説 ==== ==== サンプルコード解説 ====
 サンプルコード6-1-4_analogWrite_firefly.inoを開いてください。 サンプルコード6-1-4_analogWrite_firefly.inoを開いてください。
 +/*<alert type="danger">
 +LEDの何なのか書いたほうがわかりやすい
 +SPEEDはdelay(SPEED)とするのはdelayは遅延させる意味のためちょっと違和感あるので、duarationとかにした方がいいと思います。
 +あと単位書いたほうがいいと思います。[ms]とか。
 +int ledPin = 10; //LEDはD10に挿す
 +int duaration = 5;//[ms]delayの待ち時間です。明滅する速度に関係します。
 +</alert>*/
 +
 <code> <code>
-int LED = 10; //LEDはD10に挿す +int LED_PIN = 10; //LEDはD10に挿す 
-int SPEED = 5;//delayの待ち時間です。明滅する速度に関係します。+int duaration = 5;//[ms]delayの待ち時間です。明滅する速度に関係します。
  
 void setup() {//(今回pinModeは省略しちゃいま~す) void setup() {//(今回pinModeは省略しちゃいま~す)
行 412: 行 610:
 void loop() { void loop() {
   for(int i = 0; i < 255; i++){//iに+1をし続け0から255になるまでの間ループ   for(int i = 0; i < 255; i++){//iに+1をし続け0から255になるまでの間ループ
-   analogWrite(LED,i);//D10にiの値を出力 +   analogWrite(LED_PIN,i);//D10にiの値を出力 
-   delay(SPEED);//次の出力までSPEED分待機する+   delay(duaration);//次の出力までduaration分待機する
   }   }
   delay(500);//完全に明るくなったら少し停止するといい感じに見える   delay(500);//完全に明るくなったら少し停止するといい感じに見える
   for(int i = 255; i > 0; i--){//iから-1をし続け255から0になるまでの間ループ   for(int i = 255; i > 0; i--){//iから-1をし続け255から0になるまでの間ループ
-   analogWrite(LED,i);//D10にiの値を出力 +   analogWrite(LED_PIN,i);//D10にiの値を出力 
-   delay(SPEED);//次の出力までSPEED分待機する+   delay(duaration);//次の出力までduaration分待機する
   }   }
   delay(500);//完全に暗くなったら少し停止するといい感じに見える   delay(500);//完全に暗くなったら少し停止するといい感じに見える
行 426: 行 624:
 == 2行目 == == 2行目 ==
 <code> <code>
-int DUTY 255;//デューティサイクルを設定(0~255)+int duaration 5;//[ms]delayの待ち時間です。明滅する速度に関係します。
 </code> </code>
 このスケッチでは、LEDに送るアナログ値を1段階ずつ増減させ点灯することで、連続的に明るさが変化するように見せます。 このスケッチでは、LEDに送るアナログ値を1段階ずつ増減させ点灯することで、連続的に明るさが変化するように見せます。
-この"1段階ずつ増減"の合間にdelay(SPEED);を挟むことにより、明滅の速度を調整します。 +この"1段階ずつ増減"の合間にdelay(duaration);を挟むことにより、明滅の速度を調整します。 
-(SPEEDを増やすと、よりゆっくり明滅するようになります)+(duarationを増やすと、よりゆっくり明滅するようになります)
  
 == 8行目 == == 8行目 ==
行 444: 行 642:
 == 9行目 == == 9行目 ==
 <code> <code>
-analogWrite(LED,i);//D10にiの値を出力+analogWrite(LED_PIN,i);//D10にiの値を出力
 </code> </code>
-analogWrite関数で、LEDにアナログ値を出力します。+analogWrite関数で、LED_PINにアナログ値を出力します。
 出力する値の指定には、for文を回すために作られた変数iを使い回し、その数値を出力します。 出力する値の指定には、for文を回すために作られた変数iを使い回し、その数値を出力します。
  
 == 10行目 == == 10行目 ==
 <code> <code>
-delay(SPEED);//次の出力までSPEED分待機する+delay(duaration);//次の出力までSPEED分待機する
 </code> </code>
-変数SPEEDに設定した数値分待機します。+変数duarationに設定した数値分待機します。
  
 == 12行目 == == 12行目 ==