Добавление еще одной оси

Ra3eR
Offline
Зарегистрирован: 01.08.2016

Всем привет, захотелось повторить один проект, https://www.electronoobs.com/eng_arduino_tut48.php , попробовал, собрал на макетке, все заработало. Но захотелось добавить еще ось Z. Если с ардуино А сложностей не возникло, то вот с ардуино Б, что выполняет роль устройства цифровой индикации(уци dro) Возникли проблемы. Подскажите пожалуйста, что я делаю не так?)

Стандартный скетч на 2 оси:

#include <LiquidCrystal_I2C.h>

/*
Code by: ELECTRONOOBS, 07/11/2018
Tutorial webpage: https://www.electronoobs.com/eng_arduino_tut48.php
Schematic: https://www.electronoobs.com/eng_arduino_tut48_sch1.php
Youtube channel: https://www.youtube.com/c/ELECTRONOOBS
*/



//Code for Arduino B (the Arduino with the LCD screen 20x4)
#include <Wire.h> //Downlaod this library here: https://www.electronoobs.com/eng_arduino_liq_crystal.php
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);  //sometimes the adress is not 0x3f. Change to 0x27 if it dosn't work!!

//Inputs or outputs
int reset_posx = 7;
int reset_posy = 6;
int en_mot = 8;
int dir_x = 9;
int dir_y = 10;
int step_x = 11;
int step_y = 12;
int speed_in = A0;


////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////EDITABLE VARIABELS//////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
float turns_per_cm = 3.5;             //This is the amount of turns your lead screw needs for one turn.
float steps_per_revolution = 200;   //This is the amount of steps the motor needs for one full rotation
float max_speed = 17;               //Speed in mm per second
float min_speed = 0.6;              //Speed in mm per second
int refresh_rate = 100;             //Each 100ms we print the values on the LCD screen
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////


//Other variables used in code
float DELAY = 0;
float RealSpeed = 0;
float mm_per_step = 0.007142;     //Initial value inc ase of 7 turns per cm and 200 steps per full rotatio
unsigned long previousMillis = 0; 
bool step_x_state = false;
bool step_y_state = false;
int step_count_x = 0;
int step_count_y = 0;
float mm_x = 0;
float mm_y = 0;
float max_delay = 0;
float min_delay = 0;
int press_counter = 0;

void setup() {
  //Start the screen and print the ELECTRONOOBS logo
  lcd.init();
  lcd.backlight();
  lcd.setCursor(0,0);
  lcd.print("    ELECTRONOOBS    ");
  lcd.setCursor(0,1);
  lcd.print("                    ");
  lcd.setCursor(0,2);
  lcd.print("      WELCOME!      ");
  delay(1500);
  
  //Uncomment this part for the 16x2 LCD type. Also comment the part below for the LCD
  /* 
  lcd.setCursor(0,0);
  lcd.print("Speed:          ");
  lcd.setCursor(6,0);
  lcd.print(RealSpeed);
  lcd.setCursor(12,0);
  lcd.print("mm/s");
  lcd.setCursor(0,1);
  lcd.print("X:              ");
  lcd.setCursor(2,1);
  lcd.print(mm_x,2);
  lcd.setCursor(8,1);
  lcd.print("Y:              ");
  lcd.setCursor(10,1);
  lcd.print(mm_y,2);
  */
  //Print title, x, y and speed on the LCD screen
  lcd.setCursor(0,0);
  lcd.print(" MANUAL CNC CONTROL ");
    
  lcd.setCursor(0,1);
  lcd.print("X:              ");
  lcd.setCursor(2,1);
  lcd.print(mm_x,2);
  lcd.setCursor(18,1);
  lcd.print("mm");
  
  lcd.setCursor(0,2);
  lcd.print("Y:              ");
  lcd.setCursor(2,2);
  lcd.print(mm_y,2);
  lcd.setCursor(18,2);
  lcd.print("mm");

  lcd.setCursor(0,3);
  lcd.print("Speed:          ");
  lcd.setCursor(6,3);
  lcd.print(RealSpeed);
  lcd.setCursor(16,3);
  lcd.print("mm/s");

  //Define the pins as inputs
  pinMode(reset_posx,INPUT);
  pinMode(reset_posy,INPUT);
  pinMode(en_mot,INPUT);
  pinMode(speed_in,INPUT);  
  pinMode(step_x,INPUT);
  pinMode(step_y,INPUT);
  pinMode(dir_x,INPUT);
  pinMode(dir_y,INPUT);

  //Enable interruptions on pins D8 to D12 for the Step and Direction read
  PCICR |= (1 << PCIE0);    //enable PCMSK0 scan                                                 
  PCMSK0 |= (1 << PCINT0);  //Set pin D8 trigger an interrupt on state change. 
  PCMSK0 |= (1 << PCINT1);  //Set pin D9 trigger an interrupt on state change.                                             
  PCMSK0 |= (1 << PCINT2);  //Set pin D10 trigger an interrupt on state change. 
  PCMSK0 |= (1 << PCINT3);  //Set pin D11 trigger an interrupt on state change.                                               
  PCMSK0 |= (1 << PCINT4);  //Set pin D12 trigger an interrupt on state change.

  //Calculate the delay in order to control speed. 
  mm_per_step = (10/turns_per_cm)/steps_per_revolution;
  max_delay = min_speed*20000;
  min_delay = max_speed*23;
}

