Raspberry Pi Zero WからI2C経由でArduino Nanoで複数のサーボをコントロール
- 2017/12/30
- 14:17
Raspberry Pi Zero WからI2C経由でArduino Nanoで複数のサーボをコントロール
こんにちはRoboTakaoです。ようこそ「極力ローコスト ロボット製作 ブログ」にお越しくださいました。
今回は前回書いた記事の続編として、Raspberry Pi Zero WとArduino NanoをI2Cで接続して、さらに複数のサーボを動かしてみたいと思います。
複数のというところが違いです。

I2Cでの接続については以前の記事を参考にしてください。
前回の記事はこちらを参照してください。
結線図
まずは結線ですが、以前に書いた記事にArduino Nanoから12個サーボを動かす回路を追加しています。Arduino Nanoは標準のライブラリーを使うと12個までサーボを動かすことができるので最大個数となります。
サーボは省略していますが、それぞれD2〜D13ポートに信号ラインを接続すればOKです。

pythonのコード
import smbus
import time
ANGLE0 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
ANGLE1 = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120]
bus = smbus.SMBus(1)
SLAVE_ADDRESS = 0x08
CMD = 0x00
while True:
bus.write_i2c_block_data(SLAVE_ADDRESS, CMD, ANGLE0)
print(ANGLE0)
time.sleep(2)
bus.write_i2c_block_data(SLAVE_ADDRESS, CMD, ANGLE1)
print(ANGLE1)
time.sleep(2)
Arduinoのアドレスを0x08に指定して、
12個のサーボ角度を0度→10〜120度を交互に送信します。
今回はwrite_byteを使用する代わりにwrite_i2c_block_dataを使います。
これで1バイトのデータを複数送信できます。
今回の場合はANGLE0とANGLE1をリスト化して12個のデータを格納しています。
二番目の引数(CMD)は今回は特に使用していませんので、ダミーで0x00を送るようにしています。
Arduinoのスケッチ
#include
#include
Servo myservo2;
Servo myservo3;
Servo myservo4;
Servo myservo5;
Servo myservo6;
Servo myservo7;
Servo myservo8;
Servo myservo9;
Servo myservo10;
Servo myservo11;
Servo myservo12;
Servo myservo13;
int cmd;
int ang[]= {0,0,0,0,0,0,0,0,0,0,0,0};
void setup()
{
myservo2.attach(2);
myservo3.attach(3);
myservo4.attach(4);
myservo5.attach(5);
myservo6.attach(6);
myservo7.attach(7);
myservo8.attach(8);
myservo9.attach(9);
myservo10.attach(10);
myservo11.attach(11);
myservo12.attach(12);
myservo13.attach(13);
Wire.begin(8);
Wire.onReceive(receiveEvent);
Serial.begin(9600);
}
void loop()
{
myservo2.write(ang[0]);
myservo3.write(ang[1]);
myservo4.write(ang[2]);
myservo5.write(ang[3]);
myservo6.write(ang[4]);
myservo7.write(ang[5]);
myservo8.write(ang[6]);
myservo9.write(ang[7]);
myservo10.write(ang[8]);
myservo11.write(ang[9]);
myservo12.write(ang[10]);
myservo13.write(ang[11]);
delay(100);
}
void receiveEvent(int howMany)
{
cmd =Wire.read();
for (int i=0; i <=11; i++){
ang[i]= Wire.read();
}
for (int i=0; i <=10; i++){
Serial.print(ang[i]);
Serial.print(",");
}
Serial.println(ang[11]);
}
結果
Raspberry Pi側で0,10〜120が交互に表示されると、Arduino側でも10〜120が交互に表示され、それに合わせてサーボが回転します。
Raspberry Pi側

Arduino側

ちなみに動画は手持ちのサーボの関係で10個だけです。
それでは今回はこの辺で失礼します!ありがとうございました。
スポンサードリンク
Raspberry Pi Zero WからI2C経由でArduino Nanoで24個のサーボをコントロール ホーム
Raspberry Pi Zero WからI2C経由でArduino Nanoでサーボをコントロール