Сервопривод

Сервопривод

Сообщение kmd » 04 апр 2019, 17:01

Сервопривод

#include <Servo.h>
Servo servo;
void setup() {
servo.attach(10);

}

void loop() {
servo.write(0);
delay(2000);
servo.write(190);
delay(2000);
}
kmd
Коллекционер
 
Сообщения: 122
Зарегистрирован: 23 ноя 2018, 10:59

Re: Сервопривод

Сообщение kmd » 04 июл 2019, 16:53

идеология;
управление двумя servo любым (ИК) инфракрасным пультом,для управления задействуем 5 кнопок ИК пульта,
4 кнопки для плавного поворота вправо или влево, а одну кнопку для регулировки скорости поворота.
Рекомендую использовать конденсаторы для сглаживания электрических колебаний которые создают servo во время работы.

------------------------------------------
скетч sketch: v.01 Arduino управление servo любым ИК пультом Control IR
================================
что нам понадобиться.
Аппаратное:
1.servo
2. любая Arduino
3. ИК инфракрасный приёмник
4. Светодиоды нужны только для визуального контроля за процессом.
5. конденсаторы
--------------------------------
программное:
Библиотеки.

1.IRremote, библиотека для работы с ИК сигналом.
Скачать библиотеку IRremote для ИК пульта
https://disk.yandex.ru/public/?hash=yNz ... mhW4Xt0%3D

IRremote эта библиотека кажется по новее будет
http://yadi.sk/d/0jIS1tfw6tbb7

https://github.com/shirriff/Arduino-IRremote

=======================================================
подробную видео инструкцию выложу здесь
v.01 Arduino управление servo любым ИК пультом Control IR + speed

++++++++++++++++++++++++++++++
Вспомогательные видео обзоры, скетчи.....

скетч arduino чтобы узнать код кнопки ИК пульта
sketch arduino buttons on the remote to learn the code
https://disk.yandex.ru/public/?hash=KzL ... QKJHGRQ%3D

4/6 как ? узнать код - кнопки своего ИК пульта
http://www.youtube.com/watch?v=InZuGntH_wk


v.01 Arduino IR Управление с ИК пульта в режиме удержания кнопки
https://www.youtube.com/watch?v=AjIASUNiWkY


Самый дешевый Arduino Uno 5$ Minimal Atmega328 without Arduino Board
http://www.youtube.com/watch?v=joSc-AT8o5k

*/



#include <Servo.h> //библиотека для Servo
#include <IRremote.h> // это скачанная библиотека IRremote для ИК пульта


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

Servo dimkaservo_1; //даём имена servo
Servo dimkaservo_2;

//Pin для светодиодов,светодиоды для визуального контроля за процессом
int ledPin_1 = 15; //PIN 15, на Arduino Uno, Atmega328 (A1)
int ledPin_2 = 16;
int ledPin_3 = 17;
int ledPin_4 = 18;

// 1. для сглаживания пульсирующего ИК сигнала.
// 2. для отключения светодиодов ledPin после пропадания ИК сигнала, без использования delay.
int timer_ledPIN = 14; //индикация таймера //PIN 14, на Arduino Uno, Atmega328 (A0)

// для визуального контроля яркостью светодиода, изменения (увеличения или уменьшения) скорости работы servo.
int speed_PWM_ledPin = 5;

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

//переменная для конвертации (увеличенного диапазона значений от 0 до 30000) (a),(d),в значения требуемые для поворота servo.
int val_1;
int val_2;

//переменная для (увеличения или уменьшения)скорости поворота servo.
int speed_PWM=1;

//переменная eventTime, для паузы, вместо delay,будем использовать функцию millis.
unsigned long eventTime=0;

void setup() {
// Serial.begin(9600);
irrecv.enableIRIn(); // включить ИК приёмник

dimkaservo_1.attach(9); // серво подключён на цифровой вход (pin 9)
dimkaservo_2.attach(10); // серво подключён на цифровой вход (pin 10)

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


pinMode(timer_ledPIN, OUTPUT);

pinMode(speed_PWM_ledPin, OUTPUT);

}

