Joystick con arduino Leonardo y teclas de flecha

#include <Button.h>
#include <Keyboard.h>

const int BOTON_UP = 4;
const int BOTON_DOWN = 5;
const int BOTON_LEFT = 2;
const int BOTON_RIGHT = 3;

const int BOTON_A = 10;
const int BOTON_B = 8;
const int BOTON_X = 9;

const int BOTON_COIN = 11;

const int BOTON_1P = 7;
const int BOTON_2P = 6;

Button btnUp = Button(BOTON_UP,PULLUP);
Button btnDown = Button(BOTON_DOWN,PULLUP);
Button btnLeft = Button(BOTON_LEFT,PULLUP);
Button btnRight = Button(BOTON_RIGHT,PULLUP);

Button btnA = Button(BOTON_A, PULLUP);
Button btnB = Button(BOTON_B, PULLUP);
Button btnX = Button(BOTON_X, PULLUP);

Button btnCoin = Button(BOTON_COIN, PULLUP);

Button btn1P = Button(BOTON_1P, PULLUP);
Button btn2P = Button(BOTON_2P, PULLUP);

void setup() {
  Keyboard.begin();
}

void loop() { 
  if (btnUp.isPressed()) { 
    Keyboard.press(KEY_UP_ARROW);
  } else {
    Keyboard.release(KEY_UP_ARROW);   
  }

  if (btnDown.isPressed()) { 
    Keyboard.press(KEY_DOWN_ARROW);
  } else {
    Keyboard.release(KEY_DOWN_ARROW);   
  }

  if (btnLeft.isPressed()) { 
    Keyboard.press(KEY_LEFT_ARROW);
  } else {
    Keyboard.release(KEY_LEFT_ARROW);   
  }

  if (btnRight.isPressed()) { 
    Keyboard.press(KEY_RIGHT_ARROW);
  } else {
    Keyboard.release(KEY_RIGHT_ARROW);   
  }

  if (btnA.isPressed()) { 
    Keyboard.press(97);
  } else {
    Keyboard.release(97);
  } 

  if (btnB.isPressed()) { 
    Keyboard.press(98);
  } else {
    Keyboard.release(98);
  } 

  if (btnX.isPressed()) { 
    Keyboard.press(120);
  } else {
    Keyboard.release(120);
  } 

  if (btnCoin.isPressed()) { 
    Keyboard.press(53);
  } else {
    Keyboard.release(53);
  } 

  if (btn1P.isPressed()) { 
    Keyboard.press(49);
  } else {
    Keyboard.release(49);
  } 

  if (btn2P.isPressed()) { 
    Keyboard.press(50);
  } else {
    Keyboard.release(50);
  } 
}












---------------------------------------------------------------------------------------------------------------
VERSION ANTERIOR


#include <Button.h>
#include <Keyboard.h>

const int BOTON_UP = 4;
const int BOTON_DOWN = 5;
const int BOTON_LEFT = 2;
const int BOTON_RIGHT = 3;

const int BOTON_X = 10;
const int BOTON_Y = 8;
const int BOTON_Z = 9;

const int BOTON_A = 11;
const int BOTON_B = 12;

const int BOTON_1P = 7;
const int BOTON_2P = 6;

Button btnUp = Button(BOTON_UP,PULLUP);
Button btnDown = Button(BOTON_DOWN,PULLUP);
Button btnLeft = Button(BOTON_LEFT,PULLUP);
Button btnRight = Button(BOTON_RIGHT,PULLUP);

Button btnX = Button(BOTON_X, PULLUP);
Button btnY = Button(BOTON_Y, PULLUP);
Button btnZ = Button(BOTON_Z, PULLUP);

Button btnA = Button(BOTON_A, PULLUP);
Button btnB = Button(BOTON_B, PULLUP);

Button btn1P = Button(BOTON_1P, PULLUP);
Button btn2P = Button(BOTON_2P, PULLUP);

void setup() {
  Keyboard.begin();
}

