Управление сервой через фоторезистор.Угол зависит от освещения

Dikon
Offline
Зарегистрирован: 28.11.2012

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

/*Управляем сервой в зависимости от освещенности
Используем фотосопротивление, может быть любой аналоговый сенсор
*/
#include <Servo.h> //Подключаем библиотеку Servo
Servo motor;
 int sensePin = 0;//Обьявляем 0 аналоговый пин
void setup()
{
analogReference(DEFAULT); //Объявляем диапазон чтения с аналогового порта.Необязательное
/* Будем смотреть вывод на сериальном мониторе с Ардуино, для чего его инициализируем
  Заодно можно посмотреть диапазон работы датчика чтобы в этом диапазоне поворачивать серву*/
  Serial.begin(9600);
   motor.attach(10); // Подключаем серву на 10 пин
}
 
void loop()
{
  // Печатаем на монитор
  Serial.println(analogRead(sensePin));
  int val = analogRead(sensePin);// Создаем переменную val для чтения analogRead
  val= constrain(val,230 ,699);// Ограничиваем диапазон работы датчика посмотрев его на мониторе
  int motorAngl = map(val,699, 230, 180,0);//Преобразуем диапазон выдаваемый датчиком в диапазон углов сервы
   motor.write(motorAngl);// Устанавливаем серву на угол который получаем через преобразование
 }

 

andy_111
Offline
Зарегистрирован: 20.12.2012

Спасибо, очень интересный для начинающего опыт. Скажите, а какой датчик и какой резистор использовали в проекте?

Dikon
Offline
Зарегистрирован: 28.11.2012

100k А фоторезистор какой-то обычный главное подобрать диапазон Можно вместо него поставить потенциометр и при его повороте будет поворачиваться серва

leshak
Offline
Зарегистрирован: 29.09.2011

Если "в учебных", то можно еще покопатся/поигратся с такой темой как ПИД-регулятор

Любые вещи где у нас есть "управляющий сигнал" (желаемая температура), объект регулирования (вентиль батареи), обратная связь (датчик температуры) и внешние возмущение (кто-то открыл/закрыл форточку, на улице похолодало) - это именно его область применения.

Кстати даже ваш код - это частный случай ПИД-регулятора (где интегральная и дифференциальная составляющая обнулены).

В большинстве случаев такой "лобовой" подход через маппинг работает и действительно больше ничего не нужно, но, иногда  начинается либо "сильно много крутим сервой на "пару градусов"", либо система начала расскачиваться "как качели" (жарко - включили охлаждение, проскочили комфорт, включили нагрев, опять проскочили, охлаждение, снова мимо, но уже больше....)

В вике немного "страшно", для гуманитария описанно что это такое.  Можно еще глянуть объяснение "что это такое"  более простым языком на примере бака с водой  (бачка унитаза :)  

Опять-таки, в учебных - можно самому этот ПИД попытатся реализовать, а можно попытатся поигратся готовой библиотекой для этого http://playground.arduino.cc/Code/PIDLibrary

Dikon
Offline
Зарегистрирован: 28.11.2012

Папа  .. Ты о каких Пидах сейчас разговаривал :-)

leshak
Offline
Зарегистрирован: 29.09.2011

Dikon пишет:

Папа  .. Ты о каких Пидах сейчас разговаривал :-)

Не переживайте, не о политиках :)

Я про тех ПИД-ы, которые Пропорционально-Интегрально-Дифференциальный регулятор.

Тут самое главное не пугатся "страшных слов", суть не такая уж и сложная :)

А понадобится они могут, как только вы от "сервка крутится на столе", перейдете к реальным датчикам, батареям отопления и проч.

Когда выяснится, что "датчик шумит", серва "все время дрожит", дуина питается от аккумулятора (и значит ее желательно выключать вермя от времени для экономии или что бы не шумела ночью), комната имеет "температурную инерцию", и вообще у сервы не хватает сил повернуть вентиль, поэтому будет DC-движок который умеет только "полностью открыть" или полностью "закрыть".

Вот тогда и понадобится ПИД. Можно конечно обойтись и без него. Без чтения "страшных слов". Обыкновенным здравым смыслом и рассуждениями. Только скорее всего, вы сами того не зная, в итоге все равно какой-то подвид ПИД-да реализуете. Только чуть более "корявый" или просто "дольше к этому идти будете" :) 

Вообщем IMHO это полезный "теоретический фон". Хотите - читайте, хотите - нет :)

Лично мне он был интересен (область применения ПИД-дов довольно обширна, я с ним столкнулся при "удержании лодки на курсе по GPS". Когда нужно было "подруливать аккуратно").

interv
Offline
Зарегистрирован: 25.09.2013
 
Неплохо первые строки поменять на это, чтобы чтение не происходило 2 раза:
 
void loop()
{
  int val = analogRead(sensePin);
  Serial.println(val);
  --//--
 }
teodor4ik
Offline
Зарегистрирован: 04.11.2013

