LinuxCNC + Orange Pi
GPIO драйвер

LinuxCNC + Orange Pi
GPIO driver

GPIO драйвер - это компонент программы LinuxCNC/Machinekit, который позволяет самой программе и всем её компонентам общаться с внешним миром. GPIO драйвер работает абсолютно также как LPT драйвер на настольных ПК, отличия есть только в параметрах запуска.

GPIO driver - it's a component of the LinuxCNC/Machinekit software. This component allows the software to talk with outside world. GPIO driver operates with GPIO pins same as LPT driver operates with pins of DB25 socket. The difference is only in startup parameters.

Параметры запуска

Startup parameters

ВНИМАНИЕ: Нельзя указывать в списке входных пинов те, которые были в списке выходных. Нельзя указывать номера пинов, обозначенных на плате как GND (земля), 3.3V и 5V. Примеры: # --- ОШИБКА --- # пины 2,4 - это 5V, пин 1 - это 3.3V loadrt opi_gpio input_pins=1,2,3,4 # пин 8 указан в обоих списках loadrt opi_gpio output_pins=3,5,7,8 input_pins=8,33,35,37

ATTENTION: You can't use same pins in the both (input/output) lists. You can't use GND, 3.3V and 5V pins by this driver. Examples: # --- ERROR --- # pins 2,4 are 5V, pin 1 is 3.3V loadrt opi_gpio input_pins=1,2,3,4 # both lists contains the pin 8 loadrt opi_gpio output_pins=3,5,7,8 input_pins=8,33,35,37


Пины

Pins

Вместо XX надо написать номер или имя GPIO пина, указанного в списке входных/выходных пинов. Пины от 0 до 9 надо указывать как 00, 01, 02, .. , 09. Примеры: loadrt opi_gpio output_pins=3,5,7,8 input_pins=33,35,PA20 # --- ПРАВИЛЬНО --- net xstep => opi_gpio.pin-03-out net xdir => opi_gpio.pin-05-out net ystep => opi_gpio.pin-07-out net ydir => opi_gpio.pin-08-out net home-x <= opi_gpio.pin-33-in net home-y <= opi_gpio.pin-35-in-not net home-z <= opi_gpio.pin-PA20-in # --- ОШИБКА --- net xstep => opi_gpio.pin-3-out # нет такого пина net xdir => opi_gpio.pin-10-out # нет такого пина net ystep => opi_gpio.pin-33-in # на выход указан входной пин net ydir => opi_gpio.pin-PA13-out # нет такого пина net home-x <= opi_gpio.pin-8-out # на вход указан выходной пин net home-y <= opi_gpio.pin-34-in # нет такого пина net home-z <= opi_gpio.pin-PA20-out # нет такого пина

Replace the XX chars with GPIO pin number or it's name, listed in the output/input list. 0-9 pins must be preceded with a zero char like 00, 01, 02, .. , 09. Examples: loadrt opi_gpio output_pins=3,5,7,8 input_pins=33,35,PA20 # --- IT'S OK --- net xstep => opi_gpio.pin-03-out net xdir => opi_gpio.pin-05-out net ystep => opi_gpio.pin-07-out net ydir => opi_gpio.pin-08-out net home-x <= opi_gpio.pin-33-in net home-y <= opi_gpio.pin-35-in-not net home-z <= opi_gpio.pin-PA20-in # --- ERROR --- net xstep => opi_gpio.pin-3-out # there's no such pin, use 03 instead net xdir => opi_gpio.pin-10-out # there's no such pin net ystep => opi_gpio.pin-33-in # there's no such pin, pin 33 it's output net ydir => opi_gpio.pin-PA13-out # there's no such pin net home-x <= opi_gpio.pin-8-out # there's no such pin, pin 8 it's input net home-y <= opi_gpio.pin-34-in # there's no such pin net home-z <= opi_gpio.pin-PA20-out # there's no such pin


Параметры

Parameters

Примеры: loadrt opi_gpio output_pins=3,5,7,8 setp opi_gpio.reset-time 5000 # сброс пинов через 5000 наносекунд net xstep => opi_gpio.pin-03-out net xdir => opi_gpio.pin-05-out setp opi_gpio.pin-03-out-reset 1 # сбрасывать пин 3 setp opi_gpio.pin-05-out-invert 1 # инвертировать пин 5

