Ищу исполнителя скетча для управл. оборотами ШД кнопками и вывод на LCD

Nikolai54
Offline
Зарегистрирован: 23.06.2013

Прошу Вас написать скетч за вознагрождение оринтировочно такого плана

http://www.lucadentella.it/en/2013/05/30/allegro-a4988-e-arduino-3/2/

управление через вот это

http://www.goodluckbuy.com/single-axis-cnc-stepper-driver-for-cnc-millin...

Diemon
Offline
Зарегистрирован: 18.11.2011

Не поверите, но скетч будет такой же самый. Что в вашем, что по ссылке управление через Step/Dir.

 

P.S. куда деньги пошлете ? :)

Nikolai54
Offline
Зарегистрирован: 23.06.2013

На какую сумму Вы оцениваете работу?

Diemon
Offline
Зарегистрирован: 18.11.2011

Николай, какие деньги. По вашей же ссылке уже готовый код: https://github.com/lucadentella/A4988-and-Arduino

#include <LiquidCrystal.h>

#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

#define PIN_STEP  2
#define PIN_DIR   3
#define FORWARD   HIGH
#define BACKWARD  LOW

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int actual_direction;
int step_count;

void setup() {
  
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("Step controller");
  
  pinMode(PIN_STEP, OUTPUT);
  pinMode(PIN_DIR, OUTPUT);
  
  actual_direction = FORWARD;
  digitalWrite(PIN_DIR, actual_direction);
  step_count = 0;

  update_lcd();
}

void loop() {
  
  int button = read_buttons();
  if(button == btnLEFT || button == btnRIGHT) {
    
    if((actual_direction == FORWARD && button == btnLEFT) ||
      (actual_direction == BACKWARD && button == btnRIGHT)) change_direction();
    make_step();
    update_lcd();
    delay(200);
  }
}

void update_lcd() {
  
  lcd.setCursor(0, 1);
  lcd.print("                ");
  
  lcd.setCursor(7, 1);
  lcd.print("--");
  
  if(actual_direction == FORWARD) {
    for(int i = 0; i < step_count; i++) lcd.print("-");
    lcd.print(">");
  } else {
    for(int i = 0; i < step_count; i++) {
      lcd.setCursor(6 - i, 1);
      lcd.print("-");
    }
    lcd.setCursor(7 - step_count - 1, 1);
    lcd.print("<");    
  }
  
  
}

void make_step() {
  
  digitalWrite(PIN_STEP, HIGH);
  digitalWrite(PIN_STEP, LOW);
  step_count++;
  if(step_count == 7) step_count = 0;
}

void change_direction() {
  
  if(actual_direction == FORWARD) actual_direction = BACKWARD;
  else actual_direction = FORWARD;
  
  digitalWrite(PIN_DIR, actual_direction);
  step_count = -1;
}

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;   
}

 

Nikolai54
Offline
Зарегистрирован: 23.06.2013

Спасибо большое пробовал работает, но совсем не так как на Demo http://www.lucadentella.it/en/2013/05/30/allegro-a4988-e-arduino-3/2/

У Вас скетч крутит ШД пока держишь кнопку, крутится с постоянной скоростью и не добавляется скорость, только бегут стрелочки на индикаторе влево или вправо в зависимости на какую кнопку нажать.
Не показывает обороты, мне надо от 1 оборота (а вообще минимально четверть оборота) и макс. до 200 оборотов.
Я понял Вы из друго примера мне скинулу скетч вто это

http://www.lucadentella.it/2013/05/25/allegro-a4988-e-arduino-2/2/

Diemon
Offline
Зарегистрирован: 18.11.2011

Да, я вам скинул скетч, который попроще. Попробуйте второй: https://github.com/lucadentella/A4988-and-Arduino/blob/master/cntrSpeedDir.ino

Nikolai54
Offline
Зарегистрирован: 23.06.2013
#include <LiquidCrystal.h>
#include <TimerOne.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 200

// PINs for Pololu controller
#define PIN_STEP 2
#define PIN_DIR 3

