4/27/2007

Placa de prototipos


Si no me equivoco, pinchando en grande se ve mejor. Aun no me aclaro demasiado con Blogger...

Pero bueno, a lo importante. Esta es, más o menos, la placa que comentaba. Una sencilla placa de prototipos, para no tener que andar montando en la board las mismas chorradas una y otra vez. Simplemente he de acomodar mis diseños a la distribución de pines que he usado, pero vaya, la he hecho como suelo hacerlas, de modo que...

Antes de detallarla, comentar por qué no es la placa como es en realidad: primero porque no están todos los componentes en el proteus -sin ir más lejos, el 4550 no está...-, pero principalmente porque como la he hecho a mano -Si, como antaño, rotulador permanente resistente a ácido, paciencia, mucha paciencia, más paciencia, y luego a esnifar gases tóxicos mientras la mezcla de salfuman y agua oxigenada se come todas las zonas no pintadas de la placa virgen. No me quedan muchas, así que supongo que en breve pasaré a experimentar con las placas fotosensibles y el insolado, que en teoría ya me queda poco tiempo de estudiante y podré contar con más presupuesto, pero... hasta que no las termine, seguimos con el método tradicional.

Bien, here we go, que dicen los guiris, y mientras en el winamp suena "Returns of a King" de la banda sonora de 300, paso a detallar todo lo que tiene la plaquita, y como lo tiene...

Hardware básico:
*Oscilador
Un cristal oscilador de cuarzo de 20MHz, con dos condensadores de 22pF.
*Tensiones de alimentación
He dejado en la placa el típico plano de masa, y una linea gorda de 5V. pero como para el transductor del rs232 necesitaba tres con tres... pues he puesto también una toma, mediante un cutre divisor de tensión. Espero que no me de por saco... quizá deba revisar esto en un futuro...
*Reset
Pulsador, y resistencia a pull-up. Cutre, pero eficaz. Y ya que estaba, he colocado un led verde para saber si la placa tiene tensión.

Puertos digitales:
*Entradas
He optado por colocar todas las entradas digitales en el puerto B. Si los chicos de microchip dotan a los pics de resistencias de pull-up en este puerto, ¿por qué despreciar el gesto? Y como no le he metido teclado ni nada, pues estaba libre. De la linea 0 a la 3, pulsadores, principalmente por si utilizo interrupciones externas. De la linea 4 a la 7, un dip switch de 4 vías.
*Salidas
Como el puerto D no tiene ninguna función secundaria que me interese... -Ni spi, ni modo pwm mejorado para el eccp- pues 8 leds al canto. Si alguien llega a leer los valores de las resistencias limitadoras, se habrá esforzado para nada: no los he tocado en el dibujo. En la placa las he colocado de 330 ohmios, total, con que se vea me sobra, y así me duran más. Pensaba ponerlas de 180, pero para lo que se va a notar en luminosidad, me quedo con mayor vida :D

Otras entradas y salidas:
*Entradas analógicas
En An0 y An1, dos potenciometros. Así puedo simular sensores de respuesta en voltaje, o sencillamente probar el conversor. Iba a poner también en las lineas de referencia, pero como casi nunca las utilizo... pues he desistido.
*CCP y ECCP
He dejado los pines del CCP y ECCP preparados y soldados a una clema, junto a una toma de masa. Principalmente utilizo estos módulos para el pwm, de cara a controlar motores, de modo que es la solución más cómoda sin meter el motor fijo en la propia placa.

Comunicaciones:
*Puerto serie
He colocado un max232, uno de esos más nuevos con dos vías -desaprovecho una, lo sé, pero no tenia de una sola vía...- y le he puesto el conector en la misma placa. Se acabó el hacer el tonto con la cutrez del conector colgando y los hilos por ahí sueltos. No lo tenia muy claro, pero al final he optado por cortocircuitar las lineas de control de flujo. Para lo que es, tampoco las necesito, y me evito problemas.
*USB
He colocado las conexiones, e incluso un conector con el cable suficiente para no necesitar un alargador. Eso sí: del lado del pic he puesto un dip switch de cuatro vías, como el del puerto B, para poder cortar el usb. Quiera hacer un todo-nada, pero como lo que tenia por casa era el dip switch.. pues toca cortar las lineas una por una. De todos modos tampoco es tanto problema, ni algo que vaya a usar a menudo.




