Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - skwlk

#1

La principal dificultad que existe a la hora de debuggear sistemas embebidos, es el hecho de que el destino de nuestro programa no se encuentra en la misma máquina donde realizamos la compilación.

Existen varias alternativas para realizar el debug. Cuando programamos para el escritorio la primera forma y la más sencilla para realizar el debug es por medio de impresiones a pantalla con instrucciones printf. Es la más sencilla pero también la más intrusiva.

En los sistemas embebidos, esto es totalmente distinto, porque de alguna forma le tenemos que comunicar eso que queremos mostrar a nuestra PC de desarrollo.

Aunque parezca fácil, necesitamos crear una infraestructura para soportar el envío de esa información a la PC, y podría llegar a ser demasiado intrusiva y consumir recursos innecesarios. Para ello los ARM Cortex ofrecen varias formas de realizar el debug, siendo los más comunes el JTAG y el SWD, soportados, ambos, por OpenOCD, el cual fue instalado siguiendo las instrucciones en la parte primera de este tutorial.

En esta primera entrega nos enfocaremos en como iniciar el proceso usando OpenOCD.

OpenOCD

Para ejecutar openOCD, es necesario pasarle como parámetro un archivo de configuración, por lo general estos archivos de configuración los encontramos dentro de /usr/local/share/opencd/scripts/boards, aunque no siempre vamos a encontrar la configuración de nuestra tarjeta, por lo que tenemos que copiar y modificar una existente.

Por ejemplo, para la tarjeta que estoy usando de ejemplo más el st-link v2, ese archivo de configuración quedaría de la siguiente forma.

Código: php

# This is for using with STLINK/V2

source [find interface/stlink-v2.cfg]

# increase working area to 8KB
set WORKAREASIZE 0x2000

# chip name
set CHIPNAME STM32F103C8T6

source [find target/stm32f1x_stlink.cfg]

# use hardware reset, connect under reset
reset_config srst_only srst_nogate


Colocamos este archivo dentro del directorio del proyecto

Código: php

ex0$ ls *.cfg
stm32f103c8t6.cfg


Nota: En caso de que la tarjeta que tengamos este soportada, simplemente apuntamos openocd al lugar indicado.

En este momento ya tenemos preparado todo lo necesario para realizar nuestro primera sesión de debug, para este paso tenemos que abrir 3 terminales en el directorio del proyecto.

En la primera terminal ejecutamos

Código: php

openocd -f archiv.cfg


O en mi caso particular

Código: php

openocd -f stm32f103c8t6.cfg


Si todo ha ido bien veremos algo como

Código: php

Info : Unable to match requested speed 1000 kHz, using 950 kHz
Info : Unable to match requested speed 1000 kHz, using 950 kHz
Info : clock speed 950 kHz
Info : STLINK v2 JTAG v17 API v2 SWIM v4 VID 0x0483 PID 0x3748
Info : using stlink api v2
Info : Target voltage: 3.205222
Info : STM32F103C8T6.cpu: hardware has 6 breakpoints, 4 watchpoints


Uno de los aspectos que nos informa del MCU es la cantidad de breakpoints disponibles en el hardware.

Cuando veamos esa información, abrimos otra consola y ejecutamos

Código: php

telnet localhost 4444


Salida

Código: php

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Open On-Chip Debugger
>


En estos momentos ya estamos preparados para tomar el control del MCU por medio de un reset halt

Código: php

> reset halt
timed out while waiting for target halted
TARGET: STM32F103C8T6.cpu - Not halted
in procedure 'reset'
in procedure 'ocd_bouncer'


>



En la tarjeta presionamos el boton de reset

Código: php

target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x08000008 msp: 0x20005000
>



Con esto ya tenemos el control total del MCU y podemos observar el contenido de los registros del sistema con reg

Código: php

> reg
===== arm v7m registers
(0) r0 (/32): 0x00057E40
(1) r1 (/32): 0xFFFDFFFF
(2) r2 (/32): 0x000562B1
(3) r3 (/32): 0x000562B2
(4) r4 (/32): 0xFFFFFFFF
(5) r5 (/32): 0x7FFFFFFE
(6) r6 (/32): 0xB5EFB7AA
(7) r7 (/32): 0x20004FE8
(8) r8 (/32): 0xFFFE75DC
(9) r9 (/32): 0xFFFFFFDF
(10) r10 (/32): 0x2A7BF9DD
(11) r11 (/32): 0xA63F5073
(12) r12 (/32): 0xFFFFFFFF
(13) sp (/32): 0x20005000
(14) lr (/32): 0xFFFFFFFF
(15) pc (/32): 0x08000008
(16) xPSR (/32): 0x01000000
(17) msp (/32): 0x20005000
(18) psp (/32): 0x6AFF7268
(19) primask (/1): 0x00
(20) basepri (/8): 0x00
(21) faultmask (/1): 0x00
(22) control (/2): 0x00
===== Cortex-M DWT registers
(23) dwt_ctrl (/32)
(24) dwt_cyccnt (/32)
(25) dwt_0_comp (/32)
(26) dwt_0_mask (/4)
(27) dwt_0_function (/32)
(28) dwt_1_comp (/32)
(29) dwt_1_mask (/4)
(30) dwt_1_function (/32)
(31) dwt_2_comp (/32)
(32) dwt_2_mask (/4)
(33) dwt_2_function (/32)
(34) dwt_3_comp (/32)
(35) dwt_3_mask (/4)
(36) dwt_3_function (/32)


