Ардуино и ЧПУ. Проблема с передачей данных

ferion
Offline
Зарегистрирован: 01.06.2014

Добрый день, форумчане! Я не большой специалист в программировании на C++, отсюда много недопониманий и косяков. Поэтому не судите строго.  

Устройство: Строю небольшой станок для тиснения. Два шаговика + устройство тиснения. Железо: ардуина + моторшилд.  

Проблема: Использую адаптированный G-код (координаты в формате X,Y,Z;).  При передаче кода вручную построчно - все работает отлично. Как только заряжаю данные полным пакетом в PUTTY - начинает сбоить. Координаты сбиваются, появляются просто бешенные числа. Такое ощущение, что пока ардуина крутит шаговиками часть данных теряется и карта считывает данные не с начала строки. Может такое быть? И как избежать проблемы?

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Ардуино не успевает принимать и обрабатывать данные, буфер у неё ограничен.

ferion
Offline
Зарегистрирован: 01.06.2014

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

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Как вариант. Раньше в модемах было аппаратное и программное управление потоком. В Ардуино такого нет, потому если он не успевает, он не может сказать, что он не успевает. Потому нужно вводить в протокол обмена какой то управляющий флаг/сигнал. Практически я это никогда не использовал, не было нужды, потому варианты надо гуглить, наверняка проблему уже кто то решил.

art100
Offline
Зарегистрирован: 09.03.2014

G-код это только координаты и начало действия

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

я пользую уже отлаженную связку 1 2 3 4 5 6 7 8 9 

деталь в моем случае например dwg-код oscad-код проект stl-код выверка под конкретную механику g-code проверка

PC спец софтина (даже не помню самосбор  Pronteface вроде) <-> arduino256 <-> пачка драверов шаговых <-> механика

есть короткий путь 1 2 3

miniSD G-code - arduina256 - драйвера шаговые - механика

короткий путь у меня наоборот еще ни одной детали тольком не зделал все косяки плошные и я не пользую

По моемому вы не с того начали

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

вот в каждой строчке тупая координата и команда

а кто у вас  ожидать будет?

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

может и для вашей фрезерной обработки есть вариант слайсера

попробуйте поискать

у меня каждая софтина вроде может напрямую g-code в arduino256 толкать

а народ рекомендует чтоб без косяков спец сборку под меня

; generated by Slic3r 1.0.1 on 2014-05-15 at 18:37:23

; layer_height = 0.3
; perimeters = 2
; top_solid_layers = 3
; bottom_solid_layers = 3
; fill_density = 0.35
; perimeter_speed = 30
; infill_speed = 40
; travel_speed = 70
; nozzle_diameter = 0.35
; filament_diameter = 3
; extrusion_multiplier = 1
; perimeters extrusion width = 0.35mm
; infill extrusion width = 0.37mm
; solid infill extrusion width = 0.37mm
; top infill extrusion width = 0.37mm
; first layer extrusion width = 0.70mm

