歩行ロボットをつくるにはまずこれ!【サーボ編2】
前回の記事はこちら
歩行ロボットをつくるにはまずこれ!【サーボ編】 - いそっぷ
この記事で何ができるのか
これです。
Arduinoでサーボ16個を制御します。
準備するもの
・Arduino UNO
・USBケーブル
・ブレッドボード
・ジャンパワイヤ
・バッテリ(5~6V)アルカリ乾電池4本直列でも可
・サーボモータ16個
・Adafruit 16-Channel 12-bit PWM/Servo Driver - I2C interface ←重要!
(以下サーボドライバーとよびます)
関連リンク
【Amazon】 USB2.0ケーブル 1.8m (タイプAオス- タイプBオス)
PCA9685搭載16チャネル PWM/サーボ ドライバー (I2C接続) - スイッチサイエンス
【Amazon】PCA9685 16Channel 12bit PWM サーボドライバー Arduino等の電子工作用
サーボモータについてはトルク2kg以上で
1000円以下のものを探すといいですよ
サーボドライバーについて
今回つかうサーボドライバーはこれです!
Adafruitから販売されています。
販売元のページ
http://www.adafruit.com/products/815
このサーボドライバーは、ArduinoとI2Cでつないで使います。
Arduinoのデジタルピンは全く使わずにサーボを制御できるんです!
サーボドライバー1個あれば最大28個まで制御可能!
サーボドライバーを使えば、Arduinoのデジタルピンがフリーで使えます。
やろうと思えば、ドライバーで16個、Arduino側で12個制御できます。
Arduinoだけだと12個しかサーボ制御できないし
歩行ロボットは難しくない?と思っている方には朗報です。
Arduinoとドライバーセットで考えれば、すぐにでも歩行ロボットが作れそうですね。
回路の準備
こんな感じにつなぎます。
サーボドライバーのV+というところには外部バッテリーを必ずつけてください。
Arduinoの5Vピンからひっぱると壊れる可能性があります。
回路図上ではサーボモータ1個しか繋いでませんが、
16個つなぐとこうなります。
わたしのバッテリー
わたしはよくバッテリーとしてエネループを使います。
が、エネループ一本あたりの電圧は1.2Vしかありません。
4本直列だと電圧に不安があるので、5本直列でつかっています。
【Amazon】Panasonic eneloop 単3形 4本付急速充電器セット
あまり電力のない外部電源を使うと、サーボモータの起電力に
負けちゃうかもしれないです。
プログラミング
Adafruitが公式で配信しているサンプルをわたし好みに書き換えました。
デフォルトではPWMで角度指示するところを
map文をつかった関数をつくり0~180で角度指示できるようにしました。
注意
Arduinoにサーボドライバーを使うためのドライバーを
インストールする必要があります。(ややこしい)
下記リンクからライブラリーのダウンロードをしてください。
2つリンクをのせますが、どちら片方で大丈夫です。
adafruit/Adafruit-PWM-Servo-Driver-Library · GitHub
zipをダウンロードしたら解凍して
Arduinoのインストールフォルダの中にある libraryフォルダに入れちゃってください。
下の画像を参考に。
サーボ1個ver
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
#define SERVOMIN 150 // this is the 'minimum' pulse length count (out of 4096)
#define SERVOMAX 600 // this is the 'maximum' pulse length count (out of 4096)void setup() {
pwm.begin();
pwm.setPWMFreq(60); // Analog servos run at ~60 Hz updates
servo_write(0,90);
}void loop() {
//0番ピンのサーボに角度10度を指示
servo_write(0,10);
delay(500);
//0番ピンのサーボに角度170度を指示
servo_write(0,170);
delay(500);
}void servo_write(int n, int ang){ //動かすサーボと角度を引数に持つ
ang = map(ang, 0, 180, SERVOMIN, SERVOMAX); //角度(0~180)をPWMのパルス幅(150~600)へ変換
pwm.setPWM(n, 0, ang);
}
サーボ16個ver
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
#define SERVOMIN 150 // this is the 'minimum' pulse length count (out of 4096)
#define SERVOMAX 600 // this is the 'maximum' pulse length count (out of 4096)void setup() {
pwm.begin();
pwm.setPWMFreq(60); // Analog servos run at ~60 Hz updates
for(int i=0; i<16; i++){
servo_write(i,10);
delay(50);
}
}void loop() {
for(int i=0; i<16; i++){
servo_write(i,10);
delay(300);
}
for(int i=0; i<16; i++){
servo_write(i,170);
delay(300);
}
}
void servo_write(int n, int ang){ //動かすサーボと角度を引数に持つ
ang = map(ang, 0, 180, SERVOMIN, SERVOMAX); //角度(0~180)をPWMのパルス幅(150~600)へ変換
pwm.setPWM(n, 0, ang);
}
2種類のプログラムを載せましたが、どちらもやってることはあまり変わりません。
最後に
16個verのプログラムを動かすとこんな感じになります。
サーボの動かし方はわかったけど、そこからどうすればいいかわからない。
という方向けに今後、3DCADの使い方、設計、部品の買い方、実際につくる
という流れを書いていきます。
関連記事として過去のロボットたちをのせておきます。