Con help, obtenemos una lista detallada de los comandos disponibles

Enseguida abrimos una tercera terminal para ejecutar arm-none-eabi-gdb

Código: php

arm-none-eabi-gdb main.elf


Y nos enlazamos con el target remoto

Código: php

(gdb) target remote localhost:3333
Remote debugging using localhost:3333
main () at main.c:36
36 {


Aunque probablemente quieran usar una GUI, por lo que tenemos varias alternativas, una de ellas es ddd, que está incluida en los repositorios de ubuntu y en lugar de

Código: php

arm-none-eabi-gdb main.elf


Hacemos un

Código: php

ddd --eval-command="target remote localhost:3333" --debugger arm-none-eabi-gdb  main.elf



En la siguiente entrega mostraré como imprimir secciones de memoria del MCU al igual que variables.
#2

En la actualidad, al escuchar de proyectos de electrónica lo primero que se nos viene a la mente es la existencia de un Arduino.

A pesar de que arduino es una buena plataforma estilo plug & play les puedo asegurar que llegará el momento en el que quieran evolucionar a microcontroladores o sistemas más potentes.

Ahí es donde aparecen los microcontroladores ARM Cortex M de 32 bits. En si ARM no fabrica los chips, si no que licencia el core y periféricos a terceros, para que ellos sean los encargados de fabricarlos.

De los ARM Cortex M, tenemos 3 principales familias: M0 y M0+, M3 y M4, M7. Además cuentan con una infinidad de tarjetas de desarrollo a precios más asequibles que los mismos arduinos.

Me podrán decir que en los arduinos también hay procesadores ARM Cortex con el Arduino DUE o incluso se podría meter aquí el Teensy, pero si comparamos los precios en canales oficiales, nos encontramos que los arduinos tienen precios más elevados que otras tarjetas de desarrollo con ARM Cortex M.

Si ponemos un ejemplo, por canales oficiales, el arduino pro mini 328 tiene un costo de alrededor de 13 usd más impuestos y envío, pero sólo te ofrece un procesador de 8 bits con 2K en RAM y 32K en FLASH, pero por el mismo precio, no podemos conseguir una serie de tarjetas Nucleo de STMicroelectronics con procesadores ARM Cortex M0 a M4.

Por ejemplo:

Nucleo-L432KC, ARM Cortex M4, 64K SRAM, 256K Flash, Unidad de Punto Flotante e instrucciones DSP.
Nucleo-F303RE, ARM Cortex M4, 64K SRAM, 512K Flash, Unidad de Punto Flotante e instrucciones DSP.

Ahora si nos vamos al rango de precios del Arduino Due (64 usd) ARM Cortex M3 con 96K en SRAM y 512K en FLASH y el teensy 3.6 (34 USD) ARM Cortex M4 256K SRAM y 1M en FLASH, de otro lado contamos con tarjetas como

Nucleo-F746ZG, ARM Cortex M7, 320K SRAM y 1M Flash (por 30 USD)

En definitiva, con estos MCUs podrían ser capaces de enfrentar proyectos más complejos usando sistemas operativos como FreeRTOS y Nuttx.

Instalando las herramientas de desarrollo en Ubuntu

Antes de querer usar un IDE, primero debemos entender como se manejan estos procesadores desde sus bases, por lo que requeriremos instalar 2 componentes esenciales:

  • Toolchain
  • Debuggger

El toolchain, son las herramientas que nos permiten traducir de un lenguaje de programación de alto nivel como lo es C/C++ al lenguaje máquina que es el que entiende el MCU.

El Debugger, son las herramientas que nos permiten analizar el comportamiento del sistema, nos permite verificar registros, variables, colocar breakpoints, de tal forma que podamos resolver problemas de una forma más adecuada que el uso de meras impresiones a consola.

Instalando el Toolchain

Esta es la parte más sencilla del proceso, ya que se mantiene un ppa con las últimas versiones del gcc para sistemas embebidos, por lo cual lo único que tenemos que hacer es abrir una terminal y escribir lo siguiente

Código: php

sudo add-apt-repository ppa:team-gcc-arm-embedded/ppa
sudo apt-get update
sudo apt-get install gcc-arm-embedded


Al momento, la última versión es la 6.3.1

Instalando el debugger

En los repositorios de ubuntu se encuentra el OpenOCD, pero si se quiere la última versión la tendrán que descargar y compilar. Para comenzar simplemente usaremos el OpenOCD de la distribución que en estos momentos es la versión 0.9

Código: php
sudo apt-get install openocd


Como la mayorías de las tarjetas de desarrollo de STMicroelectronics cuentan con el programador ST-Link, tenemos otra opción que pueden descargar y compilar una herramienta llamada stlink. Más información de esta herramienta la pueden obtener de No tienes permitido ver los links. Registrarse o Entrar a mi cuenta y como lo deben de compilar en No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Para las primeras pruebas, esta última herramienta va a ser usada.

Hola Mundo

Ya que tenemos nuestro toolchain procederemos a realizar el primer hola mundo, que consta en prender y apagar un LED de forma cíclica. Para esas pruebas voy a usar una tarjeta de desarrollo mínima que puede obtener por internet y que cuenta con el STM32F103C8T6.


También nos descargaremos las hojas de datos y manuales de referencia del microcontrolador. En este caso todos esos archivos los podemos conseguir en el siguiente enlace No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Los documentos que nos interesan son las especificaciones del producto (DS5319), el manual de referencia (RM0008) y los manuales de programación (PM0075 y PM0056) y para finalizar, dependiendo de los periféricos que usemos en nuestros proyectos tendríamos que darle un vistazo a los erratas (ES096).

No es que nos tengamos que leer las 1137 páginas del manual de referencia, pero sirven como un apoyo para resolver dudas puntuales.

El objetivo de este primer ejemplo será entender como movernos por los archivos anteriores.

El primer paso es buscar el mapa de memoria. Una imagen se encuentra en el primer archivo sugerido en la página 34.



Según el mapa de memoría la RAM se ubica en la dirección 0x20000000, la flash en 0x08000000 y los registros de los periféricos se encuentran en 0x40000000 y a partir de esta dirección se encuentran los registros que controlan todos los periféricos de los que vamos a hacer uso.

Así que lo primero que es crear un directorio para nuestro primer ejemplo donde crearemos nuestro main.c

Código: php

mkdir ex0
touch ex0/main.c


Y añadiremos estas primeras líneas

Código: C

#define FLASH_BASE      0x08000000
#define SRAM_BASE       0x20000000
#define PERIPH_BASE     0x40000000


A diferencia de los otros MCUs, en los arm cortex a cada periférico se le tiene que habilitar el reloj, por lo que si queremos usar el el puerto C y el pin 13 de este puerto, primero tenemos que saber a que reloj esta conectado para saber cual es el registro que tenemos que acceder. En la página 11 del mismo archivo tenemos un diagrama de bloques que nos indica cada periférico a cual bus y reloj esta conectados.



De la imagen anterior podemos ver que el puerto C esta conectado al bus APB2.

Hay una serie de registros que controlan en reloj y que inician en la dirección 0x40021000 y es llamado RCC (Reset and Clock Control), y el registro que nos interesa es el que nos permite activar el reloj para el Puerto C. La información de estos registros se encuentran en el manual de referencia (RM0008) en la sección 7





¿Que información obtuvimos? En primera instancia, sabemos que la dirección base de los registros RCC se encuentra en 0x40021000, por lo que el registro en el que estamos interesados para activar el reloj del puerto C se encuentra con un offset de 0x18 bytes de esa dirección base. Además obtenemos la información del bit y el valor que debemos colocar para activarlo.

Lo siguiente que vamos añadir a nuestro main.c es una referencia a la ubicación de este registros

Código: C

#define RCC_BASE        (PERIPH_BASE + 0x21000)
#define RCC_APB2ENR     (*(volatile unsigned long*)(RCC_BASE + 0x18))


Técnicamente ya estaríamos preparados para activar el reloj para el puerto C con la siguiente instrucción

Código: C

RCC_APB2ENR |= 1 << 4;


Siguiendo el mismo procedimiento, añadimos los registros que se encargan de configurar el puerto C




Código: C

#define GPIOC_BASE     (PERIPH_BASE + 0x11000)
#define GPIOC_CRL       (*(volatile unsigned long*)(GPIOC_BASE + 0x00))
#define GPIOC_CRH       (*(volatile unsigned long*)(GPIOC_BASE + 0x04))
#define GPIOC_BSRR     (*(volatile unsigned long*)(GPIOC_BASE + 0x10))
#define GPIOC_BRR       (*(volatile unsigned long*)(GPIOC_BASE + 0x14))


En GPIOC_CRL y GPIOC_CRH se configuran la función de cada uno de los pines. En la tarjeta de desarrollo tenemos un LED en el pin 13 del puerto C, por lo que lo tenemos que configurar como salida pp (push pull) escribiendo 0b0011 en el registro correspondiente

Código: C

GPIOC_CRH |= 0x3 << (LED_PIN - 8);  // Output at 50Mhz max
GPIOC_CRH &= ~( (0x3 << (LED_PIN -8)) << 2 ); // Push Pull


El registro GPIOC_BSRR y GPIOC_BRR es usando para setear o reasetear cualquiera de los pines del puerto

Código: C

GPIOC_BSRR |= 1 << LED_PIN; Bit Set
GPIOC_BRR  |= 1 << LED_PIN; Bit Reset


Colocando todo junto tenemos el siguiente código (no se preocupen por el código extra en la próxima entrega lo explicaré)

Código: C

/* memory and peripheral start addresses */
#define FLASH_BASE      0x08000000
#define SRAM_BASE       0x20000000
#define PERIPH_BASE     0x40000000

/* work out end of RAM address as initial stack pointer */
#define SRAM_SIZE       20*1024     // STM32F103c8t6 has 20 Kbye of RAM
#define SRAM_END        (SRAM_BASE + SRAM_SIZE)

/* LED connected to PIN 8 of GPIOC */
#define LED_PIN         13

/* RCC peripheral addresses applicable to GPIOC */
#define RCC_BASE        (PERIPH_BASE + 0x21000)
#define RCC_APB2ENR     (*(volatile unsigned long*)(RCC_BASE + 0x18))

/* GPIOC peripheral addresses */
#define GPIOC_BASE      (PERIPH_BASE + 0x11000)
#define GPIOC_CRL       (*(volatile unsigned long*)(GPIOC_BASE + 0x00))
#define GPIOC_CRH       (*(volatile unsigned long*)(GPIOC_BASE + 0x04))
#define GPIOC_BSRR      (*(volatile unsigned long*)(GPIOC_BASE + 0x10))
#define GPIOC_BRR       (*(volatile unsigned long*)(GPIOC_BASE + 0x14))

/* user functions */
int main(void);
void delay(unsigned long count);

/* vector table */
unsigned long *vector_table[] __attribute__((section(".vector_table"))) =
{
    (unsigned long *)SRAM_END,   // initial stack pointer
    (unsigned long *)main        // main as Reset_Handler
};

int main()
{
    /* enable clock on GPIOC peripheral */
    RCC_APB2ENR |= 1 << 4;
     
    /* set LED pin output mode */

    GPIOC_CRH |= 0x3 << (LED_PIN - 8);  // Output at 50Mhz max or High Speed
    GPIOC_CRH &= ~( (0x3 << (LED_PIN -8)) << 2 ); // Push Pull

    while(1)
    {
        GPIOC_BSRR |= 1<<LED_PIN;  // set LED pin high
        delay(360000);
        GPIOC_BRR  |= 1<<LED_PIN;  // set LED pin low
        delay(360000);
    }
}

void delay(unsigned long count)
{
    while(count--);
}




Lo que resta es crear el liker script y el Makefile para compilar nuestro proyecto

Linker Script (stm32_minimal.ld)

Código: C

/* memory layout for an STM32F103C8T6 */
MEMORY
{
    FLASH (rx)  : ORIGIN = 0x08000000, LENGTH = 64K
    SRAM (xrw)  : ORIGIN = 0x20000000, LENGTH = 20K
}

/* output sections */
SECTIONS
{
    /* program code into FLASH */
    .text :
    {
        *(.vector_table)    /* Vector table */
        *(.text)            /* Program code */
    } >FLASH

    /* uninitialized global and static variables (which
       we don't have any in this example) into SRAM */
    .data :
    {
        *(.data)           
    } >SRAM
}   


Makefile

Código: php

CC = arm-none-eabi-gcc
LD = arm-none-eabi-ld
CP = arm-none-eabi-objcopy

LKR_SCRIPT = stm32_minimal.ld

CFLAGS  = -c -fno-common -O0 -g -mcpu=cortex-m3 -mthumb
LFLAGS  = -nostartfiles -T$(LKR_SCRIPT)
CPFLAGS = -Obinary

all: main.bin bootloader.hex

main.o: main.c
$(CC) $(CFLAGS) -o main.o main.c

main.elf: main.o
$(LD) $(LFLAGS) -o main.elf main.o

main.bin: main.elf
$(CP) $(CPFLAGS) main.elf main.bin

flash:
st-flash --reset write main.bin 0x8000000

clean:
rm -rf *.o *.elf *.bin



Después de crear estos archivos en una terminal, localizados en nuestro proyecto ejecutamos

Código: php

make


Si todo ha ido bien, lo que veremos a la salida es

Código: php
ex0$ make
arm-none-eabi-gcc -c -fno-common -O0 -g -mcpu=cortex-m3 -mthumb -o main.o main.c
arm-none-eabi-ld -nostartfiles -Tstm32_minimal.ld -o main.elf main.o
arm-none-eabi-objcopy -Obinary main.elf main.bin


Si no hubo error, conectamos nuestra tarjeta al programador st-link, lo conectamos a la PC y ejecutamos

Código: php

make flash


Código: php
ex0$ make flash
st-flash --reset write main.bin 0x8000000
2017-05-21T14:19:17 INFO src/common.c: Loading device parameters....
2017-05-21T14:19:17 INFO src/common.c: Device connected is: F1 Medium-density device, id 0x20036410
2017-05-21T14:19:17 INFO src/common.c: SRAM size: 0x5000 bytes (20 KiB), Flash: 0x10000 bytes (64 KiB) in pages of 1024 bytes
2017-05-21T14:19:17 INFO src/common.c: Attempting to write 140 (0x8c) bytes to stm32 address: 134217728 (0x8000000)
Flash page at addr: 0x08000000 erased
2017-05-21T14:19:17 INFO src/common.c: Finished erasing 1 pages of 1024 (0x400) bytes
2017-05-21T14:19:17 INFO src/common.c: Starting Flash write for VL/F0/F3 core id
2017-05-21T14:19:17 INFO src/flash_loader.c: Successfully loaded flash loader in sram
  0/0 pages written
2017-05-21T14:19:17 INFO src/common.c: Starting verification of write complete
2017-05-21T14:19:17 INFO src/common.c: Flash written and verified! jolly good!


Con lo que debemos ver nuestro LED parpadear.


En la siguiente entrega explicaré como usar el debugger (OpenOCD) con nuestro programa de ejemplo.
#3
GNU/Linux / Re:VIM | Instalar Plugins para Vim
Enero 29, 2017, 10:39:05 PM
Que tal los plugins que you uso son:

Código: php
YouCompleteMe
Trinity
TagList
NerdTree
Synastic
DoxygenToolkit
The-NERD-Commenter
LanguageTool


y ctags


Código: php
^]  <- Para ir a la definición de una función




