Bienvenido el 2021
Hola de nuevo a todos, el dia de hoy solo escribo para desearles a todos un buen año 2021, es cierto que el 2020 fue un año complicado, pero si nos sirve de consuelo a todos, el 2021 podrá ser peor (o no). Cómo es costumbre, continua visitando el blog de XWork y disfrutemos del tiempo que tenemos porque en un instante se puede acabar.
Vamos a programar #92 - El triangulo de Pascal (ver. C)
Hola de nuevo a todos, el día de hoy vamos a ver cómo hacer un programa en C que calcule el triangulo de Pascal.
Cómo podrás recordar, hace unos día publiqué una version en Python; y tal cómo lo prometí justo antes de acabar el 2020, les traigo la versión en C. Cómo la explicación de que es el triangulo de Pascal se incluye en ese post (además de cómo hacer los cálculos a mano), simplemente pasaremos al código fuente. Al igual que el código en Python, vamos a calcular el triangulo de Pascal de manera recursiva y si surgen dudas las resolveremos en los próximos post
El código en C que sirve para calcular el triangulo de Pascal es el siguiente ():
// Prueba del triangulo de pascal en C
#include <stdio.h>
#include <stdlib.h>
int *CalculateLevel(int Level)
{
int *Result;
Result = (int *)malloc(Level * sizeof(int));
if (Level == 0)
*Result = 1;
if (Level == 1)
{
*Result = 1;
*(Result + 1) = 1;
}
if (Level > 1)
{
int *ResultP = CalculateLevel(Level - 1);
for (int i = 0; i < Level; i++)
{
if (i == 0 || i == Level - 1)
*(Result + i) = 1;
else
*(Result + i) = *(ResultP + i) + *(ResultP + i - 1);
}
}
return(Result);
}
void DrawPascalTriangle(int Number)
{
if (Number > 20)
{
printf("Solo se admiten 20 niveles");
}
else
{
for (int i = 0; i < (Number + 1); i++)
{
int *Result = CalculateLevel(i);
for (int j = 0; j < i; j++)
{
printf( " %5d ", *(Result + j));
}
printf("\n");
}
}
}
int main()
{
int Levels;
printf("Numero de niveles\n");
scanf("%d", &Levels);
DrawPascalTriangle(Levels);
return 0;
}
Vamos a programar #91 - EL triangulo de Pascal (ver. Python)
Hola de nuevo a todos, el día de hoy vamos a ver cómo hacer el triangulo de pascal usando Python.
Hace unos días mientras leía los comentarios, alguien sugirió que hiciera un programa que calculara el triangulo de pascal y ya que ando un poco corto de ideas, decidí hacerlo. Pero antes de continuar, veamos que es el triangulo de pascal.
En las matemáticas, el triángulo de Pascal es una representación de los coeficientes binomiales ordenados en forma de triángulo. Es llamado así en honor al filósofo y matemático francés Blaise Pascal, quien introdujo esta notación en 1654, en su Traité du triangle arithmétique.1 Si bien las propiedades y aplicaciones del triángulo fueron conocidas con anterioridad al tratado de Pascal por matemáticos indios, chinos, persas, alemanes e italianos, fue Pascal quien desarrolló muchas de sus aplicaciones y el primero en organizar la información de manera conjunta.2
El triángulo de Pascal se puede generalizar a dimensiones mayores. La versión de tres dimensiones se llama pirámide de Pascal o tetraedro de Pascal, mientras que las versiones más generales son llamadas simplex de Pascal.
La composición del triangulo de pascal es realmente simple, en la cima del triangulo, siempre ubicaremos un uno, de hecho en todas las orillas pondremos un uno de modo que en cada nivel haya tantos número cómo el nivel en el que estamos. Para el nivel dos, ya que solo hay extremos en ambos se pondrá un uno.
Para calcular los números del tercer nivel, imaginemos que tenemos tres lugares, los extremos deben de llevar el número uno, por lo que solo nos hace falta determinar el que esta en el lugar dos. Para hacerlo de manera "sencilla" debemos de revisar el nivel anterior y debemos de sumar el numero que esta en la misma posición que el numero que queremos saber (DEL NIVEL ANTERIOR), y sumarlo con el que inmediatamente antes. Para darnos una idea, miremos la siguiente imagen.
Si revisamos bien, nos ubicamos en el nivel tres, pero el numero que queremos saber es el que esta en el segundo lugar del tercer nivel (marcado con una X), entonces tenemos que tomar el numero del nivel anterior que esta en las misma posición que nuestro numero, en la imagen podemos apreciar que el número que esta en la segunda posición del nivel dos es uno y el numero que esta antes en el nivel dos, también es uno, por lo que tendríamos que el segundo numero del tercer nivel es igual a uno mas uno, por lo tanto su valor es dos.
Ahora a manera de ejemplo calculemos el valor de los números en el nivel 4, para eso imaginemos que tenemos algo cómo la imagen que sigue.
Para calcular el numero Y, simplemente hacemos lo mismo. Tomamos el tercer y segundo número del nivel tres y simplemente lo sumamos obteniendo otro tres.
Así podemos calcular cualquier nivel.
Entonces en python podemos crear código cómo el que sigue:
# Prueba del triangulo de pascal en python
def CalculateLevel(Level):
Result = {}
if Level == 1:
Result[0] = 1
if Level == 2:
Result[0] = 1
Result[1] = 1
if Level > 2:
ResultP = CalculateLevel(Level - 1)
for i in range(Level):
if (i == 0) or (i == Level - 1):
Result[i] = 1
else:
Result[i] = ResultP[i - 1] + ResultP[i]
return Result
def DrawPascalTriangle(Number):
if Number > 20:
print("Solo se admiten 20 Niveles")
else:
for i in range(Number + 1):
Result = CalculateLevel(i)
for j in range(len(Result)):
print(Result[j], end = ' ')
print()
if __name__ == "__main__":
import sys
DrawPascalTriangle(int(sys.argv[1]));
pascaltri.py 20
Vamos a programar #90 - La sucesión de Fibonacci y la función de Ackerman (ver. Python)
Hola de nuevo a toos, el dia de hoy vamos a ver un poco de Python. En días anteriores, mientras revisaba algunos comentarios en twitter, aalgunas personas me preguntaron sobre el estado del blog, pese al que el estado actual ha empeorado un poco debido a cierto bicho, el hecho fue que un par de "accidentes" me impidieron crear nuevos post. Pero dejando eso de lado, mucha gente pidio que si les podia ayudar con python (si hacemos memoria, casi no hay programas hechos en éste lenguaje), y la razon principal es debido a que simplemente lo olvide (conste que ya lo habia mencionado en algun post). Para probar que aun estoy al pendiente, decidi hacer un par de programas con (segun google) las busquedas mas gfrecuentes relacionadas a python que conducian a mi blog.
Los números de Fibonacci.
def CalcFibonacci(Number):
v1 = 0
v2 = 1
v3 = 0
while v1 < Number:
print(v1)
v3 = v1 + v2
v1 = v2
v2 = v3
if __name__ == "__main__":
import sys
CalcFibonacci(int(sys.argv[1]))Fibonacci.py 200
La funcion de Ackerman.
def AckermanFunction(Number1, Number2):
if Number1 == 0:
return Number2 + 1
else:
if Number2 == 0:
return (AckermanFunction(Number1 - 1, 1))
return (AckermanFunction(Number1 - 1, AckermanFunction(Number1, Number2 - 1)))
if __name__ == "__main__":
import sys
try:
for i in range(4):
for j in range(5):
print(AckermanFunction(i, j),end=' ')
print()
except RecursionError:
print("Error: Se alcanzo el maximo de recursion permitido")Back to basics #10 - Control de LED's (con transistores) - Camino a Spedometer v. Final
Hola de nuevo a todos, el día de hoy vamos a ver cómo instalar una mejora a las luces del velocímetro y además, veremos cómo es que los transistores nos pueden ayudar a manejar algunas cosas que no podríamos directamente desde el arduino.
Si hacemos memoria la primera vez que construimos el velocímetro, usábamos un par de diodos LED para hacernos visibles a la hora de manejar en la noche, pero los diodos que se usan al ser de 20mA @ 3.1v solo funcionaban en lugares pequeños (llámese calle promedio), pero cuando se trata de recorridos por caminos más amplio, la idea es ser visible desde la mayor distancia posible, por lo que se hace necesario usar un fuente luminosa mas intensa.
Cuando controlamos los diodos LED directamente desde el arduino, disponemos de una cantidad limitada de potencia. Normalmente el arduino UNO es capaz de suministrar un voltaje de 5v en los pines, pero tienen un limite de corriente de solo 40mA, si conectamos algo que requiera más corriente las cosas pueden ponerse feas.
Por los lugares que suelo andar en bicicleta, los diodos antes mencionados cumplen con su trabajo, pero me llegaron algunas peticiones a mi twitter preguntando por la posibilidad de agregar algo mas fuerte. La mayoría quería agregar los módulos que consisten de tres (o seis) diodos LED 5050.
Si conectamos uno de estos módulos al arduino, simplemente nada pasará, ya que requieren un voltaje de 12V (si hago bien memoria cuando es un solo led 5050 de color blanco consume 60mA a 3.2v), para poder agregar uno de estos módulos, primero que nada, necesitaremos agregar un elevador de voltaje y para controlarlas el transistor.
Para este caso voy a usar un transistor TIP31c (que era lo que tenía a la mano) pero el siguiente diagrama aplica a cualquier transistor NPN. Pero primero que nada ¿Que es un transistor?.
El transistor es un dispositivo electrónico semiconductor utilizado para entregar una señal de salida en respuesta a una señal de entrada. Cumple funciones de amplificador, oscilador, conmutador o rectificador. El término «transistor» es la contracción en inglés de transfer resistor («resistor de transferencia»). Actualmente se encuentra prácticamente en todos los aparatos electrónicos de uso diario tales como radios, televisores, reproductores de audio y video, relojes de cuarzo, computadoras, lámparas fluorescentes, tomógrafos, teléfonos celulares, aunque casi siempre dentro de los llamados circuitos integrados.
Tal y cómo lo dice la definición, necesitamos una señal de entrada para obtener una señal de salida, por lo que en este ejemplo el transistor lo usaremos cómo un apagador (se puede usar para más muchas más aplicaciones pero por ahora solo esto). Antes de continuar, quiero resaltar que usaremos un transistor NPN, existen de más tipos (que eventualmente veremos) pero por ahora y cómo el objetivo no es aprender a usarlos, bastará con usar un transitor del mismo tipo y con las caracteristicas que veremos un poco más adelante.
Para el transistor TIP31c los pines son de la siguiente manera:
- Base
- Colector
- Emisor
.Para hacer las conexiones solo deberás de identificar cual corresponde a cada pin del transistor que elijas y todo debería de funcionar.
Y el diagrama correspondiente sería:
SI todo salió bien las luces deberían de encender cuando el PIN de arduino este en "HIGH".
Cabe aclarar que lo mas recomendable para está situación, sería usar una fuente de energía adicional, puesto que el velocímetro es alimentado por una pila, agregar dos elevadores de voltaje podría reducir la durabilidad de esta de forma drástica. En cambio si agregamos otra pila aparte si se agota el velocímetro podría seguir operando con normalidad.
Aunque la idea me agrado, está no es la solución que agregué a mi bicicleta, la solución que yo le puse la veremos en el siguiente post. Por cierto, se que al inicio del año prometí post cada quincena, pero por razones que son difíciles de entender (aun para mi) los post saldrán pero no de forma periódica.
Los leo luego.
Vamos a programar #89 - Midiendo voltajes con arduino - Camino a Spedometer v. Final
Hola de nuevo a todos, el día de hoy vamos a ver cómo medir voltajes usando arduino. Todo esto para agregarlo a "Spedometer M" (y de una vez por todas decir que está terminado). Uno de los principales puntos a tratar, es la presentación de la batería, haciendo memoria en el código habían 5 situaciones diferente para mostrar el estado de la batería, pero algo importante que olvide mencionar, es que eran meramente ilustrativas. Uno podría pensar que al haber 5 "iconos" diferentes, cada uno representaría al 20%, pero en este caso no es así.Para medir el voltaje, lo que hacemos es ingresarlo por un pin del arduino, internamente, este posee un mecanismo que traslada el voltaje un valor digital. Cuando conectamos 0v a un pin analogo del arduino y hacemos la lectura con "analogread()" está devolverá un valor de 0. EN cambio si conectamos 5v esta devolverá un valor de 1023. ¿Por que ocurre esto? Simple arduino cuenta con convertidor análogo-digital con una resolución de 8 bits por lo que cada valor entre 0 y 1023 sera igual a un valor de 0v a 5v. Para saber que valor le corresponde a cada voltaje, bastará con mirar la siguiente formula:
donde "n" es el valor de la lectura que "analogread()" regresa . Para entender un poco lo que pasa, supongamos que toamos la lectura usando arduino y este nos regreso un valor de 155.
al sustituirlo tenemos:
Y si lo medimos usando un multimetro tenemos:
Que es bastante acertado. Pero ahora lo que nos interesa hacer es ganar mas definición. Cuando arduino "mide" un voltaje en realidad lo que hace es compararlo con otro, por default este es de 5v, pero se puede elegir otro.
Para indicar que queremos usar un voltaje externo de referencia, podemos usar la función "analogReference()" que recibe un parámetro que puede ser cualquiera de los siguientes:
- DEFAULT (el valor de la alimentación, si se usan 5v, esta sera la referencia, si se usan 3.3v esta lo será).
- INTERNAL (Usa un voltaje interno de 1.1v pero solo en el modelo uno, en otros modelos es de 2.56v y elgunos no esta disponible).
- EXTERNAL (Usa el PIN AREF y se puede usar un valor mayor a cero y menor o igual a 5v)
Existen otros parámetros, pero por ahora nos centraremos en estos.
Primero usaremos el parámetro "INTERNAL" y para que pruebes, puedes usar el siguiente código:
int ValIn = 0;
int CurVal = 0;
float CurVolt =0;
void setup()
{
analogReference(INTERNAL);
Serial.begin(9600);
}
void loop()
{
CurVal=analogRead(ValIn);
Serial.println(CurVal);
CurVolt=CurVal*1.1;
Serial.print("Valor");
Serial.print(CurVal);
Serial.print("mV:");
Serial.println(CurVolt);
Serial.println("Done");
delay(2000);
}
Que es un valor mas cercano al que nos dio el multímetro.
Y sabiendo lo anterior ahora podemos hacer que la referencia sea la indicada para el nivel de la batería. Primero modificaremos un poco el código para hacer uso de la referencia externa, para eso prueba copiar el siguiente código:
int ValIn = 0;
int CurVal = 0;
float CurVolt =0;
void setup()
{
analogReference(EXTERNAL);
Serial.begin(9600);
}
void loop()
{
CurVal=analogRead(ValIn);
Serial.println(CurVal);
CurVolt=CurVal*1.1;
Serial.print("Valor");
Serial.print(CurVal);
Serial.print("mV:");
Serial.println(CurVolt);
Serial.println("Done");
delay(2000);
}
Algo que es importante aclarar para finalizar el post, es que para mostrar el porcentaje de batería no podemos simplemente usar la formula del porcentaje ya que todas las pilas son diferentes y a pesar de que la capacidad de una pila se puede medir de acuerdo al voltaje que esta nos da, depende meramente del fabricante cómo es "la curva de descarga" (que veremos en otro post) cómo dije al inicio, en el caso del velocímetro, los iconos son meramente ilustrativos de "la pila recien se cargo", "Está medio vacía" y "ya hace falta una recarga".
Y bien, por ahora es todo, lo ejemplos de código cómo son sencillos puedes simplemente copiarlos y pegarlos para probarlos y hago énfasis en que al pin "AREF" del arduino SIEMPRE se le debe aplicar un voltaje mayor a cero y menor o igual a 5.
Los leo luego.
Vamos a programar #88 - KeyRemap M (beta)
Hola de nuevo a todos, el día de hoy vamos a ver cómo es que funciona un programa al que decidí llamar "KeyRemap M" (en su versión beta).Vamos a programar #87 - Camino a KeyRemap, MessageTextBox .
Hola de nuevo a todos, el día de hoy vamos a empezar un programa que nos sirva para re- configurar las teclas de nuestro teclado.- KeyDown
- KeyPress
- KeyUp
private void MsCboKeyOut_KeyDown(object sender, KeyEventArgs e)
{
MessageBox.Show(e.KeyCode.ToString());
e.SuppressKeyPress = true;
}Si accedemos al procedimiento "KeyCode" y presionamos la tecla de silencio (mute), esta nos devolverá un valor de 173. Si hacemos memoria, en el post anterior vimos que el código de esa tecla era E020 hexadecimal o 57376 decimal que dista mucho de lo que nos entrego. Incluso haciendo pruebas con varias teclas, el valor maximo que obtuve fue 255 decimal (FF hexadecimal) por lo que si queremos usar este procedimiento para saber el código de las teclas "no normales" simplemente no nos sera posible.
using System;
using System.Windows.Forms;
namespace KeyRemap
{
class MessageTextBox : TextBox
{
public const int WM_KEYDOWN = 0x0100;
private uint TheValue = 0;
public string GetHexValue
{
get
{
return Convert.ToString(TheValue, toBase: 16);
}
}
public uint ShowKeyCode(uint TheNumber)
{
uint KeyValue = TheNumber;
uint KeyCode = ((KeyValue >> 16) % 256);
uint IsExtendedKey = ((KeyValue >> 24) % 2);
if (IsExtendedKey == 1)
{
KeyCode = FrmMain.EXTENDED_KEY_VALUE | KeyCode;
return KeyCode;
}
else
return KeyCode;
}
[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_KEYDOWN:
base.Text = "";
base.Text = Convert.ToString(ShowKeyCode((uint)m.LParam));
TheValue = (uint)m.LParam;
break;
}
base.WndProc(ref m);
}
}
}
Vamos a programar #86 - Reasignando teclas del teclado.
Hola de nuevo a todos, el día de hoy vamos a ver cómo reasignar algunas botones de nuestro teclado para que hagan otra cosa.|
US key assignment |
Base Make |
|---|---|
| Insert |
E0 52 |
| Delete |
E0 53 |
|
Left Arrow |
E0 4B |
| Home |
E0 47 |
| End |
E0 4F |
|
Up Arrow |
E0 48 |
|
Dn Arrow |
E0 50 |
|
Page Up |
E0 49 |
|
Page Down |
E0 51 |
|
Right Arrow |
E0 4D |
| CODE | ALIAS |
|---|---|
| E0 6A | VK_BROWSER_BACK |
| E0 69 | VK_BROWSER_FORWARD |
| E0 67 | VK_BROWSER_REFRESH |
| E0 68 | VK_BROWSER_STOP |
| E0 65 | VK_BROWSER_SEARCH |
| E0 66 | VK_BROWSER_FAVORITES |
| E0 32 | VK_BROWSER_HOME |
| E0 20 | VK_VOLUME_MUTE |
| E0 2E | VK_VOLUME_DOWN |
| E0 30 | VK_VOLUME_UP |
| E0 19 | VK_MEDIA_NEXT_TRACK |
| E0 10 | VK_MEDIA_PREV_TRACK |
| E0 24 | VK_MEDIA_STOP |
| E0 22 | VK_MEDIA_PLAY_PAUSE |
| E0 6C | VK_LAUNCH_MAIL |
| E0 6D | VK_LAUNCH_MEDIA_SELECT |
| E0 6B | VK_LAUNCH_APP1 |
| E0 21 | VK_LAUNCH_APP2 |
El código de la tecla que queremos usar es "E0 20" y el código de la tecla "Page UP" es "E0 49" pero ¿y después? Cómo ya mencione antes, Windows es el encargado de gestionar las pulsaciones y guarda esta configuración en el registro. Para acceder a ella, necesitamos encontrar la siguiente clave:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
- 00,00,00,00 > encabezado
- 00,00,00,00 > flags
- 02,00,00,00 > número de entradas más uno
- xx,xx,xx,xx > el código de las teclas a reasignar empezando por el código que queremos que se aplique seguido por el código de la tecla
- 00,00,00,00 > terminación.
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout] "Scancode Map"=hex:00,00,00,00,00,00,00,00,02,00,00,00,20,E0,49,E0,00,00,00,00
- 00,00,00,00 > encabezado
- 00,00,00,00 > flags
- 03,00,00,00 > número de entradas más uno
- 20,e0,49,e0 > el código del primer juego de teclas
- 30,e0,47,00 > el código del segundo juego de teclas
- 00,00,00,00 > terminación.
Cumplimos 4 Años!!!!!!
Hola de nuevo a todos, el día de hoy solo escribo para recordar que un día cómo hoy pero de hace cuatro años, surgió el blog de Xwork.Learning machine #15 - Operaciones a nivel del bits.
Hola de nuevo a todos, el día de hoy vamos a ver cómo es que se realizan las operaciones a nivel de bit usando cómo referencia a los operadores de C#. Hay que tener en cuenta que dependiendo de la plataforma y del lenguaje que se use, las operaciones pueden variar un poco, pero el concepto sigue siendo el mismo.Operadores de desplazamiento (<< y >>)
Operador Not (~).
Operador AND (&).
Operador Or (|).
Back to basics #10 - Reguladores de voltaje
Hola de nuevo a todos, el día de hoy vamos a ver el uso del regulador de voltaje.![]() |
| Este tipo de eliminador es bastante barato. |
![]() |
| Las cosas se pueden poner "calientes" si la disipacion adecuda |










































No hay comentarios. :
Publicar un comentario