Bien, esto es todo, creo. Se admiten sugerencias, de cara a otras placas cuando esta casque :D cosa que espero suceda dentro de mucho tiempo...

4/25/2007

Stand-by

Tengo algunas entradas preparadas, pero es realmente triste comprobar como la falta de tiempo hace materialmente imposible el darles la preparación adecuada. Aun así, espero ir poniendo en breve alguna cosilla, como el programa para el micro del ThoronClock, y algunas gilipolleces -como una placa de prototipos para los 18F4550 que estoy haciendome-. Lo dicho, en cuanto me sea posible, iré poniendolo. Probablemente nadie pase por aquí, pero por si acaso yo lo digo. :)

1/18/2007

Fuente de alimentación.

Tercer intento para escribir esta entrada. No termina de gustarme este sistema, pero bueno. A lo que iba.


En casa no dispongo de fuente de alimentación, pero había visto por algunas webs (Esta y esta, por ejemplo) como convertir una fuente de pc ATX en fuente de pruebas. Solución fantastica, especialmente si tienes alguna fuente muerta de asco, como era mi caso. Principal diferencia: la que yo tenia era AT, de un viejo 486, aunque salvo por el tema de encendido por soft, creo que todo lo demás es casi idéntico.


Como se explica en esos articulos, adaptar la fuente es muy sencillo: una vez abierta (Y descargados los condensadores antes, por si acaso. Que viendo el tamaño... puede salir una buena mascletá :) ) se coloca en uno de los cables de +5 Voltios (Rojos) una resitencia de carga. En mi caso, una de 10 ohms y 10 watts. Teniendo en cuenta que la va a recorrer medio amperio... mejor que sea así (10 Watts) que arriesgar con una de 5. En esos articulos se comenta el tema de colocarla pegada a la carcasa, para que refrigere. Personalmente, veo más lógico -y así lo hice- adosarla a los radiadores de los semiconductores de potencia. La gente rara vez se pilla las manos ajustando tanto algo que es importante, asi que supuse que algunos watts más no se notarian. Y de momento al menos así es. Una vez hecho esto, ya puede arrancar, ya que las smps (o fuentes conmutadas) no pueden funcionar sin carga. De normal, en el pc, es el disco duro quien hace de carga, pero para el caso sirve la resitencia. También le puse un led, principalmente porque en su dia costó una pasta, por ser medianamente buena, y una de las virtudes que tiene es que el ventilador ni se oye. Así que... mejor un simple led, y así no hay dudas sobre si está encendida.


una vez hecho eso, pueden sellarse los cables que sobran. Yo me quedé con un par de cables de masa (negros), de cara a poder tener caminos de retorno a masa diferentes para hipotéticos circuitos híbridos, pero sobretodo por si llego a conectar demasiadas cosas, tener margen para la corriente. Luego un par más de 5 voltios (rojos), que son los más utilizados en mi caso -no en vano la mayoria de lo que hago son temas digitales- , y luego uno de +12 (Amarillo), uno de -12 (Azul) y uno de -5 (blanco). No cogi el de 3'3 porque aunque no viene mal (sobretodo para los PICs LF) tengo reguladores externos de microchip y linear, y como total la potencia maxima está compartida entre las lineas de 5 y 3'3 (no así con la de 12, va al margen). hecho esto tenia +12, +5, 0, -5 y -12. No cortocircuitables, vaya, pero con tener un poco de cuidado... aun así quiero buscar algún circuito de protección. Ya veremos. El caso es que las fuentes de la universidad tienen algo muy util: una linea variable entre 0 y 30 Voltios, con 2 amperios de salida máxima. Yo no aspiraba a tanto, pero... teniendo +-12, con un simple divisor de tensión y un seguidor con op amps, ya tenia mi fuente variable, de modo que...