Código: php
^t <- Para regresar


también puedes buscar e instalar plugins sin salir de vim con

Código: php
VundleSearch


e instalar con solo posicionarte en el plugin que quieres instalar.
#4
La respuesta es no.

Son totalmente diferentes. El raspberry pi zero es sólo una versión más del raspberry pi, pero sin todos los puertos.
#5
En definitiva puedes usar los GPIOs de la raspberry pi en lugar de añadirle un arduino, pero tienes que tener en cuenta en el diseño algunos puntos importantes

1.- Con cualquier microcontrolador puedes obtener tiempos de respuesta predecibles y en corto tiempo, en una Raspberry Pi no ya que el Sistema Operativo es el que controla todo a través de un planificador que no es de tiempo real, tu no tienes acceso directo al hardware, todo lo haces a través de kernel y el es el que va a decidir cuando ejecuta tu tarea  :'( .

Existen parches para el kernel, pero aún así tienes que pasar por varias capas antes de tengas acceso a los 40 GPIOs del Raspberry Pi.

Entre más lejos te encuentras del hardware más difícil es poder asegurar los tiempos, si vas al siguiente post

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Te darás cuenta la diferencia que tienes al generar un tren de pulsos con periodo de 100us (50%) usando, por así decirlo, la capa de arduino a emplear directamente el avr-gcc.

