miércoles, 18 de junio de 2014

Máquina tragaperras en SDLBASIC

Página principal


Máquina tragaperras
SDLBASIC


Hace muchos años, era la época del ordenador Amiga, había programado una máquina tragaperras  en Basic, había utilizado el programa Amos.
El programa Amos era un entorno de desarrollo para juegos que se programaba en Basic, era muy bueno y fácil de programar.
El tiempo ha pasado y he rehecho el programa de tragaperras y lo he programado en SDLBASIC.
El SDLBASIC es un entorno para programar en Basic  y que está en la mayoría de las distribuciones Linux y Windows,  por lo que da mucho juego.
Los programas hechos en Linux funcionan perfectamente en Windows sin ningún retoque en el código.
La pena del SDLBASIC es que está abandonado, aunque existe bastante documentación.
El otro día lo recopile desde el código fuente, por lo que el que quiera puede seguir con su desarrollo.

El programa de tragaperras está diseñado para que no existan ganancias, incluso se puede ver las estadísticas de la caja pulsando la tecla p.
Se encuentra hecho en baja resolución 320x200, un día de estos lo hago en una resolución mayor para que sea mas vistoso.



Programa SDLBASIC



Larga vida al Basic



Un saludo.
SETA43

domingo, 1 de junio de 2014

Arduino Emisor temperatura/humedad , receptor en PC, gráfica con gambas.

Página principal


Arduino
Emisor temperatura y humedad externa.
Receptor en PC con gráfica
433MHz - mx-05V

433MHz - mx-fs-03v
xsetaseta@gmail.com

En este montaje he realizado un emisor de temperatura y humedad. Se transmiten los datos y se recibe en un receptor colocado en el puerto usb de un ordenador.
En el ordenador se visualizan los datos de temperatura y humedad a través de un programa que monitoriza los datos y los representa en una gráfica.
Para emisor o transmisor he creado una placa de circuito impreso que se puede utilizar para los dos cometidos, cambiando el programa del Atmega328.
Para emisor se utiliza los conectores de AM2302 y el transmisor FS-03V, y se alimenta a través de 3 pilas de 1.5V. Los datos se transmiten cada 1.3 segundos o cada 67 segundos, dependiendo si existe o no existe el puente S1 pin (1- 4). El otro puente lo he dejado sin servicio, pero está pensado para identificar el canal.
En el lado del receptor se utilizan los conectores del MX-JS-05V, y está alimentado a través del conversor serie a usb que se conecta al ordenador.
El formato de transmisión es el siguiente:
H2440 T-680 222 91
Donde la humedad sería 24.40%, la temperatura -6.80ºC, el canal en este caso 222, y un numero secuencial del 0 al 99.
No existe comprobación del canal, por lo que algunas veces se puede mezclar con señales de otros emisores, es muy fácil hacerlo, pero se lo dejo a otros hacerlo.
Se pueden utilizar tanto ATMEGA8-ATMEGA88-ATMEGA328, da igual, el que sea mas económico, el código no supera los 8k. En mi caso he utilizado en el receptor un ATMEGA8, y en el emisor un ATMEGA328, son los que tenía a mano.



Esquema del circuito.


PCB


Montaje del receptor.



Montaje del emisor.

Programa del emisor y receptor.



Gráfica realizada con programa de basic Gambas 3.1.1
El emisor está dentro del congelador y el receptor pinchado en un puerto del ordenador a 10m de distancia.


Programa en gambas

Como yo utilizo mayormente linux, he programado el programa de monitorización de temperatura en basic de Gambas 3.1.1  .
Es bastante fácil realizar el programa en Visual Basic o cualquier otro basic.
Recordar que debéis tener permisos para usar los puertos serie, se hace añadiendo el usuario al grupo  dialout .
Si solo queréis ver si funciona, abrir el monitor de serie  del arduino.


Hasta pronto.
JUAN GALAZ