void loop() {
  //Read the analog input on A0 and map the delay between min an max delay for the speed
  int analog_in = analogRead(speed_in);
  DELAY = map(analog_in,0,1024,max_delay, min_delay);    
  RealSpeed = (1000000/DELAY)*mm_per_step;

  //Reset X distance alone
  if(digitalRead(reset_posx) && !digitalRead(reset_posy))
  {
    if(press_counter > 3)
    {
      step_count_x = 0;
      //step_count_y = 0;
      press_counter = 0;
    }
    press_counter = press_counter + 1;    
  }

  //Reset Y distance alone
  if(!digitalRead(reset_posx) && digitalRead(reset_posy))
  {
    if(press_counter > 3)
    {
      //step_count_x = 0;
      step_count_y = 0;
      press_counter = 0;
    }
    press_counter = press_counter + 1;    
  }
  
  //Reset both X and Y distance
  if(digitalRead(reset_posx) && digitalRead(reset_posy))
  {
    if(press_counter > 3)
    {
      step_count_x = 0;
      step_count_y = 0;
      press_counter = 0;
    }
    press_counter = press_counter + 1;    
  }

  //Calculate the distance by multiplying the steps by the distance made by each step
  mm_x = step_count_x * mm_per_step;
  mm_y = step_count_y * mm_per_step;
  unsigned long currentMillis = millis();  //Save current time
  //here each "refresh rate" we print the values on the LCD screen
  //We print spee, distance X and Y
  if(currentMillis - previousMillis >= refresh_rate){  
    previousMillis += refresh_rate;    
    /*PREVIOUS setup for 2 row LCD
    lcd.setCursor(6,0);
    lcd.print("      ");
    lcd.setCursor(7,0);
    lcd.print(RealSpeed,2);    //Print speed
    lcd.setCursor(2,1);
    lcd.print("      ");        
    lcd.setCursor(2,1);
    lcd.print(mm_x,2);        //Print distance made for X axis
    lcd.setCursor(10,1);
    lcd.print("      ");         //Print distance made for y axis
    lcd.setCursor(10,1);
    lcd.print(mm_y,2);         //Print distance made for y axis
    */

    //Print the distance and speed
    lcd.setCursor(0,1);
    lcd.print("X:                ");
    lcd.setCursor(2,1);
    lcd.print(mm_x,2);
    lcd.setCursor(18,1);
    lcd.print("mm");
    
    lcd.setCursor(0,2);
    lcd.print("Y:                ");
    lcd.setCursor(2,2);
    lcd.print(mm_y,2);
    lcd.setCursor(18,2);
    lcd.print("mm");
  
    lcd.setCursor(0,3);
    lcd.print("Speed:            ");
    lcd.setCursor(6,3);
    lcd.print(RealSpeed);
    lcd.setCursor(16,3);
    lcd.print("mm/s");
  }
}//End void loop



//interruption to detect steps for X and Y 
ISR(PCINT0_vect){

 
  if (!(PINB & B00000001)){                           //If enable is activated (EN is negative enabeled)
    
    if(PINB & B00000010 ){                            //If D9 is HIGH, motor turns right so we increase steps
      if(PINB & B00001000 ){                          //If D11 is high we have one step detected
        if(step_x_state == 0){
          step_x_state = 1;
          step_count_x = step_count_x + 1;            //Increase steps by 1          
        }        
      }
    
      else if(step_x_state == 1){                     //If D11 is LOW we have another step detected
        step_x_state = 0;
        step_count_x = step_count_x + 1;              //Increase steps by 1  
        }        
    }//X_up D9

    if (!(PINB & B00000010 )){                         //If D9 is LOW, motor turns left so we decrease steps
      if(PINB & B00001000 ){
        if(step_x_state == 0){
          step_x_state = 1;
          step_count_x = step_count_x - 1;             //Decrease steps by 1  
        }        
      }
    
      else if(step_x_state == 1){
        step_x_state = 0;
        step_count_x = step_count_x - 1;                //Decrease steps by 1  
        }        
    }//X_down D9





    //Now we do the same but for Y
    ////////////////////////Y////////////////////////        

    if(PINB & B00000100 ){
      if(PINB & B00010000 ){
        if(step_y_state == 0){
          step_y_state = 1;
          step_count_y = step_count_y + 1;        
        }        
      }
    
      else if(step_y_state == 1){
        step_y_state = 0;
        step_count_y = step_count_y + 1;        
        }        
    }//X_up D9

    if (!(PINB & B00000100 )){
      if(PINB & B00010000 ){
        if(step_y_state == 0){
          step_y_state = 1;
          step_count_y = step_count_y - 1;        
        }        
      }
    
      else if(step_y_state == 1){
        step_y_state = 0;
        step_count_y = step_count_y - 1;        
        }        
    }//X_down D9  
      
  
    

                     
   
  }//End EN enabled
  
}//End ISR

Мой скетч на 3 оси:

#include <LiquidCrystal_I2C.h>

/*
Code by: ELECTRONOOBS, 07/11/2018
Tutorial webpage: https://www.electronoobs.com/eng_arduino_tut48.php
Schematic: https://www.electronoobs.com/eng_arduino_tut48_sch1.php
Youtube channel: https://www.youtube.com/c/ELECTRONOOBS
*/



//Code for Arduino B (the Arduino with the LCD screen 20x4)
#include <Wire.h> //Downlaod this library here: https://www.electronoobs.com/eng_arduino_liq_crystal.php
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);  //sometimes the adress is not 0x3f. Change to 0x27 if it dosn't work!!

//Inputs or outputs
int reset_posx = 7;
int reset_posy = 6;
int reset_posz = 5;
int en_mot = 8;
int dir_x = 9;
int dir_y = 10;
int dir_z = 4;
int step_x = 11;
int step_y = 12;
int step_z = 3;
int speed_in = A0;


////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////EDITABLE VARIABELS//////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
float turns_per_cm = 3.5;             //This is the amount of turns your lead screw needs for one turn.
float steps_per_revolution = 200;   //This is the amount of steps the motor needs for one full rotation
float max_speed = 17;               //Speed in mm per second
float min_speed = 0.6;              //Speed in mm per second
int refresh_rate = 100;             //Each 100ms we print the values on the LCD screen
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////


//Other variables used in code
float DELAY = 0;
float RealSpeed = 0;
float mm_per_step = 0.007142;     //Initial value inc ase of 7 turns per cm and 200 steps per full rotatio
unsigned long previousMillis = 0; 
bool step_x_state = false;
bool step_y_state = false;
bool step_z_stale = false;
int step_count_x = 0;
int step_count_y = 0;
int step_count_z = 0;
float mm_x = 0;
float mm_y = 0;
float mm_z = 0;
float max_delay = 0;
float min_delay = 0;
int press_counter = 0;

