Archivo de la categoría: Arduino

Termómetro e Higrómetro con Arduino, DHT11 y LCD 16×2. Parte 1

Arduino UNO dht11 LCD 16x02

Recientemente, en el curso de Nuevas Tecnologías que he impartido en el Fablab Sevilla junto a Juan Carlos Pérez, al explicar Arduino y realizar una práctica con el sensor de humedad y temperatura DHT11, se me ocurrió montarme una pistola medidora con sus baterías autonómas y su pantalla, para poder realizar mediciones puntuales sobre el terreno.

La idea, como siempre, es hacerlo al mínimo coste posible, así que ahí vamos con la lista de la compra:

Arduino UNO compatible -> 3,5 €
Sensor de temperatura y humedad DHT11 -> 1,25 €
Display 16×2 -> 1,75 €
Interfaz 1602 I2C para LCD -> 1,5 €

TOTAL: 8 €*
*Faltaría el soporte de baterías, las baterías, cargador, interruptor…. que lo veremos en post sucesivos…

image

El primer paso es soldar la interfaz al módulo LCD. Son 16 pines, viene preparado para ello. Yo he añadido un poco de cinta de doble cara entre la interfaz y el LCD, para aislar de posibles cortos.

image

Con unos latiguillos conectamos el DHT11 y la interfaz. La interfaz la conectaremos a los pines SCL y SDA por un lado y GND y 5V por otro, para alimentarla. El DHT 11 al pin 2, a Vin o 3,3v y a GND. Ojo! Lo estamos conectando a Vin porque estamso alimentando por USB (de momento), cuando llegue el momento de colocar baterías externas veremos si Vin nos sigue siendo valido o no.

Ahora debemos descargar 2 librerías, la del sensor DHT11 y la del LCD del gran Paco Malpartida.

Descargar librería DHT11 desde 3DRC
Descargar librería LCD de F Malpartida desde 3DRC Descargar desde repositorio de F Malpartida

– Si teneis problemas para conectar el Arduino al PC y lo detecta como USB 2.0 dando error, es porque al ser clon no usa un chip FTDI, sino un CH3400. Teneis que instalar este driver.

Una vez instaladas las librerías y conectados sensor e Interfaz I2C, le cargamos este código:

#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#define DHTPIN 2 //Seleccionamos el pin en el que se conectará el sensor
#define DHTTYPE DHT11 //Se selecciona el DHT11
DHT dht(DHTPIN, DHTTYPE); //Se inicia una variable que será usada por Arduino para comunicarse con el sensor
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Seleccionamos la direccion del LCD I2C

void setup() {
Serial.begin(9600); //Se inicia la comunicación serial
dht.begin(); //Se inicia el sensor
lcd.begin(16,2); // inicializamos el lcd 16×2
}

void loop() {
float h = dht.readHumidity(); //Se lee la humedad
float t = dht.readTemperature(); //Se lee la temperatura

//Se imprimen las variables sobre el lcd
lcd.setCursor(0,0); //Start at character 0 on line 0
lcd.print(«Humedad: «);
lcd.print(h);
lcd.println(«% «);

lcd.setCursor(0,1); //Start at character 0 on line 1
lcd.print(«Temp: «);
lcd.print(t);
lcd.println(«*C   «);
}

y funcionando. En próximas entradas colocaremos las baterías y subiré el diseño de la carcasa para imprimirla.

