Автор Тема: Помощь с Ардуино для крафта  (Прочитано 7419 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн sadky

  • Эксперт
  • *****
  • Сообщений: 2638
Re: Помощь с Ардуино для крафта
« Ответ #45 : Февраля 27, 2019, 08:25:15 »
akl,  не попробую - второго датчика нет пока :pozor:

Оффлайн akl

  • Живу на форуме
  • *******
  • Сообщений: 8114
  • не шарю ваще
Re: Помощь с Ардуино для крафта
« Ответ #46 : Февраля 27, 2019, 08:28:37 »
аа подумал на прошлой странице ты как раз второй купил. но можно второй просто кнопкой заменить, или на одном проверять (к D3 подключать его).
но лучше тогда подождать пока я допилю и дотестирую

Оффлайн Tander

  • Ветеран форума
  • ******
  • Сообщений: 3732
    • Efremoff
Re: Помощь с Ардуино для крафта
« Ответ #47 : Февраля 27, 2019, 10:41:20 »
sadky, я не сильно понимаю, зачем нужен второй датчик? для подсчета витков - достаточно одного. И нужен диск с одним отверстием или прорезью,  - который будет перекрывать  щель, все время, и раз на оборот - будет открывать датчик этой прорезью или отверстием. И получается что у нас за 1 оборот происходит изменение датчика Low->High->Low - и мы можем считать кол-во оборотов сделанных двигателем.
« Последнее редактирование: Февраля 27, 2019, 10:43:58 от Tander »

Оффлайн akl

  • Живу на форуме
  • *******
  • Сообщений: 8114
  • не шарю ваще
Re: Помощь с Ардуино для крафта
« Ответ #48 : Февраля 27, 2019, 12:01:12 »
Tander, второй датчик нужен чтобы можно было без лишних проблем в обратную сторону отмотать если перекрутил лишку

Оффлайн Tander

  • Ветеран форума
  • ******
  • Сообщений: 3732
    • Efremoff
Re: Помощь с Ардуино для крафта
« Ответ #49 : Февраля 27, 2019, 13:18:19 »
Это тоже реализуется все на том же датчике. Просто как дополнительное условие - добавляем проверку - в какую сторону крутит двигатель.

Оффлайн akl

  • Живу на форуме
  • *******
  • Сообщений: 8114
  • не шарю ваще
Re: Помощь с Ардуино для крафта
« Ответ #50 : Февраля 27, 2019, 13:26:56 »
Tander, это если крутит двигатель. а если крутит рука, то определить направление автоматично можно только с двумя датчиками

Оффлайн sadky

  • Эксперт
  • *****
  • Сообщений: 2638
Re: Помощь с Ардуино для крафта
« Ответ #51 : Февраля 27, 2019, 13:44:44 »
Во-во, на данном этапе - Верная рука - друг DIY-ера :crazy: Мотор - это пока мечта идиота :pozor:

Оффлайн Tander

  • Ветеран форума
  • ******
  • Сообщений: 3732
    • Efremoff
Re: Помощь с Ардуино для крафта
« Ответ #52 : Февраля 27, 2019, 14:54:39 »
ну - при руке - не проще ли взять обычный ON-ON Toggle Switch - который бы переключался либо тоже рукой, либо каким-то механическим лепестком на валу? ) такого добра обычно много под рукой, в отличии от датчиков специфических. :)

Оффлайн akl

  • Живу на форуме
  • *******
  • Сообщений: 8114
  • не шарю ваще
Re: Помощь с Ардуино для крафта
« Ответ #53 : Февраля 27, 2019, 15:07:40 »
вместо второго датчика можно поставить тумблер и переключать его вручную.

Оффлайн Tander

  • Ветеран форума
  • ******
  • Сообщений: 3732
    • Efremoff
Re: Помощь с Ардуино для крафта
« Ответ #54 : Февраля 27, 2019, 15:10:58 »
что собсно я и написал выше. )

Оффлайн akl

  • Живу на форуме
  • *******
  • Сообщений: 8114
  • не шарю ваще
Re: Помощь с Ардуино для крафта
« Ответ #55 : Февраля 27, 2019, 15:12:34 »
но это все равно пока не очень актуально, сперва надо механику всю запилить, к тому времени и датчик найдется

Оффлайн Tander

  • Ветеран форума
  • ******
  • Сообщений: 3732
    • Efremoff
