https://blog.with2.net/link/?1965529

TouchOSCでステッピングモータをリモコン

https://blog.with2.net/link/?1965529

前記事ではLED輝度をリモコン操作するところまでは出来ましたので、今回はステッピングモータを操作してみます。

モータドライバはA4988を、ステッピングモータは2018/6/30付けの記事で紹介したAliexpressで購入したものを使用しています。

  • 抵抗値: 10.6 Ω
  • 5ボルト短絡電流: 0.45A
  • モータステッピング角度: 15 °
  • 出力軸ステッピング角度:0.36°
  • 2相4線式(1 & 3: a、2 & 4: b)
  • 減速比 1:41

スケッチは以下のようにしました。ステッピングモータをfor文で連続回転するようにしています。

include “ESP8266WiFi.h”

include “WiFiUDP.h”

include “OSCMessage.h”

IPAddress myIP(192, 168, 4, 1);
IPAddress HOSTIP (192, 168, 4, 2);
const char *ssid = “osctest”;
const char *password = “12345678”;
int localPort = 8000;
WiFiUDP Udp;

int rpm;
int x;

void setup() {
WiFi.softAP(ssid, password);
IPAddress myIP = WiFi.softAPIP();
Udp.begin(localPort);
Serial.begin(115200);
//analogWriteRange(255);
int tries = 0;
while (WiFi.status() != WL_CONNECTED) {
delay(500);
tries++;
if (tries > 30) {
break;
}
}
pinMode(12,OUTPUT); //Step
pinMode(13,OUTPUT); //Dir
pinMode(4,OUTPUT); //Step
pinMode(5,OUTPUT); //Dir

}

void OSCMsgReceive() {
OSCMessage msgIN;
int size;
if ((size = Udp.parsePacket()) > 0) {
while (size–)
msgIN.fill(Udp.read());
if (!msgIN.hasError()) {
msgIN.route(“/minitank/fader1”,fader1);//turn left & right
msgIN.route(“/minitank/fader2”,fader2);//forward & reverse
}
}
}

void fader1(OSCMessage &msg, int addrOffset ){//turn left & right
int value1 = msg.getFloat(0);

if ( value1 >137 && value1 < 255){//turn right
digitalWrite(13,HIGH);
digitalWrite(5,LOW);
rpm = map(value1,137,255,1000,500);
Serial.print(value1);
Serial.print(” , “);
Serial.println(rpm);
for(x = 0; x < 40; x++){
digitalWrite(12,HIGH);
digitalWrite(4,HIGH);
delayMicroseconds(rpm);
digitalWrite(12,LOW);
digitalWrite(4,LOW);
delayMicroseconds(rpm);
}
delayMicroseconds(10); //これがないと途中でWiFi通信が停止する?
}

if ( value1 >0 && value1 < 117){//turn left digitalWrite(13,LOW); digitalWrite(5,HIGH); rpm = map(value1,117,0,1000,500); Serial.print(value1); Serial.print(” , “); Serial.println(rpm); for(x = 0; x < 40; x++){ digitalWrite(12,HIGH); digitalWrite(4,HIGH); delayMicroseconds(rpm); digitalWrite(12,LOW); digitalWrite(4,LOW); delayMicroseconds(rpm); } delayMicroseconds(10); //これがないと途中でWiFi通信が停止する? } if (value1 >117 && value1 <137){//brake
digitalWrite(12, LOW);
digitalWrite(4, LOW);
Serial.print(value1);
Serial.print(” , “);
}
delayMicroseconds(10); //これがないと途中でWiFi通信が停止する?
}

void fader2(OSCMessage &msg, int addrOffset ){//forward & reverse
int value2 = msg.getFloat(0);

if ( value2 >137 && value2 < 255){//forward
digitalWrite(13,HIGH);
digitalWrite(5,HIGH);
rpm = map(value2,137,255,1000,500);
Serial.print(value2);
Serial.print(” , “);
Serial.println(rpm);
for(x = 0; x < 20; x++){
digitalWrite(12,HIGH);
digitalWrite(4,HIGH);
delayMicroseconds(rpm);
digitalWrite(12,LOW);
digitalWrite(4,LOW);
delayMicroseconds(rpm);

}
delayMicroseconds(10); //これがないと途中でWiFi通信が停止する?
}

if ( value2 >0 && value2 < 117){//reverse digitalWrite(13,LOW); digitalWrite(5,LOW); rpm = map(value2,117,0,1000,500); Serial.print(value2); Serial.print(” , “); Serial.println(rpm); for(x = 0; x < 20; x++){ digitalWrite(12,HIGH); digitalWrite(4,HIGH); delayMicroseconds(rpm); digitalWrite(12,LOW); digitalWrite(4,LOW); delayMicroseconds(rpm); } delay(1); //これがないと途中でWiFi通信が停止する? } if (value2 >117 && value2 <137){//brake
Serial.print(value2);
Serial.print(” , “);
digitalWrite(12, LOW);
digitalWrite(4, LOW);
}
delay(1); //これがないと途中でWiFi通信が停止する?
}

void loop() {
OSCMsgReceive();
}



何か所かに以下の一行が挿入されていますが、これがないとWiFi接続がステッピングモータを駆動すると遮断されてしまいます。当初はノイズまたは電圧降下を疑って回路的に対策をしてみましたが効果なく、何となく入れてみたこの一行が効果ありということで意味はよくわかりません。

”” delay(1); //これがないと途中でWiFi通信が停止する? ””

TouchOSC の操作画面です。

運転してみました、スライダーの動きに応じて速度、回転方向は反応してくれています。

ただ問題があります。for文で20ステップを繰り返すことになっていますが、スライダーをその場で停止させておくと当然20ステップが終了するとモータは停止してしまいます。運転を続けるためにはスライダーを動かし続けなければならないということです。以前に試みたジョイスティックでは構造上、その場で停止させることは難しいので気づかなかった問題です。

ある値を与えれば回転をつづけるような命令にしたいのですが、どこを探しても情報がありません。また課題が増えました。ともかくこれはこれで一旦mini tankを完成させてしまいます。

ということでmini tankを完成させました。

回路図です。

試運転です。

これで、このシリーズは終了とします。

シェアする

フォローする