индикация процентовки на lsd скорости вращения DC коллекторного двигла.Нужна помощь

alex72
alex72 аватар
Offline
Зарегистрирован: 08.03.2018

   Подскажите начинающему как можно изменить переменное значения по выходу 11 на от 0 до 255(0-4.5v)

#include <TimerOne.h>

#include <LiquidCrystal.h>
// buttons code
#define btnRIGHT 0
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5
 
// directions
#define FORWARD HIGH
#define BACKWARD LOW
 
// debounce time (milliseconds)
#define DEBOUNCE_TIME 90//скорость переключения повышения.понижения значений
 
// PINs for Pololu controller
#define PIN_STEP 11
#define PIN_DIR 13
 
// lookup table speed - ticks (interrupts)
const int speed_ticks[] = {0, 600, 300, 200, 150, 120, 100, 86, 75, 67, 60, 55, 50, 46, 43};
 
// global variables
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
 
int actual_speed;
int actual_direction;
 
int ticks;
int tick_count;
 
int button;
boolean debounce;
unsigned long previous_time;
 
// custom LCD square symbol for progress bar
byte square_symbol[8] = {
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
};
 
// string constants
char forward_arrow[] = "->";
char backward_arrow[] = "<-";
 
void setup() {
 
  // init the timer1, interrupt every 0.1ms
  Timer1.initialize(90);
  Timer1.attachInterrupt(timerIsr);
  
  // init LCD and custom symbol
  lcd.begin(20, 4);
  lcd.setCursor(0,0);
  lcd.createChar(0, square_symbol);
  
  // pins direction
  pinMode(PIN_STEP, OUTPUT);
  pinMode(PIN_DIR, OUTPUT);
  
  // initial values
  actual_speed = 0;
  actual_direction = FORWARD;
  tick_count = 0;
  ticks = 1;
  debounce = false;
 
  digitalWrite(PIN_DIR, actual_direction);
  updateLCD();
}
  
void loop() {
  
  // check if debounce active
  if(debounce) {
    button = btnNONE;
    if(millis() - previous_time >   DEBOUNCE_TIME) debounce = false;
  } else button = read_buttons();
  
  // if a button is pressed, start debounce time
  if(button != btnNONE) {
    
    previous_time = millis();
    debounce = true;
  }
    
  // check which button was pressed
  switch(button) {
    
    case btnUP:
      increase_speed();
      break;
    case btnDOWN:
      decrease_speed();
      break;
    case btnLEFT:
      change_direction(BACKWARD);
      break;
    case btnRIGHT:
      change_direction(FORWARD);
      break;
    case btnSELECT:
      emergency_stop();
      break;
  }
  
  // finally update the LCD
  updateLCD();
}
 
// increase speed if it's below the max (100)//OTSCHET OT 0+
void increase_speed() {
  
  if(actual_speed < 100) {
    actual_speed += 1;//делитель
    tick_count = 0;
    ticks = speed_ticks[actual_speed / 5];
  }
}
 
// decrease speed if it's above the min (1)//OTSCHET-100
void decrease_speed() {
  
  if(actual_speed > 1) {
    actual_speed -= 1;//делитель
    tick_count = 0;
    ticks = speed_ticks[actual_speed / 5];
  }
}
 
// change direction if needed
void change_direction(int new_direction) {
  
  if(actual_direction != new_direction) {
    actual_direction = new_direction;
    digitalWrite(PIN_DIR, actual_direction);
  }
}
 
// emergency stop: speed 0
void emergency_stop() {
  actual_speed = 0;
  tick_count = 0;
  ticks = speed_ticks[actual_speed / 5];
}
 
// update LCD
void updateLCD() {
  
  // print first line:
  // Speed: xxxRPM -> (or <-)
  lcd.setCursor(24,1);
  lcd.print(actual_speed);
  lcd.print("");
  lcd.print("%  ");
  lcd.setCursor(20,1);
  if(actual_direction == FORWARD) lcd.print(forward_arrow);
  else lcd.print(backward_arrow);
  
  // print second line:
  // progress bar [##### ]
  // 15 speed steps: 0 - 5 - 10 - ... - 100
  lcd.setCursor(20,0);
  lcd.print("");
  
  for(int i = 0; i <= 19; i++) {
    
    if(actual_speed > (5 * i) - 1) lcd.write(byte(0));
    else lcd.print(" ");
  }
  
}
 
// timer1 interrupt function
void timerIsr() {
 
  if(actual_speed == 0) return;
  
  tick_count++;
  
  if(tick_count == ticks) {
    
    // make a step
    digitalWrite(PIN_STEP, HIGH);
    digitalWrite(PIN_STEP, LOW);
    
    tick_count = 0;
  }
}
 
// read buttons connected to a single analog pin
int read_buttons() {
  
 int adc_key_in = analogRead(0);
 
 if (adc_key_in > 1000) return btnNONE;
 if (adc_key_in < 50) return btnRIGHT;
 if (adc_key_in < 195) return btnUP;
 if (adc_key_in < 380) return btnDOWN;
 if (adc_key_in < 555) return btnLEFT;
 if (adc_key_in < 790) return btnSELECT;
}
DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