2.- Los GPIOs del Raspberry Pi manejan niveles de voltaje a 3.3v, la mayoría de los arduinos son a 5 V, o cuenta con pines tolerantes a 5V (como el DUE).

3.- ADCs: Todos los Arduinos cuentan con conversores Análogos a Digital, las Raspberry no, por lo que tendrías dos opciones, usar algunos ADC que usa SPI/I2C, un arduino, o cualquier otro Microcontrolador.
#6
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Muy bueno!! Tienes algún video como para verlo?
Saludos

Ya he añadido el vídeo.

Saludos
#7
Este dispositivo es el wireshark del hardware.

El Analizador Lógico, junto con el Osciloscopio, es una de las herramientas esenciales en el mundo del diseño digital. Permite capturar varia señales digitales para inspeccionar si dichas señales muestran los comportamientos esperados, reduciendo con el ello el tiempo de depuración y desarrollo.

Con el se puede analizar desde una señal sencilla hasta protocolos como el serial, i2c, spi, CAN, DMX-512, JTAG, Modbus, USB, entre otros.

Vienen en distintas presentaciones: Dispositivo independiente y USB.

Los más económicos que se puede encontrar son los de saleae, que además proveen de un programa multiplataforma.

Ejemplo:

Arduino Pro Mini: Arduino IDE, Retardo de 50us