А теперь по серве вопросик. Какой ток идет через серву и ее управление(10 пин)?  Не лучше ли серву к Vin прикрутить а не к 5V?

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

teodor4ik пишет:
А теперь по серве вопросик. Какой ток идет через серву и ее управление(10 пин)?  Не лучше ли серву к Vin прикрутить а не к 5V?

Даже хуже. Сервы, как правило, 5 вольтовые. Но чтобы избежать глюков, вполне можно запитать серву от отдельного источника 5 Вольт.

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

teodor4ik
Offline
Зарегистрирован: 04.11.2013

Спасибо, я это и имел в виду.

Ну и еще тогда пара вопросов. Сколько может прогнать через себя ардуина на 5V выходе без последствий?

Даже при внешнем БП, земля должна быть общая. Есть ли смысл эту землю через кондей какой прилепливать?

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

teodor4ik пишет:
Сколько может прогнать через себя ардуина на 5V выходе без последствий?

Ограничение не более 40 мА на пин. в идеале если хочется ограничить ток через пин и не думать о нагрузке можно подавать сигнал через сопротивление 200-250 Ом. 

teodor4ik пишет:
Даже при внешнем БП, земля должна быть общая. Есть ли смысл эту землю через кондей какой прилепливать?
земля и в африке земля, для сглаживания питания кондей лишним не будет, но отдельно для питания ардуино и отдельно для питания сервы. В серве, как правило, тоже микроконтроллер и когда он живет своей жизнью это не очень хорошо.

teodor4ik
Offline
Зарегистрирован: 04.11.2013

Probelzaelo пишет:

teodor4ik пишет:
Сколько может прогнать через себя ардуина на 5V выходе без последствий?

Ограничение не более 40 мА на пин. в идеале если хочется ограничить ток через пин и не думать о нагрузке можно подавать сигнал через сопротивление 200-250 Ом. 

эт то понятно... Там есь пин 5в. Так понимаю после понижения от входного сигнала,  но еще до проца. У меня на нем висит радио(nrf24l01 с усилком), жпс(neo 6m), экран(lcd shield). Не задофига?

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

Если пин не перегревается то не дофига, пока блок питания "тянет" проблемы нет. сам по себе пин и пару ампер выдержит без проблем, даже значительно больше... Все эти устройства кушают очень не много, можно и не суетиться.

apassirob
Offline
Зарегистрирован: 06.01.2014

кто потскажет как потключить к ОРДУИНО вот такой моторчик 

 

Motor Size: 2858
RPM/V: 2630kv
Max Load: 38A
Max volts: 14.8v 2~4s
Max Watts: 700w
Resistance: 0.0222

Diameter: 28mm
Front Mounting Hole Distance: 16mm or 19mm
Front Mount Thread Size: 16mm M2.5 / 19mm M3.0
Shaft Diameter: 3.17mm
Shaft Length: 14mm
Can Size: 380
Plug type: 3mm Bullet-connector
Weight: 180g

 

 
left.jpg
Kv (rpm/v) 2630
Weight (g) 180
Max Current (A) 38
Resistance (mh) 0
Max Voltage (V) 15
Power(W) 700
Shaft A (mm) 3.17
Length B (mm) 58
Diameter C (mm) 28
Can Length D (mm) 58
Total Length E (mm) 72

 

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

apassirob пишет:

кто потскажет как потключить к ОРДУИНО вот такой моторчик 

Вам бы, для начала, надо научиться писать слова без ошибок, и понять разницу между сервой и мотором... А дальше - будет уже проще: поищете в гугле по ключевым словам "ардуино управление мощной нагрузкой постоянного тока" - и найдете все, что требуется.

apassirob
Offline
Зарегистрирован: 06.01.2014

Увы без ошибок никак...язык не родно. я так думаю что по нидерлански вы писать вообще не сможите... поэтому не спешите судить :-) А за ответ огромное спосибо ;-)

 

inspiritus
Offline
Зарегистрирован: 17.12.2012

apassirob пишет:

Увы без ошибок никак...язык не родно. я так думаю что по нидерлански вы писать вообще не сможите... поэтому не спешите судить :-) А за ответ огромное спосибо ;-)

 

BRAVO 

Можно показать ссылку на моторчик?

И для выше ... Серва необязательна, я пользовал обычный коллекторный мотор с редуктором, используя для калибровки начала и стопа  концевики, а для положения метод энкодера, отлавливая броски тока на коллекторе компаратором - три импульса = один оборот. При этом главная проблема - вовремя остановиться, тк ротор имеет приличную инерцию, потому упреждение на остановку надо считать специально.

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

apassirob пишет:

кто потскажет как потключить к ОРДУИНО вот такой моторчик 

 

Motor Size: 2858
RPM/V: 2630kv
Max Load: 38A
Max volts: 14.8v 2~4s
Max Watts: 700w
Resistance: 0.0222