Bibliografía:
 http://playground.arduino.cc/Main/DS1302
 http://playground.arduino.cc/Code/PCD8544
 http://www.microsyl.com/index.php/2010/03/24/nokia-lcd-library/
http://forum.hobbycomponents.com/viewtopic.php?f=39&t=1324
http://seta43.duckdns.org/ardurab.html
http://playground.arduino.cc/Main/DHTLib
http://www.pjrc.com/teensy/td_libs_VirtualWire.html

martes, 13 de mayo de 2014

Arduino Reloj con medidor de temperatura y humedad externa. 433MHz - MX-05V

Página principal


Arduino
Reloj con medidor de temperatura y humedad externa.
433MHz - MX-05V

xsetaseta@gmail.com

Con los dos montajes anteriores, ya podemos montar un reloj con visualizador de temperatura y humedad externa.
Reloj con Nokia 3310 . http://seta43.duckdns.org/arnok.html
Receptor temperatura y humedad.   http://seta43.duckdns.org/ardurx.html


Esquema del circuito y su simulación


Montaje del circuito en placa Board.

En este montaje no he tenido en cuenta el consumo del circuito, si se quiere reducir deberíamos  sacar el micro de la placa arduino, y hacer alguna modificación del programa.
Como no quiero que utilicen este trabajo para presentarlo como propio, no he ajustado mucho el programa, dejo al que quiera que lo mejore a su gusto.
Se puede mejorar mucho, detección de falta de señal, temperaturas máximas y mínimas, alarmas, detección de identificación del transmisor, etc...
En el transmisor se puede aumentar  la potencia, alimentando el emisor con una tensión mayor en el modulo transmisor mediante dobladores de tensión.
También se puede eliminar el cristal y los condensadores en el transmisor, al utilizar el oscilador interno de 8 MHz.

PROGRAMA

Hasta pronto.
JUAN GALAZ

Bibliografía:
 http://playground.arduino.cc/Main/DS1302
 http://playground.arduino.cc/Code/PCD8544
 http://www.microsyl.com/index.php/2010/03/24/nokia-lcd-library/
http://forum.hobbycomponents.com/viewtopic.php?f=39&t=1324
http://seta43.duckdns.org/ardurab.html
http://playground.arduino.cc/Main/DHTLib
http://www.pjrc.com/teensy/td_libs_VirtualWire.html



miércoles, 7 de mayo de 2014

Arduino-Receptor temperatura y humedad 433MHz - MX-05V

Página principal


Arduino
Receptor temperatura y humedad
433MHz - MX-05V

xsetaseta@gmail.com

Esta es la segunda parte del montaje en el arduino para transmitir temperatura y humedad mediante radio en la frecuencia de 433MHz.


Circuito receptor MX-05V.



Esquema MX-05V.



Conexión en el arduino.

Programa
//-------------
// SETA43
// 07/05/2014
//-------------
//
//Receptor
//

#include <VirtualWire.h>
const int RX_DIO_Pin = 2;


 float h,humedad,temperatura;
 int dato1,dato2;
 byte indice;

void setup()
{
pinMode(13, OUTPUT);
Serial.begin(9600);
/* Initialises the DIO pin used to receive data from the Rx module */
vw_set_rx_pin(RX_DIO_Pin);
/* Receive at 2000 bits per second */
vw_setup(2000);
/* Enable the receiver */
vw_rx_start();
}

/* Main program */
void loop()
{
uint8_t Buffer_Size = 2;
unsigned int Data;
int Data1;
uint8_t RxBuffer[Buffer_Size];


if (vw_get_message(RxBuffer, &Buffer_Size)) // Non-blocking
  {
    digitalWrite(13, HIGH);
    Data = RxBuffer[0] << 8 | RxBuffer[1];
    h=Data; h=h/100;
    if(h==333.33)
        {
         indice=0;
         Serial.print("Humedad: ");
         Serial.print(humedad);
         Serial.print(" % ");
         Serial.print("Temperatura: ");
         Serial.print(temperatura);
         Serial.print(" C ");
         Serial.print(dato1);
         Serial.print(" ");
         Serial.println(dato2);
        }
      else
        {
          indice++;
          if(indice==1) humedad=h;
          if(indice==2)
             {
               if (Data>=35000)
                {
                  Data1=Data-65536;
                  h=Data1;
                }
                else
                {
                 h=Data; 
                }                
              h=h/100;   temperatura=h; 
             }
          if(indice==3) dato1=Data;
          if(indice==4) dato2=Data;
        }
    digitalWrite(13, LOW);
  }
}


