Raspberry Pi Zero WからI2C経由でArduino Nanoで24個のサーボをコントロール
- 2018/01/01
- 13:14
Raspberry Pi Zero WからI2C経由でArduino Nanoで24個のサーボをコントロール
あけましておめでとうございます。本年もよろしくお願いします。
RoboTakaoです。ようこそ「極力ローコスト ロボット製作 ブログ」にお越しくださいました。
今回は前回書いた記事の続編として、Raspberry Pi Zero Wと2個のArduino NanoをI2Cで接続して、最大24個のサーボを動かしてみたいと思います。


前回の記事はこちらを参照してください。
結線図
まずは結線ですが、以前に書いた記事にArduino Nanoを2個にして24個サーボを動かす回路を追加しています。Arduino Nanoは標準のライブラリーを使うと12個までサーボを動かすことができるので2個のArduino Nanoで最大24個数となります。

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)
1個目のArduinoのアドレスを0x08に指定して、
2個目を0x04に指定。
24個のサーボ角度を0度→10〜120度を交互に送信します。
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]);
}
1個目用のスケッチは前回と同じですが、2個目はWire.begin(8);のところをWire.begin(4);にすればOK
結果
Raspberry Pi側で0,10〜120が交互に表示されると、Arduino側でも10〜120が交互に表示され、それに合わせてサーボが回転します。
Raspberry Pi側

Arduino側

ちなみに動画は手持ちのサーボの関係で10個だけです。左側が1個目のArdunoで右側が2個目のArdunoで動いています。
それでは今回はこの辺で失礼します!ありがとうございました。
スポンサードリンク