еще один под LSD

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

Вставьте код нормально.

alex72
alex72 аватар
Offline
Зарегистрирован: 08.03.2018

     Понимаю.Праздник сегодня не у нас))))Но все таки по теме?

 

alex72
alex72 аватар
Offline
Зарегистрирован: 08.03.2018
#include <TimerOne.h>
#include <LiquidCrystal.h>
// buttons code
#define btnRIGHT 0
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5

// directions
#define FORWARD HIGH
#define BACKWARD LOW

// debounce time (milliseconds)
#define DEBOUNCE_TIME 90//скорость переключения повышения.понижения значений

// PINs for Pololu controller
#define PIN_STEP 11
#define PIN_DIR 13

// lookup table speed - ticks (interrupts)
const int speed_ticks[] = {0, 600, 300, 200, 150, 120, 100, 86, 75, 67, 60, 55, 50, 46, 43};

// global variables
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

int actual_speed;
int actual_direction;

int ticks;
int tick_count;

int button;
boolean debounce;
unsigned long previous_time;

// custom LCD square symbol for progress bar
byte square_symbol[8] = {
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
};

// string constants
char forward_arrow[] = "->";
char backward_arrow[] = "<-";

void setup() {

  // init the timer1, interrupt every 0.1ms
  Timer1.initialize(90);
  Timer1.attachInterrupt(timerIsr);
  
  // init LCD and custom symbol
  lcd.begin(20, 4);
  lcd.setCursor(0,0);
  lcd.createChar(0, square_symbol);
  
  // pins direction
  pinMode(PIN_STEP, OUTPUT);
  pinMode(PIN_DIR, OUTPUT);
  
  // initial values
  actual_speed = 0;
  actual_direction = FORWARD;
  tick_count = 0;
  ticks = 1;
  debounce = false;

  digitalWrite(PIN_DIR, actual_direction);
  updateLCD();
}
  
void loop() {
  
  // check if debounce active
  if(debounce) {
    button = btnNONE;
    if(millis() - previous_time >   DEBOUNCE_TIME) debounce = false;
  } else button = read_buttons();
  
  // if a button is pressed, start debounce time
  if(button != btnNONE) {
    
    previous_time = millis();
    debounce = true;
  }
    
  // check which button was pressed
  switch(button) {
    
    case btnUP:
      increase_speed();
      break;
    case btnDOWN:
      decrease_speed();
      break;
    case btnLEFT:
      change_direction(BACKWARD);
      break;
    case btnRIGHT:
      change_direction(FORWARD);
      break;
    case btnSELECT:
      emergency_stop();
      break;
  }
  
  // finally update the LCD
  updateLCD();
}

// increase speed if it's below the max (100)//OTSCHET OT 0+
void increase_speed() {
  
  if(actual_speed < 100) {
    actual_speed += 1;//делитель
    tick_count = 0;
    ticks = speed_ticks[actual_speed / 5];
  }
}

// decrease speed if it's above the min (1)//OTSCHET-100
void decrease_speed() {
  
  if(actual_speed > 1) {
    actual_speed -= 1;//делитель
    tick_count = 0;
    ticks = speed_ticks[actual_speed / 5];
  }
}

// change direction if needed
void change_direction(int new_direction) {
  
  if(actual_direction != new_direction) {
    actual_direction = new_direction;
    digitalWrite(PIN_DIR, actual_direction);
  }
}

// emergency stop: speed 0
void emergency_stop() {
  actual_speed = 0;
  tick_count = 0;
  ticks = speed_ticks[actual_speed / 5];
}

// update LCD
void updateLCD() {
  
  // print first line:
  // Speed: xxxRPM -> (or <-)
  lcd.setCursor(24,1);
  lcd.print(actual_speed);
  lcd.print("");
  lcd.print("%  ");
  lcd.setCursor(20,1);
  if(actual_direction == FORWARD) lcd.print(forward_arrow);
  else lcd.print(backward_arrow);
  
  // print second line:
  // progress bar [##### ]
  // 15 speed steps: 0 - 5 - 10 - ... - 100
  lcd.setCursor(20,0);
  lcd.print("");
  
  for(int i = 0; i <= 19; i++) {
    
    if(actual_speed > (5 * i) - 1) lcd.write(byte(0));
    else lcd.print(" ");
  }
  
}

// timer1 interrupt function
void timerIsr() {

  if(actual_speed == 0) return;
  
  tick_count++;
  
  if(tick_count == ticks) {
    
    // make a step
    digitalWrite(PIN_STEP, HIGH);
    digitalWrite(PIN_STEP, LOW);
    
    tick_count = 0;
  }
}

