Всем доброго времени суток. Вот заказал недавно arduino UNO и arduino nano w3 и ещё модули apc220 ну и ещё кое-какую мелочевку думал сделать аппаратуру для управления моделью дрифт кара. c apc220 проблем не возникло, с дискретным обменом данными тоже,а вот с управлением серв что-то не сложилось. вот пример кода для приёмника с управлением одной серво (изначально хотел 4=(() #include <Servo.h> int b=0; Servo servo; void setup() { servo.attach(6); // серво подключено к пину 6 Serial.begin(9600); // скорость поледовательного порта } void loop() { b = Serial.read(); //читаем данные servo.write(b); //и поворачиваем серву на нужный угол delay(15); } вот для передатчика int potpin = 0; // потенцометр подключён к аналог. входу int val; void setup() { Serial.begin(9600); // скорость } void loop(){ val = analogRead(potpin); // читаем значение Serial.print(val); //отправляем значение на приёмник } Серва тупо дёргается и всё! помогите плизззз.
вот что ещё нарылл тоже чёт не пашет... #include <Servo.h> // включаем библиотеку Серво Servo myservo; // вводим myservo Servo myservo2; // вводим myservo2 int val = 0; // variable to store the data from the serial port void setup() { myservo.attach(9); //присваиваем myservo 9-й пин myservo2.attach(10); //присваиваем myservo2 10-й пин Serial.begin(9600); // connect to the serial port } void loop () { if (Serial.available() > 1) { byte a,b,c; a = Serial.read(); b = Serial.read(); c = Serial.read(); if(a=='S')//управляем сервами { if(b==0) myservo.write(c); if(b==1) myservo2.write(c); } } } тоесть пишем в сериал монитор вот ето S090, где S включаем сервы 0 номер сервы 90 градус на который нужно повернуть но тоже по чемуто не пашет!
Какая у вас серва, к каким пинам её подключаете и от чего питаете? Возможно просто просаживается питание. Когда серва дёргается, гляньте на светодиоды L и ON. Если L мигает, а ON подзатухает — это то самое.
серва подключена к шестому пину... питаю всю ардуино от никель-металгидридной батареи. с светодиодами всё норм, они затухали когда я питал ардуину от юсб. пробовол писать ужасный скетч, где высчитывал каждый градус из 180, с шагом 5 градусов - все символы клавы на ето кинул... всё работает, но ето не дело, чтобы одна серва всего работала.. Если можеш напиши плиз прогу для приёмника и передатчика для 3 - х серв.. я ведь нуб ^_^ . .... пятые сутки сижу с етой ардуиной.... родители уже раз 100 пожалели что её подарили ^_^
пытался использовать Firmate: с ползунком всё норм управляется даже через мои apc220... но не от другой ардуины, а от компа..
Код (Text): if (Serial.available() > 1) { byte a,b,c; a = Serial.read(); b = Serial.read(); c = Serial.read(); if(a=='S')//управляем сервами { if(b==0) myservo.write(c); if(b==1) myservo2.write(c); } Так не совсем корректно делать. Вы проверяете наличие не менее 2-х байт, а потом тут же считываете три. Либо запрашивайте нужное количество, либо вычитывайте их по одному. При этом, если где-то произошло смещение и управляющий символ 'S' попал в переменные b или c, то программа может никогда не получить правильную последовательность. Что и как вы посылаете в порт?
да я сам не знаю нашел эту прогу в нете, а сам не разобрался... посмотри плиз проги в первом посте... в чём там может быть проблема?
Вы отправляете число как строку, а считываете как коды символов этой строки, а не как исходное число.
кажись разобрался... вот примеры скетчей. управление грубое, но всё-же. Вот для передатчика. Код (Text): int potpin = 0; // потенцометр подключён к аналог. входу int Buffer; void setup() { Serial.begin(9600); // скорость } void loop(){ Buffer = analogRead(potpin); // читаем значение Buffer = map(Buffer, 300, 715, 1, 9); Serial.println(Buffer); //отправляем значение на приёмник delay(10); } Вот для приёмника. Код (Text): #include <Servo.h> int val; Servo servo; void setup() { servo.attach(3); // серво подключено к пину 3 Serial.begin(9600); // скорость поледовательного порта } void loop() { if(Serial.available()>0) { val = Serial.read(); //читаем данные //servo.write(Buffer); //и поворачиваем серву на нужный угол // delay(15); if (val=='1') servo.write(20); if (val=='2') servo.write(40); if (val=='3') servo.write(60); if (val=='4') servo.write(80); if (val=='5') servo.write(100); if (val=='6') servo.write(120); if (val=='7') servo.write(140); if (val=='8') servo.write(160); if (val=='9') servo.write(180); } }
Всем снова привет... вот по аналогии написал программу для четырёх серв, но ардуина жутко глючит насколько я понимаю из за постоянного и очень быстрого прихода данных. Помогите плиз вот с такой задачей: нужно сделать так, чтобы если значения, читаемые с патенцометров неменяются то ардуина ничего непередаёт, а если вдруг поменялось, то надо отправить одно значение и ожидать следуещего изменения..... Сам я недопру помогите пожалуйста..
Код (Text): #include <Servo.h> int val; int prevVal; Servo servo; void setup() { servo.attach(3); // серво подключено к пину 3 Serial.begin(9600); // скорость поледовательного порта prevVal = 0; // инициируем переменную } void loop() { if(Serial.available()>0) { val = Serial.read(); //читаем данные //servo.write(Buffer); //и поворачиваем серву на нужный угол // delay(15); if (val == prevVal) { return; // ничего не изменилось, ничего не делаем } prevVal = val; // сохраняем новое значение // далее по тексту... if (val=='x') servo.write(y); } }
спасибо вроде разобрался. но сразу ещё вопрос всплыл вот у меня есть модуль GY80 http://www.dvrobot.ru/shop/i267.Modul_GY-80_Akse-Giro-Kompa-Barometr.htm с программированием разобрался там примеры есть^_^ а вот к каким пинам подключать модуль я недопер.. ткните пальцем плиз...