En el programa se reciben 5 datos.
El primero es 33333, es un numero de sincronización de la recepción.
El segundo es la humedad, multiplicada por 100, esto es para que sean enteros de 2 bytes.
El tercero es la temperatura, multiplicada por 100, esto es para que sean enteros de 2 bytes.
El cuarto es 222, este numero se lo he puesto a modo de seguridad. Debido a que puede recibir señales de múltiplos transmisores, se debe identificar con un numero de identificación único. Para simplificar el programa, no he utilizado la identificación por numero.
El quito es un numero consecutivo del 0 al 100.



Salida del puerto serie.



Hasta pronto.
JUAN GALAZ

Bibliografía:
http://forum.hobbycomponents.com/viewtopic.php?f=39&t=1324
http://seta43.duckdns.org/ardurab.html
http://playground.arduino.cc/Main/DHTLib
http://www.pjrc.com/teensy/td_libs_VirtualWire.html

martes, 6 de mayo de 2014

Arduino-Transmisor temperatura y humedad 433MHz -mx-fs-03v

Página principal


Arduino
Transmisor temperatura y humedad
433MHz - mx-fs-03v
xsetaseta@gmail.com

Navegando por la red,http://www.hobbycomponents.com/, encontré un kit de transmisión y recepción para el arduino en la frecuencia de 433MHz.
Es sencillo de programar y se puede obtener por menos de 2€.
Dicho y hecho, lo pedí y en menos de 15 días lo tenía en casa.
El montaje lo he separado en dos artículos, transmisor y receptor, en este primer montaje voy a explicar como he hecho el transmisor.


Kit transmisor
Esquema del transmisor


Esquema del montaje en la placa arduino.


Esquema del montaje en el ATMEGA328.

Para poder medir el consumo del circuito por partes y quitar el consumo de los componentes de la placa arduino, he sacado el Atmega en un modulo board. También he añadido un conversor USM->rs232 para poder programar el microcontrolador.


Montaje del circuito.

Para entender este circuito conviene ver mis dos anteriores artículos:
Reduciendo consumo.Parte 2. Reloj - DS1302. ardurab
Reduciendo consumo.Parte 1. Reloj - DS1302. arduraa

El consumo total del circuito quitado el adaptador usb-to-TTL es de 0.08 mA a 4.2V.
Cuando transmite el circuito consume 15mA ,el tiempo de transmisión dura aproximadamente 1 segundo.
Mediante un interruptor podemos indicarle al circuito que transmita cada  1 segundo o cada 60 segundos.
Una pila AA pude tener una capacidad entre 1100mAh(Zinc–carbono)
y 2900mAh (NiMH).
Si hacemos cálculos con un consumo de 15mA cada 60 segundos, con una pila de 1100mAh , tendremos para aproximadamente 4400 horas, 183 días.
Si utilizaríamos pilas alcalinas con poca autodescarga y cambiaríamos el programa para que transmitiera cada mas tiempo, duraría años el circuito transmitiendo.


Todo esto es bastante teórico, las baterías se autodescargan con el tiempo.

Programa
//-------------
// SETA43
// 06/05/2014
//-------------

#include <avr/io.h>
#include <avr/interrupt.h>

#include <avr/sleep.h>

#include <Wire.h>
#include <VirtualWire.h>
#include "DHT.h"

#define DHTPIN 3     // what pin we're connected to

// Uncomment whatever type you're using!
//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