Resultados: El analizador lógico nos permite determinar que en lugar de tener una señal de 0.1 ms con un ciclo de trabajo del 50%, terminamos con una señal de 0.1114 ms con un ciclo de trabajo de 47.14% o 52.51us arriba y 58.8us abajo.

Arduni Pro Mini: avr-gcc, Retardo de 50us


Resultado: 0.1011ms con un ciclo de trabajo del 50.06%, mucho mejor que el anterior.


Sólo hay una advertencia, y que aplica a a todos los instrumentos de este tipo, hay que cuidarse de un fenómeno que en inglés se conoce como Ground Loop, y esta relacionado a las múltiples rutas que GND puede tomar a tierra, estas múltiples rutas puede generar una diferencia de potencial que es perjudicial. Si la instalación eléctrica es antigua y no cuenta con Tierra Física, podría no haber problemas, pero si es moderna, se tienen que tomar precauciones extras para no quemar el dispositivo, el puerto USB o en el peor de los casos el ordenador.
#8
Este es un programa, multi plataforma, para la captura de esquemáticos y diseño de circuitos impresos que nació en 1992.

Cuando el CERN comenzó a contribuir en 2013, esta herramienta inició su camino a convertirse en una alternativa real a otras herramientas comerciales.

Se pueden realizar diseños desde una sola capa hasta 32 capas, y puede ser usado sin limitación tanto en productos comerciales como open source.