Habréis observado que no hay decimales, sino valores 00. Es porque el DHT11 nos devuelve enteros. Tendremos que irnos al DHT22 y cambiar una línea en el código (#define DHTTYPE DHT22) para obtener mediciones más precisas y decimales. El precio, unos 6€.

Watson, un Robot imprimible por menos de 40 €

IMG_8604

Me apetecía mucho tener un robotito con ruedas para cacharrear un poco y que el enano su fuera hiciendo a él, pero los kits robóticos son caros, así que me puse con ello y decidí diseñarme mi propia plataforma. Ahora, aparte de un ahorro considerable, tengo un diseño modular que puedo ir modificando a mi antojo.

Mi diseño no es nada del otro mundo, de hecho me he basado en un diseño de los chinos y le he aplicado mis mejoras (ellos de hecho ya se habrán basado en otro diseño), así que busqué unas cuantas fotos en Google, y empecé a diseñar a partir de ahí.

Previamente, como sí tenía claro los motores y ruedas que iba a llevar, los pedí a una página china, buscando el precio más económico que encontré. Lo encontré en Banggood a unos 10$. ¿Por qué no me imprimí las ruedas? Porque necesitamos que sean de goma o patinan. Ya probé y el robot no agarra al moverse y girar.

Lo siguiente que necesitabamos era una electrónica. En mi caso he usado un Arduino Uno R3 que tenía por casa, pero un clon es barato en ebay. Por 5€ es nuestro.

El Arduino necesita conectarse a un shield para controlar los motores. Un shield no es más que una placa que se conecta al arduino por encima y le proporciona otras funciones. También tenía uno por casa, pero por menos de 6€ lo teneis en ebay.

Ya lo tenemos casi todo y nos hemos gastado 20€, por el momento. En esta primera versión he reciclado una batería que tenía por casa, pero voy a rediseñar alguna cogida para ponerle un portapilas. ¿Por qué? Porque no me gusta que el niño juegue con una lipo. Para vuestras pruebas la lipo es ok y es esta, de Hobbyking. Unos 6€ desde el almacén europeo.

IMG_8582En esta primera versión he instalado en el paragolpes delantero un sensor sharp infrarrojo de proximidad. Este sensor es un poco caro, pero funciona muy bien y es muy fiable. Para la revisión que le estoy haciendo voy a meter sensores de un par de euros, al menos 3, para que «vea» por los lados. Lo tenemos en ebay desde UK a unos 11€.

El resto es irnos a la ferretería y comprar tornillos M3, vamos a usar de 10, 15 y 25 mm. También algunas tuercas y ya estaremos listos para empezar a fabricar el chasis. Yo le añadí un interruptor normal y corriente, de cualquier tienda de electrónica. Es muy comodo para apagarlo y encenderlo.

Todo el proyecto lo he subido para descarga libre desde Thingiverse. Las dos partes del chasis las vais a encontrar en STL y en DXF. STL es para imprimirlo con la 3D, DXF es para cortarlo o fresarlo sobre material de 3mm. En mi caso lo he impreso, si lo cortais en CNC me contáis que tal.

IMG_8571
Imprimiendo el Chasis inferior en PLA
Chasis inferior terminado para prototiparlo
Chasis inferior terminado para prototiparlo

Si os fijais, el chasis tiene muchos menos agujeros que la versión que os podeis bajar. Para ir distribuyendo los distintos elementos parto de una base y luego la voy taladrando, una vez voy colocando cada elemento en su lugar mas idóneo realizo las modificaciones en el software de 3D, por eso entre las fotos que veis y la versión que vais a realizar puede haber algunas diferencias.

Una vez tenemos el chasis imprimimos las cogidas de los motores.

El chasis se llama chasis01.STL o chasis02.DXF, las cogidas de los motores se llaman soporte motor.STL y soporte motor2.STL, tenéis que imprimir 2 de cada uno.

Cogidas colocadas y dispuestas simulando su ubicación final
Cogidas colocadas y dispuestas simulando su ubicación final

 

Motores cogidos al chasis y ruedas colocadas
Motores cogidos al chasis y ruedas colocadas

Colocamos el arduino en el chasis y el shield por encima. Primero tendreis que coger con tornillos el Arduino al shasis y luego colocarle el shield. A los 4 motores tenéis que soldarle un par de cables a cada. Mirad la polaridad en las fotos o el robot andará loco. En los motores poned cable negro arriba y rojo abajo, en el shield los positivos por fuera y los negativos por dentro.

IMG_8585
Placa colocada y cableada

En paralelo imprimimos los separadores de 30mm, los pilares centrales y el paragolpes delantero y trasero y los atornillamos. Debemos colocar también el cable de alimentación en el conector lateral del shield.

Paragolpes
Paragolpes delantero

 

Paragolpes trasero
Paragolpes trasero
Pilar central
Pilar central

El sensor sharp lo podeis colocar con un poco de cola caliente en el paragolpes delantero. Ahora debeis conectarlo al Arduino. Se trata de un sensor analógico, en el caso del código que yo he subido debeis soldarlo al pin A5 (cable amarillo), de un pin de encima tomais la masa y de otro superior tomais el positivo. Si mirais 4 fotos más arriba se aprecia el conexionado.

Antes de cerrarlo vamos a programarlo. Hay que descargar la última versión del IDE de Arduino, conectamos, configuramos placa y puerto, abrimos el fichero .ino y lo subimos a la placa.
Es posible que os de un error al subirlo, se porque teneis que instalar la librería que nos va a permitir usar el shield. La podeis descargar aquí.

El código que podeis usar de partida es el siguiente:

#include <AFMotor.h>

AF_DCMotor motor1(1, MOTOR12_64KHZ); // create motor #1, 64KHz pwm
AF_DCMotor motor2(2, MOTOR12_64KHZ); // create motor #2, 64KHz pwm
AF_DCMotor motor3(3, MOTOR12_64KHZ); // create motor #1, 64KHz pwm
AF_DCMotor motor4(4, MOTOR12_64KHZ); // create motor #2, 64KHz pwm

int sensorPin = 5;    // pin del sensor
double sensorValue = 0;  // variable para almacenar los valores del sensor
int iTurnTime = 100; // milisegindos de cada giro
int c = 0;

void setup() {
Serial.begin (115200);
Serial.println («WatsonBot v1»);

motor1.setSpeed(120);     // set the speed to 255/255
motor2.setSpeed(120);     // set the speed to 255/255
motor3.setSpeed(120);     // set the speed to 255/255
motor4.setSpeed(120);     // set the speed to 255/255

}

void loop() {
if (iReadSensor() > 550) // a mayor valor menos distancia de deteccion
vBack();
else if (iReadSensor() < 550 && iReadSensor() > 250)
vTurnLeft();
else
vMoveFwd();

c = analogRead(sensorPin);       // lee valor del sensor
Serial.println(c);            // manda valor del sensor al serie
delay(100);                    // esperas y sigue

}

int iReadSensor() {
sensorValue = analogRead(sensorPin);
if (sensorValue != 0)
{
return sensorValue;
}
}

void vMoveFwd() {
motor1.run(FORWARD);
motor2.run(FORWARD);
motor3.run(FORWARD);
motor4.run(FORWARD);
}

void vTurnLeft() {
motor1.run(BACKWARD);
motor2.run(FORWARD);
motor3.run(FORWARD);
motor4.run(BACKWARD);
delay(iTurnTime);
}

void vStop() {
motor1.run(RELEASE);
motor2.run(RELEASE);
motor3.run(RELEASE);
motor4.run(RELEASE);
}

void vBack() {
motor1.run(BACKWARD);
motor2.run(BACKWARD);
motor3.run(BACKWARD);
motor4.run(BACKWARD);
}

El código se entiende con facilidad. Lo mejor es que lo trasteeis y modifiqueis a vuestro gusto, le cambieis los valores de detección del sensor y las velocidades de los motores, y defináis nuevos comportamientos.

Una vez lo programeis y veáis que funciona bien lo podeis cerrar, dejando la batería por fuera. En el paragolpes trasero hay un hueco, os servira para conectar el USB del arduino, por si lo programais de nuevo.

En un futuro próximo está montarle un sensor sigue líneas y sensores de detección más económicos. Iré actualizando tanto este post como el repositorio en Thingiverse con las modificaciones.

Update 01/04/2015

El medio 3dprint.com ha publicado un artículo acerca de Watson (Ver artículo). Es una gran alegría que esté gustando el robot de esta manera.

He aprovechado y le he hecho el soporte de la batería lipo y una tapa para tapar el compartimento de acceso al USB y los cables. Los STL están el repositorio de thingiverse.

image
Algunos usuarios de impresoras tipo prusa, con camas de 20×20 o algo inferiores me han pedido que adaptara el diseño a sus máquinas. He subido los dos chasis partidos en 2 con una pieza de union con tornillos M3.