0

Mi librería DCCpp

Buenas a todos! Hasta ahora no me habia puesto a diseccionar la librería o una lista actualizada tanto del software como del hardware.

Ahora mismo esta funcionando y la verdad que bastante bien. Para explicar un poco más sobre su configuración ya que el montaje esta definido en la entrada que dedique para el arduino MEGA

Librería DCCpp archivo config.h

El archivo config.h esta modificado para poder utilizar la pantalla la oled y el pin del sonido. En este archivo podemos cambiar la dirección de la pantalla oled y para saber este dato al final del articulo pondré un escaner Ic2 que encontre por ahí, pondría el enlace, pero no me acuerdo de donde salio. También podemos cambiar el pin al que podemos conectar un pequeño buzzer pero es algo que tengo a medio terminar.

// DEFINE LA DIRECCION DEL LA PANTALLA OLED SSD1306 I2C
#define OLED_ADDRESS 0x3C
#define OLED_NAME "SSD1306"

// DEFINE EL PIN PARA EL ALTAVOZ BUZZER
#define PIN_SOUND 6

Librería DCCpp archivo DCCpp.h

Este archivo es el encargado de hacer funcionar todo el conjunto, en el se activan la memoria interna, desvíos, sensores, pantalla, etc… Podemos activar o desactivar estas funciones comentando o descomentando las lineas que queramos tener activos que, en mi caso, es casi todo.


#define USE_TURNOUT          // Desvios
#define USE_EEPROM           // Memoria interna
#define USE_OUTPUT           // Salidas
#define USE_SENSOR           // Sensores
#define USE_TEXTCOMMAND      // Comunicación por puerto serial USB
// #define DCCPP_DEBUG_MODE  // Muestra Información en pantalla
#define USE_BLUETOOTH     // Solo funciona si USE_TEXTCOMMAND esta activado Serial1
// #define USE_SERIALAUX     // Entrada Serial auxiliar
#define USE_OLED             // Pantalla OLED 128x64 i2C 
// #define USE_LCD           // Pantalla LCD 16x2 i2C 
// #define USE_SOUND         // Buzzer sonidos varios

Para usar el Bluetooth hay que tener activado el #define USE_TEXTCOMMAND si no, no funcionará la comunicación serial por Bluetooth.

Archivo SerialDCCpp.ino

Este archivo es el archivo que se tiene cargar al Arduino desde el IDE ( u otra opción que esteis usando) . Es un archivo bastante sencillo que lo unico que hace es cargar los puertos seriales, iniciar la librería y el inicio de las lineas principales y de programación.

#include "DCCpp.h"

void setup()
{
  Serial.begin(115200);   // Inicia la comunicación serial USB
  Serial1.begin(115200);  // Inicia la comunicación serial para Bluetooth ( SOLO MEGA)
  DCCpp::begin(); 
  DCCpp::beginMainMotorShield(); // Inicia la vía principal en Shield Ardumoto
  DCCpp::beginProgMotorShield(); // Inicia la vía de programación  en Shield Ardumoto
}

void loop()
{
  DCCpp::loop();  // Funcion del Loop principal
}

Antes de instalar la Librería es conveniente revisar los archivos comentados anteriormente para saber que esta todo bien, pero el archivo que considero más importante es el DCCpp.h que es el que habilita todo lo necesario para que el sistema funcione correctamente.

Por ejemplo, si esta no esta activado la memoria eeprom muy posiblemente no funcionen los desvíos o los sensores.

Puedes descargar el archivo con la librería modificada Librería DCCpp 1.4.1 o revisar la sección de descargas para ver este y otros proyectos.

Extras:

La librería modificada incluye soporte para Bluetooth, soporte para pantalla OLED de 128*64 comunicada por I2C con la central y un pequeño altavoz que avisa de diferentes acciones.

Bluetooth

El soporte para Bluetooth va separado de la comunicación serial con el PC usando el Serial1. De esta manera tenemos 2 maneras de introducir los datos y monitorear lo que pasa en la central en cualquiera de los dos puertos. La modificación se encuentra en el archivo TextCommand.cpp de la librería:

#ifdef USE_BLUETOOTH
  	while (BLUETOOTH.available()>0) {    // while there is data on the serial line
		c = BLUETOOTH.read();
		if (c == '<')             // start of new command
			commandString[0] = 0;
		else if (c == '>')          // end of new command
			parse(commandString);
		else if (strlen(commandString) < MAX_COMMAND_LENGTH)	// if commandString still has space, append character just read from serial line
			sprintf(commandString, "%s%c", commandString, c);	// otherwise, character is ignored (but continue to look for '<' or '>')
	}
#endif

El puerto serial se puede cambiar en el archivo DCCpp_Uno.h:

// Si hay instalado un HC-06 (Solo MEGA)	
	#ifdef USE_BLUETOOTH
	#define BLUETOOTH Serial1
	#endif

Cambiando Serial1 por el serial que queramos o que tengamos disponible. En la placa Arduino MEGA tiene hasta 4 puertos seriales aunque el puerto 0 llamado unicamente «Serial» es el que esta conectado directamente al convertidor de señal del USB.

Si conectamos el modulo Bluetooth en el Serial la central funcionará, pero tendremos el problema que cuando queramos cargar el archivo .ino al Arduino nos dará error. Por eso es muy recomendable usar #define BLUETOOTH si estas usando uno de estos módulos de comunicación.

OLED

Esta ha sido la parte más elaborada de la librería teniendo sus propios archivos OLED.h y OLED.cpp y modificaciones en los demás archivos de la propia librería.

La librería que utilizo para la pantalla es la de Adafruit: Adafruit_SSD1306.h y el archivo se puede configurar en la cabecera del archivo Oled.cpp

#define OLED_RESET 4
#define SCREEN_WIDTH 128 // ancho del display OLED, en pixels
#define SCREEN_HEIGHT 64 // alto del display OLED, en pixels
#define ACTUALIZA_INFO 250  // La pantalla se actualiza cada 250ms

#define OLED_RESET 4 es tal y como viene configurado de origen la pantalla

#define SCREEN_WIDTH y #define SCREEN_HEIGHT definimos el ancho y el alto de la pantalla que son 128 x 64 respectivamente.

y con #define ACTUALIZA_INFO cambiamos la tasa de refresco de la pantalla que por defecto esta puesta a 250ms.

Escaner I2C Arduino para dirección de pantalla

Para saber la dirección de la pantalla I2C se puede usar este código:

#include <Wire.h>
 
 
void setup()
{
  Wire.begin();
 
  Serial.begin(115200);
  while (!Serial);             // Leonardo: wait for serial monitor
  Serial.println("\nI2C Scanner");
}
 
 
void loop()
{
  byte error, address;
  int nDevices;
 
  Serial.println("Scanning...");
 
  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
 
    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
 
      nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Unknown error at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
 
  delay(5000);           // wait 5 seconds for next scan
}
(Visitado 35 veces, 1 visitas hoy)

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *