Вы находитесь на странице: 1из 10

TUTORIAL REGLETA DE SENSORES SIXTEENLINE

Sixteenline es un arreglo de sensores que pueden ser leídos de manera digital o analógica; para
dicho fin, se emplea un multiplexor analógico con el cual se determina el sensor específico a ser
leído.

Pines Descripción
Vcc 3.3 a 5V
Gnd 0 V referencia
An Salida analógica de 0 a Vcc
Dig Salida digital 0/1
A/1
B/2 Entrada
C/3 Selector canal de multiplexor o sensor
D/4
Definición de pines

sensor
A/1 B/2 C/3 D/4
seleccionado
0 0 0 0 15
1 0 0 0 14
0 1 0 0 13
1 1 0 0 12
0 0 1 0 11
1 0 1 0 10
0 1 1 0 9
1 1 1 0 8
0 0 0 1 8
1 0 0 1 6
0 1 0 1 5
1 1 0 1 4
0 0 1 1 3
1 0 1 1 2

1
0 1 1 1 1
1 1 1 1 0
Tabla de verdad del multiplexor

Dimensiones, agujeros compatibles con la regleta qtr-8A/RC de pololu

Peso: 5g

¿Cómo utilizar la regleta de sensores sixteenline?


Para realizar la prueba de la regleta será necesario tener a nuestra disposición los siguientes
elementos:

> Arduino nano

> Pantalla OLED I2C

> Regleta SixteenLine.

> Cables varios.

Teniendo esto listo, se procede a realizar el montaje como se muestra en la siguiente imagen.

2
Esquema de prueba rápida.

Se debe energizar entre VCC y GND con un voltaje de 3.3V a 5V, como se muestra en el anterior
esquema; de esta manera el voltaje digital de salida por el pin Dig será el mismo de alimentación;
mientras que la salida analógica (An) tendrá valores de entre 0v a VCC.

Se utiliza la multiplexación de las señales para disminuir el uso de pines, de tal modo que solo se
puede leer la señal de un sensor a la vez. Para tal fin, se debe seleccionar el sensor mediante los
pines (1, 2, 3, 4), teniendo en cuenta que solo se reconocen valores de 1 (HIGH) o 0 (LOW) digitales
y de esta manera se construye la dirección poniendo en nivel 1 o nivel 0 según corresponda en la
tabla de verdad. Es decir, que si se quiere leer el valor analógico y el valor digital del sensor 15, se
debe colocar 1=LOW, 2=LOW, 3=LOW, 4=LOW, para el sensor 14 será 1=HIGH, 2=LOW, 3=LOW,
4=LOW, y así sucesivamente.

De esta manera, para hacer la programación más fácil, se crea una función con los pines como un
arreglo, de esta manera se enviará el número 0, 1, 2… etc según corresponda y la función se
encargará de poner los pines respectivos en alto o en bajo.

Para realizar la prueba rápida de la regleta, será necesario descargar e instalar las siguientes librerías
en arduino IDE.