Como se puede apreciar, la resitencia r2 es de 2k, r1 de 180 omhs, y el potenciometro de 22k. De modo que en los extremos :

Potenciometro a 0 --> Por Millmann: [(12*180)+(-12*2000)]/2180= -10V (Aprox)

Potenciometro a 2k --> Nuevamente: [(12*22180)+(-12*2000)]/24180= 10V (Aprox)

En ambos casos da unas centésimas más, pero... tampoco necesito tanta precisión, además de que la salida no es nunca de +-12 Voltios. Esto es así porque de normal la placa base demanda unos 20 amperios, y ese consumo en la linea de 5 voltios hace subir el voltaje en la de 12. En este uso, al no haber tanta demanda, la linea de 12 voltios está realmente a unos 11'3. Otro detalle a comentar: para que la salida del seguidor tenga más potencia, y dado que uso unos TL084CN de Texas, de esos cuádruples, tengo cortocircuitadas las salidas de los 4, con la misma entrada. De este modo, pueden aportar cuatro veces la Io máxima de un sólo opamp.

En cuanto al consumo del divisor, está pensado para que apenas se note: 11mA máximo, menos de un mA de corriente mínima. A todo esto solo me que añadirle un micro para monitorizar el voltaje variable, y controlar un par de displays de 7 segmentos. Pero eso... otro dia.

También, de cara a estar lo mejor equipado posible, dentro de mi pobre enconomia estudiantil, tengo en mente ponerme con uno de estos dos osciloscopios basados en PICs para la adquisición de datos y procesado en el pc. Están el basado en PIC12F675, comunicado por RS232, y con 20 kilosamples por segundo máximo, si no me equivoco, y el basado en PIC18F2550, comunicado por usb, que llega hasta los 60 ksps. Además, combinando este con un MAX114 parece que se puede llegar a 1Megasample por segundo. Personalmente, para lo que hago en casa, más que suficiente. Así que... probablemente cuando pasen examenes, me ponga a ello...

1/07/2007

Números en ruso

Bueno, esto no es de ahora, pero... por si a alguien le sirve de algo lo posteo. Este año pasado hice primero de ruso en la escuela oficial de idiomas, y llevaba idea de hacer un programilla en builder para cojugar verbos. Al final, como no he seguido, lo he dejado de lado, pero aun conservo el que hice para saber como se esribian los números del 1 al 100. Escribiendo eso, el número, el programa devolvia en una label, y en un textbox, el número escrito correctamente.Realmente es muy sencillo, ya que la raiz es la misma para cada decena - salvo excepciones - y las terminaciones tambien. De modo que basicamente si era un número del 1 al 20 los tenia tal cual, pues eran "singulares", y si era posterior descomponia el numero en decenas y unidades, convertia cada cosa por su lado, y finalmente mostraba el resultado.

Podeis descargar el instalador de http://personales.upv.es/jetomad/setup.exe

La fuente necesaria para ver todos los caracteres en cirilico (Si no os saldrian cosas raras) es la "Bulgarian Courier". Si no recuerdo mal, iba incluida en el instalador.

Del mismo modo, creo que algun numero concreto fallaba al mostrarlo. En fin, como se puede comprobar era para "uso personal" xD.

El código fuente, por si a alguien le interesa...

//---------------------------------------------------------------------------

#include
#pragma hdrstop
#define A 192
#include "numeros.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Label2->Font->Name = "Bulgarian Courier";
Label2->Font->Size = 36;
Label2->Font->Color = clRed;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
int numero, espacio=-1;
char letras[40];

numero = Edit1->Text.ToInt();

// Zona decenas...

if (numero == 100) {
letras[0]=209;
letras[1]=210+32;
letras[2]=206+32;
}
if ((numero/10)==9) {
letras[0]=196;
letras[1]=197+32;
letras[2]=194+32;
letras[3]=223+32;
letras[4]=205+32;
letras[5]=206+32;
letras[6]=209+32;
letras[7]=210+32;
letras[8]=206+32;
espacio=9;
}
if ((numero/10)==8) {
letras[0]=194;
letras[1]=206+32;
letras[2]=209+32;
letras[3]=197+32;
letras[4]=204+32;
letras[5]=220+32;
letras[6]=196+32;
letras[7]=197+32;
letras[8]=209+32;
letras[9]=223+32;
letras[10]=210+32;
espacio=11;
}