Re: Помощь с Ардуино для крафта
« Ответ #56 : Февраля 27, 2019, 16:01:09 »
если мотать рукой - то механика складыватся только с "мясорубки" с фиксаторами, так? Я делал с оргстекла, шпильки на 8, пары подшипников и еще какой-то мелочи типа гаек и тп.
но у меня доступ к CNC резке был по оргстеклу. я не представляю если бы пришлось руками пилить все это )))
« Последнее редактирование: Февраля 27, 2019, 16:02:44 от Tander »

Оффлайн Dying Fetus Автор темы

  • Moderator
  • *****
  • Сообщений: 10308
  • DIYng Fetus
    • http://cathar.ru
Re: Помощь с Ардуино для крафта
« Ответ #57 : Февраля 27, 2019, 16:18:08 »
если мотать рукой - то механика складыватся только с "мясорубки" с фиксаторами, так? Я делал с оргстекла, шпильки на 8, пары подшипников и еще какой-то мелочи типа гаек и тп.
но у меня доступ к CNC резке был по оргстеклу. я не представляю если бы пришлось руками пилить все это )))
меняем на фанеру и практически в любом районном сельпо режем лазером\фрезой за не космические деньги

Оффлайн Tander

  • Ветеран форума
  • ******
  • Сообщений: 3732
    • Efremoff
Re: Помощь с Ардуино для крафта
« Ответ #58 : Февраля 27, 2019, 16:20:20 »
Да, тож вариант.
Но вернемся к ардуине.  Как подключить дисплей - вроде разобрались. Необходимо вывести на экран кириллицу - тоже написано как и что. Кнопки - тоже вроде ясно, как и мысли по поводу слежения отключения питания и прочего. Так же как и подсчет оборотов за счет счетчика - тоже вроде должно быть понятно...

Что-то еще упустил? )

Оффлайн akl

  • Живу на форуме
  • *******
  • Сообщений: 8114
  • не шарю ваще
Re: Помощь с Ардуино для крафта
« Ответ #59 : Февраля 27, 2019, 16:31:08 »
осталось все это закодировать так чтоб нормально работало. вернее исправить ошибки в том, что уже набякокожено, чтобы оно заработало больше чем наполовину :pozor:

... и добавил:

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

... и добавил:

а все нашел ошибку - очень тупая.

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

... и добавил:

настроил кнопочное сохранение. осталось запилить схему аварийного питания и затестить автосохранение.

... и добавил:



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

... и добавил:

а забыл написать как кнопки работают. долгое нажатие на кнопку селект (2 секунды держать) - сброс на ноль. короткое нажатие на кнопку селект сохраняет в память текущую цифру витков и яркость экрана. кнопки вверх и вниз меняют яркость экрана.

... и добавил:

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


аварийное сохранение наверно только в выходные доделаю, щас лень паять :pozor:

... и добавил:

а еще там есть система отслеживания ошибок памяти, так что можно будет заметить если память начнет отваливаться и поменять ячейки для сохранений

... и добавил:

а еще система отката к предыдущему сохраненному значению или значению которое было перед сбросом. на левую кнопку и подтверждение на селект. хотя не, эта хрень еще не до конца работает :pozor:

вроде допилил систему отката.
#include <EEPROM.h>
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

#define BTN_UP   1
#define BTN_DOWN 2
#define BTN_LEFT 3
#define BTN_RIGHT 4
#define BTN_SELECT 5
#define BTN_NONE 0
#define ANALOG_PIN A0
#define PWM_PIN 10
#define DETECT_PIN 11

int read_int(int addr) {   
    byte raw[2];
    for(byte i = 0; i < 2; i++) raw[i] = EEPROM.read(addr+i);
    int &num = (int&)raw;
    return num;
}
  void write_int(int addr, int num) {
    byte raw[2];
    (int&)raw = num;
    for(byte i = 0; i < 2; i++) EEPROM.write(addr+i, raw[i]);
}

int detectButton() {
  int keyAnalog =  analogRead(ANALOG_PIN);
  if (keyAnalog < 100) {
    return BTN_RIGHT;
  } else if (keyAnalog < 200) {
    return BTN_UP;
  } else if (keyAnalog < 400) {
    return BTN_DOWN;
  } else if (keyAnalog < 600) {
    return BTN_LEFT;
  } else if (keyAnalog < 800) {
    return BTN_SELECT;
  } else {
    return BTN_NONE;
  }
}