// read buttons connected to a single analog pin
int read_buttons() {
  
 int adc_key_in = analogRead(0);
 
 if (adc_key_in > 1000) return btnNONE;
 if (adc_key_in < 50) return btnRIGHT;
 if (adc_key_in < 195) return btnUP;
 if (adc_key_in < 380) return btnDOWN;
 if (adc_key_in < 555) return btnLEFT;
 if (adc_key_in < 790) return btnSELECT;
}

 

alex72
alex72 аватар
Offline
Зарегистрирован: 08.03.2018

[quote=alex72]

   Подскажите начинающему как можно изменить переменное значения по выходу 11 на от 0 до 255(0-4.5v)

 

evgta
Offline
Зарегистрирован: 02.09.2016

никак, ардуина этого неумеет, 

умеют сторонние ЦАП, или на шим RC фильтр подбирать

 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Если ты имел в виду вот это:

ЛСД (ЛСД-25, LSD, от нем. Lysergsäurediethylamid — диэтиламид d-лизергиновой кислоты) — полусинтетическое психоактивное вещество из семейства лизергамидов.

Химические названия: N,N-диэтиламид лизергиновой кислоты; N,N-диэтиллизергоиламид. Условные названия и шифры: LSD; LSD-25; Lysergide, Delysid. Химическая формула вещества: C20H25N3O. В русскоязычной медицинской литературе советского периода для обозначения LSD употребляются аббревиатуры ДЛК, ДЛК-25.

ЛСД может считаться самым известным психоделиком, использовавшимся или используемым в качестве рекреационного препарата, а также в качестве инструмента в различных трансцендентных практиках, таких как медитация, психонавтика, и в запрещённой законом (но легальной в прошлом) психоделической психотерапии.

То, всё очень просто - чуть больше дозу и все значения станут "ваще, атпад!"

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

Как-то так:

ну, только третий на 11-ый заменить.

Будет от 0 до напряжения питания

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

Интересно, для чего в этом скетче pwm на пине 11 и причем тут лсд..

alex72
alex72 аватар
Offline
Зарегистрирован: 08.03.2018

ТОЧНЯК.СТАРЕЮ.УСИЛИТЬ СИГНАЛ.ПРАВИЛЬНО ГОВОРЯТ ОДНА ГОЛОВА ХОРОШО А ДВЕ УЖЕ-МУТАНТ))).ОПРОБИРУЮ ДАМ ОТВЕТ

alex72
alex72 аватар
Offline
Зарегистрирован: 08.03.2018

ПРИ ИЗМЕНЕНИИ ОБОРОТОВ ОТСЛЕЖИВАТЬ ИНФУ НА ДИСПЛЕЕ

alex72
alex72 аватар
Offline
Зарегистрирован: 08.03.2018

УВЫ С ОПЕРАЦИОННИКОМ НЕ ТАЩИТ.МОЛЧИТ

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

alex72, во-первых, не нужно кричать. А во-вторых, попытайтесь вразумительно объяснить:

1. Чего Вы хотите.

2. Что у Вас получается.

3. Чем первое отличается от второго.

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

Мне одному кажется, что это какое-то безумие - ждать плавного изменения напряжения на выводе сигнала на операционник с выхода на степающий драйвер?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

sadman41 пишет:

Мне одному кажется, что это какое-то безумие - ждать плавного изменения напряжения на выводе сигнала на операционник с выхода на степающий драйвер?

Я все придумывал, как бы над этим поглумиться потоньше, а ты все испортил! ;)

Я уже начал рисовать идею, что бы он в итоге степ-дрйвер свой пожег... и теперь все насмарку! А-а-абидно, однако...

alex72
alex72 аватар
Offline
Зарегистрирован: 08.03.2018

        )))))ПОТРЯСНО.ЭТО ВСЕ НА ЧТО ВЫ СПОСОБНЫ????.НАСКОЛЬКО Я ДУМАЮ В СКЕТЧ НУЖНО ДОБАВИТЬ ЧТО-ТО

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Для начала нажмите Caps Lock на клавиатуре.

alex72
alex72 аватар
Offline
Зарегистрирован: 08.03.2018

ОК ЕСЛИ СИГНАЛ ЗАПУСТИТЬ НА АНАЛОГОВУЮ ШИНУ И ПРОПИСАТЬ В ПРОГЕ ИЗМЕННЕНИЯ НА ВЫХОД?????

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

alex72, я Вас предупредил. Все сообщения с КАПСОМ будут удаляться. Отредактируйте свои сообщения и пишите нормальным шрифтом.

alex72
alex72 аватар
Offline
Зарегистрирован: 08.03.2018

спасибо за совет.незнал это правило

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

Здесь про четчик оборотов на ИК сенсоре

http://samopal.pro/cnc-new-3/

В принципе ИК сенсор без проблем можно заменить оптическим или датчиком Холла

alex72
alex72 аватар
Offline
Зарегистрирован: 08.03.2018

спасибо.эти варианты не подходят.ребята помогли.сделали.все работает.тему можно закрывать)