unsigned int ih,it;
int sensorValue1, sensorValue2;

DHT dht(DHTPIN, DHTTYPE);

const int TX_DIO_Pin = 2;

int z,contador;

void setup() {
  
  pinMode(13, OUTPUT);
  pinMode(12, INPUT);

  vw_set_tx_pin(TX_DIO_Pin);
  vw_set_ptt_inverted(true);
  vw_setup(2000);

  Serial.begin(9600);
  Serial.println("DHTxx test!");
 
  dht.begin();
  
  watchdogOn(); // Turn on the watch dog timer.
  //Desactiva conversor A/D
  ADCSRA = ADCSRA & B01111111;
  ACSR = B10000000;
 
  contador=0;
}

void loop() {
 unsigned int Data;
 byte TxBuffer[2];
 
  float h = dht.readHumidity();
  float t = dht.readTemperature();


  if (isnan(t) || isnan(h))
    {
    Serial.println("Failed to read from DHT");
    }
  else
    {
    
    ih=h*100;
    it=t*100;
 
    sensorValue1=222;
    sensorValue2=contador;
    
    digitalWrite(13, HIGH);
    
    TxBuffer[0] = 33333 >> 8;
    TxBuffer[1] = 33333;
    vw_send((byte *)TxBuffer, 2);
    vw_wait_tx();
    
    TxBuffer[0] = ih >> 8;
    TxBuffer[1] = ih;
    vw_send((byte *)TxBuffer, 2);
    vw_wait_tx();
    
    TxBuffer[0] = it >> 8;
    TxBuffer[1] = it;
    vw_send((byte *)TxBuffer, 2);
    vw_wait_tx();
    
    TxBuffer[0] = sensorValue1 >> 8;
    TxBuffer[1] = sensorValue1;
    vw_send((byte *)TxBuffer, 2);
    vw_wait_tx();
    
    TxBuffer[0] = sensorValue2 >> 8;
    TxBuffer[1] = sensorValue2;
    vw_send((byte *)TxBuffer, 2);
    vw_wait_tx();
        
    Serial.print(ih); Serial.print(" %  ");
    Serial.print(it); Serial.print(" C  ");
    Serial.println(contador);  
    
    delay(500);
    digitalWrite(13, LOW);
    
    for(z=0;z<60 && HIGH==digitalRead(12) ;z++)goToSleep();
    contador++;
    if(contador>100) contador=0;
    delay(100);

    digitalWrite(13, HIGH);

    }
  
}

void goToSleep()   
{    
  set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Set sleep mode.
  sleep_enable(); // Enable sleep mode.
  sleep_mode(); // Enter sleep mode.
  sleep_disable(); // Disable sleep mode after waking.                     
}

void watchdogOn()
{
  //Fuente http://www.fiz-ix.com/2012/11/low-power-arduino-using-the-watchdog-timer/
  // Clear the reset flag, the WDRF bit (bit 3) of MCUSR.
  MCUSR = MCUSR & B11110111;
  WDTCSR = WDTCSR | B00011000;
  //WDTCSR = B00000101; //0.5S
  WDTCSR = B00000110; //1S
  //WDTCSR = B00100001; //8S

  // Enable the watchdog timer interupt.
  WDTCSR = WDTCSR | B01000000;
  MCUSR = MCUSR & B11110111;
}


ISR(WDT_vect)
{
  //No hace nada
  
}



Hasta pronto.
JUAN GALAZ

Bibliografía:
http://forum.hobbycomponents.com/viewtopic.php?f=39&t=1324
http://seta43.duckdns.org/ardurab.html
http://playground.arduino.cc/Main/DHTLib
http://www.pjrc.com/teensy/td_libs_VirtualWire.html

lunes, 14 de abril de 2014

Arduino Reloj con Nokia 3310

Página principal


Arduino
Reloj con Nokia 3310
xsetaseta@gmail.com