// lookup table speed - ticks (interrupts)
const int speed_ticks[] = {-1, 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;
int 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(100);
  Timer1.attachInterrupt(timerIsr);
  
  // init LCD and custom symbol
  lcd.begin(16, 2);
  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 (70)
void increase_speed() {
  
  if(actual_speed < 70) {
    actual_speed += 5;
    tick_count = 0;
    ticks = speed_ticks[actual_speed / 5];
  }
}

// decrease speed if it's above the min (0)
void decrease_speed() {
  
  if(actual_speed > 0) {
    actual_speed -= 5;
    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(0,0);
  lcd.print("Speed: ");
  lcd.print(actual_speed);
  lcd.print("RPM ");

  lcd.setCursor(13,0);
  if(actual_direction == FORWARD) lcd.print(forward_arrow);
  else lcd.print(backward_arrow);
  
  // print second line:
  // progress bar [##### ]
  // 15 speed steps: 0 - 5 - 10 - ... - 70
  lcd.setCursor(0,1);
  lcd.print("[");
  
  for(int i = 1; i <= 14; i++) {
    
    if(actual_speed > (5 * i) - 1) lcd.write(byte(0));
    else lcd.print(" ");
  }
  
  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;
}

 

Nikolai54
Offline
Зарегистрирован: 23.06.2013

строка 058 ошибка Timer1.attachInterrupt(timerIsr) ;

sketch_aug14a.ino: In function 'void setup()':
sketch_aug14a:58: error: invalid conversion from 'void (*)()' to 'void (*)(bool)'
sketch_aug14a:58: error: initializing argument 1 of 'void TimerOne::attachInterrupt(void (*)(bool), long int)'
sketch_aug14a:58: error: void value not ignored as it ought to be
 

Nikolai54
Offline
Зарегистрирован: 23.06.2013

Есть еще один скетч но он к кнопкам LCD не привязан

Nikolai54
Offline
Зарегистрирован: 23.06.2013

Вот ссылка http://pastebin.com/jRG3gi2F

Nikolai54
Offline
Зарегистрирован: 23.06.2013

Исходное:
- ШД Pl57H56-2.6-4
- драйвер управления http://www.goodluckbuy.com/single-axis-cnc-stepper-driver-for-cnc-milling-machine-diy-max-50v-dc-4-5a.html
- LCD 1602 Shield with keypad http://www.ebay.com/itm/LCD-1602-Keypad-Shield-Module-for-Chinduino-atmega328-2560-/170832425898
- Arduino UNO ATmega328P
Как должно работать:
-кнопка включить выключить двигатель
-кнопка реверс
- скорость (больше)
- скорость (меньше)
- направление
- при нажатии  включается максимальная скорость оборотов скажем 200 об при отпускании возвращается в исходное состояние, иметь возможность в скетче задать максимальную и минимальную скорость.
- возможность установки кнопками скорость в трех разрядах , например 3 разряда 000 об/мин выбираем 1 первый разряд ставим 1 выбираем второй ставим 8 выбираем третий ставим 7 получилась 187, кнопка включить скорость должна 187 об
Вот что надо если что то по мелочи не забыл .
Вот ниже мне дали скетч можно его за основу взять (или второй как Вам удобней) у него только кнопки не используют аналоговые входы, ниже второй скетч там используют кнопки LCD 1602 Shield with keypad
Скетчи как варианты  http://pastebin.com/jRG3gi2F
https://github.com/lucadentella/A4988-and-Arduino/blob/master/cntrSpeedDir.ino
 

Nikolai54
Offline
Зарегистрирован: 23.06.2013

Кто возьмется сделать?

Nikolai54
Offline
Зарегистрирован: 23.06.2013

https://github.com/lucadentella/A4988-and-Arduino/blob/master/cntrSpeedDir.ino
Вроде все работает но почему он зависает, но двигатель продолжает крутится, приходится ресет делать, подскажите пожалуйста

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

Добавте в setup(){}

Serial.begin(9600);
Serial.println("Started");

В начало loop()

Добавте

static unsigned long lastRep=0;
if(millis()-lastRep>1000){
  Serial.print("heartbeat:");
  Serial.println(millis());
   lastRep=millis();
}

Откройте сериал монитор, и смотрите, если в момент зависания (а не только в самом начале) у вас выскакивают слова "Stated" - значит происходит ребут контроллера.

Если перестали появлятся надписи heartbeat:КАКОЙ-ТО число - значит действительно loop, по какой-то причине перестал "крутится".

Вообщем вначале нужно убедится что "зависания" имеют место быть.

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

Nikolai54
Offline
Зарегистрирован: 23.06.2013

Спасибо за помощь. Сделал как Вы написали , продолжает зависать.
Зависание происходят в разные моменты, пробовал какую то закономерность найти всегда по разному.
Загружаю скетч идет Stated далее
heartbeat:1008
heartbeat:2012 и т.д
Нажимаю кнопки DOWN ,UP трудно уловить перестает управлять кнопками где то
heartbeat:32114
heartbeat:33238 вроде в этом месте когда переходит на 33...
heartbeat:34248
heartbeat:35260
heartbeat:36271
heartbeat: продолжается , потом делаю ресет работают кнопки идет Stated

 

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

Я правильно понял, что 

1. Перестает реагировать на кнопки, при этом
2. heartbeat - продолжает идти в сторону увеличения. сброса на "малые цифры" - не происходит. Верно?

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

Кстати, функция int read_buttons()

что она вренет, если скажем с analogRead() прочитается значение 800? Ответ - а фиг его знает. Чтоу годно.

ПОэтому, я бы убрал 

if (adc_key_in > 1000) return btnNONE;

и в конце read_buttons() сделал просто

int read_buttons(){
  .....
  return btnNONE;
}

Что-бы "что-нибудь" возвращалось всегда. btnNone - если не смогли опознать ни одну кнопку.

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

Кстати, если бы вы btnNone сделаете нулевой (поменяете ее код с btnRIGHT к примеру), то

#define btnNONE   0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnRIGHT  5

То проверку "нажата ли кнопка", можно делать не только как сейчас

if(button != btnNONE) {

но и более кратким вариантом

if(button ) {

 

Nikolai54
Offline
Зарегистрирован: 23.06.2013

После зависания  heartbeat - продолжает идти в сторону увеличения.
После сброса преходит на "малые цифры" - 
всегда начинает heartbeat:1008
 

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

Nikolai54 пишет:

После зависания  heartbeat - продолжает идти в сторону увеличения.

Значит никаких "зависаний" - нет (вы избежали "проверте питание, поставте конденсаторы, попробуйте другую плату и т.п."). Проблема - в коде.

Смотрите сообщение #16 - обязательно, #17 - по вкусу

Nikolai54
Offline
Зарегистрирован: 23.06.2013

Может я не так вставил Ваш код. Я только учусь.
Вроде раньше для форума я копировал скетч было нормально а сейчас делаю просмотр он тянет HTML код цвета и т.д или если сохранить будет нормально?

Nikolai54
Offline
Зарегистрирован: 23.06.2013

Питиние отдельно от ИП 10 вольт подключал на отдельный разьем от arduino , менял плату пробовал Megs 2560 не чего не меняется, пульсаций проде нет смотрел осцилографом.

Nikolai54
Offline
Зарегистрирован: 23.06.2013

не получается

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

По хорошему, нужно еще добавить, перед

lastRep=millis();

Что-то такое

Serial.print("A0=");
Serial.println(analogRead(A0));

Что-бы увидить какие, на самом деле, у вас приходят значения для кнопок. Бо, практически уверен, что вы взяли цифры в read_buttons() взяли "откуда-то из инета". А у вас могут быть чуток другое соотношение резисторов (погрешность, температура в комнате), чуток другое напряжение питания и т.п.

Вообщем понажимаете кнопки, посмотрите какие цифры появляется после A0= и поправте, если нужно "пороги" в read_buttons()

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

Nikolai54 пишет:

Может я не так вставил Ваш код. Я только учусь.
Вроде раньше для форума я копировал скетч было нормально а сейчас делаю просмотр он тянет HTML код цвета и т.д или если сохранить будет нормально?

Читайте:

Вставка программного кода в тему/комментарий

В сообщении #2 я описывал не только "как вставлять" на форум, но и "как забирать себе"

P.S. Хотя что там в #16 нужно вставлять? Одну строчку выбросить, одну дописать. Можно и руками.

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

Nikolai54 пишет:

Питиние отдельно от ИП 10 вольт подключал на отдельный разьем от arduino , менял плату пробовал Megs 2560 не чего не меняется, пульсаций проде нет смотрел осцилографом.

Да это и не нужно было делать. Я же сказал "мы этого избежали". То что heartbeat продолжает увеличиватся уже нам сказало что "контроллер работает нормально, без ребутов и зависов".

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

Nikolai54 пишет:

не получается

Пока вы не скажете "что именно у вас не получается". Что именно вы делаете - вам никто помоч не сможет. Я же на стою у вас за спиной.

Nikolai54
Offline
Зарегистрирован: 23.06.2013
void setup() {

  // init the timer1, interrupt every 0.1ms
  Timer1.initialize(100);
  Timer1.attachInterrupt(timerIsr);
  
  // init LCD and custom symbol
  lcd.begin(16, 2);
  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();
  Serial.begin(9600);
Serial.println("Started");
}
  
void loop() {
  
  // check if debounce active
  static unsigned long lastRep=0;
if(millis()-lastRep>1000){
  Serial.print("heartbeat:");
  Serial.println(millis());
   lastRep=millis();
}
  if(debounce) {
    button = btnNONE;
    if(millis() > previous_time + DEBOUNCE_TIME) debounce = false;
  } else button = read_buttons();
  

 

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

Обрезалось. Не видно скетч целиком. Вы перед тем как постить, можете  нажать кнопку "Предпросмотр", что-бы увидеть "как оно будет выглядить". Она чуть правее кнопки "сохранить"

Nikolai54
Offline
Зарегистрирован: 23.06.2013

Извините, вот кусок скетча и Ваш код посмотрите правльно я сделал.

Nikolai54
Offline
Зарегистрирован: 23.06.2013
#include <LiquidCrystal.h>
#include <TimerOne.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 200

// PINs for Pololu controller
#define PIN_STEP 2
#define PIN_DIR 3

// lookup table speed - ticks (interrupts)
const int speed_ticks[] = {-1, 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;
int 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(100);
  Timer1.attachInterrupt(timerIsr);
  
  // init LCD and custom symbol
  lcd.begin(16, 2);
  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();
  Serial.begin(9600);
Serial.println("Started");
}
  
void loop() {
  
  // check if debounce active
  static unsigned long lastRep=0;
if(millis()-lastRep>1000){
  Serial.print("heartbeat:");
  Serial.println(millis());
   lastRep=millis();
}
  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 (70)
void increase_speed() {
  
  if(actual_speed < 70) {
    actual_speed += 5;
    tick_count = 0;
    ticks = speed_ticks[actual_speed / 5];
  }
}

// decrease speed if it's above the min (0)
void decrease_speed() {
  
  if(actual_speed > 0) {
    actual_speed -= 5;
    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(0,0);
  lcd.print("Speed: ");
  lcd.print(actual_speed);
  lcd.print("RPM ");

  lcd.setCursor(13,0);
  if(actual_direction == FORWARD) lcd.print(forward_arrow);
  else lcd.print(backward_arrow);
  
  // print second line:
  // progress bar [##### ]
  // 15 speed steps: 0 - 5 - 10 - ... - 70
  lcd.setCursor(0,1);
  lcd.print("[");
  
  for(int i = 1; i <= 14; i++) {
    
    if(actual_speed > (5 * i) - 1) lcd.write(byte(0));
    else lcd.print(" ");
  }
  
  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;
}

 

Nikolai54
Offline
Зарегистрирован: 23.06.2013

Если рестарт сделать когда он уходить за 32.... если нажимать на кнопки  начинает скорость перепрыгивать и соответственно отображать на LCD потом зависает.

Nikolai54
Offline
Зарегистрирован: 23.06.2013

вот сейчас например насчитало heartbeat:337169
если нажать на кнопку Up двигатель закрутился и все зависло, двигатель продолжает крутится

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

Я вообще не вижу что-бы вы что-то сделали. Единственную разницу между изначальным кодом в сообщение #6 и кодом из собщения #30 - то что добавли вывод "hearbeat".

Но это не "исправление", а "вывод дополнительной отладочной информации". Что-бы понять - что происходит. Она позволила нам понять что "с питанием и самой ардуиной - проблем нет". И то что вывод отладочной работает "как нужно" - мы выяснили еще в сообщении #19

Так что я не вижу "что же тут проверять"? Логика скетча - нигде не менялась. Попыток применить исправление описанное в сообщении #16 - я не вижу. Как и попыток вывести еще дополнительной инфы (описанно в #23). Что-бы увидеть что же на самом деле читается с аналогового входа.

 

Nikolai54
Offline
Зарегистрирован: 23.06.2013

Плату я выбираю Arduino Uno на плате написано Model Uno r3

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

Nikolai54 пишет:

Плату я выбираю Arduino Uno на плате написано Model Uno r3

Вы вообще мои сообщения читаете? Или через одно?

Я уже три раза сказал что "мы вяснили что с платой и питанием все в порядке". Три раза сказал что "сделайте поправку описанную в сообщении #16" (это явно проблемное место, даже если не оно "причина глюка" - так оставлять его нельзя).

Если не поможет - применяйте то что описанно в #23. На основании этой инфы - будем думать куда копать дальше (вносить поправки, еще натыкивать Serial.print что-бы получать еще больше инфы... пока не поймем в чем проблема).

Nikolai54
Offline
Зарегистрирован: 23.06.2013

сделал 16 все тоже самое
 

// 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;
 return btnNONE;
}

 

Nikolai54
Offline
Зарегистрирован: 23.06.2013

сделал 23 зависло на где то сдесь
heartbeat:32161
A0=1023
heartbeat:33170
A0=1023
 

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

>сделал 16 все тоже самое

OK. Это в любом случае нужно было сделать. Функция во ситуациях должна какой-нибудь return делать. В C# к примеру - изначальное вообще бы не скомпилировалось.

Что делать дальше, вы уже знаете:

leshak пишет:

"Если не поможет - применяйте то что описанно в #23. На основании этой инфы - будем думать куда копать дальше "

Нажимайте кнопки по очереди. Смотрите в каком диапазоне, для каждой кнопки, выводятся значения A0

Меняются ли эти "диапазоны" когда "перестало реагировать на кнопки"?

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

Nikolai54 пишет:

сделал 23 зависло на где то сдесь
heartbeat:32161
A0=1023
heartbeat:33170
A0=1023
 

Что A0 показывает при нажатой кнопке, скажем RIGHT? "До зависа" и "после"?

Nikolai54
Offline
Зарегистрирован: 23.06.2013

такие и ставить то что получаю?
UP 134-135
DOWN 310
RIGHT 0
LEFT 484
SELECT 724
 

Nikolai54
Offline
Зарегистрирован: 23.06.2013

если не нажимать всегда A0=1023 если нажимать то соотвествует то что я писал не зависимо зависло или нет.

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

>Если рестарт сделать когда он уходить за 32....

Что-то подозрительное число... больно на максимальный размер int похоже.

Проверте верно ли утверждение "проблемы начинаются в районе 32-секунды". Что-то типа "на 25-той всегда все нормально", а на "40-вой уже точно не работает. всегда".

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

Nikolai54 пишет:

такие и ставить то что получаю?
UP 134-135
DOWN 310
RIGHT 0
LEFT 484
SELECT 724
 

Нет. "Точное совпадение" - делать не нужно. Пока все нормально. Если мысленно подставить эти значения в read_buttons() - коды клавиш распознаются нормально. Так что - пока не трогаем, по этому поводу read_buttons(). Просто "проверили - убедились что и тут все правильно". Ищем дальше.

Как по поводу моей догадки про проблемность 32-секунды (когда в hearbated выводится что-то больше 32000)?

Nikolai54
Offline
Зарегистрирован: 23.06.2013

на 25 нормально только на 32, а если не нажимать на кнопки после ресета двигатель стоит и нажать на любой после 32 включится на индикаторе показывает 5 оборот двигатель крутится и все кнопки не реагируют

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

А блин... вынудили таки... пустил у себя. Да... есть проблема в районе 32-секунды.

Ну значит где-то искать ошибычной int....

Ну и вот он

int previous_time;

Меняем на

unsigned long previous_time;

И будет вам счастье :)

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

Правда проблемы опять могут возникнуть. Примерно на 49-тый день непрерывной работы без перезагрузки.

Что-бы этого избежать, нужно 

 if(millis() > previous_time + DEBOUNCE_TIME) debounce = false;

Заменить на

  if(millis() - previous_time >   DEBOUNCE_TIME) debounce = false;

 

Nikolai54
Offline
Зарегистрирован: 23.06.2013

Ну Вы колдун , спасибо большое! это что Итальянцы ошибку сделали?
Вы извините за наглость там шаг 5 а мне надо сделать 1 и скорость где то 200 поставить  если не получится 100-150, скажите где это можно сделать?
Если не ответите и на этом огромное спасибо.

Nikolai54
Offline
Зарегистрирован: 23.06.2013

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

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

Nikolai54 пишет:

Ну Вы колдун , спасибо большое! это что Итальянцы ошибку сделали?

А что, они не люди? Писать без ошибок - еще никто не научился.  Разве что вот этит ребята Они пишут правильную вещь | Kh_Oleg . Но... какой ценой эта безошибочность обходится :)  И даже тут - не нулевая. Хотя эти показатели - выглядят как "что-то совершенно не реальное".

Nikolai54 пишет:

Вы извините за наглость там шаг 5 а мне надо сделать 1 и скорость где то 200 поставить  если не получится 100-150, скажите где это можно сделать?
Если не ответите и на этом огромное спасибо.

Не, тут уже одной строчкой - не отделатся. Смотрите на массив speed_ticks[]

Nikolai54
Offline
Зарегистрирован: 23.06.2013

Что про них, вот мы на работаем, если Вы знали такую машину Электронику 60 Воронежского производства ЦП 1 Мгц Озу 32 Кб венчестер 20 мб, до сих пор у нас в экспериментальной установки работает.