「Arduino Mega 2560 LESSON:9 サーボ」の版間の差分
編集の要約なし |
(→概要) |
||
| 66行目: | 66行目: | ||
== '''概要''' == | == '''概要''' == | ||
サーボを使った課題です。 | |||
接続図は以下のとおりです。 | |||
コードは以下のようなものです。 | |||
<freescript></script><div class="hljs-wrap"><pre data-label="Arduino Code" class="pre-wrap"> | <freescript></script><div class="hljs-wrap"><pre data-label="Arduino Code" class="pre-wrap"> | ||
<code class="cpp"> | <code class="cpp">//www.elegoo.com | ||
//www.elegoo.com | |||
//2018.12.19 | //2018.12.19 | ||
#include <Servo.h> | #include <Servo.h> | ||
| 90行目: | 95行目: | ||
} | } | ||
</code></pre></div><script></freescript> | </code></pre></div><script></freescript> | ||
サーボライブラリを使った角度の調整です。サーボの位置を瞬時に角度を変えていくという内容のコードですね。サーボの舵の部分を自分に向けて置いた場合の表現で以後、話を進めます。左とか右とか言う表現をしますが、自分に舵を向けた状態から見て左と右とか言ってるんだなぁって思って下さい。 | |||
サーボは赤と黒にあたる線で電源を供給します。赤は+5Vに黒にあたる茶色の線は、GNDへ接続します。サーボの信号線である橙色の線では、パルス波を受け取り角度を調整しています。ライブラリを使わずにまずはパルス波を送ってみましょう。 | |||
<freescript></script><div class="hljs-wrap"><pre data-label="Arduino Code" class="pre-wrap"> | |||
<code class="cpp">// SG90サーボ制御 | |||
// Servoライブラリ不使用 | |||
// タイマー割り込み処理なし | |||
const int servoPin = 9; // サーボ信号線:D9 | |||
void setup() { | |||
pinMode(servoPin, OUTPUT); | |||
digitalWrite(servoPin, LOW); | |||
} | |||
void loop() { | |||
// サーボ信号をHIGHにする | |||
digitalWrite(servoPin, HIGH); | |||
// 1500マイクロ秒待つ(中央位置) | |||
delayMicroseconds(1500); | |||
// サーボ信号をLOWにする | |||
digitalWrite(servoPin, LOW); | |||
// 次のパルスまで待つ | |||
delayMicroseconds(18500); | |||
} | |||
</code></pre></div><script></freescript> | |||
このように1500μsecのONと18500μsecのOffを繰り返すパルス波を送ると概ね真ん中の位置でキープしますが、少し不安定であるためサーボがピクピク震えます。1000μsecのONと19000μsecだと左に振れた状態をキープします | |||
*1500μsecのONと18500μsecのOff:真ん中 | |||
*1000μsecのONと19000μsecのOff:左 | |||
*2000μsecのONと18000μsecのOff:右 | |||
以下のようにすると、左右にサーボがうごきます。左も右も45度くらいしか動かないので、完全に横に向いた状態にはならないですね。 | |||
<freescript></script><div class="hljs-wrap"><pre data-label="Arduino Code" class="pre-wrap"> | |||
<code class="cpp">// SG90サーボ制御 | |||
// Servoライブラリ不使用 | |||
// タイマー割り込み処理なし | |||
// 左右振り | |||
const int servoPin = 9; // サーボ信号線:D9 | |||
void setup() { | |||
pinMode(servoPin, OUTPUT); | |||
digitalWrite(servoPin, LOW); | |||
} | |||
void loop() { | |||
for(int i = 1000; i < 2000; i++){ | |||
// サーボ信号をHIGHにする | |||
digitalWrite(servoPin, HIGH); | |||
// 1500マイクロ秒待つ(左位置から右位置へ) | |||
delayMicroseconds(i); | |||
// サーボ信号をLOWにする | |||
digitalWrite(servoPin, LOW); | |||
// 次のパルスまで待つ | |||
delayMicroseconds(19000 - i); | |||
} | |||
for(int i = 2000; i > 1000; i--){ | |||
// サーボ信号をHIGHにする | |||
digitalWrite(servoPin, HIGH); | |||
// 1500マイクロ秒待つ(右位置から左位置へ) | |||
delayMicroseconds(i); | |||
// サーボ信号をLOWにする | |||
digitalWrite(servoPin, LOW); | |||
// 次のパルスまで待つ | |||
delayMicroseconds(19000 - i); | |||
} | |||
} | |||
</code></pre></div><script></freescript> | |||
サーボライブラリを使わなくても動かすこと自体はできますが、これでは途中で処理を入れる都度、パルス幅が変わって位置が不安定になっていきます。そこで割り込みという技術を使います。 | |||
[[Arduino Mega 2560]]に戻る。 | [[Arduino Mega 2560]]に戻る。 | ||
2026年10月10日 (土) 23:37時点における版
概要
サーボを使った課題です。
接続図は以下のとおりです。
コードは以下のようなものです。
//www.elegoo.com
//2018.12.19
#include <Servo.h>
Servo myservo;
void setup(){
myservo.attach(9);
myservo.write(90);// move servos to center position -> 90°
}
void loop(){
myservo.write(90);// move servos to center position -> 90°
delay(500);
myservo.write(30);// move servos to center position -> 60°
delay(500);
myservo.write(90);// move servos to center position -> 90°
delay(500);
myservo.write(150);// move servos to center position -> 120°
delay(500);
}
サーボライブラリを使った角度の調整です。サーボの位置を瞬時に角度を変えていくという内容のコードですね。サーボの舵の部分を自分に向けて置いた場合の表現で以後、話を進めます。左とか右とか言う表現をしますが、自分に舵を向けた状態から見て左と右とか言ってるんだなぁって思って下さい。
サーボは赤と黒にあたる線で電源を供給します。赤は+5Vに黒にあたる茶色の線は、GNDへ接続します。サーボの信号線である橙色の線では、パルス波を受け取り角度を調整しています。ライブラリを使わずにまずはパルス波を送ってみましょう。
// SG90サーボ制御
// Servoライブラリ不使用
// タイマー割り込み処理なし
const int servoPin = 9; // サーボ信号線:D9
void setup() {
pinMode(servoPin, OUTPUT);
digitalWrite(servoPin, LOW);
}
void loop() {
// サーボ信号をHIGHにする
digitalWrite(servoPin, HIGH);
// 1500マイクロ秒待つ(中央位置)
delayMicroseconds(1500);
// サーボ信号をLOWにする
digitalWrite(servoPin, LOW);
// 次のパルスまで待つ
delayMicroseconds(18500);
}
このように1500μsecのONと18500μsecのOffを繰り返すパルス波を送ると概ね真ん中の位置でキープしますが、少し不安定であるためサーボがピクピク震えます。1000μsecのONと19000μsecだと左に振れた状態をキープします
- 1500μsecのONと18500μsecのOff:真ん中
- 1000μsecのONと19000μsecのOff:左
- 2000μsecのONと18000μsecのOff:右
以下のようにすると、左右にサーボがうごきます。左も右も45度くらいしか動かないので、完全に横に向いた状態にはならないですね。
// SG90サーボ制御
// Servoライブラリ不使用
// タイマー割り込み処理なし
// 左右振り
const int servoPin = 9; // サーボ信号線:D9
void setup() {
pinMode(servoPin, OUTPUT);
digitalWrite(servoPin, LOW);
}
void loop() {
for(int i = 1000; i < 2000; i++){
// サーボ信号をHIGHにする
digitalWrite(servoPin, HIGH);
// 1500マイクロ秒待つ(左位置から右位置へ)
delayMicroseconds(i);
// サーボ信号をLOWにする
digitalWrite(servoPin, LOW);
// 次のパルスまで待つ
delayMicroseconds(19000 - i);
}
for(int i = 2000; i > 1000; i--){
// サーボ信号をHIGHにする
digitalWrite(servoPin, HIGH);
// 1500マイクロ秒待つ(右位置から左位置へ)
delayMicroseconds(i);
// サーボ信号をLOWにする
digitalWrite(servoPin, LOW);
// 次のパルスまで待つ
delayMicroseconds(19000 - i);
}
}
サーボライブラリを使わなくても動かすこと自体はできますが、これでは途中で処理を入れる都度、パルス幅が変わって位置が不安定になっていきます。そこで割り込みという技術を使います。