Lo más común es hacer 1,2 o 4 capas, siendo las dos primeras las más económicas de producir.

En youtube hay varios vídeos que enseñan a usar KiCAD desde cero.

Ejemplo propio

Interfaz para el control de un Motor DC con retro alimentación para poder controlar la velocidad del motor, 2 Capas, dimensiones 22x25mm.

Captura de Esquemático


Diseño PCB


Representación 3D


La necesitaba para un curso en edx. Para hacerlo costeable (por aquello de envío de los componentes) necesitaba producir cuando menos 12 de estas placas, con un costo total (PCBs y componentes) de alrededor 80 dolares. Todo proveniente de Estados Unidos. Pero sólo necesitaba una no 12.

PCBs: 17.2 USD por las 12
Componentes: El resto

URLs:
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Alternativa a

Eagle, Altium
#9
Toca la marcha imperial de Star Wars cuando la lectura de la foto resistencia (LDR) baja de cierto valor.
Entradas:
A0  - LDR
Salidas:
D13 - LED
D8  - Buzzer

Código: cpp
// NB: ALL NOTES DEFINED WITH STANDARD ENGLISH NAMES, EXCEPT FROM "A" 
//THAT IS CALLED WITH THE ITALIAN NAME "LA" BECAUSE A0,A1...ARE THE ANALOG PINS ON ARDUINO.
// (Ab IS CALLED Ab AND NOT LAb)
#define  C0 16.35
#define Db0 17.32
#define D0  18.35
#define Eb0 19.45
#define E0  20.60
#define F0  21.83
#define Gb0 23.12
#define G0  24.50
#define Ab0 25.96
#define LA0 27.50
#define Bb0 29.14
#define B0  30.87
#define C1  32.70
#define Db1 34.65
#define D1  36.71
#define Eb1 38.89
#define E1  41.20
#define F1  43.65
#define Gb1 46.25
#define G1  49.00
#define Ab1 51.91
#define LA1 55.00
#define Bb1 58.27
#define B1  61.74
#define C2  65.41
#define Db2 69.30
#define D2  73.42
#define Eb2 77.78
#define E2  82.41
#define F2  87.31
#define Gb2 92.50
#define G2  98.00
#define Ab2 103.83
#define LA2 110.00
#define Bb2 116.54
#define B2  123.47
#define C3  130.81
#define Db3 138.59
#define D3  146.83
#define Eb3 155.56
#define E3  164.81
#define F3  174.61
#define Gb3 185.00
#define G3  196.00
#define Ab3 207.65
#define LA3 220.00
#define Bb3 233.08
#define B3  246.94
#define C4  261.63
#define Db4 277.18
#define D4  293.66
#define Eb4 311.13
#define E4  329.63
#define F4  349.23
#define Gb4 369.99
#define G4  392.00
#define Ab4 415.30
#define LA4 440.00
#define Bb4 466.16
#define B4  493.88
#define C5  523.25
#define Db5 554.37
#define D5  587.33
#define Eb5 622.25
#define E5  659.26
#define F5  698.46
#define Gb5 739.99
#define G5  783.99
#define Ab5 830.61
#define LA5 880.00
#define Bb5 932.33
#define B5  987.77
#define C6  1046.50
#define Db6 1108.73
#define D6  1174.66
#define Eb6 1244.51
#define E6  1318.51
#define F6  1396.91
#define Gb6 1479.98
#define G6  1567.98
#define Ab6 1661.22
#define LA6 1760.00
#define Bb6 1864.66
#define B6  1975.53
#define C7  2093.00
#define Db7 2217.46
#define D7  2349.32
#define Eb7 2489.02
#define E7  2637.02
#define F7  2793.83
#define Gb7 2959.96
#define G7  3135.96
#define Ab7 3322.44
#define LA7 3520.01
#define Bb7 3729.31
#define B7  3951.07
#define C8  4186.01
#define Db8 4434.92
#define D8  4698.64
#define Eb8 4978.03
#define PAUSE 0.0
#define END 1.0
// DURATION OF THE NOTES
#define BPM 120    //  you can change this value changing all the others
#define H 2*Q //half 2/4
#define Q 60000/BPM //quarter 1/4
#define E Q/2   //eighth 1/8
#define S Q/4 // sixteenth 1/16
#define W 4*Q // whole 4/4
int i = 0;

