From cd987913a5bc44d84a351d47a109a25b2408aa7f Mon Sep 17 00:00:00 2001 From: "Rafael L. Salgueiro" Date: Mon, 10 Jan 2022 10:03:30 -0500 Subject: [PATCH] Traduccion de Archivos --- dapps-es.md | 1058 +++++++++++++++++++++ gobot-es.md | 929 +++++++++++++++++++ index-es.md | 110 +++ intro_20180303-es.md | 170 ++++ intro_20180520-es.md | 149 +++ intro_20180729-es.md | 170 ++++ micropython-es.md | 2104 ++++++++++++++++++++++++++++++++++++++++++ nodebots-es.md | 1047 +++++++++++++++++++++ 8 files changed, 5737 insertions(+) create mode 100644 dapps-es.md create mode 100644 gobot-es.md create mode 100644 index-es.md create mode 100644 intro_20180303-es.md create mode 100644 intro_20180520-es.md create mode 100644 intro_20180729-es.md create mode 100644 micropython-es.md create mode 100644 nodebots-es.md diff --git a/dapps-es.md b/dapps-es.md new file mode 100644 index 00000000000..79993d771a8 --- /dev/null +++ b/dapps-es.md @@ -0,0 +1,1058 @@ +# Blockchain, DApps y Blockstack + +## Conceptos básicos para empezar + +---------------- + +### Estas diapositivas: [slides.cuban.tech/dapps.html](http://slides.cuban.tech/dapps.html) + +---------------- + +### Información Wifi + +Red: cubantech + +Contraseña: meet-ups + +---------------- + +## Esbozo + +- Máquinas de estado replicadas (denominadas RSM) +- Herramientas de infraestructura, gestión y administración +- Relación entre RSM y Blockchain +- Reglas de ejecución y consenso +- Teoría General de DApps +- Vista general de Blockstack +- RSM de DApp independiente de blockchain con VirtualChain + +Notas sobre la red Bitcoin P2P entre + +---------------- + +## Máquinas de Estado - Estados + +![Estados](img/rsm.states.png) + +---------------- + +## Máquinas de estado - Entradas + +![Entradas](img/rsm.inputs.png) + +---------------- + +## Máquinas de Estado - Transición + +![transición](img/rsm.transition.png) + +---------------- + +## El problema de la escalabilidad + +![Problema de Escalabilidad](img/rsm.scale.png) + +-- + +## Estadísticas de Bitcoin + +![Estadísticas de Bitcoin](img/bitcoin.stats.png) + +---------------- + +## Servicios distribuidos como máquinas de estado + +- Tolerancia a fallos más allá de los procesadores de un solo nodo +- Réplicas de un único servidor ejecutado en procesadores separados +- Protocolos para interacciones de clientes con réplicas +- Aislamiento físico y eléctrico para fallos independientes del servidor +- Asumamos que la máquina de estado determinista + - .... incluso si Turing completo es posible + +---------------- + +## El enfoque de la máquina de estado + +- Implantar réplicas del software +- Recibir las solicitudes de los clientes (las entradas) +- Pedir las entradas +- Ejecute la transición de SM una y otra vez +- Supervisar las réplicas en busca de diferencias de estado o de salida. + +---------------- + +## El enfoque de la máquina de Estado + +### Desplegar software en múltiples nodos + +[![Logo docker Cuba](img/dockercuba.logo.png)](http://docker.cuban.tech) + +[docker.cuban.tech](http://docker.cuban.tech) + +- Repositorios de paquetes de software + - por ejemplo[bitcoind @ Debian](https://packages.debian.org/bitcoind),[Blockstack apt repo](https://packages.blockstack.com), .... +- Contenedores y registros + - Por ejemplo,[Lisk](https://hub.docker.com/u/lisk/),[Blockstack](https://hub.docker.com/u/blockstack), .... Docker Hub +- Herramientas CM (Ansible, Puppet, Chef, Habitat, ....) + +---------------- + +## Estado de CM - Q1 2017 + +![Forrester Wave](img/forrester_wave_cm_q1.jpg) + +---------------- + +## El enfoque de máquina de estado + +- Implantar réplicas del software +- Recibir las peticiones del cliente (es decir, las entradas) +- Pedir las entradas +- Ejecute la transición de SM una y otra vez +- Supervisar las réplicas en busca de diferencias de estado o de salida. + +---------------- + +## El enfoque de la máquina estatal + +### Recibir las peticiones de los clientes + +- Múltiples soluciones +- p. ej., transacciones Bitcoin + +---------------- + +## Bitcoin - Anatomía de las transacciones + +### Meta-datos importantes (excepto[transacciones en la base de monedas](https://bitcoin.org/en/glossary/coinbase-transaction)) + +![Bitcoin](img/bitcoin-en-tx-overview.svg) + +- ID de transacción (global) +- Número de versión (evolución del protocolo) +- Hora de cierre + - La primera vez que se puede añadir TX a la cadena de bloques + - Transacciones con bloqueo temporal que sólo son válidas en el futuro. + - Cancelaciones + +-- + +## Bitcoin - Anatomía de las transacciones + +### Entradas y salidas + +![](img/bitcoin-en-tx-overview.svg) + +- Resultado(s) : Índice de arreglo implícito + * Cantidad (satoshis) + * Guión Pubkey ( Desbloquear para gastar) +- Insumos(s) + * Salida gastada (ID de transacción + Índice de salida) + * Número de secuencia (relacionado con la hora de cierre) + * Script de firma (parámetros para desbloquear el script Pubkey) + +> Bitcoin es un libro de contabilidad de distribución pública. + +-- + +## Bitcoin - Transacción de muestra + + blocktrail.com + +![Bitcoin](img/bitcoin.tx.c60e4dc5e69c19ff53a45954d8a8996fd9aac6fda317fd7238dec6a482c718cf.png) + +-- + +## Bitcoin - Envío de transacciones + +##### Configuración de pago a clave pública (P2PKKH) + +![Bitcoin](img/bitcoin-en-crear-p2pkh-output.svg) + +- Curva (elíptica) ECDSA secp256k1 + - Generación de claves públicas determinantes (hash) + +-- + +## Bitcoin - Envío de transacciones + +##### Configuración de pago a hash de clave publica (P2SH) + +![](img/bitcoin-en-crear-p2sh-output.svg) + +- Redimir el hash del script en lugar del hash de la clave pública + * Soporta [PubKey scripts opcodes](https://bitcoin.org/eb/developer-reference#opcodes) + +-- + +## Bitcoin - Envío de transacciones + +###### Finalize TX + +![](img/bitcoin-en-tx-overview-utxo.svg) + +- El remitente crea UTXO con el script PubKey + * ... usando el hash de clave pública del receptor +- Transacción de emisiones del remitente (red P2P) +- Los mineros lo añaden a un bloque (... más detalles más adelante...) +- Cartera : Cantidad de UTXO como saldo utilizable + +-- + +## Bitcoin - Gastar salidas P2PKH + +![](img/bitcoin-en-unlocking-p2pkh-output.svg) + +- ID de transacción de búsqueda e índice para UTXO +- El remitente crea la entrada de transmisión y también agrega: + * Número de secuencia + * Firma y PubKey (script params) + +-- + +## Bitcoin - Gastar salidas P2SH + +![](img/bitcoin-en-unlocking-p2sh-output.svg) + +- ID de transacción de búsqueda e índice para UTXO +- El remitente crea la entrada de transmisión y también agrega: + * Número de secuencia + * Firma y PubKey (script params) + +-- + +## Bitcoin - Salidas de gastos + +###### Last steps + +- El remitente prepara el UTXO para el destinatario (como antes) +- Transacción de emisiones del remitente (red P2P) +- Los mineros lo añaden a un bloque + - Validación del guión ( A-ha!) +- Cartera : Actualizar saldo + +-- + +## Bitcoin - Script público P2PKH estándar + +##### Línea de tiempo de la pila de ejecución + +![](img/bitcoin-en-p2pkh-stack.svg) + +--- + +# Red P2P + +Un monstruo muy peculiar + +-- + + +## Red P2P + +##### Descubrimiento entre iguales - DNS de semillas de Bitcon + +``` +SECCIÓN DE PREGUNTAS +;semilla.bitcoin.sipa.be IN A + +SECCIÓN DE RESPUESTAS +semilla.bitcoin.sipa.be. 60 EN UN 192.0.2.113 +semilla.bitcoin.sipa.be. 60 EN UN 198.51.100.231 +semilla.bitcoin.sipa.be. 60 EN UN 203.0.113.183 +``` + +- Conecte al puerto `8333` (red principal) o `18333` (red de prueba) +- Seguido de mensajes `addr` que anuncian las direcciones de los compañeros + +-- + +## Red P2P + +##### Conectando con sus pares + +- Enviar [mensaje `version`](https://bitcoin.org/en/developer-reference#version) + * número de versión local, bloque y hora actual +- El par responde con su propio mensaje de "versión +- Enviar `getaddr` y recibir `addr` de nuevos pares (descubrimiento) + +-- + +## Red P2P + +##### Transacciones de radiodifusión + +- Envíe [mensaje de invitación](https://bitcoin.org/en/developer-reference#inv) a un par. +- Esperar el mensaje `getdata` +- Enviar datos de la transacción en un mensaje `tx`. +- Los pares reenvían transacciones a otros pares +- Los nodos completos realizan un seguimiento de las transacciones no confirmadas en [memory pool](https://bitcoin.org/en/developer-guide#memory-pool) + +> ...continuará... + +--- + +## El enfoque de la máquina de estado + +- Implantar réplicas del software +- Recibir las solicitudes de los clientes (es decir, las entradas) +- Ordenar las entradas +- Ejecute la transición de SM una y otra vez +- Supervisar las réplicas en busca de diferencias de estado o de salida. + +--- + +## El enfoque de la máquina de estado + +##### Pedido de entradas + +- Soluciones mutiple +- [Blockchain](https://en.wikipedia.org/wiki/Blockchain_database) ? +- Transacciones Bitcoin! + +-- + +## Bitcoin - Gastos de transacción + +![](img/bitcoin-en-tx-overview-spending.svg) + +Ordenamiento causal : Cadena de propiedad + +--- + +## El enfoque de la máquina de Estado + +- Implantar réplicas del software +- Recibir las solicitudes de los clientes (es decir, las entradas) +- Pedir las entradas +- Ejecutar la transición de SM una y otra vez. +- Supervisar las réplicas en busca de diferencias de estado o de salida. + +--- + +## El enfoque de la Máquina de Estado + +##### Ejecutar la Máquina de Estado + +![](img/rsm.transition.png) + +- Ejecutar las entradas en el orden seleccionado en cada réplica. + +-- + +## Bitcoin - Propagación de transacciones + +![](img/bitcoin-en-transaction-propagation.svg) + +--- + +## Bitcoin blockchain + +##### Metas de diseño + +- Libro mayor público + - Transacciones ordenadas y con sello de tiempo +- Almacenamiento distribuido sobre Bitcoin [nodos completos](https://bitcoin.org/en/glossary/node) +- Proteger contra + - [double spending](https://bitcoin.org/en/glossary/double-spend) + - modificación de registros de transacciones anteriores + +-- + +## Bitcoin blockchain + +###### Panorama general + +![](img/bitcoin-en-blockchain-overview.svg) + +-- + +## Cabecera del bloque Bitcoin + +- **Versión**: 4 bytes +- **Características de la cabecera del bloque anterior**: 32 bytes +- **Hash de raiz Merkle**: 32 bytes +- **Tiempo**: 4 bytes +- **nBits**: 4 bytes +- **nonce**: 4 bytes + +-- + +## Bitcoin Bloque 493387 + + blocktrail.com + +[![](img/bitcoin.block.493387.png)](https://www.blocktrail.com/BTC/block/000000000000000000ad396808fdc05052655d8a80aee7ffc538b71828ea03d3) + +-- + +## Bitcoin Block 493387 - Transacciones + +La transacción de Coinbase es lo primero + +[![](img/bitcoin.txs.493387.png)](https://www.blocktrail.com/BTC/block/000000000000000000ad396808fdc05052655d8a80aee7ffc538b71828ea03d3) + +--- + +## Proofs + +- Métrico + * Demostrar interés legítimo, irreversibilidad + * Tomar decisiones sobre cambios en un DApp +- Modificar bloques pasados es más difícil que añadir nuevos bloques. +- Ejemplos comunes + * **Prueba de trabajo** (PoW) + * **Prueba de participación** (PoS) + * **Prueba de espacio** (PoSpace) + * **Prueba de colaboración** (PoC) + * **Prueba de réplica** (PoR) +- Se puede utilizar en paralelo + * p.ej.[PeerCoin](http://peercoin.net) se basa en PoW + PoS + +-- + +## Prueba de trabajo + +- *Conductor* . : Cantidad de trabajo computacional (CPU, GPU, NPU,...) que contribuyó al funcionamiento del DApp. +- Recursos intensos (energía, refrigeración,...) +- El mecanismo para establecer el consenso a través del PoW se denomina comúnmente minería. + +> *Bitcoin* utiliza este enfoque para su funcionamiento diario. + +-- + +## Proof of stake + +- *Conductor* : nuevas monedas según el número de monedas (stake) que poseas. +- Puede ser abusado por aquellos que tienen suficientes monedas. +- Normalmente se combina con otras pruebas + +> *OmniLayer* se basa en el mecanismo POS. + +-- + +## Prueba de capacidad + +- *Conductor* : asignación de cantidades no triviales de memoria o almacenamiento necesarias para resolver un problema (funciones difíciles de memorizar). +- Alternativa más ecológica al PoW + +> Se utiliza PoStorage en PermaCoin, SpaceMint,[BurstCoin](https://en.wikipedia.org/wiki/Burstcoin) . + +-- + +## Prueba de colaboración + +- Validación colaborativa de nodos (en breve CVNs) + *[Decide](https://chain.fair-coin.org/download/FairCoin2-white-paper-V1.1.pdf) qué nodo crea el siguiente bloque + * Aprobar CVN mediante la firma digital de un dato que contenga la identificación del ganador. + * Con las firmas requeridas, reúna TX y cree un nuevo bloque. +- Sin recompensa (dinero nuevo) por la creación del bloque (cuota pequeña) +- El consumo de energía es bajo (CVNs en una Raspberry3) + +> FairCoin (fork de Bitcoin 0.12) implementa PoC desde el 18 de julio de 2017. + +--- + +## Árbol de Merkle - Transacciones de Recoleccion + +![](img/bitcoin-en-merkle-prune.png) + +**Modos de funcionamiento**: [SPV clients](https://bitcoin.org/en/glossary/simplified-payment-verification) vs[nodo completo](https://bitcoin.org/en/glossary/node) + +--- + +## Red P2P (contd.) + +##### Descarga del bloque inicial + +- Primera ejecución : El nodo sólo contiene[bloque 0](https://bitcoin.org/en/glossary/genesis-block) +- Elija un par remoto (también conocido como nodo de sincronización) +- Descargar desde el bloque 1 a la punta actual de la mejor cadena de bloques del nodo de sincronización + * Bloques primero (hasta la versión 0.9.3) + * Encabezados primero (desde 0.10.0 en adelante) + +--- + +## Bitcoin mining + +- Añadir nuevos bloques a la cadena de bloques +- Dificultar la modificación del historial de traducción +- Estrategias + * Minería en solitario + * Minería colectiva + +--- + +## Minería Bitcoin - Minería en solitario + +![](img/bitcoin-en-solo-mining-overview.svg) + +- Minero genera nuevos bloques por su cuenta +- Reclama completamente el premio de bloqueo y las comisiones de transacción +- Grandes pagos +- Mayor varianza (mayor tiempo entre ellos) + +--- + +## Bitcoin mining - Minería en grupo + +![](img/bitcoin-en-pooled-mining-overview.svg) + +- Grupo de mineros comparte recursos con otros mineros +- Encuentra los bocks más a menudo en los objetivos de bits más fáciles +- Producto compartido entre los mineros + * Correlacionado con la potencia relativa del hash PoW +- Pagos pequeños +- Menor varianza (es decir, menor tiempo entre pagos) + +-- + +## SlushPool + +[slushpool.com/home/](https://slushpool.com/home/) + +![](img/slushpool.png) + + Monedas acuñadas ``+1M BTC` extraídas desde diciembre de 2010. `ZCASH` desde el 20 de abril de 2017 + +-- + +## SlushPool + +###### Hash rate + +![](img/slushpool.hashrate.20171113.png) + +-- + +## SlushPool + +##### Distribución de las tarifas de Hash + +![](img/slushpool.hashratedist.20171113.png) + +-- + +## Bitmain - AntMiner + +[bitmaintech.com](https://bitmaintech.com/) + +![](img/bitmain.antminer.s9.png) + + Monedas acuñadas : `BTC` + +-- + +## Bitmain - AntPool + +[bitmaintech.com](https://bitmaintech.com/) + +![](img/bitmain.antpool.png) + +-- + +## Pool de BTCC + +[pool.btcc.com](https://pool.btcc.com/) + +![](img/btcc.png) + + Monedas acuñadas : `BTC` + +--- + +## Hardware minero Bitcoin + +##### Capacidad instalada - 2017/11/13 + +
![](img/btc.hashrate.20171113.png)
) + +- 6,4 EHash/s, 80.704.290,84 PFLOPS +- 10.000 toneladas métricas de hardware. Suficiente material para construir otra torre Eiffel. + +-- + +## Hardware minero Bitcoin - Energía + +![](img/bitcoin.energía.polvo.asic.jpg) + +Circuitos integrados específicos para aplicaciones específicas, también conocidos como ASIC + +-- + +## Consumo de energía de Bitcoin PoW + +... según[BitcoinEnergyConsumption.com](https://BitcoinEnergyConsumption.com) + +![](img/bitcoin.pow.energy.png) + +- Proyectado para ser comparable al de Dinamarca en 2020 + +--- + +## P2P network (contd.) + +###### Bloqueo de la transmisión - Empuje no solicitado + +- Miner incluye el bloque minado en el nuevo[`block` message](https://bitcoin.org/en/developer-reference#block) +- Miner envía un mensaje a sus pares de nodos completos + +> desde la versión 0.12.0 + +-- + +## Red P2P + +###### Bloque de transmisión - Retransmisión de bloque estándar + +- Método estándar +- Miner envía un mensaje `inv` a todos los pares (SPV y nodo completo) + - Incluye inventario referido al bloque +- **Par BF** ⇒ `getdata` solicitando el bloque completo + - Miner ⇒ Mensaje de `bloque` +- **Par HF** ⇒ `getheaders` (pocos encabezados en la mejor cadena de bloques) + - Miner ⇒ Mensajes de `encabezados` +- **Clientes de SPV** ⇒ `getdata` solicitando un bloque Merkle + - Miner ⇒ `merkleblock` seguido de algunos mensajes `tx`. + +> desde la versión 0.12.0 + +-- + +## Red P2P + +###### Block broadcasting - Anuncio de encabezados directos + +- Se usa si los pares señalan con `sendheaders` durante el cacheo. +- Miner envía un mensaje de `cabecera` desde un nuevo bloque +- **HF peer** ⇒ Validación parcial y envío de `getdata` +- Miner ⇒ `block` o `merkleblock`. + +> desde la versión 0.12.0 + +--- + +## El enfoque de la máquina de estado + +- Implantar réplicas del software +- Recibir las solicitudes de los clientes (es decir, las entradas) +- Pedir las entradas +- Ejecute la transición de SM una y otra vez +- Supervisar las réplicas en busca de diferencias de estado o de salida. + +--- + + +## El enfoque de la máquina de estado + +###### Envío de salidas + +- Cada réplica genera salida + * Las réplicas no defectuosas siempre producirán la misma salida +- Se filtran las salidas defectuosas + * Consenso +- Envío de la salida correcta al cliente + +-- + +## Consenso + +- Consenso de Nakamoto +- [Paxos](https://en.wikipedia.org/wiki/Paxos_%28computer_science%29) +- Sistemas de quórum +- [Raft](https://raft.github.io/) +- [Obelisk](https://blog.skycoin.net/statement/obelisk-the-skycoin-consensus-algorithm/) + +--- + +## Bitcoin - Consenso de Nakamoto + +##### Bifurcación ocasional vs bifurcación extendida + +![](img/bitcoin-en-blockchain-fork.svg) + +- Bloques simultáneos extraídos, los nodos eligen al ganador +- Los compañeros prefieren bifurcaciones con un mayor PoW + * Bifurcacion mas larga + * Altura máxima del bloque: distancia hasta[bloque 0] (https://bitcoin.org/en/glossary/genesis-block) + +-- + +## Bitcoin - Consenso de Nakamoto + +##### Bifurcación suave + +![](img/bitcoin-en-soft-fork.svg) + +- Cuándo? + * Muy a menudo, por ejemplo, mineros concurrentes. + * Las reglas de consenso mejoradas rechazan los bloques que antes eran válidos. + + [UASF](https://bitcoin.org/en/glossary/uasf) flag day vs.[MASF](https://bitcoin.org/en/glossary/uasf) Señalización de la mayoría de las tasas de hash + +-- + +## Bitcoin - Consenso de Nakamoto + +##### Resolución de Bifurcacion suave + +- Eliminar bloques (rancios y huérfanos) en bifurcaciones de bajo POW. +- Iterar sobre las transacciones en bloques rancios y huérfanos + * Descartarlo si TX pertenece a otro bloque de la bifurcacion PoW más alta. + * Moverlo de nuevo a TX mempool de lo contrario + + para ser incluido en un futuro bloque por este minero + + Transmisión (¿opcional?) a la red P2P + +-- + +## Bitcoin - Consenso de Nakamoto + +##### Bifurcacion rígidas + +![](img/bitcoin-en-hard-fork.svg) + +- ¿Cuándo? + * Extender la cadena de bloqueo para prevenir ataques de terceros 51%. + * Consenso mejorado Aceptar los bloques rechazados anteriormente + * Partición de red + +-- + +## Bitcoin - Corolarios de bifurcaciones rígidas + +- Advertencia en [`getnetworkinfo`] (https://bitcoin.org/en/developer-reference#getnetworkinfo) y ejecute el comando `-alertnotify` si está configurado. + * +6 bloques PoW que la mejor cadena válida + * Repetición de bloque y TX con números de versión más altos de lo esperado. +- [Coinbase transaction](https://bitcoin.org/en/glossary/coinbase-transaction) sólo se puede gastar después de 100 bloques. +- [Clientes del SPV](https://bitcoin.org/en/glossary/simplified-payment-verification) pueden ponerse en contacto con diferentes nodos completos + * Descartar cadenas con un PoW más débil + +--- + +## Bitcoin - Balance de clientes + +![](img/bitcoin-en-transaction-propagation.svg) + +Software para billetera: Sumar UTXO para determinar el balance + +--- + +## Tolerancia a fallos (en teoría) + +- Tolerancia para F fallos independientes aleatorios + * errores de memoria, fallo del disco duro, .... + * Requiere réplicas `2F + 1` +- La réplica fallida puede detenerse sin generar salidas + * Sólo se requieren réplicas `F + 1` + * .... ningún sistema existente alcanza este límite +- [Byzantine failures](https://en.wikipedia.org/wiki/Byzantine_fault_tolerance) + * Fallas aleatorias, espurias ⇒ `2F + 1` + * ataques maliciosos e inteligentes ⇒ `3F + 1` + +-- + +## Nodo Bitcoin + +##### Requisitos mínimos + +- Escritorio o portátil (Windows, Mac OS X o Linux) +- 125 GB de espacio en disco duro, 2 GB de RAM +- Internet de banda ancha con upload ≥ 400 Kbps (50 KB/s) + * Conexión no medida, o límites de carga elevados, respetar los límites de carga. + * 100 GB IBD + * ≈ 20 gigabytes de descarga al mes + * Carga de +200 GB al mes +- +6 horas al día con el nodo completo en funcionamiento +- +8 conexiones y pares de sincronización activos + +-- + +## Nodo Bitcoin + +> La mayoría de la gente ordinaria **NO** debería estar ejecutando un nodo completo. +> Necesitamos nodos completos que estén siempre encendidos, que tengan más de 8 conexiones. +> *(si sólo tienes 8, entonces eres parte del problema, no parte de la solución)*, +> y tener una conexión de banda ancha a Internet. + +Gavin Andresen, Jefe Científico de la Fundación Bitcoin, en[Reddit post] (http://www.reddit.com/r/Bitcoin/comments/1scd4z/im_running_a_full_node_and_so_should_you/cdw3lrh?context=3) + +--- + +# Teoría General de DApps + +--- + +## Definición de un DApp - Código abierto + +- Debe funcionar de forma autónoma +- Ninguna entidad que controle la mayoría de sus tokens +- Datos y registros en una cadena de bloques pública y descentralizada. + +> Las aplicaciones **Bitcoin** son de código abierto, ninguna entidad controla Bitcoin y sus registros son abiertos y públicos. + +--- + +## Definición de un DApp - Generación de tokens + +- El propósito de un token es permitir el acceso a la aplicación DApp. +- Debe generar tokens de acuerdo con un algoritmo estándar + - Posiblemente distribuir tokens al inicio de la operación. +- Las fichas deben ser necesarias para el uso de la aplicación. +- Contribución de los usuarios premiados mediante pago en los tokens de la aplicación. + +> Por ejemplo, **Bitcoin** genera bitcoins (tokens) con un algoritmo predeterminado que no se puede modificar. Los Tokens son necesarios para que Bitcoin funcione. Los mineros de Bitcoin son recompensados con bitcoins por sus contribuciones a la seguridad de la red Bitcoin. + +--- + +## Definición de un DApp - Consenso + +- El Protocolo podrá adaptarse en respuesta a + * mejoras propuestas + * retroalimentación del mercado +- Cambios decididos por consenso mayoritario de sus usuarios. + +> Por ejemplo, todos los cambios a **Bitcoin** deben ser aprobados por un consenso mayoritario de sus usuarios a través del mecanismo de prueba de trabajo. + +--- + +## Clasificación de DApps - Tipo I + +##### Según el uso de la cadena de bloque + +- Tienen su propia cadena de bloques. + +*Bitcoin*, *Litecoin* y otras[alt-coins] (https://en.wikipedia.org/wiki/List_of_cryptocurrencies) + +--- + +## Clasificación de DApps - Tipo II + +##### Según el uso de la cadena de bloque + +- Utilice la cadena de bloques de una aplicación descentralizada de tipo I. +- Son protocolos + * Fichas que son necesarias para su función. + +> *OmniLayer* (anteriormente *Master Protocol*) y *Blockstack* son ejemplos de aplicaciones descentralizadas de tipo II. + +-- + +## DApps tipo II + +##### Transacciones de datos nulos de Bitcoin + +- Incrustar datos adicionales en transacciones DApp tipo I +- Bitcoin[OP_RETURN](https://bitcoin.org/en/developer-reference#term-op-return) code + * Rendimientos probables de la poda + * Los mineros de Bitcoin tendrán la opción de podar esos datos. + +> Blockstack es un DApp tipo II + +--- + +## Clasificación de DApps - Tipo III + +##### Según el uso de la cadena de bloque + +- Utilizan el protocolo de una aplicación descentralizada de tipo II. +- Son protocolos y tienen fichas que son necesarias para su función. + +> Las aplicaciones *Omni* (anteriormente *Mastercoin*), y *Blockstack* son ejemplos de aplicaciones descentralizadas de tipo III. + +--- + +## Pasos fundamentales de un DApp + +- Publicación del libro blanco +- Distribución de fichas iniciales +- Delegación de la propiedad + +--- + +## Secciones del informe de DApp + +- Intenciones y objetivos de la DApp +- Planes de distribución de fichas +- Mecanismo para establecer el consenso +- Supervisión del DApp +- Gestión de recompensas de desarrolladores +- Descripción técnica de la DApp + +--- + +## Distribución de fichas - Minería + +- Los tokens se distribuyen a aquellos que contribuyen con más trabajo a la operación de un DApp. + +> Tomando como ejemplo *Bitcoin*, las bitcoins se distribuyen mediante un algoritmo predeterminado a los mineros que verifican las transacciones y mantienen la cadena de bloques Bitcoin. + +--- + +## Distribuir de tokens - Recaudación de fondos + +- Los tokens se distribuyen a quienes financian el desarrollo inicial del DApp. + +> Tomando como ejemplo el *Master Protocol*, Mastercoins se distribuyó inicialmente a aquellos que enviaban bitcoins a una dirección determinada a razón de 100 Mastercoins por bitcoin enviado. Las bitcoins recolectadas se utilizaron para financiar el desarrollo de aplicaciones que promovieron el desarrollo del Protocolo Maestro. + +--- + +## Distribución de tokens - Desarrollo + +- Los tokens se generan utilizando un mecanismo predefinido y sólo están disponibles para el desarrollo del DApp. + +> Además de su mecanismo de recaudación de fondos, el Protocolo Maestro utilizó el mecanismo de colaboración para financiar su desarrollo futuro. Algunas Mastercoins se distribuyen a través de un sistema de recompensas impulsado por la comunidad y basado en el mecanismo PoS. + +--- + +# Blockstack + +--- + +## ¿Por qué Blockstack? + +Internet ya tiene más de 40 años + +- [Servicios críticos fuera de línea](https://www.wired.com/2016/10/internet-outage-ddos-dns-dyn/) por ataques como DDoS en servidores DNS +- Confianza implícita, por ejemplo, [TurkTrust CA emitió certificados de seguridad falsos para Google](http://cnet.co/2oArU6O) +- De escritorio a nube crea SPoF, por ejemplo [Yahoo! perdiendo datos para 500 millones de personas](http://nyti.ms/2oAqn0G.) + +-- + +## ¿Por qué Blockstack? + +##### Ryan Shea, cofundador de Blockstack + + + +--- + +## ¿Qué es Blockstack? + +- Un nuevo Internet para aplicaciones descentralizadas +- Código abierto +- Re-descentralizar Internet +- Los usuarios poseen sus datos + +-- + +## Principio de diseño de confianza a confianza + +##### Muneeb Ali, Director Técnico de Blockstack + + + +--- + +## Metas Blockstack + +- Nombramiento y Descubrimiento Descentralizado + - Registrarse y utilizar nombres legibles por personas + - Descubra los recursos de red sin tener que confiar en ninguna parte remota. +- Almacenamiento descentralizado + - Almacenar datos sin revelarlos a terceros remotos. +- Rendimiento comparable + +--- + +## Blockstack - Decisiones clave + +- Sobrevivir a las fallas de las cadenas de bloqueo subyacentes +- Mantenga la complejidad y la lógica fuera de las cadenas de bloqueo + - opuesto a NameCoin, Ethereum, etc. ... +- Índice escalable para datos globales + +--- + +## Arquitectura Blockstack + +![](img/bsk-arquitectura-diagrama5.png) + +--- + +## Blockstack layers + +- Cadena de bloques virtual, encima de la cadena de bloques Bitcoin +- *Atlas*, una red de pares + - Índice global de información de descubrimiento +- **Gaia**, sistema de almacenamiento descentralizado + +> Los usuarios no necesitan confiar en ninguna capa de datos . + +--- + +## Blockstack - Capa de cadena de bloques + + DApp tipo II + +![](img/blockstack.blocks.png) + +-- + +## Blockstack - Transacciones de Nameops + +[![](img/blockstack.nameops.49393935.png)](https://explorer.blockstack.org/nameops/493935) + +-- + +## Ejemplo de transacción de datos nulos de Blockstack + + NAME_REGISTRATION bluestack.id + +[![](img/bitcoin.tx.702e76497a6061222208698c4d0fbed6ca768d10832e1b8da9184a8ea6f5ded8.png)](https://www.blocktrail.com/BTC/tx/702e76497a6061222208698c4d0fbed6ca768d10832e1b8da9184a8ea6f5ded8) + +--- + +## Blockstack - Capa de cadena virtual + +###### ¿Por qué? + +- RSM coherentes con la bifurcacion* en las cadenas de bloques existentes +- Detección y recuperación de bifurcaciones +- Migración a través de la cadena + - [Razones](https://blockstack.org/blog/why-blockstack-is-migrating-to-the-bitcoin-blockchain) para que Blockstack migre de Namecoin a Bitcoin + +-- + +## Blockstack - Capa de cadena virtual + +##### ...de acuerdo con Muneeb Ali, Director Técnico de Blockstack. + + + +-- + +## Blockstack - Cadena virtual + +##### Filtrando y ordenando TXs de OP_RETURN + + ![](img/bsk-virtual-blockchain.png) (en inglés) + +--- + +## Aplicaciones Blockstack - Explorer y AppStore + +![](img/bsk-appstore.png) + +--- + +## Aplicaciones Blockstack - Clonación de iTunes + +![](img/bsk-app-itunes.png) + +--- + +## Aplicaciones Blockstack - Afia + +![](img/bsk-app-afia.png) + +--- + +## Aplicaciones Blockstack - Casa + +![](img/bsk-app-casa.png) + +--- + +## Winding Up + +- Gracias por venir! +- Nos encantaría conocer su opinión: [bit.ly/blockstack-cuba-feedback](http://bit.ly/blockstack-cuba-feedback) \ No newline at end of file diff --git a/gobot-es.md b/gobot-es.md new file mode 100644 index 00000000000..7c14c32d5e4 --- /dev/null +++ b/gobot-es.md @@ -0,0 +1,929 @@ +# Taller de gobots + +#### Estas diapositivas: [slides.cuban.tech/gobot.html](http://slides.cuban.tech/gobot.html) + +---------------- + +### Información Wifi + +Red: cubantech + +Contraseña: meet-ups + +---------------- + +### Si aún no lo has hecho, instala Go + +- [Descargar Go](https://golang.com/) + +- [Descargar Go desde LAN](ftp://qnap01.local/Public/soft/go) + +## Nuestras pautas de la comunidad + +[Ser excelente el uno con el otro](https://github.com/nodeschool/havana/blob/master/Code_of_Conduct.md) + +--- + +Próximos Eventos CubanTech + +- [CubanTech meetups](http://meetup.cuban.tech) +- [Encuentros en Cuba](http://docker.cuban.tech) +- [Blockstack Cuba meetups](http://blockstack.cuban.tech) +- [SciPyLA 2018](http://scipyla.org/conf/2018) + * Universidad de Sancti Spiritus, 22-25 de noviembre de 2017. + +--- + +# Enorme gracias a nuestro anfitrión + +--- + +## ¿Qué son los gobots? + +![](img/gobot.png) + +--- + +## Golang + Robots = Gobots + +--- + +# ¡Comencemos! + +--- + +## Nuestro hardware + +[![](img/hardware-kit-closed.jpg)](http://www.seeedstudio.com/depot/ARDX-The-starter-kit-for-Arduino-p-1153.html) + +--- + +## Nuestro hardware + +[![](img/hardware-kit-open.jpg)](http://www.seeedstudio.com/depot/ARDX-The-starter-kit-for-Arduino-p-1153.html) + +--- + +## A los kits les puede faltar equipo + +------------ + +Si tiene problemas para encontrar un componente, háganoslo saber y le conseguiremos un reemplazo. + +--- + +## ¿No funciona? + +## ¡Probablemente hardware! + +--- + +## Componentes que estamos cubriendo + +- LEDs (diodos emisores de luz) +- Botones +- Servos + +--- + +Siéntase libre de seleccionar los componentes que más le gusten y completar los retos que más le interesen. + +--- + +# Empezando + +-- + +## Instalar Go si aún no lo has hecho + +[Descargar Go de Internet](https://golang.org/) + +[Descargar Go de LAN](ftp://qnap01.local/Public/soft/go) + +-- + +## Crear directorio de proyectos + +```sh +mkdir gobots +cd gobots +``` + +-- + +## Instalar Gobot + +```sh +go get -d -u gobot.io/x/gobot/.... +``` + +--- + +# Empezando + +## Firmata estándar + +- Permite a Gobot comunicarse con el Arduino a través de USB +- La mayoría de los Arduinos ya tienen instalados los Firmatas Estándar de talleres anteriores +- Vamos a comprobar que tu Arduino ya tiene instalado el Firmata Estándar! + +--- + +## Conecta el arduino + +![](img/connecting-arduino.jpg) + +--- + +Crear el fichero + +1. Ve a tu directorio de gobots +2. Cree un archivo llamado test.go +3. Copie el código que aparece a continuación y guarde + +```go +package main + +import ( + "time" + "gobot.io/x/gobot" + "gobot.io/x/gobot/drivers/gpio" + "gobot.io/x/gobot/platforms/firmata" +) + +func main() { + + firmataAdaptor := firmata.NewAdaptor("/dev/ttyACM0"); + led := gpio.NewLedDriver(firmataAdaptor, "13"); + + work := func() { + + gobot.Every(1 * time.Second, func() { + + led.Toggle(); + + }); + + }; + + robot := gobot.NewRobot("bot", + []gobot.Connection{firmataAdaptor}, + []gobot.Device{led}, + work, + ); + + robot.Start(); + +} +``` + +--- + +Ejecute el código + +```sh +go run test.go +``` + +--- + +## Este LED debería estar parpadeando cada 1 segundo + +![](img/built-in-led.png) + +--- + +Si funciona, ¡continúe! → + +------------ + +Si no es así, pulsa ↓ para obtener instrucciones sobre cómo flashear tu Arduino con Firmata Estándar + +-- + + +## Cómo flashear tu Arduino con Firmata estándar (Plus) + +1. Descargue el[Arduino IDE](https://www.arduino.cc/en/main/software) +2. Asegúrate de que tu Arduino está conectado vía USB +3. Abra el IDE de Arduino +4. Seleccione: `Arhivo > Ejemplos > Firmata > StandardFirmataPlus` +5. Seleccione: `Herramientas > Placa > Arduino/Genuino Uno` +6. Seleccione: `Herramientas > Puerto > ` +7. Haga clic en el botón Upload ![](img/arduino-ide-upload-button.png) +8. Vuelva a intentar hacer que el LED parpadee + +--- + +## Componentes que estamos cubriendo + +- LEDs (diodos emisores de luz) +- Botones +- Servos + +--- + +## LEDs + +#### LIGHT EMITTING DIODES + +![](img/leds.jpg) + +--- + +## Pines LED de identificación + +- La clavija larga es positiva (y se pone en marcha) +- El pin corto es negativo (y va a tierra) + +![](img/led-pin-diagram.png) + +--- + +## Construya esto + +![](img/arduino-led.png) + +--- + +Guarde esto en un archivo y ejecútelo + +```go +package main + +import ( + "time" + "gobot.io/x/gobot" + "gobot.io/x/gobot/drivers/gpio" + "gobot.io/x/gobot/platforms/firmata" +) + +func main() { + + firmataAdaptor := firmata.NewAdaptor("/dev/ttyACM0"); + led := gpio.NewLedDriver(firmataAdaptor, "11"); + + work := func() { + + gobot.Every(500 * time.Millisecond, func() { + + led.Toggle(); + + }); + + }; + + robot := gobot.NewRobot("bot", + []gobot.Connection{firmataAdaptor}, + []gobot.Device{led}, + work, + ); + + robot.Start(); + +} +``` +`node blinky.go` + +--- + +## Si tiene éxito, deberías ver esto + +![](img/blinking-led.gif) + +--- + +## Cambio de la frecuencia de parpadeo + +- Probablemente notó que la luz parpadea cada 0,5 segundos. +- Cambie el código para que parpadee a una velocidad diferente y luego vuelva a ejecutarlo para asegurarse de que funciona. +- Si está atascado, presione ↓ para ver una solución potencial + +-- + +```go +package main + +import ( + "time" + "gobot.io/x/gobot" + "gobot.io/x/gobot/drivers/gpio" + "gobot.io/x/gobot/platforms/firmata" +) + +func main() { + + firmataAdaptor := firmata.NewAdaptor("/dev/ttyACM0"); + led := gpio.NewLedDriver(firmataAdaptor, "13"); + + work := func() { + + gobot.Every(3 * time.Second, func() { + + led.Toggle(); + + }); + + }; + + robot := gobot.NewRobot("bot", + []gobot.Connection{firmataAdaptor}, + []gobot.Device{led}, + work, + ); + + robot.Start(); + +} +``` + +`node blinky.go` + +--- + +## Paneles: Cableado sin soldadura + +#### Los paneles nos permiten conectar rápidamente los componentes para hacer prototipos + +![](img/breadboard.small.png) + +--- + +## Paneles: Conexiones eléctricas + +- Aquí puedes ver cómo se conectan las diferentes filas y columnas. +- Si no está claro, no dudes en buscar en Google o pedirle a un voluntario que te lo explique. + +![](img/breadboard-diagram.small.jpg) + +## Usa tu protoboard y un par de cables (el color no importa) para construir esto + +![](img/arduino-led-breadboard.png) + +--- + +Ahora ejecute uno de sus programas anteriores y asegúrese de que el LED siga parpadeando + +--- + + +## Desafíos del LED + +Ahora que tiene los fundamentos de los LEDs, puede pasar al siguiente componente o trabajar en algunos desafíos de los LEDs. + +- Pulse → para pasar al siguiente componente +- Pulse ↓ para desplazarse por los desafíos de los LEDs + +-- + +## Desafíos del LED + +*¡Intenta resolverlos tú mismo antes de mirar la solución!* + +Pulse ↓ para desplazarse por los siguientes retos (y posibles soluciones) + +1. Múltiples luces +2. Contador binario + +-- + +### 1. Múltiples luces + +Haga que 2 (o más) luces se alternen parpadeando + +![](img/alternate-blinking.gif) + +-- + +### Solución Potencial de Múltiples Luces - Hardware + +![](img/alternate-blinking-hardware.png) + +-- + +### Solución Potencial de Múltiples Luces - Código + +```go +package main + +import ( + "time" + "gobot.io/x/gobot" + "gobot.io/x/gobot/drivers/gpio" + "gobot.io/x/gobot/platforms/firmata" +) + +func main() { + + firmataAdaptor := firmata.NewAdaptor("/dev/ttyACM0"); + led1 := gpio.NewLedDriver(firmataAdaptor, "13"); + led2 := gpio.NewLedDriver(firmataAdaptor, "12"); + + work := func() { + + first := true + + gobot.Every(1 * time.Second, func() { + + if first == true { + led1.On(); + led2.Off(); + first = false; + } else { + led1.Off(); + led2.On(); + first = true + } + + }); + + }; + + robot := gobot.NewRobot("bot", + []gobot.Connection{firmataAdaptor}, + []gobot.Device{led1, led2}, + work, + ); + + robot.Start(); + +} +``` + +-- + +### Solución de contador binario potencial (isaacvr) - Código + +```go +package main + +import ( + "time" + "gobot.io/x/gobot" + "gobot.io/x/gobot/drivers/gpio" + "gobot.io/x/gobot/platforms/firmata" +) + +func main() { + + firmataAdaptor := firmata.NewAdaptor("/dev/ttyACM0"); + led1 := gpio.NewLedDriver(firmataAdaptor, "13"); + led2 := gpio.NewLedDriver(firmataAdaptor, "12"); + led3 := gpio.NewLedDriver(firmataAdaptor, "11"); + led4 := gpio.NewLedDriver(firmataAdaptor, "10"); + + ledList := []*gpio.LedDriver{ led1, led2, led3, led4 } + + work := func() { + + var cnt int = 0 + var aux int = 0 + var val int = 0 + + gobot.Every(1 * time.Second, func() { + + if cnt == 16 { + cnt = 0 + } + + aux = cnt + + for _, led := range ledList { + val = aux % 2 + if val == 1 { + led.On() + } else { + led.Off() + } + aux = aux / 2 + } + + cnt = cnt + 1 + + }); + + }; + + robot := gobot.NewRobot("bot", + []gobot.Connection{firmataAdaptor}, + []gobot.Device{led1, led2, led3, led4}, + work, + ); + + robot.Start(); + +} +``` + +-- + +### Solución binaria alternativa para el contador (olemis) - Código + +```go + +package main + +import ( + "time" + "gobot.io/x/gobot" + "gobot.io/x/gobot/drivers/gpio" + "gobot.io/x/gobot/platforms/firmata" +) + +func main() { + firmataAdaptor := firmata.NewAdaptor("/dev/ttyACM0") + leds := []*gpio.LedDriver { + gpio.NewLedDriver(firmataAdaptor, "3") + gpio.NewLedDriver(firmataAdaptor, "5") + gpio.NewLedDriver(firmataAdaptor, "10") + gpio.NewLedDriver(firmataAdaptor, "12") + } + + counter := 0 + + work := func () { + for _, led := range leds { + led.Off() + } + + gobot.Every(1 * time.Second, func() { + mask := 1 + for _, led := range leds { + if mask & counter == 0 { + led.Off() + } else { + led.On() + } + mask = mask << 1 + } + counter++ + }) + } + + robot := gobot.NewRobot("bot", + []gobot.Connection{firmataAdaptor}, + []gobot.Device{leds[0], leds[1], leds[2], leds[3]}, + work, + ); + + robot.Start(); + +} + +``` + +--- + +## Botones + +![](img/buttons.jpg) + +--- + +## Build This + +![](img/button-hardware.png) + +--- + +## Guarda esto en un archivo y ejecútalo + + +```go +package main + +import ( + "fmt" + "gobot.io/x/gobot" + "gobot.io/x/gobot/drivers/gpio" + "gobot.io/x/gobot/platforms/firmata" +) + +func main() { + + firmataAdaptor := firmata.NewAdaptor("/dev/ttyACM0"); + button := gpio.NewButtonDriver(firmataAdaptor, "2") + led := gpio.NewLedDriver(firmataAdaptor, "13") + + work := func() { + + button.On(gpio.ButtonPush, func(data interface{}) { + led.On(); + fmt.Println("Button Pressed!"); + }); + + button.On(gpio.ButtonRelease, func(data interface{}) { + led.Off(); + fmt.Println("Button Released!"); + }); + + }; + + robot := gobot.NewRobot("bot", + []gobot.Connection{firmataAdaptor}, + []gobot.Device{button, led}, + work, + ); + + robot.Start(); + +} +``` + +`go run button.go` +--- + +Intente presionar, soltar y mantener presionado el botón + +Deberías ver alguna salida como esta en la consola + +``` + +>> Botón pulsado! +Botón liberado! +Botón pulsado! +Botón liberado! +Botón pulsado! +Botón liberado! +``` + +--- + +El LED debe encenderse al presionar y apagarse al soltarlo. + +--- + +## Desafíos de los botones + +Ahora que tiene los conceptos básicos de los botones, puede pasar al siguiente componente o trabajar en algunos desafíos de botones. + +- Pulse → para pasar al siguiente componente +- Presione ↓ para desplazarse por los desafíos del botón + +-- + +## Desafíos de los botones + +*¡Intenta resolverlos tú mismo antes de mirar la solución!* + +Pulse ↓ para desplazarse por los siguientes retos (y posibles soluciones) + +1. Interruptor de luz +2. Luces navideñas +3. Clave de acceso + +-- + +### 1. Interruptor de luz + +Haga que al presionar un botón alternativamente encienda y apague un LED + +-- + +### Solución de interruptor de luz potencial - Hardware + +![](img/light-switch-hardware.png) + +-- + +### Solución de interruptor de luz potencial - Código + +```go +package main + +import ( + "fmt" + "gobot.io/x/gobot" + "gobot.io/x/gobot/drivers/gpio" + "gobot.io/x/gobot/platforms/firmata" +) + +func main() { + + firmataAdaptor := firmata.NewAdaptor("/dev/ttyACM0"); + button := gpio.NewButtonDriver(firmataAdaptor, "2") + led := gpio.NewLedDriver(firmataAdaptor, "13") + + work := func() { + + isOn := false; + + button.On(gpio.ButtonPush, func(data interface{}) { + if isOn == true { + led.Off(); + isOn = false; + } else { + led.On(); + isOn = true + } + }); + + }; + + robot := gobot.NewRobot("bot", + []gobot.Connection{firmataAdaptor}, + []gobot.Device{button, led}, + work, + ); + + robot.Start(); + +} +``` + +-- + +## Componentes que estamos cubriendo + +- LEDs (diodos emisores de luz) +- Botones +- Servos + +--- + +## SERVOS + +![](img/servo.jpg) + +--- + +Toma tu servo y añádele uno de los adjuntos. + +![](img/servo.jpg) + +--- + +## Construya esto + +![](img/servo-hardware.png) + +--- + +## Servo Challenges + +Ahora puedes pasar al siguiente componente, o trabajar en algunos desafíos de servo + +Pulse → para pasar al siguiente componente +Pulse ↓ para desplazarse por los desafíos de los servos + +-- + +## Servo Challenges + +*¡Intenta resolverlos tú mismo antes de mirar la solución!* + +Pulse ↓ para desplazarse por los siguientes retos (y posibles soluciones) + +1. Apersor +2. Flechas +3. Botón + +-- + +### 1. Rociador + +Haz que el servo gire de un lado a otro como si fuera un aspersor. + +![](img/sprinkler.gif) + +-- + +### Solución potencial de aspersor - Hardware + +![](img/sprinkler-hardware.png) + +-- + +### Solución potencial de aspersor - Código + +```go +package main + +import ( + "time" + "gobot.io/x/gobot" + "gobot.io/x/gobot/drivers/gpio" + "gobot.io/x/gobot/platforms/firmata" +) + +func main() { + + firmataAdaptor := firmata.NewAdaptor("/dev/ttyACM0") + servo := gpio.NewServoDriver(firmataAdaptor, "11") + + work := func() { + + var angle uint8 = 0; + var max uint8 = 180; + + servo.Move(angle) + + gobot.Every(500 * time.Millisecond, func() { + + angle = (angle + 45) % max + + servo.Move( angle ) + + }); + + } + + robot := gobot.NewRobot("servoBot", + []gobot.Connection{firmataAdaptor}, + []gobot.Device{servo}, + work, + ) + + robot.Start() + +} +``` + +-- + +### 2. Flechas + +Haz que al presionar el botón de flecha izquierda gire el servo en una dirección y al presionar el botón de flecha derecha gire en la otra dirección. + +![](img/servo-arrows.gif) + +-- + +### Solución de Flechas Potenciales - Hardware + +![](img/servo-arrows-hardware.png) + +-- + +### Solución de flechas potenciales - Código + +```go +package main + +import ( + "gobot.io/x/gobot" + "gobot.io/x/gobot/drivers/gpio" + "gobot.io/x/gobot/platforms/firmata" + term "github.com/nsf/termbox-go" +) + +func reset() { + term.Sync() +} + +func main() { + + err := term.Init(); + + if err != nil { + panic(err) + } + + defer term.Close() + + firmataAdaptor := firmata.NewAdaptor("/dev/ttyACM0") + servo := gpio.NewServoDriver(firmataAdaptor, "11") + + work := func() { + + var angle uint8 = 0; + + servo.Move(angle) + + for { + reset(); + switch ev := term.PollEvent(); ev.Type { + case term.EventKey: + switch ev.Key { + case term.KeyArrowLeft: + angle = 0 + servo.Move(angle) + case term.KeyArrowRight: + angle = 180 + servo.Move(angle) + } + } + } + + } + + robot := gobot.NewRobot("servoBot", + []gobot.Connection{firmataAdaptor}, + []gobot.Device{servo}, + work, + ) + + robot.Start() + +} +``` + +-- + +Uh oh oh! Nos acabamos las diapositivas! Siéntase libre de probar algunos de los otros componentes de su kit mientras nosotros añadimos más! + +--- + +## Winding Up + +- Gracias por venir! \ No newline at end of file diff --git a/index-es.md b/index-es.md new file mode 100644 index 00000000000..d476671236f --- /dev/null +++ b/index-es.md @@ -0,0 +1,110 @@ +# Reuniones CubanTech + +## [meetup.cuban.tech](http://meetup.cuban.tech) + +- [Introducción al taller de PyDay Django parte 3](intro_20180729.html) + - [CubanTech Encuentro #37](http://docker.cuban.tech/events/251517589/) - La Habana, Cuba 2018/07/29 +- [Bienvenido a Raspberry Jam](intro_2018080303.html) + - [CubanTech Encuentro #31](http://meetup.cuban.tech/events/247616068/) - La Habana, Cuba 2018/03/03 +- [Introducción a la reunión de Neo4J PyDay](intro_20180113.html) + - [CubanTech Encuentro #28](http://meetup.cuban.tech/events/246212946/) - La Habana, Cuba 2018/01/13 +- [Introducción a PyDay y reunión de cumpleaños #1](intro_20171222.html) + - [CubanTech Encuentro #26](http://meetup.cuban.tech/events/245032996/) - La Habana, Cuba 2017/12/22 + +---------------- + +## Reuniones CubanTech + +### [meetup.cuban.tech](http://meetup.cuban.tech) + +- [Introducción a Blockstack Cuba Encuentro #1](intro_20171119.html) + *[Blockstack Cuba Encuentro #1](http://blockstack.cuban.tech/events/244120891/) - La Habana, Cuba 2017/11/19 +- [Introducción a las reuniones](intro_20170121.html) + *[CubanTech Encuentro #17](http://docker.cuban.tech/events/241708287/) - Isla de la Juventud, Cuba 2017/08/19 + *[CubanTech Encuentro #4](http://docker.cuban.tech/events/236654894/) - Santa Clara, Cuba 2017/01/21 + +--- + +[![Docker Cuba](img/dockercuba.logo.png)](http://docker.cuban.tech) + +## [docker.cuban.tech](http://docker.cuban.tech) + +-- + +- [Introduccion a Docker Celebración del Cumpleaños #4](intro_20170304.html) + *[CubanTech Encuentro #8](http://docker.cuban.tech/events/238007254/) - La Habana, Cuba 2017/03/04 +- [Introducción a Docker para programadores y DevOps](docker-intro.html) + - Conferencia inaugural y laboratorios para el Festival de Software, Universidad de Sancti Spiritus, Cuba 2017/03/21 +- [Laboratorio practico de Docker para dispositivos ARM IoT - Raspberry Pi & ODROID](docker-stuff/hypriot) + - FLISoL 2017, Joven Club, La Habana, Cuba 2017/04/22 + - [CubanTech Encuentro #14](http://docker.cuban.tech/events/240871128/) - Tutorial práctico de Hypriot Joven Club, Cienfuegos, Cuba 2017/06/16 + *[CubanTech Encuentro #15](http://docker.cuban.tech/events/240872505/) - Tutorial práctico de Hypriot, La Habana, Cuba 2017/07/22 + +--- + +[![Python Cuba](img/python-logo.png)](http://pythoncuba.org) + +## PYTHON CUBA + +### Siga Nuestro [meetups](http://meetup.cuban.tech) + +-- + +- Estado de Python . Aplicaciones + - PyDay #1 , La Habana +- Introducción a Brython. Ejemplo de aplicación Tizen + - Joven Club, Cienfuegos, Cuba +- [Introducción a MicroPython en ESP8266](micropython.html) + - [CubanTech Encuentro #13](http://meetup.cuban.tech/events/240871291/) - PyDay Joven Club, Cienfuegos, Cuba 2017/06/16 + - [CubanTech Encuentro #19](http://meetup.cuban.tech/events/242499554/) - PyDay Isla de la Juventud, Cuba 2017/08/20 +- [Python y Pandas para periodismo de datos](pandas-ddj.html) + - [CubanTech Encuentro #16](http://meetup.cuban.tech/events/240372001/)- PyDay La Habana Cuba 2017/07/29 + +--- + +## NODEBOTS CUBA + +### Siga Nuestro [meetups](http://meetup.cuban.tech) + +-- + +- [Nodebots con CubanTech](nodebots.html) + - [CubanTech Encuentro #3](#) - Holguía Cuba 2016/12/25 + - [CubanTech Encuentro #18](http://meetup.cuban.tech/events/241706888/) - Isla de la Juventud Cuba 2017/08/21 + - [CubanTech Encuentro #20](http://meetup.cuban.tech/events/242652841/) - La Habana Cuba 2017/08/26 + +--- + +## SKYFLEET MEETUPS + +### Siga Nuestro [meetups](http://meetup.cuban.tech) + +-- + +- [Blockchain, DApps y Skycoin](skycoin.intro.html) + - [CubanTech Encuentro #35](http://meetup.cuban.tech/events/251519052) - La Habana, Cuba, 2018/06/16 + - [CubanTech Encuentro #36](http://meetup.cuban.tech/events/251523453) - Isla de la Juv., Cuba, 2018/07/02 +- [Explicación de la API de REST de Skycoin](skycoin.libs.html) + - [CubanTech Encuentro #52](http://meetup.cuban.tech/events/259974015) - La Habana, Cuba, 06/04/2010 + +--- + +## BLOCKSTACK CUBA + +### [blockstack.cuban.tech](http://blockstack.cuban.tech) + +-- + +- [Blockchain, DApps y Blockstack](dapps.html) + - [Blockstack Cuba Encuentro #1](http://blockstack.cuban.tech/events/244120891), La Habana, Cuba, 2017/11/19 + +--- + +## Los que hacen DIY Cuba + +### Siga Nuestros [meetups](http://meetup.cuban.tech) + +-- + +- [Electrónica digital - parte 1](https://slides.cuban.tech/digital-electronics-1.html) + - [CubanTech Encuentro #45](https://www.meetup.com/CubanTech/events/258279078/) - La Habana, Cuba 2019/01/27 diff --git a/intro_20180303-es.md b/intro_20180303-es.md new file mode 100644 index 00000000000..b078019e8d2 --- /dev/null +++ b/intro_20180303-es.md @@ -0,0 +1,170 @@ + + +## RASPBERRY JAM, LA HABANA 2018 +#### Mermelada Cubana + +---------------- + +#### Estas diapositivas: [slides.cuban.tech/intro_20180113.html](http://slides.cuban.tech/intro_20180113.html) + +------------ + +Autor: Olemis Lang (olemis@cuban.tech) + +Red: cubantech + +Contraseña: meet-ups + +------------ + +#### SOCIALIZANDO TECNOLOGÍAS AVANZADAS DE SOFTWARE LIBRE + +[sitio web cuban.tech](http://cuban.tech) + +--- + +## ¿QUÉ ES EL GRUPO CUBANTECH? + +Un grupo de empresarios cubanos con visión social + +![](img/cubantech.map.png) + +-- + +- Socializar el conocimiento a través de actividades educativas +- Enseñanza de la evolución digital en lenguaje natural y lenguaje de programación +- Promover una red sostenible de cooperación y promoción de la innovación tecnológica cubana +- Un complemento para ayudar a las personas comunes que no programan a introducir la tecnología en sus vidas de forma saludable. + +--- + +## Reglas de los Encuentros + +#### UNA COMUNIDAD LIBRE DE ACOSO PARA TODOS, INDEPENDIENTEMENTE DE: + +- [Código de conducta](https://github.com/nodeschool/havana/blob/master/Code_of_Conduct.md) +- sexo, identidad o expresión de género, orientación sexual, discapacidad, +- apariencia física, edad, tamaño corporal, raza, nacionalidad o creencias religiosas + +-- + +## REGLAS EXTRAS DEL ANFITRION + +- Preservar el lugar, voz baja, etc. + +-- + +## OTRAS REGLAS BÁSICAS PARA UNA EXPERIENCIA ATRACTIVA + +- Respeta el límite de tiempo de tu discurso de apertura. +- Pregunte sin importar cuando, pero POR FAVOR PREGUNTE! +- Comparta con los asistentes todo lo que pueda. + +--- + +## RASPBERRY JAMS + +![](img/rpi.jams.map.201803.png) + +--- + +## GRACIAS! + +- Fundación Raspberry Pi +- Fundación Python Software +- Equipo HypriotOS + +--- + +## ¿TE GUSTA NUESTRO ESTANDARTE? + +![](img/rpi.cuba.banner.png) + +--- + +## AGENDA DE ESTA REUNION + +- ¿Qué es una Raspberry Jam? +- Uso del Raspberry Pi como infraestructura para las reuniones +- Charlas +- Propuestas +- Descanso +- Votar +- Laboratorio práctico: HypriotOS - Docker on ARM Boards[slides](docker-stuff/hypriot) +- Más charlas + +--- + +## RECURSOS + +- Videos [media.cuban.tech](http://media.cuban.tech) + - [Adafruit DIY videos](http://videos.cuban.tech/Adafruit.Liked.videos/) +- [Documentación](ftp://qnap01.local/Public/docs/) + - [Revista MagPi](ftp://qnap01.local/Public/docs/magpi) +- Paquetes Raspbian + - [archive.framberrypi.org/](http://archive.raspberrypi.org/) + - [archive.raspbian.org/](http://archive.raspbian.org/) +- Imágenes del SO + - [HypriotOS images](ftp://qnap01.local/Public/os/hypriot) + - Imágenes Raspberry Pi (... algunas subcarpetas en[aquí](ftp://qnap01.local/Public/os/) ) + +-- + +## Mas Recursos + +- Matriz de habilidades CubanTech[forms.cuban.tech/dev-matrix](http://forms.cuban.tech/dev-matrix) + - Ofertas de empleo... ¡te llamaremos! + +-- + +## PRÓXIMAMENTE + +- El reto de los pronósticos de la Liga de Campeones de la UEFA +- El desafío de las predicciones de la Copa Mundial de la FIFA +- El reto de las predicciones de la final de la NBA + +--- + +## PERSONAS INVITADAS + +--- + +## TEMAS PARA LAS PRÓXIMAS REUNIONES + +- Python y Julia en Física +- Python en bioinformática +- Economía computacional + +-- + +## TTEMAS PARA LAS PRÓXIMAS REUNIONES + +- Cadena de bloques y DApps impulsados por Python +- Realidad virtual y hardware +- Sistemas de información geográfica +- Python en la ciencia +- Presente su idea de proyecto + +--- + +### SCIPYLA 2018 + +##### ¡ Nos vamos para Curitiba! - [Talk in CubanTech meetups](http://forms.cuban.tech/cubantech-speak) + +![](img/scipyla2018.annonce.png) + +--- + +## CANALES DE COMUNICACIÓN + +[CUBAN.TECH](http://cuban.tech) SITIO WEB + +- Twitter [http://twitter.cuban.tech](http://twitter.cuban.tech) +- Linkedin [http://in.cuban.tech](http://in.cuban.tech) +- Facebook [http://fb.cuban.tech](http://fb.cuban.tech) +- Telegram [http://im.cuban.tech](http://im.cuban.tech) +- Youtube [http://videos.cuban.tech](http://videos.cuban.tech) +- Meetups [http://meetup.cuban.tech](http://meetup.cuban.tech) +- Google+ [http://plus.cuban.tech](http://plus.cuban.tech) +- Slides [http://slides.cuban.tech](http://slides.cuban.tech) +- Control de Versiones [http://git.cuban.tech](http://git.cuban.tech) \ No newline at end of file diff --git a/intro_20180520-es.md b/intro_20180520-es.md new file mode 100644 index 00000000000..b9bb51df008 --- /dev/null +++ b/intro_20180520-es.md @@ -0,0 +1,149 @@ + +## CUBANTECH MEETUP PYDAY, HAVANA 2018 +#### Django workshop + +---------------- + +#### These slides: [slides.cuban.tech/intro_20180729.html](http://slides.cuban.tech/intro_20180729.html) + +------------ + +Author: Olemis Lang (olemis@cuban.tech) + +- Red: cubantech +- Descargas: cubantech_5G +- Password: meet-ups + +------------ + +#### SOCIALIZANDO TECNOLOGÍAS AVANZADAS DE SOFTWARE LIBRE + +[cuban.tech website](http://cuban.tech) + +--- + +## ¿QUÉ ES EL GRUPO CUBANTECH? + +Un grupo de empresarios cubanos con visión social + +![](img/cubantech.map.png) + +-- + +- Socializar el conocimiento a través de actividades educativas +- Enseñanza de la evolución digital en lenguaje natural y lenguaje de programación +- Promover una red sostenible de cooperación y promoción de la innovación tecnológica cubana +- Un complemento para ayudar a las personas comunes que no programan a introducir la tecnología en sus vidas de forma saludable. + +--- + +## REGLAS DE LOS ENCUENTROS + +#### UNA COMUNIDAD LIBRE DE ACOSO PARA TODOS, INDEPENDIENTEMENTE DE: + +- [Código de conducta](https://github.com/nodeschool/havana/blob/master/Code_of_Conduct.md) +- sexo, identidad o expresión de género, orientación sexual, discapacidad, +- apariencia física, edad, tamaño corporal, raza, nacionalidad o creencias religiosas + +-- + + +## REGLAS EXTRAS DEL ANFITRION + +- Preservar el lugar, voz baja, etc. +- Ayúdense a sí mismos con refrescos... fuera de la habitación + +-- + +## OTRAS REGLAS BÁSICAS PARA UNA EXPERIENCIA ATRACTIVA + +- Respeta el límite de tiempo de tu discurso de apertura. +- Pregunte sin importar cuando, pero POR FAVOR PREGUNTE! +- Comparta con los asistentes todo lo que pueda. + +--- + +## Almuerzo + +- 1.75 CUC - Cuarto de pollo asado +- CUC - Chuletas de lomo ahumadas +- $1.75 CUC - Pechugas de pollo asadas + +No proporcionado por nosotros. Ordene temprano para que llegue a tiempo + +--- + +## Encuentros PYDAY + +![](img/python-logo.png) + +#### Agradecimientos! + +- Python Software Foundation + +--- + +## AGENDA DE ESTA REUNION + +- +- +- Depende de ti Alí ... + +--- + +## Recursos + +- Videos [videos.cuban.tech](http://videos.cuban.tech) + - [DjangoCon EU 2018](http://videos.cuban.tech/DjangoCon%20Europe%202018%20in%20%20Heidelberg) + - [PyCon 2017](http://videos.cuban.tech/pycon.2017/) + - [PyCon 2014](http://videos.cuban.tech/pycon.2014/) +- Desarrollado por Docker ... [Descarga instaladores de LAN](ftp://qnap01.local/Public/soft/docker/) + - ... y [docker-compose](ftp://qnap01.local/Public/soft/docker/docker-compose-1.17.1-Linux-x86_64) (renombrar a `docker-compose`) +- [Instrucciones de configuración del entorno](ftp://qnap01.local/Public/meetup/taller_django_20180729/taller/index.html) +- [Django 1.6.12dev documentacion](https://django.readthedocs.io/en/1.6.x/) + [PDF](https://media.readthedocs.org/pdf/django/1.6.x/django.pdf) + - [Réplica Local 1.6.11](http://pkgdocs.cuban.tech/python-django-doc/html/) + [PDF 1.6.x](ftp://qnap01.local/Public/meetup/taller_django_20180729/taller/resources/django-docs-1.6.12dev.pdf) + [PDF 1.11](ftp://qnap01.local/Public/meetup/taller_django_20180729/taller/resources/django-docs-1.11.zip) + - Aviso => Último = `2.2` + +-- + +## PRÓXIMAMENTE + +- Ganadores de predicciones de la Copa Mundial de la FIFA 2018 + +--- + +## PERSONAS INVITADAS + +--- + +## TEMAS PARA LAS PRÓXIMAS REUNIONES + +- 2018/08 - [Contenedores Docker para Skycoin](http://docker.cuban.tech/events/253171588/) +- 2018/10 - [Raspberry Jam La Habana 2018-10](http://meetup.cuban.tech/events/253172694/) + +--- + +### SCIPYLA 2018 + +##### ¡ Nos vamos para Curitiba! - [Talk in CubanTech meetups](http://forms.cuban.tech/cubantech-speak) + +![](img/scipyla2018.annonce.png) + +--- + +## CANALES DE COMUNICACIÓN + +[CUBAN.TECH](http://cuban.tech) SITIO WEB + +- Twitter [http://twitter.cuban.tech](http://twitter.cuban.tech) +- Linkedin [http://in.cuban.tech](http://in.cuban.tech) +- Facebook [http://fb.cuban.tech](http://fb.cuban.tech) +- Telegram [http://im.cuban.tech](http://im.cuban.tech) +- Youtube [http://videos.cuban.tech](http://videos.cuban.tech) +- Meetups [http://meetup.cuban.tech](http://meetup.cuban.tech) +- Google+ [http://plus.cuban.tech](http://plus.cuban.tech) +- Slides [http://slides.cuban.tech](http://slides.cuban.tech) +- Control de Versiones [http://git.cuban.tech](http://git.cuban.tech) \ No newline at end of file diff --git a/intro_20180729-es.md b/intro_20180729-es.md new file mode 100644 index 00000000000..497219faa1f --- /dev/null +++ b/intro_20180729-es.md @@ -0,0 +1,170 @@ + +## CUBANTECH ENCUENTRO PYDAY, HAVANA 2018 +#### Taller de Django, StackOverflow + +---------------- + +#### These slides: [slides.cuban.tech/intro_20180729.html](http://slides.cuban.tech/intro_20180729.html) + +------------ + +Author: Olemis Lang (olemis@cuban.tech) + +Network: cubantech + +Password: meet-ups + +------------ + +#### SOCIALIZANDO TECNOLOGÍAS AVANZADAS DE SOFTWARE LIBRE + +[sitio web cuban.tech](http://cuban.tech) + +--- + +## ¿QUÉ ES EL GRUPO CUBANTECH? + +Un grupo de empresarios cubanos con visión social + +![](img/cubantech.map.png) + +-- + +- Socializar el conocimiento a través de actividades educativas +- Enseñanza de la evolución digital en lenguaje natural y lenguaje de programación +- Promover una red sostenible de cooperación y promoción de la innovación tecnológica cubana +- Un complemento para ayudar a las personas comunes que no programan a introducir la tecnología en sus vidas de forma saludable. + +--- + +## Reglas de los Encuentros + +#### UNA COMUNIDAD LIBRE DE ACOSO PARA TODOS, INDEPENDIENTEMENTE DE: + +- [Código de conducta](https://github.com/nodeschool/havana/blob/master/Code_of_Conduct.md) +- sexo, identidad o expresión de género, orientación sexual, discapacidad, +- apariencia física, edad, tamaño corporal, raza, nacionalidad o creencias religiosas + +-- + +## REGLAS EXTRAS DEL ANFITRION + +- Preservar el lugar, voz baja, etc. +- Ayúdense a sí mismos con refrescos... fuera de la habitación + +-- + +## OTRAS REGLAS BÁSICAS PARA UNA EXPERIENCIA ATRACTIVA + +- Respeta el límite de tiempo de tu discurso de apertura. +- Pregunte sin importar cuando, pero POR FAVOR PREGUNTE! +- Comparta con los asistentes todo lo que pueda. + +--- + + +--- + +## ENCUENTROS PYDAY + +![](img/python-logo.png) + +#### AGRADECIMIENTOS! + +- Python Software Foundation + +--- + +## LE GUSTA NUESTRO LOGO? + +![](img/pythoncuba.logo.png) + +Comentarios y sugerencias via : [http://im.cuban.tech](http://im.cuban.tech) + +--- + +## AGENDA DE ESTA REUNION + +- ¿Qué es una Raspberry Jam? +- Uso del Raspberry Pi como infraestructura para las reuniones +- Charlas +- Propuestas +- Descanso +- Votar +- Laboratorio práctico: HypriotOS - Docker on ARM Boards[slides](docker-stuff/hypriot) +- Más charlas + +--- + +## RECURSOS + +- Videos [media.cuban.tech](http://media.cuban.tech) + - [Adafruit DIY videos](http://videos.cuban.tech/Adafruit.Liked.videos/) +- [Documentación](ftp://qnap01.local/Public/docs/) + - [Revista MagPi](ftp://qnap01.local/Public/docs/magpi) +- Paquetes Raspbian + - [archive.framberrypi.org/](http://archive.raspberrypi.org/) + - [archive.raspbian.org/](http://archive.raspbian.org/) +- Imágenes del SO + - [HypriotOS images](ftp://qnap01.local/Public/os/hypriot) + - Imágenes Raspberry Pi (... algunas subcarpetas en[aquí](ftp://qnap01.local/Public/os/) ) + +-- + +## Mas Recursos + +- Matriz de habilidades CubanTech[forms.cuban.tech/dev-matrix](http://forms.cuban.tech/dev-matrix) + - Ofertas de empleo... ¡te llamaremos! + +-- + +## PRÓXIMAMENTE + +- El reto de los pronósticos de la Liga de Campeones de la UEFA +- El desafío de las predicciones de la Copa Mundial de la FIFA +- El reto de las predicciones de la final de la NBA + +--- + +## PERSONAS INVITADAS +--- + +## TEMAS PARA LAS PRÓXIMAS REUNIONES + +- Python y Julia en Física +- Python en bioinformática +- Economía computacional + +-- + +## TTEMAS PARA LAS PRÓXIMAS REUNIONES + +- Cadena de bloques y DApps impulsados por Python +- Realidad virtual y hardware +- Sistemas de información geográfica +- Python en la ciencia +- Presente su idea de proyecto + +--- + +### SCIPYLA 2018 + +##### ¡ Nos vamos para Curitiba! - [Talk in CubanTech meetups](http://forms.cuban.tech/cubantech-speak) + +![](img/scipyla2018.annonce.png) + +--- + +## CANALES DE COMUNICACIÓN + +[CUBAN.TECH](http://cuban.tech) SITIO WEB + +- Twitter [http://twitter.cuban.tech](http://twitter.cuban.tech) +- Linkedin [http://in.cuban.tech](http://in.cuban.tech) +- Facebook [http://fb.cuban.tech](http://fb.cuban.tech) +- Telegram [http://im.cuban.tech](http://im.cuban.tech) +- Youtube [http://videos.cuban.tech](http://videos.cuban.tech) +- Meetups [http://meetup.cuban.tech](http://meetup.cuban.tech) +- Google+ [http://plus.cuban.tech](http://plus.cuban.tech) +- Slides [http://slides.cuban.tech](http://slides.cuban.tech) +- Control de Versiones [http://git.cuban.tech](http://git.cuban.tech) \ No newline at end of file diff --git a/micropython-es.md b/micropython-es.md new file mode 100644 index 00000000000..2b719ddaf1b --- /dev/null +++ b/micropython-es.md @@ -0,0 +1,2104 @@ +## Introducción a MicroPython + +#### Estas diapositivas: [slides.cuban.tech/micropython.html](http://slides.cuban.tech/micropython.html) + +--- + +### Información Wifi + +Red: cubantech + +Contraseña: meet-ups + +-- + +- Las diapositivas están basadas en una[charla](http://todayispotato.github.io/micropython-talk/#/25) de[Lars de Ridder](https://github.com/todayispotato) +- El taller se basa en gran medida en[Nodebots con el taller CubanTech](http://slides.cuban.tech/nodebots.html) +- ... que se basa en gran medida en un taller de[NY-Javascript](http://www.meetup.com/NY-Javascript) (ver[bit.ly/nyjs-nodebots](http://bit.ly/nyjs-nodebots)) +- ... que se basa en gran medida en un taller de[Francis Gulotta](https://twitter.com/reconbot) y[Rick Waldron](https://twitter.com/rwaldron) +- Puede encontrar las diapositivas para ese taller en[gul.ly/3tjj](http://gul.ly/3tjj) +- Puedes inscribirte en uno de sus talleres en la página[Nodebots NYC Meetup page](http://www.meetup.com/nodebots/) + +--- + +## Las pautas de nuestras comunidad + +[Sé excelente el uno con el otro](https://github.com/nodeschool/havana/blob/master/Code_of_Conduct.md) + +--- + +Próximos Eventos CubanTech + +- [CubanTech meetups](http://meetup.cuban.tech) +- [Encuentros en Cuba](http://docker.cuban.tech) +- [Blockstack Cuba meetups](http://blockstack.cuban.tech) + +--- + +# Un gracias Enorme a nuestro anfitrión + +--- + +## Así que, MicroPython + +¿Quién había oído hablar de él antes? + +¿Y quién lo usó antes? + +¿Por algo serio? + +para algo que está funcionando ahora mismo? + +--- + +## Microcontroladores + Python = MicroPython + +![](img/micropython.png) + +MicroPython es una implementación rápida y sencilla del lenguaje de programación Python (versión 3) que está optimizado para funcionar en un microcontrolador. + +-- + +## En serio...? + +- Puesta en marcha en noviembre de 2013 +- Arranque inicial terminado en abril de 2015 + - £ 97,803 primera campaña + - +£ 200,000 en total +- Código abierto :[github.com/micropython](https://github.com/micropython) + +--- + +## Pero, ¿por qué? + +- Comunidad existente (que te incluye a ti) +- Fácil de aprender, con potentes funciones +- Buena separación entre int y float (a diferencia de JS/Lua) +- Operaciones binarias nativas en 1's y 0's (a diferencia de Lua) +- Ideal para la creación rápida de prototipos +- Puente entre el mundo web y el mundo de la internet de las cosas IoT +- Muchas oportunidades para la optimización! + +-- + +## ...y por qué no CPython? + +Principalmente debido al uso de RAM. Ejemplos: + +- Preasignación de 257 + 5 ints = 4k RAM +- Llamadas a métodos: led.on() crea un objeto de método encuadernado = 20 bytes de RAM + +-- + +## Requisitos teóricos mínimos del sistema + +128kb ROM / 8kb RAM (después de restar otro software) + +##### Puerto UNIX alrededor de 280kb flash + +--- + +# ¿Cómo que Micro? + +-- + +## Principalmente optimizaciones de RAM + +- Muchas cadenas predefinidas en ROM (led, on, read, ...) +- Llamadas a métodos optimizados +- Todo lo que puede estar en ROM, está en ROM +- Recolección de basura: Marcar y barrer (sin conteos de referencia) + +-- + +## Punteros etiquetados + +Un puntero etiquetado es un puntero (concretamente una dirección de memoria) con datos adicionales asociados a él. + +- Entero - xxxx xxxx xxxx xxxx xxx1 +- Cadena - xxxx xxxx xxxx xxxx xx10 +- Objeto - xxxx xxxx xxxx xxxx xx00 + +--- + +# Estado actual de MicroPython + +--- + +## Desarrollo + +- Un desarrollador a tiempo completo, dos colaboradores principales +- Financiado en parte por la Agencia Espacial Europea +- Puesta en marcha en mayo de 2016 para el soporte adecuado de los zócalos ESP8266 +- Parece que está madurando + +--- + +## ¿Está lista la producción? + +Depende de tu placa + +Pero es increíble para la creación de prototipos! + +O para incrustar en juegos y aplicaciones + +-- + +## ¿Incrustar a Python en juegos? + +![](img/civ.iv.jpg) + +... ha ocurrido antes, sin embargo no MicroPython .... + +-- + +### Python embebido para videojuegos + +##### Civilización IV + +![](img/civ.iv.jpg) + +Toda la lógica interna, incluida la IA. La API está disponible. + +-- + +### Python embebido para videojuegos + +##### El templo del mal elemental + +![](img/toee.small.jpg) + +Casi todo excepto el motor de renderizado,[según Steve Moret](http://www.pygame.org/interview/stevemoret.shtml) + +-- + +### Python embebido para videojuegos + +##### El Comandante del Puente de Star Trek + +![](img/BridgeCommander.small.jpg) + +Scripts de las misiones + +-- + +### Python embebido para videojuegos + +##### Crystal Space + +![](img/crystal.space.small.jpg) + +Toda la lógica interna, incluida la IA. La API está disponible. + +-- + +### Python embebido para videojuegos + +##### Battlefield 2 + +![](img/battlefield.4.small.jpeg) + +Juego, resultados, estadísticas del equipo + +--- + +# Algunas tablas apoyadas + +--- + +## El PyBoard + +![](img/pyboard.small.png) + +- Implementación de la referencia +- Inicialmente sólo en la pirámide, ahora en múltiples chips +- ARM 32bit Cortex M4 @ 168Mhz, 1Mb flash, 192kb RAM +- Acelerómetro, RTC, 4 LEDs, 2 interruptores, 30 GPIO + +--- + +## BBC Micro:Bit + +![](img/microbit.small.png) + +16kb RAM, 256kb flash, Cortex M0 @ 16 MHz + +-- + +## BBC Micro:Bit + +Suministrado a _1 millón_ de niños en edad escolar + +- Editor de Python en línea +- Aplicación móvil para cargar código +- Toneladas de documentación, material didáctico, etc. + +-- + +### ...viene con: + +![](img/microbit.pxt.pxt.small.png) + +- Editor gráfico de arrastrar y soltar + +-- + +## BBC Micro: Especificaciones de bits + +- 25 LED +- Dos botones programables +- Acelerómetro y magnetómetro +- Bluetooth +- 5 GPIO + +-- + +## Cómpralo ahora! ... :) + +![](img/microbit.amazon.png) + +El envío es gratuito para pedidos en el Reino Unido \o/ + +--- + +## The WiPy + +![](img/wipy.small.png) + +256kb RAM, 2Mb flash, 25 GPIO, Cortex M4 @ 80 MHz + +#### "Pequeño y ligero para encajar en cualquier cavidad" + +--- + +## LoPy + +![](img/lopy.small.png) + +LoRa + Python + +-- + +## LoRa ... hmmm ? + +[![](img/lora.logo.white.png)](https://www.lora-alliance.org/) + +- Plataforma inalámbrica de largo alcance y bajo consumo +- Elección de la tecnología predominante para la creación de redes de Internet de las cosas(IoT) en todo el mundo. +- +500 miembros +- LoRaWAN Implementación de protocolos + - Especificación WAN de bajo consumo (LPWAN) para dispositivos inalámbricos que funcionan con baterías. + +--- + +## Feather M0 Express + +| | | +| ------------------------------------------------------------------------ | ---------------------------------------------------------------------------------- | +| [![](img/feather.m0.express.png)](https://www.adafruit.com/product/3403) |
![](img/adafruit.logo.jpg)
| + +-- + +## Feather M0 con radio + +| | | +| ------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------- | +| ![](img/feather.m0.lora.png) | ![](img/feather.m0.rfm69hcw.png) | +| RFM59 LoRA - [900 MHz](https://www.adafruit.com/product/3178) | Packet Radio [433 MHz](https://www.adafruit.com/product/3177), [868 or 915 MHz](https://www.adafruit.com/product/3176) | + +-- + +## Feather M0 wireless + +| | | +| -------------------------------------------------------------- | ---------------------------------------------------------- | +| ![](img/feather.m0.atwinc1500.png) | ![](img/feather.m0.bluefruit.png) | +| [WiFi](https://www.adafruit.com/product/3010) | [Bluetooth](https://www.adafruit.com/product/2995) | + +-- + +## Feather M0 Express - especificaciones + +- Memoria USB [cargador de arranque UF2](https://learn.adafruit.com/adafruit-feather-m0-express-designed-for-circuit-python-circuitpython/uf2-bootloader) +- ATSAMD21G18 @ 48MHz con lógica/potencia de 3.3V +- 256 KB de FLASH + 32 KB de RAM +- Cristal de 32.768 KHz para la generación de relojes y RTC +- Regulador de 3.3V con salida de corriente máxima de 500mA +- Soporte nativo para USB (cargador de arranque USB, depuración de puertos serie) + +-- + +## Feather M0 Express - especificaciones + +- 20 pines GPIO (salidas PWM para todos) +- Serial de hardware, I2C, soporte SPI +- 6 entradas analógicas de 12 bits +- 1 x salida analógica de 10 bits (DAC) +- Construido en cargador lipoly 100mA (con LED) +- Pin #13 LED rojo + +--- + +## ESP8266 y NodeMCU + +![](img/feather.huzzah.small.png) + +... también funciona con los chips ESP8266 (es decir, muchos) + +--- + +## NodeMCU v1 pinout + +![](img/nodemcu.v1.pinout.png) + +-- + +## Dispositivo AMICA NodeMCU + +| | | +| ----------------------------- | ------------------------------- | +| ![](img/nodemcu.v1.amica.jpg) | ![](img/nodemcu.v1.amica.2.jpg) | + +--- + +## NodeMCU v2 pinout + +![](img/nodemcu.v2.pinout.png) + +-- + +## NodeMCU devkit - DOIT + +![](img/nodemcu.doit.png) + +-- + +## Dispositivo NodeMCU - Makerfocus D1 mini + +![](img/nodemcu.d1mini.png) + +--- + +## NodeMCU v3 pinout + +![](img/nodemcu.v3.pinout.png) + +-- + +## Geekcreit® LoLin NodeMCU devkit + +![](img/nodemcu.v3.lolin.png) + +--- + +## Adafruit Feather Huzzah ESP8266 + +![](img/feather.huzzah.png) + +-- + +## Feather HUZZAH - Cargador lipoly 100mA + +![](img/feather.huzzah.lipoly.png) + +-- + +## Feather HUZZAH ESP8266 - especificaciones + +- ESP8266 @ 80MHz o 160 MHz +- Lógica/potencia de 3.3V, salida de corriente máxima de 500mA +- 4MB de FLASH (32 MBit) +- CP2104 Convertidor USB-Serial a bordo + - 921600 velocidad de transmisión máxima para la carga +- 9 pines GPIO + - también se puede utilizar como I2C y SPI +- 1 x entradas analógicas 1,0V máx. + +-- + +## Feather HUZZAH ESP8266 -[pinout](https://learn.adafruit.com/adafruit-feather-huzzah-esp8266/pinouts) + +![](img/feather.huzzah.pinout.png) + +--- + +## Adafruit HUZZAH ESP8266 Breakout + +![](img/huzzah.breakout.png) + +-- + +## HUZZAH ESP8266 Breakout - especificaciones + +- 1 x Entrada analógica (1,0 V máx.) +- 9 x GPIO (3.3V lógico) + - También se utiliza para I2C o SPI +- 2 x pines UART +- 2 x 3-6V entradas de alimentación + - Restablecer, habilitar, deshabilitar LDO + - Salida de 3.3V + +-- + +## HUZZAH ESP8266 Breakout - pines de alimentacion + +![](img/huzzah.breakout.pinout.power.png) + +- regulador de voltaje (se pega a 4V a 6V) + - [Diodos Schottky](https://en.wikipedia.org/wiki/Schottky_diode) para tensiones variables +- **VBat** Batería Lipoly +- **V+** : 5V (FTDI/cabecera en serie) + +-- + +## HUZZAH ESP8266 Breakout - pines en serie + +![](img/huzzah.breakout.pinout.serial.png) + +- TX ( 3.3V) y RX ( 5V) + +-- + +## HUZZAH ESP8266 Breakout - Pines GPIO + +![](img/huzzah.breakout.pinout.gpio.png) + +- No hay pull-up en **#0** +- Lógica de 3.3V + - Corriente máxima consumida: 12mA. +- [Hoja de especificaciones completa](http://www.adafruit.com/datasheets/ESP8266_Specifications_English.pdf) + +-- + +## HUZZAH ESP8266 Breakout - otros pines + +![](img/huzzah.breakout.pinout.analog.png) + +- **A** : entrada analógica ( 0 - 1,0V) +- **LDO** : conectar a **GND** para apagar el regulador de 3.3V +- **RST** ( 5V) **EN** ( 3.3V) + - hasta **GND** para reiniciar el ESP8266 + +--- + +## CircuitPython + +| | | +| ------------------------------- | -------------------------- | +| ![](img/circuitpython.logo.png) | ![](img/adafruit.logo.jpg) | + +--- + +## Circuito Playground Express + +![](img/circuitpython.small.png) + +-- + +#### .... viene con + +![](img/makecode.circuitpython.small.png) + +- Editor gráfico de arrastrar y soltar +- Editor en línea de Python y Javascript +- Toneladas de [documentación](http://adafru.it/wpE), material didáctico, etc. + +-- + +### Placa Circuito Playground Express - características + +- ATSAMD21 ARM Procesador Cortex M0 + - 3.3V y 48MHz +- 2 MB de almacenamiento SPI Flash +- Puerto MicroUSB + - Programación y depuración + - Puerto serie + - teclado, ratón + - joystick o MIDI + +-- + +### Placa Circuito Playground Express - otras características + +- 10 x mini NeoPixels +- 1 x sensor de movimiento (LIS3DH) + - Acelerómetro de tres ejes + - Detección de golpes y caídas libres +- 1 x Sensor de temperatura (termistor) +- 1 x Sensor de luz (fototransistor). + - Sensor de color y sensor de pulso. + +-- + +### Placa Circuito Playground Express - más características + +- 1 x micrófono MEMS +- 1 x Mini-altavoz con amplificador clase D +- 2 x Pulsadores +- Receptor y transmisor de infrarrojos + - Recibir y transmitir cualquier código de control remoto + - Enviar mensajes entre Circuitos Playground Expresses + - Sensor de proximidad. + +-- + +### Placa Circuito Playground Express - aún más características + +- 8 x pines de entrada/salida fáciles de pinza de cocodrilo + +![](img/cpx.pinout.png) + +--- + +## Trinket M0 + + ![](img/trinket.m0.small.png) + +Tarjeta programable CircuitPython de bajo costo! + + .... preinstalado nada más sacarlo de la caja! + +-- + +## Trinket M0 - características (vs Trinket) + +- El mismo tamaño, factor de forma y pinout que el Trinket clásico +- ATSAMD21E18 Microcontrolador de 32 bits Cortex M0+ Atmel ATSAMD21 (ATtiny85 8-bit AVR) + - Procesador a 32 bit de 48 MHz (+6x mas rápido) +- 256KB Flash (8KB ⇒ 32x), 32 KB RAM (512B ⇒ 64x) + +-- + +## Trinket M0 - USB + +- USB nativo soportado por todos los sistemas operativos (falta en Trinket) + - Arduino IDE + - Consola serie CircuitPython USB + - Teclado/ratón HID + - .... incluso una pequeña unidad de disco para almacenar scripts Python. + +-- + +## Trinket M0 - otras características + + ![](img/trinket.m0.overview.png) + +- Conector USB Micro B +- 3 LED incorporados (RGB DotStar LED, LED rojo #13, LED ON) +- Botón de reinicio + +-- + +## Trinket M0 - Parte trasera + + ![](img/trinket.m0.small.png) + +- Entrada de batería (unida al pin BAT) para soldar en un conector JST PH y alimentarlo con una batería externa. + - Batería de polímero de litio o paquetes de baterías JST 3xAAA +- Protecciones : polaridad inversa, sobrecorriente y térmica. +- Conmutación entre USB y batería (tensión máxima) + +--- + +## Concluyendo .... + +> Especificaciones de la caja de tu tabla y mantenerlas abiertas. + +-- + +## Adafruit Feather Huzzah ESP8266 + +![](img/feather.huzzah.pinout.png) + +-- + +## Circuito Playground Express + +![](img/cpx.pinout.png) + +-- + +## PyBoard v1.1 + +![](img/pyb.1.1.1.pinout.png) + +-- + +## PyBoard v1.0 + +![](img/pyb.1.0.pinout.png) + +-- + +## PyBoard Lite AC v1.0 + +![](img/pybliteac.1.0.pinout.png) + +-- + +## PyBoard Lite v1.0 + +![](img/pyblite.1.0.pinout.png) + +-- + +## Trinket M0 + +![](img/trinket.m0.pinout.png) + +-- + +## NodeMCU v3 (e.g. LoLin wemos.cc) + +![](img/nodemcu.v3.lolin.pinout.png) + +-- + +## NodeMCU v2 (por ejemplo, DoIT.am) + +![](img/nodemcu.v2.doit.pinout.png) + +-- + +## NodeMCU v1 (por ejemplo, Amica devkit) + +![](img/nodemcu.v1.devkit.pinout.png) + +--- + +## Introducción a PyBoard + +Zero conf + +![](img/pyboard.small.png) + +--- + +## Cómo empezar ESP8266 + +```sh +pip install esptool +``` + +Desde que la Versión 1.3 soporta tanto Python 2.7 como 3.4
(o superior) + +-- + +### Identificar USB - GNU/Linux + +```sh +Monitor de udevadm --udev +imprimirá los eventos recibidos: +UDEV - el evento que udev envía después del procesamiento de reglas + +UDEV [1504678146.578976] add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2 (usb) +UDEV [1504678146.746860] add /module/usbserial (module) +UDEV [1504678146.747288] add /bus/usb-serial (bus) +UDEV [1504678146.747855] add /bus/usb/drivers/usbserial (drivers) +UDEV [1504678146.748149] add /bus/usb/drivers/usbserial_generic (drivers) +UDEV [1504678146.748241] add /bus/usb-serial/drivers/generic (drivers) +UDEV [1504678146.772466] add /module/ch341 (module) +UDEV [1504678146.772783] add /bus/usb-serial/drivers/ch341-uart (drivers) +UDEV [1504678146.774556] add /bus/usb/drivers/ch341 (drivers) +UDEV [1504678146.774614] add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0 (usb) +UDEV [1504678146.775507] add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0/ttyUSB0 (usb-serial) +UDEV [1504678146.803046] add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0/ttyUSB0/tty/ttyUSB0 (tty) +``` + +-- + +### Identificar USB - Mac OS X + +```sh +ls /dev/cu*serial* +/dev/cu.wchusbserial1410 +``` + +-- + +## Borrar y desplegar firmware + +```sh +esptool.py --port /dev/ttyUSB0 borrar_flash +esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash --flash_size=detect 0 esp8266-20170526-v1.9.bin +``` + +- Especifique el nombre del dispositivo identificado anteriormente después de `--port` +- Reduzca la velocidad de transmisión si se producen errores al parpadear (por ejemplo, hasta 115200). + +-- + +## ...si todavía no funciona... + +Para algunas tarjetas NodeMCU especifique la opción `-fm dio`. + +```sh +esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash --flash_size=detect -fm dio 0 esp8266-20170526-v1.9.bin +``` + +--- + +## Introducción - cargador de arranque UF2 + +- Descargar archivo de imagen UF2 + - por ejemplo [el último CPX CircuitPython UF2](https://github.com/adafruit/circuitpython/releases/download/2.1.0/adafruit-circuitpython-circuitplayground_express-2.1.0.uf2) para Circuito Playground Express +- Conecte la tarjeta al ordenador mediante un cable de datos USB +- [**OPTIONAL**] Restablece tu tabla. + - Por ejemplo, haga doble clic en el botón Reset situado en el centro del CPX. + +-- + +## Modo de cargador de arranque UF2 + +![](img/circuit_playground_greens.jpg) + +- Comprueba que tu placa está en modo bootloader + - p.ej. todos los LEDs se ponen verdes en el CPX + +-- + +## Unidad de arranque UF2 + +![](img/circuit_playground_cplayboot.gif) + +- Aparece una nueva unidad de disco + - El nombre puede variar, por ejemplo, `CPLAYBOOT` para CPX. + +-- + +## UF2 flasheando + +![](img/circuit_playground_drag.png) + +- Copiar (arrastrar) el archivo de imagen en la unidad de arranque + +--- + +## Cómo empezar - BOSSAC + +- Descargue archivos de imagen BIN, por ejemplo,[último BIN para CPX](https://adafruit-circuit-python.s3.amazonaws.com/index.html?prefix=bin/circuitplayground_express/) +- Descargar [última versión de bossac](https://github.com/shumatech/BOSSA/releases/latest) + - `mingw32` para Windows, `apple-darwin` para Mac OSX, y varias opciones `linux`. + +-- + +## Flash con BOSSAC + +```sh +$ bossac -e -w -v -R ~/Downloads/adafruit-circuitpython-circuitplayground_express-1.0.0.0.bin +``` + +`e` borra el chip, `w` escribe el archivo dado, `v` verifica la escritura y `r` resetea la placa. + +--- + +## REPL sobre el puerto serie + +- Enchufe el cable mini-USB (placa) a USB (portátil) +- Identificar el dispositivo USB +- Conectar a través de una conexión en serie + +-- + +### Identificar y conectar a través de USB - GNU/Linux + + + +```sh +$ udevadm monitor --udev +monitor will print the received events for: +UDEV - the event which udev sends out after rule processing + +UDEV [1504678146.578976] add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2 (usb) +UDEV [1504678146.746860] add /module/usbserial (module) +UDEV [1504678146.747288] add /bus/usb-serial (bus) +UDEV [1504678146.747855] add /bus/usb/drivers/usbserial (drivers) +UDEV [1504678146.748149] add /bus/usb/drivers/usbserial_generic (drivers) +UDEV [1504678146.748241] add /bus/usb-serial/drivers/generic (drivers) +UDEV [1504678146.772466] add /module/ch341 (module) +UDEV [1504678146.772783] add /bus/usb-serial/drivers/ch341-uart (drivers) +UDEV [1504678146.774556] add /bus/usb/drivers/ch341 (drivers) +UDEV [1504678146.774614] add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0 (usb) +UDEV [1504678146.775507] add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0/ttyUSB0 (usb-serial) +UDEV [1504678146.803046] add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0/ttyUSB0/tty/ttyUSB0 (tty) + +$ picocom /dev/ttyUSB0 -b115200 +``` + + + +... no siempre `ttyUSB0` e.g. `ttyACM0`. + +-- + +### Identificar y conectar a través de USB - Mac OS X + +```sh +$ ls /dev/cu*serial* +/dev/cu.wchusbserial1410 + +$ screen /dev/cu.wchusbserial1410 115200 -L +MicroPython v1.9-8-gfcaadf92 on 2017-05-26; ESP module with ESP8266 +Type "help()" for more information. +>>> +``` + +... El nombre del dispositivo puede no ser `/dev/cu.wchusbserial1410`. + +-- + +### Conectar a través de USB - Windows PuTTY + +![](img/putty.config.serial.png) + +.... ajustar la velocidad a `115200` (en lugar de `9600`) + +-- + +### Conectar a través de USB - Windows TeraTerm + +![](img/teraterm.config.serial.png) + +--- + +# Perdona... + +# ¿Qué es MicroPython? + +--- + +## ¡Es Python! (3.4-ish) + +```python +>>> print('Hola mundo!') +Hola mundo! + +>>> with open('cubantech.txt', 'w') as f: +>>> f.write('Hola CubanTech!') + +>>> with open('cubantech.txt', 'r') as f: +>>> for l in f: +>>> print l +Hola CubanTech! + +>>> try: +>>> 1/0 +>>> except ZeroDivisionError as e: +>>> print("Oh, you!") +Oh, you! +``` + +--- + +## ...pero no todo. + +```python +>>> import functools +Traceback (most recent call last): + File "", line 1, in +ImportError: no module named 'functools' +>>> import this +Traceback (most recent call last): + File "", line 1, in +ImportError: no module named 'this' +``` + +--- + +## Módulos soportados + +- `sys` +- `time` +- `struct` +- `machine` - Funciones de la máquina relacionadas con la placa +- `micropython` - internos +- Los puertos específicos proporcionan ganchos específicos, REPL y módulos personalizados + +--- + +## Biblioteca estándar externa + +Escrito en Python (¿recuerdas PyPy?) + +```sh +$ micropython -m upip install micropython-functools +$ ./micropython +MicroPython v1.7-116-g8dd704b on 2016-04-19; linux version +Use Ctrl-D to exit, Ctrl-E for paste mode +>>> import functools +>>> dir(functools) +['__name__', 'reduce', 'partial', 'update_wrapper', '__file__', 'wraps'] +https://github.com/micropython/micropython-lib +``` + +--- + +## Soporta sintaxis asíncrona/en espera + +```python +async def ping_pygrunn(): + return await ping_server('pygrunn.org') +``` + +--- + +# APIs de hardware + + .... para PyBoard y chips STM + +-- + +## Sus micro-superpoderes incluyen: + +- Desactivar interrupciones +- Activar y desactivar GC +- Escribir ensamblador en línea +- Emitir código de byte o código máquina + +-- + +## Ensamblador en línea - Devolver un valor + +```python +>>> @micropython.asm_thumb +... def fun(): +... movw(r0, 42) +... +>>> print(fun()) +``` + +¿Cuál es el resultado? + +-- + +## Ensamblador en línea - periféricos + +```python +@micropython.asm_thumb +def led_on(): + movwt(r0, stm.GPIOA) + movw(r1, 1 << 13) + strh(r1, [r0, stm.GPIO_BSRRL]) +``` + +Encienda el LED rojo del PyBoard (es decir, PA13 high) + +> - `stm` - Constantes de PyBoard +> - `stm.GPIOA` - desplazamiento de dirección de memoria a GPIOA +> - `movwt` mueve un 32-bit al registro (`movw` + `movt`) +> - `GPIO_BSRRL` - STM32 Bit Registro de Cambio/reinicio + +-- + +## Ensamblador en línea - Argumentos + +```python + +>>> @micropython.asm_thumb +... def asm_add(r0, r1): +... add(r0, r0, r1) +... +>>> asm_add(1, 2) +3 +``` + +- Hasta 4 argumentos +- Deben llamarse `r0`, `r1`, `r2` y `r3`. + +-- + +## Ensamblador en línea - Flash LED r0 veces + +```python + +@micropython.asm_thumb +def flash_led(r0): + # get the GPIOA address in r1 + movwt(r1, stm.GPIOA) + + # get the bit mask for PA14 (the pin LED #2 is on) + movw(r2, 1 << 14) + b(loop_entry) + label(loop1) + + # turn LED on + strh(r2, [r1, stm.GPIO_BSRRL]) + + # delay for a bit + movwt(r4, 5599900) + label(delay_on) + sub(r4, r4, 1) + cmp(r4, 0) + bgt(delay_on) + + # turn LED off + strh(r2, [r1, stm.GPIO_BSRRH]) + + # delay for a bit + movwt(r4, 5599900) + label(delay_off) + sub(r4, r4, 1) + cmp(r4, 0) + bgt(delay_off) + + # loop r0 times + sub(r0, r0, 1) + label(loop_entry) + cmp(r0, 0) + bgt(loop1) +``` + +- `label(x)` - asignar etiqueta +- `b(x)` rama incondicional +- `bgt(x)`, `blt(x)`, ... rama condicional + +-- + +## Emisor de código nativo + +```python + +@micropython.native +def foo(self, arg): + # code +``` + +Aproximadamente el doble de rápido, pero más grande binario + +-- + +## Viper es Python incrustada en tiempo real + +```python + +@micropython.viper +def foo(self, arg: int) -> int: + # code +``` + +- Ahora en realidad llamado Zerynth y algo confuso +- No totalmente conforme con las normas de Código Python +- Produce instrucciones para la máquina + +--- + +# Vamos entonces! + +--- + +## Nuestro hardware + +[![](img/ardx-hardware-kit-closed.jpg)](http://www.seeedstudio.com/depot/ARDX-The-starter-kit-for-Arduino-p-1153.html) + +-- + +## Nuestro hardware + +[![](img/ardx-hardware-kit-open.jpg)](http://www.seeedstudio.com/depot/ARDX-The-starter-kit-for-Arduino-p-1153.html) + +--- + +## A los kits les puede faltar equipo + +--- + +Si tiene problemas para encontrar un componente, háganoslo saber y le conseguiremos un reemplazo. + +--- + +## ¿No funciona? + +## ¡Probablemente hardware! + +--- + +Siéntase libre de seleccionar los componentes que más le gusten y completar los retos que más le interesen. + +--- + +## Componentes que estamos cubriendo + +- Programación en red con ESP8266 +- LEDs (diodos emisores de luz) +- Botones +- Servos +- Aplicaciones de internet de las cosas IOT con MQTTT + +--- + +## Redes (MicroPython en ESP8266) + +- Punto de acceso WiFi (AP) + - ESSID es de la forma MicroPython-xxxxxxxx (dirección MAC de su dispositivo) + - Restablecimiento de fábrica Contraseña `micropythoN` + - Dirección IP `192.168.4.1` +- Interfaz de la estación + +--- + +## Módulo de red + +```python +>>> import network +>>> sta_if = network.WLAN(network.STA_IF) +>>> ap_if = network.WLAN(network.AP_IF) + +``` + +--- + +## Estado de activación de la interfaz (red) + +```python +>>> sta_if.active() +False +>>> ap_if.active() +True +>>> ap_if.config('essid') +MicroPython-04320781 +>>> ap_if.config(essid='micropy012') +>>> ap_if.ifconfig() +('192.168.4.1', '255.255.255.0', '192.168.4.1', '8.8.8.8') +``` + +Los valores devueltos son: Dirección IP, máscara de red, pasarela, DNS. + +-- + +## Configuración de red - Parámetros + +| Parámetro | Tipo | Descripción | +| ---------- | ------ | ---------------------------------------------------- | +| _mac_ | bytes | Dirección MAC (bytes) | +| _essid_ | string | Nombre del punto de acceso WiFi (cadena) | +| _channel_ | int | Canal WiFi (entero) | +| _hidden_ | bool | Si el ESSID está oculto | +| _authmode_ | enum | Modo de autenticación soportado (ver `dir(network)`) | +| _password_ | string | Contraseña de acceso WiFi | + +--- + +## Configuración de red + +```python +>>> sta_if.active(True) +>>> sta_if.connect('cubantech', 'meet-ups') +>>> sta_if.isconnected() # Podria llevar un tiempo +True +>>> sta_if.ifconfig() +('192.168.0.2', '255.255.255.0', '192.168.0.1', '8.8.8.8') + +``` + +--- + +## Instala WebREPL si aún no lo has hecho + +##### ...de Internet. + +```sh +git clone https://github.com/micropython/webrepl +``` + +[Descargar WebREPL de Internet](https://github.com/micropython/webrepl) + +##### ...de CubanTech LAN + +```sh +git clone ssh://git@git.cuban.tech:2222/micropython/webrepl.git +``` + +[Descargar WebREPL desde LAN](http://git.cuban.tech/micropython/webrepl/repository/archive.tar.gz?ref=master) + +--- + +## Configurar el acceso a WebREPL (a través de USB) + +```python +import webrepl_setup +``` + +- Siga las instrucciones y avisos en pantalla +- Reinicie su dispositivo MicroPython. + +--- + +## WebREPL + +![](img/webrepl.png) + +- Conectar al punto de acceso del ESP8266 +- Lanzar WebREPL + - Abra `webrepl.html` en su navegador +- Haga clic en el botón "Conectar +- Escribe la contraseña con `webrepl_setup` cuando se te pida + +--- + +## Tenemos WiFi + +```python +>>> import socket +``` + +¡¡¡Tenemos sockets!!!! + +--- + +## Servidor HTTP simple + +Estado de todos los pines GPIO + +```python +import machine +pins = [machine.Pin(i, machine.Pin.IN) for i in (0, 2, 4, 5, 12, 13, 14, 15)] +html = """ + + ESP8266 Pins + +