Diameter: 28mm
Front Mounting Hole Distance: 16mm or 19mm
Front Mount Thread Size: 16mm M2.5 / 19mm M3.0
Shaft Diameter: 3.17mm
Shaft Length: 14mm
Can Size: 380
Plug type: 3mm Bullet-connector
Weight: 180g

 
 
pm/v) 2630
Weight (g) 180
Max Current (A) 38
Resistance (mh) 0
Max Voltage (V) 15
Power(W) 700
Shaft A (mm) .17
Length B (mm) 58
Diameter C (mm) 28
Can Length D (mm) 58
Total Length E (mm) 72

 

Судя по описанию это вот такой безколлекторный двигатель он "трехфазный" и для его работы обязательно нужен любой регулятор скорости, или ESC(Electronic Speed Controler)  например любой их этих, как это работает хорошо описано тут.

При выборе контроллера, рекомендую выбрать как минимум с двойным запасом по току, те 80-100А. Заявлено что у этого мотора обмотка держит до 38А, но при ее сопротивлении всего 0.0222(плюс сопротивление ключей в регуляторе), все равно при максимуме питания 14.8В, ток КЗ через обмотку может оказаться 500-600А.

Ардуино подключается к ESC аналогично любому сервомеханизму, для управления самый простой вариант использовать библиотеку "Servo"(вместо угла поворота, будет задаваться скорость вращения). Некоторыми ESC возможно управлять без всяких библиотек, напрямую ШИМ выходом Ардуины.

 

 

apassirob
Offline
Зарегистрирован: 06.01.2014

Probelzaelo пишет:

apassirob пишет:

кто потскажет как потключить к ОРДУИНО вот такой моторчик 

 

Motor Size: 2858
RPM/V: 2630kv
Max Load: 38A
Max volts: 14.8v 2~4s
Max Watts: 700w
Resistance: 0.0222

Diameter: 28mm
Front Mounting Hole Distance: 16mm or 19mm
Front Mount Thread Size: 16mm M2.5 / 19mm M3.0
Shaft Diameter: 3.17mm
Shaft Length: 14mm
Can Size: 380
Plug type: 3mm Bullet-connector
Weight: 180g

 
 
pm/v) 2630
Weight (g) 180
Max Current (A) 38
Resistance (mh) 0
Max Voltage (V) 15
Power(W) 700
Shaft A (mm) .17
Length B (mm) 58
Diameter C (mm) 28
Can Length D (mm) 58
Total Length E (mm) 72

 

Судя по описанию это вот такой безколлекторный двигатель он "трехфазный" и для его работы обязательно нужен любой регулятор скорости, или ESC(Electronic Speed Controler)  например любой их этих, как это работает хорошо описано тут.

При выборе контроллера, рекомендую выбрать как минимум с двойным запасом по току, те 80-100А. Заявлено что у этого мотора обмотка держит до 38А, но при ее сопротивлении всего 0.0222(плюс сопротивление ключей в регуляторе), все равно при максимуме питания 14.8В, ток КЗ через обмотку может оказаться 500-600А.

Ардуино подключается к ESC аналогично любому сервомеханизму, для управления самый простой вариант использовать библиотеку "Servo"(вместо угла поворота, будет задаваться скорость вращения). Некоторыми ESC возможно управлять без всяких библиотек, напрямую ШИМ выходом Ардуины.

 

 

огромное спасибо за столь объёмный комент.... ( для меня как новичка в этом деле просто золото :-)

Вы просили ссылку :     http://hobbyking.com/hobbyking/store/__15190__S2858_2630_Brushless_Inrunner_2630kv_.html

ivanserov
Offline
Зарегистрирован: 05.09.2011

Кому надо, совместил скетчи цифрового датчика DS18B20 и этого скетча

#include <OneWire.h>
#include <Servo.h>
Servo motor;
OneWire ds(2);
void setup() 
{
  Serial.begin(9600);
  motor.attach(10);
 }
void loop()
{
  byte data[2];
  ds.reset(); 
  ds.write(0xCC);
  ds.write(0x44); //Конвертация температуры датчиком
  delay(2000);
  ds.reset();
  ds.write(0xCC); /*Игнорировать адрес - используется для обращения
                    к единственному устройству на шине, при этом адрес устройства
                    игнорируется (можно обращаться к неизвестному устройству)*/
  ds.write(0xBE); //Считать ОЗУ датчика
  data[0] = ds.read(); 
  data[1] = ds.read();
int Temp = (data[1]<<8)+data[0]; //Сдвиг на 8 бит влево (<<8)
Temp = Temp>>4;
  Serial.println(Temp);
  int val(Temp);
  val= constrain(val, 20, 40); //измерение в пределах от 20 до 40 градусов
  int motorAngle = map(val, 40, 20, 0, 180); //конвертация полученной температуры в угол сервы
  motor.write(motorAngle);
  }

 

ivanserov
Offline
Зарегистрирован: 05.09.2011

Делал для детской комнаты, поэтому диапазон измерений такой узкий