void loop() { 
  if (btnUp.isPressed()) {   
    Keyboard.press(KEY_UP_ARROW);
  } else {
    Keyboard.release(KEY_UP_ARROW);     
  }

  if (btnDown.isPressed()) {   
    Keyboard.press(KEY_DOWN_ARROW);
  } else {
    Keyboard.release(KEY_DOWN_ARROW);     
  }

  if (btnLeft.isPressed()) {   
    Keyboard.press(KEY_LEFT_ARROW);
  } else {
    Keyboard.release(KEY_LEFT_ARROW);     
  }

  if (btnRight.isPressed()) {   
    Keyboard.press(KEY_RIGHT_ARROW);
  } else {
    Keyboard.release(KEY_RIGHT_ARROW);     
  }

/*  if (btnEnter.isPressed()) {   
    Keyboard.press(90);
  } else {
    Keyboard.release(90);
  } 
*/
  if (btnX.isPressed()) {   
    Keyboard.press(65);
  } else {
    Keyboard.release(65);
  } 

  if (btnY.isPressed()) {   
    Keyboard.press(66);
  } else {
    Keyboard.release(66);
  } 

  if (btnZ.isPressed()) {   
    Keyboard.press(88);
  } else {
    Keyboard.release(88);
  } 

  if (btnA.isPressed()) {   
    Keyboard.press(53);
  } else {
    Keyboard.release(53);
  } 

/*
  if (btnB.isPressed()) {   
    Keyboard.press(11);
  } else {
    Keyboard.release(11);
  } 
*/
  if (btn1P.isPressed()) {   
    Keyboard.press(49);
  } else {
    Keyboard.release(49);
  } 

  if (btn2P.isPressed()) {   
    Keyboard.press(50);
  } else {
    Keyboard.release(50);
  } 


}

Youtube broadcast live con OBS



1. Ir a https://studio.youtube.com/

2. Click en la camara (con el signo de mas) y Transmitir en Vivo, crear nueva transmisión

3. En Youtube Creator, copiar la clave de transmisión

4. En OBS, ir a Herramientas/Config automatica, next, next, y poner la clave de transmision

5. En OBS, click en iniciar transmision (abajo a la derecha)

6. En Youtube Creator, Iniciar transmision

7. Ir a Archivo / Configuracion / Salida

                Setear el bitrate:

                Hacer test de velocidad del adsl: https://www.speedtest.net/
                Si por ej, dice velocidad de subida 8mbps, poner en Bitrate de video 8000kbps
             
                Para ver tabla de bitrates: https://support.google.com/youtube/answer/1722171?hl=es-419

                Bajar audio bitrate (probar)

   Si se quiere grabar: setear en donde dice Recording



Angular en IE - Habilitar custom headers y cors en WebApi (SEC7123)

Proyecto de ejemplo que tiene este cambio: Creditos


A partir de Angular 8 no es necesario modificar el archivo polyfills.


1. Agregar en WebApiConfig.cs

            var cors = new EnableCorsAttribute("*", "*", "*");
            config.EnableCors(cors);

