как програмно инвертировать потенциометр ?

logicsigma
Offline
Зарегистрирован: 29.04.2017
//********************************************************
#define SW1 2
#define SW2 3
volatile byte flag0 = LOW; // declare IRQ flag
volatile byte flag1 = LOW; // declare IRQ flag
 
int DIR = 8;
int STEP = 4;
int SLP = 12;
int MS3 = 7;
int MS2 = 6;
int MS1 = 5;
int ENABLE = 11;
int SWDIR = 9;
int sensorPin = A0;
int sensorValue = 0;
boolean mode = false;
int state = 1;
int calibration = 0;
int SW1_state = digitalRead(SW1);
int SW2_state = digitalRead(SW2);
int time_del = 0;
 
// *******************************************************
void setup()
{
  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);
  pinMode(A4, OUTPUT);
  pinMode(DIR, OUTPUT);
  pinMode(STEP, OUTPUT);
  pinMode(ENABLE, OUTPUT);
  pinMode(SLP, OUTPUT);
  pinMode(MS1, OUTPUT);
  pinMode(MS2, OUTPUT);
  pinMode(MS3, OUTPUT);
  pinMode(SW1, INPUT);
  pinMode(SW2, INPUT);
  pinMode(SWDIR, INPUT);
 
  if (digitalRead(SWDIR) == HIGH) {
    mode = true;
  }
 
  if ((SW1_state == HIGH) && (SW2_state == LOW)) {
    state = 0;
  }
 
  if ((SW1_state == LOW) && (SW2_state == HIGH)) {
    state = 1;
  }
 
  digitalWrite(SLP, HIGH);
  digitalWrite(ENABLE, LOW);
  digitalWrite(MS1, HIGH);
  digitalWrite(MS2, HIGH);
  digitalWrite(MS3, HIGH);
  attachInterrupt(0, ISR0, FALLING);
  attachInterrupt(1, ISR1, FALLING);
}
//********************************************************
void loop()
{
  if (mode == true)
  { // if switch is up
    switch (state)
    {
      case 0:   // HOME
        sensorValue = analogRead(sensorPin);
        digitalWrite(DIR, HIGH);
        digitalWrite(STEP, HIGH);
        delayMicroseconds((sensorValue * 10) + 5);
        digitalWrite(STEP, LOW);
        delayMicroseconds((sensorValue * 10) + 5);
        break;
      case 1:   // AWAY
        sensorValue = analogRead(sensorPin);
        digitalWrite(DIR, LOW);
        digitalWrite(STEP, HIGH);
        delayMicroseconds((sensorValue * 10) + 5);
        digitalWrite(STEP, LOW);
        delayMicroseconds((sensorValue * 10) + 5);
        break;
    }
  }
  if (mode == false)
  { //if switch is down
    calibration = 0;
    noInterrupts();
    SW1_state = digitalRead(SW1);
    if(SW1_state == HIGH){
    while (SW1_state == HIGH)
    {
      digitalWrite(DIR, HIGH); // return home
      digitalWrite(STEP, HIGH);
      delayMicroseconds(80);
      digitalWrite(STEP, LOW);
      delayMicroseconds(80);
      SW1_state = digitalRead(SW1);
    }
       
    }
    interrupts();
    //trigger camera here first
    for (int frame_count = 1; frame_count < 360; frame_count++) // the slider is split into 360 posistion which equates to 15 seconds of footage played at 24 fps
    {
      for (int steps = 0; steps < 40; steps++)
      {
        if(calibration == 0)
        {
        digitalWrite(DIR, LOW); //move away from home
        digitalWrite(STEP, HIGH);
        delayMicroseconds(80);
        digitalWrite(STEP, LOW);
        delayMicroseconds(80);
        }
        else
        {
         return; 
        }
      }
      digitalWrite(A4,HIGH);
      delay(180);
      digitalWrite(A4,LOW);
      time_del = analogRead(sensorPin);
      onesec(time_del);
            //trigger camera for all other shots here, to reduce camera shake
 
    }
  }
 
}
void onesec(int val)
{
  for(int cycle = 0 ;cycle <val;cycle++)
  {
  delay(100);
  }
}  
 