void setup() {
  //Start the screen and print the ELECTRONOOBS logo
  lcd.init();
  lcd.backlight();
  lcd.setCursor(0,0);
  lcd.print("    XYZ v1.0    ");
  lcd.setCursor(0,1);
  lcd.print("                    ");
  lcd.setCursor(0,2);
  lcd.print("      Hello World      ");
  delay(1500);
  
  //Uncomment this part for the 16x2 LCD type. Also comment the part below for the LCD
  /* 
  lcd.setCursor(0,0);
  lcd.print("Speed:          ");
  lcd.setCursor(6,0);
  lcd.print(RealSpeed);
  lcd.setCursor(12,0);
  lcd.print("mm/s");
  lcd.setCursor(0,1);
  lcd.print("X:              ");
  lcd.setCursor(2,1);
  lcd.print(mm_x,2);
  lcd.setCursor(8,1);
  lcd.print("Y:              ");
  lcd.setCursor(10,1);
  lcd.print(mm_y,2);
  */
  //Print title, x, y and speed on the LCD screen
  lcd.setCursor(0,0);
  lcd.print("Z:              ");
  lcd.setCursor(2,0);
  lcd.print(mm_z,2);
  lcd.setCursor(18,0);
  lcd.print("mm");
    
  lcd.setCursor(0,1);
  lcd.print("X:              ");
  lcd.setCursor(2,1);
  lcd.print(mm_x,2);
  lcd.setCursor(18,1);
  lcd.print("mm");
  
  lcd.setCursor(0,2);
  lcd.print("Y:              ");
  lcd.setCursor(2,2);
  lcd.print(mm_y,2);
  lcd.setCursor(18,2);
  lcd.print("mm");

  lcd.setCursor(0,3);
  lcd.print("Speed:          ");
  lcd.setCursor(6,3);
  lcd.print(RealSpeed);
  lcd.setCursor(16,3);
  lcd.print("mm/s");

  //Define the pins as inputs
  pinMode(reset_posx,INPUT);
  pinMode(reset_posy,INPUT);
  pinMode(reset_posz,INPUT);
  pinMode(en_mot,INPUT);
  pinMode(speed_in,INPUT);  
  pinMode(step_x,INPUT);
  pinMode(step_y,INPUT);
  pinMode(step_z,INPUT);
  pinMode(dir_x,INPUT);
  pinMode(dir_y,INPUT);
  pinMode(dir_z,INPUT);

  //Enable interruptions on pins D8 to D12 for the Step and Direction read
  PCICR |= (1 << PCIE0);    //enable PCMSK0 scan                                                 
  PCMSK0 |= (1 << PCINT0);  //Set pin D8 trigger an interrupt on state change. 
  PCMSK0 |= (1 << PCINT1);  //Set pin D9 trigger an interrupt on state change.                                             
  PCMSK0 |= (1 << PCINT2);  //Set pin D10 trigger an interrupt on state change. 
  PCMSK0 |= (1 << PCINT3);  //Set pin D11 trigger an interrupt on state change.                                               
  PCMSK0 |= (1 << PCINT4);  //Set pin D12 trigger an interrupt on state change.
  PCMSK0 |= (1 << PCINT19);  //Set pin D3 trigger an interrupt on state change.
  PCMSK0 |= (1 << PCINT20);  //Set pin D4 trigger an interrupt on state change.

  //Calculate the delay in order to control speed. 
  mm_per_step = (10/turns_per_cm)/steps_per_revolution;
  max_delay = min_speed*20000;
  min_delay = max_speed*23;
}

void loop() {
  //Read the analog input on A0 and map the delay between min an max delay for the speed
  int analog_in = analogRead(speed_in);
  DELAY = map(analog_in,0,1024,max_delay, min_delay);    
  RealSpeed = (1000000/DELAY)*mm_per_step;

  //Reset X distance alone
  if(digitalRead(reset_posx) && !digitalRead(reset_posy) && !digitalRead(reset_posz))
  {
    if(press_counter > 3)
    {
      step_count_x = 0;
      //step_count_y = 0;
      //step_count_z = 0;
      press_counter = 0;
    }
    press_counter = press_counter + 1;    
  }
  //Reset Z distance alone
  if(digitalRead(reset_posz) && !digitalRead(reset_posy) && !digitalRead(reset_posx))
  {
    if(press_counter > 3)
    {
      step_count_z = 0;
      //step_count_y = 0;
      //step_count_x = 0;
      press_counter = 0;
    }
    press_counter = press_counter + 1;    
  }

  //Reset Y distance alone
  if(!digitalRead(reset_posx) && digitalRead(reset_posy) && digitalRead(reset_posz))
  {
    if(press_counter > 3)
    {
      //step_count_x = 0;
      //step_count_z = 0;
      step_count_y = 0;
      press_counter = 0;
    }
    press_counter = press_counter + 1;    
  }
  
  //Reset both X and Y and Z distance
  if(digitalRead(reset_posx) && digitalRead(reset_posy) && digitalRead(reset_posz))
  {
    if(press_counter > 3)
    {
      step_count_x = 0;
      step_count_y = 0;
      step_count_z = 0;
      press_counter = 0;
    }
    press_counter = press_counter + 1;    
  }

  //Calculate the distance by multiplying the steps by the distance made by each step
  mm_x = step_count_x * mm_per_step;
  mm_y = step_count_y * mm_per_step;
  mm_z = step_count_z * mm_per_step;
  unsigned long currentMillis = millis();  //Save current time
  //here each "refresh rate" we print the values on the LCD screen
  //We print spee, distance X and Y and Z
  if(currentMillis - previousMillis >= refresh_rate){  
    previousMillis += refresh_rate;    
    /*PREVIOUS setup for 2 row LCD
    lcd.setCursor(6,0);
    lcd.print("      ");
    lcd.setCursor(7,0);
    lcd.print(RealSpeed,2);    //Print speed
    lcd.setCursor(2,1);
    lcd.print("      ");        
    lcd.setCursor(2,1);
    lcd.print(mm_x,2);        //Print distance made for X axis
    lcd.setCursor(10,1);
    lcd.print("      ");         //Print distance made for y axis
    lcd.setCursor(10,1);
    lcd.print(mm_y,2);         //Print distance made for y axis
    */

    //Print the distance and speed
    lcd.setCursor(0,0);
    lcd.print("Z:                ");
    lcd.setCursor(2,0);
    lcd.print(mm_z,2);
    lcd.setCursor(18,0);
    lcd.print("mm");

    lcd.setCursor(0,1);
    lcd.print("X:                ");
    lcd.setCursor(2,1);
    lcd.print(mm_x,2);
    lcd.setCursor(18,1);
    lcd.print("mm");
    
    lcd.setCursor(0,2);
    lcd.print("Y:                ");
    lcd.setCursor(2,2);
    lcd.print(mm_y,2);
    lcd.setCursor(18,2);
    lcd.print("mm");
  
    lcd.setCursor(0,3);
    lcd.print("S:            ");
    lcd.setCursor(2,3);
    lcd.print(RealSpeed);
    lcd.setCursor(16,3);
    lcd.print("mm/s");
  }
}//End void loop



