Проблемы с кодом
- Войдите на сайт для отправки комментариев
Вс, 26/10/2014 - 22:42
В написании не силен, компилируется но не работает.
Сама идея, есть два аналоговых сигнала, обои от 1,17 до 1,75 В. Хотел, что бы 2 сервы вращались от 0 до 180 в зависимости от напряжения на входах.
/*Управляем углом 2х серв, в зависимости от напряжения
*/
#include <Servo.h> //Подключаем библиотеку Servo
Servo motor;
int sensePin1 = A1;//Обьявляем A1 аналоговый вход
int sensePin0 = A0;//Обьявляем А0 аналоговый вход
void setup()
{
analogReference(DEFAULT); //Объявляем диапазон чтения с аналогового порта
motor.attach(10); // Подключаем серву на 10
motor.attach(9); // Подключаем серву на 9
}
void loop()
{
int val = analogRead(sensePin0);// Создаем переменную val для чтения analogRead
val= constrain(val,1.17 ,1.75);// Ограничиваем диапазон работы по напряжению
int motorAng = map(val,1.75, 1.17, 180,0);//Преобразуем диапазон входных напряжений в диапазон углов сервы
motor.write(motorAng);// Устанавливаем серву на угол который получаем через преобразование
int val1 = analogRead(sensePin1);// Создаем переменную val1 для чтения analogRead
val1= constrain(val,1.17 ,1.75);// Ограничиваем диапазон работы по напряжению
int motorAng0 = map(val,1.75, 1.17, 180,0);//Преобразуем диапазон входных напряжений в диапазон углов сервы
motor.write(motorAng0);// Устанавливаем серву на угол который получаем через преобразование
}
Читаем analogRead() и что он возвращает.
Прочел, но до конца не понял как быть
int analogPin = 3; // номер порта к которому подключен потенциометр int val = 0; // переменная для хранения считываемого значения void setup() { Serial.begin(9600); // установка связи по serial } void loop() { val = analogRead(analogPin); // считываем значение Serial.println(val); // выводим полученное значение }пробовал и вот так, но все равно не работает
/*Управляем углом 2х серв, в зависимости от напряжения */ #include <Servo.h> //Подключаем библиотеку Servo Servo motor; int sensePin1 = A1;//Обьявляем A1 аналоговый вход int sensePin0 = A0;//Обьявляем А0 аналоговый вход void setup() { analogReference(DEFAULT); //Объявляем диапазон чтения с аналогового порта Serial.begin(9600); motor.attach(10); // Подключаем серву на 10 motor.attach(9); // Подключаем серву на 9 } void loop() { Serial.println(analogRead(sensePin1)); Serial.println(analogRead(sensePin0)); int val = analogRead(sensePin0);// Создаем переменную val для чтения analogRead val= constrain(val,1.17 ,1.75);// Ограничиваем диапазон работы по напряжению int motorAngl0 = map(val,1.75, 1.17, 180,0);//Преобразуем диапазон входных напряжений в диапазон углов сервы motor.write(motorAngl0);// Устанавливаем серву на угол который получаем через преобразование int val1 = analogRead(sensePin1);// Создаем переменную val1 для чтения analogRead val1= constrain(val,1.17 ,1.75);// Ограничиваем диапазон работы по напряжению int motorAngl1 = map(val,1.75, 1.17, 180,0);//Преобразуем диапазон входных напряжений в диапазон углов сервы motor.write(motorAngl1);// Устанавливаем серву на угол который получаем через преобразование }для примера брал управление сервой от фоторезистора, думаю может быть не работает из за наличия сотых вольта int motorAngl0 = map(val,1.75, 1.17, 180,0);
Забыл уточнить, что импульсы идут лишь на 9 пин, серву с 10 пина можно вручную прокрутить.
Возвращаемое значение
int (0 to 1023)
и про map() тоже почитай
Кое чего добился вот так, но работает лишь одна серва на 9 пине.Подскажите что надо изменить, что бы вторая серва так же слушалась.
/*Управляем углом 2х серв, в зависимости от напряжения */ #include <Servo.h> //Подключаем библиотеку Servo Servo motor; int X = A0;//Обьявляем A0 аналоговый вход int Y = A1;//Обьявляем А1 аналоговый вход void setup() { Serial.begin(9600); motor.attach(10); // Подключаем серву на 10 пин motor.attach(9); // Подключаем серву на 9 пин } void loop() { Serial.println(analogRead(Y)); Serial.println(analogRead(X)); int val = analogRead(Y);// Создаем переменную val для чтения analogRead val= constrain(val,240 ,360);// Ограничиваем диапазон работы по напряжению int motorAng10 = map(val,240, 360, 180,0);//Преобразуем диапазон входных напряжений в диапазон углов сервы motor.write(motorAng10);// Устанавливаем серву на угол который получаем через преобразование int val1 = analogRead(X);// Создаем переменную val1 для чтения analogRead val1= constrain(val1,240 ,360);// Ограничиваем диапазон работы по напряжению int motorAng9 = map(val1,240, 360, 180,0);//Преобразуем диапазон входных напряжений в диапазон углов сервы motor.write(motorAng9);// Устанавливаем серву на угол который получаем через преобразование delay (200); // Защита от рысканья }если отключить 9 пин вот так, то начинает работать 10 пин
Разобрался, работают 2 сервы. Может кому пригодится код для примера.
/*Управляем углом 2х серв, в зависимости от напряжения */ #include <Servo.h> //Подключаем библиотеку Servo Servo motorX,motorY; int X = A0;//Обьявляем A0 аналоговый вход int Y = A1;//Обьявляем А1 аналоговый вход void setup() { Serial.begin(9600); motorX.attach(10); // Подключаем серву на 10 пин motorY.attach(9); // Подключаем серву на 9 пин } void loop() { Serial.println(analogRead(Y),analogRead(X)); int val = analogRead(Y);// Создаем переменную val для чтения analogRead val= constrain(val,240 ,360);// Ограничиваем диапазон работы по напряжению int motorAng10 = map(val,240, 360, 180,0);//Преобразуем диапазон входных напряжений в диапазон углов сервы motorX.write(motorAng10);// Устанавливаем серву на угол который получаем через преобразование int val1 = analogRead(X);// Создаем переменную val1 для чтения analogRead val1= constrain(val1,240 ,360);// Ограничиваем диапазон работы по напряжению int motorAng9 = map(val1,240, 360, 180,0);//Преобразуем диапазон входных напряжений в диапазон углов сервы motorY.write(motorAng9);// Устанавливаем серву на угол который получаем через преобразование delay (200); // Защита от рысканья }Но есть пара вопросов. Как можно обойтись без delay (200); // Защита от рысканья
И как можно в мониторе порта смотреть одновремено X и Y(входа А0 и А1), в даном варианте показывает аброкадабру.
В таком виде показывает лишь даные с одного входа
char str[11]="";
sprintf(str, "%4d %4d", analogRead(X), analogRead(Y));
Serial.println(str);
С рысканьем помогло, спасибо. А по поводу монитора порта, я правильно понял, удаляю вот это
и ставлю вот это
не компилируется
Ugol_servi.ino: In function 'void loop()':
После экспериентов и нескольких прочтеных статей понял что это все вместе взамен
то биш вот так
теперь даные идут двумя столбцами, хотя первый раз пробовал и была аброкадабра, спасибо еще раз!!!
Хреновая привычка - читать код со второй строки.
Сори.Было бы поболее опыта, а так, не стреляйте в пианиста)))
Спутало еще то, что было 2 вопроса,1й как обойтись без
delay (200); вот и думал, что и есть ответ на первый вопроск то му жеchar str[11]=""; работало вместо delay (200); ну или по крайней мере нормально компилировалось)))Еще раз премного благодарен!!!