記事一覧

Raspberry Pi Zero WからI2C経由でArduino Nanoで24個のサーボをコントロール

Raspberry Pi Zero WからI2C経由でArduino Nanoで24個のサーボをコントロール



あけましておめでとうございます。本年もよろしくお願いします。

RoboTakaoです。ようこそ「極力ローコスト ロボット製作 ブログ」にお越しくださいました。

今回は前回書いた記事の続編として、Raspberry Pi Zero Wと2個のArduino NanoをI2Cで接続して、最大24個のサーボを動かしてみたいと思います。

RasArI2C25.jpg

RasArI2C26.jpg

前回の記事はこちらを参照してください。

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

RasArI2C24.png


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側

RasArI2C23.png

Arduino側

RasArI2C22.png

ちなみに動画は手持ちのサーボの関係で10個だけです。左側が1個目のArdunoで右側が2個目のArdunoで動いています。



それでは今回はこの辺で失礼します!ありがとうございました。

コメント

コメントの投稿

非公開コメント

プロフィール

RoboTakao

Author:RoboTakao
みなさんご訪問ありがとうございます。ロボット作りたいけどお小遣いそんなにないし、簡単でローコストでロボットを作るための私のプロジェクトを紹介します。

ウェブサイトもありますのでそちらもよろしくお願いします。
http://robotakao.jp/