ivanserov
Offline
Зарегистрирован: 05.09.2011

apassirob
Offline
Зарегистрирован: 06.01.2014

И вновь доброго времени суток.

Хочю обратиться к вам за помошью. Проблемма такая : Есть два безколекторных двигателя ну и платы регулировки скорости конечно. потключить к ардуине у меня получяеться. Но тут стал вопрос как их синхронезировать. Тоесть ( управление джойстиком на основе двух потенциометров, Скажем один потенциометр ось Y второй ось X при подаче рычага джойстика в перёд показатели меняються с потенциометра Y при этом мне нужно чтоб оба двигателя кторые потключены на разные пины синхронно раскручивались в (скажем перёд) когда Y находиться в своём верхнем положении  и оба двигателя работают на 100% Уважу рычаг джойстика в лево при этом показания Х будут расти а Y остаёться в том же диопозоне. В этом случае один двигатель должен плавно затухать а второй оставаться работать в соотвецтвии с положением Y Дайте хоть какойто пример на основе которого я мог бы продолжить..

заранее блогодарен

 

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

Кораблик строишь?

Как вариант, взять готовый адаптер V-Tail )) для авиамоделей. тогда с джойстика(пульта ДУ) можно просто подавать Газ и направление... эта штука их прекрасно месит, резльтат именно тот что ты хочешь.  Вариант  реализации программной сейчас поищем, было...

А вот и пример, вот еще, и еще,  и совсем короткий скетчик

#include <Servo.h>

Servo servo1;
Servo servo2;
int gain1 = 2;
int gain2 = 2;
int s1= 0;
int s2= 0;

void setup()
{
// Serial.begin(115200);
servo1.attach(9); // attach Servo 1 to pin 9
servo2.attach(10); // attach Servo 2 to pin 10
pinMode(3, INPUT); // Signal 1 input at pin3 (Elevator)
pinMode(4, INPUT); // Signal 2 input at pin4 (Rudder)
}

void loop()
{
s1 = (pulseIn( 3,HIGH)-1500)/gain1;
s2 = (pulseIn( 4,HIGH) -1500)/gain2;
servo1.writeMicroseconds(s1+s2+1500);
servo2.writeMicroseconds(s1-s2+1500);
// Serial.println(s1);
} 

целиком стянуто отсюда.

vvadim
Offline
Зарегистрирован: 23.05.2012

Попробуйте


const int DirX1 = 8;    
const int DirX2 = 9;
const int DirY1 = 10;
const int DirY2 = 11;
const int speedXPin = 3;      
const int speedYPin = 5;
int joyXPin = 4;
int joyYPin = 5;
int joyX;
int joyY;
int fspeedX;
int fspeedY;
int bspeedX;
int bspeedY; 

void setup() {
  pinMode(DirX1, OUTPUT);
  pinMode(DirX2, OUTPUT);  
  pinMode(DirY1, OUTPUT);
  pinMode(DirY2, OUTPUT);
  pinMode(speedXPin, OUTPUT); 
  pinMode(speedYPin, OUTPUT); 
}
void loop() { 
   
  joyX = analogRead(joyXPin);
  if (joyX >= 480 && joyX <= 510)
  {
    stopX();
  }
  if (joyX < 480)
  {
    fspeedX = map(joyX, 479, 0, 10, 255);
    forwardX(fspeedX);
  }
  if (joyX > 510)
  {
    bspeedX = map(joyX, 509, 1023, 10, 255);
    backwardX(bspeedX);
  }  
  joyY = analogRead(joyYPin);
  if (joyY >= 480 && joyY <= 510)
  {
    stopY();
  }
  if (joyY < 480)
  {
    fspeedY = map(joyY, 479, 0, 10, 255);
    forwardY(fspeedY);
  }
  if (joyY > 510)
  {
    bspeedY = map(joyY, 509, 1023, 10, 255);
    backwardY(bspeedY);
  }  
}
void stopX()   
{
  analogWrite(speedXPin, 0);
}
void stopY()   
{
  analogWrite(speedYPin, 0);  
}
void forwardX(int fspeedX)
{
  digitalWrite(DirX1, HIGH);
  digitalWrite(DirX2, LOW);  
  analogWrite(speedXPin, fspeedX); 
}
void forwardY(int fspeedY)
{
  digitalWrite(DirY1, HIGH);
  digitalWrite(DirY2, LOW);  
  analogWrite(speedYPin, fspeedY);
}
void backwardX(int bspeedX)
{
  digitalWrite(DirX1, LOW);
  digitalWrite(DirX2, HIGH);   
  analogWrite(speedXPin, bspeedX); 
}
void backwardY(int bspeedY)
{
  digitalWrite(DirY1, LOW);
  digitalWrite(DirY2, HIGH);  
  analogWrite(speedYPin, bspeedY); 
}

упс, не внимательно прочитал - мотор то не кол-ный, пардон

apassirob
Offline
Зарегистрирован: 06.01.2014