if ((numero/10)==7) {
letras[0]=209;
letras[1]=197+32;
letras[2]=204+32;
letras[3]=220+32;
letras[4]=196+32;
letras[5]=197+32;
letras[6]=209+32;
letras[7]=223+32;
letras[8]=210+32;
espacio=9;
}

if ((numero/10)==6) {
letras[0]=216;
letras[1]=197+32;
letras[2]=209+32;
letras[3]=220+32;
letras[4]=196+32;
letras[5]=197+32;
letras[6]=209+32;
letras[7]=223+32;
letras[8]=210+32;
espacio=9;
}

if ((numero/10)==5) {
letras[0]=207;
letras[1]=223+32;
letras[2]=210+32;
letras[3]=220+32;
letras[4]=196+32;
letras[5]=197+32;
letras[6]=209+32;
letras[7]=223+32;
letras[8]=210+32;
espacio=9;
}

if ((numero/10)==4) {
letras[0]=209;
letras[1]=206+32;
letras[2]=208+32;
letras[3]=206+32;
letras[4]=202+32;
espacio=5;
}

if ((numero/10)==3) {
letras[0]=210;
letras[1]=208+32;
letras[2]=200+32;
letras[3]=196+32;
letras[4]=214+32;
letras[5]=192+32;
letras[6]=210+32;
letras[7]=220+32;
espacio=8;
}

if (numero/10==2) {
letras[0]=196;
letras[1]=194+32;
letras[2]=192+32;
letras[3]=196+32;
letras[4]=214+32;
letras[5]=192+32;
letras[6]=210+32;
letras[7]=220+32;
espacio=8;
}

//zona del 1 al 19. Si hay espacio, pongo simbolo...
if (espacio!=-1) letras[espacio]=32;
//seguimos del 1 al 19...

if ((numero==1) || (numero%10==1)){
letras[espacio+1]=206;
letras[espacio+2]=196+32;
letras[espacio+3]=200+32;
letras[espacio+4]=205+32;
if (numero>10) espacio=espacio+4;
else espacio=3;
}

if ((numero==2) || (numero%10==2)){
letras[espacio+1]=196;
letras[espacio+2]=194+32;
letras[espacio+3]=192+32;
if (numero>10) espacio=espacio+3;
else espacio=2;
}

if ((numero==3) || (numero%10==3)){
letras[espacio+1]=210;
letras[espacio+2]=208+32;
letras[espacio+3]=200+32;
if (numero>10) espacio=espacio+3;
else espacio=2;
}

if ((numero==4) || (numero%10==4)){
letras[espacio+1]=215;
letras[espacio+2]=197+32;
letras[espacio+3]=210+32;
letras[espacio+4]=219+32;
letras[espacio+5]=208+32;
letras[espacio+6]=197+32;
if (numero>10) espacio=espacio+6;
else espacio=5;
}

if ((numero==5) || (numero%10==5)){
letras[espacio+1]=207;
letras[espacio+2]=223+32;
letras[espacio+3]=210+32;
letras[espacio+4]=220+32;
if (numero>10) espacio=espacio+4;
else espacio=3;
if (numero==15) espacio--;
}

if ((numero==6) || (numero%10==6)){
letras[espacio+1]=216;
letras[espacio+2]=197+32;
letras[espacio+3]=209+32;
letras[espacio+4]=220+32;
letras[espacio+5]=220+32;
if (numero>10) espacio=espacio+5;
else espacio=4;
}

if ((numero==7) || (numero%10==7)){
letras[espacio+1]=209;
letras[espacio+2]=197+32;
letras[espacio+3]=204+32;
letras[espacio+4]=220+32;
if (numero>10) espacio=espacio+4;
else espacio=3;
}

