Проблемы с кодом

maks
Offline
Зарегистрирован: 10.03.2013

В написании не силен, компилируется но не работает.

Сама идея, есть два аналоговых сигнала, обои от 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);// Устанавливаем серву на угол который получаем через преобразование
 }
 
Coolerr
Offline
Зарегистрирован: 30.06.2014

Читаем analogRead() и что он возвращает.

maks
Offline
Зарегистрирован: 10.03.2013

Прочел, но до конца не понял как быть

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);

maks
Offline
Зарегистрирован: 10.03.2013

Забыл уточнить, что импульсы идут лишь на 9 пин, серву с 10 пина можно вручную прокрутить.

Coolerr
Offline
Зарегистрирован: 30.06.2014
Возвращаемое значение

int (0 to 1023)

и про map() тоже почитай

maks
Offline
Зарегистрирован: 10.03.2013

Кое чего добился вот так, но работает лишь одна серва на 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 пин

//motor.attach(9); // Подключаем серву на 9 пин

 

maks
Offline
Зарегистрирован: 10.03.2013

Разобрался, работают 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), в даном варианте  показывает аброкадабру.

Serial.println(analogRead(Y),analogRead(X));

В таком виде показывает лишь даные с одного входа

Serial.println(analogRead(Y));
Serial.println(analogRead(X));

 

Radjah
Offline
Зарегистрирован: 06.08.2014

char str[11]="";

sprintf(str, "%4d %4d", analogRead(X), analogRead(Y));

Serial.println(str);

maks
Offline
Зарегистрирован: 10.03.2013

С рысканьем помогло, спасибо. А по поводу монитора порта, я правильно понял, удаляю вот это 

Serial.println(analogRead(Y),analogRead(X));

и ставлю вот это

sprintf(str, "%4d %4d", analogRead(X), analogRead(X));

Serial.println(str);

не компилируется 

Ugol_servi.ino: In function 'void loop()':

Ugol_servi:20: error: 'str' was not declared in this scope

 

maks
Offline
Зарегистрирован: 10.03.2013

После экспериентов и нескольких прочтеных статей понял что это все вместе взамен

 Serial.println(analogRead(Y),analogRead(X));

то биш вот так

 char str[11]="";

sprintf(str, "%4d %4d", analogRead(X), analogRead(Y));

Serial.println(str);

теперь даные идут двумя столбцами, хотя первый раз пробовал и была аброкадабра, спасибо еще раз!!!

 

Radjah
Offline
Зарегистрирован: 06.08.2014

Хреновая привычка - читать код со второй строки.

maks
Offline
Зарегистрирован: 10.03.2013

Сори.Было бы поболее опыта, а так, не стреляйте в пианиста)))

Спутало еще то, что было 2 вопроса,1й как обойтись без delay (200);  вот и думал, что и есть ответ на первый вопрос

к то му же char str[11]="";   работало вместо delay (200); ну или по крайней мере нормально компилировалось)))

Еще раз премного благодарен!!!