2. Agregar en web.config (dentro de 

  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <!-- <add name="Access-Control-Allow-Origin" value="*" />  -->
        <add name="Access-Control-Allow-Headers" value="Content-Type" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
      </customHeaders>
    </httpProtocol>
 
  </system.webServer>

DVD stepper motor con L293d shield


1. Alimentar el shield con transformador de 9v 1amp (con una bateria no funciona!!!)
2. Quitar el jumper PWR del shield cuando se alimente con fuente externa.





Codigo:

#include <AFMotor.h>   
   
AF_Stepper motor(200,1  );


void setup() {
  Serial.begin(9600);         
  Serial.println("Stepper test!");

  motor.setSpeed(20);  // 20 rpm 
}

void loop() {
  motor.step(100, FORWARD, MICROSTEP);
  delay(500);
  motor.step(100, BACKWARD, MICROSTEP);
  delay(500);
}

Z Probe CNC

ATENCION!! funciona con la version 2.0 PLATFORM
https://winder.github.io/ugs_website/download/

Link directo de descarga: http://bit.ly/2XANF7B



1. Conectar el pin SCL del CNC Shield a la mecha del dremel.

2. Conectar el pin GND del CNC Shield a la placa PCB

3. En el Universal Gcode Sender, enviar estos comandos:

G38.2 Z-1 F1
G92 Z 0
G00 Z0.0787

G38. Z-1 : Baja hasta encontrar el z probe
G92 Z 0 : Le indica que la posicion a la que llego (cuando hizo contacto con el Z Probe) es el cero
Z.05 : Sube el eje z (esto es para evitar que este en contacto cuando se enciende el motor del dremel)




Fuente: https://www.youtube.com/watch?v=7l1nubetkro



AWS

Guia completa para desarrollar aplicacion web sin servidor
con AWS Lambda, Amazon API Gateway, Amazon S3, Amazon DynamoDB y Amazon Cognito

https://aws.amazon.com/es/getting-started/projects/build-serverless-web-app-lambda-apigateway-s3-dynamodb-cognito/

DynamoDB - Version descargable (para utilizarla sin conectarse!!)

https://docs.aws.amazon.com/es_es/amazondynamodb/latest/developerguide/DynamoDBLocal.DownloadingAndRunning.html

Ejecutarla con:
java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb --port 8082

Para probarlo, con nodejs:
npm init
npm install aws-sdk

EJEMPLO COMPLETO CON NODEJS Y DYNAMO:
https://docs.aws.amazon.com/es_es/amazondynamodb/latest/developerguide/GettingStarted.NodeJs.html
*** A LOS EJEMPLOS CAMBIARLE EL PUERTO A 8082 ***
---------------------------------------------------------------------------------------------------------


Consola AWS
https://us-east-2.console.aws.amazon.com/cognito/home?region=us-east-2

LUEGO DE ENTRAR A LA CONSOLA, PARA VER LO QUE TIENE HAY QUE HACER CLICK EN LAS TRES RAYITAS A LA IZQUIERDA!!

Consola LAMBDA
https://console.aws.amazon.com/lambda/home?region=us-east-1#/functions

Actividad y costos:
https://console.aws.amazon.com/billing/home?#/

Capas disponibles con filtro
https://aws.amazon.com/es/free/?all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc

Calculadora AWS:
https://calculator.aws

https://calculator.s3.amazonaws.com/index.html#key=calc-MarketingWebSite-140324 
Tutoriales

Cómo crear aplicaciones web sin servidor con React y AWS Amplify
https://code.tutsplus.com/es/tutorials/how-to-build-serverless-web-applications-with-react-aws-amplify--cms-31732

Adding AWS Amplify to an Ionic 4 App
https://ionicframework.com/blog/adding-aws-amplify-to-an-ionic-4-app/

Setup amplify
https://aws-amplify.github.io/docs/js/start?platform=ionic

Building Ionic 4 apps with AWS Amplify [<==== este es el mejor!!]
OJO! en este instructivo falta instalar el cli de amplify:
npm install -g @aws-amplify/cli
https://aws-amplify.github.io/docs/js/tutorials/building-ionic-4-apps/

Script para generar archivo sql a partir de datos de padrones urbanos dnc catastro e importarlo en PostgreSql

1. Bajar el archivo csv de padrones urbanos de:

https://catalogodatos.gub.uy/dataset/padrones-urbanos-y-rurales

2. Crear un .NET:


using System;
using System.IO;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            //PadronesUrbanos();


        }

        static void PadronesUrbanos()
        {
            var arch = @"C:\_MAPAS\_PADRONES DNC\datos-abiertos-dnc-2019-06\Padrones Urbanos.CSV";

            var fila = 0;
            var numero_archivo = 0;
            var archOut = @"C:\temp\out\Padrones Urbanos_" + numero_archivo + ".sql";


            var f = new StreamReader(arch);
            var fOut = new StreamWriter(archOut);

            fOut.WriteLine("DROP TABLE padrones_urbanos;");

            fOut.WriteLine("CREATE TABLE padrones_urbanos (" +
                "codigo_regimen VARCHAR(2), " +
                "codigo_departamento VARCHAR(1), " +
                "codigo_localidad VARCHAR(2), " +
                "numero_padron integer, " +
                "block_manzana VARCHAR(20), " +
                "entrepiso_subsuelo VARCHAR(2), " +
                "unidad integer, " +
                "area_predio integer, " +
                "area_edificada integer, " +
                "valor_real_terreno integer, " +
                "valor_real_mejoras integer, " +
                "valor_real_total integer, " +
                "valor_real_para_impuestos integer, " +
                "fecha_ultima_djcu VARCHAR(10), " +
                "vigencia_ultima_djcu VARCHAR(10)" +
                ");");

            fOut.WriteLine();

            while (!f.EndOfStream)
            {
                var linea = f.ReadLine();
                fila++;

                var v = linea.Split(',');

                var v1 = v[0].Replace("\"", "'");
                var v2 = v[1].Replace("\"", "'");
                var v3 = v[2].Replace("\"", "'");
                var v4 = v[3].Replace("\"", "'");
                var v5 = "'" + v[4].Replace("\"", "").Replace("'", "") + "'"; ;
                var v6 = v[5].Replace("\"", "'");
                var v7 = v[6].Replace("\"", "'");
                var v8 = v[7].Replace("\"", "'");
                var v9 = v[8].Replace("\"", "'");
                var v10 = v[9].Replace("\"", "'");
                var v11 = v[10].Replace("\"", "'");
                var v12 = v[11].Replace("\"", "'");
                var v13 = v[12].Replace("\"", "'");
                var v14 = "\'" + v[13] + "\'";
                var v15 = "\'" + v[14] + "\'";

                fOut.WriteLine("INSERT INTO padrones_urbanos (codigo_regimen, codigo_departamento, codigo_localidad, numero_padron, block_manzana, entrepiso_subsuelo, unidad, area_predio, area_edificada, valor_real_terreno, valor_real_mejoras, valor_real_total, valor_real_para_impuestos, fecha_ultima_djcu, vigencia_ultima_djcu) " +
                    "VALUES (" + v1 + ", " + v2 + ", " + v3 + ", " + v4 + ", " + v5 + ", " + v6 + ", " +
                                 v7 + ", " + v8 + ", " + v9 + ", " + v10 + ", " + v11 + ", " + v12 + ", " + v13 + ", " + v14 + ", " + v15 + ");");

                if (fila > 300000)
                {
                    fila = 0;

                    numero_archivo++;
                    fOut.Close();
                    archOut = @"C:\temp\out\Padrones Urbanos_" + numero_archivo + ".sql";

                    fOut = new StreamWriter(archOut);
                }
            }

            fOut.Close();

            Console.WriteLine("fin");
            Console.ReadLine();
        }
    }
}


