А не подскажите, как в этот код встроить работу с сервоприводом, чтобы при получении из сериал порта цифры от 1 до 180 серва становилась на этот угол? Как подключить библиотеку я понял а дальше ступор. Заранее благодарен. Код: Код (Text): #include <Servo.h> Servo myservo; int val; int LED = 10; int LED1 = 11; void setup() { myservo.attach(9); Serial.begin(9600); pinMode(LED, OUTPUT); pinMode(LED1, OUTPUT); } void loop() { if (Serial.available()) { val = Serial.read(); // При символе "q" включаем светодиод if (val == 'Q') { digitalWrite(LED, HIGH); } // При символе "w" выключаем светодиод if ( val == 'W') { digitalWrite(LED, LOW); } if (val == 'E') { digitalWrite(LED1, HIGH); } if (val == 'R') { digitalWrite(LED1, LOW); } } }
Похоже что сбрасывается, только понять не могу почему! Вроде и питание нормальное и ардуино от амперки а значит тоже нормальная!
Благодарю, уже разобрался. Ардуино уходила в ребут по питанию... Блок все же оказался совсем преклонного возраста, заменил и все стало нормально.
#include <Servo.h> Servo myservo; // в блоке переменных описываешь объект, которым будешь управлять void setup() { ... myservo.attach(5); // "прикрепляешь" объект myservo к 5-й ноге } управляешь: myservo.write(90); // поворачиваешь в центральное положение (угол поворота в градусах) Вот только в твоей программе пока считывается и анализируется только один символ, а если ты хочешь, чтобы диапазон был от 1 до 180, то нужно считывать от 1 до трех цифр. Тут есть два варианта: 1. Посылаешь ВСЕГДА 3 цифры, т.е. ввод осуществляется с ведущими нулями: "001", "090", "180". Программа, обнаружив "0" или "1" довводит еще 2 символа и преобразует все три цифры в число, примерно так: Код (Text): // При цифре - читаем число полностью и поворачиваем сервопривод if ((val >= '0' ) && (val <= '9')) { val -= '0'; // преобразуешь цифру в число if (Serial.available()) // ждешь вторую цифру { val = val*10 + (Serial.read() - '0'); // вводишь вторую цифру и пересчитываешь число if (Serial.available()) { val = val*10 + (Serial.read() - '0'); // вводишь третью цифру и пересчитываешь число myservo.write(val); } } } 2. Вводишь символ-ограничитель (например, точку), получаешь и разбираешь строку до этого символа: "1.", "90.", "180.". В любом случае видимая реакция наступает только после окончания ввода - всех трех цифр в первом случае и точки - во втором. PS. По-хорошему, надо бы еще проверять, что введены именно цифры, а не произвольные символы (не вычитать тупо из кода символа код нуля).
В вашем примере val собирается из символов, которые приходят из порта. Вместо этого можно передавать сразу значение val в виде байта.
Если Вы предлагаете посылать в serial байты вместо символов, такое решение не подходит: нельзя различить, когда Вы хотите зажечь светодиод символом 'Q' и когда вы хотите повернуть серво на угол ((byte)'Q') градусов, т.к. все управляющие светодиодом символы находятся в диапазоне кодов от 1 до 180.
Было бы желание. 0..180 - серва, 181 и 182 - вкл/выкл первый светодиод, 183 и 184 - вкл/выкл второй светодиод. Но для управления таким способом удобнее не использовать монитор, а потратить 10 минут на написание программки-пульта.
Ну да, вопрос только с какой стороны усложнять код - со стороны Arduino или со стороны PC. Как-то интуитивно кажется, что первое немного проще.
Первое проще, второе удобней. Управлять чем-либо при помощи монитора порта - то еще извращение. Гораздо удобней тыкать кнопки в окошке или жать клавиши на клавиатуре.