スマホで動くロボットアームを作る

スマホで動くロボットアームを作る

 

続き

前回のプログラムに手を加えて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秒間制御出来る。

 

制御の様子


www.youtube.com

 

送ったデータはこのプログラムで作った(スマホ側)

    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;
        }
    }

それなりに制御出来ている。

 

まだ、回転方向の指示も出来ていないし、やらなければいけないことが山積。

 

また、更新します。