Спосибки огромное

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

vvadim пишет:
упс, не внимательно прочитал - мотор то не кол-ный, пардон

Однако если через регулятор скорости рулить, то совершенно ни какой разницы нет какой там будет двигатель. разница только  конструкции самого регулятора.

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

Для модельных регулей, что коллекторных, что безколлекторных нужно только один выход - ШИМ ))

apassirob
Offline
Зарегистрирован: 06.01.2014

Да это так....

может примерчик поткините ?

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

apassirob пишет:

Да это так....

может примерчик поткините ?

Дак ведь в 23# сообщении примерчик и есть.

Выходы

Серво 1(Пин9) это будет мотор 1

Серво 2 (Пин 10) будет мотор 2

Входы

Пин 3 Это вход от потенциометра "ГАЗ"

Пин 4 будет Вход от потенциометра руля.

   

Используем библиотеку Servo сигнал управления сервами или регулями двигателей совершенно одинаковый  стандарт сигнал ШИМ (PWM)

 

Для управления тебе нужно будет определиться с нейтральной позицией руля. - прямо это середина всего диаппазона. просто для вычисления желаемого результата, можно для начала сделать совсем по простому алгоритму, считал оба потенциометра Газ и Руль и дальше отправляешь моторам

для первого М1=Газ+К*Руль, 

для второго М2=Газ-К*Руль

а коэффициэнтом пересчета К регулируешь чувствительность всего микса к шевелению рулем...

 

 

apassirob
Offline
Зарегистрирован: 06.01.2014

Probelzaelo пишет:

apassirob пишет:

Да это так....

может примерчик поткините ?

Дак ведь в 23# сообщении примерчик и есть.

Выходы

Серво 1(Пин9) это будет мотор 1

Серво 2 (Пин 10) будет мотор 2

Входы

Пин 3 Это вход от потенциометра "ГАЗ"

Пин 4 будет Вход от потенциометра руля.

   

Используем библиотеку Servo сигнал управления сервами или регулями двигателей совершенно одинаковый  стандарт сигнал ШИМ (PWM)

 

Для управления тебе нужно будет определиться с нейтральной позицией руля. - прямо это середина всего диаппазона. просто для вычисления желаемого результата, можно для начала сделать совсем по простому алгоритму, считал оба потенциометра Газ и Руль и дальше отправляешь моторам

для первого М1=Газ+К*Руль, 

для второго М2=Газ-К*Руль

а коэффициэнтом пересчета К регулируешь чувствительность всего микса к шевелению рулем...

 

 

Вот спасибо! Это уже похоже! На выходных попробую и отпишусь.

apassirob
Offline
Зарегистрирован: 06.01.2014

мда..... как всё....................................

В общем никак... сам никак нужна всётаки помощь.попробую описать что к чему.

к АРДУНИНЕ МЕГА на аналоговые пины 0 и 1 потключены потенциометры джойстика.

к pwm пинам 9 и 10 потключены моторы.(точнее говоря их регуляторы скорости.) Заострю внимание что моторы реверсные(тоесть:когда потенциометры находиться в диопозоне от 124 до132 ( а диопазон от 0-255) тоесть по центру то оба мотора молчат.)

И так имеем мы две оси Y (движение джойстика в перёдм шим ростёт от 128 -255) и (назад, шим падает от 128-0)

X (движение джойстика в лево шим падает от 128-0 и вправо шим ростёт от 128-255).

Идея такова: хочиться миксовать сигналы шим, тоесть : при подаче джойстика в перёд тоесть по оси Y ( оба pwm пина выдают рост шим импульса от128-255 ну и назад конечно от 128-0)

при подаче  джойстика в лево тоесть  по оси Х(при этом ось Y находиться в среднем положении около 128) левый мотор  (pwm пин 9)  шим импульс падаетот 128-0  а правый мотоор (pwm пин 10)  шим импульс ростёт от 128-255.

при подаче джойстика в право всё наоборот.

Теперь самое интерестное :-) Говорю сразу в этом деле я делетант поэтому сильно не смейтесь :-)

Вот что у меня покачто получилось:

#include <Servo.h>    //библиотека
Servo KAMServa;       
int YsensePin =4;     // ось Y правого джойстика к пину А0
int XsensePin =5;     // ось X правого джойстика к пину А1
int KAMsensePin =2;   // серва камеры к пину А2
int MRkanalPin = 9;   // Какнал правого мотора к пину пвм9
int MLkanalPin = 10;  // Канал левого мотора  к пину  пвм10
 