void loop() {
// По приёму и обработки сигнала от ИК инфракрасного пульта.
//Мой опыт работы с ИК пультами выявил разные принципы отправки ИК сигналов кодов у разных производителей техники (пультов)
//мне нужно, чтоб система могла работать и в режиме удержания кнопки, для этого нужно постоянно слать ИК код с пульта
// пока кнопка на пульте нажата.
//Увы, есть пульты которые шлют код только один раз, в момент нажатия кнопки.
// послав 1 код, пульт далее продолжает, слать (в момент удержания кнопки), (назовем его (пустой инфракрасный сигнал).
// после отпускания кнопки (пустой инфракрасный сигнал) исчезает.
// Задача такая, после приёма определённого кода кнопки,сразу перехватывать идущий за ним (кодом), (пустой инфракрасный сигнал)
// и считать его, (пустой инфракрасный сигнал), за код кнопки.
//после пропадания (пустого инфракрасного сигнала), будем считать, что код перестал слаться

// Эта конструкция нужна чтобы.
//1.после приёма определённого кода кнопки,перехватывать (пустой инфракрасный сигнал)
//2.конвертировать пульсирующий (-) с (ИК) преемника сигнал в постоянный.
//После появления и пропадания сигнала, состояние сразу не меняется! а ждет 100 миллисекунд.
//Если 100 миллисекунд не прошло, и поступил еще один ИК сигнал с пульта, тогда таймер заново запускается на 100 миллисекунд.

//Проще говоря, пока кнопка на ИК пульте нажата timer_ledPIN остается HIGH
//если кнопка на пульте отпущена, LOW.



// Читаем состояние ноги у (ИК) преемника. В момент приема данных, у (ИК)
//приемника на выходе появляется пульсирующий (-)отрицательный сигнал


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


//читаем значение (a) и конвертируем его в значение val, то бишь в значение поворота в градусов доступных для servo.
// правильно было бы конвертировать в, (от 0, до 180) градусов, но мои дешёвые servo доходя до краёв,
//начинают дребезжать,поэтому я кастрировал их (края) по 10 градусов (10, 170);)
val_1 = a;
val_1 = map(val_1, 0, 30000, 10, 170); // scale it to use it with the servo (val_1ue between 10 and 170)
dimkaservo_1.write(val_1); // sets the servo position according

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

val_2 = d;
val_2 = map(val_2, 0, 30000, 10, 170);
dimkaservo_2.write(val_2); //записываем значения val_2 в dimkaservo_2



// Эта часть отвечает за приём и обработку ИК кодов
// здесь считываем коды от ИК пульта



// У моего пульта при нажатии на одну и ту же кнопку, могут отсылаться два разных (КОДА) сигнала, чтобы обойти эту проблему
//я использовал Логический оператор "или" (||) if (results.value == 0x1000809 || results.value == 0xF7283C77
// Теперь неважно какой код отправлен с кнопки пульта, первый или второй
// Если ваша кнопка пульта не страдает раздвоением личности, можете написать так if (results.value == 0x1000809
//также мною замечено при использовании разных ИК приемников, частотой 36,или 38, кГц, библиотека IRremote
// выдает Разные коды.
//можно сделать 4 "или" (||), чтобы можно было управлять с двух разных ИК пультов

//ВАЖНО !!! (1000809) это код кнопки №1 - моего (ИК)! (инфракрасного пульта)!, -
//-у вашего пульта будет другой код, замените на свой!

if (irrecv.decode(&results)) {
if(digitalRead(timer_ledPIN) == HIGH && (results.value == 0x1000809 || results.value == 0xF7283C77))digitalWrite(ledPin_1, HIGH);
if(digitalRead(timer_ledPIN) == HIGH && (results.value == 0x1008889 || results.value == 0x757FB4DF))digitalWrite(ledPin_2, HIGH);

if(digitalRead(timer_ledPIN) == HIGH && (results.value == 0x1004849 || results.value == 0xB33B4597))digitalWrite(ledPin_3, HIGH);
if(digitalRead(timer_ledPIN) == HIGH && (results.value == 0x100C8C9 || results.value == 0x3C03E507))digitalWrite(ledPin_4, HIGH);



//эта кнопка пульта для (увеличения или уменьшения)скорости поворота servo.
// начинаем увеличивать скорость на одну позицию speed_PWM++;
// и ставим ограничение на количество скоростей if (speed_PWM > 20)
// дойдя до 20 скорости,сбрасываемся на первую скорость > 20)speed_PWM=1;



if(digitalRead(timer_ledPIN) == HIGH && (results.value == 0x1002829 || results.value == 0xE705551F))speed_PWM++;
if (speed_PWM > 20)speed_PWM=1;


//для визуального контроля за состоянием скоростной коробки передач (спидометр),используем светодиод speed_PWM_ledPin
//(увеличивая или уменьшая)PWM сигнал (analogWrite) "записываем в светодиод" значения от переменной speed_PWM,
// для контрастности изменений в яркости, умножаем speed_PWM в 4 раза (speed_PWM*4)

analogWrite(speed_PWM_ledPin,speed_PWM*4);
//Serial.println(speed_PWM);

irrecv.resume();
}
}

// уникальность этого sketch в том, что не используется ни одного delay();.
// Благодаря этому, значение (плавность поворота servo) высокое.
// Есть возможность параллельно выполнять в постоянном режиме другие процессы.
kmd
Коллекционер
 
Сообщения: 122
Зарегистрирован: 23 ноя 2018, 10:59

Re: Сервопривод

Сообщение kmd » 04 июл 2019, 17:03

