ここでは、小型のDCモータの回転制御を行います。小型DCモータは玩具にもよく利用されています。多くの小型DCモーターは電池1、または、2本(1.5-3.0V)で電流
0.3-0.5A 程度です。




//DCモータPWM制御
//トランジスタ利用
int ipwr = 50,pwr;
int inc = 5; //変化量
int mtr=11; //PWM端子
void setup() {
//
Serial.begin(9600);
pinMode(mtr, OUTPUT);//
pwr=ipwr;
}
void loop() {
Serial.println(pwr);
analogWrite(mtr, pwr);
pwr = pwr + inc;
//50以下、180以上で折り返す
if (pwr < ipwr || pwr >= 180) {
inc = -inc ;
}
//
delay(500);
}


iv=(val<<2) + dir;<< は左シフト演算で、残った2ビットに dir を加えて合成します。これを Wire.write(iv) でモジュールに送ります。他の Wire の命令は、「I2C接続方式」の章を参照してください。
//I2Cアドレス 0x64 (ジャンパーない(open)とき)
//内部レジスタ0にコマンド書き込み
//先頭6bitが電圧、下位2bitが制御
// V=0x6:0.48V 0x10:1.29V 0x20:2.57V
// 0x30:3.86V 0x3F 5.0V
//下位2bit 00:standby 01:時計回り 10:反時計回り 11;Brake
//接続
//ard.SCL>mc.SCL>2kpull up
//ard.SDA>mc.SDA>2k pull up
//ard.VCC>mc.VCC(5V)
//ard.GND>mc.GND
//Arduino SCL:A5: SDA:A4:
#include <Wire.h>
int address = 0x64;
int val=0,iv,inc;
int dir=1;
void setup () {
Wire.begin();
Serial.begin(9600);
Serial.println("start");
val=4;
inc=2;
}
void loop(){
val=val+inc;
if(val<4) {
inc=-inc;
dir++;
if(dir==3) dir=1;
}
if(val>0x20) {//RE140の時0x20
inc=-inc;
}
//
Serial.print(val);
iv=(val<<2) + dir;
Serial.print(",");
Serial.println(iv,HEX);
Wire.beginTransmission(address);
Wire.write(0x0);
Wire.write(iv);//速度と方向を指定
Wire.endTransmission();
delay(1000);
}




//起動時の回転時間の測定
#include <Wire.h>
#define mx 100
int motor = 0x64;
int sltt=9;
long ct,pt;
int cs,ps;
int cst,pst,diff;
long slt[mx];
int dft[mx];
int cnt,i;
int first;
void setup () {
Wire.begin();
Serial.begin(9600);
Serial.println("start");
delay(3000);
//
set_motorSpeed(18,1);
pt=millis();
ps=HIGH;
pst=0;
cnt=0;
first=1;
}
void loop(){
cs=digitalRead(sltt);
if(cs==LOW && ps==HIGH){
ct=millis();
diff=ct-pt;
if(cnt<mx){
slt[cnt]=ct;
dft[cnt]=diff;
cnt++;
}
else {
for(i=0;i<mx;i++){
Serial.print(i);
Serial.print(",");
Serial.print(slt[i]);
Serial.print(",");
Serial.println(dft[i]);
}
set_motorSpeed(0,1);
}
pt=ct;
//pst=cst;
}
ps=cs;
}
void set_motorSpeed(int val,int dir){
Wire.beginTransmission(motor);
Wire.write(0x0);
Wire.write((val<<2)+dir);
Wire.endTransmission();
}
起動以後、次第に回転周期(3番目の数値)が短くなります。//速度指定 18 2,3096,49 3,3125,29 4,3148,23 5,3169,21 6,3187,18 7,3204,17 8,3220,16 9,3234,14 10,3249,15 11,3262,13 12,3275,13 13,3289,14 14,3301,12 15,3313,12 16,3324,11 17,3337,13 18,3348,11 19,3359,11 20,3371,12 21,3381,10