記事一覧

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

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



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

今回は前回書いた記事の続編として、Raspberry Pi Zero WとArduino NanoをI2Cで接続して、さらに複数のサーボを動かしてみたいと思います。
複数のというところが違いです。

RasArI2C20.png


I2Cでの接続については以前の記事を参考にしてください。

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

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

サーボは省略していますが、それぞれD2〜D13ポートに信号ラインを接続すればOKです。

RasArI2C21.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)


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側

RasArI2C18.png

Arduino側

RasArI2C19.png

ちなみに動画は手持ちのサーボの関係で10個だけです。



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

スポンサードリンク

コメント

コメントの投稿

非公開コメント

プロフィール

RoboTakao

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

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

スポンサーリンク