Windows PCを使って、Arduinoとサーボモーターの動作確認をします。
カメラマウントの制御に使う2つのサーボモーターを0度から180度に遷移させるテストプログラムを作成して動作確認をします。
カメラマウントの台に取り付ける下側のサーボモーターは、カメラの向きの左右を決めます。
カメラを取り付ける上側のサーボモーターは、カメラの向きの上下を決めます。
Windows PCにArduino IDEをインストールする
下記からArduino IDEを1.8.5をダウンロードしてインストールします。(2017.11.01)
ARDUINO SOFTWARE
Windows PCとArduinoを接続する
Windows PCとArduinoをUSBケーブルで接続します。
ArduinoにAC電源を接続します。(USBからの電力供給でサーボモーター2個を動作させることに困ったことはなく、サーボモーターを10個動作させるような予定も無いですが、念の為。)
Arduinoとサーボモーターを接続する
赤のワイヤーを5Vに接続して、緑のワイヤーをGNDに接続しています。
サーボモーターの制御にArduinoの10番と11番を使います。黄色のワイヤーを接続しています。
10番をカメラマウントの下側に配置するサーボモーターに接続します。11番をカメラマウントの上側に配置するサーボモーターに接続します。
(ジャンパーワイヤーの先端の金属部分がもう少し長ければ、5VとGNDの接続はブレッドボードを使わずに、みのむしクリップで大丈夫だったのですが。)
SG90の接続です。
プログラムで実現することを決める
Arduinoに接続した2つのサーボモーターを下記の順で動作させます。
Arduinoなので、処理が完了すると、loop関数が最初から実行される、が繰り返されます。
- サーボモーター(下側)を0度から180度に遷移させる
- サーボモーター(上側)を0度から180度に遷移させる
- サーボモーター(下側)を180度から0度に遷移させる
- サーボモーター(上側)を180度から0度に遷移させる
プログラムを設計する
短く簡単なプログラムなので、設計は必要ありません。
プログラムを実装する
ソースコードを掲載します。
サーボモーターの角度の制御でパルス幅を決める必要があるのですが、Servoライブラリが全部やってくれています。
Secrets of Arduino PWM
write()
test.ino
// delay( 1000 ) = 1 second
// ---------
// | |<------->|Servomotor|
// |Arduino|
// | |<------->|Servomotor|
// ---------
// -----------------------------------------------------------------------------
#include <Servo.h>
const int LOWER_MOTOR_PIN = 10;
const int UPPER_MOTOR_PIN = 11;
Servo lower_motor;
Servo upper_motor;
int lower_motor_degree = 0;
int upper_motor_degree = 0;
// -----------------------------------------------------------------------------
void
setup()
{
lower_motor.attach( LOWER_MOTOR_PIN );
upper_motor.attach( UPPER_MOTOR_PIN );
}
// -----------------------------------------------------------------------------
void
loop()
{
for ( int i=0; i <= 180; ++i )
{
lower_motor_degree = i;
lower_motor.write( lower_motor_degree );
delay( 20 );
}
for ( int i=0; i <= 180; ++i )
{
upper_motor_degree = i;
upper_motor.write( upper_motor_degree );
delay( 20 );
}
for ( int i=0; i <= 180; ++i )
{
lower_motor_degree = i;
lower_motor.write( 180 - lower_motor_degree );
delay( 20 );
}
for ( int i=0; i <= 180; ++i )
{
upper_motor_degree = i;
upper_motor.write( 180 - upper_motor_degree );
delay( 20 );
}
}