ESP8266 Pins

+ %s
PinValue
+ + +""" + +import socket +addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1] +s = socket.socket() +s.bind(addr) +s.listen(1) +print('listening on', addr) +while True: + cl, addr = s.accept() + print('client connected from', addr) cl_file = cl.makefile('rwb', 0) + while True: + line = cl_file.readline() + if not line or line == b'\r\n': + break + rows = ['%s%d' % (str(p), p.value()) for p in pins] response = html % '\n'.join(rows) + cl.send(response) + cl.close() +``` + +--- + +## Componentes que estamos cubriendo + +- Programación en red con ESP8266 +- LEDs (diodos emisores de luz) +- Botones +- Servos +- Aplicaciones de Internet de las cosas (IoT) con MQTTT + +--- + +## LEDs + +#### Luz Emitiendo Diodos + +![](img/leds.jpg) + +--- + +## Pines de identificación de LEDs + +- El pin largo es positivo (y se pone en marcha) +- El pin corto es negativo (y va a tierra) + +![](img/led-pin-diagram.png) + +--- + +## Breadboards: Cableado sin soldadura + +#### Los Breadboards nos permiten cablear rápidamente los componentes para hacer prototipos + +![](img/breadboard.small.png) + +--- + +## Breadboards: Conexiones eléctricas + +- #### Aquí puedes ver cómo se conectan las diferentes filas y columnas. +- #### Si no está claro, no dudes en buscar en Google o pedirle a un voluntario que te lo explique. + +![](img/breadboard-diagram.small.jpg) + +## Usa tu breadboard y un par de cables (el color no importa) para construir esto + +![](img/arduino-led-breadboard.png) + +--- + +## Construye esto - Feather HUZZAH ESP8266 + +![](img/feather.huzzah.led.png) + +-- + +## Alternativa - PyBoard + +![](img/pyboard.led.png) + +-- + +## Alternativa - NodeMCU v3 + +![](img/nodemcu.v3.led.png) + +--- + +Ejecutar esta en (USB o web) REPL + +```python +import machine +import time + +pin_id = 4 # NodeMCU + # PyBoard = 'A14' + # Huzzah Feather = 15 +led = machine.Pin(pin_id, machine.Pin.OUT) +while True: + led.high() + time.sleep(0.5) + led.low() + time.sleep(0.5) +``` + +salida del Bucle con `Ctrl-c` + +-- + +## LEDs incorporados (PyBoard) + +| Nombre físico | Nombre de la CPU | Descripción del LED | +| ------------- | ---------------- | ------------------- | +| P2 | B4 | LED azul | +| P3 | A15 | LED amarillo | +| P4 | A14 | LED verde | +| P5 | A13 | LED rojo | + +-- + +## LEDs incorporados (Huzzah) + +- LED rojo en el pin 0 +- LED azul en el pin 2 + +--- + +## Si tiene éxito, deberías ver esto + +![](img/huzzah.blinking-led.gif) + +--- + +## Cambio de la frecuencia de parpadeo + +- Probablemente notó que la luz parpadea cada 0,5 segundos. +- Cambie el código para que parpadee a una velocidad diferente y luego vuelva a ejecutarlo para asegurarse de que funciona. +- Si está atascado, presione ↓ para ver una solución potencial + +-- + +```python +import machine +import time + +pin_id = 4 # NodeMCU + # PyBoard = 'A14' + # Huzzah Feather = 15 +led = machine.Pin(pin_id, machine.Pin.OUT) +while True: + led.high() + time.sleep(3.0) + led.low() + time.sleep(3.0) +``` + +--- + +## Desafíos del LED + +Ahora que tiene los fundamentos de los LEDs, puede pasar al siguiente componente o trabajar en algunos desafíos de los LEDs. + +- Pulse → para pasar al siguiente componente +- Pulse ↓ para desplazarse por los desafíos de los LEDs + +-- + +## Desafíos del LED + +_¡Intenta resolverlos tú mismo antes de mirar la solución!_ + +Pulse ↓ para desplazarse por los siguientes retos (y posibles soluciones) + +1. Múltiples luces +2. Luces navideñas +3. Contador binario + +-- + +### 1. Múltiples luces + +Haga que 2 (o más) luces se alternen parpadeando + +![](img/alternate-blinking.gif) + +-- + +### Solución Potencial de Múltiples Luces - Hardware + +![](img/alternate-blinking-hardware.png) + +-- + +### Solución Potencial de Múltiples Luces - Código + +```js +var five = require("johnny-five"); +var board = new five.Board(); + +board.on("ready", function() { + var led1 = new five.Led(10); + var led2 = new five.Led(11); + var flag = false; + + setInterval(function() { + if (flag) { + led1.on(); + led2.off(); + } else { + led1.off(); + led2.on(); + } + + flag = !flag; + }, 500); +}); +``` + +-- + +### 2. Luces navideñas + +#### Haz que un LED (o varios LEDs) pasen por diferentes configuraciones, como hacen algunas luces navideñas. Debería cambiar el ajuste cada pocos segundos. A continuación se muestran algunos ejemplos de configuración. Puede ver un ejemplo en la siguiente diapositiva. + +- Apagado +- Sólido +- Parpadeando +- Pulsos (desvanecimiento hacia adentro y hacia afuera) +- Diferentes velocidades de parpadeo, pulsación o alternancia +- Alternando qué luces están encendidas + +-- + +### 2. Luces navideñas + +![](img/holiday-lights.gif) + +-- + +### Potencial solución de luces navideñas - Hardware + +![](img/holiday-lights-hardware.gif) + +-- + +### Potencial solución para las luces navideñas - Código + +```js +var five = require("johnny-five"); +var board = new five.Board(); + +board.on("ready", function() { + var led = new five.Led(11); + var setting = 0; + + setInterval(function() { + led.stop(); // If we call pulse, we need to stop it + switch (setting) { + case 0: + led.pulse(); + break; + case 1: + led.off(); + break; + case 2: + led.on(); + break; + } + setting = (setting + 1) % 3; + }, 3000); +}); +``` + +-- + +### 2. Luces navideñas (bonos) + +1. Exponer una función a la REPL que le permite cambiar a la siguiente configuración desde la REPL +2. Añada un botón que, al pulsarlo, pase a la siguiente configuración (Nota: debe completar las diapositivas del componente de botones antes de intentarlo). + +-- + +### Potencial solución de Bonus 1 para luces navideñas - Hardware + +![](img/holiday-lights-hardware.gif) + +-- + +### Posible solución de bonificación por luces navideñas 1 - Código + +```js +var five = require("johnny-five"); +var board = new five.Board(); + +board.on("ready", function() { + var led = new five.Led(11); + var setting = 0; + + function changeSetting() { + led.stop(); // Si llamamos al pulso, tenemos que detenerlo + switch (setting) { + case 0: + led.pulse(); + break; + case 1: + led.off(); + break; + case 2: + led.on(); + break; + } + setting = (setting + 1) % 3; + } + + this.repl.inject({ + cs: changeSetting // Ahora podemos llamar a cs() desde el REPL + }); +}); +``` + +-- + +### Potencial solución para luces navideñas Bonus 2 + +¡Estás por tu cuenta en esto! + +-- + +### 3. Contador binario + +Usando 3 LEDs, cuente de 0 a 7 en binario como se muestra a continuación. Encendido(On) representa 1 y Apagado(off) repesentes 0. + +![](img/binary-counter.gif) + +-- + +### Solución de contador binario potencial - Hardware + +![](img/binary-counter-hardware.png) + +-- + +### Solución de contador binaria potencial (alt 1) - Código + +```js +var five = require("johnny-five"); +var board = new five.Board(); + +board.on("ready", function() { + var led1 = new five.Led(9); + var led2 = new five.Led(10); + var led3 = new five.Led(11); + var num = 0; + + setInterval(function() { + var binary = num.toString(2); + + binary.slice(-1) === "1" ? led1.on() : led1.off(); + binary.slice(-2, -1) === "1" ? led2.on() : led2.off(); + binary.slice(-3, -2) === "1" ? led3.on() : led3.off(); + + num = (num + 1) % 8; + }, 1000); +}); +``` + +-- + +### Solución de contador binaria potencial (alt 2) - Código + +```js +var five = require("johnny-five"); +var board = new five.Board(); + +board.on("ready", function() { + var leds = [new five.Led(9), new five.Led(10), new five.Led(11)]; + var num = 0; + + setInterval(function() { + var mask = 1; + + for (var i = 0; i < leds.length; ++i, mask <<= 1) { + var led = led[i]; + num & mask ? led.on() : led.off(); + } + + num = (num + 1) % 8; + }, 1000); +}); +``` + +-- + +### 3. Contador binario (Bono) + +Permite al usuario introducir un número a través de la REPL y mostrarlo en binario en los LEDs. + +-- + +### Solución potencial de bono de contador binario + +¡Estás por tu cuenta en esto! + +--- + +## Componentes que estamos cubriendo + +- Programación en red con ESP8266 +- LEDs (diodos emisores de luz) +- Botones +- Servos +- Aplicaciones de IO con MQTTT + +--- + +## Botones + +![](img/buttons.jpg) + +--- + +## Construye Esto + +![](img/button-hardware.png) + +--- + +## Guarda esto en un archivo y ejecútalo + +```js +var five = require("johnny-five"); +var board = new five.Board(); + +board.on("ready", function() { + var button = new five.Button(2); + + button.on("press", function() { + console.log("Button Pressed!"); + }); + + button.on("hold", function() { + console.log("Button Held!"); + }); + + button.on("release", function() { + console.log("Button Released!"); + }); +}); +``` + +`node button.js` + +--- + +Intente presionar, soltar y mantener presionado el botón + +Debería ver alguna salida como esta en el REPL + +``` + +>> Botón pulsado! +Botón liberado! +Botón pulsado! +Botón liberado! +Botón pulsado! +Botón retenido! +Botón retenido! +Botón liberado! +``` + +--- + +## ¡Añadamos un LED! + +![](img/button-led-hardware.png) + +--- + +## Guarda esto en un archivo y ejecútalo + +```js +var five = require("johnny-five"); +var board = new five.Board(); + +board.on("ready", function() { + var led = new five.Led(11); + var button = new five.Button(2); + + button.on("press", function() { + led.on(); + }); + + button.on("hold", function() { + led.blink(50); + }); + + button.on("release", function() { + led.stop().off(); + }); +}); +``` + +`node button_led.js` + +--- + +El LED debe encenderse al presionar, apagarse al soltarlo y parpadear al mantenerlo presionado. + +--- + +## Desafíos de los botones + +Ahora que tiene los conceptos básicos de los botones, puede pasar al siguiente componente o trabajar en algunos desafíos de botones. + +- Pulse → para pasar al siguiente componente +- Presione ↓ para desplazarse por los desafíos del botón + +-- + +## Desafíos de los botones + +_¡Intenta resolverlos tú mismo antes de mirar la solución!_ + +Pulse ↓ para desplazarse por los siguientes retos (y posibles soluciones) + +1. Interruptor de luz +2. Clave de acceso +3. Luces navideñas + +-- + +### 1. Interruptor de luz + +Haga que al presionar un botón alternativamente encienda y apague un LED + +-- + +### Solución de interruptor de luz potencial - Hardware + +![](img/light-switch-hardware.png) + +-- + +### Solución de interruptor de luz potencial - Código + +```js +var five = require("johnny-five"); +var board = new five.Board(); + +board.on("ready", function() { + var led = new five.Led(11); + var button = new five.Button(2); + var on = false; + + button.on("press", function() { + if (on) { + led.off(); + } else { + led.on(); + } + + on = !on; + }); +}); +``` + +-- + +### 2. Clave de acceso + +Dispone de 2 botones y 1 LED. Hágalo de manera que tenga que presionar los botones en cierto orden para encender el LED. + +-- + +### Posible solución de código de acceso - Hardware + +![](img/passcode-hardware.png) + +-- + +### Posible solución de código de acceso - Código + +```js +var five = require("johnny-five"); +var board = new five.Board(); + +board.on("ready", function() { + var led = new five.Led(11); + var button1 = new five.Button(2); + var button2 = new five.Button(4); + + var passcode = "12112"; + var presses = ""; + + button1.on("press", function() { + presses += "1"; + if (presses.indexOf(passcode) > -1) { + led.on(); + } + }); + + button2.on("press", function() { + presses += "2"; + if (presses.indexOf(passcode) > -1) { + led.on(); + } + }); +}); +``` + +-- + +### 3. Luces navideñas + +#### Haz que un LED (o varios LEDs) pasen por diferentes configuraciones, como hacen algunas luces navideñas. Debe cambiar el ajuste cada vez que se pulsa el botón. A continuación se muestran algunos ejemplos de configuración. + +- Apagado +- Sólido +- Parpadeando +- Pulsos (desvanecimiento hacia adentro y hacia afuera) +- Diferentes velocidades de parpadeo, pulsación o alternancia +- Alternando qué luces están encendidas + +-- + +### Potencial solución para las luces navideñas + +¡Estás por tu cuenta en esto! + +--- + +## Componentes que estamos cubriendo + +- Programación en red con ESP8266 +- LEDs (diodos emisores de luz) +- Botones +- Servos + +--- + +## SERVOS + +![](img/servo.jpg) + +--- + +Toma tu servo y añádele uno de los adjuntos. + +![](img/servo.jpg) + +--- + +## Construye esto + +![](img/servo-hardware.png) + +--- + +## Guarda esto en un archivo y ejecútalo + +```js +var five = require("johnny-five"); +var board = new five.Board(); + +board.on("ready", function() { + var servo = new five.Servo(11); + + this.repl.inject({ + servo: servo + }); +}); +``` + +`node servo.js` + +--- + +Escribe estos comandos en la REPL y observa cómo reacciona el servo + +```js +> servo.to(10); // muevete a 10 grados + +> servo.to(200); // muevete a 200 grados + +> servo.value; // Obtener posición actual + +> servo.min(); + +> servo.max(); + +> servo.range; + +> servo.center(); + +> servo.sweep(); +``` + +--- + +## Servo Challenges + +Ahora que tienes los fundamentos de los servos, puedes pasar al siguiente componente o trabajar en algunos desafíos de los servos. + +Pulse → para pasar al siguiente componente +Pulse ↓ para desplazarse por los desafíos de los servos + +-- + +## Servo Challenges + +_¡Intenta resolverlos tú mismo antes de mirar la solución!_ + +Pulse ↓ para desplazarse por los siguientes retos (y posibles soluciones) + +1. Rociador +2. Flechas +3. Botón + +-- + +### 1. Rociador + +Haz que el servo gire de un lado a otro como si fuera un aspersor. + +![](img/sprinkler.gif) + +-- + +### Solución potencial de rociadores - Hardware + +![](img/sprinkler-hardware.png) + +-- + +### Solución potencial de rociadores - Código + +```js +var five = require("johnny-five"); +var board = new five.Board(); + +board.on("ready", function() { + var servo = new five.Servo(11); + var min = servo.range[0]; + var max = servo.range[1]; + var value = min; + + function step() { + servo.to(value); + value = (value + 45) % max; + setTimeout(step, 500); + } + + step(); +}); +``` + +-- + +### 2. Flechas + +Haz que al presionar el botón de flecha izquierda gire el servo en una dirección y al presionar el botón de flecha derecha gire en la otra dirección. + +![](img/servo-arrows.gif) + +-- + +### Solución de Flechas Potenciales - Hardware + +![](img/servo-arrows-hardware.png) + +-- + +### Solución de flechas potenciales - Código + +```js +var five = require("johnny-five"); +var keypress = require("keypress"); +var board = new five.Board(); + +board.on("ready", function() { + var servo = new five.Servo(11); + + process.stdin.on("keypress", function(ch, key) { + if (key && key.name === "left") { + servo.min(); + } else if (key && key.name === "right") { + servo.max(); + } + }); + + process.stdin.setRawMode(true); + process.stdin.resume(); +}); +``` + +-- + +### 3. Botón + +Haz que el servo barra mientras se mantiene pulsado un botón + +![](img/servo-sweep.gif) + +-- + +### Potencial Solución de Botón - Hardware + +![](img/servo-sweep-hardware.png) + +-- + +### Potencial Solución de Botón - Código + +```js +var five = require("johnny-five"); +var board = new five.Board(); + +board.on("ready", function() { + var servo = new five.Servo(11); + var button = new five.Button(2); + + button.on("press", function() { + servo.sweep(); + }); + + button.on("release", function() { + servo.stop(); + }); +}); +``` + +--- + +Uh oh oh! Nos quedamos sin Diapositivas! Siéntase libre de probar algunos de los otros componentes de su kit mientras nosotros añadimos más! + +--- + +## Liquidacion + +- Gracias por venir! +- Nos encantaría conocer su opinión: [bit.ly/cubantech-nodebots-feedback](http://bit.ly/nodebots-feedback) +- Por favor, guarde los kits (puede comprar los suyos propios[aquí](http://www.seeedstudio.com/depot/ARDX-The-starter-kit-for-Arduino-p-1153.html)) diff --git a/nodebots-es.md b/nodebots-es.md new file mode 100644 index 00000000000..12d8d151b70 --- /dev/null +++ b/nodebots-es.md @@ -0,0 +1,1047 @@ +## Nodebots con CubanTech (NYJS ;) + +#### Estas diapositivas: [slides.cuban.tech/nodebots.html](http://slides.cuban.tech/nodebots.html) + +--- + +### Información Wifi + +Red: cubantech + +Contraseña: meet-ups + +--- + +### Si aún no lo has hecho, instala Node + +##### [Descarga Node](https://nodejs.org/en/download/) + +##### [Descarga Node de LAN](ftp://qnap01.local/Public/soft/nodejs) + +--- + +- Este taller se basa en gran medida en un taller de [NY-Javascript](http://www.meetup.com/NY-Javascript) (ver [bit.ly/nyjs-nodebots](http://bit.ly/nyjs-nodebots)) +- ... que se basa en gran medida en un taller de [Francis Gulotta](https://twitter.com/reconbot) y [Rick Waldron](https://twitter.com/rwaldron) +- Puede encontrar las diapositivas para ese taller en [gul.ly/3tjj](http://gul.ly/3tjj) +- Puedes inscribirte en uno de sus talleres en la página [Nodebots NYC Meetup page](http://www.meetup.com/nodebots/) + +--- + +## Nuestros lineamientos de la comunidad + +[Ser excelente el uno con el otro](https://github.com/nodeschool/havana/blob/master/Code_of_Conduct.md) + +--- + +Próximos Eventos CubanTech + +- [Encuentros CubanTech](http://meetup.cuban.tech) +- [Encuentros Docker en Cuba](http://docker.cuban.tech) +- [Encuentros Blockstack Cuba](http://blockstack.cuban.tech) +- [SciPyLA 2019](http://conf.scipyla.org) + +--- + +# Muchisimas gracias a nuestro anfitrión + +--- + +## ¿Qué son los Nodebots? + +![](img/johnny-five.png) + +--- + +## JavaScript + Robots = Nodebots + +--- + +# ¡Comencemos! + +--- + +## Nuestro hardware + +[![](img/hardware-kit-closed.jpg)](http://www.seeedstudio.com/depot/ARDX-The-starter-kit-for-Arduino-p-1153.html) + +--- + +## Nuestro hardware + +[![](img/hardware-kit-open.jpg)](http://www.seeedstudio.com/depot/ARDX-The-starter-kit-for-Arduino-p-1153.html) + +--- + +## A los Kits les puede faltar equipo + +--- + +Si tiene problemas para encontrar un componente, háganoslo saber y le conseguiremos un reemplazo. + +--- + +## ¿No funciona? + +## ¡Probablemente hardware! + +--- + +## Componentes que estamos cubriendo + +- LEDs (diodos emisores de luz) +- Botones +- Servos + +--- + +Siéntase libre de seleccionar los componentes que más le gusten y completar los retos que más le interesen. + +--- + +# Empezando + +-- + +## Instalar un nodo si aún no lo ha hecho + +[Descarga node desde Internet](https://nodejs.org/en/download/) + +[Descarga Node desde LAN](ftp://qnap01.local/Public/soft/nodejs) + +-- + +## Crear directorio de proyectos + +```sh +mkdir nodebots +cd nodebots +``` + +-- + +## Instala Johnny Five + +```sh +npm install johnny-five +``` + +--- + +# Para Empezar + +.... con .... + +![](img/docker_logo.png) + +-- + +TODO : Instalación de Document Docker + +--- + +## Estándar Firmata + +- Permite a Johnny-Five comunicarse con el Arduino a través de USB +- La mayoría de los Arduinos ya tienen instalados los Estándar Firmatas de talleres anteriores +- Vamos a comprobar que tu Arduino ya tiene instalado el Estándar Firmata! + +--- + +## Conecta el arduino + +![](img/connecting-arduino.jpg) + +--- + +Crear el fichero + +1. Ve a tu directorio de nodebots +2. Cree un archivo llamado test.js +3. Copie el código que aparece a continuación y guarde + +```js +var five = require("johnny-five"); +var board = new five.Board(); + +board.on("ready", function() { + var led = new five.Led(13); + + led.blink(500); +}); +``` + +--- + +Ejecute el código + +```sh +node test.js +``` + +--- + +## Este LED debería estar parpadeando cada 0.5 segundos + +![](img/built-in-led.png) + +--- + +Si funciona, ¡continúe! → + +--- + +Si no es así, pulsa ↓ para obtener instrucciones sobre cómo flashear tu Arduino con Estándar Firmata + +-- + +## Cómo flashear tu Arduino con Firmata estándar (mas) + +1. Descargue el[Arduino IDE](https://www.arduino.cc/en/main/software) +2. Asegúrate de que tu Arduino está conectado vía USB +3. Abra el IDE de Arduino +4. Seleccione: Archivo > Ejemplos > Firmata > StandardFirmataPlus +5. Seleccione: Herramientas > Tablero > Arduino/Genuino Uno +6. Seleccione: Herramientas > Puerto > +7. Haga clic en el botón Upload ![](img/arduino-ide-upload-button.png) +8. Vuelva a intentar hacer que el LED parpadee + +--- + +## Componentes que estamos cubriendo + +- LEDs (diodos emisores de luz) +- Botones +- Servos + +--- + +## LEDs + +#### Luz Emision Diodos + +![](img/leds.jpg) + +--- + +## Identificación de Pines LED + +- El pin largo es positiva (y pone en energía) +- El pin corto es negativo (y va a tierra) + +![](img/led-pin-diagram.png) + +--- + +## Construye Esto + +![](img/arduino-led.png) + +--- + +Guarde esto en un archivo y ejecútelo + +```js +var five = require("johnny-five"); +var board = new five.Board(); + +board.on("ready", function() { + var led = new five.Led(11); + + // "blink" the led in 500ms on-off phase periods + led.blink(500); +}); +``` + +`node blinky.js` + +--- + +## Si tiene éxito, deberías ver esto + +![](img/blinking-led.gif) + +--- + +## Cambio de la frecuencia de parpadeo + +- Probablemente notó que la luz parpadea cada 0,5 segundos. +- Cambie el código para que parpadee a una velocidad diferente y luego vuelva a ejecutarlo para asegurarse de que funciona. +- Si está atascado, presione ↓ para ver una solución potencial + +-- + +```js +var five = require("johnny-five"); +var board = new five.Board(); + +board.on("ready", function() { + var led = new five.Led(11); + + // "blink" the led in 3000ms on-off phase periods + led.blink(3000); +}); +``` + +`node blinky.js` + +--- + +## El REPL + +- Significa Read Evaluate Print Loop (Leer Evaluar ciclo de impresión ) +- Nos permite escribir el código en nuestro terminal y ver cómo afecta a nuestros robots. + +--- + +## Escribe y ejecuta esto. Luego, continúe con la siguiente diapositiva. + +```js +var five = require("johnny-five"); +var board = new five.Board(); + +board.on("ready", function() { + var led = new five.Led(11); + + this.repl.inject({ + led: led + }); +}); +``` + +`node led-boss.js` + +--- + +## Escriba estos comandos en el REPL y observe cómo cambia el LED + +``` +> led.on(); + +> led.off(); + +> led.blink(); + +> led.stop(); + +> led.pulse(); +``` + +--- + +## Inyección REPL + +La razón por la que podemos acceder al objeto led en el REPL es por este bit de código en el ejemplo anterior. Expone el objeto led a nuestra sesión REPL. + +```js +this.repl.inject({ + led: led +}); +``` + +--- + +## Breadboards: Cableado sin soldadura + +#### Los Breadboards nos permiten cablear rápidamente los componentes para hacer prototipos + +![](img/breadboard.small.png) + +--- + +## Breadboards: Conexiones eléctricas + +- #### Aquí puedes ver cómo se conectan las diferentes filas y columnas. +- #### Si no está claro, no dudes en buscar en Google o pedirle a un voluntario que te lo explique. + +![](img/breadboard-diagram.small.jpg) + +## Usa tu protoboard y un par de cables (el color no importa) para construir esto + +![](img/arduino-led-breadboard.png) + +--- + +Ahora ejecute uno de sus programas anteriores y asegúrese de que el LED siga parpadeando + +--- + +## Desafíos del LED + +Ahora que tiene los fundamentos de los LEDs, puede pasar al siguiente componente o trabajar en algunos desafíos de los LEDs. + +- Pulse → para pasar al siguiente componente +- Pulse ↓ para desplazarse por los desafíos de los LEDs + +-- + +## Desafíos del LED + +_¡Intenta resolverlos tú mismo antes de mirar la solución!_ + +Pulse ↓ para desplazarse por los siguientes retos (y posibles soluciones) + +1. Múltiples luces +2. Luces navideñas +3. Contador binario + +-- + +### 1. Múltiples luces + +Haga que 2 (o más) luces se alternen parpadeando + +![](img/alternate-blinking.gif) + +-- + +### Solución Potencial de Múltiples Luces - Hardware + +![](img/alternate-blinking-hardware.png) + +-- + +### Solución Potencial de Múltiples Luces - Código + +```js +var five = require("johnny-five"); +var board = new five.Board(); + +board.on("ready", function() { + var led1 = new five.Led(10); + var led2 = new five.Led(11); + var flag = false; + + setInterval(function() { + if (flag) { + led1.on(); + led2.off(); + } else { + led1.off(); + led2.on(); + } + + flag = !flag; + }, 500); +}); +``` + +-- + +### 2. Luces navideñas + +#### Haz que un LED (o varios LEDs) pasen por diferentes configuraciones, como hacen algunas luces navideñas. Debería cambiar el ajuste cada pocos segundos. A continuación se muestran algunos ejemplos de configuración. Puede ver un ejemplo en la siguiente diapositiva. + +- Apagado +- Sólido +- Parpadeando +- Pulsos (desvanecimiento hacia adentro y hacia afuera) +- Diferentes velocidades de parpadeo, pulsación o alternancia +- Alternando qué luces están encendidas + +-- + +### 2. Luces navideñas + +![](img/holiday-lights.gif) + +-- + +### Potencial solución de luces navideñas - Hardware + +![](img/holiday-lights-hardware.gif) + +-- + +### Potencial solución para las luces navideñas - Código + +```js +var five = require("johnny-five"); +var board = new five.Board(); + +board.on("ready", function() { + var led = new five.Led(11); + var setting = 0; + + setInterval(function() { + led.stop(); // Si llamamos al pulso, tenemos que detenerlo + switch (setting) { + case 0: + led.pulse(); + break; + case 1: + led.off(); + break; + case 2: + led.on(); + break; + } + setting = (setting + 1) % 3; + }, 3000); +}); +``` + +-- + +### 2. Luces navideñas (bonos) + +1. Exponer una función a la REPL que le permite cambiar a la siguiente configuración desde la REPL +2. Añada un botón que, al pulsarlo, pase a la siguiente configuración (Nota: debe completar las diapositivas del componente de botones antes de intentarlo). + +-- + +### Potencial solución de Bonus 1 para luces navideñas - Hardware + +![](img/holiday-lights-hardware.gif) + +-- + +### Posible solución de bonificación por luces navideñas 1 - Código + +```js +var five = require("johnny-five"); +var board = new five.Board(); + +board.on("ready", function() { + var led = new five.Led(11); + var setting = 0; + + function changeSetting() { + led.stop(); // If we call pulse, we need to stop it + switch (setting) { + case 0: + led.pulse(); + break; + case 1: + led.off(); + break; + case 2: + led.on(); + break; + } + setting = (setting + 1) % 3; + } + + this.repl.inject({ + cs: changeSetting // Now we can call cs() from the REPL + }); +}); +``` + +-- + +### Potencial solución de Bonus 2 para luces navideñas + +¡Estás por tu cuenta en esto! + +-- + +### 3. Contador binario + +Usando 3 LEDs, cuente de 0 a 7 en binario como se muestra a continuación. Encendido(On) representa 1 y apagado(off) representa 0. + +![](img/binary-counter.gif) + +-- + +### Solución de contador binario potencial - Hardware + +![](img/binary-counter-hardware.png) + +-- + +### Solución de contador binaria potencial (alt 1) - Código + +```js +var five = require("johnny-five"); +var board = new five.Board(); + +board.on("ready", function() { + var led1 = new five.Led(9); + var led2 = new five.Led(10); + var led3 = new five.Led(11); + var num = 0; + + setInterval(function() { + var binary = num.toString(2); + + binary.slice(-1) === "1" ? led1.on() : led1.off(); + binary.slice(-2, -1) === "1" ? led2.on() : led2.off(); + binary.slice(-3, -2) === "1" ? led3.on() : led3.off(); + + num = (num + 1) % 8; + }, 1000); +}); +``` + +-- + +### Solución de contador binaria potencial (alt 2) - Código + +```js +var five = require("johnny-five"); +var board = new five.Board(); + +board.on("ready", function() { + var leds = [new five.Led(9), new five.Led(10), new five.Led(11)]; + var num = 0; + + setInterval(function() { + var mask = 1; + + for (var i = 0; i < leds.length; ++i, mask <<= 1) { + var led = led[i]; + num & mask ? led.on() : led.off(); + } + + num = (num + 1) % 8; + }, 1000); +}); +``` + +-- + +### 3. Contador binario (Bono) + +Permite al usuario introducir un número a través de la REPL y mostrarlo en binario en los LEDs. + +-- + +### Solución potencial de bono de contador binario + +¡Estás por tu cuenta en esto! + +--- + +## Componentes que estamos cubriendo + +- LEDs (diodos emisores de luz) +- Botones +- Servos + +--- + +## Botones + +![](img/buttons.jpg) + +--- + +## Construye esto + +![](img/button-hardware.png) + +--- + +## Guarda esto en un archivo y ejecútalo + +```js +var five = require("johnny-five"); +var board = new five.Board(); + +board.on("ready", function() { + var button = new five.Button(2); + + button.on("press", function() { + console.log("Button Pressed!"); + }); + + button.on("hold", function() { + console.log("Button Held!"); + }); + + button.on("release", function() { + console.log("Button Released!"); + }); +}); +``` + +`node button.js` + +--- + +Intente presionar, soltar y mantener presionado el botón + +Debería ver alguna salida como esta en el REPL + +``` +>> Botón pulsado! +Botón liberado! +Botón pulsado! +Botón liberado! +Botón pulsado! +Botón retenido! +Botón retenido! +Botón liberado! +``` + +--- + +## ¡Añadamos un LED! + +![](img/button-led-hardware.png) + +--- + +## Guarda esto en un archivo y ejecútalo + +```js +var five = require("johnny-five"); +var board = new five.Board(); + +board.on("ready", function() { + var led = new five.Led(11); + var button = new five.Button(2); + + button.on("press", function() { + led.on(); + }); + + button.on("hold", function() { + led.blink(50); + }); + + button.on("release", function() { + led.stop().off(); + }); +}); +``` + +`node button_led.js` + +--- + +El LED debe encenderse al presionar, apagarse al soltarlo y parpadear al mantenerlo presionado. + +--- + +## Desafíos de los botones + +Ahora que tiene los conceptos básicos de los botones, puede pasar al siguiente componente o trabajar en algunos desafíos de botones. + +- Pulse → para pasar al siguiente componente +- Presione ↓ para desplazarse por los desafíos del botón + +-- + +## Desafíos de los botones + +_¡Intenta resolverlos tú mismo antes de mirar la solución!_ + +Pulse ↓ para desplazarse por los siguientes retos (y posibles soluciones) + +1. Interruptor de luz +2. Clave de acceso +3. Luces navideñas + +-- + +### 1. Interruptor de luz + +Haga que al presionar un botón alternativamente encienda y apague un LED + +-- + +### Solución de interruptor de luz potencial - Hardware + +![](img/light-switch-hardware.png) + +-- + +### Solución de interruptor de luz potencial - Código + +```js +var five = require("johnny-five"); +var board = new five.Board(); + +board.on("ready", function() { + var led = new five.Led(11); + var button = new five.Button(2); + var on = false; + + button.on("press", function() { + if (on) { + led.off(); + } else { + led.on(); + } + + on = !on; + }); +}); +``` + +-- + +### 2. Clave de acceso + +Dispone de 2 botones y 1 LED. Hágalo de manera que tenga que presionar los botones en cierto orden para encender el LED. + +-- + +### Posible solución de código de acceso - Hardware + +![](img/passcode-hardware.png) + +-- + +### Posible solución de código de acceso - Código + +```js +var five = require("johnny-five"); +var board = new five.Board(); + +board.on("ready", function() { + var led = new five.Led(11); + var button1 = new five.Button(2); + var button2 = new five.Button(4); + + var passcode = "12112"; + var presses = ""; + + button1.on("press", function() { + presses += "1"; + if (presses.indexOf(passcode) > -1) { + led.on(); + } + }); + + button2.on("press", function() { + presses += "2"; + if (presses.indexOf(passcode) > -1) { + led.on(); + } + }); +}); +``` + +-- + +### 3. Luces navideñas + +#### Haz que un LED (o varios LEDs) pasen por diferentes configuraciones, como hacen algunas luces navideñas. Debe cambiar el ajuste cada vez que se pulsa el botón. A continuación se muestran algunos ejemplos de configuración. + +- Apagado +- Sólido +- Parpadeando +- Pulsos (desvanecimiento hacia adentro y hacia afuera) +- Diferentes velocidades de parpadeo, pulsación o alternancia +- Alternando qué luces están encendidas + +-- + +### Potencial solución para las luces navideñas + +¡Estás por tu cuenta en esto! + +--- + +## Componentes que estamos cubriendo + +- LEDs (diodos emisores de luz) +- Botones +- Servos + +--- + +## SERVOS + +![](img/servo.jpg) + +--- + +Toma tu servo y añádele uno de los adjuntos. + +![](img/servo.jpg) + +--- + +## Construye esto + +![](img/servo-hardware.png) + +--- + +## Guarda esto en un archivo y ejecútalo + +```js +var five = require("johnny-five"); +var board = new five.Board(); + +board.on("ready", function() { + var servo = new five.Servo(11); + + this.repl.inject({ + servo: servo + }); +}); +``` + +`node servo.js`s + +--- + +Escribe estos comandos en la REPL y observa cómo reacciona el servo + +```js +> servo.to(10); // Mover a 10 grados + +> servo.to(200); // Mover a 200 grados + +> servo.value; // Obtener la posición actual + +> servo.min(); + +> servo.max(); + +> servo.range; + +> servo.center(); + +> servo.sweep(); +``` + +--- + +## Servo Desafios + +Ahora que tienes los fundamentos de los servos, puedes pasar al siguiente componente o trabajar en algunos desafíos de los servos. + +Pulse → para pasar al siguiente componente +Pulse ↓ para desplazarse por los desafíos de los servos + +-- + +## Servo Desafios + +_¡Intenta resolverlos tú mismo antes de mirar la solución!_ + +Pulse ↓ para desplazarse por los siguientes retos (y posibles soluciones) + +1. Rociador +2. Flechas +3. Botón + +-- + +### 1. Rociador + +Haz que el servo gire de un lado a otro como si fuera un aspersor. + +![](img/sprinkler.gif) + +-- + +### Solución potencial de rociadores - Hardware + +![](img/sprinkler-hardware.png) + +-- + +### Solución potencial de rociadores - Código + +```js +var five = require("johnny-five"); +var board = new five.Board(); + +board.on("ready", function() { + var servo = new five.Servo(11); + var min = servo.range[0]; + var max = servo.range[1]; + var value = min; + + function step() { + servo.to(value); + value = (value + 45) % max; + setTimeout(step, 500); + } + + step(); +}); +``` + +-- + +### 2. Flechas + +Haz que al presionar el botón de flecha izquierda gire el servo en una dirección y al presionar el botón de flecha derecha gire en la otra dirección. + +![](img/servo-arrows.gif) + +-- + +### Solución de Flechas Potenciales - Hardware + +![](img/servo-arrows-hardware.png) + +-- + +### Solución de flechas potenciales - Código + +```js +var five = require("johnny-five"); +var keypress = require("keypress"); +var board = new five.Board(); + +board.on("ready", function() { + var servo = new five.Servo(11); + + process.stdin.on("keypress", function(ch, key) { + if (key && key.name === "left") { + servo.min(); + } else if (key && key.name === "right") { + servo.max(); + } + }); + + process.stdin.setRawMode(true); + process.stdin.resume(); +}); +``` + +-- + +### 3. Botón + +Haz que el servo barra mientras se mantiene pulsado un botón + +![](img/servo-sweep.gif) + +-- + +### Potencial Solución de Botón - Hardware + +![](img/servo-sweep-hardware.png) + +-- + +### Potencial Solución de Botón - Código + +```js +var five = require("johnny-five"); +var board = new five.Board(); + +board.on("ready", function() { + var servo = new five.Servo(11); + var button = new five.Button(2); + + button.on("press", function() { + servo.sweep(); + }); + + button.on("release", function() { + servo.stop(); + }); +}); +``` + +--- + +Uh oh oh! Nos quedamos sin diapositivas! Siéntase libre de probar algunos de los otros componentes de su kit mientras nosotros añadimos más! + +--- + +## Conclusiones + +- Gracias por venir! +- Nos encantaría conocer su opinión: [bit.ly/nodebots-feedback](http://bit.ly/nodebots-feedback) +- Por favor, guarde los kits (puede comprar los suyos propios [aquí](http://www.seeedstudio.com/depot/ARDX-The-starter-kit-for-Arduino-p-1153.html))