ここでは、小型の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