Mostrando entradas con la etiqueta Microcontroladores. Mostrar todas las entradas
Mostrando entradas con la etiqueta Microcontroladores. Mostrar todas las entradas

domingo, 2 de junio de 2024

ESP32 Micropython y Thonny IDE

Muy buenas a todos y todas enamorados de los microcontroladores!!!

El ESP32 es un microcontrolador potente y versátil con módulos WiFi y Bluetooth integrados de bajo costo y alta potencia desarrollado por la compañía china Espressif.

Es muy utilizado en el internet de las cosas (IOT) como domótica, robótica, estaciones meteorológicas y una amplia gama de proyectos y aplicaciones que, sobre todo, necesiten un bajo consumo de energía.

Es fácil de programar ya que se programa con el puerto USB, y cuenta con una gran comunidad de usuarios a sus espaldas.

Podríamos decir que es el sucesor del más que famoso ESP8266 el cual es mono núcleo y no cuenta con comunicación bluetooth. En una de las cosas que si se parecen es en su bajo coste, se pueden encontrar desde unos 3€ aproximadamente.

A día de hoy, en 2024, existen varias series y modelos del microcontrolador ESP32, cada uno con características y enfoques específicos pero en este articulo vamos a centrarnos en el modelo WROOM32.


sábado, 2 de marzo de 2024

WLED el mejor control para tus tiras LED

WLED es un firmware de código abierto que te permite controlar tiras de LED digitales RGB con un microcontrolador ESP8266 o ESP32.

Es una de las mejores alternativas a los controladores LED tradicionales, ya que ofrece una gran flexibilidad y personalización a través de una interfaz web intuitiva.

Empecemos!

¿Que son los LEDS WS2812B?

Una tira de LED direccionables es un tipo de tira de LED que te permite controlar el color y el brillo de cada LED individual. La más popular es la denominada WS2812B y es la tira de led que he usado en varios proyectos con unos resultados totalmente satisfactorios. Uno de ellos es la iluminación para la caja del PC.


domingo, 14 de enero de 2024

Permisos de acceso al USB para IDE Arduino

Muy buenas a todos Arduineros y Arduineras!!!

Hace poco reinstale el sistema operativo Ubuntu en el portátil y como es el que uso normalmente para programar los Arduinos, instale el IDE Arduino.

Me pongo en faena y subo el sketch, compilado bien y cuando toca el momento de subir el programa al microcontrolador, me da el siguiente error:


avrdude: ser_open(): can't open device "/dev/ttyUSB0": Permission denied
 Failed uploading: uploading error: exit status 1


USB Arduino permission error
/dev/ttyUSB0: Permission denied


Esto es un error frecuente en instalaciones nuevas, en este caso una distribución Ubuntu y es muy fácil de solucionar.

El error básicamente nos viene a decir que no tenemos permisos de escritura o lectura para el puerto USB0.

Para solucionar el error avrdude: ser_open(): can't open device "/dev/ttyUSB0": Permission denied tenemos dos opciones, una temporal y otra permanente y son las siguientes:

Solución temporal:


sudo chmod 777 /dev/ttyUSB0

sábado, 23 de diciembre de 2017

Arduino: Reloj On Board con RTC i2C LCD 16x2 y DHT 11

Hola a todos!!!

Hace un tiempo se me rompió el reloj del coche, un viejito Clio de 2004. Estuve mirando el repuesto y estaba entre 20 y 40€ y su función en mi coche era solamente dar la hora, el sensor de temperatura era un extra que no puse en su momento.

Bueno después de muchos años el reloj del coche paso a mejor vida...

Arduino ha sido una solución original y económica para este problema. Con menos de 10€ he montado un reloj con 2 sensores de temperatura/humedad DHT11 un LCD a juego con la iluminación interior de coche (rojo) y un modulo RTC D1307 i2C.

Este programa es una variación de otro que publique en este articulo Arduino: Reloj calendario con RTC DS1307 i2C.


Componentes necesarios:

  • 1 x Arduino NANO.
  • 1 x LCD 16x2.
  • 2 x DHT11.
  • 3 x Pulsadores
  • 1 x Divisor de tensión.

Arduino Reloj RTC para coche.

martes, 6 de octubre de 2015

Moviendo desvíos con servos y Arduino

Buenas a todos y todas los amantes de Arduino!!!

Después de estar mirando como poder mover los desvíos de mi nueva maqueta (aun en construcción) y viendo los precios y los diferentes sistemas (electroimanes, relés, motores caseros, etc..) me he decantado por los servos de modelismo y Arduino.

Lo que más me ha convencido son su bajo precio y lo fácil que son de instalar, si a eso le añadimos una placa Arduino, la cosa se hace mucho más interesante.

Ya no es que solo podamos mover el servo con Arduino, sino que también podremos tener salidas para poder conectar semáforos o cualquier otra cosa que queramos como los corazones de los desvíos.


Servo Tower Pro 9G:


jueves, 7 de mayo de 2015

Arduino: Reloj calendario con RTC DS1307 i2C

Muy buenas a todos y todas fanáticos de los microcontroladores!!!

Este ejemplo es prácticamente el mismo que el anterior articulo "Arduino: reloj calendario sin rtc" pero esta vez con una modificación extra para incorporar un módulo RTC (Real Time Clock).


