「Arduino Mega 2560 LESSON:9 サーボ」の版間の差分
(→概要) |
編集の要約なし |
||
| 189行目: | 189行目: | ||
サーボライブラリを使わなくても動かすこと自体はできますが、これでは途中で処理を入れる都度、パルス幅が変わって位置が不安定になっていきます。そこで割り込みという技術を使います。 | サーボライブラリを使わなくても動かすこと自体はできますが、これでは途中で処理を入れる都度、パルス幅が変わって位置が不安定になっていきます。そこで割り込みという技術を使います。 | ||
以下のようにライブラリを使って真ん中に設定するとものすごく安定しています。舵をさわってもほとんど振動を感じません。 | |||
<freescript></script><div class="hljs-wrap"><pre data-label="Arduino Code" class="pre-wrap"> | |||
<code class="cpp">#include <Servo.h> | |||
Servo myservo; | |||
void setup() { | |||
myservo.attach(9); | |||
myservo.writeMicroseconds(1500); | |||
} | |||
void loop() { | |||
} | |||
</code></pre></div><script></freescript> | |||
上記のコードは非常に安定します。 | |||
<freescript></script><div class="hljs-wrap"><pre data-label="Arduino Code" class="pre-wrap"> | |||
<code class="cpp">void setup() { | |||
pinMode(servoPin, OUTPUT); | |||
digitalWrite(servoPin, LOW); | |||
} | |||
void loop() { | |||
noInterrupts(); | |||
digitalWrite(9, HIGH); | |||
delayMicroseconds(1500); | |||
digitalWrite(9, LOW); | |||
interrupts(); | |||
delayMicroseconds(18500); | |||
} | |||
</code></pre></div><script></freescript> | |||
上記のようなコードにすると少し改善されます。舵を触るとかすかに振動を感じます。 | |||
[[Arduino Mega 2560]]に戻る。 | [[Arduino Mega 2560]]に戻る。 | ||
2026年10月10日 (土) 23:51時点における版
概要
サーボを使った課題です。
接続図は以下のとおりです。
コードは以下のようなものです。
//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);
}
}
サーボライブラリを使わなくても動かすこと自体はできますが、これでは途中で処理を入れる都度、パルス幅が変わって位置が不安定になっていきます。そこで割り込みという技術を使います。
以下のようにライブラリを使って真ん中に設定するとものすごく安定しています。舵をさわってもほとんど振動を感じません。
#include <Servo.h>
Servo myservo;
void setup() {
myservo.attach(9);
myservo.writeMicroseconds(1500);
}
void loop() {
}
上記のコードは非常に安定します。
void setup() {
pinMode(servoPin, OUTPUT);
digitalWrite(servoPin, LOW);
}
void loop() {
noInterrupts();
digitalWrite(9, HIGH);
delayMicroseconds(1500);
digitalWrite(9, LOW);
interrupts();
delayMicroseconds(18500);
}
上記のようなコードにすると少し改善されます。舵を触るとかすかに振動を感じます。