unsigned long timer;
unsigned long button_timer;
unsigned long drop_timer;
unsigned long backmod_timer;
int button=0;
int button_old=0;
unsigned char memerr_l=0;
unsigned char memerr_v=0;
unsigned char back_mod=0;
unsigned char button_flag=0;
unsigned char select_flag=0;
volatile char lcdref_flag=0;
int vitki=0;
int vitki_mem[3];
int vitki_old=0;
char vit_nom[16];
int vitki_back=0;
int vitki_back_o=0;
volatile char dir=1;
volatile char dtc=0;
volatile char dtc_f=0;
int light=30;
int light_mem[3];
int light_old;
const int addr=0;

void interrupt0(){
  analogWrite(PWM_PIN,0);
  if(vitki!=vitki_old){
    write_int(10+addr,vitki*(-1+2*dtc_f));
    write_int(12+addr,vitki*(-1+2*dtc_f));
    write_int(14+addr,vitki*(-1+2*dtc_f));
  }
  if(light!=light_old){
    EEPROM.write(0+addr,(uint8_t)light);
    EEPROM.write(1+addr,(uint8_t)light);
    EEPROM.write(2+addr,(uint8_t)light);
  }
  delay(1000);
  lcd.clear();
  lcd.print("4To-To He Tak");
  lcd.setCursor(0, 1);
  lcd.print("nepe3arpy3u");
  while(1==1){
    delay(200);
  }
}
void interrupt1(){
  dtc=digitalRead(DETECT_PIN);
  if(vitki==0){
    dir=1;
    dtc_f=dtc;
  }else if(dtc_f==dtc){
    dir=1;
  }else {dir=-1;}
  vitki+=dir;
  lcdref_flag=1;
}


void setup() {
  digitalWrite(DETECT_PIN,1);
  digitalWrite(2,1);
  digitalWrite(3,1);
  int i;
  if(EEPROM.read(3+addr)==123){
    for(i=0;i<3;i++){
      light_mem[i]=EEPROM.read(i+addr);
    }
    if(light_mem[0]==light_mem[1]){
      light=light_mem[0]; memerr_l=0;
    }else if(light_mem[0]==light_mem[2]){
      light=light_mem[0]; memerr_l=1;
    }else if(light_mem[1]==light_mem[2]){
      light=light_mem[1]; memerr_l=2;
    }else{light=30; memerr_l=3;}
  }else{
    EEPROM.write(0+addr,30);
    EEPROM.write(1+addr,30);
    EEPROM.write(2+addr,30);
    EEPROM.write(3+addr,123);
    if(EEPROM.read(3+addr)!=123){memerr_l=4;}
  }
  light_old=light;
  analogWrite(PWM_PIN,light);
 
  if(EEPROM.read(16+addr)==123){
   
    vitki_mem[0]=read_int(10+addr);
    vitki_mem[1]=read_int(12+addr);
    vitki_mem[2]=read_int(14+addr);
    if(vitki_mem[0]==vitki_mem[1]){
      vitki=vitki_mem[0]; memerr_v=0;
    }else if(vitki_mem[0]==vitki_mem[2]){
      vitki=vitki_mem[0]; memerr_v=1;
    }else if(vitki_mem[1]==vitki_mem[2]){
      vitki=vitki_mem[1]; memerr_v=2;
    }else{vitki=0; memerr_v=3;}
  }else{
    write_int(10+addr,0);
    write_int(12+addr,0);
    write_int(14+addr,0);
    EEPROM.write(16+addr,123);
    if(EEPROM.read(16+addr)!=123){memerr_v=4;}
  }
  if(vitki<0){dtc_f=0; vitki=-vitki;}
  else{dtc_f=1;}
  vitki_old=vitki;
  vitki_back=vitki;
 
  lcd.begin(16, 2);
  lcd.clear();
  lcd.noBlink();
  lcd.noCursor();
  lcd.print("npuBeT!");
  lcd.setCursor(0, 1);
  if(memerr_l||memerr_v){
    sprintf(vit_nom, "owu6Ka: %d, %d",memerr_l,memerr_v);
    lcd.print(vit_nom);
  }else{
    lcd.print("naM. HopM");
  }
  delay(1000);
  lcd.clear();
  lcd.print("   HAMOTAHO: ");
  lcd.setCursor(0, 1);
  sprintf(vit_nom, "     %04d", vitki);
  lcd.print(vit_nom);
 
  attachInterrupt(1, interrupt1, FALLING);
  attachInterrupt(0, interrupt0, FALLING);
}

