Код (C++): #include <Servo.h> Servo myservo; int val; void setup(){ Serial.begin(9600); myservo.attach(9); } void loop() { serialEvent(); } void serialEvent(){ val = Serial.parseInt(); if(val !=0){ myservo.write(val); } } подскажите что нужно дописать в скейче чтоб можно было управлять через компорт 2 или больше сервоприводами. Как подключить 2 или более я знаю, проблема в том что они все работают синхронно а мне нужно каждой по отдельности
Нужно парсить текст, который приходит по ком порту. У вас приходит сообщение и вы его превращаете в число. Назову новое сообщение "командой": команда должна включать в себя идентификатор к какой серве вы сейчас обращаетесь и само число. Например - "A155", где "А" это идентификатор 1ой сервы, а "155" число которое нужно передать серве. Или "В056" - "В" идентификатор 2ой сервы, "056" - код, который превратится в "56". (нуль я написал, чтобы команда была фиксированной длины, кажется, так проще по-началу) Можно проще - посмотреть ASCII таблицу и отправлять не числа "0", "5" и "6", а ASCII символ с кодом "56". Смотрите работу со строками, в ардуине это есть (вычисление кода симола). Еще вариант: числа от 0 до 255 соответствуют серве 1, а числа от 256 до 512 соответствуют 2ой. Когда делаете parseInt проверяете больше 255 или нет. И есть вариант с разделением во времени, но он сложен из-за синхронизации времени, но на всякий случай опишу. Для мк заводится 2 интервала времени. Если во время 1ого интервала приходит команда, то она передается серве1, если во время 2ого интервала, то серве2.
это мне понятно. я не могу понять что писать чтоб servo1 принимал A50 а servo2 B50. Код (C++): #include <Servo.h> Servo myservo; Servo myservo1; int val1; int val; void setup(){ Serial.begin(9600); myservo.attach(9); myservo1.attach(10); } void loop() { serialEvent(); } void serialEvent(){ val = Serial.read(); if(val !=0){ myservo.write(val); val1 = Serial.read(); if(val1 !=0) myservo1.write(val1); } } думал так. Но получилось что при отправке числа servo1 поворачивается при повторной отправке обе поворачиваются одновременно.
Именно! Как написали выше ifelseif и switch-case. Нужно принять "команду", вычленить из нее номер сервы и число (сохранить в переменные), после этого управлять сервами. Аккуратно и последовательно.
Код (C++): void serialEvent(){ val = Serial.parseInt(); if(val !=0){ myservo.write(val); } else (val );{ myservo2.write(val); } в правильную сторону думаю ?
Примеры есть в ардуино иде (example, если она на англ.), они читабельные, откомментированные и простые. Не хочу конфликтовать, прошу понять, я не буду писать ровный откомпилированный код. Обратите внимание на пример SerialEvent. В нём собирается массив из приходящих символов. В данном примере последний символ это "\n" - перенос каретки на след. строку (так символ называется). Т.е. вы будете отправлять: "A", "0", "5" и "6", а в конце обязательно отправить "\n". Именно после "\n" флаг stringComplete станет true и в loop'e выполнится условие. После того как это станет понятным, задача станет такой: Как inputString распарсить. Мы знаем, что это строка это массив чаров, тогда код станет примерно таким Код (C++): switch inputString[0] case 'A': работа с 1ой сервой case 'B': работа со 2ой сервой Теперь задача вынуть из inputString код, который надо отправить на серву. Как я предлогал, с фиксированным массивом можно пробежаться в цикле по строке и вычислить ваш val Код (C++): power=100; val=0; for i от 1 до 3 { val=val+inputString[i]*power power=power/10; } Собственно, теперь надо отправить на нужную серву код. Ошибки есть, синтаксис наизусть не знаю.
Код (C++): #include <Servo.h> Servo myservo; Servo myservo2; int val; void setup(){ Serial.begin(9600); myservo.attach(9); myservo2.attach(10); } void loop() { serialEvent(); } void serialEvent(){ val = Serial.parseInt(); switch (val){ case 1: myservo2.write(180); break; case 2: myservo2.write(90); break; case 3: myservo.write(10); break; } } Разобрался САМ )))) Спасибо Airbus за наводку
Нафига ерундой заниматься, если по уарту все равно числа бегают? Нафига их переводить в текст, а потом его парсить? Для чего все эти лишние действия???
Потому что ардуино. Мне на пальцах проще объяснить так как объяснил, про оптимальность ТС ничего не говорил