>Adafruit SSD1306-master (https://github.com/adafruit/Adafruit_SSD1306)

>Logos.h ( )

Una vez instaladas la librerías, se debe realizar un nuevo sketch con el siguiente código para la
detección de la dirección de la pantalla OLED, esto debido a que la comunicación I2C requiere una
dirección de dispositivo, de otra manera, la pantalla oled no funcionara. (Recuerda tener el montaje
realizado para el correcto funcionamiento de los códigos a probar)

3
Copia y pega el código que aparece a continuación.
// --------------------------------------
// i2c_scanner
// Version 6, November 27, 2015.
// Added waiting for the Leonardo serial communication.
//
// This sketch tests the standard 7-bit addresses
// Devices with higher bit address might not be seen properly.

#include <Wire.h>

void setup(){
Wire.begin();
Serial.begin(9600);
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
}

4
Una vez hecho esto, se puede subir, teniendo en cuenta que el programa está configurado para el
arduino nano.

Placa Arduino nano


Procesador Atmega328p
:
Puerto: Este, es el puerto que le ha asignado el computador al arduino, por lo que puede
variar y no ser el mismo que nosotros estamos usando.

5
Tan pronto se ha cargado el código en el arduino, se procede a abrir el monitor serial como se
muestra en la siguiente imagen, ahí se mostrara la dirección de la pantalla OLED (para nuestro caso
es la dirección 0x3C), la cual se usara en el siguiente programa.

Con lo cual se abrirá la siguiente ventana, donde se puede ver la dirección que el programa ha
detectado.

6
Copiamos esta dirección y la colocamos en la configuración de los pines del arduino como se
muestra a continuación.

A0 An
A1 Dig
A2 Pin 1
A3 Pin 2
D4 Pin 3
D7 Pin 4

7
Teniendo en cuenta la dirección de la pantalla OLED, puedes proceder a copiar y pegar el código en
tu sketch.
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Logos.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels


#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)


#define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define NUMFLAKES 10 // Number of snowflakes in the animation example

#define imageWidth 128


#define imageHeight 64

int sensorPin = A0; //Seleccion de pin analógico a ser leido


int sensorValue = 0; //Variable que captura el valor analógico del sensor
int ValueFinal = 0; //Variable a ser mostrada en la OLED
int i=0; //Variable incremental para el muestreo de los sensores.
int buttonState=0;
int k=0; //Variable que para la seleccion del sensor
correspondiente.

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

// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally


if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
pinMode(A1, INPUT);
pinMode(A2, OUTPUT);
pinMode(A3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(7, OUTPUT);

drawbitmap();
sixteenline();
}

void drawbitmap(void) { ///Función que imprime el logo ja-bots


display.clearDisplay();
display.drawBitmap(0,0,bitmap, 128, 64, 1);
display.display();
delay(2000);
}
void sixteenline(void) { ///Función que imprime el texto "SIXTEENLINE"
display.clearDisplay();
display.drawBitmap(0,0,SIXTEENLINE, 128, 64, 1);
display.display();
delay(2000);

8
}

void lectura(int k) { //Función para la selección del sensor especifico.


switch (k) {
case 15: digitalWrite(A2, LOW);digitalWrite(A3, LOW);digitalWrite(4,
LOW);digitalWrite(7, LOW);break;
case 14: digitalWrite(A2, HIGH);digitalWrite(A3, LOW);digitalWrite(4,
LOW);digitalWrite(7, LOW);break;
case 13: digitalWrite(A2, LOW);digitalWrite(A3, HIGH);digitalWrite(4,
LOW);digitalWrite(7, LOW);break;
case 12: digitalWrite(A2, HIGH);digitalWrite(A3, HIGH);digitalWrite(4,
LOW);digitalWrite(7, LOW);break;
case 11: digitalWrite(A2, LOW);digitalWrite(A3, LOW);digitalWrite(4,
HIGH);digitalWrite(7, LOW);break;
case 10: digitalWrite(A2, HIGH);digitalWrite(A3, LOW);digitalWrite(4,
HIGH);digitalWrite(7, LOW);break;
case 9: digitalWrite(A2, LOW);digitalWrite(A3, HIGH);digitalWrite(4,
HIGH);digitalWrite(7, LOW);break;
case 8: digitalWrite(A2, HIGH);digitalWrite(A3, HIGH);digitalWrite(4,
HIGH);digitalWrite(7, LOW);break;
case 7: digitalWrite(A2, LOW);digitalWrite(A3, LOW);digitalWrite(4,
LOW);digitalWrite(7, HIGH);break;
case 6: digitalWrite(A2, HIGH);digitalWrite(A3, LOW);digitalWrite(4,
LOW);digitalWrite(7, HIGH);break;
case 5: digitalWrite(A2, LOW);digitalWrite(A3, HIGH);digitalWrite(4,
LOW);digitalWrite(7, HIGH);break;
case 4: digitalWrite(A2, HIGH);digitalWrite(A3, HIGH);digitalWrite(4,
LOW);digitalWrite(7, HIGH);break;
case 3: digitalWrite(A2, LOW);digitalWrite(A3, LOW);digitalWrite(4,
HIGH);digitalWrite(7, HIGH);break;
case 2: digitalWrite(A2, HIGH);digitalWrite(A3, LOW);digitalWrite(4,
HIGH);digitalWrite(7, HIGH);break;
case 1: digitalWrite(A2, LOW);digitalWrite(A3, HIGH);digitalWrite(4,
HIGH);digitalWrite(7, HIGH);break;
case 0: digitalWrite(A2, HIGH);digitalWrite(A3, HIGH);digitalWrite(4,
HIGH);digitalWrite(7, HIGH);break;
}
}

void loop() { // Codigo principal a ser repetido indefinidamente.


display.clearDisplay(); // Limpia el buffer de la pantalla
display.fillRect(0, 2, 128, 61, SSD1306_WHITE);
for(i=0; i<=15; i++) {
lectura(15-i);
sensorValue = analogRead(sensorPin);
ValueFinal=(61-sensorValue*(61/1023.0));
display.fillRect((i*8), 3, 8, ValueFinal, SSD1306_BLACK);//coordenada en x,
coordenada en y, ancho del rectangulo, altura del rectangulo, color
display.drawRect((i*8), 2, (8+i*8), 61, SSD1306_BLACK);//coordenada x1,
coordenada y1, coordenada x2, coordenada y2, color.
}
display.display(); // Actualiza la pantalla con los valores cargados.
}

9
Ahora puedes compilar y cargar el programa, si todos los pasos se siguieron correctamente,
podrás ver en la OLED como se muestra a continuación.

10

Вам также может понравиться