Examples: loadrt opi_gpio output_pins=3,5,7,8 setp opi_gpio.reset-time 5000 # reset pins state to 0 after a 5000ns delay net xstep => opi_gpio.pin-03-out net xdir => opi_gpio.pin-05-out setp opi_gpio.pin-03-out-reset 1 # reset pin 3 (when needed) setp opi_gpio.pin-05-out-invert 1 # invert pin 5


Функции

Functions

Примеры: loadrt opi_gpio output_pins=3,5,7,8 setp opi_gpio.reset-time 5000 addf opi_gpio.read base-thread # чтение входных пинов addf stepgen.make-pulses base-thread # генерация шагов addf opi_gpio.write base-thread # запись выходных пинов addf opi_gpio.reset base-thread # сброс нужных пинов

Examples: loadrt opi_gpio output_pins=3,5,7,8 setp opi_gpio.reset-time 5000 addf opi_gpio.read base-thread # read input pins state addf stepgen.make-pulses base-thread # generate the steps addf opi_gpio.write base-thread # write output pins state addf opi_gpio.reset base-thread # reset some pins if needed


Удваиваем частоту шагов

Doubling the steps rate

С помощью функции opi_gpio.reset мы можем увеличить максимальную частоту шагов вдвое. Как это работает? Чтобы сделать полный шаг генератору шагов (stepgen) нужно выставить состояние пина в 1 и, через какое-то время, вернуть его обратно в 0. За время одного базового периода (base-thread) функция генератора stepgen.make-pulses сделать этого не может. Поэтому на помощь генератору идёт сам GPIO драйвер с функцией opi_gpio.reset. Эта функция ждёт указанного время (opi_gpio.reset-time) и сама сбрасывает состояние нужных пинов обратно в 0.

You can double a steps output rate using the opi_gpio.reset function. How it works? To make a full step the stepgen must set pin state to 1 and then set it back to 0. This can't be done using only stepgen.make-pulses function inside a base-period. GPIO driver can help a stepgen with that using the opi_gpio.reset function. This function waits a short time, than set a state of desired pins back to 0.

В данном примере мы будем использовать 3 генератора STEP/DIR. Максимум генераторов - 16. Это HAL код будет работать только в LinuxCNC. loadrt trivkins loadrt [EMCMOT]EMCMOT base_period_nsec=[EMCMOT]BASE_PERIOD servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[TRAJ]AXES loadrt opi_gpio output_pins=3,5,7,8,10,11,13 loadrt stepgen step_type=0,0,0 addf opi_gpio.read base-thread addf stepgen.make-pulses base-thread addf opi_gpio.write base-thread # включаем функцию opi_gpio.reset addf opi_gpio.reset base-thread addf stepgen.capture-position servo-thread addf motion-command-handler servo-thread addf motion-controller servo-thread addf stepgen.update-freq servo-thread net xstep => opi_gpio.pin-03-out net xdir => opi_gpio.pin-05-out net ystep => opi_gpio.pin-07-out net ydir => opi_gpio.pin-08-out net zstep => opi_gpio.pin-10-out net zdir => opi_gpio.pin-11-out net xenable => opi_gpio.pin-13-out # указываем время сброса пинов setp opi_gpio.reset-time 5000 # указываем STEP пины, которые будет сбрасывать opi_gpio.reset setp opi_gpio.pin-03-out-reset 1 setp opi_gpio.pin-07-out-reset 1 setp opi_gpio.pin-10-out-reset 1 # при настройке генераторов выставляем параметр stepspace = 0 # этим значением мы сообщаем генератору, что пин STEP # будет сбрасываться функцией opi_gpio.reset setp stepgen.0.position-scale [AXIS_0]SCALE setp stepgen.0.steplen 1 setp stepgen.0.stepspace 0 setp stepgen.0.dirhold 35000 setp stepgen.0.dirsetup 35000 setp stepgen.0.maxaccel [AXIS_0]STEPGEN_MAXACCEL net xpos-cmd axis.0.motor-pos-cmd => stepgen.0.position-cmd net xpos-fb stepgen.0.position-fb => axis.0.motor-pos-fb net xstep <= stepgen.0.step net xdir <= stepgen.0.dir net xenable axis.0.amp-enable-out => stepgen.0.enable setp stepgen.1.position-scale [AXIS_1]SCALE setp stepgen.1.steplen 1 setp stepgen.1.stepspace 0 setp stepgen.1.dirhold 35000 setp stepgen.1.dirsetup 35000 setp stepgen.1.maxaccel [AXIS_1]STEPGEN_MAXACCEL net ypos-cmd axis.1.motor-pos-cmd => stepgen.1.position-cmd net ypos-fb stepgen.1.position-fb => axis.1.motor-pos-fb net ystep <= stepgen.1.step net ydir <= stepgen.1.dir net yenable axis.1.amp-enable-out => stepgen.1.enable setp stepgen.2.position-scale [AXIS_2]SCALE setp stepgen.2.steplen 1 setp stepgen.2.stepspace 0 setp stepgen.2.dirhold 35000 setp stepgen.2.dirsetup 35000 setp stepgen.2.maxaccel [AXIS_2]STEPGEN_MAXACCEL net zpos-cmd axis.2.motor-pos-cmd => stepgen.2.position-cmd net zpos-fb stepgen.2.position-fb => axis.2.motor-pos-fb net zstep <= stepgen.2.step net zdir <= stepgen.2.dir net zenable axis.2.amp-enable-out => stepgen.2.enable