float Notes[][2] = {{LA3,Q},{LA3,Q},{LA3,Q},{F3,E+S},{C4,S},
                   {LA3,Q},{F3,E+S},{C4,S},{LA3,H},
                   {E4,Q},{E4,Q},{E4,Q},{F4,E+S},{C4,S},
                   {Ab3,Q},{F3,E+S},{C4,S},{LA3,H},
                   {LA4,Q},{LA3,E+S},{LA3,S},{LA4,Q},{Ab4,E+S},{G4,S},
                   {Gb4,S},{E4,S},{F4,E},{PAUSE,E},{Bb3,E},{Eb4,Q},{D4,E+S},{Db4,S},
                   {C4,S},{B3,S},{C4,E},{PAUSE,E},{F3,E},{Ab3,Q},{F3,E+S},{LA3,S},
                   {C4,Q},{LA3,E+S},{C4,S},{E4,H},
                   {LA4,Q},{LA3,E+S},{LA3,S},{LA4,Q},{Ab4,E+S},{G4,},
                   {Gb4,S},{E4,S},{F4,E},{PAUSE,E},{Bb3,E},{Eb4,Q},{D4,E+S},{Db4,S},
                   {C4,S},{B3,S},{C4,E},{PAUSE,E},{F3,E},{Ab3,Q},{F3,E+S},{C4,S},
                   {LA3,Q},{F3,E+S},{C4,S},{LA3,H},{PAUSE,2*H},{END,H}
                   };
void play(float note, float duration)
{
  tone(8,note,duration);
  digitalWrite(13,HIGH);
  delay(duration/2);
  digitalWrite(13,LOW);
  delay(1+duration/2);
}

void setup() {
  // put your setup code here, to run once:
  pinMode(8,OUTPUT);
  pinMode(13,OUTPUT);
  digitalWrite(13,LOW);
}

void loop() {
  // put your main code here, to run repeatedly:
  if(analogRead(0)<200)
  {
   
    play(Notes[i][0],Notes[i][1]);
    i++;
    if(Notes[i][0] == END) i = 0;
  }
}


Video
#10
GNU/Linux / Re:Postea tu escritorio Linux
Octubre 02, 2016, 03:40:56 AM
Minimalismo puro



Escritorio Extendido: Dos pantallas
Manejador de Ventanas: Awesome
Algunas aplicaciones útiles que siempre inicio con el sistema:
1.- redshift (gtk-redshift)
2.- synergy (muy útil para compartir el teclado y ratón con varios equipos Linux, Windows y Mac)
#11
Esta es una solución alternativa a usar expresiones regulares. Para el caso de web scrapping, a mi parecer el uso de las expresiones regulares no es de lo más adecuado ni tampoco sano como para permitirnos conservar la integridad mental  ;D

En este ejemplo uso etree y xpath