//********************************************************
void ISR0()  //HOME
{
  state = 1;
  calibration = 1;
}
//********************************************************
void ISR1()  //AWAY
{
  state = 0;
  calibration = 1;
}
//********************************************************
Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014
bwn
Offline
Зарегистрирован: 25.08.2014

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

logicsigma
Offline
Зарегистрирован: 29.04.2017
//********************************************************
#define SW1 2
#define SW2 3
volatile byte flag0 = LOW; // declare IRQ flag
volatile byte flag1 = LOW; // declare IRQ flag

int DIR = 8;
int STEP = 4;
int SLP = 12;
int MS3 = 7;
int MS2 = 6;
int MS1 = 5;
int ENABLE = 11;
int SWDIR = 9;
int sensorPin = A0;
int sensorValue = 0;
boolean mode = false;
int state = 1;
int calibration = 0;
int SW1_state = digitalRead(SW1);
int SW2_state = digitalRead(SW2);
int time_del = 0;

// *******************************************************
void setup()
{
  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);
  pinMode(A4, OUTPUT);
  pinMode(DIR, OUTPUT);
  pinMode(STEP, OUTPUT);
  pinMode(ENABLE, OUTPUT);
  pinMode(SLP, OUTPUT);
  pinMode(MS1, OUTPUT);
  pinMode(MS2, OUTPUT);
  pinMode(MS3, OUTPUT);
  pinMode(SW1, INPUT);
  pinMode(SW2, INPUT);
  pinMode(SWDIR, INPUT);

  if (digitalRead(SWDIR) == HIGH) {
    mode = true;
  }

  if ((SW1_state == HIGH) && (SW2_state == LOW)) {
    state = 0;
  }

  if ((SW1_state == LOW) && (SW2_state == HIGH)) {
    state = 1;
  }

  digitalWrite(SLP, HIGH);
  digitalWrite(ENABLE, LOW);
  digitalWrite(MS1, HIGH);
  digitalWrite(MS2, HIGH);
  digitalWrite(MS3, HIGH);
  attachInterrupt(0, ISR0, FALLING);
  attachInterrupt(1, ISR1, FALLING);
}
//********************************************************
void loop()
{
  if (mode == true)
  { // if switch is up
    switch (state)
    {
      case 0:   // HOME
        sensorValue = analogRead(sensorPin);
        digitalWrite(DIR, HIGH);
        digitalWrite(STEP, HIGH);
        delayMicroseconds((sensorValue * 10) + 5);
        digitalWrite(STEP, LOW);
        delayMicroseconds((sensorValue * 10) + 5);
        break;
      case 1:   // AWAY
        sensorValue = analogRead(sensorPin);
        digitalWrite(DIR, LOW);
        digitalWrite(STEP, HIGH);
        delayMicroseconds((sensorValue * 10) + 5);
        digitalWrite(STEP, LOW);
        delayMicroseconds((sensorValue * 10) + 5);
        break;
    }
  }
  if (mode == false)
  { //if switch is down
    calibration = 0;
    noInterrupts();
    SW1_state = digitalRead(SW1);
    if(SW1_state == HIGH){
    while (SW1_state == HIGH)
    {
      digitalWrite(DIR, HIGH); // return home
      digitalWrite(STEP, HIGH);
      delayMicroseconds(80);
      digitalWrite(STEP, LOW);
      delayMicroseconds(80);
      SW1_state = digitalRead(SW1);
    }
       
    }
    interrupts();
    //trigger camera here first
    for (int frame_count = 1; frame_count < 360; frame_count++) // the slider is split into 360 posistion which equates to 15 seconds of footage played at 24 fps
    {
      for (int steps = 0; steps < 40; steps++)
      {
        if(calibration == 0)
        {
        digitalWrite(DIR, LOW); //move away from home
        digitalWrite(STEP, HIGH);
        delayMicroseconds(80);
        digitalWrite(STEP, LOW);
        delayMicroseconds(80);
        }
        else
        {
         return; 
        }
      }
      digitalWrite(A4,HIGH);
      delay(180);
      digitalWrite(A4,LOW);
      time_del = analogRead(sensorPin);
      onesec(time_del);
            //trigger camera for all other shots here, to reduce camera shake

    }
  }

}
void onesec(int val)
{
  for(int cycle = 0 ;cycle <val;cycle++)
  {
  delay(100);
  }
}  