void setup()
  pinMode(MRkanalPin, OUTPUT); // Правый двигатель
  pinMode(MLkanalPin, OUTPUT); // Левый двигатель
  KAMServa.attach(4);          
  Serial.begin(9600);
}
 
 
void loop()
{  
  // ОСЬ Y
  int Y = analogRead(YsensePin);               
  Y = constrain(Y, 0, 1023);                   
  int y = map(Y, 0, 1023, 0,255);
   if (y<92)                         
  y= 93;                              
   
   //ОСЬ Х
  int X = analogRead(XsensePin);                
  X = constrain(X, 0, 1023);                    
  int x = map(X, 0, 1023, 0,255);     
  if (x<92)                           
  x= 93;                              
  if(y>=132 || y<=124)
  {
    x=y;
  }
  
    analogWrite(MRkanalPin, y);       
    analogWrite(MLkanalPin, x);       
    
    // МОНИТОРИНГ
      Serial.println();
      
      Serial.print("Y");
      Serial.print(":");
      Serial.print(y);
      Serial.print(",");
      Serial.print("X");
      Serial.print(":");
      Serial.print(x);
      Serial.print(",");
      Serial.print("KAM");
      Serial.println(analogRead(KAMsensePin));
      Serial.print(":");
      delay(200);
       
 
  
     // УПРАВЛЕНИЕ СЕРВОЙ
      
  int serv = analogRead(KAMsensePin);          // читаем потенциометр Кам Сервы
  serv = constrain(serv,230 ,699);             // устанавливаем диопозон серв
  int motorAngl = map(serv,699, 230, 180,0);   // выводим шим сигнал на пин Кам Сервы
   KAMServa.write(motorAngl);
  
}
 
И могу ли я чтото сделать вот с этим?
если да то подмогите.( на всяк случай это не моё) :-)
 
#include <math.h>
#include <Servo.h>
 
int Chan1Interrupt = 0; // pin 2
int Chan2Interrupt = 1; // pin 3
 
unsigned long Chan1_startPulse, Chan2_startPulse;
volatile double Chan1_val, Chan2_val;
volatile double Chan1_val_last, Chan2_val_last;
long StartMillis=0;
long FrameCounter=0;
 
Servo ServoArray[2]; 
 
void serviceServos()
{
  ServoArray[0].writeMicroseconds(Chan1_val);
  ServoArray[1].writeMicroseconds(Chan2_val);
}
 
void setup()
{
  attachInterrupt(Chan1Interrupt, Chan1_begin, RISING);
  attachInterrupt(Chan2Interrupt, Chan2_begin, RISING);
         
  for (uint8_t i=0;i<2;i++)
    ServoArray[i].attach(22+i, 700, 2300);
 
  StartMillis = millis();
}
 
void loop()
  long LocalMillis;
  long LocalFrameCounter;
  LocalMillis = millis();
  LocalFrameCounter = (LocalMillis - StartMillis) / 20;
 
  if (LocalFrameCounter > FrameCounter) 
  {
    FrameCounter = LocalFrameCounter;
    serviceServos();
  }
}
 
void Chan1_begin()           // enter Chan1_begin when interrupt pin goes HIGH.
        {
          Chan1_startPulse = micros();     // record microseconds() value as Chan1_startPulse
          detachInterrupt(Chan1Interrupt);  // after recording the value, detach the interrupt from Chan1_begin
          attachInterrupt(Chan1Interrupt, Chan1_end, FALLING); // re-attach the interrupt as Chan1_end, so we can record the value when it goes low
        }
 
void Chan1_end() 
        {
         Chan1_val = micros() - Chan1_startPulse;  // when interrupt pin goes LOW, record the total pulse length by subtracting previous start value from current micros() vlaue. 
         detachInterrupt(Chan1Interrupt);  // detach and get ready to go HIGH again
         attachInterrupt(Chan1Interrupt, Chan1_begin, RISING);
         if (Chan1_val < 1000 || Chan1_val > 2000) { Chan1_val = Chan1_val_last;}
         else {Chan1_val_last = Chan1_val;}
        }
 
void Chan2_begin()           // enter Chan2_begin when interrupt pin goes HIGH.
        {
          Chan2_startPulse = micros();     // record microseconds() value as Chan2_startPulse
          detachInterrupt(Chan2Interrupt);  // after recording the value, detach the interrupt from Chan2_begin
          attachInterrupt(Chan2Interrupt, Chan2_end, FALLING); // re-attach the interrupt as Chan2_end, so we can record the value when it goes low
        }
 
void Chan2_end() 
        {
         Chan2_val = micros() - Chan2_startPulse;  // when interrupt pin goes LOW, record the total pulse length by subtracting previous start value from current micros() vlaue. 
         detachInterrupt(Chan2Interrupt);  // detach and get ready to go HIGH again
         attachInterrupt(Chan2Interrupt, Chan2_begin, RISING);
         if (Chan2_val < 1000 || Chan2_val > 2000) { Chan2_val = Chan2_val_last;}
         else {Chan2_val_last = Chan2_val;}
        }

 

Pnewmoslon
Offline
Зарегистрирован: 26.07.2014

Ребята, доброго времени суток. 