//interruption to detect steps for X and Y
ISR(PCINT0_vect){

 
  if (!(PINB & B00000001)){                           //If enable is activated (EN is negative enabeled)
    
    if(PINB & B00000010 ){                            //If D9 is HIGH, motor turns right so we increase steps
      if(PINB & B00001000 ){                          //If D11 is high we have one step detected
        if(step_x_state == 0){
          step_x_state = 1;
          step_count_x = step_count_x + 1;            //Increase steps by 1          
        }        
      }
    
      else if(step_x_state == 1){                     //If D11 is LOW we have another step detected
        step_x_state = 0;
        step_count_x = step_count_x + 1;              //Increase steps by 1  
        }        
    }//X_up D9

    if (!(PINB & B00000010 )){                         //If D9 is LOW, motor turns left so we decrease steps
      if(PINB & B00001000 ){
        if(step_x_state == 0){
          step_x_state = 1;
          step_count_x = step_count_x - 1;             //Decrease steps by 1  
        }        
      }
    
      else if(step_x_state == 1){
        step_x_state = 0;
        step_count_x = step_count_x - 1;                //Decrease steps by 1  
        }        
    }//X_down D9





    //Now we do the same but for Y
    ////////////////////////Y////////////////////////        

    if(PINB & B00000100 ){
      if(PINB & B00010000 ){
        if(step_y_state == 0){
          step_y_state = 1;
          step_count_y = step_count_y + 1;        
        }        
      }
    
      else if(step_y_state == 1){
        step_y_state = 0;
        step_count_y = step_count_y + 1;        
        }        
    }//X_up D9

    if (!(PINB & B00000100 )){
      if(PINB & B00010000 ){
        if(step_y_state == 0){
          step_y_state = 1;
          step_count_y = step_count_y - 1;        
        }        
      }
    
      else if(step_y_state == 1){
        step_y_state = 0;
        step_count_y = step_count_y - 1;        
        }        
    }//X_down D9  
      


  //Now we do the same but for Z
    ////////////////////////Z////////////////////////        

    if(PIND & B00001000 ){
      if(PIND & B00010000 ){
        if(step_z_state == 0){
          step_z_state = 1;
          step_count_z = step_count_z + 1;        
        }        
      }
    
      else if(step_z_state == 1){
        step_z_state = 0;
        step_count_z = step_count_z + 1;        
        }        
    }//X_up D9

    if (!(PIND & B00001000 )){
      if(PIND & B00010000 ){
        if(step_z_state == 0){
          step_z_state = 1;
          step_count_z = step_count_z - 1;        
        }        
      }
    
      else if(step_z_state == 1){
        step_z_state = 0;
        step_count_z = step_count_z - 1;        
        }        
    }//X_down D9  
    

                     
   
  }//End EN enabled
  
}//End ISR

 

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

Ra3eR пишет:
Если с ардуино А сложностей не возникло, то вот с ардуино Б, что выполняет
роль устройства цифровой индикации(уци dro) Возникли проблемы.

Позвольте узнать, каков призовой фонд конкурса на угадывание какие именно проблемы у Вас возникли?

Ra3eR пишет:
Подскажите пожалуйста, что я делаю не так?

Вы не так задаёте вопрос на форуме.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

да вроде правильно поставлен )))
Этот гвоздь не в ту стену, почитай как надо использовать прерывания на выбранных тобой пинах...

Ra3eR
Offline
Зарегистрирован: 01.08.2016

Уже разобрался. Не понял, почему форум исковеркал некоторые мои слова) Мне просто нужен был свежий взгляд на мой скетч и проверка, все ли я правильно написал в скетче.

Ra3eR
Offline
Зарегистрирован: 01.08.2016

Спасибо, почитаю) В идеале хочется доработать проект, так как он по сути уникальный.(про ардуино grbl знаю, но это не то) Уникальность в том, что можно управлять шаговиками и видеть какое они прошли расстояние, вперед или назад(примитивное уци\dro) Мне на ютубе, да и в интернете в целом, это устройство попадалось только 2 раза. Второй подобный проект супер, там сразу 3 оси и все управляется с одной ардуино нано, но его автор за 5лет, так и не захотел делиться скетчем. Я бы тоже в идеале хотел уместить все на одной ардуинке, но пока не хватает знаний)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Ra3eR пишет:

Уже разобрался. Не понял, почему форум исковеркал некоторые мои слова) Мне просто нужен был свежий взгляд на мой скетч и проверка, все ли я правильно написал в скетче.

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

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

Ra3eR
Offline
Зарегистрирован: 01.08.2016

Линейки есть, но сверлить станок для их монтажа жалко) Да и сидел, думал. Точность в десятки-сотки, это конечно хорошо, но нужна ли она такая точность в хоббийном станке, для меня достаточно точности до +-1мм. Там где будет нужна высокая точность, на мой взгляд лучше использовать чпу. То есть с ручного контроллера переключиться на контроллер с подключением к компу. А так тема народного уци/dro на чипмейкере мне понравилась, но понял что для меня это избыточно. Кстати, а реально ли для измерения использовать не линейки, а именно энкодеры? Я что-то пытался на эту тему гуглить, но толком ничего интересного не нашёл.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

я не в теме, о станочке только подумываю, пока некуда даже поставить, но уно с шилдом драйверов для 4-х осей есть )))
Тут на форуме в проектах Генератор для катушки Мишина моя тема, но код на заимствованиях

Да, если сам не одолеешь, что навряд ли, то чем смогу помогу с твоим модифицированным скетчем

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

Постоянное чтение одних и и тех же битов одного и того же регистров в рамках одного блока принятия решений навряд ли может быть хорошей идеей. Между двумя вызовами if() вход/бит может значение и поменять.

Ra3eR
Offline
Зарегистрирован: 01.08.2016

Если будешь обрабатывать чермет, то A4988/drv8825 не подойдут, нужны более серьёзные шаговики (минимум nema23, а лучше 34), соответственно и драйвера. По причине того, что бы там добиться высокой точности обработки на среднем съёме металла, нужно клинья затягивать сильнее, тогда биения минимизируются(справедливо на китайских мелких фрезерах) , nema 17 не потянет. Хотя макетку отстраиваю на A4988 и nema 17) Сегодня буду скетчи на 3 оси заливать и тестировать, если все будет нормально, то буду уже тестировать на DM860 и nema 34. Если всё будет нормально, то плату надо будет разводить. После этого проекта, хочу реализовать электронную гитару для токарника) Потом скорее всего займусь чпу.

Ra3eR
Offline
Зарегистрирован: 01.08.2016

А не встречались проекты с более лучшей реализацией? Это просто мой первый более менее сложный проект для повторения.

-NMi-
Offline
Зарегистрирован: 20.08.2018

Вопрос: а зачем одной дуней управлять а второй дуней считать то, что "науправляла" первая???  Не проще ли взять БОЛЬШУЮ дуню (2560) и всё сделать в одном флаконе???

Ra3eR
Offline
Зарегистрирован: 01.08.2016

Вопрос хороший) Но на самом деле используя 2560, профит не сильно лучше будет, она дороже двух нано, да и по размерам будет +- тоже самое. В идеале хотелось вот так https://www.youtube.com/watch?v=iVYIXzO6UtI&t=80s

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

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

-NMi-
Offline
Зарегистрирован: 20.08.2018

Причём здесь дороже/дешевле?  Один шаговик нормальный всё перекроет нафиг по цене)))

