動かしたいですが,正直GPIOを制御するのはめんどくさそうです.
モータなどリアルタイム性が高いものは他のマイコンに任せるのが
いいと思いました.
そこでArduinoにサーボモータを接続し,i2c経由でアクセスしてみます.
こんな感じ.テストなのでごちゃごちゃです.
サーボは一般的なSG90です.
Rpi3 -> arduino
GPIO2 -> a4(SDA)
GPIO3 -> a5(SCL)
GND -> GND
arduino->SG90
Vcc -> Vcc
GND -> GND
Sig -> D4(サーボ1)
Sig -> D5(サーボ2)
Arduinoは3.3Vで起動しACアダプタから外部電源を取ります.
そうしなければサーボを動かした瞬間落ちます.
Arduino側プログラム
#include<Servo.h>
#include <Wire.h>
Servo servo_pan;
Servo servo_tilt;
byte recv_data[256];
byte addr = 8;// Slave ID #8
byte deg_pan = 0;
byte deg_tilt = 0;
void setup() {
servo_pan.attach(4);
servo_tilt.attach(5);
Wire.begin(addr);
Wire.onReceive(receiveEvent);
Wire.onRequest(requestEvent);
Serial.begin(115200);
}
void loop() {
if(deg_pan>=0 && deg_pan<=180){servo_pan.write(deg_pan);}
if(deg_tilt>=0 && deg_tilt<=180){servo_tilt.write(deg_tilt);}
delay(1000);
}
void receiveEvent(int a){
int i=0;
//delay(100);
while (Wire.available()) {
recv_data[i] = Wire.read();
Serial.print(recv_data[i],DEC);
Serial.print(" ");
i++;
}
if(i>0){Serial.println(' ');}
if(i>1){
if(recv_data[0] == 4){ deg_pan = recv_data[1]; }
else if(recv_data[0] == 5){ deg_tilt = recv_data[1]; }
}
}
void requestEvent() {
Wire.write(addr);
}
一応シリアル通信でデバックできるようにしておきました.
マスタからはレジスタ(4or5),角度(0~180)を送ります.
マスタからの読み出しはi2cdetectコマンドで使用するので
アドレスを返すようにしておきます.
とりあえず動作確認
Rpi3でi2cを使えるようにする.
こちらを参考にライブラリをインストールしました.
以下コマンドで接続デバイスを確認します.
$ sudo i2cdetect -y 1
上記のArduinoプログラムでは0x08がスレーブアドレスです.
コマンドからは
$ sudo i2cset -y 1 0x08 0x04 "角度"
で操作できます.
接続まで確認しました.Arduinoを使用したのはATmega328と
クリスタル等数セットが余っていたので何かに利用できないかと思ったからです.
とりあえずブラウザからアクセスできるカメラマウントの製作を目指します.