Este pequeño dispositivo hace que al dejar de alimentar la placa Arduino, la hora queda almacenada en el y al volver la alimentación otra vez a Arduino muestre la hora y la fecha actualizada. Es una función muy practica si no quieres estar poniendo en hora el reloj cada vez que falte alimentación.

Para el proyecto que tengo en mente es imprescindible ya que una vez terminado el reloj, la idea es colocarlo en el coche junto con unos sensores de temperatura y no se si alguna función más...

La conexión es sencilla, GND y VCC son masa y alimentación respectivamente, SDA va conectado al PIN analógico A4 y SCL al pin analógico A5.

La conexión del LCD son los pines 4,5,6,7 de la placa arduino para D4, D5, D6, D7; El pin 8 de arduino correspondería a RS y el pin 9 a E.

Los pulsadores van conectados a los pines 10 y 11 de arduino.



martes, 28 de abril de 2015

Arduino: Reloj calendario sin RTC

Buenas los fanáticos y fanáticas de Arduino!!!

Buscando información para un proyecto de un reloj con calendario y RTC me encontré con un programa sin RTC mucho más completo que el que ya tenia publicado en Arduino: Reloj simple sin modulo RTC DS1307.


Este reloj utiliza una librería llamada TimedAction que esta disponible en GitHub

Esta "actualización" (vamos a llamarla así) incluye, además de la hora:


  • Día (1, 2, 3,....)
  • Día de la semana (Lunes, Martes, Miércoles...)
  • Mes (Enero, Febrero, Marzo....)
  • Año

lunes, 16 de febrero de 2015

Arduino: Brazo robot con servos ( Robot arm )

Muy buenas a todos Arduineros y Arduineras!!!

Infotronikblog tiene ahora su propio brazo robot. En total 3 ejes más pinza, aunque es el modelo básico, el modelo completo tiene 4 ejes más pinza. Puedes descargar el modelo en Thingiverse.

Este diseño es más que suficiente para enseñar como funciona un brazo robot y las 3 posiciones espaciales (X Y Z) en las que se moverá el brazo. Los ejes de referencia son:

  • Eje X: Es el movimiento de izquierda a derecha.
  • Eje Y: Es el movimiento de arriba o abajo.
  • Eje Z: Es el movimiento de avance o retroceso.

Ahora que ya sabemos por donde nos movemos, estos son los componentes que moverán los ejes que componen el brazo:

  • Arduino UNO o NANO.
  • 4 servos de tipo 9g.
  • 4 pulsadores.
  • 1 potenciómetro.

La parte blanca esta impresa en ABS y la parte azul es PLA, ya que es de las primeras cosas impresas y querían probar los diferentes materiales. Después de montarlo, creo que es mejor el PLA, ya que es mas rígido.

Los movimientos corren a cargo de 4 servos de 9g que van conectados a los pines 2, 3, 4, 5 de Arduino. Para la primera prueba (solo la pinza) utilice dos pulsadores, uno para abrir y otro para cerrar muy parecido al segundo ejemplo del articulo "Arduino moviendo un servo".


Para la segunda prueba (bazo completo) utilice cuatro pulsadores conectados a los pines 6, 7, 8, 9 asignado a cada uno de los servos y un potenciómetro en el pin A0 para darle movimiento. De tal manera que si pulsamos uno de los botones mientras movemos el potenciómetro accionaremos el servo asignado a ese pulsador.



Pulsando el botón y moviendo el potenciómetro podemos mover el brazo en cualquiera de sus ejes.


Si bien el sistema no es del todo perfecto, ya que si no movemos el potenciómetro antes de accionar el pulsador el servo adquiere la posición del ultimo movimiento. Pero es más que suficiente para este ejemplo.

Una mejora puede ser también implementar la memoria EPROOM para almacenar los movimientos en determinadas posiciones y para después reproducirlos en secuencia haciendo así una tarea repetitiva.

Aquí tenéis un vídeo para que veáis un poco mejor como funciona:


Y aquí el código que hace que funcione:


#include <servo.h>

#define POT A0
#define SWITCH1 2
#define SWITCH2 3
#define SWITCH3 4
#define SWITCH4 5
#define SERVO1 6
#define SERVO2 7
#define SERVO3 8
#define SERVO4 9


int posServo1 = 90; // Angulo servo 1 (base)
int posServo2 = 90; // Angulo servo 1 (antebrazo)
int posServo3 = 90; // Angulo servo 1 (brazo)
int posServo4 = 90; // Angulo servo 1 (pinza)


void setup() 
{ 
  Serial.begin(115200);

  servo.attach(sp1);
  pinMode(SWITCH1, INPUT_PULLUP);
  pinMode(SWITCH2, INPUT_PULLUP);
  pinMode(SWITCH3, INPUT_PULLUP);
  pinMode(SWITCH4, INPUT_PULLUP);
  
}

void loop() 
{
  
  // Show the value of the buttons on the serial monitor
  Serial.print("b1=");
  Serial.println(digitalRead(b1));
  Serial.print("b2=");
  Serial.println(digitalRead(b2));

  int potValue = analogRead(POT)
  int position = map(potValue, 0, 1023, 0, 180);
  
  
  if (digitalRead(SWITCH1) == HIGH)  servo1.write(position);
  else if (digitalRead(SWITCH1) == HIGH)  servo1.write(position);
  else if(digitalRead(SWITCH1) == HIGH)  servo1.write(position);
  else (digitalRead(SWITCH1) == HIGH)  servo1.write(position);

}

