スマホでロボットアームを動かす

スマホでロボットアームを動かす

 

続き

製作途中ですが一応プログラミングで動かせるアプリが出来ました。

 

今のところコマンドで使えるのは赤丸の6種類です。

 

稼働の様子


www.youtube.com

プログラムを上から順次実行していきます。

 

今回実行したプログラム

S5
H
I1000,0,0,0,0,0
N
I-1000,0,0,0,0,0
N
I0,500,0,0,0,0
N
I0,-500,0,0,0,0
N
I0,0,500,0,0,0
N
I0,0,-500,0,0,0
N
I0,0,0,-500,500,0
N
I0,0,0,500,-500,0
N
I0,0,0,500,500,0
N
I0,0,0,-500,-500,0
N
I0,0,0,0,0,-1000
N

 

ここで重要なのがビジー信号、今までは手動で動かしていたので動きが止まってから次の命令を送る、止まってから次の命令を送るで行けましたが、プログラミングではそうも行きません。ビジー信号の変化をESP-32で受け取りスマホBluetooth経由で送ります。

これでロボット側がビジーかそうでないかが把握できビジーは待機ビジー解除で送信

いわばBASICのLPRINTと同じことを行っています。

 

今回のプログラム

#include "BluetoothSerial.h"
#include "string.h"
BluetoothSerial SerialBT;
char buffer[40];
static int count = 0;
byte ledPins = {15, 2, 0, 4, 5, 18, 19, 21};
int ledCounts;
int busy;
boolean readFlag = false;

void setup() {
  ledCounts = sizeof(ledPins);
  for (int i = 0; i < ledCounts; i++) {
    pinMode(ledPins[i], OUTPUT);
  }
  pinMode(22, OUTPUT);
  pinMode(23, INPUT);
  SerialBT.begin("ESP32test"); //Bluetooth device name
  Serial.begin(9600);
  Serial.println("\nThe device started, now you can pair it with bluetooth!");
}

void loop() {
  while(SerialBT.available())
  {
    buffer[count] = SerialBT.read();
    count++;
  }
  if(count>0){
    Serial.print(buffer);
    signal_s(buffer);
    count=0;
    memset(buffer,0,40);
    SerialBT.write('a');
    readFlag = true;
  }
  else {
    busy = digitalRead(23);
    if (busy == 0 && readFlag) {
      SerialBT.write('b');
      readFlag = false;
    }
  }

  delay(100);
}

void cr() {
  signal('\r');
  delay(10);
  strobe();
}

void lf() {
  signal('\n');
  delay(10);
  strobe();
}

void strobe() {
  digitalWrite(22, LOW);
  delay(10);
  digitalWrite(22, HIGH);
}

void signal(char c) {
  for (int i = 0;i < 8;i++) {
    if ((c & 0x80 >> i) != 0)
      digitalWrite(ledPins[i], HIGH);
    else
      digitalWrite(ledPins[i], LOW);
  }
}

void signal_s(char s) {
  for (int i = 0;i < count - 2;i++) {
      signal(s[i]);
      delay(10);
      strobe();
      delay(10);
  }
  cr();
  lf();
}

変更したのは太字の部分だけです。

SerialBT.write('a');はコマンドを受け取ったことを知らせる

SerialBT.write('b');はビジー信号がLになったことを知らせる

 

結構うまく動いていると思いますが如何でしょうか

もうちょっと見栄えのする動画も投稿しようかなぁ 乞うご期待!

 

今後の取り組みは残りのコマンドの実装を目指します。

 

また、更新します。

 

mckeechan.hatenadiary.jp