спешу всем Вам выразить огромную благодарность за поддержку начинающих " програмистов". Без Вас нам было бы крайне сложно прогрызать тугой гранит данной науки)). да да. данное заявление выводит меня на чистую воду- я в данной теме полный профан(. Но с самого детства стремился и тихой сапой шел к этому делу, вот по случаю и приобрел " дуинку уно. 

Теперь перейду к сути вопроса; у меня есть старенькая ваз 2109 (2001 г.в.), так вот: как многим известно, данный вид россавтопрома крайне плохо заводится без подсоса в холодное время года. цель- вместо тросика подсоса- серва; на корбюраторе.

коррекция оборотов по заданному алгоритму посредством термодатчика(штатный с подтяжкой через 10 к резистор к плюсу авто)  и датчика холла(на маховике).

исходя из выше сказанного делаем вывод: обороты регулируются в определенном инетрвале гистерезис около 150об\м( дабы серва не находилась в постоянном напряжении и тем самым демпфировать разнос всей системы)

имеется прямая и линейная зависимость проворота сервы от температуры и оборотов,.

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

после того как двигатель заведен датчик холла отслеживает обороты и приводит в движение ту же самую серву для коррекции оборотов на уровне 2500об\м на 2 секунды, после чего приоткрывая заслонку устанавливает обороты на уровне 1500об\м.

при прогреве двигателя до температуры 60С система приоткрывает заслонку еще больше приводя обороты в 1000об\м .

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

Вот в принципе и вся тема. так вот ребята, мре нужна ваша помощь в совмещении двух разносигнальных датчиков( цифра и аналог) холл - цифра. и самое главное- всего скорее в данной теме без тех самы страшных ПИДов не обойтись, поскольку нужно по максимуму исключить рыскание сервы и всей системы в целом. заранее всем спасибо, жду ваших отзывав здесь и в личке gav707090@yandex.ru   буду рад любой помощи, и ценному совету и готовому скетчу поскольку обучение мне дается крайне туго, даже джереми блюм утер пот со своего лба пытаясь меня научить крутить шаговый)))

vvadim
Offline
Зарегистрирован: 23.05.2012

Pnewmoslon, создайте свою тему - будет больший эффект.

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Жёваный крот..

Pnewmoslon
Offline
Зарегистрирован: 26.07.2014

спасибо vvadim за ценный совет, но думаю мало кому будет интересно сидеть в форуме на котором кроме моих просьб о помощи не будет ничего толкового.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Pnewmoslon пишет:

спасибо vvadim за ценный совет, но думаю мало кому будет интересно сидеть в форуме на котором кроме моих просьб о помощи не будет ничего толкового.


Считаете свою просьбу толковой? Нюню

Pnewmoslon
Offline
Зарегистрирован: 26.07.2014

Puhlyaviy вы желаете это оспорить?

vvadim
Offline
Зарегистрирован: 23.05.2012

Pnewmoslon пишет:

спасибо vvadim за ценный совет, но думаю мало кому будет интересно сидеть в форуме на котором кроме моих просьб о помощи не будет ничего толкового.

Ну здесь каждый может найти для себя толковые ответы, получить помощь или дать толковый ответ, кто что умеет и знает.

А если хочется получить помощь, то однозначно надо создать свою темы, в чужой тебя не видно.

Но хозяин барин.

И ещё - на форуме есть десяток спецов, которые оказывают БЕЗВОЗМЕЗДНО РЕАЛЬНУЮ помощь. Поэтому задавая вопросы лучше ни с кем не грызться. 

Pnewmoslon
Offline
Зарегистрирован: 26.07.2014

Возможно мои слова показались кому то грубыми, но смею Вас уверить- грызться , я не желаю ни с кем. тем более с теми у кого прошу помощи)) и все же спасибо, как Вы уже , я думаю увидели новую тему созданную мной. это совет принятый ко вниманию)

leshak
Offline
Зарегистрирован: 29.09.2011

Pnewmoslon пишет:

Возможно мои слова показались кому то грубыми, но смею Вас уверить- грызться , я не желаю ни с кем. тем более с теми у кого прошу помощи)) и все же спасибо, как Вы уже , я думаю увидели новую тему созданную мной. это совет принятый ко вниманию)

