Arduino - общие обсуждения

Вопросы и ответы связанные с цифровым управлением, аналоговой автоматикой и их элементами
Сообщение
Автор
Федюнь
Сообщения: 1430
Зарегистрирован: Вс фев 19, 2012 7:18 am
Имя: Фарид
Откуда: Узбекистан Ташкент
Контактная информация:

Re: Arduino - общие обсуждения

#61 Непрочитанное сообщение Федюнь »

Спасибо.И действительно из-за них.А с чем это связано?
Но всё ровно серва не работает((((
Думал что ИК приёмник не работает,прошил скеч считывания кода кнопок с пульта.Считал все кнопки ханово.
А серва так и не работает.

shalex
Сообщения: 285
Зарегистрирован: Сб июн 06, 2015 3:26 pm
Благодарил (а): 24 раза
Поблагодарили: 10 раз

Re: Arduino - общие обсуждения

#62 Непрочитанное сообщение shalex »

Федюнь писал(а):Спасибо.И действительно из-за них.А с чем это связано?
Но всё ровно серва не работает((((
Думал что ИК приёмник не работает,прошил скеч считывания кода кнопок с пульта.Считал все кнопки ханово.
А серва так и не работает.
Из шаманства только могу предложить использовать библиотеку SofwareServo
Замените блок от начала до объявления переменных с сервами

Код: Выделить всё

//#include <Servo.h> // подключаем библиотеку для Servo
#include <SoftwareServo.h> // подключаем библиотеку для Servo
#include <IRremote.h> // подключаем СКАЧЕННУЮ библиотеку IRremote для ИК пульта

int RECV_PIN = 2; //вход ИК инфракрасного приемника (32H-Atmega168)
IRrecv irrecv(RECV_PIN);
decode_results results;

//Servo servo_1; //даём имена servo
//Servo servo_2;
SoftwareServo servo_1; //даём имена servo
SoftwareServo servo_2;
а в конец цикла loop добавить строку:

Код: Выделить всё

  SoftwareServo::refresh();
p.s. вот ваш скрипт, переделанный на SoftwareServo
[Оффтопик]

Код: Выделить всё

/*             v.01 Arduino servo IR speed ИК пультом  
 ****************************
 урок от Дмитрия Осипова. http://www.youtube.com/user/d36073?feature=watch
-----------------------------
 */
//#include <Servo.h> // подключаем библиотеку для Servo
#include <SoftwareServo.h> // подключаем библиотеку для Servo
#include <IRremote.h> // подключаем СКАЧЕННУЮ библиотеку IRremote для ИК пульта

int RECV_PIN = 2; //вход ИК инфракрасного приемника (32H-Atmega168)
IRrecv irrecv(RECV_PIN);
decode_results results;

//Servo servo_1; //даём имена servo
//Servo servo_2;
SoftwareServo servo_1; //даём имена servo
SoftwareServo servo_2;

//Pin для светодиодов,светодиоды для визуального контроля за процессом
int ledPin_1 = 15; //PIN 15, на Arduino Uno, Atmega328 (A1)(24H-Atmega168)
int ledPin_2 = 16;   //  (25Н-Atmega168)
int ledPin_3 = 17;   //  (26H-Atmega168) 
int ledPin_4 = 18;   //  (27H-Atmega168)
int timer_ledPIN = 14; //индикация таймера //PIN 14, на Arduino Uno, Atmega328 (A0) (23H-Atmega168)

int a_1;// промежуточная переменная для хранения (увеличенного диапазона от 0 до 30000)значений (увеличения или уменьшения)PWM,
int a_2;// с последующей конвертации в переменную(val) диапазон градусов поворота доступных для servo.

int e_1;// переменные для экономии ресурсов ОЗУ EEPROM
int e_2;

//переменные для конвертации (увеличенного диапазона значений от 0 до 30000) (a_1;),(a_2;),в значения требуемые для поворота servo.
int val_1; 
int val_2;
int speed_PWM;//переменная для (увеличения или уменьшения)скорости поворота servo.
unsigned long eventTime=0;//переменная для (увеличения или уменьшения)скорости поворота servo.

void setup() {              
  irrecv.enableIRIn(); // включить ИК приёмник
  servo_1.attach(9); // серво подключён на цифровой вход (pin 9) (13H-Atmega168)
  servo_2.attach(10); // серво подключён на цифровой вход (pin 10) (14H-Atmega168)

  pinMode(ledPin_1, OUTPUT);
  pinMode(ledPin_2, OUTPUT);
  pinMode(ledPin_3, OUTPUT);
  pinMode(ledPin_4, OUTPUT);
  pinMode(timer_ledPIN, OUTPUT);
  
  a_1=1;
  a_2=1;
  
  speed_PWM=1;//Чем меньше значение тем меньше скорость
}

void loop() {
  
  if (digitalRead(RECV_PIN) == LOW)     
    eventTime=millis(),digitalWrite(timer_ledPIN, HIGH);  
  if(millis()-eventTime>100) digitalWrite(timer_ledPIN, LOW),digitalWrite(ledPin_1, LOW),digitalWrite(ledPin_2, LOW),
  digitalWrite(ledPin_3, LOW),digitalWrite(ledPin_4, LOW);

  //если ledPin_1) ==, выставляем ограничение для переменной(a_1) до (&& a_1<30000).и Начинаем увеличивать
  // значения переменной(a_1) прибавляем на значение переменной speed_PWM,
  //и также выставляем ограничение при убывании (&& a_1>0)
  if(digitalRead(ledPin_1) == HIGH && a_1<30000  ) a_1=a_1+speed_PWM;
  if(digitalRead(ledPin_2) == HIGH && a_1>0  ) a_1=a_1-speed_PWM;
  
  val_1 = a_1;           
  val_1 = map(val_1, 0, 30000, 1, 179);//читаем значение (a_1) и конвертируем его в val_1, то бишь в значение поворота в градусах для servo.
  servo_1.write(val_1);    // правильно было бы конвертировать в, (от 0, до 180) градусов, но мои дешёвые servo доходя до краёв               

  //делаем тоже самое и для servo_2
  if(digitalRead(ledPin_3) == HIGH && a_2<30000  ) a_2=a_2+speed_PWM;
  if(digitalRead(ledPin_4) == HIGH && a_2>0  ) a_2=a_2-speed_PWM;

  val_2 = a_2;           
  val_2 = map(val_2, 0, 30000, 1, 179);     
  servo_2.write(val_2);  //записываем значения  val_2 в servo_2     

  //от (1 до 30.000), то перед записью в ячейку №1, делим значение переменной a_1 на 118  //(1, a_1/118)//
  // и меняем значение переменной e_1=0;// 

  if(digitalRead(ledPin_1) == HIGH || digitalRead(ledPin_2)== HIGH)e_1=1;
  if(digitalRead(ledPin_1) == LOW && digitalRead(ledPin_2)== LOW && e_1==1)(1, a_1/118),e_1=0;

  if(digitalRead(ledPin_3) == HIGH || digitalRead(ledPin_4)== HIGH)e_2=1;
  if(digitalRead(ledPin_3) == LOW && digitalRead(ledPin_4)== LOW && e_2==1)(2, a_2/118),e_2=0;

    if (irrecv.decode(&results)) {   // здесь считываем коды от ИК пульта
    if(digitalRead(timer_ledPIN) == HIGH && (results.value == 0x1767AF71 ))digitalWrite(ledPin_1, HIGH); //(1767AF71) это код кнопки №1  
    if(digitalRead(timer_ledPIN) == HIGH && (results.value == 0x318A151 ))digitalWrite(ledPin_2, HIGH); // это код кнопки №2

    if(digitalRead(timer_ledPIN) == HIGH && (results.value == 0xFCA418D1 ))digitalWrite(ledPin_3, HIGH); //это код кнопки №3 
    if(digitalRead(timer_ledPIN) == HIGH && (results.value == 0xAFD97D5 ))digitalWrite(ledPin_4, HIGH); //это код кнопки №4
    
    irrecv.resume(); 
  }
  SoftwareServo::refresh();
} 

shalex
Сообщения: 285
Зарегистрирован: Сб июн 06, 2015 3:26 pm
Благодарил (а): 24 раза
Поблагодарили: 10 раз

Re: Arduino - общие обсуждения

#63 Непрочитанное сообщение shalex »

Как успехи? Работает SoftwareServo на тиньке168? )))

Федюнь
Сообщения: 1430
Зарегистрирован: Вс фев 19, 2012 7:18 am
Имя: Фарид
Откуда: Узбекистан Ташкент
Контактная информация:

Re: Arduino - общие обсуждения

#64 Непрочитанное сообщение Федюнь »

А где я возьму такую библиотеку? #include <SoftwareServo.h> // подключаем библиотеку для Servo

Аватара пользователя
LABA
Сообщения: 1616
Зарегистрирован: Пт мар 20, 2009 9:25 pm
Откуда: Питер
Благодарил (а): 32 раза
Поблагодарили: 7 раз
Контактная информация:

Re: Arduino - общие обсуждения

#65 Непрочитанное сообщение LABA »

Федюнь писал(а):А где я возьму такую библиотеку? #include <SoftwareServo.h> // подключаем библиотеку для Servo
http://playground.arduino.cc/ComponentLib/Servo

Федюнь
Сообщения: 1430
Зарегистрирован: Вс фев 19, 2012 7:18 am
Имя: Фарид
Откуда: Узбекистан Ташкент
Контактная информация:

Re: Arduino - общие обсуждения

#66 Непрочитанное сообщение Федюнь »

Arduino: 1.6.7 (Windows XP), Плата:"Arduino/Genuino Uno"

In file included from C:\Documents and Settings\Admin\Мои документы\Arduino\sketch_feb19a\sketch_feb19a.ino:7:0:

C:\Program Files\Arduino\libraries\SoftwareServo/SoftwareServo.h:4:22: fatal error: WProgram.h: No such file or directory

#include <WProgram.h>

^

compilation terminated.

exit status 1
Ошибка компиляции.

Это сообщение будет содержать больше информации чем
"Отображать вывод во время компиляции"
включено в Файл > Настройки

shalex
Сообщения: 285
Зарегистрирован: Сб июн 06, 2015 3:26 pm
Благодарил (а): 24 раза
Поблагодарили: 10 раз

Re: Arduino - общие обсуждения

#67 Непрочитанное сообщение shalex »

Федюнь писал(а): C:\Program Files\Arduino\libraries\SoftwareServo/SoftwareServo.h
В этом файле попробуйте заменить

Код: Выделить всё

#include <WProgram.h>
на

Код: Выделить всё

#include <Arduino.h>

Федюнь
Сообщения: 1430
Зарегистрирован: Вс фев 19, 2012 7:18 am
Имя: Фарид
Откуда: Узбекистан Ташкент
Контактная информация:

Re: Arduino - общие обсуждения

#68 Непрочитанное сообщение Федюнь »

#include <SoftwareServo.h> // подключаем библиотеку для Servo
//#include <Servo.h> // подключаем библиотеку для Servo
#include <IRremote.h> // подключаем СКАЧЕННУЮ библиотеку IRremote для ИК пульта

int RECV_PIN = 2; //вход ИК инфракрасного приемника (32H-Atmega168)
IRrecv irrecv(RECV_PIN);
decode_results results;

SoftwareServo servo_1; //даём имена servo
SoftwareServo servo_2;
//Servo servo_1; //даём имена servo
//Servo servo_2;

//Pin для светодиодов,светодиоды для визуального контроля за процессом
int ledPin_1 = 15; //PIN 15, на Arduino Uno, Atmega328 (A1)(24H-Atmega168)
int ledPin_2 = 16; // (25Н-Atmega168)
int ledPin_3 = 17; // (26H-Atmega168)
int ledPin_4 = 18; // (27H-Atmega168)
int timer_ledPIN = 14; //индикация таймера //PIN 14, на Arduino Uno, Atmega328 (A0) (23H-Atmega168)

int a_1;// промежуточная переменная для хранения (увеличенного диапазона от 0 до 30000)значений (увеличения или уменьшения)PWM,
int a_2;// с последующей конвертации в переменную(val) диапазон градусов поворота доступных для servo.

int e_1;// переменные для экономии ресурсов ОЗУ EEPROM
int e_2;

//переменные для конвертации (увеличенного диапазона значений от 0 до 30000) (a_1;),(a_2;),в значения требуемые для поворота servo.
int val_1;
int val_2;
int speed_PWM;//переменная для (увеличения или уменьшения)скорости поворота servo.
unsigned long eventTime=0;//переменная для (увеличения или уменьшения)скорости поворота servo.

void setup() {
irrecv.enableIRIn(); // включить ИК приёмник
servo_1.attach(9); // серво подключён на цифровой вход (pin 9) (13H-Atmega168)
servo_2.attach(10); // серво подключён на цифровой вход (pin 10) (14H-Atmega168)

pinMode(ledPin_1, OUTPUT);
pinMode(ledPin_2, OUTPUT);
pinMode(ledPin_3, OUTPUT);
pinMode(ledPin_4, OUTPUT);
pinMode(timer_ledPIN, OUTPUT);

a_1=1;
a_2=1;

speed_PWM=1;//Чем меньше значение тем меньше скорость
}

void loop() {

if (digitalRead(RECV_PIN) == LOW)
eventTime=millis(),digitalWrite(timer_ledPIN, HIGH);
if(millis()-eventTime>100) digitalWrite(timer_ledPIN, LOW),digitalWrite(ledPin_1, LOW),digitalWrite(ledPin_2, LOW),
digitalWrite(ledPin_3, LOW),digitalWrite(ledPin_4, LOW);

//если ledPin_1) ==, выставляем ограничение для переменной(a_1) до (&& a_1<30000).и Начинаем увеличивать
// значения переменной(a_1) прибавляем на значение переменной speed_PWM,
//и также выставляем ограничение при убывании (&& a_1>0)
if(digitalRead(ledPin_1) == HIGH && a_1<30000 ) a_1=a_1+speed_PWM;
if(digitalRead(ledPin_2) == HIGH && a_1>0 ) a_1=a_1-speed_PWM;

val_1 = a_1;
val_1 = map(val_1, 0, 30000, 1, 179);//читаем значение (a_1) и конвертируем его в val_1, то бишь в значение поворота в градусах для servo.
servo_1.write(val_1); // правильно было бы конвертировать в, (от 0, до 180) градусов, но мои дешёвые servo доходя до краёв

//делаем тоже самое и для servo_2
if(digitalRead(ledPin_3) == HIGH && a_2<30000 ) a_2=a_2+speed_PWM;
if(digitalRead(ledPin_4) == HIGH && a_2>0 ) a_2=a_2-speed_PWM;

val_2 = a_2;
val_2 = map(val_2, 0, 30000, 1, 179);
servo_2.write(val_2); //записываем значения val_2 в servo_2

//от (1 до 30.000), то перед записью в ячейку №1, делим значение переменной a_1 на 118 //(1, a_1/118)//
// и меняем значение переменной e_1=0;//

if(digitalRead(ledPin_1) == HIGH || digitalRead(ledPin_2)== HIGH)e_1=1;
if(digitalRead(ledPin_1) == LOW && digitalRead(ledPin_2)== LOW && e_1==1)(1, a_1/118),e_1=0;

if(digitalRead(ledPin_3) == HIGH || digitalRead(ledPin_4)== HIGH)e_2=1;
if(digitalRead(ledPin_3) == LOW && digitalRead(ledPin_4)== LOW && e_2==1)(2, a_2/118),e_2=0;

if (irrecv.decode(&results)) { // здесь считываем коды от ИК пульта
if(digitalRead(timer_ledPIN) == HIGH && (results.value == 0x1767AF71 ))digitalWrite(ledPin_1, HIGH); //(1767AF71) это код кнопки №1
if(digitalRead(timer_ledPIN) == HIGH && (results.value == 0x318A151 ))digitalWrite(ledPin_2, HIGH); // это код кнопки №2

if(digitalRead(timer_ledPIN) == HIGH && (results.value == 0xFCA418D1 ))digitalWrite(ledPin_3, HIGH); //это код кнопки №3
if(digitalRead(timer_ledPIN) == HIGH && (results.value == 0xAFD97D5 ))digitalWrite(ledPin_4, HIGH); //это код кнопки №4

irrecv.resume();
SoftwareServo::refresh();
}
}


Вобшем при нажатии любой кнопки серва едит только в одну сторону, не меняя скорость.

shalex
Сообщения: 285
Зарегистрирован: Сб июн 06, 2015 3:26 pm
Благодарил (а): 24 раза
Поблагодарили: 10 раз

Re: Arduino - общие обсуждения

#69 Непрочитанное сообщение shalex »

Это не критично, но SoftwareServo вы оформили в ветку опроса кнопок. Нужно еще на одну строку вниз, между двумя закрывающими скобками.

судя по коду серва и не должа менять скорость.

смысл скетча - ик пультом управлять 2мя сервами с помощью 4х кнопок. Кпопку нажал - серва двигается, кнопку отпустил - серва замерла. Нажал соседнюю кнопку - серва поехала обратно.

Федюнь
Сообщения: 1430
Зарегистрирован: Вс фев 19, 2012 7:18 am
Имя: Фарид
Откуда: Узбекистан Ташкент
Контактная информация:

Re: Arduino - общие обсуждения

#70 Непрочитанное сообщение Федюнь »

if(digitalRead(timer_ledPIN) == HIGH && (results.value == 0xFCA418D1 ))digitalWrite(ledPin_3, HIGH); //это код кнопки №3
if(digitalRead(timer_ledPIN) == HIGH && (results.value == 0xAFD97D5 ))digitalWrite(ledPin_4, HIGH); //это код кнопки №4

irrecv.resume();

}
SoftwareServo::refresh();
}


Я понял что надо так сделать.Правильно я понял?
Серва по прежнему не реагирует ни на какую кнопку.Как в первый раз на большой скорости перевелась в крайнее положение так там и стоит.

Ответить

Вернуться в «Цифровое управление, Аналоговая автоматика и их элементы»