G21 ; set units to millimeters
M107
M140 S110 ; bed temperature 110
M104 S210 ; extruder temperature 220
M107 S122; fan off
G28 ; home all axes
G1 Z5 F5000 ; lift nozzle
G90 ; use absolute coordinates
G92 E0
M82 ; use absolute distances for extrusion
G1 F1800.000 E-1.00000
G92 E0
G1 Z0.350 F4200.000
G1 X77.320 Y76.850 F4200.000
G1 E1.00000 F1800.000
G1 X80.850 Y73.320 E1.15446 F540.000
G1 X81.850 Y72.490 E1.19468
G1 X82.990 Y71.880 E1.23468
G1 X84.240 Y71.500 E1.27510
G1 X85.530 Y71.380 E1.31519
G1 X94.460 Y71.380 E1.59150
G1 X95.750 Y71.500 E1.63158
G1 X96.990 Y71.880 E1.67171
G1 X98.130 Y72.490 E1.71172
G1 X99.140 Y73.310 E1.75197
G1 X102.680 Y76.840 E1.90665
G1 X103.500 Y77.840 E1.94667
G1 X104.120 Y78.990 E1.98709
G1 X104.500 Y80.240 E2.02752
G1 X104.620 Y81.530 E2.06760
G1 X104.620 Y98.460 E2.59144
G1 X104.500 Y99.750 E2.63153
G1 X104.120 Y101.000 E2.67195
G1 X103.510 Y102.140 E2.71196
G1 X102.680 Y103.140 E2.75217
G1 X99.140 Y106.680 E2.90707
G1 X98.140 Y107.510 E2.94728
G1 X97.000 Y108.120 E2.98728
G1 X95.750 Y108.500 E3.02771
G1 X94.460 Y108.620 E3.06780
G1 X85.530 Y108.620 E3.34410
G1 X84.240 Y108.500 E3.38419
G1 X82.990 Y108.120 E3.42461
G1 X81.840 Y107.500 E3.46504
G1 X80.840 Y106.680 E3.50505
G1 X77.310 Y103.140 E3.65973
G1 X76.490 Y102.130 E3.69999
G1 X75.880 Y100.990 E3.73999
G1 X75.500 Y99.750 E3.78012
G1 X75.380 Y98.460 E3.82021

успехов пишите что накопали

безплатный софт тоже есть

а вот под вашу фрезеровку не могу подсказать что оптимальней

не надо только велосипеды изобретать

это верно то вы на g-code обратили вниамния - да он самый распростарнненный для станков и спец софтины как правило все его понять должны

теоретически в g-code есть команда подтверджения наверно

не думал

сам смотрите в моем реальном нет

тупа X;Y;подача сырья; все :-0

наврал если далше простыню посмотреть есть некая команда Fxxx

G1 X82.975 Y81.939 E3.31658 F540.000
G1 X85.939 Y78.975 E3.44630
G1 X94.061 Y78.975 E3.69759
G1 X97.025 Y81.939 E3.82730
G1 X97.025 Y98.061 E4.32612
G1 X94.061 Y101.025 E4.45583
G1 X85.939 Y101.025 E4.70712
G1 X83.041 Y98.127 E4.83394
G1 X82.350 Y98.319 F4200.000
G1 X82.350 Y81.680 E5.34877 F378.000
G1 X85.681 Y78.350 E5.49450
G1 X94.320 Y78.350 E5.76181
G1 X97.650 Y81.680 E5.90754
G1 X97.650 Y98.319 E6.42237
G1 X94.320 Y101.650 E6.56811
G1 X85.681 Y101.650 E6.83541
G1 X82.416 Y98.386 E6.97825
G1 X82.792 Y97.878 F4200.000
G1 X84.947 Y95.781 F4200.000
G1 X83.418 Y94.252 E7.04661 F1080.000
G1 X83.418 Y93.349 E7.07515
G1 X84.698 Y94.629 E7.13239

может это и есть то что slicer встявляет чего-то там свое отсчитвая

суть слайсера тольков вставлении/удаленнии автоматом каких-то команд

не думал над этим

солнце всходит и заходит зачем его трогать

о по видимому в g-code нмого чего есть

вижу через равные промежутки

однообразынй блок

G1 F1800.000 E15.94413
G92 E0
G1 Z0.650 F4200.000
G1 X88.171 Y98.094 F4200.000
G1 E1.00000 F1800.000
G1 X86.601 Y97.011 E1.02833 F1131.707

может высчитали что как раз до этой комнады все в ардуину влезает

а когда

вот тогда слежующий блок засунем

век живи век учись

 

ferion
Offline
Зарегистрирован: 01.06.2014

Всем большое спасибо - разобрался.

Мои заблуждения:

1. Ардуино считывает данные по мере поступления четко, чинно и построчно