Ну тогда-уж надо совсем извратицца - на кажду ось по дурдуине(328) и связать их в "кольцо" по uart или spi да и дело в шляпе... )))

PS: очень херовый подход, только на уровень = лапти в руки и попёр подходит.

Ra3eR
Offline
Зарегистрирован: 01.08.2016

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

-NMi-
Offline
Зарегистрирован: 20.08.2018

Ra3eR пишет:
Сегодня буду скетчи на 3 оси заливать и тестировать, если все будет нормально, то буду уже тестировать на DM860 и nema 34.

А что "потянет" привод "руки" длиной ~2 метра и грузом на конце ~100 кг. Шаговик нужен обязательно со встроенным энкодером и редуктором. Есть что на примете? Желательно 48 Вольт питание.

Ra3eR
Offline
Зарегистрирован: 01.08.2016

Писать все с 0, у меня знаний пока не хватает) Максимум хватило чуть улучшить готовое)

Ra3eR
Offline
Зарегистрирован: 01.08.2016

У меня такой комплект https://ru.aliexpress.com/item/32923051981.html?spm=a2g0s.9042311.0.0.1b2d33edojgc7w Более мощное или лучшее для китайского станка (jet x1l) не вижу смысла брать.

-NMi-
Offline
Зарегистрирован: 20.08.2018

Ra3eR пишет:

Писать все с 0, у меня знаний пока не хватает) Максимум хватило чуть улучшить готовое)

Дык вот в этом-то и весь прикол и заключается. Когда ты берёшь НЕ СВОЁ и тупо копируешь и радуешься как оно работает - это "круто"!  Но как только возникает необходимость что-то изменить - всё, ступор, сопли, форум.  Вот она разница колхозника и инженера.  Первый скопирует а второй только посмотрит, но сделает всё САМ!!!

-NMi-
Offline
Зарегистрирован: 20.08.2018

Ra3eR пишет:

У меня такой комплект https://ru.aliexpress.com/item/32923051981.html?spm=a2g0s.9042311.0.0.1b2d33edojgc7w Более мощное или лучшее для китайского станка (jet x1l) не вижу смысла брать.

Спасибо, но, думаю, что для моих хотелок это слишком мало.  Мне минимум 500Вт. шаговики нужны.

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

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

-NMi-
Offline
Зарегистрирован: 20.08.2018

Там вообще можно АППАРАТНО на интах сделать один шаговик + один дисплей + что ещё осталось из ног на 328 меге. Надо попробовать, железо где-то валяется.

Меня больше интересует есть ли готовые шаблоны для распарсивания по всем осям до какого-либо ПРОМЫШЛЕННОГО стандарта. Вот в чём весь цимус. Сделать-то не проблема, тока вопрос - как и с чем это будет совместимо?

Ra3eR
Offline
Зарегистрирован: 01.08.2016

Согласен, но начинать тоже с чего то надо) Пусть сперва будет колхозинг.

Ra3eR
Offline
Зарегистрирован: 01.08.2016

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

сломать ардуино скетчем теоретически может быть и можно, но это навряд ли )))

 

Ra3eR
Offline
Зарегистрирован: 01.08.2016

Я просто добавлял прерывание на порте д. Точнее опрос с него PinD. Так как для оси Z мне пришлось задействовать выводы D3 и D4. А в примере на этом сайте говорилось, что можно при не правильном обращении к этому порту, отключить tx rx (d0, d1) на ардуино. Попробовал залить скетчи, X и Y работает нормально, а вот Z не очень. При нажатии кнопок отвечающих за эту ось, движения не происходит, но при нажатии кнопок отвечающих за движение на оси Х, шаговик на оси Z совершает тоже самые движения. Что хуже всего, показания на Z при этом не изменяются.

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

ua6em пишет:

сломать ардуино скетчем теоретически может быть и можно, но это навряд ли )))

Легко!

По крайней мере, китайскую нанку на ch340 - как два пальца.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Ворота пишет:

ua6em пишет:

сломать ардуино скетчем теоретически может быть и можно, но это навряд ли )))

Легко!

По крайней мере, китайскую нанку на ch340 - как два пальца.

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Ra3eR пишет:
Я просто добавлял прерывание на порте д. Точнее опрос с него PinD. Так как для оси Z мне пришлось задействовать выводы D3 и D4. А в примере на этом сайте говорилось, что можно при не правильном обращении к этому порту, отключить tx rx (d0, d1) на ардуино. Попробовал залить скетчи, X и Y работает нормально, а вот Z не очень. При нажатии кнопок отвечающих за эту ось, движения не происходит, но при нажатии кнопок отвечающих за движение на оси Х, шаговик на оси Z совершает тоже самые движения. Что хуже всего, показания на Z при этом не изменяются.

неправильно это:

PCMSK0 |= (1 << PCINT19);  //Set pin D3 trigger an interrupt on state change
PCMSK0 |= (1 << PCINT20);  //Set pin D4 trigger an interrupt on state change.

должно быть:

PCMSK2 |= (1 << PCINT19);  //Set pin D3 trigger an interrupt on state change
PCMSK2 |= (1 << PCINT20);  //Set pin D4 trigger an interrupt on state change.

ну и далее выделять их в обработчик прерывания  

ISR (PCINT2_vect) { // Обработчик запросов прерывания от пинов D0..D7
  // Обработка аналогична PCINT0_vect, только изменить на PIND, oldPIND, PDx
}


 

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

Ra3eR пишет:

Согласен, но начинать тоже с чего то надо) Пусть сперва будет колхозинг.

Но скорее будет не колхозник , а сусанинг. Это когда глянишь на код и понимаешь что наркота это жесть.

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

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

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

qwone пишет:

Ra3eR пишет:

Согласен, но начинать тоже с чего то надо) Пусть сперва будет колхозинг.

Но скорее будет не колхозник , а сусанинг. Это когда глянишь на код и понимаешь что наркота это жесть.

да ну! ... слюнные железы  и надпочечники как раз этот пряник вырабатывают )))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

qwone пишет:

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

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

не, это жеж не по даташиту

Ra3eR
Offline
Зарегистрирован: 01.08.2016

Спасибо. PCMSK поправил на 2. А вот ISR (PCINT2_vect) не добавил)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Ra3eR пишет:

Спасибо. PCMSK поправил на 2. А вот ISR (PCINT2_vect) не добавил)

ну так его надо писать, кто-то же должен прерывание обрабатывать

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

qwone пишет:

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

Ничего ему не сделается. Суммарный ток будет 5мА - с чего ему накрываться?

ua6em пишет:
надеялся, что в атмеге эти косяки ликвидировали