//********************************************************
void ISR0()  //HOME
{
  state = 1;
  calibration = 1;
}
//********************************************************
void ISR1()  //AWAY
{
  state = 0;
  calibration = 1;
}
//********************************************************

 

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

Имеется кусок кода, без всяких комменатирев и поснений. И чо? Потрудитесь внятно описать:

1. Что Вы хотели сделать?
2. Что получилось?
3. Чем (1) отличается от (2)?
4. Каковы конкретные вопросы, на которые Вы ждёте ответов?

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

Не дублируйте темы. Я удалил новую. Пишите здесь.

logicsigma
Offline
Зарегистрирован: 29.04.2017

нужно изменить код (инвертировать работу потенциометра наоборот) чтобы ручка вращалась наоборот, чтобы не резать дорожки на плате +5v і GND

arduinec
Offline
Зарегистрирован: 01.09.2015

logicsigma пишет:

нужно изменить код (инвертировать работу потенциометра наоборот) чтобы ручка вращалась наоборот, чтобы не резать дорожки на плате +5v і GND

sensorValue = 1023 - analogRead(sensorPin);

logicsigma
Offline
Зарегистрирован: 29.04.2017

Большое Вам спасибо! Получилось !

logicsigma
Offline
Зарегистрирован: 29.04.2017

а как отрегулировать равномерность вращения ?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Потанцометр взять с линейной зависимостью

logicsigma
Offline
Зарегистрирован: 29.04.2017

линейный также нужно програмно регулировать

sadman41
Offline
Зарегистрирован: 19.10.2016

Што значит "отрегулировать равномерность вращения"?

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

logicsigma, равномерность вращения нужно не регулировать, а обеспечивать.

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

logicsigma
Offline
Зарегистрирован: 29.04.2017

почти вся область регулировки вращения мотора происходит в диапазоне 60-80%

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

Тогда дело в потенциометре - меняйте на другой, с линейной характеристикой.

gfx125
Offline
Зарегистрирован: 27.05.2017

logicsigma пишет:

почти вся область регулировки вращения мотора происходит в диапазоне 60-80%

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

 

 

 

logicsigma
Offline
Зарегистрирован: 29.04.2017

нужно програмно значения analogRead

sadman41
Offline
Зарегистрирован: 19.10.2016

Думаете, что всем понятно, что такое "программно значения analogread"? Если вам некогда объяснять, что вам нужно - наврядли у кого-то найдется время додумывать вашу задачу.

nik182
Offline
Зарегистрирован: 04.05.2015

Есть функция map. На входе существующие значения, на выходе нужные.

logicsigma
Offline
Зарегистрирован: 29.04.2017

вот ету функцию map мне нужно вписать в мой код, а значения я уже сам подберу

gfx125
Offline
Зарегистрирован: 27.05.2017

ну вписывай, кто ж мешает

 

logicsigma
Offline
Зарегистрирован: 29.04.2017

знал бы я куда вписать без ошибки, я бы не задавал вопросов на етом форуме

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Дорогой, а ты, по жизни, чем занимаешься?

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

logicsigma пишет:

знал бы я куда вписать без ошибки, я бы не задавал вопросов на етом форуме

Почитайте, подумайте, попробуйте. Через неделю, с двадцатой попытки всё получится, и впредь знать будете.

А если за Вас впишут, то всёдо следующей необходимости вписать - опять будет "памагити!".

logicsigma
Offline
Зарегистрирован: 29.04.2017

спасибо, почитаю, подумаю, попробую.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

logicsigma пишет:

почти вся область регулировки вращения мотора происходит в диапазоне 60-80%

andriano пишет:

Тогда дело в потенциометре - меняйте на другой, с линейной характеристикой.

Меняйте потенциометр на цепочку:
Резистор 60 килоОм,
потенциометр 20 килоОм,
резистор 20 килоОм

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

trembo пишет:
andriano пишет:

Тогда дело в потенциометре - меняйте на другой, с линейной характеристикой.

Меняйте потенциометр на цепочку: Резистор 60 килоОм, потенциометр 20 килоОм, резистор 20 килоОм
Сильно подозреваю, что процентов по 10-20 с каждой стороны приходится либо на зону, в которую потенциометр просто механически не доворачивается, либо центральный контакт скользит не по резиситвному элементу, а по крайнему контакту (т.е.без изменения показаний).

Ну и, кроме того, если при нормальной шкале на весь диапазон должно приходиться 1024 градаций уровня (примерно 250 уровней достоверно), то после предложенной "модернизации" останется лишь порядка 200 градаций (около 50 достоверно). Будет хорошо, если этого окажется достаточно. В противном случае - все равно дучше заменить потенциометр.

 

PS. Номинала в 60 кОм не существует, ближайший 62. Да и потенциометр на 20 - большая редкость, обычно 22. В последнем случае номинал постоянного 68.

logicsigma
Offline
Зарегистрирован: 29.04.2017

потенциометр исправный, просто с 0-60% регулировка двигателя незначительная, но есть. И от 80-100% немножко есть но также незначительно

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

logicsigma пишет:

потенциометр исправный, просто с 0-60% регулировка двигателя незначительная, но есть. И от 80-100% немножко есть но также незначительно

Круто!

Откуда-то в 28-м посте темы вдруг появился двигатель.

sadman41
Offline
Зарегистрирован: 19.10.2016

Так у него там степ-дир крутится извращенским способом.

logicsigma
Offline
Зарегистрирован: 29.04.2017

тогда может как-то шаговик можна отрегулировать ?

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

andriano пишет:
Откуда-то в 28-м посте темы вдруг появился двигатель.
Ну это же индийское кино. Двигатель ну очень далекий предок переменного резистора. Не верите. Ну просто родство далеко. И там и там есть вращение вокруг оси.

 А по теме. Так как и современные сценаристы кино "так видят". Вот и выходит что мы наблюдаем "альтернативное программирование", где логарифмы и метод косочно-линейной апроксимации остались за бортом.

Гриша
Offline
Зарегистрирован: 27.04.2014

2 all helpers, не стоит в песочнице стебаться, ну взял ТС чужой код, ну не понимает он. Таки попросите его прокомментировать каждую строку кода, глядишь, поможет... :)

logicsigma, можно сделать все (ну или почти все) главное - Кто это будет делать?!!! Форумчане (завсегдатаи) в болинстве своем умеют и знают многое, и помогают - если это вообще возможно.

вот и потрудитесь написать коментарии к алгоритму работы вашего скетча, а там и вопросы отпадут (бОльшая их часть) ИМХО

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

В школе математику учил?

Напиши нужную формулу для переменной в зависимости от угла поворота потенциометра. Хоть квадратичную, хоть логарифмическую. Потом фунуцией map смасштабируй обратно в диапазон   (0 - 1023). Если совсем начинающий - введи дополнительную переменную для простоты. Всего две строчки кода изменить надо.

Я тоже начинающий. Мне сын 23 ноября 2018 года подарил Uno 3 набор на 33-летие сватьбы.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Бувает, чо...

Паэтому ты навсякий случай 7 октября зарегистрировалса.

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

DetSimen пишет:

Бувает, чо...

Паэтому ты навсякий случай 7 октября зарегистрировалса.

Не на всяуий случай. Сын мне все уши прожужжал, какой интересный этот Ардуино. Вот и посмотрел.

Кстате - самый правильный сайт для начинающих. Всегда посылают ... к нужной книжке.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Иногда - к нужной матери. И праильна делают. Читать не всякий умеет. 

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

Муж_Долговой пишет:

Всегда посылают ...

Что да, то да. И всегда исключительно из добрых побуждений!