Оказывается - Ардуино и Putty как бы вообще не больно совместимы. Пока Ардуина крутит моторчиками поток данных продолжает тужится на предмет влезть в порт. Насколько я понял Putty выплевывает данные непрерывно. Без таймаутов. Решение - использую для отправки данных на карту программу Al Terminal. И всем советую - отличная штука с кучей настроек. Как только ввел таймаут отправки координат - все заработало. Пока тестировал с интервалом в 1500 милисекунд. Буду постепенно уменьшать, чтобы отследить на каком этапе пойдут сбои.

 

2. Канал связи с Ардуино полный дуплекс.

Нихрена подобного. У меня после принятия данных скетч отдавал в СериалМонитор текущие координаты. Постепенно я стал замечать, что данные, отправленные с Ардуины волшебным образом стали дополнять данные, отправленные с компа. Такшта при пакетной передаче без таймаутов лучше никакого фидбэка не делать.

Сейчас все вроде как бегает. Работаю над небольшой коррекцией расчета координат. 

art100
Offline
Зарегистрирован: 09.03.2014

ferion пишет:

... данные, отправленные с Ардуины волшебным образом стали дополнять данные, отправленные с компа...

мне кажется ты не все еще прощупал

у тебя похоже в терминале локальное эхо включено поэтому ответ с приветом добавляется

но если не напрягает то не заморачивайся

ты надеюсь подгоняешь уже какой-то полуготовый код под свое железо?

 

ты случаем не рисовалку пасхальную делаешь?

тоже два мотора и тиснение

я думаю код и софт от сюда выложены

прикольно

так проект развит

и рисовалка со спец расширением

и спец драйвер

и код для ардуины уно уже откомпилировал и прошил на столе на ура

и разворачивается за 15 минут

вот используется в этой рисовалке g-code пока не понял

еще немного и не удержусь и начну делать

хм

3 мотора 2 мосфета а вот концевиков что-то сильно много

страно

 

ясно у ардуинки своя система команд

это все возможные

void makeComInterface(){
  SCmd.addCommand("v",sendVersion); 
  SCmd.addCommand("EM",enableMotors);
  SCmd.addCommand("SC",stepperModeConfigure);
  SCmd.addCommand("SP",setPen);
  SCmd.addCommand("SM",stepperMove);
  SCmd.addCommand("SE",ignore);
  SCmd.addCommand("TP",togglePen);
  SCmd.addCommand("PO",ignore);    //Engraver command, not implemented, gives fake answer
  SCmd.addCommand("NI",nodeCountIncrement);
  SCmd.addCommand("ND",nodeCountDecrement);
  SCmd.addCommand("SN",setNodeCount);
  SCmd.addCommand("QN",queryNodeCount);
  SCmd.addCommand("SL",setLayer);
  SCmd.addCommand("QL",queryLayer);
  SCmd.addCommand("QP",queryPen);
  SCmd.addCommand("QB",queryButton); //preparation for "PRG" Button, actually gives fake answer, 
  SCmd.setDefaultHandler(unrecognized); // Handler for command that isn't matched (says "What?") 
  }

какие-то EBB-команды

EBB Command Reference
The "QC" Command (Query Current) - Added in v2.0, broken up to v2.2.2. Works properly in v2.2.3 and above.

Format: "QC<CR>"
Example: "QC"
Returns: "<REF_RA0_VOLTAGE>,<V+_NET_VOLTAGE><CR>"
<REF_RA0_VOLTAGE> is the voltage on the REF_RA0 net, as expressed as a 10 bit number where 0 = 0.0V and 1023 = 3.3V
<V+_NET_VOLTAGE> is the voltage on the V+ net scaled by the resistor divider R13 and R18
This command reads two analog voltages and returns their raw 10 bit values. You can use this to figure out what the user has set the current adjustment pot to, and to read the voltage coming into the board.
Returns: "0421,0021<CR>OK<CR>"

прикрутил только что G-code

 

брр только смысл потерял зачем?

опять это вездесущий g-code

вообщем как всегда

софт выстраивается можно и железяку делать