Arduino IR Управление с ИК пульта в режиме удержания кнопки
#include <IRremote.h> // это скачанная библиотека

int RECV_PIN = 11; //вход ИК приемника

IRrecv irrecv(RECV_PIN);

decode_results results;

//eventTime, для паузы, вместо delay,будем использовать функцию millis.

unsigned long eventTime=0;

//индикация таймера

int timer = 12;

int L13 = 13; //пины управляющие моторами, светодиодами, или реле, чем угодно.

int L2 = 2;

int L3 = 3;

int L4 = 4;

int L5 = 5;

int L6 = 6;

int L7 = 7;

int L8 = 8;

void setup(){

irrecv.enableIRIn(); // включить приемник

pinMode(L13, OUTPUT); // назначаем пины как выходы

pinMode(L2, OUTPUT);

pinMode(L3, OUTPUT);

pinMode(L4, OUTPUT);

pinMode(L5, OUTPUT);

pinMode(L6, OUTPUT);

pinMode(L7, OUTPUT);

pinMode(L8, OUTPUT);

pinMode(timer, OUTPUT);

}

void loop() {

// Эта конструкция нужна чтобы конвертировать пульсирующий (-) с (ИК) преемника сигнал в постоянный.

//После появление и пропадания сигнала, состояние сразу не меняется! а ждет 100 миллисекунд.

//Если 100 миллисекунд не прошло, и поступил еще один сигнал с пульта, тогда таймер заново запускается на 100 миллисекунд.

//Проще говоря, пока кнопка на пульте нажата таймерПИН остается вКлюченным, если кнопка на пульте отпущена таймерПИН вЫключен.

// Читаем данные с (ИК) преемника. В момент приема данных у (ИК) приемника на выходе появляется пульсирующий (-)отрицательный сигнал

if (digitalRead(RECV_PIN) == LOW)

// Если обнаружен отрицательный сигнал запускаем таймер,и включаем таймерПИН //(timer, HIGH);

eventTime=millis(),digitalWrite(timer, HIGH);

// Продолжительность работы таймера >100 миллисекунд. И ТаймерПИН выключаем //(timer, LOW)

if(millis()-eventTime>100) digitalWrite(timer, LOW)

// и вЫключаем все

,digitalWrite(L13, LOW),digitalWrite(L2, LOW),digitalWrite(L3, LOW)

,digitalWrite(L4, LOW),digitalWrite(L5, LOW),digitalWrite(L6, LOW),digitalWrite(L7, LOW),digitalWrite(L8, LOW);

if (irrecv.decode(&results)) {

//ВАЖНО !!! ( 1000809 ) это код кнопки №1 - моего (ИК)! (инфракрасного пульта)!, -

//-у вашего пульта будет другой код, замените на свой!

// У моего пульта при нажатии на одну и ту же кнопку, могут отсылаться два разных (КОДА) сигнала, чтобы обойти эту проблему

//я использовал Логический оператор "или" (||) if (results.value == 0x1000809 || results.value == 0xF7283C77

// Теперь неважно какой код отправлен с кнопки пульта, первый или второй

// Если ваша кнопка пульта не страдает раздвоением личности, можете написать так if (results.value == 0x1000809

//Только при условии если, (Одновременно),Обнаружен поступивший код кнопки

// и выключен ТаймерПИН,"и" "&&" (digitalRead(timer) == HIGH)

// включаем нужный нам pin, digitalWrite(L13, HIGH);

if (results.value == 0x1000809 || results.value == 0xF7283C77 && (digitalRead(timer) == HIGH) )digitalWrite(L13, HIGH);

if (results.value == 0x1008889 || results.value == 0x757FB4DF && (digitalRead(timer) == HIGH) )digitalWrite(L2, HIGH);

if (results.value == 0x1004849 || results.value == 0xB33B4597 && (digitalRead(timer) == HIGH) )digitalWrite(L3, HIGH);

if (results.value == 0x100C8C9 || results.value == 0x3C03E507 && (digitalRead(timer) == HIGH) )digitalWrite(L4, HIGH);

if (results.value == 0x1002829 || results.value == 0xE705551F && (digitalRead(timer) == HIGH) )digitalWrite(L5, HIGH);

if (results.value == 0x100A8A9 || results.value == 0xA4A58EC7 && (digitalRead(timer) == HIGH) )digitalWrite(L6, HIGH);

if (results.value == 0x1006869 || results.value == 0xE2E45F7F && (digitalRead(timer) == HIGH) )digitalWrite(L7, HIGH);

if (results.value == 0x100E8E9 || results.value == 0x6BACFEEF && (digitalRead(timer) == HIGH) )digitalWrite(L8, HIGH);

irrecv.resume();

}

}
kmd
Коллекционер
 
Сообщения: 122
Зарегистрирован: 23 ноя 2018, 10:59


Вернуться в Arduino uno

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

cron