Saludos a todos!!

viernes, 6 de febrero de 2015

Arduino: moviendo un servo

Buenas Arduineros y Arduineras!!

Después de ver como funcionan los leds, pulsadores y pantallas LCD, ahora le toca el turno practicar con dispositivos de salida como son los servos.


¿Que es un servo?

Un servo o servomotor es un dispositivo muy similar a un motor de corriente continua con la peculiaridad de poder posicionar su eje una posición determinada dentro de un rango de aproximadamente unos 180º. Se puede modificar tanto su posición como velocidad.

Servo 9G

Arduino tiene una biblioteca para este tipo de dispositivos llamada servo.h. Con ella podemos controlar cualquier servo de manera independiente.

Algo a tener en cuenta es que dependiendo del tipo de servo y de la cantidad de los mismos, seguramente no podrás alimentarlo desde la misma placa de Arduino.

Para este ejemplo y dado que el servo a utilizar es de los más pequeños, no habrá problema ninguno en conectarlo directamente a la placa Arduino.


¿Como trabaja un servo?

Los servos utilizan la modulación por ancho de pulsos (PWM) para controlar tanto la dirección como la posición del motor de de corriente continua.

La mayoría de los servos trabajan a una frecuencia de 50Hz con la señal PWM de un periodo de 20 milisegundos.

La electrónica incorporada en estos dispositivos responde al ancho de la señal modulada.


La señal PWM

Si recibe una señal de entre 0,5 a 1,4 milisegundos, el servo se moverá en sentido horario.


                _      _     _          _    _    _
               | |    | |   | |        | |  | |  | |
               | |    | |   | |        | |  | |  | |
      _________| |____| |___| |________| |__| |__| |___________

Si la señal es de 1,6 a 2 milisegundos el giro sera antihorario:


                ______      ______     ______     ______    ______
               |      |    |      |   |      |   |      |  |      |
               |      |    |      |   |      |   |      |  |      |
      _________|      |____|      |___|      |___|      |__|      |____

Y si la señal recibida es de 1,5 milisegundos su estado sera neutro:


                 ___      ___     ___     ___    ___    ___
                |   |    |   |   |   |   |   |  |   |  |   |
                |   |    |   |   |   |   |   |  |   |  |   |
       _________|   |____|   |___|   |___|   |__|   |__|   |_____

📚La blioteca servo.h:

La biblioteca Servo.h es una librería estándar incluida en el IDE de Arduino que permite controlar servomotores de forma sencilla. Gestiona la generación de señales PWM necesarias para posicionar servomotores estándar de 0° a 180°.

  • Compatibilidad: Funciona en todas las placas Arduino (Uno, Nano, Mega, etc.).

  • Límites: Controla hasta 12 servos en Arduino Uno/Nano (24 en Mega).

  • Precisión: Usa temporizadores internos (Timer1 en Uno) para generar señales estables.

  • Voltaje: Recomendado 5V (igual que la lógica del servo).

  • Documentación: Es oficial desde Arduino Reference - Servo Library

