M5Stackใจในใใใใณใฐใขใผใฟใผใใตใผใใงใใณใใญใใฟใไฝๆใใพใใ
่ชๅใฏๆๅงใใจใใฆๆใซๅ
ฅใใใใ้จๆใไฝฟใใพใใใๅฟ็จใใใฐใใฃใจ้ซ็ฒพๅบฆใชใใฎใไฝใใใจๆใใพใ
ใใใชๆใใงๅไฝใใพใ
ไฝฟ็จใใใใใคใน
M5Stack Basic - ในใคใใใตใคใจใณใน
https://www.switch-science.com/catalog/3647/
ArduinoไบๆใชESP32ใใฑใผในใซๅ ฅใฃใฆใฆใใฟใณใจใใฃในใใฌใคใจใใใใชใผใใคใใฆใฆIOใ่ฑๅฏใงWifiใจBluetoothใไฝฟใใใใฏใๅฅด
ใใชใจใผใทใงใณใซใใฃใฆ9่ปธใปใณใตใใคใใฆใใใใใใฉbasicใฏไธ็ชๅบๆฌ็ใชๅฅด
M5Stack็จGRBLใขใธใฅใผใซ - ในใคใใใตใคใจใณใน
https://www.switch-science.com/catalog/6994/
ในใใใใณใฐใขใผใฟใผใ3ๅใพใงๅถๅพกใงใใใขใธใฅใผใซ
ในใฟใใฏใใใจๆๅคง6ๅใพใงไฝฟใใพใ
Gcodeใไฝฟใใใฎใงๅฒใจใๆ่ปฝใซในใใใใณใฐใขใผใฟใผใๅใใใพใ
M5Stack็จ12ใใฃใณใใซ ใตใผใใใฉใคใใขใธใฅใผใซ - ในใคใใใตใคใจใณใน
https://www.switch-science.com/catalog/6060/
ใตใผใใ12ๅใพใงๅถๅพกใงใใใขใธใฅใผใซ
็พๅจใฏๅ่ฝใกใฟใใใชใฎใงServo2ใขใธใฅใผใซใไฝฟ็จใใฆใใ ใใ
M5Stack็จServo2ใขใธใฅใผใซ - 16ใใฃใณใใซ ใตใผใใใฉใคใ - ในใคใใใตใคใจใณใน
https://www.switch-science.com/catalog/6737/
Amazon | 3DใใชใณใฟใฌใคใใฌใผใซใปใใT8ใชใผใในใฏใชใฅใผ ใใใ1mmใชใผใ1mm +ใชใใขใทใฃใใ8 * 100mm + KP08 SK8 SC8UU +ใใใใใฆใธใณใฐ+ใซใใใชใณใฐ+ในใใใใขใผใฟ (200mm) | ใชใใขใฌใคใ | ็ฃๆฅญใป็ ็ฉถ้็บ็จๅ ้่ฒฉ
https://www.amazon.co.jp/gp/product/B07D3P1YST/
่ชๅใฏในใใใใณใฐใขใผใฟใซ้ขใใฆใฏ็ด ไบบใ ใฃใใฎใงในใใใใณใฐใขใผใฟใผใจใฌใผใซใใปใใใซใชใฃใฆใใใฎใ่ณผๅ ฅใใพใใ
Amazon.co.jp: ใใคใฏใญในใฉใคใใฃใณใฐใใผใใซในใใใใณใฐใขใผใฟใผใชใใขใขใผใฟใผในใฏใชใฅใผ2็ธ4็ทใชใใขในใใใใณใฐใขใผใฟใผในใฏใชใฅใผในใฉใคใใใผใใซ4โ9V้งๅ้ปๅง18ยฐในใใใ่ง : ็ฃๆฅญใป็ ็ฉถ้็บ็จๅ
https://www.amazon.co.jp/gp/product/B08LQ36RZM/
Y่ปธใซใฏ็ฐกๆๅใฎใชใใขใฌใผใซใไฝฟใใพใใ
Stepperใขใธใฅใผใซใ9V~ใชใฎใงๅฏพๅฟใใ้ปๅงใฎ็ฉใ็จๆใใพใใใ
ใใ ใใฎใขใผใฟใผใฏ4~9Vใชใใงใใ็ญๆ้ใง้็ฑใใใฎใงๅฎ็จๆใฏ
ไธ่จใฎๅคงใใในใใใใณใฐใขใผใฟใผใไฝฟใฃใๆนใใใใจๆใใพใ
ใใผใใๆง็ฏใใ
ใใผใ ใปใณใฟใผใงใขใฏใชใซๆฟใ่ฒทใฃใฆใใฆใใชใซใง็ฉดใ้ใใฆX่ปธใฎใฌใผใซใใใธๆญขใใใพใใ
ๅทฆๅดใฎในใใใใณใฐใขใผใฟใผใฏ้ซใใๅใใชใใฃใใฎใงใขใฏใชใซๆฟใฎๅคใซๅบใใฆ้ซใใ้ใใใฆใใพใ
Y่ปธใฏX่ปธใฎใขใซใใใญใใฏใฎใใธ็ฉดใฎๅน
ใใกใใใฉใใใฃใใฎใง
็ดๆฅใใธๆญขใใใพใใ
ใชใใใในใคใใใฏๅทฅๅ
ท็ฎฑใซใใฃใใฟใฏใในใคใใใไฝฟใใพใใ
ใฐใซใผใฌใณใงใขใซใใใญใใฏใซๅฝใใใจใใใซๅบๅฎใใพใ
ใชใใใในใคใใใฏGNDใXYZๅ ฑ็จใชใฎใงๆฅ็ถใใใใใฎๅบๆฟใไฝใใพใใ
ใตใผใใฏServoใขใธใฅใผใซใใๅถๅพกใใพใ
Y่ปธใฎในใใใใขใผใฟใผใซใตใผใใ่จญ็ฝฎใใพใ
ๅฐๅบงใฏthingiverseใง่ฆใคใใใขใฏใใฅใจใผใฟใผใ
Fusion360ใงๅใฃใใ่ฒผใฃใใใใฆ3Dใใชใณใฟใงๅบๅใใพใใ
Linear Servo Actuators by potentprintables - Thingiverse
https://www.thingiverse.com/thing:3170748
ใใใซใใณใๅบๅฎใใใใจใงใตใผใใๅใใฆไธไธใใใใจใใงใใพใ
ในใฑใใใๆธใใฆใใ
Githubใฎใตใณใใซใณใผใใ่ฆใชใใๆธใใฆใใใพใ
ไปฅไธใฎ.inoใจ.cppใจ.hใๅใใใฉใซใใซๅ ฅใใใฐใณใณใใคใซใงใใใจๆใใพใ
M5Stack/xyz_control.ino at master ยท m5stack/M5Stack ยท GitHub
https://github.com/m5stack/MODULE_GRBL13.2/tree/master/examples/xyz_control
MODULE_GRBL13.2/src at master ยท m5stack/MODULE_GRBL13.2 ยท GitHub
https://github.com/m5stack/MODULE_GRBL13.2/tree/master/src
ๅบๆฌ็ใซใฏG1ใฎ็ด็ทใ ใไฝฟใฃใฆใใพใ
_GRBL.sendGcode("G1 X5Y5Z5 F200");
ใกใชใฟใซๅไฝใ้
ใใฃใใฎใง
ๅๆๅใฎๅผๆฐใจใCcodeใฎFRAMEใๅคใใฆใฟใใใงใใ
_GRBL.Init(400, 400, 400, 30);
_GRBL.sendGcode("G1 X2 F100");
_GRBL.sendGcode("G1 X2 F200");
_GRBL.sendGcode("G1 X3 F300");
_GRBL.sendGcode("G1 X4 F400");
_GRBL.sendGcode("G1 X5 F500");
่ฑ่ชฟใใใใงใใใญใปใปใป(ยดใปฯใป`)
ใใพใ่จญๅฎๆนๆณใใใฃใใๆใใฆใใ ใใ(ยดใปฯใป`)
ในใใใใขใผใฟใผใๅใใใใใใซใชใฃใใฎใงใใใช้ขๆฐใไฝใใพใใ
void moveTo(float toX, float toY) {
String command = "G1 X";
command += String(toX);
command += " F200";
Serial.println(command.c_str());
_GRBL.Gcode((char *)(command.c_str()));
command = "G1 Y";
command += String(toY);
command += " F200";
Serial.println(command.c_str());
_GRBL.Gcode((char *)(command.c_str()));
_GRBL.WaitIdle();
}
C่จ่ชใๅใใใชใใฎใงJavaใฉใคใฏใชๆธใๆนใงใ(ยดใปฯใป`)
ๅ็นๆปใใๅฎ่ฃ ใใ
ใชใปใใใใใใจใซๅ็นใๅคใใฃใฆใๅฐใใฎใงๅ็นใซๆปใๅไฝใๅฎ่ฃ ใใพใ
ใพใ1ใ ใ๏ผๆนๅใซๅใใใฆใใใชใใใในใคใใใๆผใใใใพใง-0.3ใใคๅใใ็ถใใพใ
ใชใใใในใคใใใๆผใใใใจ_GRBL.InLock()ใtrueใซใชใใฎใง
Unlock()ใใฆใใ+ใซๆปใใพใ
ใใฎๆใฟใฏใในใคใใใๆผใใใใพใพUnlock()ใใใฎใงๅณlock()ใใใใใจใใใใ
ใใฎๅฏพ็ญใฎใใใซๅใใใฆใใๅฐใๅพ
ใฃใฆใชใใใในใคใใใๆผใใใใพใพใ ใจๅๅบฆๅใใใใใซใใฆใใพใ
void resetOrigin(char *axis) {
_GRBL.SetMode("distance"); //ใ็ธๅฏพ็งปๅใขใผใ
std::string str = "G1 1 F200";
str.insert(3, axis);
// USE Gcode
_GRBL.Gcode(const_cast<char *>(str.c_str())); // +1็งปๅ
str = "G1 -0.3 F200";
str.insert(3, axis);
while (!_GRBL.InLock()) {
_GRBL.Gcode(
const_cast<char *>(str.c_str())); // -0.2ใใคใญใใฏใใใใพใง็งปๅ
delay(100);
}
Serial.println("Locked");
Serial.println("Back to Origin");
str = "G1 0.2 F200";
str.insert(3, axis);
while (_GRBL.InLock()) {
_GRBL.UnLock(); // ใชใใใในใคใใใฎใญใใฏใ่งฃ้คใใ
_GRBL.SetMode("distance"); // absoluteใซๆปใใฎใงๅ่จญๅฎ
_GRBL.Gcode(const_cast<char *>(str.c_str()));
delay(300);
// ในใคใใใๆผใใฃใฑใชใใ ใจๅณๅบงใซใญใใฏใซๆปใใฎใง็งปๅใใฆใใๅฐใๅพ
ใค
}
_GRBL.SetMode("absolute");
Serial.println("Moved to Origin");
}
็ป้ขใใฟใใใใ
ใตใผใใๅใใจใใณใไธไธใงใใใฎใงใใณใฎไธใไธใใจใฟใใใง้ขๆฐใไฝใใพใ
ๅฎๆฐใฏ็พ็ฉๅใใใง่ชฟๆดใใฆใใ ใใ
int PEN_UP = 130;
int PEN_DOWN = 100;
void penUp() {
// servo(PEN_UP);
Servo_write_angle(0, PEN_UP);
delay(100);
}
void penDown() {
Servo_write_angle(0, PEN_DOWN);
delay(100);
}
void tap() {
penDown();
penUp();
}
void Servo_write_angle(uint8_t number, uint8_t angle) {
Wire.beginTransmission(SERVO_ADDR);
Wire.write(0x10 | number);
Wire.write(angle);
Wire.endTransmission();
}
ใใใใใ็ป้ขใฎไธใๅใใใฆใฟใใใใๅ ดๆใๅฎๆฐใซใใฆใใใพใ
ไปๅใฏใใขใฎใใใซๆFGโใๆไฝใใใใจใซใใพใใ
่ชๅใๅใใใๆใใงใฏๆจชใฎ1ใในใ10,็ธฆใ1ใใใใซใชใใฎใงใฟใใใใๅ ดๆใๅๆใใฆใใใพใ
้ทใใชใใฎใงๆใใใใฟ
float SKILL_1_1_X = 0;
float SKILL_1_1_Y = 0.7;
float SKILL_1_2_X = 4;
float SKILL_1_2_Y = 0.7;
float SKILL_1_3_X = 7.5;
float SKILL_1_3_Y = 0.7;
float SKILL_2_1_X = 13.5;
float SKILL_2_1_Y = 0.7;
float SKILL_2_2_X = 17.5;
float SKILL_2_2_Y = 0.7;
float SKILL_2_3_X = 21;
float SKILL_2_3_Y = 0.7;
float SKILL_3_1_X = 27.5;
float SKILL_3_1_Y = 0.7;
float SKILL_3_2_X = 31;
float SKILL_3_2_Y = 0.7;
float SKILL_3_3_X = 34.5;
float SKILL_3_3_Y = 0.7;
float OPPONENT_1_X = 17;
float OPPONENT_1_Y = 1.5;
float OPPONENT_2_X = 29;
float OPPONENT_2_Y = 1.5;
float OPPONENT_3_X = 39;
float OPPONENT_3_Y = 1.5;
float ATTACK_X = 52;
float ATTACK_Y = 0.5;
float CARD_1_X = 8;
float CARD_1_Y = 0.7;
float CARD_2_X = 17;
float CARD_2_Y = 0.7;
float CARD_3_X = 29;
float CARD_3_Y = 0.7;
float CARD_4_X = 39;
float CARD_4_Y = 0.7;
float CARD_5_X = 50;
float CARD_5_Y = 0.7;
float HOUGU_1_X = 17;
float HOUGU_1_Y = 3.9;
float HOUGU_2_X = 29;
float HOUGU_2_Y = 3.9;
float HOUGU_3_X = 38;
float HOUGU_3_Y = 3.9;
float MASTER_SKILL_X = 54;
float MASTER_SKILL_Y = 2.6;
float MASTER_SKILL_1_X = 42;
float MASTER_SKILL_1_Y = 2.6;
float MASTER_SKILL_2_X = 46;
float MASTER_SKILL_2_Y = 2.6;
float MASTER_SKILL_3_X = 50;
float MASTER_SKILL_3_Y = 2.6;
float ORDER_CHANGE_1_X = 7;
float ORDER_CHANGE_1_Y = 2.6;
float ORDER_CHANGE_2_X = 15;
float ORDER_CHANGE_2_Y = 2.6;
float ORDER_CHANGE_3_X = 24;
float ORDER_CHANGE_3_Y = 2.6;
float ORDER_CHANGE_4_X = 33;
float ORDER_CHANGE_4_Y = 2.6;
float ORDER_CHANGE_5_X = 41;
float ORDER_CHANGE_5_Y = 2.6;
float ORDER_CHANGE_6_X = 50;
float ORDER_CHANGE_6_Y = 2.6;
float ORDER_EXEC_X = 28;
float ORDER_EXEC_Y = 0.0;
ใฟใใใใๅบงๆจใๅใใฃใใใใใใใ้ขๆฐใซใพใจใใฆใใใพใ
้ทใใชใใฎใงๆใใใใฟ
void skill1(int num) {
Serial.printf("exec Skill1-%d\n", num);
switch (num) {
case 1:
moveTo(SKILL_1_1_X, SKILL_1_1_Y);
break;
case 2:
moveTo(SKILL_1_2_X, SKILL_1_2_Y);
break;
case 3:
moveTo(SKILL_1_3_X, SKILL_1_3_Y);
break;
default:
break;
}
tap();
}
void skill2(int num) {
Serial.printf("exec Skill2-%d\n", num);
switch (num) {
case 1:
moveTo(SKILL_2_1_X, SKILL_2_1_Y);
break;
case 2:
moveTo(SKILL_2_2_X, SKILL_2_2_Y);
break;
case 3:
moveTo(SKILL_2_3_X, SKILL_2_3_Y);
break;
default:
break;
}
tap();
}
void skill3(int num) {
Serial.printf("exec Skill3-%d\n", num);
switch (num) {
case 1:
moveTo(SKILL_3_1_X, SKILL_3_1_Y);
break;
case 2:
moveTo(SKILL_3_2_X, SKILL_3_2_Y);
break;
case 3:
moveTo(SKILL_3_3_X, SKILL_3_3_Y);
break;
default:
break;
}
tap();
}
void skillTo(int num) {
Serial.printf("exec Skill to %d\n", num);
switch (num) {
case 1:
moveTo(OPPONENT_1_X, OPPONENT_1_Y);
break;
case 2:
moveTo(OPPONENT_2_X, OPPONENT_2_Y);
break;
case 3:
moveTo(OPPONENT_3_X, OPPONENT_3_Y);
break;
default:
break;
}
tap();
}
void masterSkill(int num) {
moveTo(MASTER_SKILL_X, MASTER_SKILL_Y);
tap();
switch (num) {
case 1:
moveTo(MASTER_SKILL_1_X, MASTER_SKILL_1_Y);
break;
case 2:
moveTo(MASTER_SKILL_2_X, MASTER_SKILL_2_Y);
break;
case 3:
moveTo(MASTER_SKILL_3_X, MASTER_SKILL_3_Y);
break;
default:
break;
}
tap();
}
void orderChange(int num) {
switch (num) {
case 1:
moveTo(ORDER_CHANGE_1_X, ORDER_CHANGE_1_Y);
break;
case 2:
moveTo(ORDER_CHANGE_2_X, ORDER_CHANGE_2_Y);
break;
case 3:
moveTo(ORDER_CHANGE_3_X, ORDER_CHANGE_3_Y);
break;
case 4:
moveTo(ORDER_CHANGE_4_X, ORDER_CHANGE_4_Y);
break;
case 5:
moveTo(ORDER_CHANGE_5_X, ORDER_CHANGE_5_Y);
break;
case 6:
moveTo(ORDER_CHANGE_6_X, ORDER_CHANGE_6_Y);
break;
case 7:
moveTo(ORDER_EXEC_X, ORDER_EXEC_Y);
break;
default:
break;
}
tap();
}
void hougu(int num) {
switch (num) {
case 1:
moveTo(HOUGU_1_X, HOUGU_1_Y);
break;
case 2:
moveTo(HOUGU_2_X, HOUGU_2_Y);
break;
case 3:
moveTo(HOUGU_3_X, HOUGU_3_Y);
break;
default:
break;
}
tap();
}
void card(int num) {
switch (num) {
case 1:
moveTo(CARD_1_X, CARD_1_Y);
break;
case 2:
moveTo(CARD_2_X, CARD_2_Y);
break;
case 3:
moveTo(CARD_3_X, CARD_3_Y);
break;
case 4:
moveTo(CARD_4_X, CARD_4_Y);
break;
case 5:
moveTo(CARD_5_X, CARD_5_Y);
break;
default:
break;
}
tap();
}
void atack() {
moveTo(ATTACK_X, ATTACK_Y);
tap();
}
ใณใใณใใๆๅฎใงใใใใใซใใ
ๅณๅฝขใๆธใใซใใ็ป้ขใใฟใใใใใซใใใฟใใใใๅ ดๆใ้ฃ็ถใใฆๆๅฎใใชใใจใใใชใใฎใง
ใฟใใใใใณใใณใใSDใซใผใไธใฎใใกใคใซใซไฟๅญใใฆ้ธๆใงใใใใใซใใพใ
ใใใฏESP-NOWใชใUARTใชใใง้ไฟกใใฆใใใใจๆใใพใใฎใง้ฝๅใฎใใๆนๆณใ้ธใใงใใ ใใ
ไปๅใฏใใฎใใใชJSONใ็จๆใใพใใ
{
"data": [
{
"name": "rans",
"command": {
"wave1": "SK11,ST3,SK21,ST3,MS3,ST3,AT,HG3,CD4,CD5",
"wave2": "SK23,ST3,SK33,AT,HG3,CD4,CD5",
"wave3": "SK12,SK22,SK13,ST3,AT,HG3,CD4,CD5"
}
}
]
}
ใณใใณใใฎๆๅณใฏ
SKxyโxไบบ็ฎใฎในใญใซyใๅฎ่ก
STxโในใญใซใฎใฟใผใฒใใใxไบบ็ฎใจใใ
MSxโใในใฟใผในใญใซใไฝฟใ
ATโAttackใใฟใณใๆผใ
HGxโxไบบ็ฎใฎๅฎๅ
ทใซใผใใ้ธๆ
CDxโx็ช็ฎใฎใซใผใใ้ธๆ
ใจใชใฃใฆใใพใ
JSONใSDใซใผใไธใซ็ฝฎใใใ่ชญใฟ่พผใใงjsonArrayใซๆ ผ็ดใใพใ
ArduinoJsonใไฝฟ็จใใพใใ
ArduinoJson: Efficient JSON serialization for embedded C++
https://arduinojson.org/
File f = SD.open("/fgo.json");
DeserializationError error = deserializeJson(jsonObject, f);
JsonArray jsonArry = jsonObject["data"].as<JsonArray>();
JSONใฎๅ ๅฎนใๅๅพๅบๆฅใใM5Stack TreeViewใซๆธกใใฆ้ธๆใงใใใใใซใใพใ
GitHub - lovyan03/M5Stack_TreeView: M5Stack TreeView menu UI library.
https://github.com/lovyan03/M5Stack_TreeView
tv.itemHeight = 25;
tv.itemWidth = 100;
tv.setTextFont(2);
for (int i = 0; i < jsonArry.size(); i++) {
Serial.printf("sd:jsonArry[0].name=%s\n",
(const char *)(jsonArry[i]["name"]));
}
for (int i = 0; i < jsonArry.size(); i++) {
tv.addItems(std::vector<MenuItem *>{
new MenuItem((const char *)(jsonArry[i]["name"]), i,
std::vector<MenuItem *>{new MenuItem("Wave1", 1, func),
new MenuItem("Wave2", 2, func),
new MenuItem("Wave3", 3, func
)})});
}
tv.begin();
TreeViewใงใณใใณใใ้ธๆใใใจtag็ชๅทใๅๅพใงใใใฎใงJsonArrayใใ่ฉฒๅฝใฎใณใใณใใๅๅพใใพใ
void func(MenuItem *mi) {
Serial.print(mi->parentItem()->tag);
Serial.print(":");
Serial.println(mi->tag);
JsonArray jsonArry = jsonObject["data"].as<JsonArray>();
Serial.printf("sd:jsonArry.size=%d\n", jsonArry.size());
String str = String(mi->tag);
str = "wave" + str;
Serial.printf("name:%s\n",
(const char *)jsonArry[mi->parentItem()->tag]["name"]);
Serial.printf(
"%s:%s\n", str,
(const char *)(jsonArry[mi->parentItem()->tag]["command"][str]));
decodeCommand(jsonArry[mi->parentItem()->tag]["command"][str]);
}
่ฉฒๅฝใฎใณใใณใ่กใๅๅพๅบๆฅใใ่กใใใณใผใใใฆๅ ใปใฉไฝใฃใ่ฉฒๅฝใฎไฝ็ฝฎใใฟใใใใ้ขๆฐใซๆธกใใพใ
void decodeCommand(String str) {
Serial.printf("command:%s\n", str.c_str());
int index = 0;
while (true) {
String com = str.substring(index, str.indexOf(",", index));
Serial.printf("%s\n", com);
index = str.indexOf(",", index) + 1;
if (com.startsWith("SK")) {
// Serial.println("Skill");
// Serial.println(atoi(com.substring(2, 3).c_str()));
switch (atoi(com.substring(2, 3).c_str())) {
case 1:
skill1(atoi(com.substring(3).c_str()));
break;
case 2:
skill2(atoi(com.substring(3).c_str()));
break;
case 3:
skill3(atoi(com.substring(3).c_str()));
break;
default:
break;
}
} else if (com.startsWith("AT")) {
atack();
} else if (com.startsWith("MS")) {
masterSkill(atoi(com.substring(2).c_str()));
} else if (com.startsWith("ST")) {
skillTo(atoi(com.substring(2).c_str()));
} else if (com.startsWith("OC")) {
orderChange(atoi(com.substring(2).c_str()));
} else if (com.startsWith("HG")) {
hougu(atoi(com.substring(2).c_str()));
} else if (com.startsWith("CD")) {
card(atoi(com.substring(2).c_str()));
} else if (com.startsWith("RS")) {
resetOrigin("X");
resetOrigin("Y");
}
if (index == 0) {
break;
}
}
}
ใใใงJSONใซๅๆใใใใณใใณใใ้ ๆฌกๅฎ่กใใใฆ่ชๅๆ็ธฆใๅฏ่ฝใซใชใใพใ
ๆๅพใซใกใใใฃ้ทใใชใใพใใใใฝใผในใ็ฝฎใใฆใใใพใ
้ทใใชใใฎใงๆใใใใฟ
#include <ArduinoJson.h>
#include <M5Stack.h>
#include <M5TreeView.h>
#include <string.h>
#include "GrblControl.h"
#define STEPMOTOR_I2C_ADDR 0x70
#define SERVO_ADDR 0x53
GRBL _GRBL = GRBL(STEPMOTOR_I2C_ADDR);
int degree = 0;
int PEN_UP = 130;
int PEN_DOWN = 100;
float SKILL_1_1_X = 0;
float SKILL_1_1_Y = 0.7;
float SKILL_1_2_X = 4;
float SKILL_1_2_Y = 0.7;
float SKILL_1_3_X = 7.5;
float SKILL_1_3_Y = 0.7;
float SKILL_2_1_X = 13.5;
float SKILL_2_1_Y = 0.7;
float SKILL_2_2_X = 17.5;
float SKILL_2_2_Y = 0.7;
float SKILL_2_3_X = 21;
float SKILL_2_3_Y = 0.7;
float SKILL_3_1_X = 27.5;
float SKILL_3_1_Y = 0.7;
float SKILL_3_2_X = 31;
float SKILL_3_2_Y = 0.7;
float SKILL_3_3_X = 34.5;
float SKILL_3_3_Y = 0.7;
float OPPONENT_1_X = 17;
float OPPONENT_1_Y = 1.5;
float OPPONENT_2_X = 29;
float OPPONENT_2_Y = 1.5;
float OPPONENT_3_X = 39;
float OPPONENT_3_Y = 1.5;
float ATTACK_X = 52;
float ATTACK_Y = 0.5;
float CARD_1_X = 8;
float CARD_1_Y = 0.7;
float CARD_2_X = 17;
float CARD_2_Y = 0.7;
float CARD_3_X = 29;
float CARD_3_Y = 0.7;
float CARD_4_X = 39;
float CARD_4_Y = 0.7;
float CARD_5_X = 50;
float CARD_5_Y = 0.7;
float HOUGU_1_X = 17;
float HOUGU_1_Y = 3.9;
float HOUGU_2_X = 29;
float HOUGU_2_Y = 3.9;
float HOUGU_3_X = 38;
float HOUGU_3_Y = 3.9;
float MASTER_SKILL_X = 54;
float MASTER_SKILL_Y = 2.6;
float MASTER_SKILL_1_X = 42;
float MASTER_SKILL_1_Y = 2.6;
float MASTER_SKILL_2_X = 46;
float MASTER_SKILL_2_Y = 2.6;
float MASTER_SKILL_3_X = 50;
float MASTER_SKILL_3_Y = 2.6;
float ORDER_CHANGE_1_X = 7;
float ORDER_CHANGE_1_Y = 2.6;
float ORDER_CHANGE_2_X = 15;
float ORDER_CHANGE_2_Y = 2.6;
float ORDER_CHANGE_3_X = 24;
float ORDER_CHANGE_3_Y = 2.6;
float ORDER_CHANGE_4_X = 33;
float ORDER_CHANGE_4_Y = 2.6;
float ORDER_CHANGE_5_X = 41;
float ORDER_CHANGE_5_Y = 2.6;
float ORDER_CHANGE_6_X = 50;
float ORDER_CHANGE_6_Y = 2.6;
float ORDER_EXEC_X = 28;
float ORDER_EXEC_Y = 0.0;
float x = 0.0;
float y = 0.0;
M5TreeView tv;
StaticJsonDocument<2048> jsonObject;
// addr 0x11 means "control the number 1 servo by angle"
void Servo_write_angle(uint8_t number, uint8_t angle) {
Wire.beginTransmission(SERVO_ADDR);
Wire.write(0x10 | number);
Wire.write(angle);
Wire.endTransmission();
}
void penUp() {
// servo(PEN_UP);
Servo_write_angle(0, PEN_UP);
delay(100);
// myservo.detach();
}
void penDown() {
Servo_write_angle(0, PEN_DOWN);
delay(100);
// myservo.detach();
}
void resetOrigin(char *axis) {
_GRBL.SetMode("distance"); //ใ็ธๅฏพ็งปๅใขใผใ
std::string str = "G1 1 F200";
str.insert(3, axis);
// USE Gcode
_GRBL.Gcode(const_cast<char *>(str.c_str())); // +1็งปๅ
str = "G1 -0.3 F200";
str.insert(3, axis);
while (!_GRBL.InLock()) {
_GRBL.Gcode(
const_cast<char *>(str.c_str())); // -0.2ใใคใญใใฏใใใใพใง็งปๅ
delay(100);
}
Serial.println("Locked");
Serial.println("Back to Origin");
str = "G1 0.2 F200";
str.insert(3, axis);
while (_GRBL.InLock()) {
_GRBL.UnLock(); // ใชใใใในใคใใใฎใญใใฏใ่งฃ้คใใ
_GRBL.SetMode("distance"); // absoluteใซๆปใใฎใงๅ่จญๅฎ
_GRBL.Gcode(const_cast<char *>(str.c_str()));
delay(300);
// ในใคใใใๆผใใฃใฑใชใใ ใจๅณๅบงใซใญใใฏใซๆปใใฎใง็งปๅใใฆใใๅฐใๅพ
ใค
}
_GRBL.SetMode("absolute");
Serial.println("Moved to Origin");
}
void moveTo(float toX, float toY) {
String command = "G1 X";
command += String(toX);
command += " F200";
Serial.println(command.c_str());
_GRBL.Gcode((char *)(command.c_str()));
command = "G1 Y";
command += String(toY);
command += " F200";
Serial.println(command.c_str());
_GRBL.Gcode((char *)(command.c_str()));
_GRBL.WaitIdle();
}
void tap() {
penDown();
penUp();
}
void skill1(int num) {
Serial.printf("exec Skill1-%d\n", num);
switch (num) {
case 1:
moveTo(SKILL_1_1_X, SKILL_1_1_Y);
break;
case 2:
moveTo(SKILL_1_2_X, SKILL_1_2_Y);
break;
case 3:
moveTo(SKILL_1_3_X, SKILL_1_3_Y);
break;
default:
break;
}
tap();
}
void skill2(int num) {
Serial.printf("exec Skill2-%d\n", num);
switch (num) {
case 1:
moveTo(SKILL_2_1_X, SKILL_2_1_Y);
break;
case 2:
moveTo(SKILL_2_2_X, SKILL_2_2_Y);
break;
case 3:
moveTo(SKILL_2_3_X, SKILL_2_3_Y);
break;
default:
break;
}
tap();
}
void skill3(int num) {
Serial.printf("exec Skill3-%d\n", num);
switch (num) {
case 1:
moveTo(SKILL_3_1_X, SKILL_3_1_Y);
break;
case 2:
moveTo(SKILL_3_2_X, SKILL_3_2_Y);
break;
case 3:
moveTo(SKILL_3_3_X, SKILL_3_3_Y);
break;
default:
break;
}
tap();
}
void skillTo(int num) {
Serial.printf("exec Skill to %d\n", num);
switch (num) {
case 1:
moveTo(OPPONENT_1_X, OPPONENT_1_Y);
break;
case 2:
moveTo(OPPONENT_2_X, OPPONENT_2_Y);
break;
case 3:
moveTo(OPPONENT_3_X, OPPONENT_3_Y);
break;
default:
break;
}
tap();
}
void masterSkill(int num) {
moveTo(MASTER_SKILL_X, MASTER_SKILL_Y);
tap();
switch (num) {
case 1:
moveTo(MASTER_SKILL_1_X, MASTER_SKILL_1_Y);
break;
case 2:
moveTo(MASTER_SKILL_2_X, MASTER_SKILL_2_Y);
break;
case 3:
moveTo(MASTER_SKILL_3_X, MASTER_SKILL_3_Y);
break;
default:
break;
}
tap();
}
void orderChange(int num) {
switch (num) {
case 1:
moveTo(ORDER_CHANGE_1_X, ORDER_CHANGE_1_Y);
break;
case 2:
moveTo(ORDER_CHANGE_2_X, ORDER_CHANGE_2_Y);
break;
case 3:
moveTo(ORDER_CHANGE_3_X, ORDER_CHANGE_3_Y);
break;
case 4:
moveTo(ORDER_CHANGE_4_X, ORDER_CHANGE_4_Y);
break;
case 5:
moveTo(ORDER_CHANGE_5_X, ORDER_CHANGE_5_Y);
break;
case 6:
moveTo(ORDER_CHANGE_6_X, ORDER_CHANGE_6_Y);
break;
case 7:
moveTo(ORDER_EXEC_X, ORDER_EXEC_Y);
break;
default:
break;
}
tap();
}
void hougu(int num) {
switch (num) {
case 1:
moveTo(HOUGU_1_X, HOUGU_1_Y);
break;
case 2:
moveTo(HOUGU_2_X, HOUGU_2_Y);
break;
case 3:
moveTo(HOUGU_3_X, HOUGU_3_Y);
break;
default:
break;
}
tap();
}
void card(int num) {
switch (num) {
case 1:
moveTo(CARD_1_X, CARD_1_Y);
break;
case 2:
moveTo(CARD_2_X, CARD_2_Y);
break;
case 3:
moveTo(CARD_3_X, CARD_3_Y);
break;
case 4:
moveTo(CARD_4_X, CARD_4_Y);
break;
case 5:
moveTo(CARD_5_X, CARD_5_Y);
break;
default:
break;
}
tap();
}
void atack() {
moveTo(ATTACK_X, ATTACK_Y);
tap();
}
void decodeCommand(String str) {
Serial.printf("command:%s\n", str.c_str());
int index = 0;
while (true) {
String com = str.substring(index, str.indexOf(",", index));
Serial.printf("%s\n", com);
index = str.indexOf(",", index) + 1;
if (com.startsWith("SK")) {
// Serial.println("Skill");
// Serial.println(atoi(com.substring(2, 3).c_str()));
switch (atoi(com.substring(2, 3).c_str())) {
case 1:
skill1(atoi(com.substring(3).c_str()));
break;
case 2:
skill2(atoi(com.substring(3).c_str()));
break;
case 3:
skill3(atoi(com.substring(3).c_str()));
break;
default:
break;
}
} else if (com.startsWith("AT")) {
atack();
} else if (com.startsWith("MS")) {
masterSkill(atoi(com.substring(2).c_str()));
} else if (com.startsWith("ST")) {
skillTo(atoi(com.substring(2).c_str()));
} else if (com.startsWith("OC")) {
orderChange(atoi(com.substring(2).c_str()));
} else if (com.startsWith("HG")) {
hougu(atoi(com.substring(2).c_str()));
} else if (com.startsWith("CD")) {
card(atoi(com.substring(2).c_str()));
} else if (com.startsWith("RS")) {
resetOrigin("X");
resetOrigin("Y");
} else if (com.startsWith("AC")) {
if (clockStarted) {
clockStarted = false;
} else {
clockStarted = true;
xTaskCreatePinnedToCore(clockTask, "clockTask", 4096, NULL, 1, NULL, 0);
}
}
if (index == 0) {
break;
}
}
}
void func(MenuItem *mi) {
Serial.print(mi->parentItem()->tag);
Serial.print(":");
Serial.println(mi->tag);
JsonArray jsonArry = jsonObject["data"].as<JsonArray>();
Serial.printf("sd:jsonArry.size=%d\n", jsonArry.size());
String str = String(mi->tag);
str = "wave" + str;
Serial.printf("name:%s\n",
(const char *)jsonArry[mi->parentItem()->tag]["name"]);
Serial.printf(
"%s:%s\n", str,
(const char *)(jsonArry[mi->parentItem()->tag]["command"][str]));
decodeCommand(jsonArry[mi->parentItem()->tag]["command"][str]);
}
void setup() {
M5.begin(true, true, true, true);
_GRBL.Init(400, 400, 400, 30);
_GRBL.SetMode("absolute");
dacWrite(25, 0); //ใใใคใบๅฏพ็ญ
tv.itemHeight = 25;
tv.itemWidth = 100;
tv.setTextFont(2);
File f = SD.open("/fgo.json");
DeserializationError error = deserializeJson(jsonObject, f);
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.f_str());
return;
}
JsonArray jsonArry = jsonObject["data"].as<JsonArray>();
Serial.printf("sd:jsonArry.size=%d\n", jsonArry.size());
for (int i = 0; i < jsonArry.size(); i++) {
Serial.printf("sd:jsonArry[0].name=%s\n",
(const char *)(jsonArry[i]["name"]));
}
for (int i = 0; i < jsonArry.size(); i++) {
tv.addItems(std::vector<MenuItem *>{
new MenuItem((const char *)(jsonArry[i]["name"]), i,
std::vector<MenuItem *>{new MenuItem("Wave1", 1, func),
new MenuItem("Wave2", 2, func),
new MenuItem("Wave3", 3, func
)})});
}
tv.begin();
// penUp();
delay(1000);
Servo_write_angle(0, PEN_UP);
}
void loop() {
M5.update();
tv.update();
Comments
Let's comment your feelings that are more than good