Arduino como Retromódulo S88 / Arduin as S88 Feedback Module

ARDUINO COMO RETROMÓDULO S88

Es muy sencillo construir un retromódulo S88 utilizando un Arduino Uno. De hecho cualquier Arduino serviría, pero en aras de la simplicidad vamos a utilizar un Arduino Uno.

Hay que cargar el programa en el Arduino, conectarle 5 cables, alimentarlo y ya está funcionando.

 

ARDUINO AS S88 FEEDBACK MODULE

It is very easy to create a S88 feedback module using an ubiquitous Arduino Uno. In fact, any Arduino would serve well, but for the shake of simplicity we'll be using an Arduino Uno.

Upload the code, connect 5 wires to the indicated Arduino ports, power the module and that's all.

CABLEADO

S88
CLOCK
LOAD_PS
DATA_IN
DATA_OUT
GND

Sensores
Pines 8 a 13
Pines A0 a A5

 

WIRING

Arduino
pin 3
pin 4
pin 5
pin 6
GND

Sensors
Pins 8 to 13
Pins A0 to A5

Como la mayoría de los retromódulos S88 existentes, cada sensor se activa cuando su pin correspondiente se pone a potencial de masa (se conecta a GND)  

Like most S88 feedback modules, each sensor will be activated when its corresponding pin is put LOW (connected to GND).

EL PROGRAMA

Copie y pegue en Arduino IDE o descargue el archivo de más abajo.

 

THE CODE

Copy and paste into Arduino IDE or download the file .ino bellow.

 

/* Arduino as S88 feedback module with address assignment
 
 Code by German and Norber, Spain, November 2015.
 http://eliberia.es/digital
 Freely distributable for private, non commercial, use.
 
 Connections for S88 bus:
 s88 pin 1   DATA     to   ARD pin DATA_IN from previous Arduino in S88 chain
 s88 pin 2   GND      to   ARD GND
 s88 pin 3   CLOCK    to   ARD pin CLOCK,   externalInterrupt 1
 s88 pin 4   LOAD_PS  to   ARD pin LOAD_PS, pinChangeInterrupt
 s88 pin 6   Vdd+     to   ARD Vin
 s88 pin 1   DATA     to   ARD pin DATA_OUT from next Arduino in the S88 chain
 Note: The 'S88 chain' is defined from the last feedback module to the PC-interface
 
 12 occupancy sensors (activated when the pins are connected to GND):
   Pins 8 to 13   (six first sensors)
   Pins A0 to A5  (six last sensors)
 */

#define NUM_S88   0           // Number assigned to the first sensor reported from this feedback module
#define CLOCK     3           // Connect S88 CLOCK signal to Arduino pin3  - don't change this
#define LOAD_PS   4           // Connect S88 LOAD_PS signal to Arduino pin4
#define DATA_IN   5           // Connect S88 DATA from next S88 feedback module to Arduino pin 5
#define DATA_OUT  6           // Output DATA to next S88 feedback module or the PC interface to Arduino pin6


void setup() {
  pinMode(LOAD_PS, INPUT);
  pinMode(CLOCK, INPUT);
  pinMode(DATA_IN, INPUT);
  pinMode(DATA_OUT, OUTPUT);
  digitalWrite(DATA_OUT, LOW);
  for (int i = 8; i < 20; i++) {
    pinMode(i, INPUT_PULLUP);
  }
  attachInterrupt(1, clockS88, RISING);                      // pin3 = CLOCK    externalInterrupt 1
}

void clockS88()  {                                           // Rising edge CLOCK signal interruption 
  static byte cont;
  static int data;
  if (PIND & (1 << LOAD_PS)) {                               // Let's load my sensors info
    data = ~(((PINC & 0x3F)<<6) + (PINB & 0x3F));            // Load my sensors in 'data' (6 lowest bits of B and C ports)
    data = data & 0x0FFF;
    cont = 0;                                                // Start counter of data transmited
  }
  if (cont == NUM_S88) {                                     // Our turn: let's empty / shift / fill 'data'
    if (data & 0x01) PORTD |= (1<< DATA_OUT);                // Put in DATA_OUT the state of bit 'data0'
    else PORTD &= ~(1 << DATA_OUT);             
    data = data >> 1;                                        // Prepare (shift) 'data' for the next cycle   
    if (PIND & (1 << DATA_IN)) data = data | 0x0800;         // Put DATA_IN value in bit 'data11'
    }
  else {                                                     // Not yet our turn: just pass from IN to OUT
    if (PIND & (1<< DATA_IN)) PORTD |= (1 << DATA_OUT);      // Put in DATA_OUT the value of DATA_IN
    else PORTD &= ~(1 << DATA_OUT);                         
    cont++;                                                  // Update counter to continue waiting
  }
}

void loop() {
}

 

CÓMO FUNCIONA

Con este programa el Arduino emula perfectamente un retromódulo S88 típico, y añade una función extra no disponible en los montajes habituales: el número que identificará a cada sensor en el ordenador no dependerá de la posición física que ocupe este módulo en la cadena de retromódulos, sino que es un parámetro programable con ciertos límites.

