いそぷろのブログ

おもしろいことを考えていきたい

歩行ロボットをつくるにはまずこれ!【サーボ編2】

前回の記事はこちら

歩行ロボットをつくるにはまずこれ!【サーボ編】 - いそっぷ

 

この記事で何ができるのか

これです。

f:id:isopro:20141021024103j:plain

Arduinoでサーボ16個を制御します。

 

準備するもの

f:id:isopro:20141021024054j:plain

・Arduino UNO

・USBケーブル

・ブレッドボード

・ジャンパワイヤ

・バッテリ(5~6V)アルカリ乾電池4本直列でも可

・サーボモータ16個

Adafruit 16-Channel 12-bit PWM/Servo Driver - I2C interface 重要!

 

(以下サーボドライバーとよびます)

 

関連リンク

【Amazon】Arduino Uno 

【Amazon】 USB2.0ケーブル 1.8m (タイプAオス- タイプBオス)

【Amazon】普通のブレッドボード

【Amazon】ジャンパワイヤ(オス~オス)

【Amazon】マイクロサーボ SG90 (10個入)

PCA9685搭載16チャネル PWM/サーボ ドライバー (I2C接続) - スイッチサイエンス

 【Amazon】PCA9685 16Channel 12bit PWM サーボドライバー Arduino等の電子工作用

サーボモータについてはトルク2kg以上で

1000円以下のものを探すといいですよ

 

サーボドライバーについて

今回つかうサーボドライバーはこれです!

Adafruitから販売されています。

f:id:isopro:20141021024056j:plain

販売元のページ

http://www.adafruit.com/products/815

 

このサーボドライバーは、ArduinoとI2Cでつないで使います。

Arduinoのデジタルピンは全く使わずにサーボを制御できるんです!

 

サーボドライバー1個あれば最大28個まで制御可能!

サーボドライバーを使えば、Arduinoのデジタルピンがフリーで使えます。

やろうと思えば、ドライバーで16個、Arduino側で12個制御できます。

 

Arduinoだけだと12個しかサーボ制御できないし

歩行ロボットは難しくない?と思っている方には朗報です。

Arduinoとドライバーセットで考えれば、すぐにでも歩行ロボットが作れそうですね。

 

回路の準備

こんな感じにつなぎます。

f:id:isopro:20141021024108j:plain

 サーボドライバーのV+というところには外部バッテリーを必ずつけてください。

Arduinoの5Vピンからひっぱると壊れる可能性があります。

 

回路図上ではサーボモータ1個しか繋いでませんが、

16個つなぐとこうなります。

f:id:isopro:20141021024102j:plain

 

わたしのバッテリー

f:id:isopro:20141021024104j:plain

 わたしはよくバッテリーとしてエネループを使います。

が、エネループ一本あたりの電圧は1.2Vしかありません。

4本直列だと電圧に不安があるので、5本直列でつかっています。

 

【Amazon】Panasonic eneloop 単3形 4本付急速充電器セット

 

あまり電力のない外部電源を使うと、サーボモータの起電力に

負けちゃうかもしれないです。

 

プログラミング

Adafruitが公式で配信しているサンプルをわたし好みに書き換えました。

デフォルトではPWMで角度指示するところを

map文をつかった関数をつくり0~180で角度指示できるようにしました。

注意

Arduinoにサーボドライバーを使うためのドライバーを

インストールする必要があります。(ややこしい)

下記リンクからライブラリーのダウンロードをしてください。

 

2つリンクをのせますが、どちら片方で大丈夫です。

adafruit/Adafruit-PWM-Servo-Driver-Library · GitHub

Using the Adafruit Library | Adafruit 16-Channel Servo Driver with Arduino | Adafruit Learning System

 

zipをダウンロードしたら解凍して

Arduinoのインストールフォルダの中にある libraryフォルダに入れちゃってください。

下の画像を参考に。

f:id:isopro:20141021043805j:plain

 

サーボ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の使い方、設計、部品の買い方、実際につくる

という流れを書いていきます。

 

 

関連記事として過去のロボットたちをのせておきます。