⚙️Funciones principales:

  • attach(): Fija el pin digital donde estará conectado el servo

  • writer():Escribe un valor en el servo, controlando su eje en consecuencia.
    Su valor esta dado en grados de 0 a 180. En un servo de rotación continua cambiara la velocidad del servo, siendo 0 toda la velocidad en una dirección y 180 en otra dirección y un valor de 90 aproximadamente sin movimiento.

  • writeMicroseconds(): Escribe un valor en microsegundos (uS) en el servo controlando su eje en consecuencia.
    En un servo estándar si el valor del parámetro es 1000 el eje girará completamente a la izquierda, con un valor de 2000 es completamente a la derecha y con un valor de 1500 se sitúa en el centro.
    Según el fabricante estos valores pueden variar, normalmente entre 700 y 2300.
    Se puede comprobar pero hay que tener en cuenta que llegar al limite puede producir daños en el servo.
    Normalmente lo adivinaras por por el ruido infernal que hará el servo.
    NO ES RECOMENDABLE pasar de esos parámetros ya que pueden producir daños en el servo.
    Para los servos de rotación continua writeMicroseconds() funciona de una manera análoga a write().

  • read(): Lee el angulo actual del servo (el ultimo valor pasado por la llamada write().

  • attached(): Comprueba si la variable servo esta unida a un pin.

  • detach(): Separa la variable servo de un pin. Si se separan todas las variables de servo, los pines 9 y 10 pueden utilizarse como PWM mediante analogWrite().

Programación:

Primer programa para un servo, mover el servo de manera simple:



#include "servo.h" 	// Cargamos la biblioteca "Servo.h"
 
int Pin = 9;		// Cargamos un 9 en la variable "Pin"
 
Servo servo1;		// Nombramos al primer servo
  
// Configuración
void setup()
{        
  servo1.attach(Pin);   // Adjuntamos el pin 9 a servo1
} 
 
//Programa principal
void loop()             
{                                 
    servo1.write(0);     // Mandamos a servo1 a la posición 0 grados      
    delay(1500);         // Hace una pausa de 1,5 segundos
    servo1.write(90);    // Mandamos a servo1 a la posición 90 grados       
    delay(1500);         // Hace una pausa de 1,5 segundos
    servo1.write(180);   // Mandamos a servo1 a la posición 180 grados        
    delay(1500);         // Hace una pausa de 1,5 segundos
    servo1.write(90);    // Mandamos a servo1 a la posición 900 grados       
    delay(1500);         // Hace una pausa de 1,5 segundos
}


Segundo programa para un servo, mover el servo con pulsadores:



#include "servo.h"

int servovar1=90;   // Indicamos la posicion inicial de servo1
Servo servo1;       // Nombramos al primer servo

int Pulsador1=6;   // Cargamos un 6 en la variable "pulsador1"
int Pulsador2=7;   // Cargamos un 7 en la variable "pulsador2"

void setup() {
  servo1.attach(9);    // Adjuntamos el pin 9 a servo1
  pinMode(Pulsador1, INPUT);  // Pulsador 1 en pin 6 es una entrada
  pinMode(Pulsador2, INPUT);  // Pulsador 2 en pin 7 es una entrada
}

void loop() {
    if(digitalRead(Pulsador1) == HIGH && digitalRead(Pulsador2) == LOW){  
      servovar1++;		// Presionamos el pulsador1 para que vaya a la izquierda
}
    else if(digitalRead(Pulsador1) == LOW && digitalRead(Pulsador2) == HIGH){  
      servovar1--;	// Presionamos el pulsador2 para que vaya a la derecha
    }
  
  servo1.write(servovar1);
  delay(10);	// Pausa de 10 milisegundos (Para más velocidad 
  				// quitar esta linea y para ir más lento aumentar el valor)
}


Un vídeo del servo con Arduino funcionando:


Ahora que ya sabes como funcionan los servos con Arduino, aquí tienes algunos artículos aplicando este código:

Moviendo desvíos con servos y Arduino

Arduino: Brazo robot con servos ( Robot arm )

Arduino: Brazo robot con servos ( Robot arm ) Parte 2

Saludos!!!

martes, 3 de febrero de 2015

Arduino: Reloj simple sin modulo RTC DS1307

Saludos a todos y todas!!!

Siguiendo con Arduino y el LCD, este ejemplo es algo más practico que los que hemos visto hasta ahora. Se trata de un reloj, un reloj simple, pero un reloj al fin y al cabo.

Esta programado de tal manera que no sea necesario un modulo RTC DS1307.

En realidad es un reloj que solo funciona mientras Arduino esta conectado, en el momento que deje de recibir corriente, el reloj volverá a estar a cero. Puede no parecer muy practico, pero va muy bien para practicar con variables, el "if", y diferentes operadores.

También le pondremos un par de pulsadores para poder ponerlo en hora, uno para los minutos y otro para las horas.

También se le puede añadir una alarma por ejemplo o que ponga la fecha, pero eso os lo dejo a vuestra imaginación.

El LCD lo conectaremos como en los ejemplos anteriores, y los pulsadores en modo pull.up en los pines 6 y 7



viernes, 16 de enero de 2015

Arduino: Diferentes efectos en un LCD 16x2

Como ya anunciaba en el post anterior Arduino: El LCD 16x2, con la librería liquidCrystal.h podemos crear diferentes efectos como parpadeos, desplazamientos, visualizar variables y efectos en cursores.

Algunos de estos efectos están en los mismos ejemplos que proporciona el mismo IDE de Arduino, y es una muy buena manera para empezar a trastear con el LCD.

Como quedaría un vídeo muy largo he decidido hacer dos partes.

En esta primera parte podréis ver como actúan las funciones:


  • autoscroll()

  • blink()

  • cursor()

  • customCharacter()

  • display()

Parte 1


Parte 2


lunes, 12 de enero de 2015

Arduino: Usando pulsadores

Como hemos visto hasta ahora, solo hemos encendido y apagado leds sin tener nosotros ningún control sobre cuando encienden o cuando apagan.

Esta vez vamos a ver como interactuar con Arduino mediante pulsadores.

Arduino interpreta estas entradas digitales TTL como 1 lógico = 5v HIGH o con un 0 lógico = 0v LOW.

¿Como interpreta Arduino un pulsador?

Cuando Arduino recibe un 1 quiere decir que en esa entrada están llegando una señal de +5v, si conectamos una resistencia a +5v en serie con un pulsador conectado a GND e intercalamos el pin correspondiente de Arduino, siempre estará en un estado alto HIGH. Al presionar el pulsador, ese voltaje pasa a GND y Arduino recibe un 0 (LOW). A esto le llamamos una resistencia PULL-UP, figura 1 de la foto.



sábado, 27 de diciembre de 2014

Arduino: Efecto coche fantástico

Buenas a todos! hoy nos ponemos nostalgicos.. Quien no recuerda esa fantástica serie de los 80's llamada "El coche fantástico"?

Un coche con inteligencia artificial que hablaba y que en capo brillaban unos flamantes leds rojos. Con Arduino no conseguiremos que nuestro coche piense por si solo o hable, lo que si podremos hacer es ese efecto de luces que tanto nos gustaba.

En estos ejemplos nos centraremos en hacer unas cuantas secuencias con leds, son ejemplos sencillos, pero nos ayudaran a comprender los ciclos for.

En los ciclos for las tres partes de las que se compone for están separadas por punto y coma ( ; ).



for (n=5;  n < 9; n++){}

  • n=5; Es el valor inicial del ciclo. El valor puede ser positivo o negativo
  • n < 9; Es la condición en la que terminara el bucle y se relaciona con el primer valor directamente. en este caso "menor que".
  • n++ Indica como serán manipulados los datos

Todo lo que pongamos entre los corchetes {} se repetirá hasta que la primera y la segunda parte coincidan, es decir, hasta que "n" llegue a 8, entonces terminara con el bucle y seguirá con el programa. Con esto hemos conseguido que "n" haya tenido los valores 5, 6, 7 y 8.

 
// Inicia código

int tiempo= 300;     // Tiempo es una variabe int con valor 300
int n;    // n es una variable int

void setup(){
for (n= 5; n < 9; n++);

El programa se puede interrumpir si dentro del bucle añadimo un break:

 
break;

Después de este primer ejemplo, vamos al ejercicio al que hace referencia el titulo de este post.

Hasta ahora hemos hecho una secuencia en un solo sentido, para hacer la secuencia del coche fantástico tenemos que hacer que los puertos se desplacen tanto hacia arriba como hacia abajo.

Para ello hacemos el ciclo for añada un bit (++) o lo quite (--).

También como hacer un array donde se almacenaran los números de los leds que vamos a encender.

Veamos como actúa en el siguiente código:


// Inicia código luces coche fantástico

int leds[] = {5,6,7,8,9,10,11};	// Crea un array de los pines de 5 al 11 dentro de la variable led
int n = 0;			// Crea una variable llamada “n” y le asigna un valor de 0
int tiempo = 30;		// Crea una variable llamada tiempo y le asigna un valor de 30

void setup() {				// Comienza la configuración
	for (n = 0; n < 7 ;n--) {	// Repite el bucle encerrado entre las llaves
		pinMode(n, OUTPUT);	// Indicamos que los pines son de salida
	}

void loop(){
	for (n = 0; n < 7 ;n--) {		// Repite el bucle encerrado entre las llaves
		digitalWrite (leds[n],HIGH);	// Enciende el led almacenado en array en sentido contrario
		delay(tiempo);			// Hace una pausa de 30 ms
		digitalWrite (leds[n-1],HIGH);	// Enciende el led anterior
		delay(tiempo);			// Hace una pausa de 30 ms
		digitalWrite (leds[n],LOW);	// Apaga el led anterior a [n-1]
		delay(tiempo*2);		// Pausa de 60ms
	}
}


Como veis es algo muy sencillo que nos ayudara a comprender mejor como utilizar los bucles for.

Esto se puede utilizar para casi cualquier repetición,  Por ejemplo si quisiéramos que un led parpadeara medio segundo encendido y medio segundo apagado durante 60 repeticiones, tendríamos un segundero para un reloj.

Un saludo y gracias por visitar www.infotronikblog.com

sábado, 20 de diciembre de 2014

Arduino: primeros pasos

Muy buenas a todos y todas!!!

En este blog ya os he hablado alguna vez de Arduino, aunque siempre ha sido por cosas que he leído o que he visto en youtube y me han parecido interesantes.

Por fin puedo hablar desde la experiencia. Hace cosas de unos días he recibido mi placa Arduino UNO R3.

Después de abrir el paquete, me encontré con esto:

Arduino UNO R3

Esta pequeña obra de ingeniería, además de lo evidente como tener un conector USB (lo cual hace mucho más sencilla la comunicación con el PC), cuenta con un micro procesador de 8 bits AVR ATMEL ATMEGA328P con 32Kb de memoria FLASH operando a 16Mhz.

Cuenta también con múltiples salidas digitales, entradas analógicas, salidas PWM. Además de salidas reguladas de 5V y 3,3V.

Con todo esto es más que suficiente para empezar a desarrollar nuestros pequeños proyectos con los que podremos controlar LEDs, pulsadores, teclados numéricos, servos, pantallas LCD, OLED y TFT, infrarrojos, motores... pero vamos a empezar paso por paso.

martes, 11 de noviembre de 2014

Animación LCD 16x2 con 16F876A

Buenas, esta entrada es un poco por recordar. Se trata de un pequeño programa que únicamente nos muestra una pelota y un muñeco que va delante de ella.

La simulación corre a cargo de un PIC 16f876A a 4MHZ

Es una transición sencilla de dos imágenes cargadas en la CGRAM de la pantalla LCD, en la entrada "Caracteres especiales LCD" explico como se añaden estos dibujos.

Una vez que los tenemos grabados, solo hay que borrar la posición anterior y volver a escribirlos en la siguiente posición .

Este tipo de animación se podría poner, por ejemplo, cuando no presionemos ninguna tecla durante X segundos y que volviera a la pantalla del programa una vez que presionemos alguna tecla

Seguramente seria más corto haberlo escrito moviéndome por los cursores de la pantalla con un FOR...NEXT... pero creo que así se ve mejor como va pasando de una posición a otra, aunque puede que lo incluya más tarde como otro ejemplo

Adjunto el archivo en PBP y la simulación en Proteus para quien quiera ver como funciona

**Recuerda que si quieres reproducir este ejemplo en un PIC tienes que añadir el cristal de 4MHZ y los condensadores. No los puse en la simulación por que Proteus me deja correr el programa solo configurando el micro, pero solo en la simulación

Saludos!!!

jueves, 18 de julio de 2013

Comunicación Serial, transmitiendo datos PIC a Visual Basic 6

Muy Buenas a todos y todas!!!

Después de actualizar a la versión 1.1 del programa CDLA, ahora le toca el turno al programa en Visual Basic 6 para controlar las locomotoras desde el PC.

Este programa ya transmitía datos desde el PC al PIC, ahora lo que quiero que haga es que lea el control manual y muestre en la pantalla del ordenador los datos que envía el microcontrolador.

Para esto he utilizado el objeto MSCOMM1 que ya trae Visual Basic 6 con la instrucción "MScomm1.input".

Intentare explicarlo un poco y espero que sea comprensible:

Enviando datos desde PIC a VB6

Los datos que se mandan desde el microcontrolador PIC son transmitidos a una velocidad de 9600 bauds y cada variable va separada por ",":


include "modedefs.bas"   'Activa el modo de comunicación

Masterout var portc.6

Serout portb.1, N9600, [#variable1,#variable2,#variable3,"AK"]

* La variable 1 es una variable tipo BYTE que va desde 0 a 255
* La variable 2 es una variable tipo BYTE que va desde 1 a 8
* La variable 3 es una variable tipo BIT que va desde 0 a 1

Con serialComunicator de Mecanique nos mostrará en pantalla los datos en el siguiente formato:

010AK 010AK 010AK.... (Variable1 = 0, Variable2 =1, Variable3 =0, AK)

12831AK 12831AK 12831AK... (Variable1 = 128, Variable2 =,3 Variable3 =1, AK)

Esta es la trama de datos que se envían desde el microcontrolador PIC y que tendremos que decodificar en VB6.


Obtención de datos en VB6

Ahora, ¿como extraemos de esa maraña de caracteres los datos que nos interesan?

Para obtener los datos tenemos la función .Input de MScomm. con el adquirimos los datos del cual luego iremos desgranando dato por dato.

La rutina que vamos a utilizar esta dentro de un timer como podemos ver en el siguiente ejemplo:


Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Dim dataIn, tdataIn, Vel, total As String
Dim C, T, N, X As Integer   'cantidad, tipo, numero, valor

Private Sub Command1_Click()
  Timer1.Enabled = True
  MSComm1.PortOpen = True
  Command1.Enabled = False
  Command2.Enabled = True
End Sub

Private Sub Command2_Click()
  Command1.Enabled = True
  Command2.Enabled = False
  Timer1.Enabled = False
  MSComm1.PortOpen = False
End Sub

Private Sub Form_Load()
  Timer1.Enabled = False
  Command1.Enabled = True
  Command2.Enabled = False
End Sub

Private Sub Timer1_Timer()

  dataIn = MSComm1.Input
  If dataIn <> "" Then ' Si no es un texto vacio entonces...
    tdataIn = Len(dataIn)
    
    If tdataIn = 7 And Right(dataIn, 2) = "AK" Then
      Text2.Text = (Right(dataIn, 2))
      Text1.Text = dataIn
    
      Vel = Mid$(dataIn, 1, 3)
      total = ""
      For X = 1 To Len(Vel)
        If InStr("0123456789", Mid$(Vel, X, 1)) Then
          total = total & Mid(Vel, X, 1)
          N = total
        End If
      Next X
    
      dataIn = (Right(dataIn, 4))
      C = Left(dataIn, 1)
    
      dataIn = Right(dataIn, 3)
      T = Left(dataIn, 1)
    
      Text3.Text = C
      Text4.Text = T
      Text5.Text = N
    End If
  End If
End Sub

  • Text1: Lectura de toda la trama de datos enviados por el PIC.
  • Text2: Lectura de los caracteres de confirmación (AK).
  • Text3: Lectura de la Variable2
  • Text4: Lectura de la Variable3
  • Text5: Lectura de la Variable1


El tema de como sacar el los números de una cadena, viene muy bien explicado y con varios ejemplos en este magnifico foro de Visual Basic.


Espero que les sea de ayuda para entender como comunicar un microcontrolador PIC 16F628 o 16F876A con un sistema Visual Basic 6

Saludos a todos y todas!!!

martes, 25 de diciembre de 2012

Control locomotoras 16F876A modelismo ferroviario HO parte 2

Con la ampliación de la maqueta, me he metido de lleno a mejorar el tema de la electrónica y aprovechar al máximo los micro controladores, y se me ocurrió, que podría hacer algo parecido al sistema DCC pero en analógico. Para mi esto significa tener una central (Master) y los demás dispositivos auxiliares (Slaves).

De esta manera espero poder tener un control mucho más personalizado para cada circuito.

Nunca había caído en la cuenta de poder usar arrays para mejorar el código y estoy bastante contento ya que con ellos he podido resumir el código y hacerlo más compacto y espero que eficiente.

La velocidad esta controlada por el potenciómetro, que es común para todas las locomotora. Bueno no es lo más correcto llamarlas locomotoras, en realidad se refiere a cada circuito, ya que al ser analógico no alimento las locomotoras como en el sistema DCC, si no las vías.

Para entrar en el modo manual se pulsa 1, ya que en el montaje final la pantalla ira sobre el teclado. El modo PC aun no esta terminado así que ahora mismo no funciona.


Para seleccionar el circuito pulsaremos 1, 2 o 3 . Una vez dentro, aparecerá el número de circuito, la velocidad, y la dirección en la que va la locomotora situada en ese circuito. Para salir de ese circuito y volver al menú principal hay que pulsar "#"


martes, 18 de diciembre de 2012

Comunicación MAX485 PIC-PIC 16F876A

PIC 16F876a 20MHz

Bienvenidos a todos y todas!!!

Para la maqueta he decidido cambiar el sistema que utilizo en la comunicación entre PIC‘s.

Antes lo hacia directamente PIC a PIC, pero se me quedaba corto para poder añadir más microcontroladores.

Primero mire si se podía con un MAX232, pero tiene el problema de no ser multipunto, es decir que no se pueden conectar más de 2 microcontroladores así que no servía para mi propósito de poder crear módulo independientes.

Investigando un poco encontré el MAX485, que se adapta mejor al tipo de configuración que se utilizará finalmente.

Después de ver algunos ejemplos de libros y la web, he hecho este pequeño programa de comunicaciones con MAX485. El programa es un bucle que comunica un pic con el otro haciendo que se enciendan la luz verde cuando recibe el dato.

Si bien este programa es para 2 micros, la idea seria ir añadiendo más, (el MAX485 admite hasta 32 dispositivos). El mayor problema que estoy teniendo hasta ahora es el tema de la sincronización, ya que para que funcione, cuando enviamos un dato, tenemos que poner el control bajo, es decir, el pin que hayamos seleccionado tiene que estar en LOW para poder recibir y el HIGH para poder transmitir.

Código para microcontrolador principal:


'PRINCIPAL

define LOADER_USED 1   
DEFINE OSC 4
include "modedefs.bas"   'Activa el modo de comunicación
ADCON1=6 

rojo    var portb.1
verde   var portb.0 
control var portc.0
entrada var portc.6
salida  var portc.7 


dato var byte
repet var byte

'para saber que el pic esta encendido
high rojo : high verde
pause 1000
low rojo : low verde

Estado:
  low control
  serin entrada,T2400,dato
  if dato = "E" then 
    high verde
    pause 250
    low verde
    pause 250
    goto enviando
  endif
goto estado

enviando:
  for repet = 1 to 10
    high control
    serout salida,T2400, ["D"]
  next
  high rojo
  pause 250
  low rojo
goto estado

end

Código para microcontrolador secundario:


define LOADER_USED 1   
DEFINE OSC 4
include "modedefs.bas"   'Activa el modo de comunicación
ADCON1=6 

rojo    var portb.1
verde   var portb.0 
control var portc.0
entrada var portc.7
salida  var portc.6 

cnt var bit 
dato var byte
repet var byte

'para saber que el pic esta encendido
high rojo : high verde
pause 1000
low rojo : low verde


Enviando:
  for repet = 1 to 10
    high control
    serout salida,t2400, ["E"]
  next
  high rojo
  pause 250
  low rojo

Estado:
  low control
  serin entrada,T2400,dato
  if dato = "D" then 
    high verde
    pause 250
    low verde
    pause 250
    goto Enviando
  endif
goto Estado

end


Por otro lado también estoy barajando la posibilidad de utilizar HSERIN y HSEROUT, pero eso sera dentro de un tiempo ya que ahora estoy un poco liado con la navidad y el trabajo.

También me gustaría poder hacer un ejemplo con más microcontroladores, pero como he comentado tendrá que ser un poco más adelante.

Saludos a todos y todas y felices fiestas!!!

martes, 16 de octubre de 2012

Control de Locomotoras DC con VB6 y PBP

Muy buenas a todos y todas los amantes de la programación y los trenes a escala!!!

Ya tengo preparado el control para las locomotoras de los tres circuitos que componen mi maqueta.

Realizado en Visual Basic 6, controla 3 locomotoras o 3 circuitos independientes, con todas sus funciones, Avance, Retroceso y Parada.

Control de velocidad hasta 127 pasos. Subida y bajada progresiva de velocidad independiente y parada de emergencia.

El manejo de cada locomotora es totalmente independiente con una parada de emergencia común para todas.

Todas las funciones son configurables: Tiempos entre pasos en las detenciones y cambios de sentidos, tiempo entre pasos de la subida y bajada progresiva con su velocidad máxima independiente.

El programa también controla hasta 7 desvíos. Los desvíos están ordenados para mi maqueta, en mi caso 5 desvíos y 2 auxiliares, que pueden ser desvíos o luces o lo que se quiera.

Las comunicaciones corren por parte del puerto COM, y puedes configurar el puerto y la velocidad de transmisión del puerto serial.

El receptor de todos estos datos es un PIC 16f876A, bueno en este caso de dos, un master, que es el que recibe toda la información y la reenvía a otro 16f876A.

Esto es gracias a sus 2 salidas HPWM y un PWM aparte, controlan la velocidad de las tres locomotoras.

PIC Master 16f876A

  • Recibe los datos desde el PC a 9600 baudios y los reenvía al PIC secundario en modo PC.
  • Recibe los datos del secundario y los muestra en la pantalla en modo Manual.
  • Pantalla LCD 16x2 donde se muestra la velocidad y los desvíos.
  • Teclado para el control manual.
  • Salida para 7 desvíos

PIC secundario 16F876A

  • Recibe los datos del PIC principal en modo PC
  • Envía datos al PIC principal en modo manual
  • Controla los 3 relés para el cambio de dirección
  • Controlas las 3 salidas PWM (2 HPWM y 1 PWM)
  • Pequeño teclado de 2x3 para el control de dirección
  • 3 Potencíometros para el control manual

En los esquemas en proteus, la mayoría de motores y relés los he sustituido con LED´s y en el programa en PBP están comentadas las lineas que se refieren al HPWM y PWM porque al hacer la simulación hacían que mi portátil parezca una tostadora.

En la aplicación practica es el mismo que tengo montado en mi maqueta funciona muy bien.

Los desvíos son movidos por un integrado ULN2003.

El modulo de tracción corre a cargo de 3 transistores de tipo Darlington TIP110.

Esto da un resultado de paradas y arranques bastante suaves y se mantiene muy bien con las locomotoras a bajas velocidades.

Todo esto esta hecho en placas individuales:

Para poder incluir otro tipo de circuitos y en caso de rotura poder sustituir los componentes de una manera cómoda.


Les mantendré informados de las próximas novedades!!! Saludos!!!

viernes, 25 de mayo de 2012

Mis programas imprescindibles !!!

Esta entrada se me ha ocurrido porque he tenido que formatear y volver a instalarlo todo otra vez... Esta es una tarea algo tediosa y aburrida, de hecho la hago a ratos.

Primero lo mejor para no tener sustos es hacer un BACKUP de todo lo que sea importante para nosotros. En mi caso poco, ya que este ordenador solo lo uso para navegar y programar, para ver películas, guardar fotos y todo eso uso el de casa que es más potente.

Empecemos:

Un windows XP de modo desatendido. Es lo más rápido y fácil. Lo mejor (si dispones de otro pc) es simularlo con algún programa como Virtual Box. La mayoría viene con un montón de programas tipo VLC, Codec´s, CCleaner, y algún antivirus. Los podéis encontrar en CD y DVD, normalmente vienen en formato .ISO. En mi caso prefiero los CD, hay menos posibilidad de malware. Bien una vez lo tengas comprobado pasas a copiarlo en su correspondiente formato con algún programa como Nero.


Con la instalación limpia y todos los Drivers de tarjetas y vídeo, lo primero es un antivirus, Avast! antivirus es el que utilizo y no me da problemas. Otro muy recomendable es NOD32. Tampoco estaría de más algo como Ad-Aware free y Spyboot Seach &amp;amp; Destroy.

Y aquí empieza la "chicha".El orden es lo de menos, así que empezaremos:

Microcode Studio de Mecanique


Es el editor de código para Pic Basic Pro, entre otras cosas resalta el código con ayuda contextual. También resalta todos los define, los alias, variables y modificadores. También permite el cortar, pegar, deshacer, búsqueda etc.
Al compilar también identificará y corregirá los errores y tiene soporte para MPASM.


Proteus 7 Profesional

Proteus es una potente herramienta para simular circuitos electrónicos tanto digitales como analógicos, con el puedes crear proyectos sencillos como apagar y encender un LED o simular los programas que crees con  Microcode Studio.

Para mi este tipo de software es imprescindible ya que con el se ahorra gran cantidad de tiempo, ya que con unos simples clics podremos simular casi cualquier circuito. Entre otras cosas Proteus incluye, Microcontroladoes, pantallas LCD, osciloscopio, conexión con puerto COM, LPT;


Virtual Serial Port Driver de Eltima Software


Virtual serial Port, es una sencilla herramienta para simular pares de puertos COM.
Tiene compatibilidad completa con el control de HandFlow (hardware y Xon/off),
También tiene diferentes configuraciones como estandar, bucle o personalizado.
Los puertos una vez configurados se vuelven a crear al reiniciar el sistema
Este programa es casi imprescindible si estas trabajando con Proteus y Visual Basic sobre todo si estas probando la comunicación con el puerto COM.

Descargar Virtual Serial Port de Eltima Software


Visual Basic 6.0 (Visual Studio 6)

Visual Studio 6 es la ultima versión de basic que no trabaja sobre .NET y la ultima en correr en un windows 9x. También es la ultima versión en incluir Visual Basic basado en component objet model y aunque las versiones posteriores incorporan una versión muy diferente del lenguaje con muchas mejoras (fruto de la plataforma .NET), para empezar y como lenguaje más bien simplón, podremos hacer casi cualquier programa que imaginemos.
Aunque si lo que quieres es aprender programación creo que seria mejor que empezaras con C o Phyton, en mi caso y al ser por hobby, con Visual Studio 6 obtengo muy buenos resultados.

Inkscape

Inkscape, es un editor de gráficos vectoriales de código abierto, con capacidades similares a Illustrator, freehand, CorelDraw, usando el estándar de la W3C. El formato de este programa es SVG (Scalable Vector Grafic). Inkscape también soporta meta-datos Creative commons, edición de nodos, capas, operaciones complejas con trazos, vectorización de archivos gráficos, texto en trazos, alineación de textos, edición de XML directo y mucho más. Puede importar formatos como Postscript, EPS, JPEG, PNG y TIFF y exporta PNG así como otros formatos basados en vectores.


Descargar Inkscape ultima versión estable 0.48.2-1 

Lamentablemente y debido a como están las cosas, solo pongo los enlaces oficiales de los programas, ya que los demás son para uso personal podéis encontrarlos todos por las vías normales como torrent o e-mule e incluso en Taringa.

Espero que esta lista de programas os sean de ayuda, espero poder ampliarla con enlaces próximamente!!

Un saludo!!