void loop() {
  timer=millis();
  if(detectButton()>0 && !button_flag){
    button_flag=1;
    button_timer=timer;
  } else if(detectButton()==0 && button_flag){
    button_flag=0;
    button=0;
    button_old=0;
  }
  if(button_flag==1 && timer-button_timer>40){
    button=detectButton();
    button_flag=2;
  }
 
  if(button_old!=button){
    button_old=button;
    if(!back_mod){lcdref_flag=1;}
    switch(button){
      case BTN_SELECT:
      drop_timer=timer;
      if(!back_mod){
        select_flag=1;
      } else{
        back_mod=0;
        lcdref_flag=1;
        select_flag=0;
        uint8_t oldSREG = SREG;
        cli();
        vitki_back_o=vitki;
        vitki=vitki_back;
        vitki_back=vitki_back_o;
        SREG = oldSREG;
      }
      break;
     
      case BTN_UP:
      if(light<10){
        light+=1;
      } else if(light<100){
        light+=10;
      } else{
        light+=25;
        if(light>255){
          light=255;
        }
      }
      analogWrite(PWM_PIN,light);
      break;
     
      case BTN_DOWN:
      if(light==255){
        light-=5;
      } else if(light>100){
        light-=25;
      } else if(light>10){
        light-=10;
      } else{
        light-=1;
        if(light<0){
          light=0;
        }
      }
      analogWrite(PWM_PIN,light);
      break;
     
      case BTN_LEFT:
      if(!back_mod && vitki_back!=vitki){
        back_mod=1;
        backmod_timer=timer;
        lcdref_flag=0;
        lcd.setCursor(0, 1);
        sprintf(vit_nom, "     %04d", vitki_back);
        lcd.print(vit_nom);
        lcd.print(" ?  ");
      }else{back_mod=0;lcdref_flag=1;}
      break;

      case BTN_RIGHT:
      if(back_mod){back_mod=0;lcdref_flag=1;}
      break;
     
      default:
      break;
    }
  }
 
  if(back_mod && timer-backmod_timer>10000){
    back_mod=0;
    lcdref_flag=1;
  }
 
  if(button==BTN_SELECT && timer-drop_timer>2000){
    uint8_t oldSREG = SREG;
    cli();
    vitki_back=vitki;
    vitki=0;
    SREG = oldSREG;
    if(vitki_old!=0){
      write_int(10+addr,0);
      write_int(12+addr,0);
      write_int(14+addr,0);
      vitki_old=0;
    }
    lcdref_flag=1;
    lcd.setCursor(0, 0);
    lcd.print("   C6POC!    ");
    delay(500);
    lcd.setCursor(0, 0);
    lcd.print("   HAMOTAHO: ");
  }
  if(select_flag && !button && timer-drop_timer<1000){
    select_flag=0;
    uint8_t oldSREG = SREG;
    cli();
    vitki_back=vitki;
    SREG = oldSREG;
    if(vitki!=vitki_old){
      write_int(10+addr,vitki*(-1+2*dtc_f));
      write_int(12+addr,vitki*(-1+2*dtc_f));
      write_int(14+addr,vitki*(-1+2*dtc_f));
      vitki_old=vitki;
    }
    if(light!=light_old){
      EEPROM.write(0+addr,(uint8_t)light);
      EEPROM.write(1+addr,(uint8_t)light);
      EEPROM.write(2+addr,(uint8_t)light);
      light_old=light;
    }
    lcd.setCursor(0, 0);
    lcd.print("   COXPAHEHO!");
    delay(500);
    lcd.setCursor(0, 0);
    lcd.print("   HAMOTAHO: ");
  }

  if(lcdref_flag){
    lcdref_flag=0;
    back_mod=0;
    uint8_t oldSREG = SREG;
    cli();
    int v = vitki;
    SREG = oldSREG;
    lcd.setCursor(0, 1);
    sprintf(vit_nom, "     %04d", v);
    lcd.print(vit_nom);
    lcd.print("    ");
  }
  delay(10);
}
« Последнее редактирование: Марта 01, 2019, 05:57:02 от akl »