Вы не с той стороны подходите. Причём тут атмега вообще, мы же про ардуину говорим, а не про атмегу. Подумайте как сыграть на связи МК с CH340.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

qwone пишет:

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

Ничего ему не сделается. Суммарный ток будет 5мА - с чего ему накрываться?

ua6em пишет:
надеялся, что в атмеге эти косяки ликвидировали

Вы не с той стороны подходите. Причём тут атмега вообще, мы же про ардуину говорим, а не про атмегу. Подумайте как сыграть на связи МК с CH340.

настроить на выход оба чипа и на одном выставить 1 на другом 0 )))

Ну это прогнозируемое поведение, а вот не прогнозируемое?

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

ua6em пишет:

Ну это прогнозируемое поведение, а вот не прогнозируемое?

Вы высказывали сомнение в том, что ардуину можно сломать скетчем. Я Вам показал как. Насчёт "прогнозируемости" в условии задачи ничего не было.

Да, и "прогнозируемое" - понятие неопределённое - для кого как. Вы электронщик - для Вас прогнозируемое, а я - программист, и моя первая нанка отправилась в страну чистой Gnd именно таким образом :-)

Ra3eR
Offline
Зарегистрирован: 01.08.2016

Хех, у меня 2 нано с одним A4988 померли на этапе макетирования оригинального проекта на 2 оси. Первый раз из-за того что пренебрег конденсатором на vmot и gnd драйвера шаговика при запитывании драйвера и ардуино от одного источника питания. Второй раз, когда пытался понять почему при отсутствии сигналов на выводах драйвера enable, step и dir, шаговики сами по себе вращаются. Нечаянно замкнул землю на vcc. Если нано на ch340 не так жалко, то вот на ftdi232 , было жаль. Поэтому про скетч и спросил) Хватило аппаратных умерщвлений, не хотелось бы ещё добавить программных)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

я пока еще не за три года не спалил ни одной, хотя подкидываю сигналы довольно смело, не снимая питания )))

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

ua6em пишет:

я пока еще не за три года не спалил ни одной, хотя подкидываю сигналы довольно смело, не снимая питания )))

Я вот тоже с AVR расслабился, а как попытался что-то сделать с Due, на 3-й день спалил один из аналоговых выходов.

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andriano пишет:

Я вот тоже с AVR расслабился, а как попытался что-то сделать с Due, на 3-й день спалил один из аналоговых выходов.

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

DUE у меня валяется где-то, взял на стадии знакомства с ардуино позарившись на тактовую частоту, применения пока не нашлось, цап юзаю внешний, довольно надёжное устройство (MCP4725)

Ra3eR
Offline
Зарегистрирован: 01.08.2016

Подскажите пожалуйста) Что за фигня может быть:

1) Аппаратная проблема, при нажатии кнопок управления шаговиками (х+х-з+з-) Шаговики то крутится, а то вообще не реагируют, хотя подключение на макетки осталось прежним, вместо оси у подключил на З. Кстати обратил внимание, что если взяться за край макетки, то шаговики начинают вращаться. Но появляется дребезг на шаговике З, начинает произвольно немного крутиться, может ли это быть из-за того, что кнопки подключил к аналоговой линии A1 и A2 ? Скетч ардуино А:

//Code for Arduino A (the Arduino with the motors)

//Inputs and outputs
int en_mot = 12;
int step_x = 2;
int step_y = 3;
int step_z = 4;
int dir_x = 5;
int dir_y = 6;
int dir_z = 7;
int x_up = 8;
int x_down = 9;
int y_up = 10;
int y_down = 11;
int z_up = A2;
int z_down = A1;
int speed_in = A0;

////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////EDITABLE VARIABELS//////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
float turns_per_cm = 3.5;             //This is the amount of turns your lead screw needs for oen turn.
float steps_per_revolution = 200;   //This is the amount of steps the motor needs for one full rotation
float max_speed = 16;               //Speed in mm per second
float min_speed = 0.6;              //Speed in mm per second
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////



//Other variables
float mm_per_step = 0.007142;     //Initial value inc ase of 7 turns per cm and 200 steps per full rotatio
float pos_x = 0;
float pos_y = 0;
float pos_z = 0;
float DELAY = 0;
float RealSpeed = 0;
unsigned long previousMillis = 0; 
bool step_x_status = false;
bool step_y_status = false;
bool step_z_status = false;
float max_delay = 0;
float min_delay = 0;



void setup() {  
  //Define the pins as inputs or outputs
  pinMode(en_mot,INPUT);
  pinMode(x_up,INPUT);
  pinMode(x_down,INPUT);
  pinMode(y_up,INPUT);
  pinMode(y_down,INPUT);
  pinMode(z_up,INPUT);
  pinMode(z_down,INPUT);
  pinMode(speed_in,INPUT);  
  pinMode(step_x,OUTPUT);
  pinMode(step_y,OUTPUT);
  pinMode(step_z,OUTPUT);
  pinMode(dir_x,OUTPUT);
  pinMode(dir_y,OUTPUT);
  pinMode(dir_z,OUTPUT);  
  //Calculate the delay for the speed control
  mm_per_step = (10/turns_per_cm)/steps_per_revolution;
  max_delay = min_speed*20000;
  min_delay = max_speed*23;
}

