スマホで動くロボットアームを作る
続き
前回のプログラムに手を加えてonTimer()で駆動する様に変更しました。
データ量も10000バイトに増やしています。
今回のプログラム
byte stepPins = {15, 0, 5, 19, 22, 32, 25, 27};
byte dirPins = {2, 4, 18, 21, 23, 33, 26, 14};
byte step_data[10000] = {0};
byte inData = 0;
int pos = 0;
int num = 1;
boolean start= false;
hw_timer_t * timer = NULL;
void IRAM_ATTR onTimer() {
if (!start)
return;
rotation(num);
num++;
if (num == 10000) {
num = 0;
}
}
void setup() {
for (int i = 0; i < sizeof(stepPins); i++) {
pinMode(stepPins[i], OUTPUT);
}
for (int i = 0; i < sizeof(dirPins); i++) {
pinMode(dirPins[i], OUTPUT);
}
Serial.begin(115200);
timer = timerBegin(0, 80, true);
timerAttachInterrupt(timer, &onTimer, true);
timerAlarmWrite(timer, 1000, true);
timerAlarmEnable(timer);
}
void loop() {
if (Serial.available() > 0) {
inData = Serial.read();
step_data[pos++] = inData;
if (pos == 10000) {
pos = 0;
start = true;
}
}
}
void rotation(int num) {
digitalWrite(stepPins[0],step_data[num] & 0x01);
digitalWrite(stepPins[1],step_data[num] & 0x02);
digitalWrite(stepPins[2],step_data[num] & 0x04);
digitalWrite(stepPins[3],step_data[num] & 0x08);
digitalWrite(stepPins[4],step_data[num] & 0x10);
digitalWrite(stepPins[5],step_data[num] & 0x20);
digitalWrite(stepPins[6],step_data[num] & 0x40);
digitalWrite(stepPins[7],step_data[num] & 0x80);
}
1回のデータで10秒間制御出来る。
制御の様子
送ったデータはこのプログラムで作った(スマホ側)
public void MakeclockData10000(byte gcodeData[]) {
int i = 0;
for (;i < 1000;i++) {
if (i % 2 == 0)
gcodeData[i] = 0x01;
else
gcodeData[i] = 0x00;
}
for (;i < 2000;i++) {
if (i % 2 == 0)
gcodeData[i] = 0x02;
else
gcodeData[i] = 0x00;
}
for (;i < 3000;i++) {
if (i % 50 == 0)
gcodeData[i] = 0x01;
else
gcodeData[i] = 0x00;
}
for (;i < 4000;i++) {
if (i % 50 == 0)
gcodeData[i] = 0x02;
else
gcodeData[i] = 0x00;
}
for (;i < 5000;i++) {
if (i % 25 == 0)
gcodeData[i] = 0x03;
else
gcodeData[i] = 0x00;
}
for (;i < 6000;i++) {
if (i % 50 == 0)
gcodeData[i] = 0x02;
else
gcodeData[i] = 0x00;
}
for (;i < 7000;i++) {
if (i % 50 == 0)
gcodeData[i] = 0x01;
else
gcodeData[i] = 0x00;
}
for (;i < 8000;i++) {
if (i % 25 == 0)
gcodeData[i] = 0x02;
else
gcodeData[i] = 0x00;
if (i % 50 == 0)
gcodeData[i] |= 0x01;
}
for (;i < 9000;i++) {
if (i % 25 == 0)
gcodeData[i] = 0x01;
else
gcodeData[i] = 0x00;
if (i % 50 == 0)
gcodeData[i] |= 0x02;
}
for (;i < 10000;i++) {
if (i % 10 == 0)
gcodeData[i] = 0x03;
else
gcodeData[i] = 0x00;
}
}
それなりに制御出来ている。
まだ、回転方向の指示も出来ていないし、やらなければいけないことが山積。
また、更新します。