Добавление еще одной оси
- Войдите на сайт для отправки комментариев
Сб, 11/01/2020 - 18:13
Всем привет, захотелось повторить один проект, 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
роль устройства цифровой индикации(уци dro) Возникли проблемы.
Позвольте узнать, каков призовой фонд конкурса на угадывание какие именно проблемы у Вас возникли?
Вы не так задаёте вопрос на форуме.
да вроде правильно поставлен )))
Этот гвоздь не в ту стену, почитай как надо использовать прерывания на выбранных тобой пинах...
Уже разобрался. Не понял, почему форум исковеркал некоторые мои слова) Мне просто нужен был свежий взгляд на мой скетч и проверка, все ли я правильно написал в скетче.
Спасибо, почитаю) В идеале хочется доработать проект, так как он по сути уникальный.(про ардуино grbl знаю, но это не то) Уникальность в том, что можно управлять шаговиками и видеть какое они прошли расстояние, вперед или назад(примитивное уци\dro) Мне на ютубе, да и в интернете в целом, это устройство попадалось только 2 раза. Второй подобный проект супер, там сразу 3 оси и все управляется с одной ардуино нано, но его автор за 5лет, так и не захотел делиться скетчем. Я бы тоже в идеале хотел уместить все на одной ардуинке, но пока не хватает знаний)
Уже разобрался. Не понял, почему форум исковеркал некоторые мои слова) Мне просто нужен был свежий взгляд на мой скетч и проверка, все ли я правильно написал в скетче.
ну так выкладывайте исправления, может еще кто будет повторять, в математику я особо не лез, а беглого взгляда было достаточно, что не правильно применили прерывание на этих пинах, то-есть надо писать еще один обработчик прерывания, для оси Z, ну а с частностями видимо уже разобрались )))
PS данный метод измерения по всей видимости имеет право на жизнь, но лично я приверженец измерительных линеек (абсолютных энкодеров)
Линейки есть, но сверлить станок для их монтажа жалко) Да и сидел, думал. Точность в десятки-сотки, это конечно хорошо, но нужна ли она такая точность в хоббийном станке, для меня достаточно точности до +-1мм. Там где будет нужна высокая точность, на мой взгляд лучше использовать чпу. То есть с ручного контроллера переключиться на контроллер с подключением к компу. А так тема народного уци/dro на чипмейкере мне понравилась, но понял что для меня это избыточно. Кстати, а реально ли для измерения использовать не линейки, а именно энкодеры? Я что-то пытался на эту тему гуглить, но толком ничего интересного не нашёл.
я не в теме, о станочке только подумываю, пока некуда даже поставить, но уно с шилдом драйверов для 4-х осей есть )))
Тут на форуме в проектах Генератор для катушки Мишина моя тема, но код на заимствованиях
Да, если сам не одолеешь, что навряд ли, то чем смогу помогу с твоим модифицированным скетчем
Постоянное чтение одних и и тех же битов одного и того же регистров в рамках одного блока принятия решений навряд ли может быть хорошей идеей. Между двумя вызовами if() вход/бит может значение и поменять.
Если будешь обрабатывать чермет, то A4988/drv8825 не подойдут, нужны более серьёзные шаговики (минимум nema23, а лучше 34), соответственно и драйвера. По причине того, что бы там добиться высокой точности обработки на среднем съёме металла, нужно клинья затягивать сильнее, тогда биения минимизируются(справедливо на китайских мелких фрезерах) , nema 17 не потянет. Хотя макетку отстраиваю на A4988 и nema 17) Сегодня буду скетчи на 3 оси заливать и тестировать, если все будет нормально, то буду уже тестировать на DM860 и nema 34. Если всё будет нормально, то плату надо будет разводить. После этого проекта, хочу реализовать электронную гитару для токарника) Потом скорее всего займусь чпу.
А не встречались проекты с более лучшей реализацией? Это просто мой первый более менее сложный проект для повторения.
Вопрос: а зачем одной дуней управлять а второй дуней считать то, что "науправляла" первая??? Не проще ли взять БОЛЬШУЮ дуню (2560) и всё сделать в одном флаконе???
Вопрос хороший) Но на самом деле используя 2560, профит не сильно лучше будет, она дороже двух нано, да и по размерам будет +- тоже самое. В идеале хотелось вот так https://www.youtube.com/watch?v=iVYIXzO6UtI&t=80s
С более лучшей в чем? В природе вообще нет понятия "более лучшего". Кому-то хвост жизненно необходим, а кого-то только тяготит.
Причём здесь дороже/дешевле? Один шаговик нормальный всё перекроет нафиг по цене)))
Ну тогда-уж надо совсем извратицца - на кажду ось по дурдуине(328) и связать их в "кольцо" по uart или spi да и дело в шляпе... )))
PS: очень херовый подход, только на уровень = лапти в руки и попёр подходит.
И у меня в целом вопрос) По первой ссылке в моем первом сообщении, Испанец говорит, что ему не удалось всё сделать на одной ардуинке, а вот в прошлом сообщении (ссылка на ютуб), другой человек вполне нормально всё сделал на одной ардуино уно, что эквивалентно нано. Вообще первое, это как раз плагиат второго) Просто "Joop Brokking" не захотел ни с кем делиться скетчем, даже до сих пор.
А что "потянет" привод "руки" длиной ~2 метра и грузом на конце ~100 кг. Шаговик нужен обязательно со встроенным энкодером и редуктором. Есть что на примете? Желательно 48 Вольт питание.
Писать все с 0, у меня знаний пока не хватает) Максимум хватило чуть улучшить готовое)
У меня такой комплект https://ru.aliexpress.com/item/32923051981.html?spm=a2g0s.9042311.0.0.1b2d33edojgc7w Более мощное или лучшее для китайского станка (jet x1l) не вижу смысла брать.
Писать все с 0, у меня знаний пока не хватает) Максимум хватило чуть улучшить готовое)
Дык вот в этом-то и весь прикол и заключается. Когда ты берёшь НЕ СВОЁ и тупо копируешь и радуешься как оно работает - это "круто"! Но как только возникает необходимость что-то изменить - всё, ступор, сопли, форум. Вот она разница колхозника и инженера. Первый скопирует а второй только посмотрит, но сделает всё САМ!!!
У меня такой комплект https://ru.aliexpress.com/item/32923051981.html?spm=a2g0s.9042311.0.0.1b2d33edojgc7w Более мощное или лучшее для китайского станка (jet x1l) не вижу смысла брать.
Спасибо, но, думаю, что для моих хотелок это слишком мало. Мне минимум 500Вт. шаговики нужны.
В свете развернувшейся дискуссии я вижу уверенность топиксстартера в том, что при помощи пары советов с форума можно написать волшебный скетч, который будет работать с любым воображаемым станком. Думаю, что для начала необходимо избавиться от этой иллюзии и начать формулировать: что ты хочешь улучшить, чем готов пожертвовать для этого, а затем уже задавать вопросы. Например: хотел добавить третью ось, но из-за индикатора управление запаздывает, как можно исправить данную ситуацию (готов применить другой дисплей)
Там вообще можно АППАРАТНО на интах сделать один шаговик + один дисплей + что ещё осталось из ног на 328 меге. Надо попробовать, железо где-то валяется.
Меня больше интересует есть ли готовые шаблоны для распарсивания по всем осям до какого-либо ПРОМЫШЛЕННОГО стандарта. Вот в чём весь цимус. Сделать-то не проблема, тока вопрос - как и с чем это будет совместимо?
Согласен, но начинать тоже с чего то надо) Пусть сперва будет колхозинг.
Я сперва просто хотел трезвого взгляда со стороны на правильно ли я написал скетч) Чтоб ненароком ардуино не сломать) Волшебных скетчей мне не надо.
сломать ардуино скетчем теоретически может быть и можно, но это навряд ли )))
Я просто добавлял прерывание на порте д. Точнее опрос с него PinD. Так как для оси Z мне пришлось задействовать выводы D3 и D4. А в примере на этом сайте говорилось, что можно при не правильном обращении к этому порту, отключить tx rx (d0, d1) на ардуино. Попробовал залить скетчи, X и Y работает нормально, а вот Z не очень. При нажатии кнопок отвечающих за эту ось, движения не происходит, но при нажатии кнопок отвечающих за движение на оси Х, шаговик на оси Z совершает тоже самые движения. Что хуже всего, показания на Z при этом не изменяются.
сломать ардуино скетчем теоретически может быть и можно, но это навряд ли )))
Легко!
По крайней мере, китайскую нанку на ch340 - как два пальца.
сломать ардуино скетчем теоретически может быть и можно, но это навряд ли )))
Легко!
По крайней мере, китайскую нанку на ch340 - как два пальца.
было бы интересно код глянуть... как простенькой программой сжечь контроллер любого IBM знаю, надеялся, что в атмеге эти косяки ликвидировали
неправильно это:
Согласен, но начинать тоже с чего то надо) Пусть сперва будет колхозинг.
Согласен, но начинать тоже с чего то надо) Пусть сперва будет колхозинг.
да ну! ... слюнные железы и надпочечники как раз этот пряник вырабатывают )))
не, это жеж не по даташиту
Спасибо. PCMSK поправил на 2. А вот ISR (PCINT2_vect) не добавил)
Спасибо. PCMSK поправил на 2. А вот ISR (PCINT2_vect) не добавил)
ну так его надо писать, кто-то же должен прерывание обрабатывать
Включить все подтяжки и занулить выводы. Кристалл перегреется и вуаля.
Ничего ему не сделается. Суммарный ток будет 5мА - с чего ему накрываться?
Вы не с той стороны подходите. Причём тут атмега вообще, мы же про ардуину говорим, а не про атмегу. Подумайте как сыграть на связи МК с CH340.
Включить все подтяжки и занулить выводы. Кристалл перегреется и вуаля.
Ничего ему не сделается. Суммарный ток будет 5мА - с чего ему накрываться?
Вы не с той стороны подходите. Причём тут атмега вообще, мы же про ардуину говорим, а не про атмегу. Подумайте как сыграть на связи МК с CH340.
настроить на выход оба чипа и на одном выставить 1 на другом 0 )))
Ну это прогнозируемое поведение, а вот не прогнозируемое?
Ну это прогнозируемое поведение, а вот не прогнозируемое?
Вы высказывали сомнение в том, что ардуину можно сломать скетчем. Я Вам показал как. Насчёт "прогнозируемости" в условии задачи ничего не было.
Да, и "прогнозируемое" - понятие неопределённое - для кого как. Вы электронщик - для Вас прогнозируемое, а я - программист, и моя первая нанка отправилась в страну чистой Gnd именно таким образом :-)
Хех, у меня 2 нано с одним A4988 померли на этапе макетирования оригинального проекта на 2 оси. Первый раз из-за того что пренебрег конденсатором на vmot и gnd драйвера шаговика при запитывании драйвера и ардуино от одного источника питания. Второй раз, когда пытался понять почему при отсутствии сигналов на выводах драйвера enable, step и dir, шаговики сами по себе вращаются. Нечаянно замкнул землю на vcc. Если нано на ch340 не так жалко, то вот на ftdi232 , было жаль. Поэтому про скетч и спросил) Хватило аппаратных умерщвлений, не хотелось бы ещё добавить программных)
я пока еще не за три года не спалил ни одной, хотя подкидываю сигналы довольно смело, не снимая питания )))
я пока еще не за три года не спалил ни одной, хотя подкидываю сигналы довольно смело, не снимая питания )))
Так что, думаю, AVR выбраны для Ардуино в первую очередь из-за своей "прочности". С другими контроллерами такое свободное обращение не проходит.
Я вот тоже с AVR расслабился, а как попытался что-то сделать с Due, на 3-й день спалил один из аналоговых выходов.
Так что, думаю, AVR выбраны для Ардуино в первую очередь из-за своей "прочности". С другими контроллерами такое свободное обращение не проходит.
DUE у меня валяется где-то, взял на стадии знакомства с ардуино позарившись на тактовую частоту, применения пока не нашлось, цап юзаю внешний, довольно надёжное устройство (MCP4725)
Подскажите пожалуйста) Что за фигня может быть:
1) Аппаратная проблема, при нажатии кнопок управления шаговиками (х+х-з+з-) Шаговики то крутится, а то вообще не реагируют, хотя подключение на макетки осталось прежним, вместо оси у подключил на З. Кстати обратил внимание, что если взяться за край макетки, то шаговики начинают вращаться. Но появляется дребезг на шаговике З, начинает произвольно немного крутиться, может ли это быть из-за того, что кнопки подключил к аналоговой линии A1 и A2 ? Скетч ардуино А:
2) Почему при работе оси З не происходит изменения показаний?
А вообще корректно использовать analogRead для оси Z или лучше обращаться к аналоговым выводам как к цифровым d15,d16?
нет!
Владимир! Почитай ссылку, что я давал.
Меня смущает сильно строка 96, проверяешь ты её в обработчике второго ISR, а она от обработчика нулевого ISR.
Сдаётся мне надо всё переводить на пины ISR2
Что именно нет?) Нет не использовать analogRead для кнопок оси Z или нет, не назначать аналоговые выводы цифровыми?)
Прерывание это, мне тоже не нравится, но оно идёт основным условием. Я бы вообще отказался от тумблера enable step. Толку от него не так уж и много, все равно "уци" не будет работать с отключенными шаговиками, чтобы вручную крутить лимбы, проще всё полностью обесточить. Тогда можно будет выжать два пина в порте B. D8 и D13(на последнем правда надо светодиод отрезать с резистором. А так, если всё перекинуть в порт д, то там тоже не хватит выводов. Как вариант, попробую убрать обращение в порте Д к выводу enable или сделаю костыль, запараллелив вывод enable с порта В с выводом на порте Д в isr(pcint2_vect) буду обращаться к нему.
если ты будешь читать с аналогового пина, то у тебя всегда будет 1 )))
Использовать его естественно надо как цифровой
Понял) Спасибо. Сейчас переделаю) Блин наконец-то клаву на ноуте поменял) А то бесило некоторые буквы писать через копипейст, в принципе это не единственная проблема, ещё и пара разных символов вводилось при нажатии на одну кнопку, скетчи править, то ещё удовольствие))
Понял) Спасибо. Сейчас переделаю) Блин наконец-то клаву на ноуте поменял)
ноутов должно быть много )))
ноутов должно быть много )))
По одному-два для каждой оси.