Recién adquirido un LCD 3310, que llevaban los modelos de Nokia, me he dispuesto a pasar los montajes de relojes que hice con un lcd de 16x2, artime.html , arduds.html ,  al LCD 3310.
Existen una librerías: Adafruit_GFX y  Adafruit_PCD8544 para manejar el LCD, pero tienen un problema, no funcionan con versión 1.0.5, que es la que tengo instalada, por lo que he utilizado otra forma. En la página oficial de arduino existe un ejemplo, http://playground.arduino.cc/Code/PCD8544 , el cual le he adaptado a mi programa.
Como podemos observar en las características del LCD 3310, debe funcionar a 3.3V, y las salidas del arduino funcionan a 5V. He visto varios montajes utilizando resistencias, pero  en uno  decía que el LCD podía funcionar a 5V, pero el Led de iluminación solo se podía poner a 3.3V, y eso es lo que he hecho. A pesar de lo que dice el fabricante funciona a 5V, no se por cuanto tiempo. Hemos de pensar que el ATMega328 funciona perfectamente a 3V, por lo cual podemos alimentar todo el conjunto con baterías de 3V.

Programa


Datos técnicos del LCD.



Esquema reloj simple mediante interrupciones.


Montaje
reloj simple mediante interrupciones.


Esquema de reloj mediante DS1302


Montaje
de reloj mediante DS1302



Los dos modos que tiene de tamaño de hora.

He hecho una modificación en el montaje con el DS1302 , para poderlo desbloquear la primera vez que se pone en marcha. Manteniendo pulsados a la vez los dos pulsadores mientras se resetea o se inicia, se desbloquea el
DS1302 , poniendo una fecha determinada.


Hasta pronto.
JUAN GALAZ

Bibliografía:
 http://playground.arduino.cc/Main/DS1302
 http://playground.arduino.cc/Code/PCD8544
 http://www.microsyl.com/index.php/2010/03/24/nokia-lcd-library/
 http://seta43.duckdns.org/electro.html


jueves, 3 de abril de 2014

Viejos montajes Grabador de EPROM - Puerto paralelo LPT1

Página principal

Viejos montajes
Grabador de EPROM
Puerto paralelo LPT1
xsetaseta@gmail.com

 http://seta43.duckdns.org/graba.html
Removiendo papeles en la estantería, he encontrado un viejo montaje de un grabador de memorias EPROM. Este es un montaje desarrollado enteramente por mi, es una utilidad a un anterior circuito,  CONTROLADOR DE 8255 MEDIANTE PUERTO PARALELO, STANDARD O BIDIRECCIONAL, port.htm.
A finales de los años 80 realice un montaje para el Spectrum que venía en un revista, pedí la placa por correo, y lo monté, en algún cajon aún existe, en aquel tiempo me sirvió para hacer montajes con el Z80.
El borrado era mediante rayos ultravioletas, también me compre un tubo de rayos ultravioletas. Los rayos ultravioletas se utilizan en algunas peluquerías para matar bichos, y son peligrosos si se miran directamente, puedes perder vista.
Ya con los años las memorias EPROM que tenían diferentes voltajes de programación, se fueron sustituyendo por las EEPROM que se podían borrar eléctricamente, ya no hacía falta la pequeña ventanilla para borrarlos mediante (UV).
Pero eso es otra historía, el montaje se quedo en programador EPROM, con visos de hacer un programador de EEPROM.
Realice varios programas en Turbo C, para las diferentes modelos de EPROM 2K, 4K, 8K, etc...
Existen muchos tipos de EPROM, para programar un tipo de memoria debemos mirar la hoja del fabricando y ajustar el voltaje de programación.

Aquí muestro todos los planos, imágenes y programas.

Programas

Pulsar para zoom.
Grabador montado con alguna modificación.

.
Pulsar para zoom.
Esquema

.
Pulsar para zoom.
Segundo prototipo

.
Pulsar para zoom.
Primer prototipo

.
Pulsar para zoom.
Tipos de memoria


Saludos
Juan Galaz