Código: python
import urllib2
from lxml import etree

def get_users(html):
    parsedHTML = etree.HTML(html)
    pelement = parsedHTML.xpath('//div[@id="upshrinkHeaderIC"]/p[@class="inline smalltext"]')[0]
    return([href.split("/")[-2] for href in pelement.xpath("a/@href") if "profile" in href])


if __name__ == "__main__":
    response =  urllib2.urlopen("https://underc0de.org/foro/index.php")
    print(get_users(response.read()))


Código: bash
['1410', 'TheAssassinExp', 'arthusu', 'Jonydakid', 'str0nasfck', 'boguies', 'skrillex', 'zenzey909', 'AFelipeTrujillo', 'skwlk', 'wilkin07', 'iamcholo', 'grep', 'Elixus', 'coke951', 'Victimous', 'cnfs', 'Zentraedi', 'Gabriela', 'nkmil', 'Amorrua', 'slipknotoy', 'mariodos', 'rejeanan', 'andrei_phantom', 'BlackBlex', 'xrahitel', 'DaLeXx007', 'DammZ', 'Stuxnet', 'T3mpor4lGN', 'javichoooz', 'YENA', 'ceroMee', 'blackdrake', 'luff1', 'dtubio', 'TioNacho', 'drakoniano', 'gerard14', 'blacksucces', 'servventas', 'Pablo2011', 'blanco', 'erguli', 'noxon', 'graphixx', 'Bernatixer', 'creeper22', 'Rapzus', 'quino32', 'Stiuvert', 'phr4ckl0t', 'R.JimSor', 'roberton84', 'ice.modding', 'Flame', 'theplageblack', 'Joni2012', 'antoniocr', 'japheth1518', 'LionSec', 'Gho0st', 'hack066', 'roadd', 'selohu', 'catami61', 'PikachuDorado', 'Eduardez', 'Se%C3%B1orQ', 'hum4n3xpl01t', 'EPSILON', 'drok3r', 'tito_chua', 'Chriseric', 'cborgon', 'pab%20mac', 'VinC90', 'L3gacy', 'RICY', 'ninfaaruna', 'troki2011', 'Yoskor', 'rollth', 'Flemon', 'pablormago', 'Hu3c0', 'alfred', 'Pistojo', 'darkside85', 'hati', 'nitro_x_net', 'rodanet', 'adragon', 'Meteorrr', 'julen', 'Hactot', 'Rafaelpb14', 'Nkizux', 'Blank', 'Carvachorum', 'lestherelyhuneth123', 'AndresMaicho', 'wicope', 'AndrewMa', 'BadB0y_4', 'caradepoio', 'RickSanchez', 'zaphiel', 'redferne', 'Nik', 'wblack', 'mbwun28']



Saludos
#12
Lo primero que deberías es crear los archivos objeto
Código: php

g++ LibroCalificaciones.cpp -c
g++ vista.cpp -c


Esto te va a generar dos archivos objeto. Para generar el ejecutable final:

Código: php
g++ vista.o librocalificaciones.o -o vista


Sólo revisa los nombres de los archivos objeto y ejecutas el último comando.

Saludos
#13
Presentaciones y cumpleaños / Saludos
Septiembre 30, 2016, 03:32:29 AM
Que tal, recién llegado y listo para aprender.

Soy más del área de la electrónica, pero en la actualidad tanto software como hardware van de la mano y  con ello la seguridad que implica conectar dispositivos electrónicos a Internet (IoT).

Entre el hardware que manejo están los PICs, AVRs, MSP430, ,ARM Cortex M, los módulos esp8266 (NodeLua y SDK), Raspberry Pi, etc.

Aunque he llegado a usar los Arduinos, todavía tengo preferencia en el uso de lo más tradicional, como

Código: php

#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
    DDRB |= 0B00100000;
    while(1) {
        PORTB |= 0B00100000;
        _delay_ms(1000);
        PORTB &= 0B11011111;
        _delay_ms(1000);
    }
}


En lugar de

Código: php

void setup() {
  // initialize digital pin 13 as an output.
  pinMode(13, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);              // wait for a second
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);              // wait for a second
}


El primero usa 176 bytes de memoria y el segundo usa 928 bytes, además el primero te permite conocer más a fondo el microcontrolador que estas usando.

Últimamente uso más los ARM Cortex que los PICs o AVRs, sobre todo los stm32 que suelen ser más económicos e incluso las tarjetas de desarrollo de estos, que las han llamado Nucleo o Discovery, son más económicas que los mismos Arduinos, hablando de productos originales y no clones o de origen chino.

El SO que uso es GNU/Linux, principalmente Debian y Ubuntu.

SaludOS.