In this example we will use 3 stepgen generators (maximum count is 16). This HAL code valid only for LinuxCNC. loadrt trivkins loadrt [EMCMOT]EMCMOT base_period_nsec=[EMCMOT]BASE_PERIOD servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[TRAJ]AXES loadrt opi_gpio output_pins=3,5,7,8,10,11,13 loadrt stepgen step_type=0,0,0 addf opi_gpio.read base-thread addf stepgen.make-pulses base-thread addf opi_gpio.write base-thread # enable the opi_gpio.reset function addf opi_gpio.reset base-thread addf stepgen.capture-position servo-thread addf motion-command-handler servo-thread addf motion-controller servo-thread addf stepgen.update-freq servo-thread net xstep => opi_gpio.pin-03-out net xdir => opi_gpio.pin-05-out net ystep => opi_gpio.pin-07-out net ydir => opi_gpio.pin-08-out net zstep => opi_gpio.pin-10-out net zdir => opi_gpio.pin-11-out net xenable => opi_gpio.pin-13-out # set pins reset time setp opi_gpio.reset-time 5000 # reset these STEP pins by the .reset function setp opi_gpio.pin-03-out-reset 1 setp opi_gpio.pin-07-out-reset 1 setp opi_gpio.pin-10-out-reset 1 # You must set the stepspace parameter to 0 when configuring the stepgens. # Doing this means that stepgen will not resets the specified STEP pins anymore. # A reset state of those pins will be controlled by the .reset function of the GPIO driver setp stepgen.0.position-scale [AXIS_0]SCALE setp stepgen.0.steplen 1 setp stepgen.0.stepspace 0 setp stepgen.0.dirhold 35000 setp stepgen.0.dirsetup 35000 setp stepgen.0.maxaccel [AXIS_0]STEPGEN_MAXACCEL net xpos-cmd axis.0.motor-pos-cmd => stepgen.0.position-cmd net xpos-fb stepgen.0.position-fb => axis.0.motor-pos-fb net xstep <= stepgen.0.step net xdir <= stepgen.0.dir net xenable axis.0.amp-enable-out => stepgen.0.enable setp stepgen.1.position-scale [AXIS_1]SCALE setp stepgen.1.steplen 1 setp stepgen.1.stepspace 0 setp stepgen.1.dirhold 35000 setp stepgen.1.dirsetup 35000 setp stepgen.1.maxaccel [AXIS_1]STEPGEN_MAXACCEL net ypos-cmd axis.1.motor-pos-cmd => stepgen.1.position-cmd net ypos-fb stepgen.1.position-fb => axis.1.motor-pos-fb net ystep <= stepgen.1.step net ydir <= stepgen.1.dir net yenable axis.1.amp-enable-out => stepgen.1.enable setp stepgen.2.position-scale [AXIS_2]SCALE setp stepgen.2.steplen 1 setp stepgen.2.stepspace 0 setp stepgen.2.dirhold 35000 setp stepgen.2.dirsetup 35000 setp stepgen.2.maxaccel [AXIS_2]STEPGEN_MAXACCEL net zpos-cmd axis.2.motor-pos-cmd => stepgen.2.position-cmd net zpos-fb stepgen.2.position-fb => axis.2.motor-pos-fb net zstep <= stepgen.2.step net zdir <= stepgen.2.dir net zenable axis.2.amp-enable-out => stepgen.2.enable