tag:blogger.com,1999:blog-62097406416261437172024-03-15T09:13:44.607-07:00Machinekit con GUI gmoccapy_lcd7Vichentehttp://www.blogger.com/profile/13532517773299729858noreply@blogger.comBlogger17125tag:blogger.com,1999:blog-6209740641626143717.post-31494675702954406312016-04-11T03:50:00.000-07:002016-04-11T11:17:59.652-07:00Configurar entradas y salidas digitales del expansor MCP23017Para este tutorial se recomienda visitar los anteriores tutoriales:<br />
<a href="http://machinekit-gmoccapy-lcd7.blogspot.com/2015/12/instalacion-de-glade-y-gladevcp-en.html" target="_blank">Instalación de glade y gladevcp</a><br />
<a href="http://machinekit-gmoccapy-lcd7.blogspot.com/2015/12/gui-basica-con-glade-y-gladevcp.html" target="_blank">Gui básica Glade</a><br />
<br />
Antes de utilizar la librería hal de MCP23017, se va a realizar una prueba utilizando un pequeño programa hecho en Python.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">import time
from drivers.MCP23017 import MCP23017 as MCP
mcp = MCP(0x27,1,False)
mcp.init()
for i in range(0,8):
mcp.setDir(MCP.PORT_A, i, MCP.DIR_OUT)
mcp.setDir(MCP.PORT_B, i, MCP.DIR_OUT)
while True:
for i in range(0,8):
mcp.setValue(MCP.PORT_A,i,1)
mcp.setValue(MCP.PORT_B,i,1)
mcp.write()
time.sleep(1)
for i in range(0,8):
mcp.setValue(MCP.PORT_A,i,0)
mcp.setValue(MCP.PORT_B,i,0)
mcp.write()
time.sleep(1)</pre>
<br />
<br />
Si se obtiene el siguiente error, hay que modificar la librería MCP23017.py.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">Traceback (most recent call last):
File "mcp23017.py", line 23, in <module>
mcp.write()
File "/usr/lib/python2.7/dist-packages/drivers/MCP23017.py", line 158, in write
self.updateValue(i, self.port[i].value)
File "/usr/lib/python2.7/dist-packages/drivers/MCP23017.py", line 119, in updateValue
self.i2c.write_byte_data(self.address, reg, value)
IOError: [Errno 121] Remote I/O error</pre>
<br />
El error sucede por no inicializar de forma correcta las interrupciones. Para solucionar hay que aumentar lo siguiente a la librería MCP23017.py.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">sudo nano /usr/lib/python2.7/dist-packages/drivers/MCP23017.py</pre>
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"> def init(self):
config = 0
config |= self.__MCP23017_IOCON_BANK1
config |= self.__MCP23017_IOCON_MIRROR_DIS
config |= self.__MCP23017_IOCON_SEQOP_DIS
config |= self.__MCP23017_IOCON_DISSLW_EN
config |= self.__MCP23017_IOCON_HAEN_EN
config |= self.__MCP23017_IOCON_ODR_DIS
config |= self.__MCP23017_IOCON_INTPOL_HIGH
self.i2c.write_byte_data(self.address, self.__MCP23017_REG_IOCON, config)
for i in range(0, 2):
<span style="background-color: yellow;">##### Interrupt defaults
# Disable interrupts on all pins by default
reg = self.portBase[i] + self.__MCP23017_REG_GPINTEN
self.i2c.write_byte_data(self.address, reg, 0x00)
# Interrupt on change register set to compare to previous value by default
reg = self.portBase[i] + self.__MCP23017_REG_INTCON
self.i2c.write_byte_data(self.address, reg, 0x00)
# Interrupt compare value registers
reg = self.portBase[i] + self.__MCP23017_REG_DEFVAL
self.i2c.write_byte_data(self.address, reg, 0x00)
# Clear any interrupts to start fresh
reg = self.portBase[i] + self.__MCP23017_REG_GPIO
self.i2c.read_byte_data(self.address, reg)
# Enable all latches
reg = self.portBase[i] + self.__MCP23017_REG_OLAT
self.i2c.write_byte_data(self.address, reg, 0xFF)</span>
self.port[i].reset()
self.portOld[i].reset()
self.updateDir(i, self.port[i].dir)
self.updatePullup(i, self.port[i].pullup)
self.updateValue(i, self.port[i].value)</pre>
<br />
<br />
Para utilizar las interrupciones del MCP23017, revisar el siguiente link:<br />
<br />
<a href="https://bitbucket.org/dewoodruff/mcp23017-python-3-library-with-interrupts/src/ed7a57a8cf1d5deb68142e0efb07f7f4db2d0a12/MCP23017.py?fileviewer=file-view-default" target="_blank">MCP23017 Interrupciones</a>.<br />
<br />
Para detectar la dirección i2c ejecutar:<br />
<br />
En el caso de estar conectado al pin P9.19 y P9.20. <br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">i2cdetect -y -r 1</pre>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmrFth9HUgENpqvjt5Q2FZ66Gqd03yz61M7PbNR_ulHEuUF86fHUNOebXxaj1Pe9fFvFCutShpiYZrEpsFH8Pxm-Y8M9TyN6iFOiB7nIPTbmIWBLqSK0lN4sqX19Qej0O8pJI_cCXDrBY/s1600/i2c-MCP23017.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="299" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmrFth9HUgENpqvjt5Q2FZ66Gqd03yz61M7PbNR_ulHEuUF86fHUNOebXxaj1Pe9fFvFCutShpiYZrEpsFH8Pxm-Y8M9TyN6iFOiB7nIPTbmIWBLqSK0lN4sqX19Qej0O8pJI_cCXDrBY/s640/i2c-MCP23017.jpg" width="640" /></a></div>
<br />
Si se desea usar los pines P9.17 y P9.18, hay que exportar el Device Tree Overlay del I2C1.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">sudo nano BB-I2C1-00A0.dts</pre>
<br />
Copiar el código DTS.<br />
<br />
<a href="https://github.com/jadonk/cape-firmware/blob/master/arch/arm/boot/dts/BB-I2C1-00A0.dts" target="_blank">BB-I2C1-00A0.dts</a><br />
<br />
Compilar Device Tree Overlay.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">dtc -O dtb -o BB-I2C1-00A0.dtbo -b 0 -@ BB-I2C1-00A0.dts</pre>
<br />
Mover a "/lib/firmware" y Ejecutar.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">sudo mv BB-I2C1-00A0.dtbo /lib/firmware/</pre>
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">sudo su</pre>
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">cd /lib/firmware/</pre>
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">echo BB-I2C1 > /sys/devices/bone_capemgr.9/slots</pre>
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">cat /sys/devices/bone_capemgr.9/slots</pre>
<br />
Ahora ya se puede usar I2C_1 en el bus 2.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">i2cdetect -l</pre>
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">i2cdetect -y -r 2</pre>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBm9rGDe3OIy-PbqNgixeBMSI9Me3O0EBJJiMEtUy_iI_3CqQQjq-l3G4N9OwSyD4fx_fs8rKpUovEt-tTzcApCDNL3HfaD91YI2kZHSzgstOyCsvdOD2t2bseMQd3Gete68R98y01WFQ/s1600/i2c-MCP23017-2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="276" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBm9rGDe3OIy-PbqNgixeBMSI9Me3O0EBJJiMEtUy_iI_3CqQQjq-l3G4N9OwSyD4fx_fs8rKpUovEt-tTzcApCDNL3HfaD91YI2kZHSzgstOyCsvdOD2t2bseMQd3Gete68R98y01WFQ/s640/i2c-MCP23017-2.jpg" width="640" /></a></div>
<br />
<br />
En el terminal ejecutar halrun para visualizar los pines que creará el componente hal_gpio_mcp23017.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">halrun</pre>
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">loadusr -Wn buttons hal_gpio_mcp23017 -n buttons -b 1 -a 39 -op A00,B00 -ip B01</pre>
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">show pin </pre>
<br />
buttons es el nombre con el que se crearán los pines hal, -b indica el
bus del i2c (puede ser 0, 1 o 2) en este caso se ocupa el i2c de los pines
P9.19 y P9.20, -a 39 indica que se esta usando la dirección i2c 0x27 (39) conectado
A0,A1,A2 a VCC, -op indican las salidas que se van a usar y -ip las
entradas que se usarán. <br />
<br />
Activar buttons.A.out-00.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">setp buttons.A.out-00 1</pre>
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">show pin </pre>
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">exit</pre>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXyliu2PMcQ8JFLlvywBqitooz9NWYr9zSDHlTN4PoLYIlBy1j0y62tgb1cO8u7aAgXqX8NhBcT3h3jIw_clGrYo-0wnW1_c4Dj2lyJihlGjDTnovw-LFl7E3Gi-Hz7aZD4O62oLnyP-w/s1600/halrun_MCP23017.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXyliu2PMcQ8JFLlvywBqitooz9NWYr9zSDHlTN4PoLYIlBy1j0y62tgb1cO8u7aAgXqX8NhBcT3h3jIw_clGrYo-0wnW1_c4Dj2lyJihlGjDTnovw-LFl7E3Gi-Hz7aZD4O62oLnyP-w/s640/halrun_MCP23017.jpg" width="640" /></a></div>
<br />
Para probar algunas entradas y salidas del MCP23017, se va a crear una GUI simple con Glade. En la GUI se pondrá 2 HAL_ToggleButton y 2 HAL_LED. Los HAL_ToggleButton tienen el nombre de boton0 y boton1; los HAL_LED tienen el nombre de LED0 y LED1. Se ha guardado con el nombre de InputOutputGPIO.glade.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9gYTZCZukQ4DjfUS6dLg6_vQbA5LEi9kd9s-PmqLWXLPNFDc5pNBUz7KpP4oCu28oQhzYAqmcYppkJjJGfaARsew8ZwUvm3u2Aiz_vf4xjQ2XusW1n34L5DNuvc-jzAXjACS7txAjH4Q/s1600/buttons.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9gYTZCZukQ4DjfUS6dLg6_vQbA5LEi9kd9s-PmqLWXLPNFDc5pNBUz7KpP4oCu28oQhzYAqmcYppkJjJGfaARsew8ZwUvm3u2Aiz_vf4xjQ2XusW1n34L5DNuvc-jzAXjACS7txAjH4Q/s1600/buttons.jpg" /></a></div>
<br />
Se ha creado un archivo hal para realizar las conexiones correspondientes con los botones y los led´s.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">sudo nano InputOutputGPIO.hal</pre>
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">#Outputs
net boton0 InputOutputGPIO.boton0 buttons.A.out-00 InputOutputGPIO.LED0
net boton1 InputOutputGPIO.boton1 buttons.B.out-00 InputOutputGPIO.LED1
#Input
net boton-info <= buttons.B.in-01
net boton-info => gmoccapy.v-button-7 </pre>
<br />
EL pin GPB1 está conectado a un interuptor infrarrojo que hace la función de pulsador para activar y desactivar el boton de info de gmoccapy_lcd7. Las salidas GPA0 y GPB0, están conectadas a LED´s para visualizar el funcionamiento al pulsar el boton HAL_ToggleButton.<br />
<br />
Lo siguiente es incluir el archivo .hal y .glade en el archivo .ini.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">[DISPLAY]
# Name of display program, e.g., tkemc
#DISPLAY = tkemc
#DISPLAY = axis
DISPLAY = gmoccapy_lcd7
EMBED_TAB_NAME = Boton
EMBED_TAB_LOCATION = box_left
EMBED_TAB_COMMAND = gladevcp -g 80x80+10+10 -H InputOutputGPIO.hal InputOutputGPIO.glade</pre>
<br />
La Gui se abrirá en una ventana de 80x80 pixeles y se recorrerá 10 en X y 10 en Y pixeles.<br />
<br />
Lo último es iniciar el componente hal MCP23017 en el arhivo .hal principal.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">loadusr -Wn buttons hal_gpio_mcp23017 -n buttons -b 1 -a 39 -op A00,B00 -ip B01</pre>
<br />
Si se desea agregar más MCP23017 se debe cambiar el nombre y dirección del i2c.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">loadusr -Wn buttons1 hal_gpio_mcp23017 -n buttons1 -b 1 -a 32 -op A03,A05,B00 -ip B01,A00</pre>
<br />
buttons es el nombre con el que se crearán los pines hal, -b indica el bus del i2c (puede ser 0, 1 o 2) en este caso se ocupa el i2c de los pines
P9.19 y P9.20, -a 39 indica que se esta usando la dirección i2c 0x27 (39) conectado A0,A1,A2 a VCC, -op indican las salidas que se van a usar y -ip las entradas que se usarán.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3Bhmji1ekDC4TdqKksANeel0Ypj6ZxwFoKeDHzpibG5ASvmILvXWDF0C9MxAoGP7eOZIb_BYnbj6Iyq889HYAorUdJK4t610QyRifiKyjquFfweZuv7pxLc96Qd0zzpRH1fauoqSs7Qc/s1600/MCP23017.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="424" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3Bhmji1ekDC4TdqKksANeel0Ypj6ZxwFoKeDHzpibG5ASvmILvXWDF0C9MxAoGP7eOZIb_BYnbj6Iyq889HYAorUdJK4t610QyRifiKyjquFfweZuv7pxLc96Qd0zzpRH1fauoqSs7Qc/s640/MCP23017.gif" width="640" /></a></div>
<br />
<br />
<a href="https://drive.google.com/file/d/0B6xWQnSH6ge5WWtld1p6dXJXM3c/view?usp=sharing" target="_blank">InputOutputGPIO.glade</a>.<br />
<br />
<br />
<br />
<br />
<br />Vichentehttp://www.blogger.com/profile/13532517773299729858noreply@blogger.com0tag:blogger.com,1999:blog-6209740641626143717.post-42093705914757037782016-03-15T18:33:00.001-07:002016-03-15T18:34:40.986-07:00Utilizar GUI gmoccapy_lcd7 con Control de Xbox 360.Se necesita instalar unas librerías para que la Beaglebone Black pueda detectar el control del Xbox 360.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">//Instalar xboxdrv, para simular el control de Xbox 360 en Linux.
sudo apt-get install xboxdrv
//Instalar evtest, para visualizar los eventos generados por cada uno de los botones del
//control de Xbox 360
sudo apt-get install evtest
//Al finalizar se debe correr el programa de xboxdrv para detectar el control de Xbox 360
sudo xboxdrv --silent --detach-kernel-driver</pre>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDe7_6dpSorO1PC6aDqSbtlhCbWgtR3CgzmD41O-zM7M23kyqKrw0vP8OW0y_VExbqFuot00grqbhpM-Z9_VgdlopVoEKBY5MWxuyiH_HuweDJX1lSM7R3PgP-Bo3-oQoQuBAPRshXruU/s1600/config1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="410" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDe7_6dpSorO1PC6aDqSbtlhCbWgtR3CgzmD41O-zM7M23kyqKrw0vP8OW0y_VExbqFuot00grqbhpM-Z9_VgdlopVoEKBY5MWxuyiH_HuweDJX1lSM7R3PgP-Bo3-oQoQuBAPRshXruU/s640/config1.jpg" width="640" /></a></div>
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">//Identificar el control de xbox 360
nano /proc/bus/input/devices
//Identificar el tipo de evento (js0 event1)
ctrl+X</pre>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmLtlwVThnIL4Lskf_xmy-X9Mh-_GJ_q2g4dnCQV1982icTv6NaJFuh8GPX-wt4UVBCD9RRGjOUEG3v4hKuFy5G1bnHQKiIUb_enBjiHx-OWaK1AyH77vNxjDHPv4yzfNYgZ8XhyB8O50/s1600/config2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="412" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmLtlwVThnIL4Lskf_xmy-X9Mh-_GJ_q2g4dnCQV1982icTv6NaJFuh8GPX-wt4UVBCD9RRGjOUEG3v4hKuFy5G1bnHQKiIUb_enBjiHx-OWaK1AyH77vNxjDHPv4yzfNYgZ8XhyB8O50/s640/config2.jpg" width="640" /></a></div>
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">//Al ejecutar el siguiente comando sale cuales son los tipos de eventos soportados e ira
// cambiando el valor de acuerdo a los botones que se hayan presionado.
sudo evtest /dev/input/event1
ctrl+C</pre>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8BsjdypbAvPc9aKNmCfoKrC2j9_11TZ5JSRkY-qw9VsMvxliY_yDdZoPI5lHqBYA75nZ_TIUnjtEMh4hr5VpzjGI6saeuaei9HqQyoAq7T-FsWfFUUH1pdyBUfcNFig7lJ6pkcESdKHI/s1600/config3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="410" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8BsjdypbAvPc9aKNmCfoKrC2j9_11TZ5JSRkY-qw9VsMvxliY_yDdZoPI5lHqBYA75nZ_TIUnjtEMh4hr5VpzjGI6saeuaei9HqQyoAq7T-FsWfFUUH1pdyBUfcNFig7lJ6pkcESdKHI/s640/config3.jpg" width="640" /></a></div>
<br />
Dar permisos para poder acceder a los eventos del control desde machinekit.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">//90-Xbox.rules es el nombre que le he dado al archivo, pero se puede usar cualquier
//nombre (myname.rules).
sudo nano /etc/udev/rules.d/90-Xbox.rules
//Copiar esto en el archivo
SUBSYSTEM=="input", GROUP="plugdev", MODE=="0660"
//Salir del editor
ctrl+O
ctrl+X
//Reiniciar las reglas para que inicie 90-Xbox.rules con el cambio realizado.
sudo udevadm trigger
//Comprobar que los eventos (dispositivos) se han cargado
sudo udevadm trigger</pre>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPRl2jktkuTncHsg5SGVvKhMzd23HHN0Ya1Rr9GruXndSrF65sId1SgdaHeNHpguFUYI3-6R1kl0Za8MjDRod14tiGu9AUd7MXhds55HzZJYh0_jANvEjhpJnGcBSDYZenXbKF4tzhLew/s1600/config4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="414" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPRl2jktkuTncHsg5SGVvKhMzd23HHN0Ya1Rr9GruXndSrF65sId1SgdaHeNHpguFUYI3-6R1kl0Za8MjDRod14tiGu9AUd7MXhds55HzZJYh0_jANvEjhpJnGcBSDYZenXbKF4tzhLew/s640/config4.jpg" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBVJOkS0BThTI8zhMF3nAcjIhz4ouNMCl1RcNS2dV5x3uj6Gr_Xa5eF9AKauU2bAioNnYHoCUHMpxrHq6NOQQfVQEHJDxoyUf0WboujV8uWmeZLKK9SbZQI4hBDZpAO1lJ_CSyJryx3JQ/s1600/config5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="414" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBVJOkS0BThTI8zhMF3nAcjIhz4ouNMCl1RcNS2dV5x3uj6Gr_Xa5eF9AKauU2bAioNnYHoCUHMpxrHq6NOQQfVQEHJDxoyUf0WboujV8uWmeZLKK9SbZQI4hBDZpAO1lJ_CSyJryx3JQ/s640/config5.jpg" width="640" /></a></div>
<br />
<br />
Comprobar control de Xbox 360 con halrun.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">//halrun
halrun
//Iniciar el evento del control con halrun, en este caso el control del Xbox 360
// se puede usar con cualquier nombre con el que haya reconocido. Siendo el nombre
// reconocido "Xbox Gamepad (userspace driver)" se puedes usar Xbox o Gamepad.
loadusr -W hal_input -KRAL Gamepad
//Mantener pulsado cualquier botón, en este caso se ha pulsado el botón A y al
// correr show pin se visualizarán los cambios.
show pin
//Para salir
exit</pre>
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"></pre>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAirVRPfnGItS3be7cqzIA_ppxiU4xer_eY6pZVKjcKqMnvgoW_yw2kTprTkc2s3RbHBZkh3kD88qeXWw8Bs1EY32MKEg-Ps0aHxfnibTUbULLZ1RxfNrnVD3cV0DbloTIyudhhQRKVCI/s1600/config6.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="412" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAirVRPfnGItS3be7cqzIA_ppxiU4xer_eY6pZVKjcKqMnvgoW_yw2kTprTkc2s3RbHBZkh3kD88qeXWw8Bs1EY32MKEg-Ps0aHxfnibTUbULLZ1RxfNrnVD3cV0DbloTIyudhhQRKVCI/s640/config6.jpg" width="640" /></a></div>
<br />
AL pulsar el boton A del control de Xbox 360 cambia a TRUE input.0.btn-a<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAcCg47xLURx9Ov5DFod-DSodrmX96XT388U9vm6xBlNT-ZnDRmhs3VCyl_0KgVBpg-MA1JMdn0_vQ8w6YrGrUyPbcWiLHmO078kT8OrjETiMl6rb9enQZRJEg9p1k941EtcDLus8wjBc/s1600/config7.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="410" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAcCg47xLURx9Ov5DFod-DSodrmX96XT388U9vm6xBlNT-ZnDRmhs3VCyl_0KgVBpg-MA1JMdn0_vQ8w6YrGrUyPbcWiLHmO078kT8OrjETiMl6rb9enQZRJEg9p1k941EtcDLus8wjBc/s640/config7.jpg" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
Nota: Realizar el paso de pulsar cualquier botón y visualizar, para poder identificar a que botón pertenece cada evento "input.0...".<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcwCJxTgzXMvDw48Zd1__w5aFF_n_5gVYxyk0Bti459kQLins8Y0KsXWguqm3VUy_JPqvA9V90Xkws14dA6_rpTzkWIwaH7dClwDROjIMKO68Dwodm9fzgXgNlMrZRKzmGXlnavGAMBBI/s1600/xbox-360-controller.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="299" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcwCJxTgzXMvDw48Zd1__w5aFF_n_5gVYxyk0Bti459kQLins8Y0KsXWguqm3VUy_JPqvA9V90Xkws14dA6_rpTzkWIwaH7dClwDROjIMKO68Dwodm9fzgXgNlMrZRKzmGXlnavGAMBBI/s640/xbox-360-controller.jpg" width="640" /></a></div>
<br />
Integrar archivo joypad.hal a Gui gmoccapy_lcd7.<br />
<br />
El archivo .hal fue descargado de <a href="http://wiki.linuxcnc.org/cgi-bin/wiki.pl?A_New_Approach_For_Using_Joypads_With_LinuxCNC" target="_blank">LinuxCNC Joypads</a> y se ha realizado algunas modificaciones para adaptarlo al control de Xbox 360.<br />
<br />
Probar el funcionamiento del control, ejecutando:<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">sudo evtest /dev/input/event1</pre>
<br />
En este caso la palanca izquierda del mando, reacciona cuando se pulsa a la izquierda con valores negativos y a la derecha con valores positivos; pero cuando se mueve de arriba a bajo funciona de forma inversa, dando valores negativos cuando se pulsa hacia arriba y valores positivos pulsando hacia abajo. Algo parecido ocurre en la palanca derecha del mando.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2Z2BmISVT9A1OqSlLedgJ4ZuCQ_kOHky8jIkFsJRQzdSKA7DD2a1akwBKb3GtPc2Sf8z24tOdQbZdnpgmkjEfodb7hZ2xh-976pHzpwi03xJ2ItCgFWGlvURB42R3my2ySBkXSaZ860A/s1600/config8.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="412" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2Z2BmISVT9A1OqSlLedgJ4ZuCQ_kOHky8jIkFsJRQzdSKA7DD2a1akwBKb3GtPc2Sf8z24tOdQbZdnpgmkjEfodb7hZ2xh-976pHzpwi03xJ2ItCgFWGlvURB42R3my2ySBkXSaZ860A/s640/config8.jpg" width="640" /></a></div>
<br />
<a href="http://machinekit-docs.readthedocs.org/en/latest/machinekit-documentation/components/joyhandle/" target="_blank">Componente joyhandle</a>.<br />
<a href="http://machinekit-docs.readthedocs.org/en/latest/machinekit-documentation/components/joyhandle/" target="_blank">Código del Componente joyhandle</a>.<br />
<br />
Se inicializa el componente.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">loadusr -W hal_input -KRAL Xbox
# load joyhandle component and attach to threads (in this case 3 instances)
loadrt joyhandle count=3
addf joyhandle.0 servo-thread # x
addf joyhandle.1 servo-thread # y
addf joyhandle.2 servo-thread # z</pre>
<br />
Se configura la velocidad (máxima). Los valores de power varían de acuerdo a la sensibilidad, al aumentarlo se recomienda aumentar el valor de de deadband (0-0.99). La escala al ser negativa, invierte la dirección; al tener valores menores a 1 disminuye la velocidad y viceversa.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">setp halui.jog-speed 1500 # desired maximum jog speed mm/min
# --Start-- These parameters ara used to set up joyhandle
setp halui.jog-deadband 0. # important: default value is 0.2, that would override joyhandle.deadband
setp joyhandle.0.power 3. # select nonlinearity to handele low jog values
setp joyhandle.1.power 3.
setp joyhandle.2.power 4. # in my case the z-axis is set up more sensitive
setp joyhandle.0.deadband 0.1
setp joyhandle.1.deadband 0.1
setp joyhandle.2.deadband 0.1
setp joyhandle.0.scale 1.
setp joyhandle.1.scale -1. # negative values invert jogging
setp joyhandle.2.scale -0.75 # invert jogging and the z-axis is scaled to lower speed
# --End--</pre>
<br />
Se configura el componente joyhandle con las palancas del mando. <br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"># connect hal_input to halui via joyhandle (in case use your own axes-names)
#left stick -> left-rigth (X jogging)
net velX input.0.abs-x-position => joyhandle.0.in
net velXout joyhandle.0.out => halui.jog.0.analog
#left stick -> up-down (Y jogging)
net velY input.0.abs-y-position => joyhandle.1.in
net velYout joyhandle.1.out => halui.jog.1.analog
#rigth stick -> up-down (Z jogging)
net velZ input.0.abs-ry-position => joyhandle.2.in
net velZout joyhandle.2.out => halui.jog.2.analog </pre>
<br />
Se configura los botones del mando a las acciones que se requiera dar. Importate revisar la guía de comandos de la herramienta <a href="http://linuxcnc.org/docs/html/man/man1/halui.1.html" target="_blank">halui (HAL User Interface).</a><br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"># [BUTTON-SAMPLES] use your own joypad pin-names
#One button sample
net spindleOff input.0.btn-x => halui.spindle.stop
net spindleOn input.0.btn-y => halui.spindle.start
net estopActivate input.0.btn-start => halui.estop.activate
net estopNotActivate input.0.btn-start-not => halui.estop.reset</pre>
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"># Hal configuration file to move a cnc machine using a joypad using joyhandle component
# Copyright 2008 Paul Willutzki <paul[at]willutzki[dot]de>
# Licence: GPL
# Version 3
# This Hal-File needs the joyhandle component.
# This uses the following formula for a non linear joypad movements:
# y = (scale * (a*x^power + b*x)) + offset
#
# The parameters a and b are adjusted in such a way, that the function starts at (deadband,offset) and ends at (1,scale+offset).
# Negative values will be treated point symetrically to origin. Values -deadband < x < +deadband will be set to zero.
# Values x > 1 and x < -1 will be skipped to +-scale+offset. Negative scale values invert the movement.
# With power one can adjust the nonlinearity (default = 2).
# Default for deadband is 0.
# Valid values are: power >= 1.0 (reasonable values are 1.x .. 4-5), 0 <= deadband < 0.99 (reasonable 0.1). If you use high deadbands (>0.5) you need higher power values to smoothly start at (deadband,offset).
# The additional offset component can be set in special cases (default = 0).
# All values can be adjusted for each instance (joypad axis) separately.
# Please take also a look at the manpages for johandle.
# Insert the following lines in the INI-File (section [HAL])
# HALUI = halui
# HALFILE = joypad_V3.hal
# Load the hal_input component that creates pins for axes and buttons
# See man hal_input for details and finding input devices
loadusr -W hal_input -KRAL Xbox
# load joyhandle component and attach to threads (in this case 3 instances)
loadrt joyhandle count=3
addf joyhandle.0 servo-thread # x
addf joyhandle.1 servo-thread # y
addf joyhandle.2 servo-thread # z
setp halui.jog-speed 1500 # desired maximum jog speed mm/min
# --Start-- These parameters ara used to set up joyhandle
setp halui.jog-deadband 0. # important: default value is 0.2, that would override joyhandle.deadband
setp joyhandle.0.power 3. # select nonlinearity to handele low jog values
setp joyhandle.1.power 3.
setp joyhandle.2.power 4. # in my case the z-axis is set up more sensitive
setp joyhandle.0.deadband 0.1
setp joyhandle.1.deadband 0.1
setp joyhandle.2.deadband 0.1
setp joyhandle.0.scale 1.
setp joyhandle.1.scale -1. # negative values invert jogging
setp joyhandle.2.scale -0.75 # in my case the z-axis is scaled to lower speed
# --End--
# connect hal_input to halui via joyhandle (in case use your own axes-names)
#left stick -> left-rigth (X jogging)
net velX input.0.abs-x-position => joyhandle.0.in
net velXout joyhandle.0.out => halui.jog.0.analog
#left stick -> up-down (Y jogging)
net velY input.0.abs-y-position => joyhandle.1.in
net velYout joyhandle.1.out => halui.jog.1.analog
#rigth stick -> up-down (Z jogging)
net velZ input.0.abs-ry-position => joyhandle.2.in
net velZout joyhandle.2.out => halui.jog.2.analog
# connect hal_joypad directly to halui without joyhandle (in case use your own axes-names)
#net velX joypad.axis.3 => halui.jog.0.analog
#net velY joypad.axis.2 => halui.jog.1.analog
#net velZ joypad.axis.1 => halui.jog.2.analog
# [BUTTON-SAMPLES] use your own joypad pin-names
#One button sample
net spindleOff input.0.btn-x => halui.spindle.stop
net spindleF input.0.btn-a => halui.spindle.forward
net spindleR input.0.btn-b => halui.spindle.reverse
net spindleSlow input.0.abs-hat0x-is-neg => halui.spindle.decrease
net spindleFast input.0.abs-hat0x-is-pos => halui.spindle.increase
net homeAllAxis input.0.btn-mode => halui.home-all
net increasePosA input.0.btn-tr => halui.jog.3.plus
net decreasePosA input.0.btn-tl => halui.jog.3.minus
net estopActivate input.0.btn-start => halui.estop.activate
net estopNotActivate input.0.btn-start-not => halui.estop.reset</pre>
<br />
Para visualizar el incremento y decremento de la velocidad del husillo, se va utilizar el archivo <span style="background-color: yellow;">spindle_sim.hal</span> de la configuración de gmoccapy y en el archivo postgui.hal, se va unir las señales incluyendo las que pertenecen a gmoccapy.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">#archivo potgui.hal
loadrt abs names=abs_spindle_feedback
addf abs_spindle_feedback servo-thread
net spindle-speed-limited => abs_spindle_feedback.in
net spindle-abs abs_spindle_feedback.out => gmoccapy.spindle_feedback_bar
net spindle-at-speed gmoccapy.spindle_at_speed_led
net boton-info input.0.btn-select => gmoccapy.v-button-7</pre>
<br />
Si se desea se podrían reemplazar las señales de halui con las de gmoccapy.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Mny2tPN8Qxmfmm7YR3fpKfW-rQeMYjvJ7t6QI9HVsZ7dKs4tkjjQPgFmf896WbJPTPU4DZnYiWYKD_hkwC2q9vcnuT_vD2OeEx1ojny9womn6gAML8Oh252tuUdg1OZybicp0PKzAQk/s1600/config9.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="344" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Mny2tPN8Qxmfmm7YR3fpKfW-rQeMYjvJ7t6QI9HVsZ7dKs4tkjjQPgFmf896WbJPTPU4DZnYiWYKD_hkwC2q9vcnuT_vD2OeEx1ojny9womn6gAML8Oh252tuUdg1OZybicp0PKzAQk/s640/config9.jpg" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhB3UYE_JbNUi3PRs-ki0H534WZFgW8FNFcvptGdRT3PbcBxGnkKKrdn-d6luQh5nNgw_ycZTGDvSLTJ6zWwBFsm141VvVoD0FpwzUylPDiQ9b7B67YNTVZlrI62ld09VxQonQ3wklT7yI/s1600/config10.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="342" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhB3UYE_JbNUi3PRs-ki0H534WZFgW8FNFcvptGdRT3PbcBxGnkKKrdn-d6luQh5nNgw_ycZTGDvSLTJ6zWwBFsm141VvVoD0FpwzUylPDiQ9b7B67YNTVZlrI62ld09VxQonQ3wklT7yI/s640/config10.jpg" width="640" /></a></div>
<br />
<br />
Parte del código del archivo gmoccapy encargado de conectar los botones verticales. No hay que cambiar nada solo es una breve explicación de como funcionan los botones verticales y horizontales de gmoccapy.<br />
<br />
Se guardan los botónes en la variable v_tabs y se da un número a cada uno para poder buscarlos.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">self.v_tabs = [(0, "tbtn_estop"), (1, "tbtn_on"), (2, "rbt_manual"), (3, "rbt_mdi"),
(4, "rbt_auto"), (5, "tbtn_setup"), (6, "tbtn_user_tabs"), (7, "tbtn_info")
]</pre>
<br />
<br />
Se define la función que se encarga de detectar si se ha presionado algún botón.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">def _on_v_button_changed(self, pin):
self._add_alarm_entry("got v_button_signal %s" % pin.name)
if not pin.get():
return
btn = str(pin.name)
nr = int(btn[-1])
tab = self.v_tabs # see in the __init__ section for the declaration of self.tabs
button = None
for index in tab:
if int(index[0]) == nr:
# this is the name of the button
button = index[1]
if button:
# only emit a signal if the button is sensitive, otherwise
# running actions may be interupted
if self.widgets[button].get_sensitive() == False:
print("%s not_sensitive" % button)
self._add_alarm_entry("%s not_sensitive" % button)
return
button_pressed_list = ("rbt_manual", "rbt_mdi", "rbt_auto")
button_toggled_list = ("tbtn_setup")
if button in button_pressed_list:
self.widgets[button].set_active(True)
self.widgets[button].emit("pressed")
elif button in button_toggled_list:
self.widgets[button].set_active(not self.widgets[button].get_active())
else:
self.widgets[button].emit("clicked")
else:
print("No button found in v_tabs from %s" % pin.name)
self._add_alarm_entry("No button found in v_tabs from %s" % pin.name)</pre>
<br />
Se encarga de crear las conexiones hal para poder usar los botones en archivos .hal.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"> # generate the vertical button pins
for v_button in range(0, 8):
pin = self.halcomp.newpin("v-button-%s" % v_button, hal.HAL_BIT, hal.HAL_IN)
hal_glib.GPin(pin).connect("value_changed", self._on_v_button_changed)</pre>
<br />
Nota: Se actualizado la conexión del botón de info en <a href="https://github.com/vichente1/gmoccapy_lcd7" target="_blank">gmoccapy_lcd7</a> para que se pueda controlar con pulsadores.<br />
<br />
El botón start del control de Xbox 360 simula el comportamiento de un botón de emergencia. Al tenerlo pulsado se activa estop, caso contrario mantiene activada la máquina. <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1D8jHYtmKIOvOSqNqnt3WfA9U19nDhi6919v2Ao-6G_Rg-BgutxZ_LqqJJMyPRTDpHCIKt8AiZzLpAptKX8vDfNcYYA7RHpnCoZwCm9dL9m0XMnIvCuDrkM1n5vMBaM8s38ZDA9tPbfY/s1600/estop-xbox360.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1D8jHYtmKIOvOSqNqnt3WfA9U19nDhi6919v2Ao-6G_Rg-BgutxZ_LqqJJMyPRTDpHCIKt8AiZzLpAptKX8vDfNcYYA7RHpnCoZwCm9dL9m0XMnIvCuDrkM1n5vMBaM8s38ZDA9tPbfY/s1600/estop-xbox360.gif" /></a></div>
<br />
<br />
El botón Guide (btn-mode), se encarga de mover los ejes al origen. Debe estar configurado el archivo .ini para hacer un "home-all" a los ejes que se quiera.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4W4lXBI5hWluZEh0ZdLzblV7882JVWKQUPix2VSdD2UEuEIw0hjmhAyphQSgsW5_GiB5f5W4o7mUyMzSQwIezwq80vh94MIzfTVx5quHcaEPfMsS50Zojd4yNmjtepEVRJPgHdWMGOxA/s1600/home-all-xbox360.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4W4lXBI5hWluZEh0ZdLzblV7882JVWKQUPix2VSdD2UEuEIw0hjmhAyphQSgsW5_GiB5f5W4o7mUyMzSQwIezwq80vh94MIzfTVx5quHcaEPfMsS50Zojd4yNmjtepEVRJPgHdWMGOxA/s1600/home-all-xbox360.gif" /></a></div>
<br />
El botón Back (btn-mode), activa y desactiva el toggled button de info. <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCMkxyOdnulWFAL3KPe993LDHbkYiZeBe9iExbW1FYgjuqQkMNV-tGTEQEjaG7OatKT7UTSIhb1rYiDeaSCuLd8lrA6J66oFj7DJFvPSwDv2B31U8cAIYUIvy6AVUemF_mYwe1NlleFPU/s1600/info-tbtn-xbox360.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCMkxyOdnulWFAL3KPe993LDHbkYiZeBe9iExbW1FYgjuqQkMNV-tGTEQEjaG7OatKT7UTSIhb1rYiDeaSCuLd8lrA6J66oFj7DJFvPSwDv2B31U8cAIYUIvy6AVUemF_mYwe1NlleFPU/s640/info-tbtn-xbox360.gif" width="640" /></a></div>
<br />
<br />
Activa, desactiva y cambia la dirección el husillo.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8ZS6nhXXWxTXArIWquKpx8baBbu_Im9r-6AxPEpvyAPy6HfW7AT2-mtvSQTD5Vw9JgTkk-PBsUK-GHll4t-r8lVio-MUZVOQcHCgyiTukw5ghk3u0OBu0buJd7bY4KCY21TLKfFUaJbw/s1600/spindle-on-off.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8ZS6nhXXWxTXArIWquKpx8baBbu_Im9r-6AxPEpvyAPy6HfW7AT2-mtvSQTD5Vw9JgTkk-PBsUK-GHll4t-r8lVio-MUZVOQcHCgyiTukw5ghk3u0OBu0buJd7bY4KCY21TLKfFUaJbw/s640/spindle-on-off.gif" width="640" /></a></div>
<br />
<br />
<br />
<br />
<br />
Aumenta y disminuye la velocidad del husillo.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5Wki14UkCUs-3HQWHXJWve_YBBuJ8u5mo1N0p4eAPDwmBprdqAPk0dYCwac9dBYQFPW-KgANlcdbNS8MH0gVp_FtNkcSHrNhyn6HHnO7JVXf0Ib9dcQIsiBO7m-2NXD0Gg6CkVXmd58s/s1600/spindle-speed.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5Wki14UkCUs-3HQWHXJWve_YBBuJ8u5mo1N0p4eAPDwmBprdqAPk0dYCwac9dBYQFPW-KgANlcdbNS8MH0gVp_FtNkcSHrNhyn6HHnO7JVXf0Ib9dcQIsiBO7m-2NXD0Gg6CkVXmd58s/s640/spindle-speed.gif" width="640" /></a></div>
<br />
Incrementa y decrementa la posición del eje A.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHaVdEztJg6XBCn0epU017FJ8BJwK3-77jcg2oJhRx85Ne69J4JTj9Sx2a8uCYo7QIJSTftAHG2cSOOznv9ADJBENVM5PYm004hklWsRSk0RbA_v3y-ZXoETd22nQ_QBdyJnOCtB7sVKU/s1600/move-eje-A.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHaVdEztJg6XBCn0epU017FJ8BJwK3-77jcg2oJhRx85Ne69J4JTj9Sx2a8uCYo7QIJSTftAHG2cSOOznv9ADJBENVM5PYm004hklWsRSk0RbA_v3y-ZXoETd22nQ_QBdyJnOCtB7sVKU/s640/move-eje-A.gif" width="640" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
Movimiento de ejes X, Y y Z.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhY68UA4R-DGbDEuElGNm6ch-iWarK65X0an4ukzfR-GvWdn0qOg0FsJ5UyTRbVW2RjOc5PcQihyzt8KmPu1IKvNfDjHcE5Ali30anBNBHvUnYhNIeKHdWzJrXIfrQNzf10BGdw_YnSe7w/s1600/axis-xbox360.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhY68UA4R-DGbDEuElGNm6ch-iWarK65X0an4ukzfR-GvWdn0qOg0FsJ5UyTRbVW2RjOc5PcQihyzt8KmPu1IKvNfDjHcE5Ali30anBNBHvUnYhNIeKHdWzJrXIfrQNzf10BGdw_YnSe7w/s640/axis-xbox360.gif" width="640" /></a></div>
<br />
<br />
<br />
<br />
<br />
Descargar archivos <br />
<br />
<br />
<a href="https://drive.google.com/file/d/0B6xWQnSH6ge5Zm5sdDZmZDFQMm8/view?usp=sharing" target="_blank">MF5-LCD7-mill</a><br />
<br />
<br />
<br />Vichentehttp://www.blogger.com/profile/13532517773299729858noreply@blogger.com0tag:blogger.com,1999:blog-6209740641626143717.post-29583655350151111172016-01-21T17:20:00.000-08:002016-01-22T11:06:14.048-08:00Obtener valores de PID con componente AT PID y configurar temperatura.Al final del tutorial se dejarán todos los archivos que se necesitan para poder hacer funcionar la configuración de la impresora 3d con Machinekit. <br />
<br />
En este tutorial se va ha explicar como funciona el componente AT PID para poder calibrar los extrusores de una impresora 3d, para la cama caliente se realiza de la misma manera pero considerando algunos cambios que también se explicarán.<br />
<br />
Lo primero que se debe realizar es configurar el Device Tree Overlay para que inicie cuando se prenda la Beaglebone Black, con esto se evita que se calienten los extrusores y cama caliente, mientras no se inicie Machinekit (LinuxCNC). <br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">//This source file is provided under MIT License terms.
//Copyright (c) 2013 Calypso Ventures, Inc.
//
//Permission is hereby granted, free of charge, to any person obtaining a copy
//of this software and associated documentation files (the "Software"), to deal
//in the Software without restriction, including without limitation the rights
//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
//copies of the Software, and to permit persons to whom the Software is
//furnished to do so, subject to the following conditions:
//
//The above copyright notice and this permission notice shall be included in
//all copies or substantial portions of the Software.
//
//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
//THE SOFTWARE.
/dts-v1/;
/plugin/;
/ {
compatible = "ti,beaglebone", "ti,beaglebone-black";
/* identification */
part-number = "BBB-LCNC-MF5";
version = "00A0";
/* state the resources this cape uses */
exclusive-use =
/* the pin header uses */
/* "J8.3", gpio1_6 eMMC*/
/* "J8.4", gpio1_7 eMMC*/
/* "J8.5", gpio1_2 eMMC*/
/* "J8.6", gpio1_3 eMMC*/
"J8.7", /* gpio2_2 -> Libre*/
"J8.8", /* gpio2_3 -> Libre*/
"J8.9", /* gpio2_5 -> Libre*/
"J8.10", /* gpio2_4 -> Libre*/
"J8.11", /* gpio1_13-> lcd R1 -> Libre*/
"J8.12", /* gpio1_12-> lcd G1 -> Libre*/
"J8.13", /* gpio0_23-> lcd G0 -> Libre*/
"J8.14", /* gpio0_26-> lcd R0 -> Libre*/
"J8.15", /* gpio1_15-> lcd R2 -> Libre*/
"J8.16", /* gpio1_14-> lcd B2 -> Libre*/
"J8.17", /* gpio0_27-> lcd B1 -> Libre*/
"J8.18", /* gpio2_1 -> Libre*/
"J8.19", /* gpio0_22-> lcd B0 -> Libre*/
/* "J8.20", gpio1_31 eMMC*/
/* "J8.21", gpio1_30 eMMC*/
/* "J8.22", gpio1_5 eMMC*/
/* "J8.23", gpio1_4 eMMC*/
/* "J8.24", gpio1_1 eMMC*/
/* "J8.25", gpio1_0 eMMC*/
"J8.26", /* gpio1_29-> Libre*/
/* "J8.27", gpio2_22-> lcd VSYNC*/
/* "J8.28", gpio2_24-> lcd PCLK*/
/* "J8.29", gpio2_23-> lcd HSYNC*/
/* "J8.30", gpio2_25-> lcd DE*/
/* "J8.31", gpio0_10-> lcd B6*/
/* "J8.32", gpio0_11-> lcd B7*/
/* "J8.33", gpio0_9 -> lcd B5*/
/* "J8.34", gpio2_17-> lcd B3*/
/* "J8.35", gpio0_8 -> lcd B4*/
/* "J8.36", gpio2_16-> lcd G7*/
/* "J8.37", gpio2_14-> lcd G5*/
/* "J8.38", gpio2_15-> lcd G6*/
/* "J8.39", gpio2_12-> lcd G3*/
/* "J8.40", gpio2_13-> lcd G4*/
/* "J8.41", gpio2_10-> lcd R7*/
/* "J8.42", gpio2_11-> lcd G2*/
/* "J8.43", gpio2_8 -> lcd R5*/
/* "J8.44", gpio2_9 -> lcd R6*/
/* "J8.45", gpio2_6 -> lcd R3*/
/* "J8.46", gpio2_7 -> lcd R4*/
"J9.11", /* gpio0_30-> Libre*/
"J9.12", /* gpio1_28-> Libre*/
"J9.13", /* gpio0_31-> Libre*/
/* "J9.14", gpio1_18-> LCD ehrpwm1A*/
"J9.15", /* gpio1_16-> Libre*/
"J9.16", /* gpio1_19-> Libre*/
/* "J9.17", gpio0_5 -> spi0_cs0*/
/* "J9.18", gpio0_4 -> spi0_d1*/
/* "J9.19", gpio0_13-> EEPROM/I2C*/
/* "J9.20", gpio0_12-> EEPROM/I2C*/
/* "J9.21", gpio0_3 -> spi0_d0*/
/* "J9.22", gpio0_2 -> spi0_sclk*/
"J9.23", /* gpio1_17-> Libre*/
"J9.24", /* gpio0_15-> Libre*/
"J9.25", /* gpio3_21-> Libre*/
"J9.26", /* gpio0_14-> Libre*/
"J9.27", /* gpio3_19-> Libre*/
"J9.28", /* gpio3_17-> Libre*/
"J9.29", /* gpio3_15-> Libre*/
"J9.30", /* gpio3_16-> Libre*/
"J9.31", /* gpio3_14-> Libre*/
"J9.41", /* gpio3_20-> Libre*/
"J9.42", /* gpio3_18-> Libre*/
/* the hardware IP uses */
/* "gpio1_6", */
/* "gpio1_7", */
/* "gpio1_2", */
/* "gpio1_3", */
"gpio2_2",
"gpio2_3",
"gpio2_5",
"gpio2_4",
"gpio1_13",
"gpio1_12",
"gpio0_23",
"gpio0_26",
"gpio1_15",
"gpio1_14",
"gpio0_27",
"gpio2_1",
"gpio0_22",
/* "gpio1_31", */
/* "gpio1_30", */
/* "gpio1_5", */
/* "gpio1_4", */
/* "gpio1_1", */
/* "gpio1_0", */
"gpio1_29",
/* "gpio2_22", */
/* "gpio2_24", */
/* "gpio2_23", */
/* "gpio2_25", */
/* "gpio0_10", */
/* "gpio0_11", */
/* "gpio0_9", */
/* "gpio2_17", */
/* "gpio0_8", */
/* "gpio2_16", */
/* "gpio2_14", */
/* "gpio2_15", */
/* "gpio2_12", */
/* "gpio2_13", */
/* "gpio2_10", */
/* "gpio2_11", */
/* "gpio2_8", */
/* "gpio2_9", */
/* "gpio2_6", */
/* "gpio2_7", */
"gpio0_30",
"gpio1_28",
"gpio0_31",
/* "gpio1_18", */
"gpio1_16",
"gpio1_19",
/* "gpio0_5", */
/* "gpio0_4", */
/* "gpio0_13", */
/* "gpio0_12", */
/* "gpio0_3", */
/* "gpio0_2", */
"gpio1_17",
"gpio0_15",
"gpio3_21",
"gpio0_14",
"gpio3_19",
"gpio3_17",
"gpio3_15",
"gpio3_16",
"gpio3_14",
"gpio3_20",
"gpio3_18",
"pru0";
fragment@0 {
target = <&am33xx_pinmux>;
__overlay__ {
MF5_gpio_pins: MF5_gpio_pins {
pinctrl-single,pins = <
/* 0x018 mmc J8.3 gpio1_6 */
/* 0x01C mmc J8.4 gpio1_7 */
/* 0x008 mmc J8.5 gpio1_2 */
/* 0x00C mmc J8.6 gpio1_3 */
0x090 0x3F /* J8.7 gpio2_2 */
0x094 0x3F /* J8.8 gpio2_3 */
0x09C 0x3F /* J8.9 gpio2_5 */
0x098 0x3F /* J8.10 gpio2_4 */
0x034 0x3F /* J8.11 gpio1_13 */
0x030 0x3F /* J8.12 gpio1_12 */
0x024 0x3F /* J8.13 gpio0_23 */
0x028 0x3F /* J8.14 gpio0_26 */
0x03C 0x3F /* J8.15 gpio1_15 */
0x038 0x3F /* J8.16 gpio1_14 */
0x02C 0x3F /* J8.17 gpio0_27 */
0x08C 0x3F /* J8.18 gpio2_1 */
0x020 0x3F /* J8.19 gpio0_22 */
/* 0x084 mmc J8.20 gpio1_31 */
/* 0x080 mmc J8.21 gpio1_30 */
/* 0x014 mmc J8.22 gpio1_5 */
/* 0x010 mmc J8.23 gpio1_4 */
/* 0x004 mmc J8.24 gpio1_1 */
/* 0x000 mmc J8.25 gpio1_0 */
0x07C 0x3F /* J8.26 gpio1_29 */
/* 0x0E0 0x3F J8.27 gpio2_22 */
/* 0x0E8 0x3F J8.28 gpio2_24 */
/* 0x0E4 0x3F J8.29 gpio2_23 */
/* 0x0EC 0x3F J8.30 gpio2_25 */
/* 0x0D8 0x3F J8.31 gpio0_10 */
/* 0x0DC 0x3F J8.32 gpio0_11 */
/* 0x0D4 0x3F J8.33 gpio0_9 */
/* 0x0CC 0x3F J8.34 gpio2_17 */
/* 0x0D0 0x3F J8.35 gpio0_8 */
/* 0x0C8 0x3F J8.36 gpio2_16 */
/* 0x0C0 0x3F J8.37 gpio2_14 */
/* 0x0C4 ??? J8.38 gpio2_15 */
/* 0x0B8 0x3F J8.39 gpio2_12 */
/* 0x0BC 0x3F J8.40 gpio2_13 */
/* 0x0B0 0x3F J8.41 gpio2_10 */
/* 0x0B4 0x3F J8.42 gpio2_11 */
/* 0x0A8 0x3F J8.43 gpio2_8 */
/* 0x0AC 0x3F J8.44 gpio2_9 */
/* 0x0A0 0x3F J8.45 gpio2_6 */
/* 0x0A4 0x3F J8.46 gpio2_7 */
0x070 0x3F /* J9.11 gpio0_30 */
0x078 0x3F /* J9.12 gpio1_28 */
0x074 0x3F /* J9.13 gpio0_31 */
/* 0x048 0x3F J9.14 gpio1_18 */
0x040 0x3F /* J9.15 gpio1_16 */
0x04C 0x3F /* J9.16 gpio1_19 */
/* 0x15C 0x3F J9.17 gpio0_5 */
/* 0x158 0x3F J9.18 gpio0_4 */
/* 0x17C N/C J9.19 gpio0_13 */
/* 0x178 N/C J9.20 gpio0_12 */
/* 0x154 0x3F J9.21 gpio0_3 */
/* 0x150 0x3F J9.22 gpio0_2 */
0x044 0x3F /* J9.23 gpio1_17 */
0x184 0x3F /* J9.24 gpio0_15 */
0x1AC 0x3F /* J9.25 gpio3_21 */
0x180 0x3F /* J9.26 gpio0_14 */
0x1A4 0x3F /* J9.27 gpio3_19 */
0x19C 0x3F /* J9.28 gpio3_17 */
0x194 0x3F /* J9.29 gpio3_15 */
0x198 0x3F /* J9.30 gpio3_16 */
0x190 0x3F /* J9.31 gpio3_14 */
0x1A8 0x3F /* J9.41 gpio3_20 */
0x1A0 0x3F /* J9.42 gpio3_18 */
>;
};
};
};
fragment@1 {
target = <&ocp>;
__overlay__ {
MF5_gpio {
compatible = "gpio-of-helper";
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&MF5_gpio_pins>;
P9_15 {
gpio-name = "P9_15";
gpio = <&gpio2 16 0>;
output;
init-low;
dir-changeable;
};
P9_26 {
gpio-name = "P9_26";
gpio = <&gpio1 14 0>;
output;
init-low;
dir-changeable;
};
};
};
};
fragment@2 {
target = <&pruss>;
__overlay__ {
status = "okay";
};
};
};
</pre>
<br />
Se añadido un pequeño cambio al archivo <a href="http://machinekit-gmoccapy-lcd7.blogspot.com/2015/07/device-tree-overlay-personalizada-para.html" target="_blank">BBB-LCNC-MF5-00A0.dts</a>. Al archivo se le añade el control de inicializar los pines P9.15 y P9.26 como salida en estado bajo. Añadiendo los pines mensionados como salida en estado bajo, se evita tener que desconectar la fuente para no calentar los extrusores hasta que inicie Machinekit.<br />
<br />
Para poder visualizar los pines se usa el controlador gpio-of-helper. Cada pin necesita un nombre, para poder usar el gpio se debe poner el número de gpio desfasado en 1, finalmente se pone si se quiere usar como salida o entrada. En el caso de ser salida se debe poner si se quiere en estado bajo o alto.<br />
<br />
Ejemplo:<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"> fragment@1 {
target = <&ocp>;
__overlay__ {
MF5_gpio {
compatible = "gpio-of-helper";
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&MF5_gpio_pins>;
//P9.15
Extrusor0 {
gpio-name = "MF5:Extrusor0";
gpio = <&gpio2 16 0>;
output;
init-low;
dir-changeable;
};
//P9.26
Extrusor1 {
gpio-name = "MF5:Extrusor1";
gpio = <&gpio1 14 0>;
output;
init-low;
dir-changeable;
};
};
};
};</pre>
<br />
target = <&ocp> -> define que se podrá visualizar la configuración de los pines en la siguiente dirección "/sys/devices/ocp.*/"<br />
<br />
compatible = "gpio-of-helper" -> indica que se usará el controlador gpio-of-helper.<br />
<br />
pinctrl-names = "default" -> indica que los pines se configurán por defecto.<br />
<br />
pinctrl-0 = <&MF5_gpio_pins> -> indica que se va usar los pines configuados en MF5_gpio_pins.<br />
<br />
P9_15 y P9_26 son funciones, puede ir con cualquier nombre ejemplo Extrusor0 y Extrusor1.<br />
<br />
gpio-name indica el nombre con el que va a apraecer en "/sys/devices/ocp.3/MF5_gpio.*/status"<br />
<br />
En gpio se pone el gpio desfasado 1, P9.15 "gpio1_16" quedaría "gpio2 16 0" lo mismo con P9.26.<br />
<br />
Se puede poner al gpio como salida o como entrada, input para entrada y output para salida.<br />
<br />
Si se usa como salida se puede poner el estado con el cuál se quiere inicializar el gpio, en alto "init-high" o en bajo "init-low".<br />
<br />
dir-changeable permite cambiar el gpio como output o input.<br />
<br />
Para que inicie al reiniciar, se debe agregar el archivo DTO a /etc/default/capemgr, ver este link para entender mejor <a href="http://bbb-machinekit-lcd7.blogspot.com/2015/07/instalacion-de-lcd-7-pulgadas-waveshare.html" target="_blank">DVK530-LCD7</a>.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLVgJ4tNTbSkxRtoW2o8SfycSLVsWDmqVQfkK5RXa_ewFW6FXGTTN9vKhUNXYRjIDRHSUx-kEN2LY1ft-gAFtawDCVrM_DC-9uufxzD-eumrcbsBXUthWHK6yrcNRcwvhUvsVYtSOKmBw/s1600/MF5-DTBO-1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="281" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLVgJ4tNTbSkxRtoW2o8SfycSLVsWDmqVQfkK5RXa_ewFW6FXGTTN9vKhUNXYRjIDRHSUx-kEN2LY1ft-gAFtawDCVrM_DC-9uufxzD-eumrcbsBXUthWHK6yrcNRcwvhUvsVYtSOKmBw/s640/MF5-DTBO-1.jpg" width="640" /></a></div>
<br />
Al prender o reiniciar la Beaglebone Black se podrá ver la función MF5_gpio con la dirección en salida usando "cat /sys/devices/ocp.*/MF5_gpio.14/status". Para poder obtener el estado del gpio (alto o bajo), se usa "cat /sys/class/gpio/gpio48/value" si se quiere ver el valor de P9.15 gpio1_16 (1*32+16=48). Para P9.26 se realiza lo mismo.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxii6tS4arI4vM82fqxB1MGUqwaUej7DnXWT7-Xx7nEhQZz2JxRyuUrAfxW7yJc2eL4Z6p256eMexQUXzpb4Wfl53anwzmwSGQiC2xTHocVyZmJurbpztfmOuYkgbQf3kQShCkt8goaxg/s1600/MF5-DTBO-gpios.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxii6tS4arI4vM82fqxB1MGUqwaUej7DnXWT7-Xx7nEhQZz2JxRyuUrAfxW7yJc2eL4Z6p256eMexQUXzpb4Wfl53anwzmwSGQiC2xTHocVyZmJurbpztfmOuYkgbQf3kQShCkt8goaxg/s640/MF5-DTBO-gpios.jpg" width="640" /></a></div>
<br />
<br />
Se recomienda ver los siguientes tutoriales para poder entender:<br />
<br />
<a href="http://Device Tree Overlay personalizada para Machinekit y LCD 7"" target="_blank">Device Tree Overlay personalizada para Machinekit y LCD 7" </a><br />
<a href="http://machinekit-gmoccapy-lcd7.blogspot.com/2015/07/configurar-los-pines-gpio-para-usar-con.html" target="_blank">Configurar los pines gpio para usar con Machinekit. </a><br />
<br />
<b>Como usar el componente AT PID para encontrar los valores de PID.</b><br />
<br />
Para poder usar el componente AT PID se necesita entender como funciona. En el siguiente link <a href="http://machinekit-docs.readthedocs.org/en/latest/machinekit-documentation/components/at_pid/" target="_blank">At_pid</a> esta la información de como usar este componente<b>.</b><br />
<br />
El componente AT PID inicia por defecto con los siguientes valores.<br />
<b> </b><br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">pin in float deadband = 0.0 "Amount of error that will be ignored";
pin in float maxerror = 0.0 "Limit on error";
pin in float maxerrorI = 0.0 "Limit on error integrator";
pin in float maxerrorD = 0.0 "Limit on error differentiator";
pin in float maxcmdD = 0.0 "Limit on command differentiator";
pin in float maxcmdDD = 0.0 "Limit on command 2nd derivative";
pin io float bias = 0.0 "Constant offset on output";
pin io float Pgain = 1.0 "Proportional gain";
pin io float Igain = 0.0 "Integral gain";
pin io float Dgain = 0.0 "Derivative gain";
pin io float FF0 = 0.0 "Zeroth order Feedfoioard gain";
pin io float FF1 = 0.0 "First order Feedforward gain";
pin io float FF2 = 0.0 "Second order Feedforward gain";
pin io float maxoutput = 0.0 "Limit on output value";
pin io float tuneEffort = 0.5 " Control effort for limit cycle.";
pin io u32 tuneCycles = 50;
pin io u32 tuneType = 0;
pin out float errorI "Integral of error";
pin out float errorD "Derivative of error";
pin out float commandD "Derivative of the command";
pin out float commandDD "2nd derivative of the command";
pin out float ultimateGain "Calc by auto-tune from limit cycle.";
pin io float ultimatePeriod "Calc by auto-tune from limit cycle.";
pin in bit enable = 0 "Enable/disabled the PID loop";
pin in float command = 0.0 "Commanded value";
pin in float feedback = 0.0 "Feedback input";
pin out float error "Current error";
pin out float output "Ouput value";
pin in bit tuneMode = 0 "0=PID, 1=tune.";
pin io bit tuneStart = 0 "Set to 1 to start an auto-tune cycle. \
Clears automatically when the cycle has finished.";</pre>
<b> </b><br />
<b> </b> <br />
Para poder iniciar la calibración automática de PID es necesario que tuneMode sea uno y tuneStart sea uno. Si se quiere obtener los valores de PID es necesario que tuneType sea cero de lo contrario se obtendrá la función PI con FF1 ("para uso de motores").<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">if(tuneType == TYPE_PID){
// PID.
Pgain = (0.6 * ultimateGain);
Igain = (Pgain / (ultimatePeriod / 2.0));
Dgain = (Pgain * (ultimatePeriod / 8.0));
FF1 = 0;
}else{
// PI FF1.
Pgain = (0.45 * ultimateGain);
Igain = (Pgain / (ultimatePeriod / 1.2));
Dgain = 0;
// Scaling must be set so PID output is in user units per second.
FF1 = 1;
}</pre>
<br />
El componente de At_pid usa el método de Ziegler-Nichols para calcular los valores de PID. Los siguientes links indican como funciona esta configuración.<br />
<br />
<a href="https://www.google.com.ec/url?sa=t&rct=j&q=&esrc=s&source=web&cd=5&ved=0ahUKEwjOsLCbqKHKAhWIGz4KHeI_BQwQFggtMAQ&url=http%3A%2F%2Fverona.fi-p.unam.mx%2F~lfridman%2Fclases%2Fcontrol%2FClase14.ppt&usg=AFQjCNFQVP_i893Dw7P_M0Tgj4NitKAEHQ&bvm=bv.111396085,d.cWw&cad=rja" target="_blank">Reglas de Ziegler-Nichols</a>.<br />
<a href="http://www.embedded.com/design/real-time-and-performance/4007575/The-basics-of-control-system-design-Part-5--Tuning-a-PID-Controller" target="_blank">Calibrando un controlador PID</a>.<br />
<a href="http://brettbeauregard.com/blog/wp-content/uploads/2012/07/Gu%C3%ADa-de-uso-PID-para-Arduino.pdf" target="_blank">Guía de uso PID para Arduino</a>.<br />
<br />
Primero se debe realizar la siguiente configuración en el archivo .hal<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"># ##################################################
# PWM Signals
# ##################################################
newsig e0.temp.set float
newsig e0.temp.meas float
newsig bed.temp.set float
newsig bed.temp.meas float
newsig e1.temp.set float
newsig e1.temp.meas float
setp hpg.pwmgen.00.pwm_period 1000000
#net spindle-speed-cmd <= motion.spindle-speed-out
#net spindle-speed-cmd => hpg.pwmgen.00.out.00.value
# P9.26 gpio0_14 Extrusor 1
setp hpg.pwmgen.00.out.01.pin 0x2E
setp hpg.pwmgen.00.out.01.enable 1
setp hpg.pwmgen.00.out.01.value 0.0
# J9.16 gpio1_19 Bed
#setp hpg.pwmgen.00.out.00.pin 0x53
#setp hpg.pwmgen.00.out.00.enable 1
#setp hpg.pwmgen.00.out.00.value 0.0
# P9.15 gpio1_16 Extrusor 0
setp hpg.pwmgen.00.out.02.pin 0x50
setp hpg.pwmgen.00.out.02.enable 1
setp hpg.pwmgen.00.out.02.value 0.0
# PID for Extruder 0 temperature control
net e0.temp.meas <= Extruder0.Temp.meas
net e0.temp.meas => at_pid.0.feedback => wcomp.0.in
sets e0.temp.set 0
net e0.temp.set motion.analog-out-02 => at_pid.0.command
setp wcomp.0.min 0
setp wcomp.0.max 300
net e0.temp.set => Extruder0.Temp.set
net e0.temp.done motion.digital-in-02 <= Extruder0.Temp.set.done
net enable.pid.extrusor0 at_pid.0.enable <= wcomp.0.out
net e0.heater <= at_pid.0.output
net e0.heater => limit1.0.in
net e0.heaterl <= limit1.0.out
net e0.heaterl => hpg.pwmgen.00.out.02.value
# Limit heater PWM to positive values
# PWM mimics hm2 implementation, which generates output for negative values
setp limit1.0.min 0
# PID for Extruder 1 temperature control
net e1.temp.meas <= Extruder1.Temp.meas
net e1.temp.meas => at_pid.1.feedback => wcomp.1.in
sets e1.temp.set 0
net e1.temp.set motion.analog-out-03 => at_pid.1.command
setp wcomp.1.min 0
setp wcomp.1.max 300
net e1.temp.set => Extruder1.Temp.set
net e1.temp.done motion.digital-in-03 <= Extruder1.Temp.set.done
net enable.pid.extrusor1 at_pid.1.enable <= wcomp.1.out
net e1.heater <= at_pid.1.output
net e1.heater => limit1.1.in
net e1.heaterl <= limit1.1.out
net e1.heaterl => hpg.pwmgen.00.out.01.value
# Limit heater PWM to positive values
# PWM mimics hm2 implementation, which generates output for negative values
setp limit1.1.min 0
# PID for Bed temperature control
#net bed.temp.meas <= Therm.ch-05.value
#net bed.temp.meas => at_pid.2.feedback => wcomp.2.in
#sets bed.temp.set 0
#net bed.temp.set => at_pid.2.command
#setp wcomp.2.min 0
#setp wcomp.2.max 120
#net enable.pid.bed at_pid.2.enable <= wcomp.2.out
#net bed.heater <= at_pid.2.output
#net bed.heater => limit1.2.in
#net bed.heaterl <= limit1.2.out
#net bed.heaterl => hpg.pwmgen.00.out.00.value
# Limit heater PWM to positive values
# PWM mimics hm2 implementation, which generates output for negative values
setp limit1.1.min 0
# PID Parameters for adjusting temperature control
# Extruder0
setp at_pid.0.Pgain 1
setp at_pid.0.Igain 0
setp at_pid.0.Dgain 0
setp at_pid.0.tuneEffort 0.5
setp at_pid.0.tuneMode 1
setp at_pid.0.tuneStart 1
setp at_pid.0.tuneType 0
setp at_pid.0.tuneCycles 50
setp at_pid.0.maxoutput 0.8
#setp at_pid.0.maxerrorI 12
#setp at_pid.0.bias 0.5
# Extruder1
setp at_pid.1.Pgain 1
setp at_pid.1.Igain 0
setp at_pid.1.Dgain 0
setp at_pid.1.tuneEffort 0.5
setp at_pid.1.tuneMode 1
setp at_pid.1.tuneStart 1
setp at_pid.1.tuneType 0
setp at_pid.1.tuneCycles 50
setp at_pid.1.maxoutput 0.8
#setp at_pid.1.maxerrorI 12
#setp at_pid.1.bias 0.5
# Bed
#setp at_pid.2.Pgain 1
#setp at_pid.2.Igain 0
#setp at_pid.2.Dgain 0
#setp at_pid.2.tuneEffort 1
#setp at_pid.2.tuneMode 1
#setp at_pid.2.tuneStart 1
#setp at_pid.2.tuneType 0
#setp at_pid.2.tuneCycles 50
setp at_pid.1.maxoutput 1
#setp at_pid.2.maxerrorI 1.0
#setp at_pid.2.bias 0.5
#setp at_pid.2.enable 1</pre>
<br />
Pgain, Igain, Dgain, tuneEffort, tuneType, tuneCycles están configurados con los valores por defecto. Se los puede comentar si se desea. Lo más importante es que maxoutput se active cuando el componente at_pid haya encontrado los valores de PID, ya que de lo contrario no funcionará de forma correcta.<br />
<br />
<b>Pgain</b> -> Indica la ganancia proporcional, cambiarlo con el valor P calculado.<br />
<b>Igain</b> -> Indica la ganancia integral, cambiarlo con el valor I calculado.<br />
<b>Dgain</b> -> Indica la ganancia derivativa, cambiarlo con el valor D calculado.<br />
<b>tuneEffort</b> -> Indica el ciclo de trabajo enviado a la señal PWM, con valores muy bajos tardará mucho en calentar el extrusor y con valores altos se tendrán unos valores PID un poco inestables. Para los extrusores que calientan de forma rápida es recomendable usar valores de 0.4 a 0.6, mientras que para la cama caliente que demora en calentar usar un valor de 1.0 será perfecto.<br />
<b>tuneMode</b> -> Indica si se va usar la calibración automática (1) o si se va realizar el proceso de control PID como el componente PID (0).<br />
<b>tuneStart</b> -> Indica que se iniciará la calibración, cuando termina el proceso de calibración se desactiva automáticamente y mientras no se cambie el valor de tuneMode a cero no realizará el proceso de control PID con los valores encontrados.<br />
<b>tuneType</b> -> Indica si se va obtener los valores PID (0) o los valores PI FF1(1).<br />
<b>tuneCycles</b> -> Indica cuántos veces va a calcular los valores, entre más ciclos tenga mejor será el resultado final. Usando 30 ciclos se obtiene valores aceptables (varía la temperatura ±2 grados celsius), se recomienda usar 50 o más ciclos (varía la temperatura ±0.25-0.5 grados celsius). El amplificador max31855 tiene una resolución de 0.25 grados celsius con lo cuál sería una calibración casi perfecta (tomar en cuenta que dependiendo el tipo de termocupla se tiene un error comparado con el valor real, generalmente ±2).<br />
<b>maxoutput</b> -> Indica el ciclo de trabajo con el que va a funcionar la señal PWM una vez que se haya terminado la calibración automática. Para el extrusor con un valor de 0.8 se obtiene un calentamiento rápido y un buen control PID, para la cama caliente usar un valor de 1, ya que el proceso de calentamiento es lento. Es importante poner un valor mayor a cero en maxoutput de lo contrario no funcionará de forma correcta el control PID. <br />
<b>maxerrorI</b> -> Indica el error del integrador, es necesario ir aumentando el valor para disminuir el exceso de temperatura.<br />
<b>bias</b> -> Indica cuanto se desea compensar en temperatura, es ideal cuando se obtiene valores menores a la temperatura asignada. Es recomendable dejarlo por defecto en 0.5 e ir compensando con maxerrorI.<br />
<b>enable</b> -> Activa o desactiva el uso de At_pid.<br />
<br />
Existen otras funciones del componente At_pid, pero no se usarán, ya que con las mencionadas anteriormente se han obtenido buenos resultados.<br />
<br />
<br />
En la configuración del componente AT PID se indicará como funcionan los valores de PID obtenidos, y luego como cambia el control al implementar lo valores de bias y maxerrorI.<br />
<br />
Se usará el <a href="http://machinekit-gmoccapy-lcd7.blogspot.com/2016/01/introduccion-codigo-o-subrutinas-y.html" target="_blank">código O</a> descrito en el anterior tutorial para poder asignar el valor de temperatura con el que trabajarán los extrusores.<br />
<br />
<b>Obtener valores PID</b><br />
<br />
Para poder obtener los valores correctos de PID se recomienda dejar por defecto la configuración.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1SIQMGLWSwMN2_-dIfsDxXZGA2udjABxfY2UGw7xzrS2xMfFZYS16dZTw51-mt9o3PDz9Jf-5cRa1mR4W4QxLsGH68OvicqaYrcIuSH8-3KdzAacXIkOKEVOoIrraG5SA28Df2UJE1lk/s1600/AT_PID0.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="390" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1SIQMGLWSwMN2_-dIfsDxXZGA2udjABxfY2UGw7xzrS2xMfFZYS16dZTw51-mt9o3PDz9Jf-5cRa1mR4W4QxLsGH68OvicqaYrcIuSH8-3KdzAacXIkOKEVOoIrraG5SA28Df2UJE1lk/s640/AT_PID0.jpg" width="640" /></a></div>
<br />
Para poder observar las variable se debe ingresar a settings y luego ejecutar Halshow. Aparecerá el cuadro de la derecha que se puede observar en la imagen de abajo.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj88_wOOqb1r3HaNyZusjNVgTBF5YRBvoBrV9Wd5gMJAkmCLT7fSm73WDB8_hCm5pgGqY6-BRfVoNhuLjH7JMLOSP7CopVkXDPUW8OH0uFD9xkqUpt2fnIWE4YCyNumIX9xEAkzq3Vefgs/s1600/AT_PID1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="249" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj88_wOOqb1r3HaNyZusjNVgTBF5YRBvoBrV9Wd5gMJAkmCLT7fSm73WDB8_hCm5pgGqY6-BRfVoNhuLjH7JMLOSP7CopVkXDPUW8OH0uFD9xkqUpt2fnIWE4YCyNumIX9xEAkzq3Vefgs/s640/AT_PID1.jpg" width="640" /></a></div>
<br />
<br />
<br />
Como se puede observar la temperatura es de 20.25 para el extrusor0 y los valores de PID están Pgain 1, Igain 0, Dgain 0, bias 0, feedback 20.25 (valor de tempeartura), maxerror 0, maxerrorI 0, maxerrorD 0, maxoutput 0.8 (80% ciclo de trabajo), output -0.5 (apagado el extrusor), tuneCycles 0x32 (50 en decimal), tuneEffort 0.5 (50% cuando se calibra), tuneMode 1, tuneStart 1, tuneType 0 (PID). Los mismos valores son asignados al extrusor1, solo cambia tuneEffort a 0.8 para que pueda llegar a temperaturas mayores de 200 grados.<br />
<br />
Al mandar el comando M104 que asigna la temperatura para el extrusor0 y el extrusor1 en el MDI se dará comienzo a la obtensión automática de los valores PID.<br />
<br />
En el extrusor0 se determinara un valor de 180 grados celsius, ideal para trabjar con PLA (175-220 grados celsius). Para el extrusor1 se asignará un valor de 230 grados celsius, ideal para trabajar con ABS (210-250 grados celsius).<br />
<br />
Para asignar la temperatura al extrusor0 se usa el comando M104 P180, para el extrusor1 M104 P230 T1.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvWQ4DMalJsIIHvOUrRaOB2rTdbqGJfrx3VCRTpj3026oHs7b4_Bm5ZqFJ2hkDIEz_1Wc-69S_ZoRzrjoh7WBArsIr9R4GUvG9RXoIfJOQgZKWa3fhjyyyS2zkx5rwLumG3LDwzKmOwDI/s1600/AT_PID2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="392" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvWQ4DMalJsIIHvOUrRaOB2rTdbqGJfrx3VCRTpj3026oHs7b4_Bm5ZqFJ2hkDIEz_1Wc-69S_ZoRzrjoh7WBArsIr9R4GUvG9RXoIfJOQgZKWa3fhjyyyS2zkx5rwLumG3LDwzKmOwDI/s640/AT_PID2.jpg" width="640" /></a></div>
<br />
En este momento los extrusores estarán calentando hasta llegar al valor de temperatura asignado y comenzará el proceso de obtener los valores de PID para los dos extrusores.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGHGnQew2UtY6XuYuYZmq3ek44Z07HWRUeCPsIIrCId8sgtGMmNUVLlnR3tsOuuK4xeC6SWc56KEPQFxNTbo8L3AqBKfspU1lI8NEy66k5cPyC9C3EKKNCzGrgmLzKnhTjhlWMJa5B_dc/s1600/AT_PID3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="390" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGHGnQew2UtY6XuYuYZmq3ek44Z07HWRUeCPsIIrCId8sgtGMmNUVLlnR3tsOuuK4xeC6SWc56KEPQFxNTbo8L3AqBKfspU1lI8NEy66k5cPyC9C3EKKNCzGrgmLzKnhTjhlWMJa5B_dc/s640/AT_PID3.jpg" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4VRyNl11EXx7-bcy5qarYHD-NjNx5Km_OM413lhYSRz9Bu0hbUZUmorFMcGE2HjQSMmTpBZEW2a63afSYNvqELctjpOYhXTfRHDFLdY0SOUWTs9DHfLahzqEQqyWZjuHbURc8svgFmK8/s1600/AT_PID4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="392" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4VRyNl11EXx7-bcy5qarYHD-NjNx5Km_OM413lhYSRz9Bu0hbUZUmorFMcGE2HjQSMmTpBZEW2a63afSYNvqELctjpOYhXTfRHDFLdY0SOUWTs9DHfLahzqEQqyWZjuHbURc8svgFmK8/s640/AT_PID4.jpg" width="640" /></a></div>
<br />
El proceso dura alrededor de unos 10 minutos para una temperatura menor a 200 grados celsius con un ciclo de trabajo de 0.5, para el segundo extrusor dura alrededor de 15 minutos con una temperatura de 230 y un ciclo de trabajo de 0.8. Esto ocurre ya que tardá mas en calentar por el ciclo de trabajo de 0.8 con lo que cada conteo tardá de subir de 227 a 230, al bajar y subir es un ciclo de conteo realizado.<br />
<br />
Cuando el proceso termina el calentamiento de los dos extrusores termina (se pone en Standby), esto pasa ya que tuneStart esta desactivado pero tuneMode aún sigue en 1.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdMf6CUXnvTtfOr4UiZKChnVpPD-ccrJMVgh0zjVlgPUBIDE0ni32-NIkDohnKgTW5KhplofHPHhzjKWmJQiq6zzLhVt0D_rpfIqv991_N-XbwsxI8Bvgt8m4zDa-pJje90PhAoBn_UAs/s1600/AT_PID5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="250" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdMf6CUXnvTtfOr4UiZKChnVpPD-ccrJMVgh0zjVlgPUBIDE0ni32-NIkDohnKgTW5KhplofHPHhzjKWmJQiq6zzLhVt0D_rpfIqv991_N-XbwsxI8Bvgt8m4zDa-pJje90PhAoBn_UAs/s640/AT_PID5.jpg" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_5TixezgUjnFIiClG8y1sMLYCmoSdSuSpZoTLELt1eREZCpStHFQuMXdnW5c6temS92zOT0WXVZCQDpZjWzlfJSfPaAojrL2ebtnVgyM2x83t7WH-HLH_0ziKHUTuc4En5TFD2n-mau4/s1600/AT_PID6.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="250" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_5TixezgUjnFIiClG8y1sMLYCmoSdSuSpZoTLELt1eREZCpStHFQuMXdnW5c6temS92zOT0WXVZCQDpZjWzlfJSfPaAojrL2ebtnVgyM2x83t7WH-HLH_0ziKHUTuc4En5TFD2n-mau4/s640/AT_PID6.jpg" width="640" /></a></div>
Si se desea realizar el control PID se debe cambiar la variable tuneMode a 0 para que comience el proceso. Esto se lo realiza usando el comando setp y la variable que querramos cambiar.<br />
<br />
Extrusor0 => setp at_pid.0.tuneMode 0<br />
Extrusor1 => setp at_pid.1.tuneMode 0<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9-iJaw6qC9yb5JmwE24XWYkOgolO_9U2ERale0LT8cYjXTLSkO0pcRm-7RsjLIYChTp0msw3EOmecGS6iwFJfqo7RdYiiPDUTUg9frpeNO5oT5Um6ZveM4eP2zD_mPqi8gsTOb2Rv_gY/s1600/AT_PID7.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="442" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9-iJaw6qC9yb5JmwE24XWYkOgolO_9U2ERale0LT8cYjXTLSkO0pcRm-7RsjLIYChTp0msw3EOmecGS6iwFJfqo7RdYiiPDUTUg9frpeNO5oT5Um6ZveM4eP2zD_mPqi8gsTOb2Rv_gY/s640/AT_PID7.jpg" width="640" /></a></div>
<br />
<br />
En el Extrusor0 con los valores de PID obtenidos cambia la temperatura entre 177 y 182.25, en el extrusor1 cambia la temperatura entre 219 y 234. Como se puede observar los valores no están muy mal pero lo que se requiere es que la temperatura que controla el componente AT PID no baje de la asiganada. Para eso lo que se debe realizar es configurar el bias a 0.5 para compensar la temperatura e ir aumentando el valor de maxerrorI para bajar el exceso.<br />
<br />
Extrusor0 => setp at_pid.0.bias 0.5<br />
Extrusor1 => setp at_pid.1.bias 0.5<br />
<br />
Al colocar estos valores se obtiene los mismos resultados, esto pasa porque bias trabaja en conjunto con maxerrorI y maxerrorD (casi nunca se lo utiliza). Lo que se debe realizar es ir aumentando el maxerrorI.<br />
<br />
Con los valores asignados de bias y los siguientes valores de maxerrorI para los extrusores.<br />
<br />
Extrusor0 => setp at_pid.0.maxerrorI 1 <br />
Extrusor1 => setp at_pid.1.maxerrorI 3 <br />
<br />
Se obtiene valores de temperatura para el extrusor0 de entre 180.5-181 grados celsius, y para el extrusor1 de entre 228.75-231.25 grados centigrados.<br />
<br />
El extrusor0 estaría perfectamente calibrado mientras que el extrusor1 aun falta compensar la temperatura para que no baje de la asiganda.<br />
<br />
Aumentando el bias del segundo extrusor a 0.6 y disminuyendo maxerrorI a 2 ya se regula la temperatura entre 230.25 a 230.75 grados celsius.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQrgqmb9K5B67Nakak_PSKEDQcoEoQn5VWjoCoTu9GApg9B78bASRVgCgOjTSVBcHdJ_wbcpn8V_LZs-8DH39GvJAiQQjQuwz-Oaeeny6FxKGESWeEbITwf2y6C2qUGLQM8NEx-WWiaaQ/s1600/AT_pid_temperatura.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="390" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQrgqmb9K5B67Nakak_PSKEDQcoEoQn5VWjoCoTu9GApg9B78bASRVgCgOjTSVBcHdJ_wbcpn8V_LZs-8DH39GvJAiQQjQuwz-Oaeeny6FxKGESWeEbITwf2y6C2qUGLQM8NEx-WWiaaQ/s640/AT_pid_temperatura.gif" width="640" /></a></div>
<br />
<br />
<br />
He olvidado guardar los valores PID obtenidos en la anterior configuración, con los nuevos valores de PID que pondré a continuación, ha cambiado el valor de maxerrorI en el extrusor0 a 4 y el bias se mantiene en 0.5. Para el extrusor1 el valor de maxerrorI es de 2 y el bias en 0.7.<br />
<br />
Con esos valores se ha obtenido una temperatura de 180.75-181 grados celsius en el extrusor0 y 231-231.25 grados celsius en el extrusor1.<br />
<br />
Como resultado final se pasa de esto:<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"># PID Parameters for adjusting temperature control
# Extruder0
setp at_pid.0.Pgain 1
setp at_pid.0.Igain 0
setp at_pid.0.Dgain 0
setp at_pid.0.tuneEffort 0.5
setp at_pid.0.tuneMode 1
setp at_pid.0.tuneStart 1
setp at_pid.0.tuneType 0
setp at_pid.0.tuneCycles 50
setp at_pid.0.maxoutput 0.8
#setp at_pid.0.maxerrorI 12
#setp at_pid.0.bias 0.5
# Extruder1
setp at_pid.1.Pgain 1
setp at_pid.1.Igain 0
setp at_pid.1.Dgain 0
setp at_pid.1.tuneEffort 0.8
setp at_pid.1.tuneMode 1
setp at_pid.1.tuneStart 1
setp at_pid.1.tuneType 0
setp at_pid.1.tuneCycles 50
setp at_pid.1.maxoutput 0.8
#setp at_pid.1.maxerrorI 12
#setp at_pid.1.bias 0.5</pre>
<br />
a esto:<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"># PID Parameters for adjusting temperature control
# Extruder0
setp at_pid.0.Pgain 0.05076038
setp at_pid.0.Igain 0.03180257
setp at_pid.0.Dgain 0.02025478
setp at_pid.0.tuneEffort 0.5
setp at_pid.0.tuneMode 0
setp at_pid.0.tuneStart 0
setp at_pid.0.tuneType 0
setp at_pid.0.tuneCycles 50
setp at_pid.0.maxoutput 0.8
setp at_pid.0.maxerrorI 4
setp at_pid.0.bias 0.5
# Extruder1
setp at_pid.1.Pgain 0.0596831
setp at_pid.1.Igain 0.0327806
setp at_pid.1.Dgain 0.02716601
setp at_pid.1.tuneEffort 0.8
setp at_pid.1.tuneMode 0
setp at_pid.1.tuneStart 0
setp at_pid.1.tuneType 0
setp at_pid.1.tuneCycles 50
setp at_pid.1.maxoutput 0.8
setp at_pid.1.maxerrorI 2
setp at_pid.1.bias 0.7</pre>
<br />
<b>Conclusión:</b> Al cambiar de temperatura se puede descalibrar con los valores de PID obtenidos en la temperatura asignada en el momento de la calibración, pero para no tener que hacer los mismos pasos se puede usar la compensación de bias junto con el maxerrorI y poder calibrar la temperatura a lo que se requiera. Cuanta más temperatura se requiera tuneEffort debe ser mayor de lo contrario tardaría demasiado en llegar a temperaturas altas, lo mismo ocurre con maxoutput se debe dejar con un valor con el cúal no caliente demasiado rápido ni tampoco demasiado lento. La variable maxoutput y tuneEffot no tiene nada que ver ya que tuneEffort se usa solo cuando de realiza la calibración mientras que maxoutput se usa cuando se realiza el control PID. Para realizar el control PID tuneMode y tuneStart deben valer 0 (False).<br />
<br />
A continuación dejo los archivos que he usado para esta configuración.<br />
<br />
<a href="https://drive.google.com/file/d/0B6xWQnSH6ge5STNrWGk0ODhubnM/view?usp=sharing" target="_blank">MF5-LCD7</a><br />
<br />
Nota: Leer el archivo README, copiar la carpeta MF5-LCD7 a machinekit/configs y dar permisos de ejecucción con chmod +x a setup.MF5-DTO.sh<br />
<br />Vichentehttp://www.blogger.com/profile/13532517773299729858noreply@blogger.com0tag:blogger.com,1999:blog-6209740641626143717.post-22348125282817613222016-01-07T23:46:00.000-08:002016-01-10T22:33:55.648-08:00Introducción a código O (subrutinas) y descripción de algunos componentes hal.Ver el anterior tutorial para poder comprender mejor <a href="http://machinekit-gmoccapy-lcd7.blogspot.com/2015/12/configurar-archivo-ini-y-hal-pid-para.html" target="_blank">Configurar archivo .ini y .hal (PID) para usar librería MAX31855 con gmoccapy_lcd7</a>. <br />
<br />
Este tutorial se enfoca en como utilizar código O para poder usar en una impresora 3D y se describe como usar algunos componentes para utilizarlos en el archivo .hal.<br />
<br />
Se recomienda leer esta información <a href="http://linuxcnc.org/docs/html/gcode/o-code.html" target="_blank">O Code</a> para poder entender lo que se explicará en este tutorial.<br />
<br />
El código de Machinekit alojado en github contiene subrutinas hechas para poder controlar diferentes acciones de una impresora 3D, este código O esta implementado con un postprocesador para usarse con el programa slic3r.<br />
<br />
En el siguiente link <a href="https://github.com/machinekit/machinekit/tree/master/nc_files/remap-subroutines/fdm" target="_blank">G-code Impresora 3D</a> se encuentran códigos G y M para usar con una impresora 3D.<br />
<br />
En el siguiente link <a href="http://reprap.org/wiki/G-code" target="_blank">G-code RepRap</a> se encuentra la información de como usar los códigos G y M. <br />
<br />
<b>g22.ngc y g23.ngc </b>son subrutinas especiales que sirven para usar la impresora 3d sin tener las posiciones del extrusor, para poder crear los objetos calcula por medio de varios componentes la altura y ancho de las capas a insertar y también calcula el grosor del filamento para poder indicar cuanto filamento debe extruir. Para saber como funciona recomiendo revisar los archivos del siguiente link <a href="https://github.com/machinekit/machinekit/tree/master/configs/ARM/BeagleBone/BeBoPr-Bridge/velocity-extruding" target="_blank">velocidad-extrusión</a> es una configuración compleja de realizar.<br />
<br />
<b>g28.ngc </b>se utiliza para poder mover los ejes al punto de referencia inicial (origen) con una impresora 3D.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">o<g28> sub
#500=0; home x
#501=0; home y
#502=0; home z
#503=0; home a
#504=38; probe selection io index
#505=38; probe enable io index
o100 if [EXISTS[#<x>] or EXISTS[#<y>] or EXISTS[#<z>] or EXISTS[#<a>]]
o110 if [EXISTS[#<x>]]
#500=1;
o110 endif
o111 if [EXISTS[#<y>]]
#501=1;
o111 endif
o112 if [EXISTS[#<z>]]
#502=1;
o112 endif
o113 if [EXISTS[#<a>]]
#503=1
o113 endif
o100 else
#500=1; home x
#501=1; home y
#502=1; home z
#503=1; home a
o100 endif
; M65 P#505; disable probe sensor if it was enabled
o101 if [#500 EQ 1]
G0 X0
; M68 E#504 Q1; select probe
; M64 P#505; enable probe sensor
; G38.2 X-100.0 F100; probe X axis
; M65 P#505; disable probe sensor
o101 endif
o102 if [#501 EQ 1]
G0 Y0
; M68 E#504 Q2; select probe
; M64 P#505; enable probe sensor
; G38.2 Y-100.0 F100; probe Y axis
; M65 P#505; disable probe sensor
o102 endif
o103 if [#502 EQ 1]
G0 Z0
; M68 E#504 Q3; select probe
; M64 P#505; enable probe sensor
; G38.2 Z-10.0 F100; probe Z axis
; M65 P#505; disable probe sensor
o103 endif
o104 if [#503 EQ 1]
o114 if [#<_ini[FDM]VELOCITY_EXTRUSION_ENABLE> EQ 0]
G92 A0; set extruder axis to 0
o114 endif
o104 endif
o<g28> end sub </pre>
<br />
Este código se creo para tener compatibilidad con RepRap flavor GCode, lo que hace es usar G28 para mover los ejes al punto de referencia inicial (home). Se pueden mover todos los ejes a la vez solo ejecutando g28 o ir refrenciando los que se deseen.<br />
<br />
Ejemplo:<br />
<br />
G28 X30 Y0 -> lo que hace es ignorar el valor de X30 y ponerlo como X0, Y0 seguiría en lo mismo. Por lo que como resultado final quedaría G28 X0 Y0 y solo los ejes X e Y se moverían a cero, el eje de A y Z se omitirán y quedarán en en la posición actual.<br />
<br />
Nota: El código M y G que esta con ";" al inicio no se ejecuta (esta comentado), se lo puede usar en el caso de tener finales de carrera, donde la posición de cada eje indica el máximo de recorrido de no encontrar el sensor genera un error y se detiene todo el proceso. Para poder usar con finales de carrera es necesario activar "HOME_IGNORE_LIMITS = NO" en el archivo .ini para recorrer los ejes hasta topar el final de carrera. Con eso ya se puede descomentar los ejes que se requieran usar con finales de carrera y poner una posición de recorrido de acuerdo a la máquina.<br />
<br />
Para que funcione esta subrutina es necesario tener esto en el archivo .ini.<br />
[FDM]<br />
VELOCITY_EXTRUSION_ENABLE = 1<br />
<br />
<b>g29.ngc</b><br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">o<g29> sub
o100 if [EXISTS[#<_ini[PROBE]HBP_TEMP>]]
M190 S#<_ini[PROBE]HBP_TEMP>
o100 endif
#501=38; probe selection io index
#502=0; probe enable io index
M65 P#502; disable probe sensor if it was enabled
M68 E#501 Q0; select probe
G10 L2 P1 Z0.0; reset z offset
G0 Z#<_ini[PROBE]START_Z>
G43 H#<_ini[PROBE]TOOL_NR>
G0 X#<_ini[P0]X> Y#<_ini[P0]Y>
M64 P#502; enable probe sensor
G38.2 Z#<_ini[AXIS_2]MIN_LIMIT> F#<_ini[PROBE]SEARCH_VEL>; probe Z axis
M65 P#502; disable probe sensor
G10 L20 P1 Z0.0; set Z offset
G49
G0 X#<_ini[P0]X> Y#<_ini[P0]Y> Z#<_ini[PROBE]END_Z>
o<g29> end sub</pre>
<br />
La subrutina g29 sirve para probar la altura de la cama caliente en tres o más puntos para poder realizar una impresión 3d de acuerdo al nivel de altura tomado en cada punto de la cama caliente. Por el momento solo la comprobación en un punto es soportada.<br />
<br />
Se necesita esto en el archivo .ini para que funcione.<br />
<br />
[PROBE]<br />
COUNT = 1<br />
SEARCH_VEL = 10.0<br />
TOOL_NR = 100<br />
START_Z = 0.0<br />
END_Z = 1.0<br />
#HBP_TEMP = 50.0<br />
<br />
[P0]<br />
X = 0.0<br />
Y = 0.0<br />
<br />
<b>tool.tbl</b><br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">T0 P0 ; Extruder 0
T1 P1 ; Extruder 1
T2 P2 ; Extruder 2
T3 P3 ; Extruder 3
T100 P100 X+35.000000 Z+0.900000 ; probe head</pre>
<b> </b><br />
Lo primero que hace es indicar si la variable "HBP_TEMP" existe, el valor de esta variable indica la temperatura a la que se va a calentar la cama. Si existe espera a que se caliente.<br />
<br />
M65 se deshabilita el sensor para poder comenzar con la prueba de calibración de nivel.<br />
M68 escoge la señal analoga a probar (E=38) y recibe un valor de cero (Q=0)<br />
G10 con L2 indica que se requiere guardar el valor de Z=0 en el código G54, ya que P=1. Por lo tanto el eje Z regresa a la posición 0.<br />
G0 Z#<_ini[PROBE]START_Z> verifica si Z esta en la posición guardada en la variable START_Z, sino se mueve a la posición que este designada.<br />
G43 H#<_ini[PROBE]TOOL_NR> con G43 se indica la compensación de la herramienta, con el valor de H se le indica que escoga los valores del archivo tool.tbl. Al ser TOOL_NR=100, se ecoge la herramienta T100 con los valores de X+35 y Z+0.9 (estos valores estan configurados en el archivo .ini usando mm).<br />
G0 X#<_ini[P0]X> Y#<_ini[P0]Y> mueve los ejes X e Y a las posiciones designadas en [PO]. <br />
M64 habilita el sensor.<br />
G38.2 Z#<_ini[AXIS_2]MIN_LIMIT> F#<_ini[PROBE]SEARCH_VEL> Una vez que esta habilitada la señal del sensor, G38.2 buscará si ha hecho contacto con la cama caliente siendo el punto máximo que se moverá el valor minimo asignado en la configuración del eje Z en el archivo .ini (son los límites de movimento). Con la variable SEARCH_VEL se le da la velocidad con la que se quiere mover el eje, en este caso SEARCH_VEL=10 (se coloca velocidades bajas para poder recibir la señal del sensor, de lo contrario la señal del sensor podría activarse luego de haber sobrepasado el punto de contacto).<br />
M65 desactiva de nuevo la señal una vez que se ha hecho contacto con la cama caliente.<br />
G10 L20 se determina la compensación de la herramienta, en este caso Z=0 no hay compensación y esto se guarda en el código G54, ya que P=1.<br />
G49 activa la compensación de la herramienta.<br />
G0 X#<_ini[P0]X> Y#<_ini[P0]Y> Z#<_ini[PROBE]END_Z> Por último se mueve a los ejes X e Y a cero y se le da a Z un offset de 1.0 mm.<br />
<br />
Ejemplo:<br />
<br />
G29<br />
<br />
Nota: se puede cambiar los valores de X e Y en [PO] para realizar la prueba en varios puntos de la cama caliente.<br />
<br />
<b>g29_1.ngc y g29_1.ngc </b>son similares a g9, en g29.1 se determina la compensación de la cabezera del extrusor, insertando manualmente las coordenadas de X,Y y Z. En g29.2 se realiza la compensación de la herramienta insertando X,Y y Z solo insertando el valor de Z, para luego comparar con los valores de la herramienta determinados en tool.tbl.<br />
<br />
Ejemplo:<br />
<br />
G29.1 X30 Y20 Z0.5<br />
G29.2 Z0.0 <br />
<br />
<b>g30.ngc</b> es exactamente lo mismo a <b>g29.ngc</b> ya que verifica la altura de la cabezera del extrusor en un punto de forma automática.<br />
<br />
Ejemplo:<br />
<br />
G30 X10 Y0 <br />
<br />
<b>Códigos Auxiliares M</b><br />
<br />
Como usar M68 con el archivo .hal.<br />
<br />
Para poder controlar la temperatura es necesario usar el componente de pid, para mas información revisar el siguiente link <a href="http://machinekit-docs.readthedocs.org/en/latest/machinekit-documentation/components/pid/" target="_blank">PID</a>.<br />
<br />
Para poder medir la temperatura se conecta lo siguiente. Donde Extruder0 es la variable asignada al componente hal_temp_max31855.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">net e0.temp.meas <= Extruder0.Temp.meas
net e0.temp.meas => pid.0.feedback</pre>
<br />
Indica como mandar la temperatura al componente pid para poder comenzar a calentar los extrusores. La variable motion.analog-out-02 sirve para guardar el valor de temperatura enviado en el código M68. Para luego almacenarlo en la variable e0.temp.set.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">sets e0.temp.set 0
net e0.temp.set motion.analog-out-02 => pid.0.command </pre>
<br />
Con el valor almacenado en e0.temp.set, se envia a la variable hal creada en el componente hal_temp_max31855 para poder comparar la temperatura asignada con la temperatura medida por la termocupla. Si la temperatura medida por la termocupla llega a ser mayor que la asignada, se activa la señal de motion.digital-in-02 finalizando el proceso de espera para calentar el extrusor. Ver código M109.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">net e0.temp.set => Extruder0.Temp.set
net Temp.done motion.digital-in-02 <= Extruder0.Temp.set.done</pre>
<br />
Con el valor almacenado en pid.0.command se obtiene el valor de pid.0.out que es la temperatura asiganda, en el limit1.0.in se guarda el valor de temperatura asigando y con limit1.0.out se genera la señal pwm que calentará el fusor del extrusor.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">net e0.heater <= pid.0.output
net e0.heater => limit1.0.in
net e0.heaterl <= limit1.0.out
net e0.heaterl => hpg.pwmgen.00.out.02.value</pre>
<br />
Si no se configura los valores de pid por defecto se inicializa con los siguientes valores.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">pin in float Pgain = 1.0 "Proportional gain";
pin in float Igain = 0.0 "Integral gain";
pin in float Dgain = 0.0 "Derivative gain";
pin in float bias = 0.0 "Constant offset on output";
pin in float FF0 = 0.0 "Zeroth order Feedforward gain";
pin in float FF1 = 0.0 "First order Feedforward gain";
pin in float FF2 = 0.0 "Second order Feedforward gain";
pin in float deadband = 0.0 "Amount of error that will be ignored";
pin in float maxerror = 0.0 "Limit on error";
pin in float maxerrorI = 0.0 "Limit on error integrator";
pin in float maxerrorD = 0.0 "Limit on error differentiator";
pin in float maxcmdD = 0.0 "Limit on command differentiator";
pin in float maxcmdDD = 0.0 "Limit on command 2nd derivative";
pin in float maxoutput = 0.0 "Limit on output value";
pin in bit index_enable = false "Index enable";
pin in bit error_previous_target = false "Error previous target";</pre>
<br />
Señales PWM<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"># P9.26 gpio0_14 Extrusor 1
setp hpg.pwmgen.00.out.01.pin 0x2E
setp hpg.pwmgen.00.out.01.enable 1
setp hpg.pwmgen.00.out.01.value 0.0
# J9.16 gpio1_19 Bed
#setp hpg.pwmgen.00.out.00.pin 0x53
#setp hpg.pwmgen.00.out.00.enable 1
#setp hpg.pwmgen.00.out.00.value 0.0
# P9.15 gpio1_16 Extrusor 0
setp hpg.pwmgen.00.out.02.pin 0x50
setp hpg.pwmgen.00.out.02.enable 1
setp hpg.pwmgen.00.out.02.value 0.0
# P9.16 gpio1_19 Fan
setp hpg.pwmgen.00.out.03.pin 0x4C
setp hpg.pwmgen.00.out.03.enable 1
setp hpg.pwmgen.00.out.03.value 0.0 </pre>
<br />
<b>m104.ngc</b><br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">o<m104> sub
#500=2; extruder io start index
#501=0; not synchronized
#502=#500
o100 if [EXISTS[#<i>]]
o110 if [#<i> EQ 1]
#501=1
o110 endif
o100 endif
o101 if [EXISTS[#<t>]]
#502=[#<t>+#500]
o101 endif
o102 if [#501 EQ 1]
M67 E#502 Q#<P>
o102 else
M68 E#502 Q#<P>
o102 endif
o<m104> end sub</pre>
<b> </b> <br />
La subrutina m104 sirve para poder calentar los extrusores con un valor de temperatura asigando.<br />
<br />
#500=2 indica que se va a usar M68 con motion.analog-out-02<br />
#501=0 inidica que se va a usar M68 de forma inmediata (no hay sincronización).<br />
#502=#500 se guarda la variable 500 en 502, con esta variable podemos escoger otros motion.analog-out-xx.<br />
Si existe la variable i y equivale a 1 #501=1 se realiza un proceso de forma no sincronizada.<br />
<br />
Ejemplo:<br />
<br />
M014 I1 P200 -> La temperatura se calienta de forma sincronizada hasta 200 grados celsius.<br />
<br />
Si existe la variable t, se puede controlar más extrusores ya que la variable #500 canbiará de acuerdo al número en t asignado.<br />
<br />
Ejemplo:<br />
<br />
M104 P200 T1 -> El extrusor a calentar será el que este con motion.analog-out-03, ya que se suma el valor de t con el de #502.<br />
<br />
Por último siempre se calienta de forma no sincronizada (inmediata).<br />
<br />
<b>m106.ngc</b><br />
<br />
Activa los ventiladores.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">o<m106> sub
#500=12; fan io start index
#501=1; synchronized
#502=#500
o100 if [EXISTS[#<i>]]
o110 if [#<i> EQ 1]
#501=0
o110 endif
o100 endif
o101 if [EXISTS[#<t>]]
#502=[#<t>+#500]
o101 endif
o102 if [#501 EQ 1]
M67 E#502 Q#<P>
o102 else
M68 E#502 Q#<P>
o102 endif
o<m106> end sub</pre>
<br />
La subrutina m106 sirve para poder controlar los ventiladores de la impresora 3D de forma sincronizada. Se utiliza el mismo procedimiento, explicado anteriormente. Se debe cambiar el GPIO a usarse como pwm en el archivo .hal y realizar las conexiones necesarias.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">sets e0.fan.set 0
net e0.fan.set motion.analog-out-12 => hpg.pwmgen.00.out.03.value</pre>
<br />
Ejemplo:<br />
<br />
M106 P127<br />
<br />
Donde P asigna la velocidad (0-255)<br />
<br />
M106 P127 t1<br />
<br />
ver ejemplo M104 <br />
<br />
<b>m107.ngc </b><br />
<b><br /></b>
Desactiva los ventiladores<br />
<b><br /></b>
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">o<m107> sub
#500=12; fan io start index
#501=0; not synchronized
#502=#500
o100 if [EXISTS[#<i>]]
o110 if [#<i> EQ 1]
#501=1
o110 endif
o100 endif
o101 if [EXISTS[#<t>]]
#502=[#<t>+#500]
o101 endif
o102 if [#501 EQ 1]
M67 E#502 Q0
o102 else
M68 E#502 Q0
o102 endif
o<m107> end sub</pre>
<b><br /></b>
Controla los ventiladores de forma no sincronizada. Se utiliza el mismo procedimiento, explicado anteriormente. <br />
<br />
Ejemplo:<br />
<br />
M107 P0<br />
<br />
Donde P asigna la velocidad (0-255) -> en este caso con P0 se detiene el ventilador.<br />
<br />
Esto es lo mismo que M106 pero al crear en el código G en Slic3r sin el postprocesador de machinekit se puede obtener errores si no existe M107.<br />
<br />
M106 P127 T1 I1<br />
<br />
ver ejemplo M104<br />
<br />
<b>m109.ngc</b><br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">o<m109> sub
#500=2; extruder io start index
#502=#500
o100 if [EXISTS[#<t>]]
#502=[#<t>+#500]
o100 endif
M68 E#502 Q#<P>
M66 P#502 L3 Q1000
o<m109> end sub</pre>
<b> </b> <br />
Esta subrutina sirve para poder calentar el fusor del extrusor y hasta que no sea igual o mayor a la temperatura asignada, se pausará el proceso por 1000 segundos.<br />
<br />
M66 Con m66 se comprueba una señal digital, existen 4 tipos. El valor de P indica que se va a usar motion.input-out-xx con L elegimos el tipo de señal, en este caso es WAIT_MODE_HIGH y con Q se escoge el tiempo de espera en segundos.<br />
<br />
Nota: Para que se llegue a enviar la temperatura asignada a la variable Extruder0.Temp.set del archivo hal_temp_max31855 se debe realizar un tiempo de espera pequeño de lo contrario no se enviará nada a la variable. Con G4 P5 se espera 5 segundos. Esto no afecta en nada ya qe hasta mientras los extrusores se seguirán calentando.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">o<m109> sub
#500=2; extruder io start index
#502=#500
o100 if [EXISTS[#<t>]]
#502=[#<t>+#500]
o100 endif
M68 E#502 Q#<P>
G4 P5
M66 P#502 L3 Q1000
o<m109> end sub</pre>
<br />
Ejemplo:<br />
<br />
M109 P185<br />
<br />
Donde P determina la temperatura Q#<P>.<br />
<br />
M109 P127 T1<br />
<br />
ver ejemplo M104<br />
<b>m140.ngc</b><br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">o<m140> sub
#501=0; not synchronized
#502=0; hbp index
o100 if [EXISTS[#<i>]]
o110 if [#<i> EQ 1]
#501=1
o110 endif
o100 endif
o101 if [#501 EQ 1]
M67 E#502 Q#<P>
o101 else
M68 E#502 Q#<P>
o101 endif
o<m140> end sub </pre>
<br />
La subrutina m140 envia la temperatura a la cama caliente de forma inmediata.<br />
<br />
Ejemplo:<br />
<br />
M140 P55<br />
<br />
Donde P asigna la temperatura Q#<P>.<br />
<br />
M140 P127 I1<br />
<br />
ver ejemplo M104 <br />
<br />
<b>m141.ngc</b><br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">o<m141> sub
#501=0; not synchronized
#502=1; hbc index
o100 if [EXISTS[#<i>]]
o110 if [#<i> EQ 1]
#501=0
o110 endif
o100 endif
o101 if [#501 EQ 1]
M67 E#502 Q#<P>
o101 else
M68 E#502 Q#<P>
o101 endif
o<m141> end sub </pre>
<br />
Se usa en impresoras 3d con cámara cerrada, tiene la misma función que M140.<br />
<br />
Ejemplo:<br />
<br />
M141 P30<br />
<br />
Donde P asigna la temperatura Q#<P>.<br />
<br />
M141 P127 I1<br />
<br />
ver ejemplo M104<br />
<br />
<b>m190.ngc</b><br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">o<m190> sub
#502=0; hbp index
M68 E#502 Q#<P>
M66 P#502 L3 Q1000
o<m190> end sub</pre>
<br />
Espera a que la cama se caliente para seguir con el proceso.<br />
<br />
Ejemplo:<br />
<code></code><br />
M190 P60<br />
<br />
Donde P asigna la temperatura Q#<P>.<br />
<br />
M190 P127<br />
<br />
ver ejemplo M109<br />
<br />
Nota: No existe la variable T ya que solo se usa una cama caliente.<br />
<br />
<b>m191.ngc</b><br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">o<m191> sub
#502=1; hbc index
M68 E#502 Q#<P>
M66 P#502 L3 Q1000
o<m191> end sub</pre>
<br />
Se usa en impresoras 3d con cámara cerrada, tiene la misma función que M190.<br />
<br />
Ejemplo:<br />
<br />
M191 P50<br />
<br />
Donde P asigna la temperatura Q#<P>.<br />
<br />
M191 P127<br />
<br />
ver ejemplo M109<br />
<br />
Nota: No existe la variable T ya que solo se usa una cámara cerrada.<br />
<b>m200.ngc</b><br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">o<m200> sub
#500=44 ; filament diameter index
M68 E#500 Q#<D>
o<m200> endsub</pre>
<b> </b> <br />
Determina el diámetro del filamento, ideal para ser usado con g22 y g23.<br />
<br />
Ejemplo:<br />
<br />
M200 D1.75.<br />
<br />
<b>m207.ngc</b><br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">o<m207> sub
#500=47 ; retract length index
#501=48 ; retract velocity index
M68 E#500 Q#<P>
M68 E#501 Q#<Q>
o<m207> endsub</pre>
<br />
Utilizado para determinar la longitud y velocidad de extrusión sin tener código G para el extrusor. Ver g22 y g23.<br />
<br />
Ejemplo:<br />
<br />
M207 P0.5 Q10.0<br />
<br />
Donde P determina la longitud en mm y Q la velocidad en mm/s.<br />
<br />
<b>m221.ngc</b><br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">o<m221> sub
#500=49 ; extrude scale index
M68 E#500 Q#<P>
o<m221> endsub</pre>
<br />
Determina la escala con la que se quiere obtener la salida (extrusión).<br />
<br />
Ejemplo:<br />
<br />
M221 P0.96<br />
<br />
P indica la escala de salida en porcentaje, en este caso 96%.<br />
<br />
<b>m226.ngc</b><br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">o<M226> sub
M1
o<M226> end sub</pre>
<br />
Pausa el programa.<br />
<br />
Ejemplo:<br />
<br />
M226<br />
<br />
<b>m280.ngc</b><br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">o<m280> sub
#500=22; servo io start index
#501=0; not synchronized
#502=#500
o100 if [EXISTS[#<i>]]
o110 if [#<i> EQ 1]
#501=1
o110 endif
o100 endif
o101 if [EXISTS[#<t>]]
#502=[#<t>+#500]
o101 endif
o102 if [#501 EQ 1]
M67 E#502 Q#<P>
o102 else
M68 E#502 Q#<P>
o102 endif
o<m280> end sub</pre>
<br />
Sirve para controlar la posición del motor.<br />
<br />
Ejemplo:<br />
<br />
M280 T0 P1500<br />
<br />
Donde T selecciona el motor a usar y P indica el ángulo o microsegundos.<br />
<br />
<b>m300.ngc</b><br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">o<m300> sub
#500=39; buzzer frequency index
#501=40; buzzer duration index
#502=2; buzzer trigger index
#503=0; not synchronized
o100 if [EXISTS[#<i>]]
o110 if [#<i> EQ 1]
#503=0
o110 endif
o100 endif
o101 if [#503 EQ 1]
o111 if [EXISTS[#<q>]]
M67 E#500 Q#<q>; frequency
o111 endif
M67 E[#500+1] Q#<P>; duration
o113 if [#[#502+100] EQ 1]; trigger beep
M63 P#502
#[#502+100]=0
o113 else
M62 P#502
#[#502+100]=1
o113 endif
o101 else
o121 if [EXISTS[#<q>]]
M68 E#500 Q#<q>; frequency
o121 endif
M68 E[#500+1] Q#<P>; duration
o123 if [#[#502+100] EQ 1]; trigger beep
M65 P#502
#[#502+100]=0
o123 else
M64 P#502
#[#502+100]=1
o123 endif
o101 endif
o<m300> end sub</pre>
<br />
Emite una señal sonora.<br />
<br />
Ejemplo:<br />
<br />
M300 Q300 P1000<br />
<br />
Donde Q es la frecuencia y P es la duración en milisegundos<br />
<br />
<b>m400.ngc</b> <br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">o<m400> sub
G4 P0
o<m400> end sub</pre>
<br />
Espera que los movimientos que se están realizando finalicen.<br />
<br />
Ejemplo:<br />
<br />
M400<br />
<br />
si se usa G4 P10<br />
<br />
P es el tiempo de espera en segundos. <br />
<br />
<b>m420.ngc</b><br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">o<m420> sub
#500=26; light io start index
#501=0; not synchronized
#502=#500
o104 if [EXISTS[#<t>]]
#502=[#<t>*4+#500]
o104 endif
#503=[#502+1]
#504=[#502+2]
#505=[#502+3]
o100 if [EXISTS[#<r>]]
o110 if [#501 EQ 1]
M67 E#502 Q#<r>
o110 else
M68 E#502 Q#<r>
o110 endif
o100 endif
o101 if [EXISTS[#<e>]]
o111 if [#501 EQ 1]
M67 E#503 Q#<e>
o111 else
M68 E#503 Q#<e>
o111 endif
o101 endif
o102 if [EXISTS[#<d>]]
o112 if [#501 EQ 1]
M67 E#504 Q#<d>
o112 else
M68 E#504 Q#<d>
o112 endif
o102 endif
o103 if [EXISTS[#<p>]]
o113 if [#501 EQ 1]
M67 E#505 Q#<p>
o113 else
M68 E#505 Q#<p>
o113 endif
o103 endif
o<m420> end sub</pre>
<br />
Controla los colores RGBW con PWM.<br />
<br />
M420 T<LED index (0-2)> R<Red PWM (0-1)> E<Green PWM (0-1)> D<Blue PWM (0-1)> P<White PWM (0-1)> <br />
<br />
Ejemplo: <br />
<br />
M420 R1.0 E1.0 D1.0 P1.0<br />
<br />
<b>m700.ngc</b><br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">o<m700> sub
#500=41; filament area index
#501=1; synchronized
#502=#500
o100 if [EXISTS[#<i>]]
o110 if [#<i> EQ 1]
#501=0
o110 endif
o100 endif
o101 if [#501 EQ 1]
M67 E#502 Q#<P>
o101 else
M68 E#502 Q#<P>
o101 endif
o<m700> end sub</pre>
<br />
Cálcula la sección de área del filamento, se usa con g22 y g23. <br />
<br />
Ejemplo:<br />
<br />
M700 P0.061 <br />
<br />
P determina el valor que se va a calcular con la función de velocidad de extrusión. <br />
<br />
<b>m701.ngc </b><br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">o<m701> sub
#500=42; line width index
#501=1; synchronized
#502=#500
o100 if [EXISTS[#<i>]]
o110 if [#<i> EQ 1]
#501=0
o110 endif
o100 endif
o101 if [#501 EQ 1]
M67 E#502 Q#<P>
o101 else
M68 E#502 Q#<P>
o101 endif
o<m701> end sub</pre>
<br />
Determina el ancho de línea a calcular.<br />
<br />
Ejemplo:<br />
<br />
M701 P0.2<br />
<br />
P determina el valor del ancho que se puede usar con la altura de línea para calcular la sección de cruce. Forma parte de la función velocidad de extrusión.<br />
<br />
<b>m701.ngc</b><br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">o<m701> sub
#500=43; line height index
#501=1; synchronized
#502=#500
o100 if [EXISTS[#<i>]]
o110 if [#<i> EQ 1]
#501=0
o110 endif
o100 endif
o101 if [#501 EQ 1]
M67 E#502 Q#<P>
o101 else
M68 E#502 Q#<P>
o101 endif
o<m701> end sub</pre>
<br />
Determina la altura de línea a calcular.<br />
<b> </b><br />
Ejemplo:<br />
<br />
M702 P0.15<br />
<br />
P determina el valor de la altura que se puede usar con el ancho de línea
para calcular la sección de cruce. Forma parte de la función velocidad
de extrusión.<b> </b><br />
<br />
<b>m710.ngc </b><br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">o<m710> sub
#500=45; jog velocity index
#501=46; jog length index
#502=12; jog trigger index
#503=13; jog continuous index
#504=14; jog direction index
o100 if [EXISTS[#<q>]]
o110 if [#<q> LT 0]
M68 E#500 Q[#<q> * -1]; inverse velocity
M64 P#504
o110 else
M68 E#500 Q#<q>; velocity
M65 P#504
o110 endif
o100 endif
o101 if [EXISTS[#<p>]]
M68 E#501 Q#<p>; length
o101 endif
o102 if [EXISTS[#<e>]]
o112 if [#<e> EQ 1]; trigger continuous
M64 P#503
o112 else
M65 P#503
o112 endif
o102 else
M64 P#502
o102 endif
o<m710> end sub</pre>
<br />
Determina cuanto filamento se va a extraer.<br />
<br />
Ejemplo:<br />
<br />
M710 P10.0 Q2.0<br />
<br />
Donde P indica la longitud en mm y Q la velocidad en mm/s.<br />
<br />
Con esto finaliza la explicación de códigos G y M usados en las impresoras 3d.<br />
<br />
Para poder configurar los códigos explicados se debe incluir lo siguiente en el archivo .ini.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">[RS274NGC]
# Machinekit fdm subroutines path
SUBROUTINE_PATH = /usr/share/linuxcnc/ncfiles/remap-subroutines/fdm
# alternatively you can copy the subroutines a local subroutines folder
# SUBROUTINE_PATH = subroutines
# remapping Machinekit FDM GCodes
REMAP=G22 modalgroup=1 ngc=g22
REMAP=G23 modalgroup=1 ngc=g23
REMAP=G28 modalgroup=1 argspec=xyza ngc=g28
REMAP=G29 modalgroup=1 ngc=g29
REMAP=G29.1 modalgroup=1 argspec=xyz ngc=g29_1
REMAP=G29.2 modalgroup=1 argspec=xyz ngc=g29_2
REMAP=G30 modalgroup=1 argspec=pxy ngc=g30
REMAP=M104 modalgroup=10 argspec=iPt ngc=m104
REMAP=M106 modalgroup=10 argspec=iPt ngc=m106
REMAP=M107 modalgroup=10 argspec=it ngc=m107
REMAP=M109 modalgroup=10 argspec=tP ngc=m109
REMAP=M140 modalgroup=10 argspec=iP ngc=m140
REMAP=M141 modalgroup=10 argspec=iP ngc=m141
REMAP=M190 modalgroup=10 argspec=P ngc=m190
REMAP=M191 modalgroup=10 argspec=P ngc=m191
REMAP=M200 modalgroup=10 argspec=D ngc=m200
REMAP=M207 modalgroup=10 argspec=PQ ngc=m207
REMAP=M221 modalgroup=10 argspec=P ngc=m221
REMAP=M226 modalgroup=10 ngc=m226
REMAP=M280 modalgroup=10 argspec=itP ngc=m280
REMAP=M300 modalgroup=10 argspec=iqP ngc=m300
REMAP=M400 modalgroup=10 ngc=m400
REMAP=M420 modalgroup=10 argspec=itredp ngc=m420
REMAP=M700 modalgroup=10 argspec=iP ngc=m700
REMAP=M701 modalgroup=10 argspec=iP ngc=m701
REMAP=M702 modalgroup=10 argspec=iP ngc=m702
REMAP=M710 modalgroup=10 argspec=epq ngc=m710
# enable ini parameter passing
FEATURES = 4
[FILTER]
PROGRAM_EXTENSION = .gcode RepRap Flavour GCode
gcode = gcode-to-ngc</pre>
<br />
El path puede ser cambiado a la carpeta donde se quiera guardar los códigos G y M.<br />
<br />
Toda esta información fue extraida del siguiente link <a href="https://github.com/thecooltool/machinekit-configs/tree/78552abb89c8337f80e513b8ac5d34cbf3958f73" target="_blank">Machinekit-configs</a>, en ese link se indican diferentes configuraciones para varias máquinas. Incluso como configurar la impresora 3d reemplazando el archivo .hal por un archivo python .py.<br />
<br />
<b>Componentes Machinekit </b><br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">Abs
Abs s32
And2
Andn
At pid
Bin2gray
Biquad
Bitslice
Bitwise
Bldc hall3
Blend
Clarke2
Clarke3
Clarkeinv
Comp
Constant
Ddt
Deadzone
Debounce
Div2
Edge
Estop latch
Feedcomp
Flipflop
Gantry
Gearchange
Gray2bin
Hbridge
Hypot
Idb
Ilowpass
Integ
Invert
Io muxn
Joyhandle
Knob2float
Latencybins
Led dim
Lgantry
Limit1
Limit2
Limit3
Lincurve
Lowpass
Lut5
Lutn
Maj3
Match8
Minmax
Mult2
Multiclick
Multiswitch
Mux16
Mux2
Mux4
Mux8
Muxn
Muxn u32
Near
Neg
Not
Offset
Oneshot
Or2
Orient
Orn
Out to io
Pid
Reset
Safety latch
Sample hold
Scale
Select8
Selectn
Sphereprobe
Stats
Sum2
Thc
Thcud
Threadtest
Time
Timedelay
Toggle
Toggle2nist
Tristate bit
Tristate float
Updown
Wcomp
Wcompn
Weighted sum
Xor2</pre>
<br />
Para entender como usar estos componentes se debe revisar el siguiente link <a href="http://machinekit-docs.readthedocs.org/en/latest/" target="_blank">Machinekit Documentation</a>. En la parte izquierda se encuentra el índice, desplazando la barra se encuentra la información de todos los componentes. <br />
<br />
Existe componentes muy útiles como el THC para controlar la altura de la antorcha de una plasma, PID, AT_PID para encontrar los valores PID de forma automática, DDT para derivar un valor, útil para encontrar velocidad y aceleración a partir de la distancia y muchos más que se irán usando en nuevos tutoriales.<br />
<br />
Se va dar un ejemplo de como usar el componente wcomp, ya que con este se va controlar los límites máximos y mínimos de la temperatura.<br />
<br />
En el archivo .hal se debe añadir los componentes que se quiera usar.<br />
<br />
Cargando el componente wcomp para usar en los dos extrusores.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">loadrt wcomp count=2
loadrt pid count=2</pre>
<br />
Conectando la señal de wcomp al comando pid feedback para obtener el valor que esta midiendo. <br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">net e0.temp.meas <= Extruder0.Temp.meas
net e0.temp.meas => pid.0.feedback => wcomp.0.in</pre>
<br />
Ahora se establece los límtes máximo y mínimo para controlar que no sobrepase la temperatura, importante para extrusores de plástico. En mi caso uso extrusores de aluminio asi que no hay ningún problema con trabajar con temperaturas altas, con le que he asignado un límite máximo de 300 grados celsius.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">setp wcomp.0.min 0
setp wcomp.0.max 300 # Maximum temperature limit</pre>
<br />
Si el valor se mantiene dentro de los límites de temperatura, wcomp.0.out tendrá el valor de 1 con lo que mantendrá activada la función PID.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">net enable.pid.extrusor0 pid.0.enable <= wcomp.0.out</pre>
<br />
<br />
Conclusiones: Existen varios códigos G y M que se pueden usar directamente con linuxcnc, principalmente con la GUI gmoccapy que por medio de botones se puede hacer lo mismo que las subrutinas descritas en la parte superior.<br />
<br />
Los componentes Hal ahorran mucho el proceso de estar programando para funciones especificas de una máquina y al estar distribuidos en varios permite usar cada código en lo que se necesite.<br />
En el caso del componente hal_temp_max31855 se le añadido una comparación directa que determina si la temperatura medida es igual o mayor a la asignada para continuar con el código G. Pero esto se puede realizar con el componente hal wcomp como se ha explicado en la parte superior. En mi caso la dejaré así y usaré los límites de temperatura con el termistor de la cama caliente.<br />
<br />
El siguiente tutorial va ha ser de como usar el componente at_pid, donde se explicará como llegar a configurar de forma correcta la temperatura una vez obtenido los valores PID de forma automática.<br />
<br />Vichentehttp://www.blogger.com/profile/13532517773299729858noreply@blogger.com0tag:blogger.com,1999:blog-6209740641626143717.post-48011764672431582382015-12-31T18:02:00.001-08:002016-01-06T10:14:10.836-08:00Configurar archivo .ini y .hal (PID) para usar librería MAX31855 con gmoccapy_lcd7Para continuar con este tutorial se debe haber creado los arhivos de los siguientes tutoriales:<br />
<br />
<a href="http://machinekit-gmoccapy-lcd7.blogspot.com/2015/12/gui-basica-con-glade-y-gladevcp.html">GUI Temperatura</a>.<br />
<a href="http://machinekit-gmoccapy-lcd7.blogspot.com/2015/12/libreria-max31855-para-leer-temperatura.html">Librería MAX31855</a>.<br />
<a href="http://machinekit-gmoccapy-lcd7.blogspot.com/2015/12/crear-componente-hal-usando-la-libreria.html">Componente HAL MAX31855</a>.<br />
<br />
<b>Configuración archivo .ini</b><br />
<br />
En el archivo .ini se pondrá la Gui de temperatura y el archivo postguihal necesarios para leer la temperatura y realizar las conexiones.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">[DISPLAY]
# Name of display program, e.g., tkemc
#DISPLAY = tkemc
#DISPLAY = axis
DISPLAY = gmoccapy_lcd7
#EMBED_TAB_NAME = right_side_panel
#EMBED_TAB_LOCATION = box_right
#EMBED_TAB_COMMAND = gladevcp -x {XID} ReadTemp.glade
EMBED_TAB_NAME = Temperatura
EMBED_TAB_LOCATION = ntb_user_tabs
EMBED_TAB_COMMAND = gladevcp -x {XID} ReadTemp.glade</pre>
<br />
En este caso se visualizará la temperatura en las pestañas de gmoccapy.<br />
<b> </b><br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">[HAL]
# The run script first uses halcmd to execute any HALFILE
# files, and then to execute any individual HALCMD commands.
# list of hal config files to run through halcmd
# files are executed in the order in which they appear
HALFILE = MF5-Dual-Extrusion.hal
#HALFILE = joypad.hal
HALUI = halui
POSTGUI_HALFILE = 3D.postgui.hal</pre>
<br />
Se cargan los archivos .hal que se utilizarán, joypad y halui son para poder controlar machinekit con un mando de juegos en mi caso con el control del Xbox 360. Se realizará esta configuración en tutoriales posteriores.<b> </b><br />
<b><br /></b>
<b>Configuración Archivo .hal</b><br />
<b><br /></b>
En el archivo .hal se debe aumentar y modificar algunas líneas.<br />
<br />
En este caso se va a leer dos extrusores (termocuplas) con el amplificador MAX31855 y se usará el módulo de PID para controlar la temperatura.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">loadrt pid count=3
loadrt limit1 count=3
loadusr -Wn Extruder0 hal_temp_max31855 -n Extruder0 -b SPI0 -num 1 -i 0.3
loadusr -Wn Extruder1 hal_temp_max31855 -n Extruder1 -b SPI0 -num 2 -i 0.3</pre>
<br />
Se añade el pid al servo-thread<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">addf pid.0.do-pid-calcs servo-thread
addf pid.1.do-pid-calcs servo-thread
addf pid.2.do-pid-calcs servo-thread
addf limit1.0 servo-thread
addf limit1.1 servo-thread
addf limit1.2 servo-thread</pre>
<br />
Se crean nuevas señales que controlarán los extrusores y cama caliente.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">newsig e0.temp.set float
newsig e0.temp.meas float
newsig bed.temp.set float
newsig bed.temp.meas float
newsig e1.temp.set float
newsig e1.temp.meas float</pre>
<br />
Se da una frecuencia para generar las señales PWM, en este caso de 1khz.<br />
<br />
1000000ns -> 0.001s.<br />
<br />
1/0.001 = 1khz <br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">setp hpg.pwmgen.00.pwm_period 1000000</pre>
<br />
Se define los GPIO que van a generar las señales PWM.<br />
<b> </b><br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"># P9.26 gpio0_14 Extrusor 1
setp hpg.pwmgen.00.out.01.pin 0x2E
setp hpg.pwmgen.00.out.01.enable 1
setp hpg.pwmgen.00.out.01.value 0.0
# J9.16 gpio1_19 Bed
#setp hpg.pwmgen.00.out.00.pin 0x53
#setp hpg.pwmgen.00.out.00.enable 1
#setp hpg.pwmgen.00.out.00.value 0.0
# P9.15 gpio1_16 Extrusor 0
setp hpg.pwmgen.00.out.02.pin 0x50
setp hpg.pwmgen.00.out.02.enable 1
setp hpg.pwmgen.00.out.02.value 0.0</pre>
<b> </b><br />
<br />
Por útlimo se unen las señales con los componentes.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"># PID for Extruder 0 temperature control
net e0.temp.meas <= Extruder0.Temp.meas
net e0.temp.meas => pid.0.feedback
sets e0.temp.set 0
net e0.temp.set motion.analog-out-02 => pid.0.command
net e0.temp.set => Extruder0.Temp.set
net e0.done motion.digital-in-02 <= Extruder0.Temp.set.done
net e0.heater <= pid.0.output
net e0.heater => limit1.0.in
net e0.heaterl <= limit1.0.out
net e0.heaterl => hpg.pwmgen.00.out.02.value
# Limit heater PWM to positive values
# PWM mimics hm2 implementation, which generates output for negative values
setp limit1.0.min 0
# PID for Extruder 1 temperature control
net e1.temp.meas <= Extruder1.Temp.meas
net e1.temp.meas => pid.1.feedback
sets e1.temp.set 0
net e1.temp.set motion.analog-out-01 => pid.1.command
net e1.temp.set => Extruder1.Temp.set
net e1.done motion.digital-in-01 <= Extruder1.Temp.set.done
net e1.heater <= pid.1.output
net e1.heater => limit1.2.in
net e1.heaterl <= limit1.2.out
net e1.heaterl => hpg.pwmgen.00.out.01.value
# Limit heater PWM to positive values
# PWM mimics hm2 implementation, which generates output for negative values
setp limit1.2.min 0
# PID for Bed temperature control
#net bed.temp.meas <= Temp.Temperatura
#net bed.temp.meas => pid.2.feedback
#sets bed.temp.set 0
#net bed.temp.set => pid.2.command
#net bed.heater <= pid.2.output
#net bed.heater => limit1.2.in
#net bed.heaterl <= limit1.2.out
#net bed.heaterl => hpg.pwmgen.00.out.00.value
# Limit heater PWM to positive values
# PWM mimics hm2 implementation, which generates output for negative values
setp limit1.1.min 0
# PID Parameters for adjusting temperature control
# Extruder0
#setp pid.0.FF0 0
#setp pid.0.FF1 0
#setp pid.0.FF2 0
setp pid.0.Pgain 0.366693
setp pid.0.Igain 0.00001
setp pid.0.Dgain 0.9375
setp pid.0.maxerror 0.0
setp pid.0.bias 0.5
setp pid.0.enable 1
# Extruder1
#setp pid.1.FF0 0
#setp pid.1.FF1 0
#setp pid.1.FF2 0
setp pid.1.Pgain 0.366693
setp pid.1.Igain 0.00001
setp pid.1.Dgain 0.9375
setp pid.1.maxerror 0.0
setp pid.1.bias 0.5
setp pid.1.enable 1
# Bed
#setp pid.2.FF0 0
#setp pid.2.FF1 0
#setp pid.2.FF2 0
#setp pid.2.Pgain 1
#setp pid.2.Igain 0.0
#setp pid.2.Dgain 0.0
#setp pid.2.maxerrorI 1.0
#setp pid.2.bias 0.5
#setp pid.2.enable 1</pre>
<br />
Archivo Postgui .hal.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"># Include your customized HAL commands here
# Run on Gmoccapy with gladevcp panel
net e0.temp.set => ReadTemp.Extruder_Hal_lbl
net e0.temp.meas => ReadTemp.E0_Temp
net bed.temp.set => ReadTemp.Bed_Hal_lbl
net bed.temp.meas => ReadTemp.Bed_Temp
net e1.temp.set => ReadTemp.Extruder1_Hal_lbl
net e1.temp.meas => ReadTemp.E1_Temp</pre>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
El siguiente esquematico se basa en el diseño de Adafruit para los MAX31855 y de CRAMPS para la conexión de los Fusores (Extrusores). A continuación dejo los links para los que deseen descargar los esquemáticos.<br />
<br />
<a href="https://github.com/adafruit/Adafruit-MAX31855-breakout-board" target="_blank">Adafruit MAX31855</a><br />
<a href="https://github.com/cdsteinkuehler/bobc_hardware/tree/CRAMPS/CRAMPS" target="_blank">CRAMPS</a><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg72_g2YtxduAneoz71Qw4fljgwHBbROuT0t_-EW56KDGXf2DDomsb8vz-yX1dvMNPSYgMwdV5fB7PMUDc4l3oR8PWEiL3fP7a-AA49htW3ipGsx7gzSiRKa12Vxlr0yCTEuwqoCGLSPaM/s1600/MAX31855_circuit.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="352" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg72_g2YtxduAneoz71Qw4fljgwHBbROuT0t_-EW56KDGXf2DDomsb8vz-yX1dvMNPSYgMwdV5fB7PMUDc4l3oR8PWEiL3fP7a-AA49htW3ipGsx7gzSiRKa12Vxlr0yCTEuwqoCGLSPaM/s640/MAX31855_circuit.jpg" width="640" /></a></div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiITdUjlfPCalmb-WYzOMB62-P1sJV3IN6mxKX7zzWCCo3xCwv9ZDsZG0R1Fp9Li4rkF4evHRWyLiB1309IZUmEi0cXc_rWb6GAu9vseBwHb4sSb3wdpmfrQic889SsgOH0PK_LDydYXpk/s1600/gmoccapy_temperatura.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="392" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiITdUjlfPCalmb-WYzOMB62-P1sJV3IN6mxKX7zzWCCo3xCwv9ZDsZG0R1Fp9Li4rkF4evHRWyLiB1309IZUmEi0cXc_rWb6GAu9vseBwHb4sSb3wdpmfrQic889SsgOH0PK_LDydYXpk/s640/gmoccapy_temperatura.gif" width="640" /></a></div>
<br />
En el siguiente gif se muestra la lectura de temperatura usando el amplificador MAX31855 con termocuplas tipo K. Se calienta el primer extrusor y luego el segundo extrusor.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<b> </b>Vichentehttp://www.blogger.com/profile/13532517773299729858noreply@blogger.com0tag:blogger.com,1999:blog-6209740641626143717.post-72091425471833561402015-12-31T16:25:00.000-08:002015-12-31T16:36:54.796-08:00Crear componente hal usando la librería MAX31855Para poder seguir con este tutorial se recomienda leer <a href="http://machinekit-gmoccapy-lcd7.blogspot.com/2015/12/libreria-max31855-para-leer-temperatura.html" target="_blank">Librería MAX31855</a>.<br />
<br />
El siguiente tutorial explica como crear componentes para poder cargarlos en la configuración .hal.<br />
<br />
Crear archivo.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">nano hal_temp_max31855</pre>
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">#!/usr/bin/python
# encoding: utf-8
"""
Temperature.py
Created by Leonardo Noguera on 2015-12-19.
"""
from drivers.MAX31855 import MAX31855
import argparse
import time
import sys
import hal
def parseHandleDevice(spi_bus):
if spi_bus != 'SPI0' and spi_bus != 'SPI1':
print(("wrong SPI"))
sys.exit(1)
if spi_bus == 'SPI0':
bus = MAX31855.SPI0
else:
bus = MAX31855.SPI1
return bus
parser = argparse.ArgumentParser(description='HAL component to read MAX31855 Temperature values')
parser.add_argument('-n', '--name', help='HAL component name', required=True)
parser.add_argument('-b', '--spi_bus', help='SPI bus id', default="SPI1")
parser.add_argument('-num', '--num_devices', help='Max 2 MAX31855', default=1)
parser.add_argument('-i', '--interval', help='SPI update interval', default=0.3)
parser.add_argument('-d', '--delay', help='Delay before the SPI should be updated', default=0.0)
args = parser.parse_args()
updateInterval = float(args.interval)
delayInterval = float(args.delay)
error = True
watchdog = True
bus = parseHandleDevice(args.spi_bus)
if (int(args.num_devices) == 1):
cs = 0
elif (int(args.num_devices) == 2):
cs = 1
else:
print("Only two Max31855 are supported")
sys.exit(1)
thermocouple = MAX31855(bus=int(bus),spi_cs=int(cs))
# Initialize HAL
h = hal.component(args.name)
halThermocouple = h.newpin("Temp.meas", hal.HAL_FLOAT, hal.HAL_OUT)
halTemperatureSet = h.newpin("Temp.set", hal.HAL_FLOAT, hal.HAL_IN)
halTempPinActive = h.newpin("Temp.set.done", hal.HAL_BIT, hal.HAL_OUT)
halErrorRead = h.newpin("error", hal.HAL_BIT, hal.HAL_OUT)
halNoErrorRead = h.newpin("no-error", hal.HAL_BIT, hal.HAL_OUT)
halWatchdogRead = h.newpin("watchdog", hal.HAL_BIT, hal.HAL_OUT)
h.ready()
halErrorRead.value = error
halNoErrorRead.value = not error
halWatchdogRead.value = watchdog
try:
time.sleep(delayInterval)
while (True):
try:
if (error):
error = False
temp = thermocouple.readTempC()
if (temp == None):
try:
# The MAX31855 reported an error, print it:
if thermocouple.error == thermocouple.SHORT_TO_GND:
print "Thermocouple shorted to GND"
elif thermocouple.error == thermocouple.SHORT_TO_VCC:
print "Thermocouple shorted to VCC"
except:
if thermocouple.error == thermocouple.OPEN_CIRCUIT:
print "Thermocouple not connected"
print(("exiting HAL component " + args.name))
h.exit()
else:
halThermocouple.value = float("{:0.2f}".format(temp))
if (halThermocouple.value >= halTemperatureSet.value):
halTempPinActive.value = 1
else: halTempPinActive.value = 0
except IOError as e:
error = True
thermocouple.close()
halErrorRead.value = error
halNoErrorRead.value = not error
watchdog = not watchdog
halWatchdogRead.value = watchdog
time.sleep(updateInterval)
except:
print(("exiting HAL component " + args.name))
h.exit()
</pre>
<br />
Lo que hace el siguiente archivo es importar la librería MAX31855, verificar que SPI se quiere usar, por defecto SPI1. Lo que sigue son los argumentos que se pueden usar, siendo obligatorio dar un nombre para el componente.<br />
<br />
Usando num = 1 o num = 2, se puede leer un MAX31855 enviando un cero a cs y con una compuerta NOT se obtiene acceso a un segundo MAX31855 mandando un 1 y la compueta NOT convirtiendola en un 0 para que se habilite el segundo MAX31855. Soporta un máximo de 4 MAX31855 usando SPI0 y SPI1. Si se necesitará de más MAX31855 se debería cambiar la librería para que se simule por software la lectura de SPI y habilitar la seleccion del chip (cs) con cualquier GPIO. Ver como ejemplo <a href="https://github.com/adafruit/Adafruit_Python_MAX31855" target="_blank">Adafruit MAX31855</a>.<br />
<br />
En el siguiente paso se crea las señales hal que se encargarán de leer la temperatura, adquirir el valor de temperatura proporcionado por "código g" y determinar si la temperatura que se esta leyendo ha sobrepasado la temperatura enviada para seguir con el código G. Esto se explicará en el proximo tutorial al hablar de código G remapeado y uso de PID.<br />
<br />
Por último se lee la temperatura y en el caso de no estar conectada la termocupla o este a circuitada GND o VCC se imprimirá lo que retorne, excepto la temperatura que se gaurdará en la variable "halThermocouple.value".<br />
<br />
Para entender mejor lo que se ha realizado, se recomienda leer los componentes hal de las librerías de Machinekit. <a href="https://github.com/machinekit/machinekit/tree/master/src/hal/user_comps" target="_blank">Hal user components</a>.<br />
<br />
El código de arriba se lo guardará con el nombre de hal_temp_max31855, luego se le dará permisos de ejecución y finalmente se lo copiará a /usr/bin para poder usarlo con Machinekit.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">sudo chmod +x hal_temp_max31855
sudo cp hal_temp_max31855 /usr/bin</pre>
<br />
<b>Probar componente hal_temp_max31855.</b><br />
<br />
En mi caso se cargará el componente de la siguiente manera:<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">loadusr -Wn Extruder0 hal_temp_max31855 -n Extruder0 -b SPI0 -num 1 -i 0.3</pre>
<br />
Donde loadusr indicá que cargará un componente creado, -Wn se usará para identificar al componente con un nombre, hal_temp_max31855 será el componente que se cargara con -n que es el nombre que se le dará, -b para escoger que se quiere trabajar con SPI0 o SPI1, -num 1 para mandar un cero a cs, -i para dar un tiempo de actualización 300ms.<br />
<br />
Como requisito para que funcione es neceserio que se haya Habilitado SPI0 o SPI1 (device tree overlay). <br />
<b> </b><br />
Para probar componentes o archivos se puede usar el ejecutable "halrun" en el terminal<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">halrun
loadusr -Wn Extruder0 hal_temp_max31855 -n Extruder0 -b SPI0 -num 1 -i 0.3
show pin</pre>
<br />
Cada vez que se de la orden de show pin se verán los cambios de temperatura.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVL67Oq9eEcNEz51mQiaUYIC5sMxLo4F73sBJZA63Tbkp_lvnMz8yqfmXYp2e9bgWEGpzWKit7pGLp9O8aRcLPi35hb_fu1fWkB4nWr9uAg2dNW599-U9Uq6xbQEuLEleKz2zh_4IHTVE/s1600/halrun_temp_max31855.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="312" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVL67Oq9eEcNEz51mQiaUYIC5sMxLo4F73sBJZA63Tbkp_lvnMz8yqfmXYp2e9bgWEGpzWKit7pGLp9O8aRcLPi35hb_fu1fWkB4nWr9uAg2dNW599-U9Uq6xbQEuLEleKz2zh_4IHTVE/s640/halrun_temp_max31855.jpg" width="640" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />Vichentehttp://www.blogger.com/profile/13532517773299729858noreply@blogger.com0tag:blogger.com,1999:blog-6209740641626143717.post-65707300321771753512015-12-31T15:25:00.000-08:002016-01-21T00:59:42.707-08:00Librería Max31855 para leer temperatura con termocuplas usando MachinekitEste tutorial se centra en poder leer la temperatura con el amplificador MAX31855 a través de una termocupla. Lo primero que se necesita es copiar la librería modificada a la carpeta de drivers que maneja Machinekit, donde estan varias librerías para controlar otros dispositivos como el MCP23017, ADS7828, PCA9685.<br />
<br />
En el transcurso de este tutorial se dará una breve explicación de como usar estas librerías dentro del archivo .hal de machinekit para poder expandir los puertos de entradas y salidas en el caso del MCP23017, leer temperatura a través de los 8 canales del ADS7828 y poder generar señales PWM con el PCA9685.<br />
<br />
La librería MAX31855 fue obtenida de <a href="https://github.com/graycatlabs/PyBBIO/wiki" target="_blank">PyBBIO</a> y una pequeña porción de código de <a href="https://github.com/adafruit/Adafruit_Python_MAX31855" target="_blank">Adafruit</a> se adapto por conflictos que se ha tenido con la librería de serbus originaría de PyBBIO; cambiando Serbus por Spidev.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">nano MAX31855.py</pre>
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">"""
MAX31855
Copyright 2015 - Alexander Hiam <alex@graycat.io>
A library for PyBBIO to interface with Maxim's MAX31855 thermocouple amplifier.
MAX31855 is released as part of PyBBIO under its MIT license.
See PyBBIO/LICENSE.txt
"""
# Copyright (c) 2014 Adafruit Industries
# Author: Tony DiCola
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
import spidev
class MAX31855(object):
SPI0 = 1
SPI1 = 2
OPEN_CIRCUIT = 1
SHORT_TO_GND = 2
SHORT_TO_VCC = 4
def __init__(self, bus, spi_cs=0, offset=0):
self.spi_bus = spidev.SpiDev()
self.bus = bus
self.spi_cs = spi_cs
self.spi_bus.open(bus,spi_cs)
self.offset = offset
self.error = None
def readTempF(self):
""" Reads temperature, converts to Fahrenheit and returns, or
returns None if error detected. """
temp = self.readTempC()
return temp if not temp else temp * 9.0/5.0 + 32
def readTempC(self):
""" Reads and returns the temperature in Celsius, or returns None
if error detected. """
value = self.read()
if value == None: return None
# Extract 14-bit signed temperature value:
temp = (value >> 18) & 0x3fff
# Convert 2's complement:
if temp >= 2**13: temp -= 2**14
return temp*0.25 + self.offset
def readTempInternal(self):
""" Reads and returns the MAX31855 reference junction temperature
in Celsius, or returns None if error detected. """
value = self.read()
if value == None: return None
temp = (value >> 4) & 0xfff
# Convert 2's complement:
if temp >= 2**11: temp -= 2**12
return temp*0.0625
def read(self):
""" Receives and returns full 32-bit map from MAX31855, or sets
self.error and returns None if fault detected. """
self.error = None
# Configure SPI bus as required by the MAX31855:
self.spi_bus.mode = 0
self.spi_bus.max_speed_hz = 5000000
self.spi_bus.lsbfirst = False
raw = bytearray(self.spi_bus.readbytes(4))
value = raw[0] << 24 | raw[1] << 16 | raw[2] << 8 | raw[3]
if (value & (1<<16)):
# Fault bit set, save error code and return None:
self.error = value & 0b111
return None
return value
def close(self):
self.spi_bus.close()</pre>
<br />
En el siguiente tutorial se explicará como se usará la librería MAX31855 con Machinekit, creando un archivo que se usará como componente hal.<br />
<br />
Para eso hay que escribir python -v e importar cualquier librería de Machinekit del siguiente link <a href="https://github.com/machinekit/machinekit/tree/master/lib/python/drivers" target="_blank">Machinekit Drivers</a>.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">python -v
from drivers import MCP23017
#saldrán varias rutas lo que interesa es que ha localizado la carpeta drivers,
#es ahi donde se debe copiar la librería MAX31855.py
sudo cp MAX31855.py /usr/lib/python2.7/dist-packages/drivers</pre>
<br />
Comprobamos la librería MAX31855.py<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">python
from drivers import MAX31855</pre>
<br />
Se ne se obtiene errores se a realizado de forma correcta los pasos. La siguiente parte es crear los archivos DTO para usar SPIDEV.<br />
<br />
Para poder usar la librería Spidev se debe exportar el device tree overlay de SPI0 o SPI1, según el que se vaya a usar. En este caso se usará el SPI0 con do como entrada y d1 como salida. Para más información revisar el siguiente link <a href="http://elinux.org/BeagleBone_Black_Enable_SPIDEV" target="_blank">BBB-SPIDEV</a>.<br />
<br />
Crear el archivo<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">nano BB-SPI0-01-00A0.dts</pre>
<br />
Pegar lo siguiente y guardar ctrl+o<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">/dts-v1/;
/plugin/;
/ {
compatible = "ti,beaglebone", "ti,beaglebone-black";
/* identification */
part-number = "spi0pinmux";
fragment@0 {
target = <&am33xx_pinmux>;
__overlay__ {
spi0_pins_s0: spi0_pins_s0 {
pinctrl-single,pins = <
0x150 0x30 /* spi0_sclk, INPUT_PULLUP | MODE0 */
0x154 0x30 /* spi0_d0, INPUT_PULLUP | MODE0 */
0x158 0x10 /* spi0_d1, OUTPUT_PULLUP | MODE0 */
0x15c 0x10 /* spi0_cs0, OUTPUT_PULLUP | MODE0 */
>;
};
};
};
fragment@1 {
target = <&spi0>;
__overlay__ {
#address-cells = <1>;
#size-cells = <0>;
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&spi0_pins_s0>;
spidev@0 {
spi-max-frequency = <24000000>;
reg = <0>;
compatible = "spidev";
};
spidev@1 {
spi-max-frequency = <24000000>;
reg = <1>;
compatible = "spidev";
};
};
};
};
</pre>
<br />
<br />
spidev@0 permite usar cs (chip select) con 0<br />
spidev@1 permite usar cs (chip select) con 1 <br />
<br />
Ahora hay que compilar el archivo usando dtc.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">dtc -O dtb -o BB-SPI0-01-00A0.dtbo -b 0 -@ BB-SPI0-01-00A0.dts</pre>
<br />
Si no se ha obtenido ningún error, se procede a copiar el archivo a /lib/firmware<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">sudo cp BB-SPI0-01-00A0.dtbo /lib/firmware/</pre>
<br />
Para poder usar SPIDEV hay que habilitar el device tree overlay<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">sudo su
cd /lib/firmware
echo BB-SPI0-01 > /sys/devices/bone_capemgr.*/slots</pre>
<br />
Comprobar que se habilito SPI0<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">cat /sys/devices/bone_capemgr.*/slots
ls /dev/spidev*
ls /sys/bus/spi/devices/</pre>
<br />
Con el comando cat se obtiene lo siguiente:<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"> 0: 54:PF---
1: 55:PF---
2: 56:PF---
3: 57:PF---
4: ff:P-O-L Bone-LT-eMMC-2G,00A0,Texas Instrument,BB-BONE-EMMC-2G
5: ff:P-O-- Bone-Black-HDMI,00A0,Texas Instrument,BB-BONELT-HDMI
6: ff:P-O-L Bone-Black-HDMIN,00A0,Texas Instrument,BB-BONELT-HDMIN
7: ff:P-O-L Override Board Name,00A0,Override Manuf,BBB-LCNC-MF5
8: ff:P-O-L Override Board Name,00A0,Override Manuf,BB-SPI0-01</pre>
<br />
Usando ls en "/dev/spidev*":<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">/dev/spidev1.0 /dev/spidev1.1</pre>
<br />
Usando ls en "ls /sys/bus/spi/devices/":<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">spi1.0 spi1.1</pre>
<br />
Con lo anterior se verifica que SPI0 se puede usar con cs=0 y cs=1 y se ha cargado correctamente. Si se hubiese cargado SPI1 los valores serían spi2.0 y spi2.1.<br />
<br />
El siguiente link facilita la información del dts de SPI0 y SPI1 -> <a href="https://github.com/adafruit/adafruit-beaglebone-io-python/tree/master/overlays" target="_blank">Adafruit Overlays</a>. <br />
<br />
Para no repetir el paso anterior cada vez que se reinicia la Beaglebone Black, hay que habilitar SPI a través del script principal de Machinekit. Asi cuando se use Machinekit se exportará de forma automática.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"># Make sure required device tree overlay(s) are loaded
for DTBO in BBB-LCNC-MF5 BB-SPI0-01; do
if grep -q $DTBO $SLOTS ; then
echo $DTBO overlay found
else
echo Loading $DTBO overlay
sudo -A su -c "echo $DTBO > $SLOTS" || dtbo_err
sleep 1
fi
done;</pre>
<br />
BBB-LCNC-MF5 es mi device tree overlay personalizado para poder ejecutar Machinekit con pantallas LCD. Revisar el siguiente link para poder utilizar mi DTO personalizado <a href="http://machinekit-gmoccapy-lcd7.blogspot.com/2015/07/device-tree-overlay-personalizada-para.html" target="_blank">BBB-LCNC-MF5</a>.<br />
<br />
Nota: Otra opción es hacer que reinicie la Beaglebone Black con el SPI que se necesite, revisar el siguiente link <a href="http://machinekit-gmoccapy-lcd7.blogspot.com/2015/07/device-tree-overlays-con-lcd-de-7.html" target="_blank">DTO LCD7</a>, al final se explica. En futuros tutoriales se explicará como cargar toda la información de los device tree overlays desde una memoria EEPROM para que se configure los GPIO y demás funciones desde el arranque de la BBB.<br />
<br />Vichentehttp://www.blogger.com/profile/13532517773299729858noreply@blogger.com0tag:blogger.com,1999:blog-6209740641626143717.post-52617509644173710832015-12-08T21:31:00.001-08:002015-12-08T22:43:16.229-08:00Gui básica con Glade y Gladevcp integrada a Gmoccapy<br />
Lo primero y bastante importante es saber como funciona la Gui Gmoccapy para lo cuál se debe entender el código de python que contiene todas las instrucciones de funcionamiento y el archivo .glade que integra los componentes de glade y gladevcp con python.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinNTTZGbQcwQJWV8Y7l_-oloHx6utfBTa88QTuwciKKQnYT3zz2jRcsQrQzfetXymtSBMTFAemFO1WeMtDWvB9KSaqhjcqp5Dop-tMSiesEajl9FGqx4HThfqpkRmZpCYSl9hnzpOcmjo/s1600/gmoccapy-custombox.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="286" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinNTTZGbQcwQJWV8Y7l_-oloHx6utfBTa88QTuwciKKQnYT3zz2jRcsQrQzfetXymtSBMTFAemFO1WeMtDWvB9KSaqhjcqp5Dop-tMSiesEajl9FGqx4HThfqpkRmZpCYSl9hnzpOcmjo/s640/gmoccapy-custombox.jpg" width="640" /></a></div>
<br />
Visitar la wiki de gmoccapy para mas información.<br />
<br />
<a href="http://wiki.linuxcnc.org/cgi-bin/wiki.pl?Gmoccapy" target="_blank">http://wiki.linuxcnc.org/cgi-bin/wiki.pl?Gmoccapy</a><br />
<br />
En los lugares marcados con recuadros de diferentes colores se puede agregar Gui's personalizadas.<br />
<br />
- Recuadro color azul es llamado box_left.<br />
<br />
- Recuadro color verde es llamado box_custom_1.<br />
<br />
- Recuadro color rojo es llamado box_custom_2.<br />
<br />
- Recuadro color morada es llamado box_custom_3.<br />
<br />
- Recuadro color naranja es llamado box_custom_4.<br />
<br />
- Recuadro color marrón es llamado box_right.<br />
<br />
Existen otros que se los puede reemplazar como es en el caso de usar gmoccapy plasma.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNdId9VuZpE_CEWdcaBL0bZWmoeSl-nC4GgQIlf0zXt82lu5154dEfC2w9_zhcT4FSl9DWCLmkLczyX75jIsyJZPP-svkQz2-NbtFwogGRHgKVF5LbtziuMWDUIAWTC7rq7G_2XA7vlMo/s1600/gmoccapy-plasma-box.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="148" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNdId9VuZpE_CEWdcaBL0bZWmoeSl-nC4GgQIlf0zXt82lu5154dEfC2w9_zhcT4FSl9DWCLmkLczyX75jIsyJZPP-svkQz2-NbtFwogGRHgKVF5LbtziuMWDUIAWTC7rq7G_2XA7vlMo/s640/gmoccapy-plasma-box.jpg" width="640" /></a></div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTwNrhUkx0Ph0nZWj3VKqJ8Npb8ekXfbDXBRw2iFHeOhzbJ07gX0Rj_Cw3j5YlQf0hvvcVN2cjN0kmHQW8YCh5zgVcfvUH4eV4w88Fn9hKPo7OkZOOBipdMe9NoFOkX4P80YGgRPKPlWw/s1600/gmoccapy-mill.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="130" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTwNrhUkx0Ph0nZWj3VKqJ8Npb8ekXfbDXBRw2iFHeOhzbJ07gX0Rj_Cw3j5YlQf0hvvcVN2cjN0kmHQW8YCh5zgVcfvUH4eV4w88Fn9hKPo7OkZOOBipdMe9NoFOkX4P80YGgRPKPlWw/s640/gmoccapy-mill.jpg" width="640" /></a></div>
<br />
<br />
- Recuadro de color negro box_coolant_and_spindle, contiene a box_cooling y box_spindle.<br />
<br />
- Recuadro de color azul es box_cooling.<br />
<br />
- Recuadro de color naranja es box_spindle.<br />
<br />
- Recuadro de color rojo es box_vel_info.<br />
<br />
Nota: Tool information es reemplazado por Signals y lo que se hace es colocar el archivo glade que se desee reemplazando en frm_tool_info que es una parte de todo el box_tool_and_code_info (Tool information, Gcode y Program).<br />
<br />
Las dos siguientes es para agredar pestañas ya sea en la pantalla donde se visualiza el código G (ntb_preview) o en donde se puede visualizar en modo completo (ntb_user_tabs).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNo025p0b8AmwGhneBEF680mC4zzf9a9mVrNB94BFAFW5cS0q3h4RSyelaOJKZyyTqjTdXyeJHBO04m9Pcdf-ReTcAO7uIwe1-YeOQsCQzk-t1YUPQxjBNFYd5aH-ZWJP-UzvDdUpcmEA/s1600/gmoccapy-preview-tabs.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="504" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNo025p0b8AmwGhneBEF680mC4zzf9a9mVrNB94BFAFW5cS0q3h4RSyelaOJKZyyTqjTdXyeJHBO04m9Pcdf-ReTcAO7uIwe1-YeOQsCQzk-t1YUPQxjBNFYd5aH-ZWJP-UzvDdUpcmEA/s640/gmoccapy-preview-tabs.jpg" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidiPMimbsCfs_bFRzNonlZ8mBwERtv7RjB5ns9p4_hyphenhyphen1FbLL-cIm8C1ajltxbp6iEluFgxAwbhus9CZ7rXQvbi9Qxci84Hi6fsrJai689XyenNUTd7jIHvF-2MFzCmRJgLb5j58ikXjUc/s1600/gmoccapy-user-tabs.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="508" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidiPMimbsCfs_bFRzNonlZ8mBwERtv7RjB5ns9p4_hyphenhyphen1FbLL-cIm8C1ajltxbp6iEluFgxAwbhus9CZ7rXQvbi9Qxci84Hi6fsrJai689XyenNUTd7jIHvF-2MFzCmRJgLb5j58ikXjUc/s640/gmoccapy-user-tabs.jpg" width="640" /></a></div>
<br />
<br />
Nota: Para poder entender de mejor manera se recomienda ver la configuración de los archivos .ini de gmoccapy. <br />
<br />
<br />
La interfáz que se creará es para poder leer la temperatura de una impresora 3D reemplazando esta Gui con la antigua 3D.Temps.panel.xml (pyvcp) usada en la Interfáz gráfica de Axis en CRAMPS.<br />
<br />
Correr Glade (<a href="http://machinekit-gmoccapy-lcd7.blogspot.com/2015/12/instalacion-de-glade-y-gladevcp-en.html" target="_blank">Instalación</a>)<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">glade-3</pre>
<br />
Primero se guardará con el nombre ReadTemp.glade y se irá guardando constantemente para evitar perdidas del trabajo si se cerrara glade.<br />
<br />
- Crear Ventana<br />
- Agregar Frame<br />
- Agregar Vertical Box ->6<br />
- Agregar Horizontal Box -> 2 saltando un Vertical Box<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLgJpt-FjvR-1l21k6poi7U98T06PftBf2NnWirjjkr91rkwivpJAcUlSwYVXgVGoRrukKP5b3zoi54FAs3UYGcclzj_EAKC1FtXmaXMGf96EJJjO2Kc0TYXB9qkjRDMe_vzcSgP4VJ-w/s1600/ReadTemp-glade-1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="288" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLgJpt-FjvR-1l21k6poi7U98T06PftBf2NnWirjjkr91rkwivpJAcUlSwYVXgVGoRrukKP5b3zoi54FAs3UYGcclzj_EAKC1FtXmaXMGf96EJJjO2Kc0TYXB9qkjRDMe_vzcSgP4VJ-w/s640/ReadTemp-glade-1.jpg" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_VHNTUUh7LZFp6uyafsKdM6SoCs7WdeKjaPIb7wO9bCmqrpMqaKH6KOQ3sFypQzb1qtee6qnlQoV3aGNzWKXzexlZRs_oY070xLatbvH33fVuN1T7y1ZPgr6Zlkwh-7tyjwVtZ0TDw00/s1600/ReadTemp-glade-1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br /></a></div>
<br />
- Agregar Label en la parte izquiera de los Horizontal Box creados y HAL Label en la parte derecha de los Horizontal Box creados.<br />
<br />
- Agregar HAL Hbar -> 3 en los Vertical Box restantes.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYJEzXt0bCNUAIlNJMitQt-vyvKjHA1xv7CNXsR8ATUzU53ms0docNuASdkM_iWHp3MvRCWMGkprPo7_6JCyKMlA9392P4sw_hdnXI2NuTAUhFzoA5b06cukyopzJHJ2QdhKozH5oFaww/s1600/ReadTemp-glade-2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="296" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYJEzXt0bCNUAIlNJMitQt-vyvKjHA1xv7CNXsR8ATUzU53ms0docNuASdkM_iWHp3MvRCWMGkprPo7_6JCyKMlA9392P4sw_hdnXI2NuTAUhFzoA5b06cukyopzJHJ2QdhKozH5oFaww/s640/ReadTemp-glade-2.jpg" width="640" /></a></div>
<br />
<br />
Terminado esto se procede a configurar los componentes agregados.<br />
<br />
- En window1 no se modificará nada.<br />
- En frame1 se modificará el nombre y la alineación de la etiqueta para centarla.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrguTP0u8vMngpGnqbx-sheKBAuhuVkjCjB4YMU_EjqxqFX4LpoMPl2_3bWpKNchRa6skqGKLO9gMFTBz2-ttCfVWgYLvdLTSKbGLVDRRD6ttfyloJDjcJOgSWBd6NNPPWKgn38PY47qg/s1600/ReadTemp-glade-3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrguTP0u8vMngpGnqbx-sheKBAuhuVkjCjB4YMU_EjqxqFX4LpoMPl2_3bWpKNchRa6skqGKLO9gMFTBz2-ttCfVWgYLvdLTSKbGLVDRRD6ttfyloJDjcJOgSWBd6NNPPWKgn38PY47qg/s640/ReadTemp-glade-3.jpg" width="507" /></a></div>
<br />
<br />
- En la etiqueta de Frame 1 se renombrará el componente y asignará el título que va a aparecer<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPliKVt-_gne98Vxqj4wTkUmegths6-gloTA6Na3ViEphSi-1xUhRK51kWQJ1Bq04xd5SyKhaFjibeuWUnJ6ZWZkOhqrpb0heAdUB3PAtpc9_Ir8KVsyu45O5XcfE2IVZ42edOsytqObE/s1600/ReadTemp-glade-4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPliKVt-_gne98Vxqj4wTkUmegths6-gloTA6Na3ViEphSi-1xUhRK51kWQJ1Bq04xd5SyKhaFjibeuWUnJ6ZWZkOhqrpb0heAdUB3PAtpc9_Ir8KVsyu45O5XcfE2IVZ42edOsytqObE/s640/ReadTemp-glade-4.jpg" width="354" /></a></div>
<br />
<br />
En la alineación del Frame se cambiarán unos parámetros para dar mejor presentación.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfpo6zuSDNllMSxSEAXK9HjKda6y-gORffAdZe6itIAJUTGQnGl2HJwTPDzEC0bG5L29diAYbpJ9d0FaXSVVylav6zIq9JkZvCq8aW0-c_5WrKr_PsU_ldsvl48AiO6M5XEknKOIAJA8I/s1600/ReadTemp-glade-5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfpo6zuSDNllMSxSEAXK9HjKda6y-gORffAdZe6itIAJUTGQnGl2HJwTPDzEC0bG5L29diAYbpJ9d0FaXSVVylav6zIq9JkZvCq8aW0-c_5WrKr_PsU_ldsvl48AiO6M5XEknKOIAJA8I/s640/ReadTemp-glade-5.jpg" width="510" /></a></div>
<br />
<br />
<br />
Con esto quedará de la siguiente forma:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfntyAw3EENFDb4QDOGIfgTHshXAKGkCBl4Qx7xOTZOwBuccUOwGeNC0bddeK591dh9yEduGNwWw-CD1lwbX9w1zktzTmyGcY2EHbLL5o75bD9Im6jxNLxdZOb3jDoiU4uw9aLaF9ldr0/s1600/ReadTemp-glade-6.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="231" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfntyAw3EENFDb4QDOGIfgTHshXAKGkCBl4Qx7xOTZOwBuccUOwGeNC0bddeK591dh9yEduGNwWw-CD1lwbX9w1zktzTmyGcY2EHbLL5o75bD9Im6jxNLxdZOb3jDoiU4uw9aLaF9ldr0/s400/ReadTemp-glade-6.jpg" width="400" /></a></div>
<br />
<br />
En mi caso acostumbro a renombrar todos los nombres de los componentes.<br />
<br />
- vbox1 -> ReadTemp_vbx<br />
- hbox1 -> Extruder_lbl_hbx<br />
- hbox2 -> Bed_lbl_hbx<br />
- hbox3 -> Extruder2_lbl_hbx<br />
<br />
Los nombres pueden ser cualquiera los uso asi porque lbl representa a label; y vbx o hbx a vertical box y horizontal box. Lo demás es para darse cuenta que ese hbox pertenece a extruder o bed, etc.<br />
<br />
Ahora viene la parte más importante y es la de dar nombre correcto a los componentes Hal Label y HAL_Hbar que se van a usar con el archivo .hal de <a href="https://github.com/machinekit/machinekit/blob/master/configs/ARM/BeagleBone/CRAMPS/CRAMPS.hal" target="_blank">CRAMPS.hal</a>, los nombres pueden ser cuailquiera pero luego se los debe conectar con el archivo .hal.<br />
<br />
- hal_hbar1 -> E0_Temp<br />
- hal_hbar2 -> Bed_Temp<br />
- hal_hbar3 -> E1_Temp<br />
<br />
Lo mismo se realiza con las etiquetas, al final quedá de la siguiente forma.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7VhL4MxOvaiatzyrT2DlXAwtoFdeApkToHj43BkaqpeiM_H3XfPJYJ4SBFKr0Ft6ZLi6dPBCaqxpBF2YmwPiURLJOuLf9XYTZ4XvzX0A2dQ0EpLruLZY8R8GG24wFHW3TPghyphenhyphenggYVr4E/s1600/ReadTemp-glade-7.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="504" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7VhL4MxOvaiatzyrT2DlXAwtoFdeApkToHj43BkaqpeiM_H3XfPJYJ4SBFKr0Ft6ZLi6dPBCaqxpBF2YmwPiURLJOuLf9XYTZ4XvzX0A2dQ0EpLruLZY8R8GG24wFHW3TPghyphenhyphenggYVr4E/s640/ReadTemp-glade-7.jpg" width="640" /></a></div>
<br />
El último paso es configurar las etiquetas y las barras horizontales que darán la lectura de temperatura.<br />
<br />
Para las etiquetas deshabilitar expand y darles un título. Para los Horizontal box tambien deshabiltar el expand.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh67MTLI1nM7jl3h21iIH9RPIVuf31Zj8guwnE-Dmr_aoeOEExEO2n2pXMvLwjm9BtAEsILl77DMHRZnuUFMVcg1YZNWyWC90jRsTZ364XHsqkLzwiwfj7O4LDmNZcg2rBwBM-AJQQhZyI/s1600/ReadTemp-glade-8.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh67MTLI1nM7jl3h21iIH9RPIVuf31Zj8guwnE-Dmr_aoeOEExEO2n2pXMvLwjm9BtAEsILl77DMHRZnuUFMVcg1YZNWyWC90jRsTZ364XHsqkLzwiwfj7O4LDmNZcg2rBwBM-AJQQhZyI/s640/ReadTemp-glade-8.jpg" width="640" /></a></div>
<br />
<br />
Para las etiquetas Hal se dará un formato de Hal pin type: 1 en la parte de configuración. Se lo realiza para que pueda recibir datos flotantes.<br />
<br />
Para las barras horizontales también deshabilitar Expand, forzar la altura, ancho y cambiar la escala.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdYN18FpuE2du4VnvskmHVN52dyz34mj3vLlBFwp5WK6qa8iXpntKjdSzElNFFj2Sy8PYJ9iKmUjGCY1YrwlwT1zhloOtlNib-WVRZn6x-bxgX4-pciT25dGVxud_vI_RQ0pv6NZ22wwA/s1600/ReadTemp-glade-9.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdYN18FpuE2du4VnvskmHVN52dyz34mj3vLlBFwp5WK6qa8iXpntKjdSzElNFFj2Sy8PYJ9iKmUjGCY1YrwlwT1zhloOtlNib-WVRZn6x-bxgX4-pciT25dGVxud_vI_RQ0pv6NZ22wwA/s400/ReadTemp-glade-9.jpg" width="320" /></a></div>
<br />
<br />
Terminado todo el diseño quedará algo así:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1r_lKSBG5AsXSr1MDbpN1q2QX6Zbpn8YZRmVeWDbatYZuzisUXmET_UjzPdBpl8Y4JsnBnX8vm4qV_NezGlT2-lh0Y_m7ZSmBHxztc2tcYIYADbFahfvJe_vVHosyLB63VRo_Tvb6udk/s1600/ReadTemp-glade-10.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="231" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1r_lKSBG5AsXSr1MDbpN1q2QX6Zbpn8YZRmVeWDbatYZuzisUXmET_UjzPdBpl8Y4JsnBnX8vm4qV_NezGlT2-lh0Y_m7ZSmBHxztc2tcYIYADbFahfvJe_vVHosyLB63VRo_Tvb6udk/s400/ReadTemp-glade-10.jpg" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFyleK6A6DLC6wy3RGxCMSDBqHuJdJl-hWRCwA6wpHFFCBRa0gdLi0oGE9ESq7p-_L8lVZOjALRLJrqtcQo4Zo9dskPmWFIBkZ5OwZFWNOu68KWVS6m3S8H5FSBvRjVu8xbwNuZBLPge0/s1600/ReadTemp-glade-10.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br /></a></div>
<br />
No hay que preocuparse que al ejecutar el archivo glade con gladevcp se verá que la venta se rescala al tamaño máximo configurado en el ancho y alto de las barras horizontales. Intentar cambiar los valores de ancho y alto para que se note la diferencia (force height, force width). Guardar.<br />
<br />
Ejecutando gladevcp mostrado en el <a href="http://machinekit-gmoccapy-lcd7.blogspot.com/2015/12/instalacion-de-glade-y-gladevcp-en.html" target="_blank">anterior tutorial</a> se obtiene.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxp5XnwRDW_t5GRPdv6Cq5A3i4IR29QtvJofesP43re5WATG8sacSKV84bk-T268Jxn0qoZatJ2tv2alpjxxcD2jFF2KYXQ3dozRfDjw7O9Tv1x7YUP4Ev6L-7-Hf9HvHpuzJL5pBqNCs/s1600/ReadTemp-glade-11.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxp5XnwRDW_t5GRPdv6Cq5A3i4IR29QtvJofesP43re5WATG8sacSKV84bk-T268Jxn0qoZatJ2tv2alpjxxcD2jFF2KYXQ3dozRfDjw7O9Tv1x7YUP4Ev6L-7-Hf9HvHpuzJL5pBqNCs/s1600/ReadTemp-glade-11.jpg" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
Donde se puede apreciar que se ha dimensionado la ventana al tamaño asignado por las barras horizontales.<br />
<br />
Creando el archivo .hal para poder vincular los componentes de gladevcp con las señales de machinekit (linuxcnc).<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"># Include your customized HAL commands here
# Run on Gmoccapy with gladevcp panel
net e0.temp.set => ReadTemp.Extruder_Hal_lbl
net e0.temp.meas => ReadTemp.E0_Temp
net bed.temp.set => ReadTemp.Bed_Hal_lbl
net bed.temp.meas => ReadTemp.Bed_Temp</pre>
<br />
guardar con cualquier nombre ejemplo 3D.postgui.hal<br />
<br />
<br />
Si se mira el archivo.hal de CRAMPS se crean las señales e0.temp.set, e0.temp.meas donde el primero da el valor que se esta usando de PID y el segundo indica el valor que el ADC esta leyendo. Lo mismo para las demás señales.<br />
<br />
Cuando se haya añadido el archivo .hal creado al archivo .ini de la CRAMPS se podrá ejecutar el archivo glade integrado en este caso a la GUI gmoccapy_lcd7 modificada por mi para pantallas lcd de 7 pulgadas con resolución de 800x480. <a href="https://github.com/vichente1/gmoccapy_lcd7" target="_blank">gmoccapy_lcd7</a>. <br />
<br />
<br />
En el archivo .ini de CRAMPS se cambiaría lo siguiente:<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">[DISPLAY]
# Name of display program, e.g., tkemc
#DISPLAY = tkemc
#DISPLAY = gscreen
#DISPLAY = axis
DISPLAY = gmoccapy_lcd7
EMBED_TAB_NAME = right_side_panel
EMBED_TAB_LOCATION = box_right
EMBED_TAB_COMMAND = gladevcp -x {XID} ReadTemp.glade</pre>
<br />
Se añade el archivo glade creado al box_right de gmoccapy explicado en la parte superior y anteriores tutoriales.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">[HAL]
# The run script first uses halcmd to execute any HALFILE
# files, and then to execute any individual HALCMD commands.
# list of hal config files to run through halcmd
# files are executed in the order in which they appear
HALFILE = CRAMPS.hal
# list of halcmd commands to execute
# commands are executed in the order in which they appear
#HALCMD = save neta
POSTGUI_HALFILE = 3D.postgui.hal</pre>
<br />
En este caso el archivo anterior donde se unen las señales hal con glade se lo llamo de la misma forma que el designado en CRAMPS. se debe agregar el archivo .hal y .glade en la misma carpeta donde se encuentran los otros archivos de CRAMPS en la beaglebone black.<br />
<br />
El resultado es el siguiente:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiF_Q7Z3MVKuRkkNFa17boUUD9YzobpNazx2KcemyQSmvqjU10yU4UzpqdoOS9otXVY0mCxDECB5hJKHItUqqFpnsUcY9pBHe95F4mlKr0fUWIM7zZ_a3st2PRCV3U8BXwUkH9tnWUbwQ/s1600/ReadTemp-glade-12.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="506" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiF_Q7Z3MVKuRkkNFa17boUUD9YzobpNazx2KcemyQSmvqjU10yU4UzpqdoOS9otXVY0mCxDECB5hJKHItUqqFpnsUcY9pBHe95F4mlKr0fUWIM7zZ_a3st2PRCV3U8BXwUkH9tnWUbwQ/s640/ReadTemp-glade-12.jpg" width="640" /></a></div>
<br />
Gmoccapy_lcd7 se ha modificado para que presente el archivo glade que captura box_right, solo cuando se realizá un full screen, ya que al ser menor la resolución se distorciona los iconos si se abriera con el panel principal mas el archivo glade.<br />
<br />
Sin la opción de pantalla completa de gmoccapy desaparece el cuadro de lectura de temperatura para que no ocurra lo anteriormente explicado.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgj5G-sumMs46wzFwgbRzx_-tfh3SNkuVv9nYTod_KY1lpB0vomSpdu1iES3srurez3CjamCRPaLrYkug7EkUUCjdyPZCUzMm-aaGSHHa3rigw1bt3Czb_v8NMTrubS5ydcjDYPqM3qNKU/s1600/ReadTemp-glade-13.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="502" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgj5G-sumMs46wzFwgbRzx_-tfh3SNkuVv9nYTod_KY1lpB0vomSpdu1iES3srurez3CjamCRPaLrYkug7EkUUCjdyPZCUzMm-aaGSHHa3rigw1bt3Czb_v8NMTrubS5ydcjDYPqM3qNKU/s640/ReadTemp-glade-13.jpg" width="640" /></a></div>
<br />
<br />
Si se quiere utilizar la configuración CRAMPS hay que deshabilitar el audio del hdmi en /boo/uEnv.txt.<br />
<br />
<br />
Si se desea comprobar las aplicaciones en la computadora donde se esta diseñando solo es necesario ir a la carpeta de gmoccapy donde se guardan las configuraciones de gmoccpay y agregar el diseño dentro de la misma carpeta. No olvidarse de correr el scripts de linuxcnc si se copia a la carpeta de configuración de linuxcnc, caso contrario que e use Machinekit correr con machinekit y copiar a la carpeta de configuración de machinekit donde se encuentre gmoccapy.<br />
<br />
Resultados con gmoccapy modificando en mi caso está en ~/linuxcnc-mirror/configs/sim/gmoccapy/gmoccapy.ini.<br />
<br />
Esta es la ruta donde se deben guardar los archivos .glade o python u otros, tambien se puede crear un carpeta en ~/linuxcnc-mirror/configs/ y guardar ahi los archivos con los que querramos explorar. En este ejemplo no se usa el archivo .hal ya que no hay lectura ADC como en el caso de la Beaglebone Black que esta configurado en el archivo .CRAMPS con un archivo python. Este es solo de simulación para poder ver como esta quedando el diseño de glade con gmoccapy; en el caso de querer usar gmoccapy_lcd7 en el PC, descargar de github y copiar a las carpetas bin, share de la ruta ~/linuxcnc-mirror los archivos correspondientes. Utilizar en display gmoccapy_lcd7.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">[DISPLAY]
DISPLAY = gmoccapy
EMBED_TAB_NAME = right_side_panel
EMBED_TAB_LOCATION = box_right
EMBED_TAB_COMMAND = gladevcp -x {XID} ReadTemp.glade</pre>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOnXSPaE0-a-_CVhIHHQKG9qWTrZvDrFjwXcN2CvxFC2lTA-NZDFG7s4ZS77J6-yvsCS1xXqnlRUjfB58f83YekFbxBmUfdLNcrAFaKaRLFASg-oyKQJI5BkAnshHQczB-RK9B77LpmiE/s1600/ReadTemp-glade-14.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="504" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOnXSPaE0-a-_CVhIHHQKG9qWTrZvDrFjwXcN2CvxFC2lTA-NZDFG7s4ZS77J6-yvsCS1xXqnlRUjfB58f83YekFbxBmUfdLNcrAFaKaRLFASg-oyKQJI5BkAnshHQczB-RK9B77LpmiE/s640/ReadTemp-glade-14.jpg" width="640" /></a></div>
<br />
Como se ve no hay cambios al estar sin full screen y con full screen se mantiene la ventana de box_right. No mide la temperatura al solo usar el archivo .glade.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUtxrnu786t249zrNsnU7gk5Rlff1T56RuFFArqNuax81x5a0oTbgJztC0AWaD6OwLhJwDLlQQuZWiNO0TUPtmAiPo5JX7t2ffGY7yh4IOebiNbYgi1-TXjqU-Dqz9LTwbSIy23TRr8YE/s1600/ReadTemp-glade-15.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="504" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUtxrnu786t249zrNsnU7gk5Rlff1T56RuFFArqNuax81x5a0oTbgJztC0AWaD6OwLhJwDLlQQuZWiNO0TUPtmAiPo5JX7t2ffGY7yh4IOebiNbYgi1-TXjqU-Dqz9LTwbSIy23TRr8YE/s640/ReadTemp-glade-15.jpg" width="640" /></a></div>
<br />
Para obtener el archivo glade en una ventana separada se escribe lo siguiente.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">[DISPLAY]
DISPLAY = gmoccapy
EMBED_TAB_NAME = right_side_panel
EMBED_TAB_LOCATION = box_right
EMBED_TAB_COMMAND = gladevcp -g 64x697+0+0 ReadTemp.glade</pre>
<br />
Donde se define anchoxaltura+desplazamiento X+desplaamiento Y<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2kH7cC4wyfdu9pIW7bpsMaQwbQ6gv9sc9cre3vqSEQADo_u5EJbDz9yctrLQpvD6sJr2SxLZ0SkjZu1xLrRApEpanIhZzP0vKYrEM5MC1tZMbJsN3cnesk3IsvJsh2Ui1nUMtIrCuaMk/s1600/ReadTemp-glade-17.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="502" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2kH7cC4wyfdu9pIW7bpsMaQwbQ6gv9sc9cre3vqSEQADo_u5EJbDz9yctrLQpvD6sJr2SxLZ0SkjZu1xLrRApEpanIhZzP0vKYrEM5MC1tZMbJsN3cnesk3IsvJsh2Ui1nUMtIrCuaMk/s640/ReadTemp-glade-17.jpg" width="640" /></a></div>
<br />
<br />
Utilizando gmoccapy_lcd7 en PC.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"><span class="pl-c1">cd</span> gmoccapy_lcd7/
cp bin/gmoccapy_lcd7 ~/linuxcnc-mirror/bin/
chmod a+x ~/linuxcnc-mirror/bin/gmoccapy_lcd7
cp -r share/gmoccapy_lcd7/ ~/linuxcnc-mirror/share/
sudo apt-get update
sudo apt-get install matchbox
sudo cp keyboard-cnc.xml /usr/share/matchbox-keyboard
sudo chmod a+x /usr/share/matchbox-keyboard/keyboard-cnc.xml</pre>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4-_Qsw0dBpLj3N5sYed-8NIDDemftIFFREGSGnz4Xnhgqv7FjyqHtBaJIiLisayINK9jj3YZIZm5hozfBAbBcox-AFd8QWQ4TqCH57KKkOL5pvNw7asnNd5GZHqLA0ioZyv0ljZp-JB8/s1600/ReadTemp-glade-16.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="486" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4-_Qsw0dBpLj3N5sYed-8NIDDemftIFFREGSGnz4Xnhgqv7FjyqHtBaJIiLisayINK9jj3YZIZm5hozfBAbBcox-AFd8QWQ4TqCH57KKkOL5pvNw7asnNd5GZHqLA0ioZyv0ljZp-JB8/s640/ReadTemp-glade-16.jpg" width="640" /></a></div>
<br />
Se obtiene los mismo resultados que el anterior, con esto ya se puede comenzar a ver cuales son los cambios que e han hecho de la gmoccapy, tento en el archivo .glade como python (gmoccapy_lcd7 y gmoccapy en bin).<br />
<br />
En este link <a href="https://drive.google.com/file/d/0B6xWQnSH6ge5U25ld05VdVlwbE0/view?usp=sharing" target="_blank">ARM.BeagleBone.CRAMPS.tar.xz</a> se podrá descargar la carpeta CRAMPS que contiene todos los archivos incluido ReadTemp.glade creado en este tutorial.<br />
<br />
<br />Vichentehttp://www.blogger.com/profile/13532517773299729858noreply@blogger.com0tag:blogger.com,1999:blog-6209740641626143717.post-31797938875855392992015-12-07T13:58:00.000-08:002015-12-07T14:45:04.786-08:00Instalación de Glade y Gladevcp en Debian (Jessie).<br />
Se debe instalar machinekit para poder ocupar gladevcp con Glade.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">sudo sh -c \
"echo 'deb http://deb.dovetail-automata.com jessie main' > \
/etc/apt/sources.list.d/machinekit.list"</pre>
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">sudo apt-get update
sudo apt-get install dovetail-automata-keyring
sudo apt-get update</pre>
<br />
<br />
En este caso se instalara machinekit como simulador.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">sudo apt-get install machinekit-posix</pre>
<br />
El siguiente paso será instalar Glade con soporte de librerías Gtk2. Ya que el nuevo Glade usa Gtk3, el cuál no es compatible con los componentes de gladevcp usados para interacturar con los componentes HAL de linuxcnc.<br />
<br />
El código de glade se lo puede descargar del siguiente link <a href="http://ftp.gnome.org/pub/GNOME/sources/glade3/3.8/" target="_blank">Glade</a><br />
<br />
Se utilizará el último disponible -> glade3-3.8.5.tar.xz<br />
<br />
Al terminar la descarga se lo descomprime con el comando tar.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">tar -xvf glade3-3.8.5.tar.xz</pre>
<br />
Antes de compilar el programa se debe instalar algunas librerías necesarias para correr glade junto con el parche de gladevcp.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">sudo apt-get install gnome-common devhelp libglade2-dev libgtk2.0-dev python-gtk2-dev \
gnome-doc-utils gtk-doc-tools</pre>
<br />
Compilación e instalación<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">./autogen.sh
./configure
make -j`nproc`
sudo make install
sudo ldconfig</pre>
<br />
Incluir archivos de gladevcp en glade.<br />
<br />
Descargar del siguiente link <a href="https://drive.google.com/file/d/0B6xWQnSH6ge5U2xoTDRnQVFNS0U/view" target="_blank">glade3</a><br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">tar -xvf glade3.tar.xz
#copiar carpeta glade3 a /usr/local/share para obtener componentes de gladevcp
sudo cp -R glade3 /usr/local/share/</pre>
<br />
Al finalizar se ejecuta glade<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">glade-3</pre>
<br />
Si todo se realizó de forma correcta debe aparecer lo siguiente en la parte inferior izquierda de glade.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoACwag5sB-H96RB6VNo2bGgeoiA0AyNdDJ1maGg7DqQh_NP9WuuEc_fJxl1JrLK48748hCfpbkwLLPuJUD7xwHnYXeJEgy2p3O6vTVO6sFV7mmPLXyUB74HNidP_5qHXlznmXDwDxBWk/s1600/gladevcp-components.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoACwag5sB-H96RB6VNo2bGgeoiA0AyNdDJ1maGg7DqQh_NP9WuuEc_fJxl1JrLK48748hCfpbkwLLPuJUD7xwHnYXeJEgy2p3O6vTVO6sFV7mmPLXyUB74HNidP_5qHXlznmXDwDxBWk/s400/gladevcp-components.jpg" width="148" /></a></div>
<br />
<br />
Ya se puede crear Gui's. Pero existe un pequeño problema con machinekit que impide ejecutar las aplicaciones usando el comando de gladevcp por lo que se realizará una compilación del código de linuxcnc para poder comprobar las Gui's que se haya creado con glade.<br />
<br />
Librerías necesarias para poder compilar LinuxCNC.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">sudo apt-get install libpth-dev dvipng tcl-dev tk-dev tcl8.5-dev tk8.5-dev bwidget libxaw7-dev \
libncurses5-dev libreadline-dev asciidoc source-highlight dblatex groff python-dev python-tk \
python-lxml libglu1-mesa-dev libgl1-mesa-swx11-dev libgtk2.0-dev autoconf libboost-python-dev \
texlive-lang-cyrillic texlive-lang-french texlive-lang-german texlive-lang-spanish texlive-lang-polish \
libmodbus-dev python-support libudev-dev libusb-1.0-0-dev</pre>
<br />
Librería necesaria para solucionar problema de audio en gmoccapy.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">sudo apt-get install gstreamer0.10-plugins-base</pre>
<br />
Obtener código de LinuxCNC.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">cd
git clone https://github.com/jepler/linuxcnc-mirror.git
cd linuxcnc-mirror/src
./autogen.sh
#Para ver opciones de configuración ./configure --help
./configure --enable-simulator
make -j`nproc`
sudo make setuid</pre>
<br />
Al ejecutar el script que habilita el uso de linuxcnc ya se podrá comenzar a probar los programas con el gladevcp de linuxcnc.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">cd linuxcnc-mirror
. ./scripts/rip-environment
linuxcnc</pre>
<br />
Para probar los archivos con gladevcp no hay que cerrar el terminal que ejecutó el script de linuxcnc, ya que en este se ejecutará todo lo que se necesite usar de linuxcnc, una vez cerrado el terminal hay que volver a realizar el paso anterior para habilitar linuxcnc.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">#Probando archivos de gladevcp
cd ~/linuxcnc-mirror/configs/apps/gladevcp
gladevcp gladevcp-test.ui</pre>
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMdv9tnxd3XqcKiEruCF520aL1BB5swcJ8dgjTpjpFbyuI0mDxM7r9M_FAb98HhWKMDFzVazRWrJYwcV5JITJXhQVrNz-lNbk4PQ13NqlHc6BVwh-d3BR4OXoS15htDlfQGsCIWMWnL7k/s1600/gladevcp-test.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMdv9tnxd3XqcKiEruCF520aL1BB5swcJ8dgjTpjpFbyuI0mDxM7r9M_FAb98HhWKMDFzVazRWrJYwcV5JITJXhQVrNz-lNbk4PQ13NqlHc6BVwh-d3BR4OXoS15htDlfQGsCIWMWnL7k/s640/gladevcp-test.jpg" width="640" /></a></div>
<br />
<br />
<br />Vichentehttp://www.blogger.com/profile/13532517773299729858noreply@blogger.com1tag:blogger.com,1999:blog-6209740641626143717.post-62608677283451752902015-09-10T05:06:00.001-07:002015-12-05T14:43:39.675-08:00Instalación machinekit con kernel xenomai en PCLinuxCNC se puede instalar en Debian y Ubuntu pero Machinekit solo se puede instalar en Debian Wheezy. Yo he logrado instalar LinuxCNC en Ubuntu 12.04 LTS (Precise) pero solo sirve en Sistemas Linux con arquitectura x86 (i686).<br />
<br />
La ventaja que se tiene de instalar LinuxCNC en Ubuntu es que en este sistema la versión de glade-gtk2 (Glade 3.8) es estable y no tiene los bugs que se presentan en Glade con Debian, estos bugs se pueden corregir con algunos trucos que se explicarán en un tutorial donde inidique como crear GUI's.<br />
Para instalar LinuxCNC en Ubuntu hay que instalar el kernel RTAI agregando los siguientes <a href="http://buildbot.linuxcnc.org/" target="_blank">repositorios</a>.<br />
<br />
<b>Ubuntu 12.04 LTS (Precise)</b><br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">sudo nano /etc/apt/sources.list
deb http://buildbot.linuxcnc.org/ precise master-rt
deb-src http://buildbot.linuxcnc.org/ precise master-rt
sudo apt-get update
sudo apt-get install linuxcnc</pre>
<br />
Para simulación<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">sudo nano /etc/apt/sources.list
deb http://buildbot.linuxcnc.org/ precise master-sim
deb-src http://buildbot.linuxcnc.org/ precise master-sim
sudo apt-get update
sudo apt-get install linuxcnc-sim</pre>
<br />
Para seleccionar kernel con el que se quiere iniciar, instalar lo siguiente:<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">sudo add-apt-repository ppa:danielrichter2007/grub-customizer
sudo apt-get update
sudo apt-get install grub-customizer
grub-customizer &</pre>
<br />
Por último instalar Glade 3.8.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">sudo apt-get install glade-gtk2</pre>
<br />
Para realizar modificaciones en linuxcnc, recomiendo clonar de este repositorio <a href="http://wiki.linuxcnc.org/cgi-bin/wiki.pl?Build_A_Simulator_Manually" target="_blank">link</a>:<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">sudo apt-get install git
sudo apt-get install dpkg-dev
mkdir linuxcnc-dev
cd linuxcnc-dev
git clone git://git.linuxcnc.org/git/linuxcnc.git linuxcnc
cd linuxcnc/debian
./configure sim
cd ..
dpkg-checkbuilddeps
sudo apt-get install libpth-dev dvipng tcl-dev tk-dev tcl8.4-dev tk8.4-dev \
bwidget libxaw7-dev libncurses-dev libreadline-dev asciidoc source-highlight \
dblatex groff python-dev python-tk python-lxml libglu1-mesa-dev libgl1-mesa-swx11-dev \
libgtk2.0-dev libgnomeprintui2.2-dev autoconf libboost-python-dev texlive-lang-cyrillic \
texlive-lang-french texlive-lang-german texlive-lang-spanish texlive-lang-polish \
libmodbus-dev python-support libudev-dev libusb-1.0-0-dev
sudo apt-get install tclx
sudo apt-get purge tcl8.4-dev tk8.4-dev
cd src
./autogen.sh
./configure --with-realtime=uspace
make
cd ..
. ./scripts/rip-environment
linuxcnc
#opcional para ejecutar directamente linuxcnc desde /scripts/rip-environment en la terminal
#crear respaldo de .bashrc
cd
cp .bashrc .bashrc.bk</pre>
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">sh -c "echo 'if [ -f ~/linuxcnc-dev/linuxcnc/scripts/rip-environment ]; then\n\
source ~/linuxcnc-dev/linuxcnc/scripts/rip-environment\n\
echo \"Environment set up for running LinuxCNC-dev\"\n\
fi\n' >> ~/.bashrc"</pre>
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">linuxcnc</pre>
<br />
A continuación se va explicar como instalar Machinekit en el Sistema Debian Wheezy que se encuentra en la sección de descargas de <a href="http://www.linuxcnc.org/index.php/english/download" target="_blank">LinuxCNC</a>. Este se va instalar en modo simulador por usarse en una máquina virtual (VMware Workstation) y servirá para poder crear interfáz gráficas que se integrarán a la GUI gmoccapy_lcd7, utilizando glade con las librerías gtk2.<br />
<br />
Para poder usar todas las funciones de VMware se necesita instalar "VMware Tools Installation" que se encuentra en la pestaña VM.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimmXVh2E5vLvrbuqojrVCUc9lJ1uE0krBujQVbeONhOqDAGpLiB1tezhp_rkQBRVckS5nl8OLcZuM1ahgz65VCmVf9HKkduDFaVQOv_VxHm1OCgz-6Q2GpTowjtspIOD91dIBYdIsxiZE/s1600/VMware+Tools+Installation.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="404" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimmXVh2E5vLvrbuqojrVCUc9lJ1uE0krBujQVbeONhOqDAGpLiB1tezhp_rkQBRVckS5nl8OLcZuM1ahgz65VCmVf9HKkduDFaVQOv_VxHm1OCgz-6Q2GpTowjtspIOD91dIBYdIsxiZE/s640/VMware+Tools+Installation.jpg" width="640" /></a></div>
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">cd /media/cdrom0
sudo cp VMwareTools-10.0.0-2977863.tar.gz ~/Documents/
cd ~/Documents/
tar -xvf VMwareTools-10.0.0-2977863.tar.gz
cd vmware-tools-distrib/
sudo ./vmware-install.pl
sudo reboot</pre>
<br />
Escribir yes y luego seguir los pasos que van saliendo cuando diga [yes] poner yes y cuando diga [no] poner no, cuando no salga nada darle a la tecla Enter. Con eso ya se puede copiar archivos entre el sistema primario y la máquina virtual, se expande la ventana de la máquina para acomadarse al tamaño de la pantalla, se puede compartir archivos entre sistemas y muchos más.<br />
<br />
Ahora hay que instalar el kernel que se va a usar para Machinekit y realizar los pasos que se encuentran en la página oficial <a href="http://www.machinekit.io/" target="_blank">Machinekit</a> en Documentation -> <a href="http://www.machinekit.io/docs/packages-debian/" target="_blank">Debian packages</a> y <a href="http://www.machinekit.io/docs/building-from-source/" target="_blank">Building From Source.</a><br />
<br />
Primero hay que configurar los repositorios para poder instalar todas las librerías que necesita Machinekit.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"><code>sudo sh -c \
"echo 'deb http://deb.dovetail-automata.com wheezy main' > \
/etc/apt/sources.list.d/machinekit.list; \
apt-get update ; \
apt-get install dovetail-automata-keyring"</code></pre>
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"><code><code>sudo apt-get update</code> </code></pre>
<br />
Luego hay que instalar el kernel que se desee, en este caso se usara el kernel Xenomai para 32 bits.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"><code>sudo apt-get install linux-image-xenomai.x86-686-pae</code></pre>
<br />
Lo siguiente es instalar algunos paquetes necesarios para poder configurar y correr Machinekit.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"><code>sudo apt-get install libczmq-dev python-zmq libjansson-dev \
libwebsockets-dev libxenomai-dev python-pyftpdlib </code></pre>
<br />
otros (cython)<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"><code>sudo sh -c \
"echo 'deb http://ftp.us.debian.org/debian wheezy-backports main' > \
/etc/apt/sources.list.d/wheezy-backports.list"
sudo apt-get update
sudo apt-get install -t wheezy-backports cython</code><code>
sudo apt-get install bwidget</code><code>
sudo apt-get update</code></pre>
<br />
Ahora hay que instalar git para clonar los archivos de Machinekit almacenados en github.<br />
<br />
Nota: cuando se llegue a la parte de git clone elegir la ruta donde se quiere guardar la descarga. Lo mejor es descargar en la ruta principal (cd ~/).<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"><code>sudo apt-get install git dpkg-dev
sudo apt-get install --no-install-recommends devscripts equivs
git clone https://github.com/machinekit/machinekit.git
cd machinekit
debian/configure -px
sudo mk-build-deps -ir
cd src</code></pre>
<br />
Esta parte es muy importante, se va explicar como poder utilizar el kernel xenomai y configurar el modo simulación para utilizar en la máquina virtual.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"><code>./autogen.sh</code></pre>
<br />
Para elegir el modo de configuración existen los siguientes comandos.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"><code>Optional Features:
--disable-option-checking ignore unrecognized --enable/--with options
--disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
--enable-FEATURE[=ARG] include FEATURE [ARG=yes]
--enable-remote enable remote zeroMQ services
--enable-examples build included programming examples
--enable-proto-js build Javascript bindings based on https://github.com/dcodeIO/ProtoBuf.js/wiki
--enable-shmdrv use the common shared memory driver kernel module
--enable-portable-parport Build hal_parport using the ppdev ioctl instead of inb/outb
--enable-emcweb build the emcweb interface
--enable-dev build unstable development code
--enable-nml enable NML-using parts
Optional Features and Packages:
--disable-option-checking ignore unrecognized --enable/--with options
--disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
--enable-FEATURE[=ARG] include FEATURE [ARG=yes]
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
--with-platform-pc Build for PC platform (default for x86 arch)
--with-platform-beaglebone
Build for Beaglebone platform (default for ARM arch)
--with-platform-raspberry
Build for Raspberry platform (default for ARM arch)
--with-platform-zedboard
Build for Zedboard platform
--with-rundir=<directory> directory for IPC sockets and other transient files (default /tmp)
--with-xenomai-kernel-sources="<ksrc_dir> <ksrc_dir>..."
directory paths of xenomai kernel source(s),
space-separated
--with-rtai-kernel-sources="<ksrc_dir> <ksrc_dir>..."
directory paths of RTAI kernel source(s),
space-separated
--with-shmdrv-kernel-sources="<ksrc_dir> <ksrc_dir>..."
directory paths of kernel source(s) to build shmdrv
module for
--with-extra-kernel-sources="<dir> <dir>..."
list of extra kernel source directories to search
--with-posix build POSIX (simulator) non-realtime threads modules
(enabled by default)
--with-rt-preempt build RT_PREEMPT threads modules
--with-xenomai build Xenomai userland threads
--with-xenomai-kernel build Xenomai kernel-space realtime threads
(deprecated)
--with-xeno-config=<path>
location of the xeno-config executable
--with-rtai-kernel build RTAI kernel-space realtime threads modules
--with-rtai-config=<path>
location of the rtai-config executable
--enable-drivers Build hardware drivers
--enable-usermode-pci Build PCI drivers with usermode PCI support
--with-libmodbus Specify whether or not to build
the drivers that use libmodbus
(defaults to "yes")
--with-libusb-1.0 Specify whether or not to build
the drivers that use libusb-1.0
(defaults to "yes")
--with-lttng Specify whether or not to use
the LTTNG tracing framework
(defaults to "no")
--disable-gtk Disable the parts of LinuxCNC that depend on GTK
--with-rmmod=</path/rmmod> rmmod variant
--with-insmod=</path/insmod> insmod variant
--with-python=<path> Specify the Python interpreter
--enable-build-documentation=format Build documentation.
Format may be "pdf" or "html" if only one format is desired.
--with-tcl=DIR directory containing tcl configuration
(tclConfig.sh)
--with-tk=DIR directory containing tk configuration (tkConfig.sh)
--with-x use the X Window System
--disable-nls don't use NLS
--with-locale-dir=DIR Location of the locale file(s)
DATADIR/locale
--disable-python Disable the parts of LinuxCNC that depend on Python
--with-boost-python specify the boost python shared library to use. For
instance, --with-boost-python=boost_python-py25.
Defaults to boost-python. If you use this then you
should probably set PYTHON too, to avoid using
multiple python versions.
--with-boost[=ARG] use Boost library from a standard location
(ARG=yes), from the specified location (ARG=<path>),
or disable it (ARG=no) [ARG=yes]
--with-boost-libdir=LIB_DIR
Force given directory for boost libraries. Note that
this will override library path detection, so use
this parameter only if default library detection
fails and you know exactly where your boost
libraries are located.
--with-boost-serialization[=special-lib]
use the Serialization library from boost - it is
possible to specify a certain library for the linker
e.g.
--with-boost-serialization=boost_serialization-gcc-mt-d-1_33_1
--with-boost-thread[=special-lib]
use the Thread library from boost - it is possible
to specify a certain library for the linker e.g.
--with-boost-thread=boost_thread-gcc-mt
--with-boost-system[=special-lib]
use the System library from boost - it is possible
to specify a certain library for the linker e.g.
--with-boost-system=boost_system-gcc-mt</code></pre>
<br />
En este caso hay que elegir el kernel xenomai y el modo simulación.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"><code>./configure </code><code>--with-xenomai </code><code>--with-posix</code></pre>
<br />
Ahora hay que compilar los archivos con el comando make, en caso de tener una pc con un procesador multinúcleo ejecutar "nproc" para saber el número de núcleos. <br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">nproc
make -j#número que retorna nproc </pre>
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">#o ejecutar directo
make -j`nproc`</pre>
<br />
por último ejecutar sudo make setuid y configurar lo siguiente en el caso de obtener advertencias.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">sudo make setuid</pre>
<br />
Solucionar advertencias.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">sudo touch /var/log/linuxcnc.log
sudo service rsyslog restart
sudo cp rtapi/rsyslogd-linuxcnc.conf /etc/rsyslog.d/linuxcnc.conf
sudo service rsyslog restart
sudo cp -i src/rtapi/shmdrv/shmdrv.rules /etc/udev/rules.d (si sale la advertencia)
sudo nano /etc/security/limits.conf
cambiar memclock de 20480 -> * - memlock 32767 #EMC2
ctrl+o y ctrl+x
sudo apt-get install avahi-daemon avahi-discover
sudo make setuid
sudo adduser <username> xenomai -> (nombre de usuario que se haya asignado en S.O)
sudo reboot</pre>
<br />
Al reiniciar elegir el kernel xenomai, abrir terminal y escribir lo siguiente:<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">uname -a
sale lo siguiente -> Linux linuxcnc 3.8-1-xenomai.x86-686-pae #1 SMP Debian 3.8.13-9 i686 GNU/Linux
cd machinekit
. ./scripts/rip-environment</pre>
<br />
Con . ./scripts/rip-environment se activa la versión de Machinekit que se ha compilado, esto es muy útil para que se puedan añadir o modificar archivos, librerías, imágenes, etc; de este modo se evita dañar algún archivo del sistema de linux.<br />
<br />
Nota: Ejecutar . ./scripts/rip-environment simpre que se quiera usar machinekit, solo es necesario volverlo a ejecutar cuando se cierra el terminal o se reinicia linux.<br />
Si se quiere ejecutar siempre Machinekit desde la terminal de forma directa, se debe agregar una variable de entorno.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">#Primero hacer un respaldo de .bashrc
cd
cp .bashrc .bashrc.bk</pre>
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">sh -c "echo 'if [ -f ~/machinekit/scripts/rip-environment ]; then\n\
source ~/machinekit/scripts/rip-environment\n\
echo \"Environment set up for running Machinekit and LinuxCNC\"\n\
fi\n' >> ~/.bashrc"</pre>
<br />
Ejecutamos linuxcnc (Machinekit)<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">linuxcnc</pre>
<br />
Y si todo salio bién ejecutara el programa.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCghlhlvj49BUhz9lz4NR3pkBHAzc66A0LzBAK4tTqKKedVKQ9diRB5ETnbYRIUsamC7fpO22B7VPThzeeXS7wmk-Dxzyqhfde0xzWINnDe9rJxDIA6f8eldo8wGfgvYuRFTgTjJORNeE/s1600/Machinekit-xenomai-PC.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCghlhlvj49BUhz9lz4NR3pkBHAzc66A0LzBAK4tTqKKedVKQ9diRB5ETnbYRIUsamC7fpO22B7VPThzeeXS7wmk-Dxzyqhfde0xzWINnDe9rJxDIA6f8eldo8wGfgvYuRFTgTjJORNeE/s640/Machinekit-xenomai-PC.jpg" width="640" /></a></div>
<br />Vichentehttp://www.blogger.com/profile/13532517773299729858noreply@blogger.com1tag:blogger.com,1999:blog-6209740641626143717.post-88934792290100480652015-09-07T22:22:00.000-07:002015-09-07T22:31:17.865-07:00Configurar archivo .hal machinekitEl archivo .hal se encarga de configurar los componentes de hardware que se usarán en machinekit, la ventaja que se tiene de poder usar el archivo .hal es que nos permite enlazar los componentes de hardware a machinekit sin tener que compilar las librerías. Las librerías que se usa en la Beaglebone Black se encuentra en la ruta "/usr/lib/linuxcnc/xenomai", al ser las librerías de c (.c) y ensamblador (.p) compiadas tienen una extension .so usada en linux (en windows la extensión es .dll).<br />
<br />
Lo primero que se necesita para que el archivo .hal ejecute los pines que se van a usar es cargar el script .sh que contiene toda la información necesaria de los pines que se van a usar. Revisar el tutorial de <a href="http://machinekit-gmoccapy-lcd7.blogspot.com/2015/07/configurar-los-pines-gpio-para-usar-con.html" target="_blank">Configurar los pines gpio para usar con Machinekit</a>.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"># Launch the setup script to make sure hardware setup looks good
loadusr -w ../setup.MF5-DTO.sh</pre>
<br />
Luego de cargar el script se necesita cargar las librerías necesarias para que funcione la máquina, las variables que contienen los parámetros con los que se cargarán se encuentran en el archivo .ini.<br />
loadrt trivkins es la encarga de configurar machinekit para usarse como fresadora, torno y sus derivados. Existen otros tipos de configuración para robot scara, puma, etc. <a href="http://linuxcnc.org/docs/html/man/man9/kins.9.html" target="_blank">KINS</a>.<br />
loadrt tp es una función que se añadío, en este link se explica un poco de lo que hace <a href="http://www.linuxcnc.org/index.php/english/forum/10-advanced-configuration/27368-new-trajectory-planner-testersprograms-wanted" target="_blank">http://www.linuxcnc.org/index.php/english/forum/10-advanced-configuration/27368-new-trajectory-planner-testersprograms-wanted</a>.<br />
loadrt para:<br />
[EMCMOT]EMCMOT, servo_period_nsec=[EMCMOT]SERVO_PERIOD, num_joints=[TRAJ]AXES, tp=tp kins=trivkins. Son variables que están en el archivo .ini con sus respectivos valores, dichos valores se usarán en el archivo .hal. tp =tp y kins=trivkins serán las variables que se pueden usar en el archivo .hal con dicho nombre.<br />
<br />
hal_bb_gpio se encarga de configurar los pines como entrada o salida, es muy importante que en esta parte solo se use los pines que van a funcionar en modo de 1 o 0, en input esta puesto los finales de carrera (switch) que están configurados en el script en los pines de P8.7 (X Max), P8.8 (X Min), P8.9 (Y Max), P8.10 (Y Min), P8.17 (Estop), P9.11 (Z Max), P9.13 (Z Min) y como salida están los pines P8.18 (Led), P8.19 (Axis Enable), P8.26 (ESTOP Out), P9.23 (Machine Power). Los valores que estan con 100 + num_pin pertenecen al header P8 donde num_pin es el número de pin del 1 al 46, en el header P9 se usan el valor de 200 + num_pin, tambien hay como configurar con los valores de 800 + num_pin para Header P8 y 900 + num_pin para el Header P9. En esta configuración nunca hay que poner los pines que vamos a usar para la generación de step/dir o pwm ya que de lo contrario no funcionará bien cuando los utilicemos. <br />
<br />
[PRUCONF](DRIVER) es la variable que manda a llamar a la librería hal_pru_generic.<br />
prucode es la variable que cargara el archivo pru_generic.bin donde HAL_RTMOD_DIR = EMC2_RTLIB_DIR, EMC2_RTLIB_DIR = $(EMC2_RTLIB_BASE_DIR)/$(RTDIR_EXT)<i>, </i>RTDIR_EXT continene los threads que se usarán. Bueno en definitiva que daría que HAL_RTMOD_DIR es el path /usr/lib/linuxcnc y al estar [PRUCONF](PRUBIN)=xenomai/pru_generic.bin el path final sería /usr/lib/linuxcnc/xenomai/pru_generic.bin si se usará la imagen de machinekit, de lo contrario sería /home/username/machinekit/lib/linuxcnc/xenomai/pru_generic.bin. Para poder entender mejor esto hay que revisar los archivos que crean las rutas e instalan los archivos en las carpetas correspondientes. Los archivos Makefile y Submakefile.<br />
<br />
[PRUCONF](CONFIG) contiene la información de cuantos ejes y señales pwm se va usar.<br />
<br />
halname es el nombre que se le va a dar a la estructura [PRUCONF](DRIVER) o hal_pru_generic.pwmgen que se utilizaba antes de que modificaran el archivo .c de hal_pru_generic, mas abajo se indica la diferncia de esto.<br />
<br />
Por último loadusr ejecuta programas externos que se van a usar, estos pueden ser como el programa python que usan en la impresora 3d para leer la temperatura <a href="https://github.com/machinekit/machinekit/blob/master/configs/ARM/BeagleBone/PocketNC/ReadTemp.py" target="_blank">ReadTemp.py.</a> Donde Therm es el nombre que se le asigna, -n es el nombre de la componente, --num_chan el número de sensores que se va a leer, -t asigna que tabla del archivo se va a usar (depende del modelo de termistor que se va a usar), -a indica que pin del ADC de la Beaglebone Black se usará.<br />
<br />
En la CRAMPS y BeBoPr el archivo ReadTemp.py fue reemplazado por el archivo hal_temp_bbb que se encuentra en la ruta /usr/bin como ejecutable. <br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"># ###################################
# Core EMC/HAL Loads
# ###################################
# kinematics
loadrt trivkins
# motion controller, get name and thread periods from ini file
# trajectory planner
loadrt tp
loadrt [EMCMOT]EMCMOT servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[TRAJ]AXES tp=tp kins=trivkins
# load low-level drivers
# uncertain about P9-17 to 20, these are I2C channels - are these needed if we want to use BB-IO to talk to them?
loadrt hal_bb_gpio input_pins=107,108,109,110,117,211,213 output_pins= 118,119,126,223
loadrt [PRUCONF](DRIVER) prucode=$(HAL_RTMOD_DIR)/[PRUCONF](PRUBIN) [PRUCONF](CONFIG) halname=hpg
# Python user-mode HAL module to read ADC value and generate a thermostat output for PWM
# t = Thermistor table (only epcos_B57560G1104 or 1 supported for now)
# a = analog input channel
loadusr -Wn Therm ./ReadTemp.py -n Therm --num_chan 2 -t 1 1 -a 4 5
# Python user-mode HAL module to read ADC value and generate a thermostat output for PWM
# c = analog input channel and thermistor table
loadusr -Wn Therm hal_temp_bbb -n Therm -c 04:epcos_B57560G1104,05:epcos_B57560G1104 -b CRAMPS
# ################################################
# THREADS
# ################################################
addf hpg.capture-position servo-thread
addf bb_gpio.read servo-thread
addf motion-command-handler servo-thread
addf motion-controller servo-thread
# revel in the free time here from not having to run PID
addf hpg.update servo-thread
addf bb_gpio.write servo-thread
</pre>
<br />
La configuración de arriba es lo básico que se necesita para configurar una máquina cnc, si se quiere configurar más cosas como los encoders, pid, jog, condiciones, etc; se necesita de algunas configuraciones extra como las siguientes.<br />
<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"># ###################################
# Core EMC/HAL Loads
# ###################################
#encoder
loadrt encoder num_chan=1
#siganl inverter
loadrt not
#PID
loadrt pid count=2
#Limit min max
loadrt limit1 count=2
# ################################################
# THREADS
# ################################################
#encoder
addf encoder.update-counters servo-thread
addf encoder.capture-position servo-thread
#signal inverter
addf not.0 servo-thread
#PID
addf pid.0.do-pid-calcs servo-thread
addf pid.1.do-pid-calcs servo-thread
#Limit min max
addf limit1.0 servo-thread
addf limit1.1 servo-thread
# ################################################
# Attach (Unir señales)
# ################################################
# connect inputs to the encoder
net encA encoder.0.phase-A <= bb_gpio.p8.in-12
net encB encoder.0.phase-B <= bb_gpio.p8.in-13
# emergency stop (signal inverter)
net estop <= bb_gpio.p8.in-17
net estop => not.0.in
net nestop <= not.0.out
net nestop => iocontrol.0.emc-enable-in
# PID for Extruder 0 temperature control
net e0.temp.meas <= Therm.ch-04.value
net e0.temp.meas => pid.0.feedback
sets e0.temp.set 0
net e0.temp.set => pid.0.command
net e0.heater <= pid.0.output
net e0.heater => limit1.0.in
net e0.heaterl <= limit1.0.out
net e0.heaterl => hpg.pwmgen.00.out.01.value
# Limit heater PWM to positive values
# PWM mimics hm2 implementation, which generates output for negative values
setp limit1.0.min 0
# PID for Bed temperature control
net bed.temp.meas <= Therm.ch-05.value
net bed.temp.meas => pid.1.feedback
sets bed.temp.set 0
net bed.temp.set => pid.1.command
net bed.heater <= pid.1.output
net bed.heater => limit1.1.in
net bed.heaterl <= limit1.1.out
net bed.heaterl => hpg.pwmgen.00.out.00.value
# Limit heater PWM to positive values
# PWM mimics hm2 implementation, which generates output for negative values
setp limit1.1.min 0
# PID Parameters for adjusting temperature control
# Extruder
#setp pid.0.FF0 0
#setp pid.0.FF1 0
#setp pid.0.FF2 0
setp pid.0.Pgain 0.30
setp pid.0.Igain 0.00001
setp pid.0.Dgain 0.9375
setp pid.0.maxerrorI 1.0
setp pid.0.bias 0.5
setp pid.0.enable 1
# Bed
#setp pid.1.FF0 0
#setp pid.1.FF1 0
#setp pid.1.FF2 0
setp pid.1.Pgain 1
setp pid.1.Igain 0.0
setp pid.1.Dgain 0.0
setp pid.1.maxerrorI 1.0
setp pid.1.bias 0.5
setp pid.1.enable 1
</pre>
<br />
Existen mas componentes que se pueden configurar en los siguientes links se puede observar algunas configuraciones e información adicional de los componentes:<br />
<a href="http://linuxcnc.org/docs/html/hal/components.html#sec:realtime-components" target="_blank">Realtime Components</a><br />
<a href="http://wiki.linuxcnc.org/cgi-bin/wiki.pl?Closed_Loop_Spindle_Speed_Control" target="_blank">Control lazo cerrado velocidad taladro</a> <br />
<a href="https://github.com/machinekit/machinekit/tree/master/configs/ARM/Zedboard/CAN8" target="_blank">Configuración Zedboard taladro, encoder, e-stop</a><br />
<br />
Lo siguiente indica la configuración que se debe realizar para configurar los ejes (driver-motores). Como arriba se dijo antes se usaba la configuración [PRUCONF](DRIVER) pero ahora solo se pone como hpg seguido de la función principal, el número del eje, tipo de función y valor (conf .ini).<br />
<br />
Antes<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">#Para escribir el eje que correspondia X->00 Y->01 Z->02 y asi sucesivamente.
# timing parameters
setp [PRUCONF](DRIVER).stepgen.00.dirsetup [AXIS_0]DIRSETUP
setp [PRUCONF](DRIVER).stepgen.00.dirhold [AXIS_0]DIRHOLD
setp [PRUCONF](DRIVER).stepgen.00.steplen [AXIS_0]STEPLEN
setp [PRUCONF](DRIVER).stepgen.00.stepspace [AXIS_0]STEPSPACE
setp [PRUCONF](DRIVER).stepgen.00.position-scale [AXIS_0]SCALE
setp [PRUCONF](DRIVER).stepgen.00.maxvel [AXIS_0]STEPGEN_MAX_VEL
setp [PRUCONF](DRIVER).stepgen.00.maxaccel [AXIS_0]STEPGEN_MAX_ACC
#setp [PRUCONF](DRIVER).stepgen.00.step_type 0
# P8.43 PRU1.out2
setp [PRUCONF](DRIVER).stepgen.00.steppin 55
# P8.44 PRU1.out4
setp [PRUCONF](DRIVER).stepgen.00.dirpin 76
#Para las señales de pwm se hacia asi poniendo hal_pru_generic.pwmgen.00.out.número.asignación valor.
# Bed Heater FET 1
setp hal_pru_generic.pwmgen.00.out.00.pin 77
setp hal_pru_generic.pwmgen.00.out.00.enable 1
setp hal_pru_generic.pwmgen.00.out.00.value 0.0
</pre>
<br />
Ahora<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"># ################
# X [0] Axis
# ################
# axis enable chain
newsig emcmot.00.enable bit
sets emcmot.00.enable FALSE
net emcmot.00.enable <= axis.0.amp-enable-out
net emcmot.00.enable => hpg.stepgen.00.enable
# position command and feedback
net emcmot.00.pos-cmd <= axis.0.motor-pos-cmd
net emcmot.00.pos-cmd => hpg.stepgen.00.position-cmd
net motor.00.pos-fb <= hpg.stepgen.00.position-fb
net motor.00.pos-fb => axis.0.motor-pos-fb
# timing parameters
setp hpg.stepgen.00.dirsetup [AXIS_0]DIRSETUP
setp hpg.stepgen.00.dirhold [AXIS_0]DIRHOLD
setp hpg.stepgen.00.steplen [AXIS_0]STEPLEN
setp hpg.stepgen.00.stepspace [AXIS_0]STEPSPACE
setp hpg.stepgen.00.position-scale [AXIS_0]SCALE
setp hpg.stepgen.00.maxvel [AXIS_0]STEPGEN_MAX_VEL
setp hpg.stepgen.00.maxaccel [AXIS_0]STEPGEN_MAX_ACC
#setp hpg.stepgen.00.step_type 0
# P9.31 GPIO3_14
setp hpg.stepgen.00.steppin 0x8E
# P9.29 GPIO3_15
setp hpg.stepgen.00.dirpin 0x8F</pre>
<br />
Primero se crea la variable emcmot.00.enable como bit, luego se manda el valor de false para inicializarla como FALSE (0) (puede ser FALSE o TRUE no afecta en nada), el net conecta la variable emcmot.00.enable con axis.0.amp-enable-out, luego que se recibe el valor de axis.0.amp-enable-out se manda a la variable hpg.stepgen.00.enable para decirle si se habilita o no la generación de pulsos para este eje.<br />
<br />
Todo eso se lo puede cambiar tranquilamente escribiendo de la siguiente manera:<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">net EnableX axis.0.amp-enable-out => hpg.stepgen.00.enable</pre>
donde EnableX es la variable que creamos con cualquier nombre, axis.0.amp-enable-out habilita el eje siempre que se lo mande a llamar ya sea en el MDI o código G y permite la generación de pulsos en hpg.stepgen.N.enable(N=número de eje).<br />
<br />
Para poder utilizar el MDI con el eje se usa axis.0.motor-pos-cmd y se lo enlaza a hpg.stepgen.00.enable para que todo los comandos que se esciban en MDI los mande a hpg.stepgen.00.enable. (xpos-cmd puede ser cualquier nombre)<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">net xpos-cmd axis.0.motor-pos-cmd => hpg.stepgen.00.position-cmd</pre>
<br />
Para saber en que posición se encuentra cada eje se utiliza axis.0.motor-pos-fb, la posición se visualiza en el DRO de linuxcnc. hpg.stepgen.00.position-fb se enlaza a axis.0.motor-pos-fb y manda la info de posición. (xpos-fb puede ser cualquier nombre)<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">net xpos-fb hpg.stepgen.00.position-fb => axis.0.motor-pos-fb</pre>
<br />
La parte de arriba quedaría de la siguiente forma:<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"># ################
# X [0] Axis
# ################
# axis enable chain
net EnableX axis.0.amp-enable-out => hpg.stepgen.00.enable
# position command and feedback
net xpos-cmd axis.0.motor-pos-cmd => hpg.stepgen.00.position-cmd
net xpos-fb hpg.stepgen.00.position-fb => axis.0.motor-pos-fb</pre>
<br />
La siguiente parte solo configura las funciones de hpg.stepgen con los valores colocados en el archivo .ini.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"># timing parameters
#Para el controlador ACS606:
#[AXIS_0]DIRSETUP=5000
#[AXIS_0]DIRHOLD=6700
#[AXIS_0]STEPLEN=850
#[AXIS_0]STEPSPACE=850
#Scala para X -> [AXIS_0]SCALE=800.0
#[AXIS_0]STEPGEN_MAX_VEL=48.0
#[AXIS_0]STEPGEN_MAX_ACC=480.0
setp hpg.stepgen.00.dirsetup [AXIS_0]DIRSETUP
setp hpg.stepgen.00.dirhold [AXIS_0]DIRHOLD
setp hpg.stepgen.00.steplen [AXIS_0]STEPLEN
setp hpg.stepgen.00.stepspace [AXIS_0]STEPSPACE
setp hpg.stepgen.00.position-scale [AXIS_0]SCALE
setp hpg.stepgen.00.maxvel [AXIS_0]STEPGEN_MAX_VEL
setp hpg.stepgen.00.maxaccel [AXIS_0]STEPGEN_MAX_ACC</pre>
<br />
La última parte de configuración .hal para los ejes es:<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">#setp hpg.stepgen.00.step_type 0
# P9.31 GPIO3_14
setp hpg.stepgen.00.steppin 0x8E
# P9.29 GPIO3_15
setp hpg.stepgen.00.dirpin 0x8F</pre>
<br />
Esta parte es muy importante porque dependiendo del pin que queramos usar ya sea como gpio o como pru hay que colocar la dirección del pin correcto y eso se lo puede encontrar en el archivo <a href="https://github.com/machinekit/machinekit/blob/master/src/hal/drivers/hal_pru_generic/beaglebone_pinmap.h" target="_blank">beaglebone_pinmap.h</a>, <br />
<br />
Para encontrar el pin gpio que se usa en el archivo .hal se debe aplicar la siguiente fórmula:<br />
hal_pru_generic pin = ((<gpio_bank>+1)*32)+<gpio_pin><br />
Para utilizar P9.31 GPIO3_14 -> ((3+1)*32)+14 = 142 en hexadecimal = 8E<br />
Para utilizar P9.29 GPIO3_15 -> ((3+1)*32)+15 = 143 en hexadecimal = 8F<br />
<br />
En la configuración de Cramps se lo hace de la siguiente manera:<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">#setp hpg.stepgen.00.step_type 0
# P8.43 PRU1.out2
setp hpg.stepgen.00.steppin 813
# P8.44 PRU1.out4
setp hpg.stepgen.00.dirpin 812</pre>
<br />
donde se aplica el siguiente código para encontar el pin.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">int fixup_pin(u32 hal_pin) {
int ret = 0;
u32 type, p89, index;
// Original brain-dead pin numbering
if (hal_pin < 192) {
ret = hal_pin;
} else {
type = hal_pin / 100;
p89 = (hal_pin % 1000) / 100 ;
index = hal_pin % 100;
// Fixup index value for P9 pins with two CPU pins attached
if (p89 == 9) {
if ((index == 91) || (index == 92)) {
index = index - 50 + (47 - 41);
} else if (index > 46) {
index = 0;
}
} else if (index > 46) {
index = 0;
}
switch (type) {
case 8 :
ret = p8_pins[index].gpio_pin_num;
break;
case 9 :
ret = p9_pins[index].gpio_pin_num;
break;
case 18 :
ret = p8_pins[index].pruO_pin_num;
break;
case 19 :
ret = p9_pins[index].pruO_pin_num;
break;
case 28 :
ret = p8_pins[index].pruI_pin_num;
break;
case 29 :
ret = p9_pins[index].pruI_pin_num;
break;
default:
ret = 0;
}
if (ret == 0)
HPG_ERR("Unknown pin: %d\n",(int)hal_pin);
if (ret < 0) {
HPG_ERR("Requested pin unavailable: %d\n",(int)hal_pin);
ret = 0;
}
}
return ret;
}</pre>
<br />
Para encontrar el pin al que pertenece el valor 813 se realizaría lo siguiente.<br />
type=813/100 => 8.13 => 8<br />
p89=(813mod1000)/100 => 8.13 => 8<br />
index=813mod100 => 13<br />
<br />
Si type es 8, case 8:<br />
ret = p8_pins[13].gpio_pin_num => P8.13 en modo GPIO<br />
<br />
Para encontrar el pin al que pertenece el valor 812 se realizaría lo siguiente.<br />
type=812/100 => 8.12 => 8<br />
p89=(812mod1000)/100 => 8.12 => 8<br />
index=812mod100 => 12<br />
<br />
Si type es 8, case 8:<br />
ret = p8_pins[12].gpio_pin_num => P8.12 en modo GPIO<br />
<br />
Para cofigurar pin como PRU para P8 sería de la siguiente forma:<br />
P8.15 <br />
type= 1815/100 => 18.15 => 18<br />
p89= (1815mod1000)/100 => 8.15 => 8<br />
index= 1815mod100 => 15<br />
<br />
Si type es 18, case 18:<br />
ret = p8_pins[15].pruO_pin_num => P8.15 en modo pru in<br />
<br />
Para cofigurar pin como PRU para P9 sería de la siguiente forma:<br />
P9.31 <br />
type= 1931/100 => 19.31 => 19<br />
p89= (1931mod1000)/100 => 9.31 => 9<br />
index= 1931mod100 => 31<br />
<br />
Si type es 19, case 19:<br />
ret = p9_pins[31].pruO_pin_num => P9.31 en modo pru out<br />
<br />
Para evitar todo este proceso lo más fácil es coger el valor directo de la pru del archivo <a href="https://github.com/machinekit/machinekit/blob/master/src/hal/drivers/hal_pru_generic/beaglebone_pinmap.h" target="_blank">beaglebone_pinmap.h</a> y colocar en el archivo .hal ya sea en decimal o hexadecimal.<br />
<br />
La siguiente parte se usa si la máquina usa finales de carrera.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"># ##################################################
# Standard I/O - EStop, Enables, Limit Switches, Etc
# ##################################################
# Create estop signal chain
# Drive software estop to hardware
net estop-out iocontrol.0.user-enable-out => bb_gpio.p8.out-26
setp bb_gpio.p8.out-26.invert 1
# Monitor estop input from hardware
net estop-loop bb_gpio.p8.in-17 => iocontrol.0.emc-enable-in
setp bb_gpio.p8.in-17.invert 1
# create signals for tool loading loopback
net tool-prep-loop iocontrol.0.tool-prepare => iocontrol.0.tool-prepared
net tool-change-loop iocontrol.0.tool-change => iocontrol.0.tool-changed
# Axis enable signal (active low)
net emcmot.00.enable => bb_gpio.p9.out-14
setp bb_gpio.p9.out-14.invert 1
# Machine power
# Use halui.machine.is-on instead?
net emcmot.00.enable => bb_gpio.p9.out-23
# Tie machine power signal to the CRAMPS LED
# Feel free to tie any other signal you like to the LED
net emcmot.00.enable => bb_gpio.p9.out-25
# ################
# Limit Switches
# ################
newsig limit-x-min bit
newsig limit-x-max bit
newsig limit-y-min bit
newsig limit-y-max bit
newsig limit-z-min bit
newsig limit-z-max bit
net limit-x-min <= bb_gpio.p8.in-08
net limit-x-max <= bb_gpio.p8.in-07
net limit-y-min <= bb_gpio.p8.in-10
net limit-y-max <= bb_gpio.p8.in-09
net limit-z-min <= bb_gpio.p9.in-13
net limit-z-max <= bb_gpio.p9.in-11
# Adjust as needed for your switch polarity
setp bb_gpio.p8.in-08.invert 1
setp bb_gpio.p8.in-07.invert 1
setp bb_gpio.p8.in-10.invert 1
setp bb_gpio.p8.in-09.invert 1
setp bb_gpio.p9.in-11.invert 1
setp bb_gpio.p9.in-13.invert 1
# Uncomment if you actually have limit switches setup
# You probably want to setup homing in the INI file, as well
#net limit-x-min => axis.0.home-sw-in
#net limit-x-min => axis.0.neg-lim-sw-in
#net limit-x-max => axis.0.pos-lim-sw-in
#net limit-y-min => axis.1.home-sw-in
#net limit-y-min => axis.1.neg-lim-sw-in
#net limit-y-max => axis.1.pos-lim-sw-in
#net limit-z-min => axis.2.home-sw-in
#net limit-z-min => axis.2.neg-lim-sw-in
#net limit-z-max => axis.2.pos-lim-sw-in</pre>
<br />
Primero verifica si se a quitado el boton de emergencia de machinekit, esto se puede hacer por software o por hardware con un pulsador normalemente abierto o cerrado (con invert se configura el tipo de switch 1 para NC y 0 para NA) todo depende de la configuración, cuando se explique la parte electrónica se entendera como funciona esto. Lo mismo pasa en el loop de cambio de herramienta.<br />
<br />
Para los finales de carrera se les asigna una variable del tipo booleano y de igual forma se puede invertir la polaridad de acuerdo al tipo de switch (final de carrera).<br />
<br />
Por último se configura las señales PWM en la primera parte estará la configuración de señales para una impresora 3d y en la segunda parte para un taladro.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"># ##################################################
# PWM and Temperature Signals
# ##################################################
# Define signals to use elsewhere (ie: M1xx codes)
# If you change any names here, lots of things will break!
newsig e0.temp.set float
newsig e0.temp.meas float
newsig bed.temp.set float
newsig bed.temp.meas float
setp hpg.pwmgen.00.pwm_period 10000000
# Bed Heater FET 1
setp hpg.pwmgen.00.out.00.pin 811
setp hpg.pwmgen.00.out.00.enable 1
setp hpg.pwmgen.00.out.00.value 0.0
# E0 Heater FET 2
setp hpg.pwmgen.00.out.01.pin 915
setp hpg.pwmgen.00.out.01.enable 1
setp hpg.pwmgen.00.out.01.value 0.0
# E1 Heater FET 3
setp hpg.pwmgen.00.out.02.pin 927
setp hpg.pwmgen.00.out.02.enable 1
setp hpg.pwmgen.00.out.02.value 0.0
# E2 Heater FET 4
setp hpg.pwmgen.00.out.03.pin 921
setp hpg.pwmgen.00.out.03.enable 1
setp hpg.pwmgen.00.out.03.value 0.0
# FET 5 - Fan / LED
setp hpg.pwmgen.00.out.04.pin 941
setp hpg.pwmgen.00.out.04.enable 1
setp hpg.pwmgen.00.out.04.value 0.0
# FET 6 - Fan / LED
setp hpg.pwmgen.00.out.05.pin 922
setp hpg.pwmgen.00.out.05.enable 1
setp hpg.pwmgen.00.out.05.value 0.0
# PID for Extruder 0 temperature control
net e0.temp.meas <= Therm.ch-04.value
net e0.temp.meas => pid.0.feedback
sets e0.temp.set 0
net e0.temp.set => pid.0.command
net e0.heater <= pid.0.output
net e0.heater => limit1.0.in
net e0.heaterl <= limit1.0.out
net e0.heaterl => hpg.pwmgen.00.out.01.value
# Limit heater PWM to positive values
# PWM mimics hm2 implementation, which generates output for negative values
setp limit1.0.min 0
# PID for Bed temperature control
net bed.temp.meas <= Therm.ch-05.value
net bed.temp.meas => pid.1.feedback
sets bed.temp.set 0
net bed.temp.set => pid.1.command
net bed.heater <= pid.1.output
net bed.heater => limit1.1.in
net bed.heaterl <= limit1.1.out
net bed.heaterl => hpg.pwmgen.00.out.00.value
# Limit heater PWM to positive values
# PWM mimics hm2 implementation, which generates output for negative values
setp limit1.1.min 0
# PID Parameters for adjusting temperature control
# Extruder
#setp pid.0.FF0 0
#setp pid.0.FF1 0
#setp pid.0.FF2 0
setp pid.0.Pgain 0.30
setp pid.0.Igain 0.00001
setp pid.0.Dgain 0.9375
setp pid.0.maxerrorI 1.0
setp pid.0.bias 0.5
setp pid.0.enable 1
# Bed
#setp pid.1.FF0 0
#setp pid.1.FF1 0
#setp pid.1.FF2 0
setp pid.1.Pgain 1
setp pid.1.Igain 0.0
setp pid.1.Dgain 0.0
setp pid.1.maxerrorI 1.0
setp pid.1.bias 0.5
setp pid.1.enable 1</pre>
<br />
Primero se crean las variables del extrusor y la cama caliente como flotantes ya que reciben la lectura de los sensores de temperatura con decimales.<br />
Luego se define el valor de la frecuencia para las señales pwm.<br />
setp hpg.pwmgen.00.pwm_period 10000000<br />
donde 10000000 es el valor en nanosegundos si la fórmula de frecuencia es f=1/T<br />
entonces f=1/10000000ns => f=1/0.01s => f=100hz<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"># Bed Heater FET 1
setp hpg.pwmgen.00.out.00.pin 811
setp hpg.pwmgen.00.out.00.enable 1
setp hpg.pwmgen.00.out.00.value 0.0</pre>
<br />
Los variables que forman parte de la función pwmgen son las siguientes:<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">#Datos extraidos del archivo pwmgen.c
hpg->pwmgen.instance[i].out[j].hal.pin.enable
hpg->pwmgen.instance[i].out[j].hal.pin.value
hpg->pwmgen.instance[i].out[j].hal.pin.pin
hpg->pwmgen.instance[i].out[j].hal.pin.scale
#Configuración en el archi .hal
#Para un PWM quedaría de la siguiente forma
# Bed Heater FET 1
setp hpg.pwmgen.00.out.00.pin 811
setp hpg.pwmgen.00.out.00.enable 1
setp hpg.pwmgen.00.out.00.value 0.0
#Para un segundo PWM
# SPINDLE con 12000 RPM
setp hpg.pwmgen.00.out.00.pin 915
setp hpg.pwmgen.00.out.00.enable 1
setp hpg.pwmgen.00.out.00.scale 12000</pre>
<br />
En resumen lo que se hace es proporcionar de valores iniciales, se configura el pin, si se quiere que este habilitado (1), el valor con el que se inicializa y la escala para controlar el número de RPM.<br />
<br />
El PID para el extrusor y cama caliente realiza el proceso de mejorar la lectura obtenida del sensor de temperatura con lazo cerrado, los valores del PID se obtienen con pruebas que estabilizen la curva (para realiazar este proceso se utiliza el componente Halscope).<br />
<br />
Segunda Parte pwmgen:<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"># ##################################################
# PWM Signals
# ##################################################
setp hpg.pwmgen.00.pwm_period 1000000
net spindle-speed-cmd <= motion.spindle-speed-out
net spindle-speed-cmd => hpg.pwmgen.00.out.00.value
net spindle-on motion.spindle-on => hpg.pwmgen.00.out.00.enable
# J2 PRU1.out1
setp hpg.pwmgen.00.out.00.pin 0x53
setp hpg.pwmgen.00.out.00.scale 12000</pre>
<br />
Se utiliza una frecuencia de 1khz ya que el driver permite de 1khz hasta 10 khz.<br />
f=1/1000000ns => f=1/0.001 => f=1000hz => f=1khz<br />
<br />
el motion.spindle-speed-out se enlaza a la variable spindle-speed-cmd para recibir los valores por comando MDI o código G y enviarlos a hpg.pwmgen.00.out.00.value.<br />
<br />
<a href="http://linuxcnc.org/docs/html/examples/spindle.html" target="_blank">Spindle ejemplo</a><br />
<a href="http://linuxcnc.org/docs/html/hal/tutorial.html#_halscope" target="_blank">Hal Tutorial</a><br />
<a href="https://github.com/machinekit/machinekit/blob/master/configs/ARM/BeagleBone/CRAMPS/CRAMPS.hal" target="_blank">Machinekit Cramps Hal</a><br />
<a href="http://linuxcnc.org/docs/html/hal/components.html#sec:realtime-components" target="_blank">Realtime Components</a><br />
<a href="http://gnipsel.com/emc2/html2.5/config/emc2hal.html" target="_blank">EMC2 and HAL</a><br />
<a href="http://wiki.linuxcnc.org/cgi-bin/wiki.pl?KX3" target="_blank">Linuxcnc ejemplo de configuración</a><br />
<a href="https://github.com/machinekit/machinekit/blob/5a1a3241aa643053bb2275a3d97581fd38eb9979/configs/by_interface/parport/plasma-thc-sim/stepper.hal" target="_blank">stepper.hal</a><br />
<br />
<br />
Hay cosas que no explicado muy bien porque aún no he realizado pruebas, pero este tutorial se ira actualizando o se hara otros tutoriales profundizando más lo que se indica aquí.<br />
<br />Vichentehttp://www.blogger.com/profile/13532517773299729858noreply@blogger.com1tag:blogger.com,1999:blog-6209740641626143717.post-26419232725101868592015-09-02T01:17:00.002-07:002015-09-02T01:21:25.530-07:00Configurar archivo .ini machinekitEl archivo .ini va a ser el encargado de configurar todos los parámetros que van a ser usados con machinekit donde estará los archivos o librerias que se van a usar, variables que se usarán en el archivo .hal, programas externos que se quiera usar, tipos de GUI con la que se quiera inicializar, etc.<br />
<br />
Antes de comenzar es recomendable que se revise el siguiente link para poder entender mejor las cosas.<br />
<a href="https://github.com/machinekit/machinekit/tree/master/src/hal/drivers/hal_pru_generic" target="_blank">https://github.com/machinekit/machinekit/tree/master/src/hal/drivers/hal_pru_generic</a><br />
<br />
En la Beaglebone Black se necesita de programas externos hechos en c (.c) y ensamblador (.p) que son los que contienen las instrucciones necesarias para poder realizar los procesos:<br />
- Pulso y dirección que controlan los drivers.<br />
- Señal PWM para controlar ventiladores, taladros, etc.<br />
- Los codificadores o encoders para poder hacer una lectura de posición con sensores de cuadratura.<br />
- Lectura y ecritura de señales que se envian a través de las GPIO o PRUSS<br />
- Señal de Espera hasta que la orden se haya completado.<br />
- Procesamiento de tareas que se estan ejecutando en machinekit.<br />
<br />
La siguiente información se encuentra en la carpeta de machinekit/src/hal/drivers/hal_pru_generic para los que deseen realizar cambios y mejorar el desempeño de las librerías. El link que dejo es de github. <a href="https://github.com/machinekit/machinekit/tree/master/src/hal/drivers/hal_pru_generic" target="_blank">https://github.com/machinekit/machinekit/tree/master/src/hal/drivers/hal_pru_generic</a><br />
<br />
Las secciones del archivo .ini van entre corchetes indicando su nombre y las que estan dentro de estas serán las variables.<br />
<br />
Nota: Uno puede utilizar cualquier nombre en una sección personaliza y en la variable lo mismo, lo que se hace es que cualquier sección o variable que se ocupe utilizarla en el archivo .hal.<br />
<br />
Ejemplo:<br />
<br />
[miImpresora]<br />
calentar=1<br />
apagar=0<br />
<br />
En el archivo hal se la puede mandar a llamar definiendo una nueva variable.<br />
#impresora 1 <br />
newsig impresora.00.enable bit<br />
sets impresora.00.enable [miImpresora](calentar)<br />
#impreora 2<br />
newsig impresora.01.enable bit<br />
sets impresora.01.enable [miImpresora](apagar)<br />
<br />
Y luego se debe enlazar con el comando net.<br />
net impresora.00.enable <= axis.0.amp-enable-out<br />
net impresora.00.enable => hpg.stepgen.00.enable <br />
net impresora.01.enable <= axis.1.amp-enable-out<br />
net impresora.01.enable => hpg.stepgen.01.enable<br />
<br />
Bueno lo escrito en la parte superior sera explicado en una configuración avanzada de como enlazar estas variables con linuxcnc y GUI's personalizadas.<br />
<br />
La sección de PRUCONF se utiliza en la Beaglebone Black y es la encargada de decir al archivo .ini que utilice la librería hal_pru_generic que contiene toda la información de las GPIO, STEP, DIR, PWM, Encoders, etc.<br />
<br />
En el archivo .hal se explicará como machinekit llama a dichas librerias que se encuentran en el directorio de /usr/lib/linuxcnc/xenomai.<br />
<br />
DRIVER es la variable que llama a la librería hal_pru_generic<br />
CONFIG es la variable que configura num_stepgens que son los ejes que se van a usar (STEP/DIR) y num_pwmgens es el numero de señales pwm que se desea ya sea para ventiladores, láser, taladro, etc.<br />
PRUBIN es la variable que manda a llamar a xenomai que es el kernel de machinekit para que funcione en tiempo real.<br />
<br />
Ejemplos:<br />
<br />
Configuración de impresora 3d con doble extrusor (2 motores pap), 3 motores (X,Y,Z), 2 ventiladores, 2 fusores (extrusor) y una cama caliente.<br />
Los motores del extrusor los manejo con los drivers pololu que funcionan con STEP/DIR.<br />
Los motores de los ejes X, Y, Z; los manejo con los drivers ACS606 (STEP/DIR).<br />
Los ventiladores con 2 señales PWM.<br />
Los fusores con 2 señales PWM.<br />
La cama caliente con 1 señal PWM.<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"><code style="color: black; word-wrap: normal;"><your code="" here=""></your></code>[PRUCONF]
DRIVER=hal_pru_generic
CONFIG=pru=1 num_stepgens=5 num_pwmgens=5
PRUBIN=xenomai/pru_generic.bin</pre>
<br />
Configuración de fresadora 3 ejes (X,Y,Z).<br />
Los motores de los ejes X, Y, Z; los manejo con los drivers ACS606 (STEP/DIR).<br />
El taladro lo manejo con el driver hx-ws400 (PWM).<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"><code style="color: black; word-wrap: normal;"></code>[PRUCONF]
DRIVER=hal_pru_generic
CONFIG=pru=1 num_stepgens=3 num_pwmgens=1
PRUBIN=xenomai/pru_generic.bin</pre>
<br />
Configuración de fresadora 4 ejes (X,Y,Z).<br />
Los motores de los ejes X, Y, Z; los manejo con los drivers ACS606 (STEP/DIR).<br />
El cuarto motor lo manejo con el driver ST-M5045 (STEP/DIR). <br />
El taladro lo manejo con el driver hx-ws400 (PWM).<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">[PRUCONF]
DRIVER=hal_pru_generic
CONFIG=pru=1 num_stepgens=4 num_pwmgens=1
PRUBIN=xenomai/pru_generic.bin</pre>
<br />
La sección de EMC se encarga de informar la versión de la configuración, el nombre de la máquina y si se quiere ejecutar machinekit con mensajes que ayudan a depurar algun error que haya.<br />
<br />
En la GUI de gmoccapy_lcd7 no importa los nombres de version y machine ya que en el archivo python se manda el nombre de gmoccapy_lcd7 y la versión de la misma con lo que en la ventana aparece el nombre gmoccapy_lcd7 y version 1.0.<br />
<br />
En la GUI axis si se escribe lo que se haya puesto de nombre y versión.<br />
<br />
Ambas GUI ejecutan el modo en que se quiere usar la depuración utilizando 0 para que no se visualice los mensajes de procesos de machinekit.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">[EMC]
# Version of this INI file
VERSION = $Revision:1.0$
# Name of machine, for use with display, etc.
MACHINE = MF5.mill.4.axis
# Debug level, 0 means no messages. See src/emc/nml_int/emcglb.h for others
#DEBUG = 0x00000003
#DEBUG = 0x00000007
DEBUG = 0</pre>
<br />
La sección de DISPLAY en la variable DISPLAY ejecuta la GUI que se desea siempre y cuando este instalada; puede ser la axis, tkemc, gmoccapy, gscreen, touchy o la que modifique que es gmoccapy_lcd7.<br />
La variable CYCLE_TIME va detectar cambios y actualizar los procesos cada 0.200 segundos.<br />
La variable HELP_FILE va indicar un archivo de texto con información que puede ayudar a entender mejor machinekit, solo se usa en la GUI que este programada con tklinuxcnc como la axis.<br />
La variable POSITION_OFFSET configura machinekit ya se con posiciones relativas o posiciones absolutas.<br />
La variable POSITION_FEEDBACK determina si la posición que se requiere es dada por el programa machinekit o por la retroalimentación de los motores.<br />
La variable MAX_FEED_OVERRIDE indica que porcentaje usar para manipular velocidad y aceleración de los ejes. Si se usa 1.0 dara 100% de la velocidad máxima configurada, si es 1.5 dara el 150%.<br />
La variable PROGRAM_PREFIX indica la ruta donde se encuentran los archivos nc que pueden ser ejemplos en código G o subrutinas. Si se tiene una carpeta con los archivos de código G o subrutinas en otra ruta hay que cambiarlo.<br />
La variable INTRO_GRAFIC indica la imagen que sale al iniciar machinekit (se la puede cambiar colocando la imagen gif en /usr/share/linuxcnc).<br />
La variable INTRO_TIME se usa para que la imagen de introducción (machinekit.gif) se despliegue por 5 segundos.<br />
La variable INCREMENTS contiene los valores ya sean en pulgadas o mm que se quiera usar cuando se usa un eje para desplazar. Si esta seleccionado 10 mm en la gui y se selecciona el husillo x+, este se desplazara 10 mm en la dirección positiva del punto de referencia. En la GUI gmoccapy_lcd7 solo se puede poner hasta maximo 7 valores de lo contrario no ejecutara machinekit y saldrá un mensaje de error. <br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">[DISPLAY]
# Name of display program, e.g., tkemc
#DISPLAY = tkemc
#DISPLAY = axis
DISPLAY = gmoccapy_lcd7
# Cycle time, in seconds, that display will sleep between polls
CYCLE_TIME = 0.200
# Path to help file
HELP_FILE = tklinucnc.txt
# Initial display setting for position, RELATIVE or MACHINE
POSITION_OFFSET = RELATIVE
# Initial display setting for position, COMMANDED or ACTUAL
POSITION_FEEDBACK = ACTUAL
# Highest value that will be allowed for feed override, 1.0 = 100%
MAX_FEED_OVERRIDE = 1.5
# Prefix to be used
PROGRAM_PREFIX = /home/machinekit/machinekit/nc_files
# Introductory graphic
INTRO_GRAPHIC = machinekit.gif
INTRO_TIME = 5
# Increments for the JOG section
INCREMENTS = 10 1 0.1 0.01</pre>
<br />
La sección de FILTER se usa para poder llamar a extensiones de programas que se desea usar con machinekit, el .gcode se incluyo para poder leer las subrutinas que se usan en impresora 3d con programas como el slic3r.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">[FILTER]
PROGRAM_EXTENSION = .png,.gif,.jpg Grayscale Depth Image
PROGRAM_EXTENSION = .py Python Script
PROGRAM_EXTENSION = .gcode RepRap Flavour GCode
gcode = gcode-to-ngc
png = image-to-gcode
gif = image-to-gcode
jpg = image-to-gcode
py = python</pre>
<br />
La sección TASK es la encargada de controlar los ciclos de actualiación cuando se pausa el programa o se manda un comando para que realice un proceso.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">[TASK]
# Name of task controller program, e.g., milltask
TASK = milltask
# Cycle time, in seconds, that task controller will sleep between polls
CYCLE_TIME = 0.010</pre>
<br />
La sección RS274NGC se encarga de indicar el directorio de las subrutinas, codigo G y M personalizado y guardar los ultimos parámetros que machinekit uso en el archivo .var. Los parámetros del archivo .var guardan datos de la gui y de posición.<br />
<br />
Nota: no copiar los archivos "REMAP= " al archivo .ini hay que realizar unas configuraciones para que funcionen, eso será explicado en otro tutorial.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">[RS274NGC]
# Machinekit fdm subroutines path
SUBROUTINE_PATH = /usr/share/linuxcnc/ncfiles/remap-subroutines/fdm
# alternatively you can copy the subroutines a local subroutines folder
# SUBROUTINE_PATH = subroutines
# remapping Machinekit FDM GCodes
REMAP=G22 modalgroup=1 ngc=g22
REMAP=G23 modalgroup=1 ngc=g23
REMAP=G28 modalgroup=1 argspec=xyza ngc=g28
REMAP=G29 modalgroup=1 ngc=g29
REMAP=G29.1 modalgroup=1 argspec=xyz ngc=g29_1
REMAP=G29.2 modalgroup=1 argspec=xyz ngc=g29_2
REMAP=G30 modalgroup=1 argspec=pxy ngc=g30
REMAP=M104 modalgroup=10 argspec=iPt ngc=m104
REMAP=M106 modalgroup=10 argspec=iPt ngc=m106
REMAP=M107 modalgroup=10 argspec=it ngc=m107
REMAP=M109 modalgroup=10 argspec=tP ngc=m109
REMAP=M140 modalgroup=10 argspec=iP ngc=m140
REMAP=M141 modalgroup=10 argspec=iP ngc=m141
REMAP=M190 modalgroup=10 argspec=P ngc=m190
REMAP=M191 modalgroup=10 argspec=P ngc=m191
REMAP=M200 modalgroup=10 argspec=D ngc=m200
REMAP=M207 modalgroup=10 argspec=PQ ngc=m207
REMAP=M221 modalgroup=10 argspec=P ngc=m221
REMAP=M226 modalgroup=10 ngc=m226
REMAP=M280 modalgroup=10 argspec=itP ngc=m280
REMAP=M300 modalgroup=10 argspec=iqP ngc=m300
REMAP=M400 modalgroup=10 ngc=m400
REMAP=M420 modalgroup=10 argspec=itredp ngc=m420
REMAP=M700 modalgroup=10 argspec=iP ngc=m700
REMAP=M701 modalgroup=10 argspec=iP ngc=m701
REMAP=M702 modalgroup=10 argspec=iP ngc=m702
REMAP=M710 modalgroup=10 argspec=epq ngc=m710
# enable ini parameter passing
FEATURES = 4
# File containing interpreter variables
PARAMETER_FILE = MF5-Dual-Extrusion.var</pre>
<br />
La sección EMCMOT es utilizada para interactuar con las señales I/O, Analógicas y retroalimentación de señales de posicionamiento. Para saber mas dejo el siguiente link <a href="http://www.linuxcnc.org/docs/html/config/emc2hal.html#sec:motion" target="_blank">http://www.linuxcnc.org/docs/html/config/emc2hal.html#sec:motion.</a><br />
La variable que mas interesa en la de SERVO_PERIOD que se encarga de decir a machinekit que se trabaja con ese tiempo para controlar las señales de los motores (Pulso/Dirección). El valor se obtiene con una prueba de latencia que realiza machinekit en la Beaglebone Black. <br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">[EMCMOT]
EMCMOT = motmod
# Timeout for comm to emcmot, in seconds
COMM_TIMEOUT = 1.0
# Interval between tries to emcmot, in seconds
COMM_WAIT = 0.010
# Servo task period, in nanoseconds
SERVO_PERIOD = 1000000</pre>
<br />
La sección HAL ejecuta los archivos .hal siempre y cuando estan en la misma ruta que el archivo .ini, el archivo MF5-Dual-Extrusion va a contener toda la información para hacer funcionar la impresora 3d. Los archivos spindle_sim.hal y postgui.hal son ejemplos de que machinekit es capaz de ejecutar varios archivos .hal. Como ejemplo el archivo spindle_sim.hal tendra información de con que parámetros de desea ejecutar el taladro y a que GPIO estará unido, mientras que el archivo postgui.hal será el encargado de unir las GPIO con una GUI personalizada enlazada a la GUI principal del programa.<br />
<br />
En un tutorial que pretendo explicar como crear GUI's enlazadas a la GUI gmoccapy_lcd7 explicaré como funciona.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">[HAL]
# The run script first uses halcmd to execute any HALFILE
# files, and then to execute any individual HALCMD commands.
# list of hal config files to run through halcmd
# files are executed in the order in which they appear
HALFILE = MF5-Dual-Extrusion.hal
HALFILE = spindle_sim.hal
# Single file that is executed after the GUI has started.
POSTGUI_HALFILE = postgui.hal
# list of halcmd commands to execute
# commands are executed in the order in which they appear
#HALCMD = save neta</pre>
<br />
La sección de TRAJ es la encargada de configurar todos los parámetros con los qe va a funcionar la máqina.<br />
La variable Axes indica el número de ejes (DIR/STEP) que va utilizar la máquina, en este caso son 5 que pertenecen a los ejes X, Y, Z y A, B extrusores.<br />
La variable COORDINATES indica la letra en orden que se le asigna a los ejes, se puede poner X, Y, Z, A, C siendo C el extrusor número 2.<br />
La variable LINEAR_UNITS indica si se quiere trabajar en mm, pulgandas (in) o imperiales (imperial). Según esta configuración se va asignar las unidades a la variable INCREMENT explicada arriba.<br />
La variable ANGULAR_UNITS indica si se quiere trabajar en grados (degree), radianes (radian) o grad or gon (400 por ciclo).<br />
La variable MAX_ANGULAR_VELOCITY es la que determina la maxima velocidad angular.<br />
La variable DEFAULT_ANGULAR_VELOCITY determina el valor por defecto.<br />
La variable MAX_LINEAR_VELOCITY indica la máxima velocidad lineal, es muy importante este valor ya que si se deja muy alto se genera un error "hpg: stepgen.00.maxvel is too big for current step timings & position-scale, clipping to max possible", si el valor es muy bajo al configurar la velocidad en cada eje no surtira efecto al poner valores por encima del configurado aquí.<br />
La variable DEFAULT_VELOCITY sería la velocidad por defecto, yo lo pongo un 20% menos de la máxima velocidad.<br />
La variable POSITION_FILE guarda los valores en los cuales se encuentra, importante cuando se cierra machinekit y se vuelve a abrir estará en la útlima posición establecida o cuando se realiza un offset de un archivo de código G estará guardado en la posición a donde se lo arrastro.<br />
La variable NO_FORCE_HOMING=1 indica se machinekit puede mover los ejes (jogging) sin tener que hacer un homing (desplazar los ejes al punto de referencia inicial), cuando es cero se debe hacer un homing para poder mover los husillos.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">[TRAJ]
AXES = 5
COORDINATES = X Y Z A B
LINEAR_UNITS = mm
ANGULAR_UNITS = degree
MAX_ANGULAR_VELOCITY = 45.00
DEFAULT_ANGULAR_VELOCITY = 4.50
MAX_LINEAR_VELOCITY = 48.0
DEFAULT_VELOCITY = 40.0
CYCLE_TIME = 0.010
POSITION_FILE = position.txt
NO_FORCE_HOMING = 1</pre>
<br />
La sección AXIS_n donde n es el número del eje, indica la configuración de cada eje.<br />
<br />
Los eje X, Y, Z de mi máquina utilizan los driver ACS606 que controlan motores BLDC modelo BLM57180.<br />
En la hoja técnica del motor me dice que se necesitan de 4000 pulsos para dar una revolución, por lo tanto teniendo un husillo de 5 mm de paso se calcula la escala 4000pulsos/5mm = 800 pulsos/mm y eso es una revolucion del husillo.<br />
<br />
La variable TYPE es lineal ya que se convierte el movimento aungular del motor a lineal con los husillos.<br />
<br />
La velocidad máxima va a ser igual a 40.0 cuando se usa la pantalla LCD, pero si no se usará la velocidad es el doble. La pantalla LCD baja la velocidad de procesamiento para las señales STEP/DIR, por el momento no he podido realizar pruebas con un sd card clase 10 o cuando me llegue mi beaglebone black rev C y ejecute desde la eMMC actualizare esta informcaión. Es importante que cada uno realice pruebas aumento la velocidad hasta que de el error mensionado arriba.<br />
<br />
La variable STEPGEN_MAX_VEL es un 20% mas según la configuración recomendada en machienkit.<br />
<br />
La variable MAX_ACCELERATION yo la pongo 10 veces mayor a la velocidad pero es recomendable hacer pruebas ejecutando en modo MDI de la gui comandos y viendo si la aceleración es muy alta no desacelera a tiempo y puede pasarse de la posición requerida.<br />
<br />
La variable STEPGEN_MAX_ACC es un 20% mas que la máxima aceleración.<br />
<br />
La variable SCALE ya la explique arriba.<br />
<br />
Las variables MIN_LIMIT y MAX_LIMIT determinan el recorrido máximo y minimo, si se tiene un husillo de 800 mm y las rieles tienen una distancia de 200mm lo que va a recorrer el eje será máximo 600 mm por lo tanto se puede poner MIN_LIMIT =0 y MAX_LIMIT=600.0 o si se quiere MIN_LIMIT=100.0 y MAX_LIMIT=500.0 sabiendo que recorre en el eje negativo para llegar al punto de referencia inicial.<br />
<br />
Las variables FERROR y MIN_FERROR determinan cuanto es el error que se requiere que haya de posicionamiento, FERROR sería el error máximo en este caso 0.5mm y MIN_FERROR hasta cuanto es la resolución máxima que llega el motor para determinar el minimo error posible como ejemplo mi motor es 4000 pulsos y el husillo 5mm entonces el minimo error que tolera es de 5mm/4000pulsos = 0.00125.<br />
<br />
La variable HOME indica el punto de referencia del eje, en mi caso esta 0 pero estos pueden ser valores positivos o negativos, cuando se usa finales de carrera (limit switches) estos determinan la posición inicial a donde se desea que se desplace el husillo y de ahi se determina el valor de home que si el switch esta en un valor negtivo para llegar a cero el husillo podría recorrer hasta la mitad por ejemplo y el HOME_OFFSET ayudaría a que se desplace un distancia dada de donde se quedo ya se positiva o negativa.<br />
<br />
Nota: Aún no construyo mi máquina para afirmar esto de los finales de carrera y home por lo que las variables HOME_SEARCH_VEL, HOME_LATCH_VEL, HOME_USE_INDEX no las tomaré en cuenta por ahora.<br />
<br />
La variable HOME_IGNORE_LIMITS esta comenta por que no tengo la máquina por lo tanto no hago pruebas aún con finales de carrera. Cuando esta variables es YES o 1 quiere decir que se usarán finales de carrera.<br />
<br />
La variable HOME_SEQUENCE determina si se quiere hacer homing a todos los husillos que están configurados con un valor de 0. Si yo pongo X, Z y A HOME_SEQUENCE=0 todos estos harán un homing y el eje Y no hara el proceso de homing.<br />
<br />
Las variables DIRSETUP, DIRHOLD, STEPLEN y STEPSPACE usan valores que se indican en el datasheet del driver. El driver ACS606 dice que hay un tiempo de 5us entre el pulso y la dirección por lo tanto DIRSETUP es 5us=5000ns, DIRHOLD no se sabe, STEPLEN es 0.85us=850ns y STEPSPACE es 0.85us =850ns. Por lo tanto esos son los valores de configuración del driver, en la página de linuxcnc vienen los valores ya establecidos en nano segundos de los drivers más conocidos, este es el link <a href="http://wiki.linuxcnc.org/cgi-bin/wiki.pl?Stepper_Drive_Timing" target="_blank">http://wiki.linuxcnc.org/cgi-bin/wiki.pl?Stepper_Drive_Timing</a>.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">[AXIS_0]
#
# Step timing used in Shapeoko arduino electronics was 30 us steplen + 30 us stepspace
# That gave a 60 us step period = 16.7 KHz step freq
#
# X axis drive mechanics are:
# blm57180 = 4000 pulses/rev
#
# so Scale = 4000 pulses / 5 mm = 800 pulses/mm = 1 rev husillo
#
#
#
TYPE = LINEAR
MAX_VELOCITY = 40.0
# Set Stepgen max vel 20% higher than the axis
STEPGEN_MAX_VEL = 48.0
MAX_ACCELERATION = 400.0
# Set Stepgen max accel 10% higher than the axis
STEPGEN_MAX_ACC = 480.0
BACKLASH = 0.000
SCALE = 800.0
MIN_LIMIT = -1.0
MAX_LIMIT = 600.0
FERROR = 0.5
MIN_FERROR = 0.00125
HOME = 0.000
HOME_OFFSET = 0.00
#HOME_SEARCH_VEL = 0.10
#HOME_LATCH_VEL = -0.01
#HOME_USE_INDEX = YES
#HOME_IGNORE_LIMITS = YES
HOME_SEQUENCE = 0
# these are in nanoseconds
DIRSETUP = 5000
DIRHOLD = 6700
STEPLEN = 850
STEPSPACE = 850
[AXIS_1]
#
# Step timing used in Shapeoko arduino electronics was 30 us steplen + 30 us stepspace
# That gave a 60 us step period = 16.7 KHz step freq
#
# X axis drive mechanics are:
# blm57180 = 4000 pulses/rev
#
# so Scale = 4000 pulses / 5 mm = 800 pulses/mm = 1 rev husillo
#
#
#
TYPE = LINEAR
MAX_VELOCITY = 40.0
# Set Stepgen max vel 20% higher than the axis
STEPGEN_MAX_VEL = 48.0
MAX_ACCELERATION = 400.0
# Set Stepgen max accel 10% higher than the axis
STEPGEN_MAX_ACC = 480.0
BACKLASH = 0.000
SCALE = 800.0
MIN_LIMIT = -1.0
MAX_LIMIT = 400.0
FERROR = 0.5
MIN_FERROR = 0.00125
HOME = 0.000
HOME_OFFSET = 0.00
#HOME_SEARCH_VEL = 0.10
#HOME_LATCH_VEL = -0.01
#HOME_USE_INDEX = YES
#HOME_IGNORE_LIMITS = YES
HOME_SEQUENCE = 0
# these are in nanoseconds
DIRSETUP = 5000
DIRHOLD = 6700
STEPLEN = 850
STEPSPACE = 850
[AXIS_2]
#
# Step timing used in Shapeoko arduino electronics was 30 us steplen + 30 us stepspace
# That gave a 60 us step period = 16.7 KHz step freq
#
# X axis drive mechanics are:
# blm57180 = 4000 pulses/rev
#
# so Scale = 4000 pulses / 5 mm = 800 pulses/mm = 1 rev husillo
#
#
#
TYPE = LINEAR
MAX_VELOCITY = 40.0
# Set Stepgen max vel 20% higher than the axis
STEPGEN_MAX_VEL = 48.0
MAX_ACCELERATION = 400.0
# Set Stepgen max accel 10% higher than the axis
STEPGEN_MAX_ACC = 480.0
BACKLASH = 0.000
SCALE = 800.0
MIN_LIMIT = -1.0
MAX_LIMIT = 200.0
FERROR = 0.5
MIN_FERROR = 0.00125
HOME = 0.000
HOME_OFFSET = 0.00
#HOME_SEARCH_VEL = 0.10
#HOME_LATCH_VEL = -0.01
#HOME_USE_INDEX = YES
#HOME_IGNORE_LIMITS = YES
HOME_SEQUENCE = 0
# these are in nanoseconds
DIRSETUP = 500
DIRHOLD = 6700
STEPLEN = 850
STEPSPACE = 850
</pre>
<br />
Los ejes A y B del extrusor tienen la siguiente configuración, usan los driver pololu A4988.<br />
Para calcular la escala se realiza de acuerdo a los micropasos que se configure en los drivers, ejemplo si se usa el motor con 16 micropasos se calcula 200 pasos una vuelta.<br />
<br />
200pasos/1rev x 16micropasos/1paso = 3200 micropasos/revolución. Ahora si se extruye el filamento poniendo una revolución (por estar configurada la variable TYPE=ANGULAR) y da un valor de 40.35 mm entonces el valor del scale sería de 3200micropasos/1rev x 1rev/40.35mm=79.3060718ustep/mm.<br />
<br />
Las variables DIRSETUP=200, DIRHOLD=200, STEPLEN=1000 y STEPSPACE=1000; están en la configuración de drivers de linuxcnc. <a href="http://wiki.linuxcnc.org/cgi-bin/wiki.pl?Stepper_Drive_Timing" target="_blank">http://wiki.linuxcnc.org/cgi-bin/wiki.pl?Stepper_Drive_Timing</a><br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">[AXIS_3]
# TBD set up as a copy of axis_2 just to have a way to test the 4th axis driver on the K9
TYPE = ANGULAR
MAX_VELOCITY = 200.0
# Set Stepgen max vel 20% higher than the axis
STEPGEN_MAX_VEL = 240.0
MAX_ACCELERATION = 3000.0
# Set Stepgen max accel 10% higher than the axis
STEPGEN_MAX_ACC = 3600.0
BACKLASH = 0.000
SCALE = 79.3060718
MIN_LIMIT = -9999.0
MAX_LIMIT = 99999.0
FERROR = 1.0
MIN_FERROR = 0.50
HOME = 0.000
HOME_OFFSET = 0.00
#HOME_SEARCH_VEL = 0.10
#HOME_LATCH_VEL = -0.01
#HOME_USE_INDEX = YES
#HOME_IGNORE_LIMITS = YES
HOME_SEQUENCE = 0
# these are in nanoseconds
DIRSETUP = 200
DIRHOLD = 200
STEPLEN = 1000
STEPSPACE = 1000
[AXIS_4]
# TBD set up as a copy of axis_2 just to have a way to test the 4th axis driver on the K9
TYPE = ANGULAR
MAX_VELOCITY = 200.0
# Set Stepgen max vel 20% higher than the axis
STEPGEN_MAX_VEL = 240.0
MAX_ACCELERATION = 3000.0
# Set Stepgen max accel 10% higher than the axis
STEPGEN_MAX_ACC = 3600.0
BACKLASH = 0.000
SCALE = 79.3060718
MIN_LIMIT = -9999.0
MAX_LIMIT = 99999.0
FERROR = 1.0
MIN_FERROR = 0.50
HOME = 0.000
HOME_OFFSET = 0.00
#HOME_SEARCH_VEL = 0.10
#HOME_LATCH_VEL = -0.01
#HOME_USE_INDEX = YES
#HOME_IGNORE_LIMITS = YES
HOME_SEQUENCE = 0
# these are in nanoseconds
DIRSETUP = 5000
DIRHOLD = 8000
STEPLEN = 1500
STEPSPACE = 1500</pre>
<br />
Los archivos de configuración .ini y .hal los subiré a github cuando termine el tutorial de configuración hal.<br />
<br />
A continuación dejo unos videos que subi a youtube.<br />
<br />
Impresora 3D funcionamiento (motores)<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe width="320" height="266" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/YAXQvQuEwWo/0.jpg" src="https://www.youtube.com/embed/YAXQvQuEwWo?feature=player_embedded" frameborder="0" allowfullscreen></iframe></div>
<br />
Fresadora 4 ejes funcionamiento (motores)<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe width="320" height="266" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/JWhJc5Q5tdk/0.jpg" src="https://www.youtube.com/embed/JWhJc5Q5tdk?feature=player_embedded" frameborder="0" allowfullscreen></iframe></div>
<br />
<br />
<br />
Vichentehttp://www.blogger.com/profile/13532517773299729858noreply@blogger.com0tag:blogger.com,1999:blog-6209740641626143717.post-9142088100627269852015-07-28T01:44:00.000-07:002015-09-01T17:27:35.965-07:00Configurar los pines gpio para usar con Machinekit.Para poder utilizar los pines gpio de la Beaglebone Black con Machinekit es necesario definir si estos se van a usar como entradas o salidas. Para esto se usa un script que es el encargado de verificar si se puden o no usar los pines definidos, hay que revisar el archivo DTBO creado en el anterior tutorial para saber cuales son los pines que estan libres y no tener conflicto con los que usa el LCD.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"><code style="color: black; word-wrap: normal;"><your code="" here=""></your></code>dtbo_err () {
echo "Error loading device tree overlay file: $DTBO" >&2
exit 1
}
pin_err () {
echo "Error exporting pin:$PIN" >&2
exit 1
}
dir_err () {
echo "Error setting direction:$DIR on pin:$PIN" >&2
exit 1
} </pre>
<br />
Las funciones dtbo_err, pin_err y dir_err son las encargadas de lanzar un mensaje de error si algo se configuro mal. La primera función indica si existe el DTBO que se pretende cargar, la segunda si se puede exporta el pin que el ususario a asigando y el tercero si el pin permite usarse como entrada o salida (bidireccional).<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">SLOTS=/sys/devices/bone_capemgr.*/slots</pre>
<br />
SLOTS es el path (dirección de la ruta) donde se cargan los archivos DTBO, con esto se verifica si se encuentra o no el archivo DTBO que se requiere para usar con Machinekit.<br />
<br />
El siguiente código es el encargado de cargar el archivo BBB-LCNC-MF5 en /sys/devices/bone_capemgr.*/slots, si se ha cargado correctamente muestra el mensaje overlay found, caso contrario lanza el error de la función dtbo_err y finaliza el proceso. <br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"># Make sure required device tree overlay(s) are loaded
for DTBO in BBB-LCNC-MF5 ; do
if grep -q $DTBO $SLOTS ; then
echo $DTBO overlay found
else
echo Loading $DTBO overlay
sudo -A su -c "echo $DTBO > $SLOTS" || dtbo_err
sleep 1
fi
done;
if [ ! -r /sys/class/uio/uio0 ] ; then
echo PRU control files not found in /sys/class/uio/uio0 >&2
exit 1;
fi</pre>
<br />
El siguiente código indica si se han exportado todos los pines designados y si se pueden usar o como entradas o salidas.<br />
<br />
Para entradas in y para salida out en dos modos high o low. <br />
<br />
Para más información revisar el siguiente link <a href="http://www.armhf.com/using-beaglebone-black-gpios/" target="_blank">http://www.armhf.com/using-beaglebone-black-gpios/</a>. <br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"># Export GPIO pins
# This really only needs to be done to enable the low-level clocks for the GPIO
# modules. There is probably a better way to do this...
while read PIN DIR JUNK ; do
case "$PIN" in
""|\#*)
continue ;;
*)
[ -r /sys/class/gpio/gpio$PIN ] && continue
sudo -A su -c "echo $PIN > /sys/class/gpio/export" || pin_err
sudo -A su -c "echo $DIR > /sys/class/gpio/gpio$PIN/direction" || dir_err
;;
esac
done <<- EOF</pre>
<br />
La última parte de la configuración es definir cuales son los pines que se van a usar, los que estan con el símbolo de numeral son pines comentados que ayudan a ver cuales son los pines que pertenecen a otras funciones como los del LCD (HDMI), alimentación, eMMC, etc.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"># # J8.1 GND
# # J8.2 GND
# eMMC pins J8.3
# thru
# J8.6
66 in # J8.7 gpio2_2 -> X Max
67 in # J8.8 gpio2_3 -> X Min
69 in # J8.9 gpio2_5 -> Y Max
67 in # J8.10 gpio2_4 -> Y Min
45 in # J8.11 gpio1_13-> Encoder EQEP2B_in
44 in # J8.12 gpio1_12-> Encoder EQEP2A_in
23 out # J8.13 gpio0_23-> E0 Step
26 out # J8.14 gpio0_26-> E1 Dir
47 in # J8.15 gpio1_15-> Encoder EQEP2_strobe
46 in # J8.16 gpio1_14-> Encoder EQEP2_index
27 in # J8.17 gpio0_27-> Estop
65 out # J8.18 gpio2_1 -> Led
22 out # J8.19 gpio0_22-> Axis Enable
# eMMC pins J8.20
# thru
# J8.25
61 out # J8.26 gpio1_29-> ESTOP Out
# Start HDMI pins (LCD PINS)
# 86 out # J8.27 gpio2_22-> lcd VSYNC
# 88 in # J8.28 gpio2_24-> lcd PCLK
# 87 out # J8.29 gpio2_23-> lcd HSYNC
# 89 in # J8.30 gpio2_25-> lcd DE
# 10 in # J8.31 gpio0_10-> lcd B6
# 11 in # J8.32 gpio0_11-> lcd B7
# 9 in # J8.33 gpio0_9 -> lcd B5
# 81 out # J8.34 gpio2_17-> lcd B3
# 9 in # J8.35 gpio0_8 -> lcd B4
# 80 out # J8.36 gpio2_16-> lcd G7
# 78 in # J8.37 gpio2_14-> lcd G5
# 78 in # J8.38 gpio2_14-> lcd G6
# 76 out # J8.39 gpio2_12-> lcd G3
# 77 out # J8.40 gpio2_13-> lcd G4
# 74 out # J8.41 gpio2_10-> lcd R7
# 75 out # J8.42 gpio2_11-> lcd G2
# 72 out # J8.43 gpio2_8 -> lcd R5
# 73 out # J8.44 gpio2_9 -> lcd R6
# 70 out # J8.45 gpio2_6 -> lcd B3
# 71 out # J8.46 gpio2_7 -> lcd R4
# end HDMI pins
30 in # J9.11 gpio0_30-> Z Max
60 out # J9.12 gpio1_28-> E0 Dir
31 in # J9.13 gpio0_31-> Z Min
# 50 out # J9.14 gpio1_18-> lcd ehrpwma1
48 out # J9.15 gpio1_16-> FET 2 : E0
51 out # J9.16 gpio1_19-> PWM lathe
# 5 # J9.17 gpio0_5 -> spi0_cs0
# 4 # J9.18 gpio0_4 -> spi0_d1
# # J9.19 gpio0_13-> EEPROM/I2C
# # J9.20 gpio0_12-> EEPROM/I2C
# 3 # J9.21 gpio0_3 -> spi0_d0
# 2 # J9.22 gpio0_2 -> spi0_sclk
49 out # J9.23 gpio1_17-> Machine Power
15 out # J9.24 gpio0_15-> E1 Step
117 out # J9.25 gpio3_21-> A Dir
14 out # J9.26 gpio0_14 -> FET 1 : E1
115 out # J9.27 gpio3_19-> Z Dir
113 out # J9.28 gpio3_17-> Y Dir
111 out # J9.29 gpio3_15-> X Dir
112 out # J9.30 gpio3_16-> Y Step
110 out # J9.31 gpio3_14-> X Step
# # J9.32 VADC
# # J9.33 AIN4
# # J9.34 GND
# # J9.35 AIN6
# # J9.36 AIN5
# # J9.37 lcd-> AIN2 Y+
# # J9.38 lcd-> AIN3 Y-
# # J9.39 lcd-> AIN0 X+
# # J9.40 lcd-> AIN1 X-
# 20 in # J9.41 gpio0_20 set = in => other signal on pin used
116 out # J9.41 gpio3_20-> A Step
# 7 in # J9.42 gpio0_7 set = in => other signal on pin used
114 out # J9.42 gpio3_18-> Z Step
EOF</pre>
<br />
Esta es la forma más directa de configurar los pines pero ahora se usa la cape-universal y cape-bone-iio en la mayoría de configuraciones ARM como la CRAMPS, Probotix, PocketNC, Xylotex, etc.<br />
<br />
La cape-universal contiene toda la información de los pines para configurarlos a estos como PRUS, in, low, high, pull up, pull down, etc. Para poder usar la cape-universal con el LCD hay que modificar los pines que tengan conflicto, para hacelo viene el archivo .dts en la carpeta /opt/source/<span class="st"><i>beaglebone</i>-universal-io y también hay que revisar el archivo config-pin que contiene toda la información de las capas que estan en la ruta anteriormente mencionada.</span><br />
<span class="st"><br /></span>
<span class="st">https://github.com/machinekit/machinekit/blob/master/configs/ARM/BeagleBone/CRAMPS/setup.sh</span><br />
<span class="st">https://github.com/cdsteinkuehler/beaglebone-universal-io/blob/master/config-pin</span><br />
<span class="st">https://github.com/cdsteinkuehler/beaglebone-universal-io </span><br />
<span class="st"><br /></span>
<span class="st">El usar el DTBO cape-bone-iio con el LCD presenta conflictos ya que el LCD usa los pines análogos de la beaglebone black para poder reconocer la posición donde se ha pulsado en la pantalla táctil del LCD.</span><br />
<br />
<span class="st">Las placas como la CRAMPS vienen con una eeprom que se encarga de cargar de forma automática los pines configurados, carga la cape-universal y la cape-bone-iio desde la eeprom cuando bootea la Beaglebone Black. </span><br />
<span class="st"><br /></span>
<span class="st">La solución es usar comunicación SPI o I2C con dispositivos externos para la lectura de temperatura.</span><br />
<span class="st"><span class="st">En el avance de los tutoriales explicare como utilizar y configurarlos en Machinekit.</span></span><br />
<span class="st"><span class="st"> </span> </span><br />
<span class="st">Para poder designar el registro al que pertenece cada pin se debe aplicar la siguiente fórmula: </span><br />
<span class="st">Pin Kernel => ((gpio_bank)*32)+gpio_pin</span><br />
<br />
<span class="st">Ejemplo:</span><br />
<br />
<span class="st">J8.7 => GPIO2_2</span><br />
<span class="st">J8.7=> ((2)*32)+2</span><br />
<span class="st">J8.7=> 66</span><br />
<span class="st"><br /></span>
<span class="st">J8.17 => GPIO0_27</span><br /><span class="st">J8.17 => ((0)*32)+27</span><br />
<span class="st">J8.17 => 27</span><br />
<span class="st"><br /></span>
<span class="st">J9.42 => GPIO3_18</span><br /><span class="st">J9.42 => ((3)*32)+18</span><br /><span class="st">J9.42 => 114</span><br />
<span class="st"><br /></span>
<span class="st">En el archivo de excel que deje en el anterior tutorial esta calculado el registro de cada pin en las hojas LinuxCNC Pins P8 y LinuxCNC Pins P9, dejo el link abajo.</span><br />
<span class="st"><a href="https://docs.google.com/spreadsheets/d/1gJguoL4jJ8n-sZIFmKjDn6CQq6b7Xbvi4BpBzYeHAYE/edit?pli=1#gid=745489976" target="_blank">BBB_Pins</a></span><br />
<span class="st">Descarga.</span><br />
<span class="st"><a href="https://drive.google.com/file/d/0B6xWQnSH6ge5RGpMTGtiajE1T28/view" target="_blank">BBB_Pins.rar</a> </span><br />
<span class="st"><br /></span>
<span class="st">El código completo que he personalizado es el siguiente:</span><br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">#!/bin/bash
#This source file is provided under MIT License terms.
#Copyright (c) 2013 Calypso Ventures, Inc.
#
#Permission is hereby granted, free of charge, to any person obtaining a copy
#of this software and associated documentation files (the "Software"), to deal
#in the Software without restriction, including without limitation the rights
#to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
#copies of the Software, and to permit persons to whom the Software is
#furnished to do so, subject to the following conditions:
#
#The above copyright notice and this permission notice shall be included in
#all copies or substantial portions of the Software.
#
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
#IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
#FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
#AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
#LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
#OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
#THE SOFTWARE.
dtbo_err () {
echo "Error loading device tree overlay file: $DTBO" >&2
exit 1
}
pin_err () {
echo "Error exporting pin:$PIN" >&2
exit 1
}
dir_err () {
echo "Error setting direction:$DIR on pin:$PIN" >&2
exit 1
}
SLOTS=/sys/devices/bone_capemgr.*/slots
# Make sure required device tree overlay(s) are loaded
for DTBO in BBB-LCNC-MF5 ; do
if grep -q $DTBO $SLOTS ; then
echo $DTBO overlay found
else
echo Loading $DTBO overlay
sudo -A su -c "echo $DTBO > $SLOTS" || dtbo_err
sleep 1
fi
done;
if [ ! -r /sys/class/uio/uio0 ] ; then
echo PRU control files not found in /sys/class/uio/uio0 >&2
exit 1;
fi
# Export GPIO pins
# This really only needs to be done to enable the low-level clocks for the GPIO
# modules. There is probably a better way to do this...
while read PIN DIR JUNK ; do
case "$PIN" in
""|\#*)
continue ;;
*)
[ -r /sys/class/gpio/gpio$PIN ] && continue
sudo -A su -c "echo $PIN > /sys/class/gpio/export" || pin_err
sudo -A su -c "echo $DIR > /sys/class/gpio/gpio$PIN/direction" || dir_err
;;
esac
done <<- EOF
# # J8.1 GND
# # J8.2 GND
# eMMC pins J8.3
# thru
# J8.6
66 in # J8.7 gpio2_2 -> X Max
67 in # J8.8 gpio2_3 -> X Min
69 in # J8.9 gpio2_5 -> Y Max
67 in # J8.10 gpio2_4 -> Y Min
45 in # J8.11 gpio1_13-> Encoder EQEP2B_in
44 in # J8.12 gpio1_12-> Encoder EQEP2A_in
23 out # J8.13 gpio0_23-> E0 Step
26 out # J8.14 gpio0_26-> E1 Dir
47 in # J8.15 gpio1_15-> Encoder EQEP2_strobe
46 in # J8.16 gpio1_14-> Encoder EQEP2_index
27 in # J8.17 gpio0_27-> Estop
65 out # J8.18 gpio2_1 -> Led
22 out # J8.19 gpio0_22-> Axis Enable
# eMMC pins J8.20
# thru
# J8.25
61 out # J8.26 gpio1_29-> ESTOP Out
# Start HDMI pins (LCD PINS)
# 86 out # J8.27 gpio2_22-> lcd VSYNC
# 88 in # J8.28 gpio2_24-> lcd PCLK
# 87 out # J8.29 gpio2_23-> lcd HSYNC
# 89 in # J8.30 gpio2_25-> lcd DE
# 10 in # J8.31 gpio0_10-> lcd B6
# 11 in # J8.32 gpio0_11-> lcd B7
# 9 in # J8.33 gpio0_9 -> lcd B5
# 81 out # J8.34 gpio2_17-> lcd B3
# 9 in # J8.35 gpio0_8 -> lcd B4
# 80 out # J8.36 gpio2_16-> lcd G7
# 78 in # J8.37 gpio2_14-> lcd G5
# 78 in # J8.38 gpio2_14-> lcd G6
# 76 out # J8.39 gpio2_12-> lcd G3
# 77 out # J8.40 gpio2_13-> lcd G4
# 74 out # J8.41 gpio2_10-> lcd R7
# 75 out # J8.42 gpio2_11-> lcd G2
# 72 out # J8.43 gpio2_8 -> lcd R5
# 73 out # J8.44 gpio2_9 -> lcd R6
# 70 out # J8.45 gpio2_6 -> lcd B3
# 71 out # J8.46 gpio2_7 -> lcd R4
# end HDMI pins
30 in # J9.11 gpio0_30-> Z Max
60 out # J9.12 gpio1_28-> E0 Dir
31 in # J9.13 gpio0_31-> Z Min
# 50 out # J9.14 gpio1_18-> lcd ehrpwma1
48 out # J9.15 gpio1_16-> FET 2 : E0
51 out # J9.16 gpio1_19-> PWM lathe
# 5 # J9.17 gpio0_5 -> spi0_cs0
# 4 # J9.18 gpio0_4 -> spi0_d1
# # J9.19 gpio0_13-> EEPROM/I2C
# # J9.20 gpio0_12-> EEPROM/I2C
# 3 # J9.21 gpio0_3 -> spi0_d0
# 2 # J9.22 gpio0_2 -> spi0_sclk
49 out # J9.23 gpio1_17-> Machine Power
15 out # J9.24 gpio0_15-> E1 Step
117 out # J9.25 gpio3_21-> A Dir
14 out # J9.26 gpio0_14 -> FET 1 : E1
115 out # J9.27 gpio3_19-> Z Dir
113 out # J9.28 gpio3_17-> Y Dir
111 out # J9.29 gpio3_15-> X Dir
112 out # J9.30 gpio3_16-> Y Step
110 out # J9.31 gpio3_14-> X Step
# # J9.32 VADC
# # J9.33 AIN4
# # J9.34 GND
# # J9.35 AIN6
# # J9.36 AIN5
# # J9.37 lcd-> AIN2 Y+
# # J9.38 lcd-> AIN3 Y-
# # J9.39 lcd-> AIN0 X+
# # J9.40 lcd-> AIN1 X-
# 20 in # J9.41 gpio0_20 set = in => other signal on pin used
116 out # J9.41 gpio3_20-> A Step
# 7 in # J9.42 gpio0_7 set = in => other signal on pin used
114 out # J9.42 gpio3_18-> Z Step
EOF</pre>
Vichentehttp://www.blogger.com/profile/13532517773299729858noreply@blogger.com0tag:blogger.com,1999:blog-6209740641626143717.post-51329546998236140992015-07-22T13:21:00.000-07:002015-07-22T13:21:02.089-07:00Device Tree Overlay personalizada para Machinekit y LCD 7"El Device Tree Overlay que se explicará a continuación, permite definir cuales son los pines que se pueden usar en Machinekit y cuales se deben comentar para que no interfieran con el DTO compilado del LCD (DVK530-LCD7-01-00A1.dtbo).<br />
<br />
El archivo .dts que se indicará a continuación esta basado en la configuración de <a href="https://github.com/machinekit/machinekit/tree/master/configs/ARM/BeagleBone/PMDX-432/Device_Tree_Overlays" target="_blank">PMDX-432</a> de la Beaglebone Black. El Device Tree Overlay de PMDX-432 se llama <!--[if gte mso 9]><xml>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
</o:OfficeDocumentSettings>
</xml><![endif]--><br />
<!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:HyphenationZone>21</w:HyphenationZone>
<w:PunctuationKerning/>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>ES-EC</w:LidThemeOther>
<w:LidThemeAsian>X-NONE</w:LidThemeAsian>
<w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
<w:Compatibility>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:EnableOpenTypeKerning/>
<w:DontFlipMirrorIndents/>
<w:OverrideTableStyleHps/>
</w:Compatibility>
<m:mathPr>
<m:mathFont m:val="Cambria Math"/>
<m:brkBin m:val="before"/>
<m:brkBinSub m:val="--"/>
<m:smallFrac m:val="off"/>
<m:dispDef/>
<m:lMargin m:val="0"/>
<m:rMargin m:val="0"/>
<m:defJc m:val="centerGroup"/>
<m:wrapIndent m:val="1440"/>
<m:intLim m:val="subSup"/>
<m:naryLim m:val="undOvr"/>
</m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="false"
DefSemiHidden="false" DefQFormat="false" DefPriority="99"
LatentStyleCount="371">
<w:LsdException Locked="false" Priority="0" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 9"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 9"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 1"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 2"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 3"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 4"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 5"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 6"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 7"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 8"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 9"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footnote text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="header"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footer"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index heading"/>
<w:LsdException Locked="false" Priority="35" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="caption"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="table of figures"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="envelope address"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="envelope return"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footnote reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="line number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="page number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="endnote reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="endnote text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="table of authorities"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="macro"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toa heading"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 5"/>
<w:LsdException Locked="false" Priority="10" QFormat="true" Name="Title"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Closing"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Signature"/>
<w:LsdException Locked="false" Priority="1" SemiHidden="true"
UnhideWhenUsed="true" Name="Default Paragraph Font"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Message Header"/>
<w:LsdException Locked="false" Priority="11" QFormat="true" Name="Subtitle"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Salutation"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Date"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text First Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text First Indent 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Note Heading"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Block Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Hyperlink"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="FollowedHyperlink"/>
<w:LsdException Locked="false" Priority="22" QFormat="true" Name="Strong"/>
<w:LsdException Locked="false" Priority="20" QFormat="true" Name="Emphasis"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Document Map"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Plain Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="E-mail Signature"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Top of Form"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Bottom of Form"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal (Web)"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Acronym"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Address"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Cite"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Code"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Definition"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Keyboard"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Preformatted"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Sample"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Typewriter"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Variable"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal Table"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation subject"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="No List"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Contemporary"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Elegant"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Professional"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Subtle 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Subtle 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Balloon Text"/>
<w:LsdException Locked="false" Priority="39" Name="Table Grid"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Theme"/>
<w:LsdException Locked="false" SemiHidden="true" Name="Placeholder Text"/>
<w:LsdException Locked="false" Priority="1" QFormat="true" Name="No Spacing"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading"/>
<w:LsdException Locked="false" Priority="61" Name="Light List"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 1"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 1"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 1"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 1"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 1"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 1"/>
<w:LsdException Locked="false" SemiHidden="true" Name="Revision"/>
<w:LsdException Locked="false" Priority="34" QFormat="true"
Name="List Paragraph"/>
<w:LsdException Locked="false" Priority="29" QFormat="true" Name="Quote"/>
<w:LsdException Locked="false" Priority="30" QFormat="true"
Name="Intense Quote"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 1"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 1"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 1"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 1"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 1"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 1"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 1"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 1"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 2"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 2"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 2"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 2"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 2"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 2"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 2"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 2"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 2"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 2"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 2"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 2"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 2"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 2"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 3"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 3"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 3"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 3"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 3"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 3"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 3"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 3"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 3"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 3"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 3"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 3"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 3"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 3"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 4"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 4"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 4"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 4"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 4"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 4"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 4"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 4"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 4"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 4"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 4"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 4"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 4"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 4"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 5"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 5"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 5"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 5"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 5"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 5"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 5"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 5"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 5"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 5"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 5"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 5"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 5"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 5"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 6"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 6"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 6"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 6"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 6"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 6"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 6"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 6"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 6"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 6"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 6"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 6"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 6"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 6"/>
<w:LsdException Locked="false" Priority="19" QFormat="true"
Name="Subtle Emphasis"/>
<w:LsdException Locked="false" Priority="21" QFormat="true"
Name="Intense Emphasis"/>
<w:LsdException Locked="false" Priority="31" QFormat="true"
Name="Subtle Reference"/>
<w:LsdException Locked="false" Priority="32" QFormat="true"
Name="Intense Reference"/>
<w:LsdException Locked="false" Priority="33" QFormat="true" Name="Book Title"/>
<w:LsdException Locked="false" Priority="37" SemiHidden="true"
UnhideWhenUsed="true" Name="Bibliography"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="TOC Heading"/>
<w:LsdException Locked="false" Priority="41" Name="Plain Table 1"/>
<w:LsdException Locked="false" Priority="42" Name="Plain Table 2"/>
<w:LsdException Locked="false" Priority="43" Name="Plain Table 3"/>
<w:LsdException Locked="false" Priority="44" Name="Plain Table 4"/>
<w:LsdException Locked="false" Priority="45" Name="Plain Table 5"/>
<w:LsdException Locked="false" Priority="40" Name="Grid Table Light"/>
<w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark"/>
<w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful"/>
<w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 1"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 1"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 1"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 1"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 1"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 2"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 2"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 2"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 2"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 2"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 3"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 3"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 3"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 3"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 3"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 4"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 4"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 4"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 4"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 4"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 5"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 5"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 5"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 5"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 5"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 6"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 6"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 6"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 6"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 6"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="46" Name="List Table 1 Light"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark"/>
<w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful"/>
<w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 1"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 1"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 1"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 1"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 1"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 2"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 2"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 2"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 2"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 2"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 3"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 3"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 3"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 3"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 3"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 4"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 4"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 4"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 4"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 4"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 5"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 5"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 5"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 5"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 5"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 6"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 6"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 6"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 6"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 6"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 6"/>
</w:LatentStyles>
</xml><![endif]--><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Tabla normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin-top:0cm;
mso-para-margin-right:0cm;
mso-para-margin-bottom:8.0pt;
mso-para-margin-left:0cm;
line-height:107%;
mso-pagination:widow-orphan;
font-size:11.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-fareast-language:EN-US;}
</style>
<![endif]-->
<br />
<div class="MsoNormal">
BB-BLACK-LCNC-K9-00A0.dts.</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Las dos primeras lineas indican cuál es la versión del dts y que el archivo es un plugin, el corchete indica el punto de inicio del programa, compatible es el que va a determinar con que plataformas funcionara el DT Overlay y la parte de identification es el nombre y la versión con la que aparecera nuestro DT Overlay.</div>
<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"><code style="color: black; word-wrap: normal;"><your code="" here=""></your></code>/dts-v1/;
/plugin/;
/ {
compatible = "ti,beaglebone", "ti,beaglebone-black";
/* identification */
part-number = "BBB-LCNC-MF5";
version = "00A0"; </pre>
<br />
En exclusive-use se pone todos los pines que se desea utilizar y para poder guiarse se pueden comentar los que no se van a usar, en este pedaso de código los gpio que ocupa la emmc de la beaglebone black se usa porque carga el S.O. Linux Debian desde la emmc pero si no se usara la emmc tranquilamente se podría deshabilitar del archivo /boot/uEnv.txt y descomenta los pines de la eMMC.<br />
<br />
Los pines nombrados como Libre son los que están disponibles para usar con Machinekit y que no interfieren con la pantalla LCD, pero pueden interferir con otros pines usados en comunicación SPI o I2C o UART. Si se pretende usar esos pines con otros dts se los debe comentar.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"> /* state the resources this cape uses */
exclusive-use =
/* the pin header uses */
/* "J8.3", gpio1_6 eMMC*/
/* "J8.4", gpio1_7 eMMC*/
/* "J8.5", gpio1_2 eMMC*/
/* "J8.6", gpio1_3 eMMC*/
"J8.7", /* gpio2_2 -> Libre*/
"J8.8", /* gpio2_3 -> Libre*/
"J8.9", /* gpio2_5 -> Libre*/
"J8.10", /* gpio2_4 -> Libre*/
"J8.11", /* gpio1_13-> lcd R1 -> Libre*/</pre>
<br />
En la parte de "the hardware IP uses" se ponen los mismos pines que se utilizan en "the pin header uses", como se ve en el pedazo de código gpio1_6, gpio1_7, gpio1_2, gpio1_3; pertenecen a los pines J8.3, J8.4, J8.5 y J8.6 respectivamente, pero estos no se usaran ya que estan comentados. Los demás son los que funcionarán con Machinekit.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"> /* the hardware IP uses */
/* "gpio1_6", */
/* "gpio1_7", */
/* "gpio1_2", */
/* "gpio1_3", */
"gpio2_2",
"gpio2_3",
"gpio2_5",
"gpio2_4",
"gpio1_13", </pre>
<br />
En fragment se pone cuales van a ser las funciones que van a realizar los pines habilitados en "exclusive-use", "target" hace referencia al microcontrolador que usa la beaglebone y beaglebone black. "__overlay__" se usa para dar inicio a los pines que van a ser usados según el registro y tipo de modo que se desee.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">fragment@0 {
target = <&am33xx_pinmux>;
__overlay__ {</pre>
<br />
"MF5_gpio_pins: MF5_gpio_pins" es el nombre que se le va a dar todo el grupo de pines que se usaran en este DT Overlay. El siguiente archivo que he subido <a href="https://docs.google.com/spreadsheets/d/1gJguoL4jJ8n-sZIFmKjDn6CQq6b7Xbvi4BpBzYeHAYE/edit?pli=1#gid=745489976" target="_blank">BBB-Pins</a>, contiene la información de las direcciones de los pines y calcula el modo del pin. Descarga: <a href="https://drive.google.com/file/d/0B6xWQnSH6ge5RGpMTGtiajE1T28/view?usp=sharing" target="_blank">BB-Pins.rar</a>.<br />
<br />
La primera columna indica la dirección de los pines esta se calcula con el register offset 44e10*** con una base de 0x800. si el register offset del pin J8.3 es 0x818 (44e10818) y de base siempre se tiene 0x800 (44e10800), entonces se resta el 0x818 - 0x800 = 0x018. El segundo valor de la columna es el modo con el cuál se quiere configurar el pin existen 8 tipos de modos los cuales se indica en el documento de excel. Como utilizár estos indicaré en otro tutorial, por el momento dejando a los pines con el modo default 0x3F funciona perfectamente.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">MF5_gpio_pins: MF5_gpio_pins {
pinctrl-single,pins = <
/* 0x018 mmc J8.3 gpio1_6 */
/* 0x01C mmc J8.4 gpio1_7 */
/* 0x008 mmc J8.5 gpio1_2 */
/* 0x00C mmc J8.6 gpio1_3 */
0x090 0x3F /* J8.7 gpio2_2 */
0x094 0x3F /* J8.8 gpio2_3 */
0x09C 0x3F /* J8.9 gpio2_5 */
0x098 0x3F /* J8.10 gpio2_4 */
0x034 0x3F /* J8.11 gpio1_13 */
0x030 0x3F /* J8.12 gpio1_12 */
0x024 0x3F /* J8.13 gpio0_23 */ </pre>
<br />
El último fragmento es el que habilita toda la configuración que se ha realizado anteriormente en "<!--[if gte mso 9]><xml>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
</o:OfficeDocumentSettings>
</xml><![endif]--><br />
<!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:HyphenationZone>21</w:HyphenationZone>
<w:PunctuationKerning/>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>ES-EC</w:LidThemeOther>
<w:LidThemeAsian>X-NONE</w:LidThemeAsian>
<w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
<w:Compatibility>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:EnableOpenTypeKerning/>
<w:DontFlipMirrorIndents/>
<w:OverrideTableStyleHps/>
</w:Compatibility>
<m:mathPr>
<m:mathFont m:val="Cambria Math"/>
<m:brkBin m:val="before"/>
<m:brkBinSub m:val="--"/>
<m:smallFrac m:val="off"/>
<m:dispDef/>
<m:lMargin m:val="0"/>
<m:rMargin m:val="0"/>
<m:defJc m:val="centerGroup"/>
<m:wrapIndent m:val="1440"/>
<m:intLim m:val="subSup"/>
<m:naryLim m:val="undOvr"/>
</m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="false"
DefSemiHidden="false" DefQFormat="false" DefPriority="99"
LatentStyleCount="371">
<w:LsdException Locked="false" Priority="0" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 9"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 9"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 1"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 2"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 3"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 4"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 5"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 6"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 7"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 8"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 9"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footnote text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="header"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footer"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index heading"/>
<w:LsdException Locked="false" Priority="35" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="caption"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="table of figures"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="envelope address"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="envelope return"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footnote reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="line number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="page number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="endnote reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="endnote text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="table of authorities"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="macro"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toa heading"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 5"/>
<w:LsdException Locked="false" Priority="10" QFormat="true" Name="Title"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Closing"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Signature"/>
<w:LsdException Locked="false" Priority="1" SemiHidden="true"
UnhideWhenUsed="true" Name="Default Paragraph Font"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Message Header"/>
<w:LsdException Locked="false" Priority="11" QFormat="true" Name="Subtitle"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Salutation"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Date"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text First Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text First Indent 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Note Heading"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Block Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Hyperlink"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="FollowedHyperlink"/>
<w:LsdException Locked="false" Priority="22" QFormat="true" Name="Strong"/>
<w:LsdException Locked="false" Priority="20" QFormat="true" Name="Emphasis"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Document Map"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Plain Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="E-mail Signature"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Top of Form"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Bottom of Form"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal (Web)"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Acronym"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Address"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Cite"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Code"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Definition"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Keyboard"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Preformatted"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Sample"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Typewriter"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Variable"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal Table"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation subject"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="No List"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Contemporary"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Elegant"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Professional"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Subtle 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Subtle 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Balloon Text"/>
<w:LsdException Locked="false" Priority="39" Name="Table Grid"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Theme"/>
<w:LsdException Locked="false" SemiHidden="true" Name="Placeholder Text"/>
<w:LsdException Locked="false" Priority="1" QFormat="true" Name="No Spacing"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading"/>
<w:LsdException Locked="false" Priority="61" Name="Light List"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 1"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 1"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 1"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 1"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 1"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 1"/>
<w:LsdException Locked="false" SemiHidden="true" Name="Revision"/>
<w:LsdException Locked="false" Priority="34" QFormat="true"
Name="List Paragraph"/>
<w:LsdException Locked="false" Priority="29" QFormat="true" Name="Quote"/>
<w:LsdException Locked="false" Priority="30" QFormat="true"
Name="Intense Quote"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 1"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 1"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 1"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 1"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 1"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 1"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 1"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 1"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 2"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 2"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 2"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 2"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 2"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 2"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 2"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 2"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 2"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 2"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 2"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 2"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 2"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 2"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 3"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 3"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 3"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 3"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 3"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 3"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 3"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 3"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 3"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 3"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 3"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 3"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 3"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 3"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 4"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 4"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 4"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 4"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 4"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 4"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 4"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 4"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 4"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 4"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 4"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 4"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 4"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 4"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 5"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 5"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 5"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 5"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 5"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 5"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 5"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 5"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 5"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 5"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 5"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 5"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 5"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 5"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 6"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 6"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 6"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 6"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 6"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 6"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 6"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 6"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 6"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 6"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 6"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 6"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 6"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 6"/>
<w:LsdException Locked="false" Priority="19" QFormat="true"
Name="Subtle Emphasis"/>
<w:LsdException Locked="false" Priority="21" QFormat="true"
Name="Intense Emphasis"/>
<w:LsdException Locked="false" Priority="31" QFormat="true"
Name="Subtle Reference"/>
<w:LsdException Locked="false" Priority="32" QFormat="true"
Name="Intense Reference"/>
<w:LsdException Locked="false" Priority="33" QFormat="true" Name="Book Title"/>
<w:LsdException Locked="false" Priority="37" SemiHidden="true"
UnhideWhenUsed="true" Name="Bibliography"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="TOC Heading"/>
<w:LsdException Locked="false" Priority="41" Name="Plain Table 1"/>
<w:LsdException Locked="false" Priority="42" Name="Plain Table 2"/>
<w:LsdException Locked="false" Priority="43" Name="Plain Table 3"/>
<w:LsdException Locked="false" Priority="44" Name="Plain Table 4"/>
<w:LsdException Locked="false" Priority="45" Name="Plain Table 5"/>
<w:LsdException Locked="false" Priority="40" Name="Grid Table Light"/>
<w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark"/>
<w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful"/>
<w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 1"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 1"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 1"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 1"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 1"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 2"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 2"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 2"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 2"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 2"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 3"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 3"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 3"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 3"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 3"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 4"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 4"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 4"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 4"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 4"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 5"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 5"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 5"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 5"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 5"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 6"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 6"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 6"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 6"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 6"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="46" Name="List Table 1 Light"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark"/>
<w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful"/>
<w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 1"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 1"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 1"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 1"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 1"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 2"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 2"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 2"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 2"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 2"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 3"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 3"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 3"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 3"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 3"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 4"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 4"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 4"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 4"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 4"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 5"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 5"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 5"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 5"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 5"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 6"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 6"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 6"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 6"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 6"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 6"/>
</w:LatentStyles>
</xml><![endif]--><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Tabla normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin-top:0cm;
mso-para-margin-right:0cm;
mso-para-margin-bottom:8.0pt;
mso-para-margin-left:0cm;
line-height:107%;
mso-pagination:widow-orphan;
font-size:11.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-fareast-language:EN-US;}
</style>
<![endif]-->
<br />
<div class="MsoNormal">
pinctrl-0" se pone el mismo nombre que se utilizó para el grupo de pines del DT Overlay.</div>
<div class="MsoNormal">
<br /></div>
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">fragment@1 {
target = <&pruss>;
__overlay__ {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&MF5_gpio_pins>;
};
};</pre>
<br />
Código completo del .dts<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">//This source file is provided under MIT License terms.
//Copyright (c) 2013 Calypso Ventures, Inc.
//
//Permission is hereby granted, free of charge, to any person obtaining a copy
//of this software and associated documentation files (the "Software"), to deal
//in the Software without restriction, including without limitation the rights
//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
//copies of the Software, and to permit persons to whom the Software is
//furnished to do so, subject to the following conditions:
//
//The above copyright notice and this permission notice shall be included in
//all copies or substantial portions of the Software.
//
//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
//THE SOFTWARE.
/dts-v1/;
/plugin/;
/ {
compatible = "ti,beaglebone", "ti,beaglebone-black";
/* identification */
part-number = "BBB-LCNC-MF5";
version = "00A0";
/* state the resources this cape uses */
exclusive-use =
/* the pin header uses */
/* "J8.3", gpio1_6 eMMC*/
/* "J8.4", gpio1_7 eMMC*/
/* "J8.5", gpio1_2 eMMC*/
/* "J8.6", gpio1_3 eMMC*/
"J8.7", /* gpio2_2 -> Libre*/
"J8.8", /* gpio2_3 -> Libre*/
"J8.9", /* gpio2_5 -> Libre*/
"J8.10", /* gpio2_4 -> Libre*/
"J8.11", /* gpio1_13-> lcd R1 -> Libre*/
"J8.12", /* gpio1_12-> lcd G1 -> Libre*/
"J8.13", /* gpio0_23-> lcd G0 -> Libre*/
"J8.14", /* gpio0_26-> lcd R0 -> Libre*/
"J8.15", /* gpio1_15-> lcd R2 -> Libre*/
"J8.16", /* gpio1_14-> lcd B2 -> Libre*/
"J8.17", /* gpio0_27-> lcd B1 -> Libre*/
"J8.18", /* gpio2_1 -> Libre*/
"J8.19", /* gpio0_22-> lcd B0 -> Libre*/
/* "J8.20", gpio1_31 eMMC*/
/* "J8.21", gpio1_30 eMMC*/
/* "J8.22", gpio1_5 eMMC*/
/* "J8.23", gpio1_4 eMMC*/
/* "J8.24", gpio1_1 eMMC*/
/* "J8.25", gpio1_0 eMMC*/
"J8.26", /* gpio1_29-> Libre*/
/* "J8.27", gpio2_22-> lcd VSYNC*/
/* "J8.28", gpio2_24-> lcd PCLK*/
/* "J8.29", gpio2_23-> lcd HSYNC*/
/* "J8.30", gpio2_25-> lcd DE*/
/* "J8.31", gpio0_10-> lcd B6*/
/* "J8.32", gpio0_11-> lcd B7*/
/* "J8.33", gpio0_9 -> lcd B5*/
/* "J8.34", gpio2_17-> lcd B3*/
/* "J8.35", gpio0_8 -> lcd B4*/
/* "J8.36", gpio2_16-> lcd G7*/
/* "J8.37", gpio2_14-> lcd G5*/
/* "J8.38", gpio2_15-> lcd G6*/
/* "J8.39", gpio2_12-> lcd G3*/
/* "J8.40", gpio2_13-> lcd G4*/
/* "J8.41", gpio2_10-> lcd R7*/
/* "J8.42", gpio2_11-> lcd G2*/
/* "J8.43", gpio2_8 -> lcd R5*/
/* "J8.44", gpio2_9 -> lcd R6*/
/* "J8.45", gpio2_6 -> lcd R3*/
/* "J8.46", gpio2_7 -> lcd R4*/
"J9.11", /* gpio0_30-> Libre*/
"J9.12", /* gpio1_28-> Libre*/
"J9.13", /* gpio0_31-> Libre*/
/* "J9.14", gpio1_18-> LCD ehrpwm1A*/
"J9.15", /* gpio1_16-> Libre*/
"J9.16", /* gpio1_19-> Libre*/
"J9.17", /* gpio0_5 -> Libre*/
"J9.18", /* gpio0_4 -> Libre*/
/* "J9.19", gpio0_13-> EEPROM/I2C*/
/* "J9.20", gpio0_12-> EEPROM/I2C*/
"J9.21", /* gpio0_3 -> Libre*/
"J9.22", /* gpio0_2 -> Libre*/
"J9.23", /* gpio1_17-> Libre*/
"J9.24", /* gpio0_15-> Libre*/
"J9.25", /* gpio3_21-> Libre*/
"J9.26", /* gpio0_14-> Libre*/
"J9.27", /* gpio3_19-> Libre*/
"J9.28", /* gpio3_17-> Libre*/
"J9.29", /* gpio3_15-> Libre*/
"J9.30", /* gpio3_16-> Libre*/
"J9.31", /* gpio3_14-> Libre*/
"J9.41", /* gpio3_20-> Libre*/
"J9.42", /* gpio3_18-> Libre*/
/* the hardware IP uses */
/* "gpio1_6", */
/* "gpio1_7", */
/* "gpio1_2", */
/* "gpio1_3", */
"gpio2_2",
"gpio2_3",
"gpio2_5",
"gpio2_4",
"gpio1_13",
"gpio1_12",
"gpio0_23",
"gpio0_26",
"gpio1_15",
"gpio1_14",
"gpio0_27",
"gpio2_1",
"gpio0_22",
/* "gpio1_31", */
/* "gpio1_30", */
/* "gpio1_5", */
/* "gpio1_4", */
/* "gpio1_1", */
/* "gpio1_0", */
"gpio1_29",
/* "gpio2_22", */
/* "gpio2_24", */
/* "gpio2_23", */
/* "gpio2_25", */
/* "gpio0_10", */
/* "gpio0_11", */
/* "gpio0_9", */
/* "gpio2_17", */
/* "gpio0_8", */
/* "gpio2_16", */
/* "gpio2_14", */
/* "gpio2_15", */
/* "gpio2_12", */
/* "gpio2_13", */
/* "gpio2_10", */
/* "gpio2_11", */
/* "gpio2_8", */
/* "gpio2_9", */
/* "gpio2_6", */
/* "gpio2_7", */
"gpio0_30",
"gpio1_28",
"gpio0_31",
/* "gpio1_18", */
"gpio1_16",
"gpio1_19",
"gpio0_5",
"gpio0_4",
/* "gpio0_13", */
/* "gpio0_12", */
"gpio0_3",
"gpio0_2",
"gpio1_17",
"gpio0_15",
"gpio3_21",
"gpio0_14",
"gpio3_19",
"gpio3_17",
"gpio3_15",
"gpio3_16",
"gpio3_14",
"gpio3_20",
"gpio3_18",
"pru0";
fragment@0 {
target = <&am33xx_pinmux>;
__overlay__ {
MF5_gpio_pins: MF5_gpio_pins {
pinctrl-single,pins = <
/* 0x018 mmc J8.3 gpio1_6 */
/* 0x01C mmc J8.4 gpio1_7 */
/* 0x008 mmc J8.5 gpio1_2 */
/* 0x00C mmc J8.6 gpio1_3 */
0x090 0x3F /* J8.7 gpio2_2 */
0x094 0x3F /* J8.8 gpio2_3 */
0x09C 0x3F /* J8.9 gpio2_5 */
0x098 0x3F /* J8.10 gpio2_4 */
0x034 0x3F /* J8.11 gpio1_13 */
0x030 0x3F /* J8.12 gpio1_12 */
0x024 0x3F /* J8.13 gpio0_23 */
0x028 0x3F /* J8.14 gpio0_26 */
0x03C 0x3F /* J8.15 gpio1_15 */
0x038 0x3F /* J8.16 gpio1_14 */
0x02C 0x3F /* J8.17 gpio0_27 */
0x08C 0x3F /* J8.18 gpio2_1 */
0x020 0x3F /* J8.19 gpio0_22 */
/* 0x084 mmc J8.20 gpio1_31 */
/* 0x080 mmc J8.21 gpio1_30 */
/* 0x014 mmc J8.22 gpio1_5 */
/* 0x010 mmc J8.23 gpio1_4 */
/* 0x004 mmc J8.24 gpio1_1 */
/* 0x000 mmc J8.25 gpio1_0 */
0x07C 0x3F /* J8.26 gpio1_29 */
/* 0x0E0 0x3F J8.27 gpio2_22 */
/* 0x0E8 0x3F J8.28 gpio2_24 */
/* 0x0E4 0x3F J8.29 gpio2_23 */
/* 0x0EC 0x3F J8.30 gpio2_25 */
/* 0x0D8 0x3F J8.31 gpio0_10 */
/* 0x0DC 0x3F J8.32 gpio0_11 */
/* 0x0D4 0x3F J8.33 gpio0_9 */
/* 0x0CC 0x3F J8.34 gpio2_17 */
/* 0x0D0 0x3F J8.35 gpio0_8 */
/* 0x0C8 0x3F J8.36 gpio2_16 */
/* 0x0C0 0x3F J8.37 gpio2_14 */
/* 0x0C4 ??? J8.38 gpio2_15 */
/* 0x0B8 0x3F J8.39 gpio2_12 */
/* 0x0BC 0x3F J8.40 gpio2_13 */
/* 0x0B0 0x3F J8.41 gpio2_10 */
/* 0x0B4 0x3F J8.42 gpio2_11 */
/* 0x0A8 0x3F J8.43 gpio2_8 */
/* 0x0AC 0x3F J8.44 gpio2_9 */
/* 0x0A0 0x3F J8.45 gpio2_6 */
/* 0x0A4 0x3F J8.46 gpio2_7 */
0x070 0x3F /* J9.11 gpio0_30 */
0x078 0x3F /* J9.12 gpio1_28 */
0x074 0x3F /* J9.13 gpio0_31 */
/* 0x048 0x3F J9.14 gpio1_18 */
0x040 0x3F /* J9.15 gpio1_16 */
0x04C 0x3F /* J9.16 gpio1_19 */
0x15C 0x3F /* J9.17 gpio0_5 */
0x158 0x3F /* J9.18 gpio0_4 */
/* 0x17C N/C J9.19 gpio0_13 */
/* 0x178 N/C J9.20 gpio0_12 */
0x154 0x3F /* J9.21 gpio0_3 */
0x150 0x3F /* J9.22 gpio0_2 */
0x044 0x3F /* J9.23 gpio1_17 */
0x184 0x3F /* J9.24 gpio0_15 */
0x1AC 0x3F /* J9.25 gpio3_21 */
0x180 0x3F /* J9.26 gpio0_14 */
0x1A4 0x3F /* J9.27 gpio3_19 */
0x19C 0x3F /* J9.28 gpio3_17 */
0x194 0x3F /* J9.29 gpio3_15 */
0x198 0x3F /* J9.30 gpio3_16 */
0x190 0x3F /* J9.31 gpio3_14 */
0x1A8 0x3F /* J9.41 gpio3_20 */
0x1A0 0x3F /* J9.42 gpio3_18 */
>;
};
};
};
fragment@1 {
target = <&pruss>;
__overlay__ {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&MF5_gpio_pins>;
};
};
};
</pre>
<br />
Para probarlo crear un archivo llamado BBB-LCNC-MF5-00A0.dts y pegar toda la info de arriba.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">touch BBB-LCNC-MF5-00A0.dts
nano BBB-LCNC-MF5-00A0.dts
</pre>
<br />
El siguiente código es un script para compilar el archivo .dts y copiarlo a /lib/firmware.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">#!/bin/sh
#This source file is provided under MIT License terms.
#Copyright (c) 2013 Calypso Ventures, Inc.
#
#Permission is hereby granted, free of charge, to any person obtaining a copy
#of this software and associated documentation files (the "Software"), to deal
#in the Software without restriction, including without limitation the rights
#to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
#copies of the Software, and to permit persons to whom the Software is
#furnished to do so, subject to the following conditions:
#
#The above copyright notice and this permission notice shall be included in
#all copies or substantial portions of the Software.
#
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
#IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
#FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
#AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
#LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
#OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
#THE SOFTWARE.
dtc -O dtb -o BBB-LCNC-MF5-00A0.dtbo -b 0 -@ BBB-LCNC-MF5-00A0.dts && \
cp BBB-LCNC-MF5-00A0.dtbo /lib/firmware/</pre>
<br />
Para ejecutarlo poner en la misma carpeta que el archivo BBB-LCNC-MF5-00A0.dts.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">touch dtc.sh
nano dtc.sh
(pegar codigo script)
sudo ./dtc.sh
</pre>
<br />
Por ultimo ejecutar el Device Tree Overlay creado.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">sudo su
cd /lib/firmware
echo BBB-LCNC-MF5 > /sys/devices/bone_capemgr.*/slots
cd /sys/kernel/debug/pinctrl/44e10800.pinmux
cat pinmux-pins | more
</pre>
<br />
Si todo funcionó perfectamente se verán todos los pines que estan habilitados como los del LCD y BBB-LCNC-MF5.<br />
<br />
El siguiente tutorial es como se logra la configuración para exportar los pines como entradas o salidas y utilizarlos con Machinekit (LinuxCNC), estos pines funcionarán en base al DT Overlay creado en este tutorial.<br />
<!--[if gte mso 9]><xml>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
</o:OfficeDocumentSettings>
</xml><![endif]-->Vichentehttp://www.blogger.com/profile/13532517773299729858noreply@blogger.com0tag:blogger.com,1999:blog-6209740641626143717.post-36089128154046795492015-07-21T21:32:00.000-07:002015-07-21T23:24:09.747-07:00Device Tree Overlays con LCD de 7" (waveshare)En este tutorial se va a enseñar como configurar los pines que utiliza el LCD junto con los pines que van a ser usados para controlar las señales que van a funcionar con Machinekit (LinuxCNC) para controladores de motores, sensores, leds, ventiladores, etc. Esto permite que no haya conflictos al momento de utilizar el LCD junto con Machinekit.<br />
<br />
La siguiente imagen representa el esquema del circuito que utiliza el LCD de waveshare, los pines que están dentro del recuadro de color rojo son los que conectan el LCD de 7" a la Beaglebone Black.<br />
<br />
<img alt="" onmouseout="this.width=640;this.height=450;" onmouseover="this.width=800;this.height=600;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgC-1Db3cpujt9oRAqOiGYr1EG1GAEWqHq8cukjrUfIEibc7ZPtlZXvvKyXL1hAIdXnDHhlWAQVEPEybg6OSkUPL9r4VGxpJ_8Ak3QlYLTCuI2WNstWvlPM0w9nNL5FcdO-Gu3dX2qHkyU/s1600/Esquema-Circuito-LCD7.jpg" width="640" />
<br />
<br />
Para estar seguro que solo esos son los pines que usa el LCD hay que tambien revisar el .dts del LCD (DVK530-LCD7-01-00A0.dts), este es uno de los archivos que están dentro del archivo rar que se puede descargar del tutorial <a href="http://bbb-machinekit-lcd7.blogspot.com/2015/07/instalacion-de-lcd-7-pulgadas-waveshare.html" target="_blank">Instalación de LCD 7 pulgadas (waveshare) en Machinekit</a>.<br />
<br />
Esta es una parte del archivo DVK530-LCD7-01-00A0.dts donde indica que pines usa el LCD de 7 pulgadas.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"><code style="color: black; word-wrap: normal;"><your code="" here=""></your></code> "P8.45", /* lcd: lcd_data0 */
"P8.46", /* lcd: lcd_data1 */
"P8.43", /* lcd: lcd_data2 */
"P8.44", /* lcd: lcd_data3 */
"P8.41", /* lcd: lcd_data4 */
"P8.42", /* lcd: lcd_data5 */
"P8.39", /* lcd: lcd_data6 */
"P8.40", /* lcd: lcd_data7 */
"P8.37", /* lcd: lcd_data8 */
"P8.38", /* lcd: lcd_data9 */
"P8.36", /* lcd: lcd_data10 */
"P8.34", /* lcd: lcd_data11 */
"P8.35", /* lcd: lcd_data12 */
"P8.33", /* lcd: lcd_data13 */
"P8.31", /* lcd: lcd_data14 */
"P8.32", /* lcd: lcd_data15 */
"P8.27", /* lcd: lcd_vsync */
"P8.29", /* lcd: lcd_hsync */
"P8.28", /* lcd: lcd_pclk */
"P8.30", /* lcd: lcd_ac_bias_en */
"P9.14", /* pwm: ehrpwm1a */
/* the hardware IP uses */
"gpio1_19",
"gpio0_3",
"gpio0_12",
"ehrpwm1a",
"lcd"; </pre>
<br />
En el esquema eléctrico del LCD de 7 pulgadas se ve que este utiliza los pines 11, 12, 13, 14, 15, 16, 17 y 19 del Header 8 "P8"; pero en el Device Tree Overlay del LCD de 7" esos pines no están declarados y para que funcione el lcd no interesa si estan o no conectados los pines mencionados. Los nombres gpio1_19, gpio0_3, gpio0_12 que corresponden a los pines P9.16, P9.21 y P9.20 respectivamente no se utilizan en ninguna parte del dts del LCD por lo que los he eliminado y me funciona correctamente el LCD.<br />
<br />
El siguiente código pertenece al archivo completo del DVK530-LCD7-01-00A0.dts pero modificado y cambiado la version del archivo para diferenciar del archivo original. El archivo nuevo se llama DVK530-LCD7-01-00A1.dts y esta en el link de descarga del tutorial <a href="http://bbb-machinekit-lcd7.blogspot.com/2015/07/instalacion-de-lcd-7-pulgadas-waveshare.html" target="_blank">Instalación de LCD 7 pulgadas (waveshare) en Machinekit</a> (wget).<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"><code style="color: black; word-wrap: normal;"><your code="" here=""></your></code>/*
* Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
/dts-v1/;
/plugin/;
/ {
compatible = "ti,beaglebone", "ti,beaglebone-black";
/* identification */
part-number = "DVK551-LCD7-01";
version = "00A1";
/* state the resources this cape uses */
exclusive-use =
/* the pin header uses */
"P8.45", /* lcd: lcd_data0 */
"P8.46", /* lcd: lcd_data1 */
"P8.43", /* lcd: lcd_data2 */
"P8.44", /* lcd: lcd_data3 */
"P8.41", /* lcd: lcd_data4 */
"P8.42", /* lcd: lcd_data5 */
"P8.39", /* lcd: lcd_data6 */
"P8.40", /* lcd: lcd_data7 */
"P8.37", /* lcd: lcd_data8 */
"P8.38", /* lcd: lcd_data9 */
"P8.36", /* lcd: lcd_data10 */
"P8.34", /* lcd: lcd_data11 */
"P8.35", /* lcd: lcd_data12 */
"P8.33", /* lcd: lcd_data13 */
"P8.31", /* lcd: lcd_data14 */
"P8.32", /* lcd: lcd_data15 */
"P8.27", /* lcd: lcd_vsync */
"P8.29", /* lcd: lcd_hsync */
"P8.28", /* lcd: lcd_pclk */
"P8.30", /* lcd: lcd_ac_bias_en */
"P9.14", /* pwm: ehrpwm1a */
/* the hardware IP uses */
"ehrpwm1a",
"lcd";
fragment@0 {
target = <&am33xx_pinmux>;
__overlay__ {
pwm_bl_pins: pinmux_pwm_bl_pins {
pinctrl-single,pins = <
0x48 0x06 /* gpmc_a2.ehrpwm1a, OMAP_MUX_MODE6 | AM33XX_PIN_OUTPUT */
>;
};
lcd_cape_pins: pinmux_lcd_cape_pins {
pinctrl-single,pins = <
0xa0 0x08 /* lcd_data0.lcd_data0, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xa4 0x08 /* lcd_data1.lcd_data1, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xa8 0x08 /* lcd_data2.lcd_data2, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xac 0x08 /* lcd_data3.lcd_data3, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xb0 0x08 /* lcd_data4.lcd_data4, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xb4 0x08 /* lcd_data5.lcd_data5, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xb8 0x08 /* lcd_data6.lcd_data6, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xbc 0x08 /* lcd_data7.lcd_data7, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xc0 0x08 /* lcd_data8.lcd_data8, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xc4 0x08 /* lcd_data9.lcd_data9, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xc8 0x08 /* lcd_data10.lcd_data10, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xcc 0x08 /* lcd_data11.lcd_data11, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xd0 0x08 /* lcd_data12.lcd_data12, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xd4 0x08 /* lcd_data13.lcd_data13, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xd8 0x08 /* lcd_data14.lcd_data14, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xdc 0x08 /* lcd_data15.lcd_data15, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xe0 0x00 /* lcd_vsync.lcd_vsync, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT */
0xe4 0x00 /* lcd_hsync.lcd_hsync, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT */
0xe8 0x00 /* lcd_pclk.lcd_pclk, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT */
0xec 0x00 /* lcd_ac_bias_en.lcd_ac_bias_en, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT */
>;
};
};
};
fragment@1 {
target = <&epwmss1>;
__overlay__ {
status = "okay";
};
};
fragment@2 {
target = <&ehrpwm1>;
__overlay__ {
status = "okay";
};
};
fragment@3 {
target = <&ocp>;
__overlay__ {
/* avoid stupid warning */
#address-cells = <1>;
#size-cells = <1>;
backlight {
compatible = "pwm-backlight";
pinctrl-names = "default";
pinctrl-0 = <&pwm_bl_pins>;
pwms = <&ehrpwm1 0 500000 1>;
pwm-names = "DVK551-LCD7";
brightness-levels = <0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100>;
default-brightness-level = <101>; /* index to the array above */
status = "okay";
};
tscadc {
compatible = "ti,ti-tscadc";
reg = <0x44e0d000 0x1000>;
interrupt-parent = <&intc>;
interrupts = <16>;
ti,hwmods = "adc_tsc";
status = "okay";
tsc {
ti,wires = <4>;
ti,x-plate-resistance = <200>;
ti,coordinate-readouts = <5>;
ti,touch-type = <2>;
ti,wire-config = <0x00 0x11 0x22 0x33>;
};
adc {
ti,adc-channels = <4 5 6 7>;
};
};
/* Embest 7 inch LCD cape: */
panel {
compatible = "tilcdc,panel";
pinctrl-names = "default";
pinctrl-0 = <&lcd_cape_pins>;
panel-info {
ac-bias = <255>;
ac-bias-intrpt = <0>;
dma-burst-sz = <16>;
bpp = <32>;
fdd = <0x80>;
tft-alt-mode = <0>;
stn-565-mode = <0>;
mono-8bit-mode = <0>;
sync-edge = <0>;
sync-ctrl = <1>;
raster-order = <0>;
fifo-th = <0>;
};
display-timings {
native-mode = <&timing0>;
timing0: 800x480 {
hactive = <800>;
vactive = <480>;
hback-porch = <40>;
hfront-porch = <40>;
hsync-len = <48>;
vback-porch = <30>;
vfront-porch = <13>;
vsync-len = <3>;
clock-frequency = <30000000>;
hsync-active = <0>;
vsync-active = <0>;
};
};
};
fb {
compatible = "ti,am33xx-tilcdc";
reg = <0x4830e000 0x1000>;
interrupt-parent = <&intc>;
interrupts = <36>;
ti,hwmods = "lcdc";
};
};
};
}; </pre>
<br />
Para activar la función táctil del LCD se ocupa los canales ADC y en este caso están activos 4 para leer la posicion de x+, x-, y+, y-; utilizando los pines P9.37(AIN0), P9.38(AIN1), P9.39(AIN2), P9.40(AIN3).<br />
<br />
Para compilar el archivo .dts modificado hay que poner el nombre correcto, cambiando 00A0 por 00A1:<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;"><code style="color: black; word-wrap: normal;"><your code="" here=""></your></code>dtc -O dtb -o DVK530-LCD7-01-00A1.dtbo -b 0 -@ DVK530-LCD7-01-00A1.dts </pre>
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">##LCD7
optargs=capemgr.enable_partno=DVK530-LCD7-01:00A1</pre>
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 15px; overflow: auto; padding: 0px; width: 99%;">sudo nano /etc/default/capemgr
CAPE=DVK530-LCD7-01:00A1</pre>
<br />
Realizar los mismos pasos del tutorial <a href="http://bbb-machinekit-lcd7.blogspot.com/2015/07/instalacion-de-lcd-7-pulgadas-waveshare.html" target="_blank">Instalación de LCD 7 pulgadas (waveshare) en Machinekit</a>, cambiando al nombre DVK530-LCD7-01-00A1.dtbo.<code style="color: black; word-wrap: normal;"><your code="" here=""> </your></code><br />
<br />
<code style="color: black; word-wrap: normal;"><your code="" here=""><code style="color: black; word-wrap: normal;"></code></your></code><br />
<code style="color: black; word-wrap: normal;"><code style="color: black; word-wrap: normal;">Para saber mas de los Device Tree Overlays visitar los siguientes links:</code></code><br />
<br />
<code style="color: black; word-wrap: normal;"><your code="" here=""><a href="http://derekmolloy.ie/gpios-on-the-beaglebone-black-using-device-tree-overlays/" target="_blank">http://derekmolloy.ie/gpios-on-the-beaglebone-black-using-device-tree-overlays/</a></your></code><br />
<code style="color: black; word-wrap: normal;"><your code="" here=""><br /></your></code>
<code style="color: black; word-wrap: normal;"><your code="" here=""><a href="https://github.com/jadonk/validation-scripts/blob/master/test-capemgr/README.md" target="_blank">https://github.com/jadonk/validation-scripts/blob/master/test-capemgr/README.md</a></your></code><br />
<code style="color: black; word-wrap: normal;"><your code="" here=""><br /></your></code>
<code style="color: black; word-wrap: normal;"><your code="" here=""><a href="http://devicetree.org/Device_Tree_Usage" target="_blank">http://devicetree.org/Device_Tree_Usage</a></your></code><br />
<code style="color: black; word-wrap: normal;"><your code="" here=""><br /></your></code>Vichentehttp://www.blogger.com/profile/13532517773299729858noreply@blogger.com0tag:blogger.com,1999:blog-6209740641626143717.post-12011179210150842952015-07-11T19:08:00.001-07:002015-07-11T19:08:54.725-07:00Cambios de gmoccapy_lcd7 con respecto a la original gmoccapy.La imagen que se muestra es la gmoccapy original y el recuadro de color rojo es el que se lo movio a una pestaña nueva que se activa con un boton llamdo info. Esto se realizo para poder reducir el tamaño de la gui gmoccapy a una resolucion de 800x480.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrseVoBmVXpfM1g89Y1AQWYcmOwuZWDx_Ew0FQrvVIR-paTdYG3PWVn9j9MgKAOcWlmTsnXURXwhAoKAew2UbojfpS45rtop_S_BLdO8UHTJduzYbRJy45RVRN005qX8d5-G2yaHWM7z8/s1600/gmoccapy-main.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="492" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrseVoBmVXpfM1g89Y1AQWYcmOwuZWDx_Ew0FQrvVIR-paTdYG3PWVn9j9MgKAOcWlmTsnXURXwhAoKAew2UbojfpS45rtop_S_BLdO8UHTJduzYbRJy45RVRN005qX8d5-G2yaHWM7z8/s640/gmoccapy-main.jpg" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8Pmu3q8jr4C_AsBsjrtnLeblqlxaTrIA1C36n6x3xEdTYqAPIFOlvtN8yOZyNNHvVy0uX2SjdgnxR0-OFbxgxoc9Yrtq1qHiNO1c_THZXbrLvejeXS_ftpBWj-t9Ar_yXDNBYPCAFfYo/s1600/gmoccapy-main.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br /></a></div>
<br />La siguiente imagen indica la gmoccapy_lcd7 que se modificó. El recuadro de color verde indica el quinto eje que se agregó tanto a la GUI como el código fuente, en mi caso para trabajar con una impresora 3d con doble extrusor. El recuadro color naranja indica que distancia debe mover el motor al eje, en continuos se mueve de acuerdo a la velocidad de jogging, mientras que 6mm, 5mm ... 0.001mm es la distancia exacta que uno configura en el archivo .ini para mover el husillo. Se puede añadir hasta un maximo de 6 distancias personalizadas, se limito esto para que no se desconfigure la GUI al añadir más distancias.<br />
EL ultimó cambio en esta parte es el recuadro de color azul donde se añadio ese botón con esa imagen en forma de display para controlar que aparezca o desaparezca las figura o formas que salen cuando uno abre un archivo .ngc que contiene el código G. Esto se lo hizo para que la Beaglebone Black pueda ahorrar recursos para un mejor rendimiento.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMW7KDcRkG0VdnFTp_keYpOGS0-xmqM9wrPVp9f6sBVxJVhhMaIz6K-HjQd10DDcZh-3m0jmxcdHRsSiewOWVXFZKMBSCHXuAtmFn-xb7pRIrWgWx_757auEg2GtFGMmQDzDE3lQ16k4E/s1600/gmoccapy-lcd7-main.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="362" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMW7KDcRkG0VdnFTp_keYpOGS0-xmqM9wrPVp9f6sBVxJVhhMaIz6K-HjQd10DDcZh-3m0jmxcdHRsSiewOWVXFZKMBSCHXuAtmFn-xb7pRIrWgWx_757auEg2GtFGMmQDzDE3lQ16k4E/s640/gmoccapy-lcd7-main.jpg" width="640" /></a></div>
<br />
En la siguiente imagen se ve el boton info que permite mostrar la parte de información acerca de velocidad, avance, refrigeración, rpm de taladro, etc. Los elementos señalados con los recuadros negros indican que cada uno puede aumentar gui's que realizen alguna función en general.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJ_JhrqhHsN6SQo9ZSpTR4c4gjbFVYEk_sgGA0Yc_DsYyBV6g06pFwoUAJUSbuzfXTw7f_U7ScP9dgvL7mjyR60XddN3pEUdZLPJb_Gcj-R073tLlWCRWLbvuVTZDHep_IaeySxgVpZeg/s1600/gmoccapy-lcd7-info.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="364" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJ_JhrqhHsN6SQo9ZSpTR4c4gjbFVYEk_sgGA0Yc_DsYyBV6g06pFwoUAJUSbuzfXTw7f_U7ScP9dgvL7mjyR60XddN3pEUdZLPJb_Gcj-R073tLlWCRWLbvuVTZDHep_IaeySxgVpZeg/s640/gmoccapy-lcd7-info.jpg" width="640" /></a></div>
gmoccapy plasma en gmoccapy_lcd7<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkLIB1bOdIq8q_JAuS1D-bkCAJWosI0J13SSI16ZFQya62WeLXvgXto2cjooWJEwxuMIl7KoYFNhtd65Bkhdx5xadVkAcIlRbxk6j7jH7ztiZtCOTYZYB051mFCa6cn6aMog5wfvAhYHE/s1600/gmoccapy-lcd7-plasma.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkLIB1bOdIq8q_JAuS1D-bkCAJWosI0J13SSI16ZFQya62WeLXvgXto2cjooWJEwxuMIl7KoYFNhtd65Bkhdx5xadVkAcIlRbxk6j7jH7ztiZtCOTYZYB051mFCa6cn6aMog5wfvAhYHE/s640/gmoccapy-lcd7-plasma.jpg" width="640" /></a></div>
La siguiente es una GUI de impresora 3d que aún estoy desarrollando para integrarla a gmoccapy_lcd7<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVDj2BkL0QJc31hEsFuFp_eQ5kCzAwC7HOUzHagK1u9aEtMDY8EWlIYTM5-C1Lx5z-ZtyT_vKCQ1GlONiQ6jbnQWEAQoF262KpTLY7IGKjxQ69k1vhUWWfksCBijQEmgXoIwryn0w1oSg/s1600/gmoccapy-lcd7-3dprinter.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="362" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVDj2BkL0QJc31hEsFuFp_eQ5kCzAwC7HOUzHagK1u9aEtMDY8EWlIYTM5-C1Lx5z-ZtyT_vKCQ1GlONiQ6jbnQWEAQoF262KpTLY7IGKjxQ69k1vhUWWfksCBijQEmgXoIwryn0w1oSg/s640/gmoccapy-lcd7-3dprinter.jpg" width="640" /></a></div>
<br />
En la parte de MDI de la GUI gmoccapy_lcd7 se realizó un gran cambio el cúal consiste en desplazar el dro que se encarga de indicar los ejes con las posiciones y poner el teclado allí para escribir los comandos de código G como se aprecia en el recuadro de color café. La info de los ejes y posición de la máquina están en el recuadro rojo el cuál solo se muestra cuando se esta en modo MDI.<br />
<br />
Original.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiU2CtSxlKsIF2f0omfpqVIhW1LO7uGfiWVbJqw6XF0-L9SzcZH718fzWrpwMTvQZ79AIJQR_ozGGmJEwBwKKjLLG81_lQKrTSNbuLIhcpNEow4N8qsLwNn9zl-4znQOL9sszvqtylOnJI/s1600/gmoccapy-mdi.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="494" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiU2CtSxlKsIF2f0omfpqVIhW1LO7uGfiWVbJqw6XF0-L9SzcZH718fzWrpwMTvQZ79AIJQR_ozGGmJEwBwKKjLLG81_lQKrTSNbuLIhcpNEow4N8qsLwNn9zl-4znQOL9sszvqtylOnJI/s640/gmoccapy-mdi.jpg" width="640" /></a></div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpHMOGAyZeLPupEHEhUoZF5nmeKz1VV6bZTSlBdASQN_oA1nB8c_u53t6zGFIBAxvS4q609HtwyoAZEWVuwAUtKo-Fol4VGGYxZYzNW2kP5jALTrbjNAY2nWFwKYPFcCWgqNlq9MSRus0/s1600/gmoccapy-lcd7-mdi.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpHMOGAyZeLPupEHEhUoZF5nmeKz1VV6bZTSlBdASQN_oA1nB8c_u53t6zGFIBAxvS4q609HtwyoAZEWVuwAUtKo-Fol4VGGYxZYzNW2kP5jALTrbjNAY2nWFwKYPFcCWgqNlq9MSRus0/s640/gmoccapy-lcd7-mdi.jpg" width="640" /></a></div>
<br />
En la parte de editar el código G importado se modifico el poder disminuir la altura del cuadro que indica el código para que aparezca el teclado en la parte superior.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigY-kiDwzI-dQgKT4du8Cue-JfFoOMFfwBcbLaX5FnrOcJyxjFjP9R0U_dpA5NgfBW5GWJxqAPQtT93jd7-bxSjobswohluMM8fh39bW1WS0NABcpEqUlH9-xEu1oBK0-lbsttsWUFu98/s1600/gmoccapy-lcd7-edit.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="364" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigY-kiDwzI-dQgKT4du8Cue-JfFoOMFfwBcbLaX5FnrOcJyxjFjP9R0U_dpA5NgfBW5GWJxqAPQtT93jd7-bxSjobswohluMM8fh39bW1WS0NABcpEqUlH9-xEu1oBK0-lbsttsWUFu98/s640/gmoccapy-lcd7-edit.jpg" width="640" /></a></div>
<br />
gmoccapy original se ve asi por que no he configurado el archivo bin/gmoccapy para que ejecute el teclado matchbox.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJk7vBpsHGB97C0QAEkgaycAKC61eHFs4TmfvNoENs1XlWUnm4CCPGGoTCUBszW8IK02Ltnxop7FnHn8hCGDEiaqcCo6Gw-sj7OvqtRmVj-v4IjbEcXSyx4UVJx5uuhSEMKZdviVBfFd4/s1600/gmoccapy-edit-keyboard.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="492" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJk7vBpsHGB97C0QAEkgaycAKC61eHFs4TmfvNoENs1XlWUnm4CCPGGoTCUBszW8IK02Ltnxop7FnHn8hCGDEiaqcCo6Gw-sj7OvqtRmVj-v4IjbEcXSyx4UVJx5uuhSEMKZdviVBfFd4/s640/gmoccapy-edit-keyboard.jpg" width="640" /></a></div>
<br />
gmoccapy_lcd7 en modo editar con teclado<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNUJOCq6LroiWJ3BsWOPzog7g7ra2GkU5FjZMwZdX8xuT0SnNmG5RNR_NWurbKmzuq41AzaHPQ9M9Q9EgX-ihYSqa4XetOz-_pSIKqKEz_06y-BrskdrDvQMzi2dsserXTMimE8um9EFE/s1600/gmoccapy-lcd7-edit-keyboard.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="364" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNUJOCq6LroiWJ3BsWOPzog7g7ra2GkU5FjZMwZdX8xuT0SnNmG5RNR_NWurbKmzuq41AzaHPQ9M9Q9EgX-ihYSqa4XetOz-_pSIKqKEz_06y-BrskdrDvQMzi2dsserXTMimE8um9EFE/s640/gmoccapy-lcd7-edit-keyboard.jpg" width="640" /></a></div>
<br />
<br />
La última modificación fue la de disminuir el tamaño de todas las etiquetas de botones y cuadros de texto, disminuir el tamaño de las imágenes de los botones y adpatar todos los elementos de la pantalla a la resolusión de 800x480. El tamaño de letra con el valor de 7 queda perfecto para que alcance todos los elementos de la GUI sin perder formato.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5_whI_hEWfcTDWa6qZlFCHPBMvNcgxaPoSI2xaHVeI9I0RSQ9P3c6Ejic-Ix14pRM51jsQRbI_kQNb9oUWgt6f7N_-UkIB3C52uTXPBtdBSUfPAB0ZlsUF3dqECumF0aaGO3uFFSvr4I/s1600/gmoccapy-lcd7-settings.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="364" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5_whI_hEWfcTDWa6qZlFCHPBMvNcgxaPoSI2xaHVeI9I0RSQ9P3c6Ejic-Ix14pRM51jsQRbI_kQNb9oUWgt6f7N_-UkIB3C52uTXPBtdBSUfPAB0ZlsUF3dqECumF0aaGO3uFFSvr4I/s640/gmoccapy-lcd7-settings.jpg" width="640" /></a></div>
<br />
<br />Vichentehttp://www.blogger.com/profile/13532517773299729858noreply@blogger.com7tag:blogger.com,1999:blog-6209740641626143717.post-65819552566640068832015-07-10T11:24:00.001-07:002015-07-10T11:24:42.502-07:00Instalación de GUI gmoccapy_lcd7 y teclado personalizado (keyboard-cnc) en Beaglebone BlackLa GUI gmoccapy_lcd7 fue modificada de la GUI gmoccapy para trabajar con pantallas LCD de 7 pulgadas táctil con resolución de 800x480. Se realizó la prueba en las últimas versiones del programa machinekit tanto compilado como la imagen Machinekit Debian disponible en los repositorios de Robert Nelson.<br />
<br />
Para descargar el programa machinekit y compilar revisar los siguientes links:<br />
<br />
Paquetes necesarios para Debian <a href="http://www.machinekit.io/docs/packages-debian/" target="_blank">Debian packages</a><br />
Compilación de código fuente Machinekit <a href="http://www.machinekit.io/docs/building-from-source/" target="_blank">Building from source</a><br />
<br />
Para descargar Imagen Debian Machinekit revisar el siguiente link:<br />
<br />
<a href="http://bbb-machinekit-lcd7.blogspot.com/2015/07/primeros-pasos-machinekit-beaglebone.html" target="_blank">Primeros Pasos Machinekit Beaglebone Black</a><br />
<br />
Descargar Gui gmoccappy_lcd7 <br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; width: 99%;"><code style="color: black; word-wrap: normal;"><your code="" here="">git clone https://github.com/vichente1/gmoccapy_lcd7.git
</your></code></pre>
<br />
<b>Instalación de GUI gmoccapy_lcd7</b><br />
<br />
Ingresar a la carpeta de gmoccapy_lcd7 <br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; width: 99%;"><code style="color: black; word-wrap: normal;"><your code="" here="">cd gmoccapy_lcd7/
</your></code></pre>
<br />
Copiar el archivo bin/gmoccapy_lcd7 a la carpeta /usr/bin/ y dar permisos de ejecución a todos.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; width: 99%;"><code style="color: black; word-wrap: normal;"><your code="" here="">sudo cp bin/gmoccapy_lcd7 /usr/bin/
sudo chmod a+x /usr/bin/gmoccapy_lcd7
</your></code></pre>
<br />
Copiar la carpeta share/gmoccapy_lcd7 a la carpeta /usr/share/<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; width: 99%;"><code style="color: black; word-wrap: normal;"><your code="" here="">sudo cp -r share/gmoccapy_lcd7/ /usr/share/
</your></code></pre>
<br />
<b>Instalación de teclado en la GUI gmoccapy_lcd7</b><br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; width: 99%;"><code style="color: black; word-wrap: normal;"><your code="" here="">sudo apt-get update
sudo apt-get install matchbox
</your></code></pre>
<br />
Copiar archivo keyboard-cnc.xml a la carpeta /usr/share/matchbox-keyboard
y dar permisos de ejecución a todos.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; width: 99%;"><code style="color: black; word-wrap: normal;"><your code="" here="">sudo cp keyboard-cnc.xml /usr/share/matchbox-keyboard
sudo chmod a+x /usr/share/matchbox-keyboard/keyboard-cnc.xml
</your></code></pre>
<br />
<b>Instalación de la GUI gmoccapy_lcd7 en Machinekit compilado.</b><br />
<br />
Se debe seguir los pasos anteriores solo que hay que reemplazar usr por el nombre machinekit.<br />
<b> </b><br />
<b>ejemplo: </b><br />
sabiendo que se a descargado el codigo machinekit en la carpeta por default<b> -> /</b>home/machinekit/ (machinekit equivale al nombre de usuario) o lo mismo que ~/<br />
sudo cp bin/gmoccapy_lcd7 /usr/bin/<b> </b>a sudo cp bin/gmoccapy_lcd7 ~/machinekit/bin/<br />
<br />
Por último es importante que se habilite la versión de machinekit que se va usar con el siguiente comando.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; width: 99%;"><code>cd machinekit/
. scripts/rip-environment
linuxcnc</code></pre>
<br />Vichentehttp://www.blogger.com/profile/13532517773299729858noreply@blogger.com0