void loop() {
  //Read the analog input of A0 and create the speed delay
  int analog_in = analogRead(speed_in);
  DELAY = map(analog_in,0,1024,max_delay, min_delay);    
  RealSpeed = (1000000/DELAY)*mm_per_step;
  
  //Move X up
  if(digitalRead(x_up) && !digitalRead(x_down) && !digitalRead(y_up) && !digitalRead(y_down) && !analogRead(z_up) && !analogRead(z_down) && !digitalRead(en_mot))
  {
    step_x_status = !step_x_status;
    digitalWrite(dir_x,HIGH);   //CW
    digitalWrite(step_x,step_x_status);
    delayMicroseconds(DELAY); 
    pos_x = pos_x + mm_per_step;  
  }

  //Move X down
   if(!digitalRead(x_up) && digitalRead(x_down) && !digitalRead(y_up) && !digitalRead(y_down) && !analogRead(z_up) && !analogRead(z_down) && !digitalRead(en_mot))
  {
    step_x_status = !step_x_status;
    digitalWrite(dir_x,LOW);   //CCW
    digitalWrite(step_x,step_x_status);
    delayMicroseconds(DELAY);    
    pos_x = pos_x - mm_per_step; 
  }
  
//Move Z up
  if(!digitalRead(x_up) && !digitalRead(x_down) && !digitalRead(y_up) && !digitalRead(y_down) && analogRead(z_up) && !analogRead(z_down) && !digitalRead(en_mot))
  {
    step_z_status = !step_z_status;
    digitalWrite(dir_z,HIGH);   //CW
    digitalWrite(step_z,step_z_status);
    delayMicroseconds(DELAY); 
    pos_z = pos_z + mm_per_step;  
  }
  
  //Move Z down
   if(!digitalRead(x_up) && !digitalRead(x_down) && !digitalRead(y_up) && !digitalRead(y_down) && !analogRead(z_up) && analogRead(z_down) && !digitalRead(en_mot))
  {
    step_z_status = !step_z_status;
    digitalWrite(dir_z,LOW);   //CCW
    digitalWrite(step_z,step_z_status);
    delayMicroseconds(DELAY);    
    pos_z = pos_z - mm_per_step;
    
  }
  //Move Y up
  if(!digitalRead(x_up) && !digitalRead(x_down) && digitalRead(y_up) && !digitalRead(y_down) && !analogRead(z_up) && !analogRead(z_down) && !digitalRead(en_mot))
  {
    step_y_status = !step_y_status;
    digitalWrite(dir_y,HIGH);   //CW
    digitalWrite(step_y,step_y_status);
    delayMicroseconds(DELAY);   
    pos_y = pos_y + mm_per_step;
    
  }

  //Move Y down
  if(!digitalRead(x_up) && !digitalRead(x_down) && !digitalRead(y_up) && digitalRead(y_down) && !analogRead(z_up) && !analogRead(z_down) && !digitalRead(en_mot))
  {
    step_y_status = !step_y_status;
    digitalWrite(dir_y,LOW);   //CCW
    digitalWrite(step_y,step_y_status);
    delayMicroseconds(DELAY);  
    pos_y = pos_y - mm_per_step;
    
  }

  

  //Move X up and Y up and Z up
  if(digitalRead(x_up) && !digitalRead(x_down) && digitalRead(y_up) && !digitalRead(y_down) && analogRead(z_up) && !analogRead(z_down) && !digitalRead(en_mot))
  {
    step_x_status = !step_x_status;
    step_y_status = !step_y_status;
    step_z_status = !step_z_status;
    digitalWrite(dir_x,HIGH);   //CW
    digitalWrite(dir_y,HIGH);   //CW
    digitalWrite(dir_z,HIGH);   //CW
    digitalWrite(step_x,step_x_status);
    digitalWrite(step_y,step_y_status);
    digitalWrite(step_z,step_z_status);
    delayMicroseconds(DELAY);    
    pos_x = pos_x + mm_per_step;    
    pos_y = pos_y + mm_per_step; 
    pos_z = pos_z + mm_per_step; 
  }

  //Move X up and Y down and Z down
  if(digitalRead(x_up) && !digitalRead(x_down) && !digitalRead(y_up) && digitalRead(y_down) &&  !analogRead(z_up) && analogRead(z_down) && !digitalRead(en_mot))
  {
    step_x_status = !step_x_status;
    step_y_status = !step_y_status;
    step_z_status = !step_x_status;
    digitalWrite(dir_x,HIGH);   //CW
    digitalWrite(dir_y,LOW);   //CCW
    digitalWrite(dir_z,LOW);   //CCW
    digitalWrite(step_x,step_x_status);
    digitalWrite(step_y,step_x_status);
    digitalWrite(step_z,step_z_status);
    delayMicroseconds(DELAY);
    pos_x = pos_x + mm_per_step;    
    pos_y = pos_y - mm_per_step;  
    pos_z = pos_z - mm_per_step;   
  }
  //Move X down and Y down and Z up
  if(!digitalRead(x_up) && digitalRead(x_down) && !digitalRead(y_up) && digitalRead(y_down) &&  analogRead(z_up) && !analogRead(z_down) && !digitalRead(en_mot))
  {
    step_x_status = !step_x_status;
    step_y_status = !step_y_status;
    step_z_status = !step_x_status;
    digitalWrite(dir_x,LOW);   //CCW
    digitalWrite(dir_y,LOW);   //CCW
    digitalWrite(dir_z,HIGH);   //CW
    digitalWrite(step_x,step_x_status);
    digitalWrite(step_y,step_x_status);
    digitalWrite(step_z,step_z_status);
    delayMicroseconds(DELAY);
    pos_x = pos_x - mm_per_step;    
    pos_y = pos_y - mm_per_step;  
    pos_z = pos_z + mm_per_step;   
  }

  //Move X down and Y up and Z down
  if(!digitalRead(x_up) && digitalRead(x_down) && digitalRead(y_up) && !digitalRead(y_down) &&  !analogRead(z_up) && analogRead(z_down) && !digitalRead(en_mot))
  {
    step_x_status = !step_x_status;
    step_y_status = !step_y_status;
    step_z_status = !step_x_status;
    digitalWrite(dir_x,LOW);   //CCW
    digitalWrite(dir_y,HIGH);   //CCW
    digitalWrite(dir_z,LOW);   //CW
    digitalWrite(step_x,step_x_status);
    digitalWrite(step_y,step_x_status);
    digitalWrite(step_z,step_z_status);
    delayMicroseconds(DELAY);
    pos_x = pos_x - mm_per_step;    
    pos_y = pos_y + mm_per_step;  
    pos_z = pos_z - mm_per_step;   
  }

  //Move X down and Y down and Z down
  if(!digitalRead(x_up) && digitalRead(x_down) && !digitalRead(y_up) && digitalRead(y_down) && !analogRead(z_up) && analogRead(z_down) && !digitalRead(en_mot))
  {
    step_x_status = !step_x_status;
    step_y_status = !step_y_status;
    step_z_status = !step_z_status;
    digitalWrite(dir_x,LOW);   //CCW
    digitalWrite(dir_y,LOW);   //CCW
    digitalWrite(dir_z,LOW);   //CCW
    digitalWrite(step_x,step_x_status);
    digitalWrite(step_y,step_y_status);
    digitalWrite(step_z,step_x_status);
    delayMicroseconds(DELAY);
    pos_x = pos_x - mm_per_step;    
    pos_y = pos_y - mm_per_step;  
    pos_z = pos_z - mm_per_step;
  }

  //Move X down and Y up and Z up
   if(!digitalRead(x_up) && digitalRead(x_down) && digitalRead(y_up) && !digitalRead(y_down) && analogRead(z_up) && !analogRead(z_down) && !digitalRead(en_mot))
  {
    step_x_status = !step_x_status;
    step_y_status = !step_y_status;
    step_z_status = !step_z_status;
    digitalWrite(dir_x,LOW);    //CCW
    digitalWrite(dir_y,HIGH);   //CW
    digitalWrite(dir_z,HIGH);   //CW
    digitalWrite(step_x,step_x_status);
    digitalWrite(step_y,step_y_status);  
    digitalWrite(step_z,step_z_status);  
    delayMicroseconds(DELAY);
    pos_x = pos_x - mm_per_step;    
    pos_y = pos_y + mm_per_step; 
    pos_z = pos_z + mm_per_step; 
  }

  //Move X up and Y down and Z up
   if(digitalRead(x_up) && !digitalRead(x_down) && !digitalRead(y_up) && digitalRead(y_down) && analogRead(z_up) && !analogRead(z_down) && !digitalRead(en_mot))
  {
    step_x_status = !step_x_status;
    step_y_status = !step_y_status;
    step_z_status = !step_z_status;
    digitalWrite(dir_x,HIGH);    //CCW
    digitalWrite(dir_y,LOW);   //CW
    digitalWrite(dir_z,HIGH);   //CW
    digitalWrite(step_x,step_x_status);
    digitalWrite(step_y,step_y_status);  
    digitalWrite(step_z,step_z_status);  
    delayMicroseconds(DELAY);
    pos_x = pos_x + mm_per_step;    
    pos_y = pos_y - mm_per_step; 
    pos_z = pos_z + mm_per_step; 
  }
}//end of void loop