if ((numero==8) || (numero%10==8)){
letras[espacio+1]=194;
letras[espacio+2]=206+32;
letras[espacio+3]=209+32;
letras[espacio+4]=197+32;
letras[espacio+5]=204+32;
letras[espacio+6]=220+32;
if (numero>10) espacio=espacio+6;
else espacio=5;
}

if ((numero==9) || (numero%10==9)){
letras[espacio+1]=196;
letras[espacio+2]=197+32;
letras[espacio+3]=194+32;
letras[espacio+4]=223+32;
letras[espacio+5]=210+32;
letras[espacio+6]=220+32;
if (numero>10) espacio=espacio+6;
else espacio=5;
}

if (numero==10){
letras[espacio+1]=196;
letras[espacio+2]=197+32;
letras[espacio+3]=209+32;
letras[espacio+4]=223+32;
letras[espacio+5]=210+32;
letras[espacio+6]=220+32;
letras[espacio+7]=0;
}

if ((numero<20) && (numero>10)){
letras[espacio+1]=205+32;
letras[espacio+2]=192+32;
letras[espacio+3]=196+32;
letras[espacio+4]=214+32;
letras[espacio+5]=192+32;
letras[espacio+6]=210+32;
letras[espacio+7]=220+32;
espacio=espacio+7;
}
letras[espacio+1]=0;
if ((numero<1) || (numero>100)) {Label4->Caption = "Numero no valido";
Label2->Caption = "";}
else {Label2->Caption = letras;
Label4->Caption = "";}


}
//---------------------------------------------------------------------------

12/16/2006

ThoronClock (III)

Primera Beta del ThoronClock, descargable aquí . Como comenté, todo va a ser público, de modo que dejo también el código fuente. Libre distribución, aunque se agradeceria que se mencionase la fuente. Ah, hablando de fuentes: el código no esta comentado. Esta hecho en 4 ratos, de modo que ni me paré a comentar que hace cada cosa. Pero siendo un programa tan sencillo, no creo que exista problema alguno, ademas, las variables tienen nombres muy descriptivos, y esta hecho del tiron, sin subrutinas ni nada por el estilo. Ha dado un poco por saco, pero sólo por mi desconocimiento del Basic. Ah, con lo facil que hubiese salido en Builder...

Falta implementar la comunicación serie RS232 para poder "hablar" con el ThoronClock físico cuando este esté listo, pero como aun falta, pues he pasado. Realmente, sólo es añadir un objeto MSComm, y gestionar el evento OnComm para recibir, y como quieres enviar. Cuando lo haga (Version 2.0, imagino :D ya lo subo...)

Se agradecerian los comentarios, en especial de un asunto: ¿Se puede ejecutar en pcs donde no este instalado el Visual Basic? En Builder habia que tocar las opciones para ello, pero aquí no lo he encontrado, al menos de momento. Lo dicho, comentarios, sugerencias, correcciones... todo bienvenido.

Nos vemos!

12/15/2006

ThoronClock (II)

Bien, la versión PC del ThoronClock está más o menos terminada, aunque eso no quiere decir que funcione bien. Es más, de momento no funciona bien he debido meter la pata con algunas variables porque segun que funciones fallan. Pero bueno, el diseño está terminado, al menos lo que tenia en mente, y hacer el debug no deberia costarme más que un rato, aunque tendra que esperar, me temo. Dejo aquí una imagen de la vista del ThoronClock versión PC...


12/11/2006

ThoronClock (I)

