Три серво, джойстик и кнопки

Витаминыч
Offline
Зарегистрирован: 09.12.2016

Уважаемые форумчане! Прошу помощи. К скетчу из двух сервомашинок управляемых джойстиком  (пример из Ардуино) нужно добавить еще одну сервомашинку управляемую тремя  кнопками. По умолчанию серво 3 устанавливается на угол 90°, 3-я кнопка при кратковременном  нажатии устанавливает серво 3 в крайне левое положение, 2-я кнопка – в крайне правое. 1-я  кнопка возвращает серво 3 на угол 90° из любого положения. Важно  серво, находясь в одном из крайних положений, и при случайном нажатии кнопки перевода в противоположное  положение останавливалась в среднем положении. Дополнительно хотелось бы  иметь  возможность корректировать угол поворота и скорость вращения сервомашинки. В этом деле  мне до чайников еще далеко, но попытку сделал – естественно неудачную (пожалуйста не смейтесь над  древним человеком за мое художество). Велико желание воплотить в жизнь это устройство! Спасибо.

 

[code]
#include<Servo.h>               // подключение библиотеки Servo
#define BUT_1 4    		// BUT_1 кнопка возвращения 3 сервы на начальный угол
#define BUT_2 5	        	// BUT_2 кнопка поворота 3 сервы в левое положение
#define BUT_3 6	        	// BUT_3 кнопка поворота 3 сервы в правое положение
Servo servo1, servo2, servo3;
const int pinServo1 = 8; 	// Пин для подключения 1 сервопривода
const int pinServo2 = 9; 	// Пин для подключения 2 сервопривода
int pinServo3 = 10; 	// Пин для подключения 3 сервопривода
int angleServo1, angleServo2, angleServo3 = 0;	// переменные для хранения углов поворота сервоприводов 1, 2 и 3
const int axisX = A0; 				// ось Х подключена к A0
const int axisY = A1; 				// ось Y подключена к A1
int valX, valY = 0; 			// переменные для хранения значений осей
Servo myServo;
void setup()
{
  servo1.attach(pinServo1);		// подключить переменную servo1 к выводу pinServo1
  servo2.attach(pinServo2);  		// подключить переменную servo2 к выводу pinServo2
  myServo.attach(pinServo3);            // подключить переменную servo3 к выводу pinServo3
  myServo.write(90);			// устанавливает 3 серву в среднее положение
  pinMode(BUT_1, INPUT); 	  	// для считывания состояний кнопоки 1
  digitalWrite( BUT_1 , HIGH );   	// подтяжка
  pinMode(BUT_2, INPUT); 	  	// для считывания состояний кнопоки 2
  digitalWrite( BUT_2 , HIGH );   	// подтяжка
  pinMode(BUT_3, INPUT); 	  	// для считывания состояний кнопоки 3
  digitalWrite( BUT_3 , HIGH );   	// подтяжка
}
void loop()
{
  valX = analogRead(axisX); 			// значение оси Х
  valY = analogRead(axisY); 			// значение оси Y
  angleServo1 = map(valX, 0, 1023, 0, 180);	// масштабируем значение к интервалу 0-180 ось Х
  angleServo2 = map(valY, 0, 1023, 0, 180);     // масштабируем значение к интервалу 0-180 ось Y
  servo1.write(angleServo1);  			// поворот сервоприводa 1 на полученный угол
  servo2.write(angleServo2);                    // поворот сервоприводa 2 на полученный угол
  if ( ! digitalRead(BUT_1)) 90;                //если первая кнопка установим в среднее положение
  if ( ! digitalRead(BUT_2)) 0;                 //если вторая кнопка повернем влево
  if ( ! digitalRead(BUT_3)) 180; 	        //если третья кнопка повернем вправо
  delay(300); 			                // пауза для ожидания поворота сервоприводов
}

[/code]

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Витаминыч пишет:

попытку сделал – естественно неудачную (пожалуйста не смейтесь

Да, Господь с Вами, смеёмся над теми, кто не делает попыток и кому все должны.

С радостью помог бы, но как назло, под рукой ни одной сервы, проверить тупо не на чем, а я не так много работал с сервами, чтобы закрыв глаза, без проверки, хорошие коды выдавать, простите. Уверен, что ребята помогут.

Удачи Вам!

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Я боюсь лезть, так как Программирую в непривычном стиле . Ладно смотри.

/*
#1
серва 1 -> 8  () (servo1_pin)
серва 2 -> 9  () (servo2_pin)
серва 3 -> 10 () (servo3_pin)
#2
джойстик ->A0 (axisX_pin) ось Х
         ->A1 (axisY_pin) ось Y
 #3
кнопка 1 -> 4 (btn1_pin) возвращения 3 сервы на начальный угол 0 нажата /1 нет
кнопка 2 -> 5 (btn2_pin) поворота 3 сервы в левое положение    0 нажата /1 нет
кнопка 3 -> 6 (btn3_pin) поворота 3 сервы в правое положение   0 нажата /1 нет
*/
//#1
#include<Servo.h> // подключение библиотеки Servo
Servo servo1, servo2, servo3;
const int servo1_pin = 8;    // Пин для подключения 1 сервопривода
const int servo2_pin = 9;    // Пин для подключения 2 сервопривода
const int servo3_pin = 10;     // Пин для подключения 3 сервопривода
int angleServo1, angleServo2, angleServo3;  // переменные для хранения углов поворота сервоприводов 1, 2 и 3
//#2
const int axisX_pin = A0;               // ось Х подключена к A0
const int axisY_pin = A1;               // ось Y подключена к A1
//#3
const int btn1_pin = 4 ; // кнопка 1 возвращения 3 сервы на начальный угол
const int btn2_pin = 5 ; // кнопка 2 поворота 3 сервы в левое положение
const int btn3_pin = 6 ; // кнопка 3 поворота 3 сервы в правое положение

void setup() {
  //#1
  servo1.attach(servo1_pin);   // подключить переменную servo1 к выводу servo1_pin
  servo2.attach(servo2_pin);   // подключить переменную servo2 к выводу servo2_pin
  servo3.attach(servo3_pin);   // подключить переменную servo3 к выводу servo3_pin
  //#2
  angleServo1 = map(analogRead(axisX_pin), 0, 1023, 0, 180); // масштабируем значение к интервалу 0-180 ось Х
  angleServo2 = map(analogRead(axisY_pin), 0, 1023, 0, 180); // масштабируем значение к интервалу 0-180 ось Y
  //#3
  pinMode( btn1_pin, INPUT_PULLUP );      // подключим кнопку 1
  pinMode( btn2_pin , INPUT_PULLUP );     // подключим кнопку 2
  pinMode( btn3_pin , INPUT_PULLUP );     // подключим кнопку 3
  angleServo3 = 0;
}
void loop() {
  delay(300);
  //#1
  servo1.write(angleServo1);  // поворот сервоприводa 1 на полученный угол
  servo2.write(angleServo2);  // поворот сервоприводa 2 на полученный угол
  servo3.write(angleServo3);  // поворот сервоприводa 3 на полученный угол
  //#2
  // поворот сервоприводa 2 на полученный угол
  if ( ! digitalRead(btn1_pin)) angleServo3 = 90 ; //если первая кнопка установим в среднее положение
  if ( ! digitalRead(btn2_pin)) angleServo3 = 0  ; //если вторая кнопка повернем влево
  if ( ! digitalRead(btn3_pin)) angleServo3 = 180; //если третья кнопка повернем вправо
  //#3
  angleServo1 = map(analogRead(axisX_pin), 0, 1023, 0, 180); // масштабируем значение к интервалу 0-180 ось Х
  angleServo2 = map(analogRead(axisY_pin), 0, 1023, 0, 180); // масштабируем значение к интервалу 0-180 ось Y
}

 

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Я поясню ТС, вот вы с двумя сервами в строках 34, 35 работаете правильно, а в строках 36, 37, 38 просто говорите что если кнопка нажата то 90! Что 90? Нужно сказать что в 3 серву нужно установить угол 90.

Пс. Вспомнился анекдот:
- Штурман, приборы?
-180!
-что 180?
-а что приборы?!

Витаминыч
Offline
Зарегистрирован: 09.12.2016

ОГРОМНАЯ Вам благодарность!!! Проверил все работает! Девиз:" Учиться, учиться и еще раз -учиться" - никто не отменял. Буду этим руководствоваться в познании "Ардуинского" творчества. Еще раз - СПАСИБО!!!