2) Почему при работе оси З не происходит изменения показаний?

//Code for Arduino B (the Arduino with the LCD screen 20x4)
#include <Wire.h> //Downlaod this library here: https://www.electronoobs.com/eng_arduino_liq_crystal.php
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);  //sometimes the adress is not 0x3f. Change to 0x27 if it dosn't work!!

//Inputs or outputs
int reset_posx = 7;
int reset_posy = 6;
int reset_posz = 5;
int en_mot = 8;
int dir_x = 9;
int dir_y = 10;
int dir_z = 4;
int step_x = 11;
int step_y = 12;
int step_z = 3;
int speed_in = A0;

//interruption to detect steps for X and Y
ISR(PCINT0_vect){

 
  if (!(PINB & B00000001)){                           //If enable is activated (EN is negative enabeled)
    
    if(PINB & B00000010 ){                            //If D9 is HIGH, motor turns right so we increase steps
      if(PINB & B00001000 ){                          //If D11 is high we have one step detected
        if(step_x_state == 0){
          step_x_state = 1;
          step_count_x = step_count_x + 1;            //Increase steps by 1          
        }        
      }
    
      else if(step_x_state == 1){                     //If D11 is LOW we have another step detected
        step_x_state = 0;
        step_count_x = step_count_x + 1;              //Increase steps by 1  
        }        
    }//X_up D9

    if (!(PINB & B00000010 )){                         //If D9 is LOW, motor turns left so we decrease steps
      if(PINB & B00001000 ){
        if(step_x_state == 0){
          step_x_state = 1;
          step_count_x = step_count_x - 1;             //Decrease steps by 1  
        }        
      }
    
      else if(step_x_state == 1){
        step_x_state = 0;
        step_count_x = step_count_x - 1;                //Decrease steps by 1  
        }        
    }//X_down D9





    //Now we do the same but for Y
    ////////////////////////Y////////////////////////        

    if(PINB & B00000100 ){
      if(PINB & B00010000 ){
        if(step_y_state == 0){
          step_y_state = 1;
          step_count_y = step_count_y + 1;        
        }        
      }
    
      else if(step_y_state == 1){
        step_y_state = 0;
        step_count_y = step_count_y + 1;        
        }        
    }//X_up D9

    if (!(PINB & B00000100 )){
      if(PINB & B00010000 ){
        if(step_y_state == 0){
          step_y_state = 1;
          step_count_y = step_count_y - 1;        
        }        
      }
    
      else if(step_y_state == 1){
        step_y_state = 0;
        step_count_y = step_count_y - 1;        
        }        
    }//X_down D9  
      
    
  }//End EN enabled
  
}//End ISR

      
ISR(PCINT2_vect){

    if (!(PINB & B00000001)){ 


  //Now we do the same but for Z
    ////////////////////////Z////////////////////////        

    if(PIND & B00010000 ){
      if(PIND & B00001000 ){
        if(step_z_state == 0){
          step_z_state = 1;
          step_count_z = step_count_z + 1;        
        }        
      }
    
      else if(step_z_state == 1){
        step_z_state = 0;
        step_count_z = step_count_z + 1;        
        }        
    }//X_up D9

    if (!(PIND & B00010000 )){
      if(PIND & B00001000 ){
        if(step_z_state == 0){
          step_z_state = 1;
          step_count_z = step_count_z - 1;        
        }        
      }
    
      else if(step_z_state == 1){
        step_z_state = 0;
        step_count_z = step_count_z - 1;        
        }        
    }//X_down D9  
    

                     
   
  }//End EN enabled
  
}//End ISR

 

Ra3eR
Offline
Зарегистрирован: 01.08.2016

А вообще корректно использовать analogRead для оси Z или лучше обращаться к аналоговым выводам как к цифровым d15,d16?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

нет!

Владимир! Почитай ссылку, что я давал.
Меня смущает сильно строка 96, проверяешь ты её в обработчике второго ISR, а она от обработчика нулевого ISR.
Сдаётся мне надо всё переводить на пины ISR2

Ra3eR
Offline
Зарегистрирован: 01.08.2016

Что именно нет?) Нет не использовать analogRead для кнопок оси Z или нет, не назначать аналоговые выводы цифровыми?)
Прерывание это, мне тоже не нравится, но оно идёт основным условием. Я бы вообще отказался от тумблера enable step. Толку от него не так уж и много, все равно "уци" не будет работать с отключенными шаговиками, чтобы вручную крутить лимбы, проще всё полностью обесточить. Тогда можно будет выжать два пина в порте B. D8 и D13(на последнем правда надо светодиод отрезать с резистором. А так, если всё перекинуть в порт д, то там тоже не хватит выводов. Как вариант, попробую убрать обращение в порте Д к выводу enable или сделаю костыль, запараллелив вывод enable с порта В с выводом на порте Д в isr(pcint2_vect) буду обращаться к нему.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

если ты будешь читать с аналогового пина, то у тебя всегда будет 1 )))

Использовать его естественно надо как цифровой

Ra3eR
Offline
Зарегистрирован: 01.08.2016

Понял) Спасибо. Сейчас переделаю) Блин наконец-то клаву на ноуте поменял) А то бесило некоторые буквы писать через копипейст, в принципе это не единственная проблема, ещё и пара разных символов вводилось при нажатии на одну кнопку, скетчи править, то ещё удовольствие))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Ra3eR пишет:

Понял) Спасибо. Сейчас переделаю) Блин наконец-то клаву на ноуте поменял)

ноутов должно быть много )))

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

ua6em пишет:

ноутов должно быть много )))

По одному-два для каждой оси.