Varíe simplement la primera línea de código efectivo, que es la que dice

 

HOW IT WORKS

With this code the Arduino will perfectly emulate an usual S88 feedback module, plus an extra feature usually not available in common feedback modules: the number each sensor will obtain from the computer is no necessarily dependent on the physical position this module occupies in the S88 chain, but will be a programmable parameter within certain limits.

Just vary the first line of effective code, the one saying 

#define NUM_S88 0

 

y substituya el 0 por el número de sensores que quiere que precedan a estos nuevos sensores en la cadena del S88.  

and substitute the 0 for the number of sensors you want to precede these new sensors in the S88 chain.

     
Por ejemplo: si ya tiene 2 retromódulos informado de, digamos, 16 sensores cada uno, su ordenador estará identificando probablemente el primero como sensor número 0 y el último como sensor número 31. Si quiere que su nuevo retromódulo Arduino aparezca como 'insertado' entre esos dos retromódulos preexistentes, pero sin tener que recablear el bus S88 para insertar físicamente el Arduino entre ambos, entonces puede conectar el Arduino al principio de la cadena (entre la interface con el ordenador y el primer retromódulo), y programarlo para 'dejar pasar' los primeros 16 sensores antes de informar de sus 12 propios. Es decir, puede asignar el 16 a NUM_S88.  

For example, if you already have 2 feedback modules reporting, let's say, 16 sensors each, your computer is probably identifying the first sensor as number 0 and the last one as number 31. If you want your new Arduino S88 feedback module to appear as 'inserted' between those two existing modules, but without the need of re-wiring your S88 bus as to physically insert it in between, you may connect the Arduino at the beginning of the chain (just next to the S88 interface to the computer), and program it to 'let pass' the first 16 sensors before reporting its 12 ones. That is, you may set the NUM-S88 as 16.

Entonces podrá ver sus primeros 16 sensores como de costumbre, pero los restantes 16 habrán sido desplazados 12 posiciones más atrás (empezarán ahora en el 28), porque el Arduino estará informando sobre sus nuevos 12 sensores como números 16 a 27. Es decir: ha sido insertado 'lógicamente' mientras que ha sido 'físicamente' conectado al final.  

Then you will see your former first 16 sensors as usual, but the remaining 16 sensors have been shifted 12 positions further (starting now from 28), because your Arduino is reporting the new 12 sensor it provides as numbers 16 to 27. That is: it has been 'logically' inserted while it's been 'physically' placed at the end.

Debido a la arquitectura inherente al bus S88 no es posible, sin embargo, más que desplazar 'lógicamente' hacia atrás los 12 nuevos sensores proporcionados por el Arduino, nunca hacia adelante.

 

Due to the inherent architecture of the S88 it is not possible, however, you can 'logically' shift backwards these 12 Arduino reported sensors, but never anticipate them.

 

Por ejemplo: en el caso de antes, si inserta 'físicamente' el Arduino entre sus retromódulos S88 existentes, puede programar el Arduino asignado 0 a NUM_S88, de manera que los sensores del Arduino ocuparán su posición física en el bus (desde la 16 a la 27) y el resto vendrá después (de la 28 a la 43).  Pero puede, sin embargo, asignar el valor 10 a NUM_S88, de forma que el módulo deje pasar la información de 10 sensores antes de informar sobre los suyos propios. Es decir, en el ordenador aparecerán 16+10=26 sensores antiguos en su sitio (del 0 al 25), luego 12 nuevos sensores (los del Arduino, números 26 a 37), y finalmente los 6 sensores restantes (del 38 al 43). Esto tiene como efecto desplazar 'lógicamente' hacia atrás 10 posiciones los nuevos sensores de Arduino. No intente programar un número negativo en NUM_S88: no funcionará!

   

For example: in the case above, if you 'physically' insert the Arduino between your two existing S88 feedback modules, then you may program the Arduino with NUM_S88 as 0, so Arduino sensors will be reported in its physical position (from 16 to 27) and the rest will come after (from 28 to 43). You may, however, set NUM_S88 as 10, so the module will let pass the information concerning 10 sensors before reporting the ones it controls. That is, you will get in the computer your 16+10 = 26 first old sensors in place (from 0 to 25), then 12 new sensors (from Arduino, numbers 26 to 37), and your remaining 6 sensors at the end (from 38 to 43). This has the effect to 'logically' shift backwards 10 positions the new Arduino sensors. Don't try to program a negative number in NUM_S88: it won't work!

IMPORTANTE

 

IMPORTANT

1. Si sitúa un Arduino al final del bus S88, entonces debe conectar su pin5 a masa (GND) para decirle al Arduino que no espere recibir ningún dato por ahí.

   

1. If you place an Arduino at the end of the S88 bus, connect pin5 to GND (as to tell Arduino it should not be expecting any data coming that way).

2. Los pines del Arduino envejecen y se estropean rápidamente. Si experimenta parpadeos de sensores en el ordenador mejore las conexiones.

   

2. Arduino pins tend to worn out very quickly. Improve connections if you experience flickering of sensors on your PC screen.


Imprimir