スマホでロボットアームを動かす
続き
今回は各軸の制御に対応して行きます。
以前手に入れた制御命令とパラメーター
各軸制御は”I0,0,0,0,0,0”の数値の部分で行っているようなのでそれに合わせてプログラムを書き換えました。
"led_on","led_off"は取りやめて制御コードをそのままロボット側に送るように変更
”I0,0,0,0,0,0”などの文字列も1文字ずつそれぞれビット信号にして送っています。
今回改造したプログラム
#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;
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);
}
}
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();
}
続けて動かすとエラーがよく出るようになったのでcr()を追加しました。
0x0a → 0x0d0x0aに変更。エラーが減ったので本来必要なのかも分かりません。
ただ、まだたんまに出ます。
あと思い当たるのは3.3vと5vで通信をしているからかなと思います。
動いている様子
送ったコマンド
F
C
I300,300,300,300,300,300
I-300,-300,-300,-300,-300,-300
I-300,-300,-300,-300,-300,-300
H
I300,300,300,300,300,300
I300,300,300,300,300,300
N
I300,300,300,300,300,300
以上のコマンドを送りました。
"H"はホームポジションのセット
"N"はホームポジションへ移動
これらのコマンドをSerial Bluetooth Terminalのマクロに割り当てて実行しました。
Serial Bluetooth Terminalは6個まで割り当てが可能なようです。
これ以上複雑なコントロールは自前でアプリを作るしかない。
と言う事で次のステップ、専用アプリを作って行きます。
また、更新します。