3. Para importarlo en postgreSql:

C:\Program Files\PostgreSQL\11\bin>psql -h localhost -d catastro -U admin -v ON_ERROR_STOP=1 -f "c:\temp\Padrones Urbanos_0.sql"

(hacerlo para el 1, 2, 3, etc)





Importar SHP en PostgreSQL

1. Instalar extensiones POSTGIS (con el application stack builder de postgis):

2. Ejecutar en la base:

CREATE EXTENSION postgis;

3. Ejecutar:

C:\Program Files\PostgreSQL\11\bin>shp2pgsql -I -s 2263 "C:\_MAPAS\_CCZ\sig_comunales.shp" ccz | psql -U admin -d catastro

Usando el GUI:

C:\Program Files\PostgreSQL\11\bin\postgisgui

ejecutar shp2pgsql-gui.exe


Si da error que falta libintl-9.dll

Hacer una copia de libintl-8.dll y renombrarlo a libintl-9.dll


Si da error de encoding:

Luego al abrir el GUI, click en el boton Options... y poner LATIN1

Importar SQL en posgresql desde linea de comando

C:\Program Files\PostgreSQL\11\bin>psql -h localhost -d catastro -U admin -v ON_ERROR_STOP=1 -f "c:\temp\Padrones Urbanos.sql"

Ver mapa de edificios exportados de OSM en QGIS (OpenStreetMap) y query SQL

Referencia: https://github.com/tudelft3d/3dfier/wiki/Extracting-building-footprints-from-OpenStreetMap

1. Abrir browser en openstreetmap

2. Click en exportar

3. Seleccionar el area a exportar

4. Click en Overpass API (esto permite exportar archivos grandes)

5. El archivo exportado (map) renombrarlo a map.osm

6. Instalar QGIS (o instalar OSGeo4W, en el cual viene incluido)

7. En QGIS: Layer / Add Layer / Add Vector Layer

8. Elegir el archivo map.osm

9. Elegir multipolygons solamente

10. Luego de importar el mapa, en la ventana Layers (a la izquierda) click derecho en map_multipolygons, y en Filter definir:

"building" is not null

(esto permite que se muestren todos los edificios/casas)

Para hacer Query SQL:

Database / DB Manager
Virtual Layers / Project Layers
Database / SQL Window


select * from "map multipolygons"
where building is not null

^^^ ojo que tiene que ir con comillas y tiene un espacio luego de map!!





Cargar mapa en PosgreSql

1. Bajar el dataset de
https://data.humdata.org/dataset/604b5629-756d-4979-8b6f-59d6598ccd61

Por ejemplo:

hotosm_ury_buildings_gpkg.zipzipped geopackage

Geopackage, SQLite compatible

2. Instalar OSGeo4W (esto instala el ogr2ogr.exe, que es lo que permite subir el dataset a PosgreSQL)

3. Instalar PosgreSQL

4. Crear una base de datos (ej prueba2)

5. Crear un usuario y darle permisos sobre la base:
create user carlos with encrypted password 'Carlos1';grant all privileges on database prueba2 to carlos;
6. Instalar extensiones de GIS en PosgreSQL
-Abrir el PostgreSQL stack builder
-Ir a Spatial Extensions
-Marcar PostGIS

7. Crear extensiones postgis para la base de datos prueba2:
Ejecutar este query:
CREATE EXTENSION postgis;

8. Abrir la consola de OSGeo4W (OSGeo4W Shell)
ogr2ogr -f PostgreSQL "PG:dbname=prueba2 host='localhost' port='5432' user='carlos' password=Carlos" C:\_MAPAS\hotosm_ury_buildings_gpkg\hotosm_ury_buildings.gpkg -nlt PROMOTE_TO_MULTI

ATENCION: Si da un problema y pide password:
editar:
C:\Program Files\PostgreSQL\11\data\pg_hba.conf
cambiar todo lo que dice md5 por trust
(despues de ejecutar el script dejarlo con md5 de nuevo)