Bien, dado que la idea de este blog es ir colocando cuanto sale de mis manos... he pensado en incluir también el ThoronClock, que surge aproximadamente en el mismo tiempo que la decisión de crear este blog. Este "ThoronClock" pretende ser un sencillo reloj para jugar al ajedrez, con las cosas más simples: displays de minutos y segundos - pensé en incluir décimas de segundo, pero realmente carece de importancia... - para ambos jugadores, la posibilidad de configurar el reloj mediante sencillos pulsadores (Aumentar/reducir segundos, ídem para minutos) e incluir la posibilidad de incremento de tiempo por movimiento -limitando esa elección, eso sí, a un máximo de 60 segundo, a intervalos de 5. Podría ser mejor, pero realmente... dudo que nadie juegue con incrementos de 7,49 segundos... - Lo suyo seria hacerlo con un sencillo reloj, un par de contadores descendentes, y una etapa de control tirando a sencilla, pero... como tengo que ir practicando con micros de cara al PFC, he decidido que se va a encargar de todo uno de mis chiquitines, esos PICs que son capaces de tantas y tantas cosas... Quizá, para no necesitar tantas salidas (Con displays de 7 segmentos serian 56 salidas solo para los displays, y eso porque no necesito el punto decimal, que si no...), use algunos decoders de BCD, con lo que la cosa quedaría en 16 líneas por jugador, o lo que es lo mismo, 32 líneas (Por las 56 haciéndolo "a pelo"). Incluso, si me da la vena, multiplexar los cuatro displays de cada jugador dejando el tema en 4 salidas más las líneas de control para el BCD-to-7segments. Aunque en este último caso, quizá si convendría más pasar de ese conversor, y tirar de las 7 líneas más el multiplexor (multiplexores, más bien).

El caso es que todo esto está aun en fase de brainstorming, probablemente no me pondré a ello hasta navidad, principalmente porque hasta entonces voy algo liado. Ah, casi me lo dejo, el reloj contará con adaptador a red eléctrica, además de pilas, y comunicación con el PC (Vía RS232, probablemente, aunque no descarto hacerlo vía usb, por el tema de los portátiles, y porque tengo que practicar también con él, claro...). Desde el PC se podrá configurar el reloj, simular este (Es decir, habrá versión "virtual" del reloj, por si tienes un portátil a mano y no quieres/sabes montarte la versión física del ThoronClock). Esto tocará hacerlo en Visual Basic, porque el tutor del PFC quiere que use este para el proyecto, de modo que dejare a mi amado Borland C++ Builder de lado. Que le vamos a hacer...

Ah, lo he dejado caer por ahí arriba, pero lo comento explícitamente: aunque es algo sencillote, hay quien no quiere/no sabe/no puede hacer algo así, y puede gustarle la idea, resultarle útil, etc. Por esto ya comento que pienso poner aquí todo: esquemáticos del circuito físico, que será sencillo, pero aun así lo pondré, códigos fuente, tanto de la aplicación del lado del PC como del código del microcontrolador -aun por decidir el micro, lo que parece claro es que lo programaré en assembler- y cualquier otra cosa que incluya el proyecto. Y, por supuesto, si alguien quiere contribuir de algún modo, o preguntar dudas al respecto... es libre para hacerlo...

Por último, decir que no me marco una agenda, que esto no deja de ser algo que hago por hobby, y por tanto no está muy alto en la escala de prioridades, pero... quiero tener la aplicación del PC lista en navidad, y la idea es que el reloj esté funcionando como tarde en marzo. Si puede ser en febrero, mejor que mejor. Seguiremos informando, en cualquier caso...

De momento, dejo aquí un boceto del frontal del ThoronClock. Es realmente sencillo, de modo que no hay mucho que explicar, pero aun así... los pulsadores marcados como (+) y (-) son para setear el tiempo, incrementando y disminuyendo de 1 en 1 para los minutos, y de 5 en 5 para los segundos. Los pulsadores de arriba de los displays son los que se usan cuando hay una jugada, para conmutar el reloj, y luego los interruptores de abajo son para marcar cuando se está configurando, modo de incremento, si lo hay, y para ponerlo en marcha. Los incrementos son acumulables, lo que hace accesible todo el rango entre 5 y 65 cambiando de 5 en 5 segundos. Faltan cosas, obviamente, como indicadores que marquen de quien es el turno (Si, el reloj que se mueve lo indica, pero un led no cuesta nada y siempre queda bien), un zumbador para cuando se acaba el tiempo de algún jugador, y un botón de pausa que deje todo el sistema en stand by. Probablemente también el típico reset y otro que guarde la configuración actual como config por defecto. Muchas ideas me vienen a la cabeza ahora, veremos como va evolucionando esto...