Да игнорят не из-за того что тема "старая/новая". А из-за того что (обычные причины, не обязательно все к вам относятся):
1. Не внятно описано что хочу, что получается... вообщем "телепаты нужны"
2. Куча "хочу" и никаких попыток что-то сделать и разобраться самому (вообщем "сделайте за меня" замаскированное под "помогите новичку").
3. Попытка сразу строить "космический аппарат" не освоив азов. Не разбирая большу задачи на мелкие "подзадачки" (которым кстати найти решение в прошлых обсуждениях гораздо вероятней).
4. Вопрос поднимается раз в неделю. И уже 15-ть раз обгрызен со всех сторон. Уже тупо никому не интерестно.
5. Топик-стартер не трудиться нормально назвать тему, нормально оформить код.... (вот скажем сообщение #30 - я такое проматываю не глядя, кому оно нужней? мне или вопрошающему?  "у нас не принято что-бы хлеб за брюхом ходил").

Pnewmoslon
Offline
Зарегистрирован: 26.07.2014

что касается моих попыток разобраться самому, не совсем верно. все или почти все что предлагает примерная база дуино, пробовал писать и заливать. но все же есть некоторые нюансы в которых я реально запутался (привязка сервы к двум датчикам цифра и аналог), я тупо не знаю как это делается. и нигде я не нашёл подобного примера. от того я и забрел на ваш форум в поисках подсказки , но никак не для того чтоб скушать чей либо хлебушек.

apassirob
Offline
Зарегистрирован: 06.01.2014
garag.75
Offline
Зарегистрирован: 22.12.2014

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

botasan
Offline
Зарегистрирован: 24.08.2016

Доброго времени суток всем.

Подскажите пожалуйста как изменить код что бы от такого датчика света

запускать серву Servo SG90.

Суть такова есть помещение и нужно с заходом солнца включить серву на несколько оборотов ( открывает форточку) с восходом наоборот (закрывает). У Вас почти такая схема помогите с кодом. По отдельности работает а связать в кучю не выходит. Ардуина уно, питание будет отдельное у сервы.

ToRcH2565
Offline
Зарегистрирован: 16.05.2015

botasan пишет:

Доброго времени суток всем.

Подскажите пожалуйста как изменить код что бы от такого датчика света

запускать серву Servo SG90.

Суть такова есть помещение и нужно с заходом солнца включить серву на несколько оборотов ( открывает форточку) с восходом наоборот (закрывает). У Вас почти такая схема помогите с кодом. По отдельности работает а связать в кучю не выходит. Ардуина уно, питание будет отдельное у сервы.

 

Вам с таким вопросом в раздел "ищу исполнителя".

luch
Offline
Зарегистрирован: 22.01.2017

Dikon  какая библиотека здесь использована? Просто я попробываль ваш скетч, серво толко дребежит и все. Зарание спс за ответ  

evgeniy1771
Offline
Зарегистрирован: 28.11.2016

не проходит проверку скетч с 18В20

Александр72
Offline
Зарегистрирован: 16.11.2015

Приветствую гуру программирования! Искал и нашёл то, что надо )) Спасибо автору сообщения и скетча. Даже видео записал на радостях как работает :) Получилось практически с первого раза запустить сервочку. Но возник вопрос... Может не по адресу... Можно ли этот скетч как-то залить в нечто менее громоздкое в смысле ресурсов нежели ардуино? Как? Может есть смысл попытаться создать свою ардуино (купил когда-то атмегу 8) и туда залить или не стОит городить огород? 

Самопроизвольное подёргивание можно как-то убрать?

 

Спасибо. Извиняйте если что не туда и не так.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Александр72 пишет:

Самопроизвольное подёргивание можно как-то убрать?

Видите ли, разработчики библиотеки считают, что самопроизвольное подергивание - это фича, а не бага.

В принципе, подергивание можно существенно уменьшить, а то и совсем избавиться, если применить высококачественные дорогостоящие сервы.

Другой вариант - вообще избавиться от библиотеки и самому подавать команды на серво. Подергиваний не будет, но не будет и удержания серв в установленных позициях. Собственно, подергтвания - прямое следствие попытки удержания сервы на месте при невысокой точности позиционирования. 

Александр72
Offline
Зарегистрирован: 16.11.2015

Я понял. Спасибо. В общем было довольно приличное дёргание, но оно практически пропало, когда я занизил "крайние границы" срабатывания фоторезистора. Ещё здесь тему нашел, но пока не понял сути, там в скетче идёт после выполнения команда отключения сервы (там она myservog.detach(); а "у нас" вероятно motor.detach();), тогда она не дёргается. Возможно попробую имплантировать этот кусочек кода, если пойму или методом тыка подберу место для этой строки.

Единственно, пока не понял (т.к. первый раз вообще столкнулся), как правильно старт сервы прописать, чтобы она при включении питания не ехала "туда/сюда". В общем поле для экспериментов не паханное ))

Tango
Offline
Зарегистрирован: 05.03.2017

botasan пишет:

Доброго времени суток всем.

Подскажите пожалуйста как изменить код что бы от такого датчика света....

запускать серву Servo SG90.

Суть такова есть помещение и нужно с заходом солнца включить серву на несколько оборотов ( открывает форточку) с восходом наоборот (закрывает). У Вас почти такая схема помогите с кодом. По отдельности работает а связать в кучю не выходит. Ардуина уно, питание будет отдельное у сервы.

Попробуй вот это...

void setup() {
  Serial.begin(9600); // Скорость работы монитора порта 
  pinMode(22, INPUT); // Инициализируем цифровой pin 22 как вход 
}

void loop() {
  int sensorValue = digitalRead(22); // Задаем переменную sensorValue для считывания состояния 
  Serial.println(sensorValue, DEC); // Выводим состояние датчика в порт
  delay(1000); // Ждем секунду
}