Controlar motor CD con Python en Raspberry Pi y módulo Puente H

En este artículo vemos cómo se puede controlar un motor de corriente directa (CD) con el lenguaje de programación Python en una Raspberry Pi (1 a 3) a través de un módulo Puente H.

Material

1 Raspberry Pi 1, 2 ó 3.
1 Módulo Puente H Dual L293D.
1 Motor CD.
1 Fuente de energía de 6V para el módulo Puente H.
1 Fuente de energía para la Raspberry Pi.
Cables de conexión.

Raspberry Pi 3B

Para este artículo se usó la tarjeta Raspberry Pi 3 modelo B, aunque se puede usar también lo modelos 1 ó 2.

Módulo Puente H dual L293D

El módulo Puente H dual usado tiene el circuito integrado L293D y permite controlar dos motores en ambas direcciones.

Conexiones

En la siguiente figura se muestran las conexiones hechas usando solamente una fuente de poder, que alimenta primera el módulo Puente H y éste a su vez proporciona 5V a la tarjeta Raspberry Pi.

Programa

El programa está escrito en Python.


# Programa: motor.py
# Autor: Julio Sandria - Diciembre 2017
# Mueve un motor CD a traves de un modulo puente H

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)

GPIO.setup(8, GPIO.OUT)
GPIO.setup(10, GPIO.OUT)

for i in range(5):
   # Gira el motor en un sentido durante 3 segundos
   print "Girando motor en un sentido"
   GPIO.output(8, GPIO.HIGH)
   GPIO.output(10, GPIO.LOW)
   time.sleep(3)

  # Gira el motor en el otro sentido durante 3 segundos
   print "Girando motor en sentido contrario"
   GPIO.output(8, GPIO.LOW)
   GPIO.output(10, GPIO.HIGH)
   time.sleep(3)

GPIO.cleanup()

 

Conectar dos Lego Mindstorms EV3 en modo Daisy-Chain

En este artículo se explica cómo conectar dos bloques inteligentes Lego Mindstorms EV3 en cadena (Modo Daisy-Chain), lo cual permite desde un bloque EV3 monitorear sensores y controlar motores de otros tres bloques EV3. Con un sencillo programa se muestra cómo desde el primer bloque EV3 se mide proximidad con un sensor infrarrojo conectado al segundo bloque EV3, y al presionar un sensor de contacto conectado al primer bloque, se acciona un motor mediano conectado al segundo bloque. Todo esto con un único programa cargado en el primer bloque EV3.

Introducción

El software Lego Mindstorms EV3 (Home o Education) permite hacer programas que manipulen hasta cuatro bloques EV3 conectados en cadena, activando el Modo Daisy-Chain que está en Propiedades del Proyecto.

Conexión en cadena. En este modo de conexión cada dispositivo se conecta al anterior y al posterior geográficamente, formando una cadena. A este modo de organización se le conoce también como daisy-chain (cadena margarita) [1].

Con esto es posible hacer un sistema robótico con cuatro Lego Mindstorms EV3 usando hasta 16 sensores y 16 motores.

Material

2 Bloques inteligentes Lego Mindstorms EV3.
2 Cables USB para EV3.
1 Sensor de contacto EV3.
1 Sensor infrarrojo EV3.
1 Motor mediano EV3.
1 Computadora con software Lego Mindstorms EV3 instalado.

Conexiones

Para usar el programa que se muestra posteriormente, se colocaron los dos bloques EV3, sensores y motor como se ilustra en la fotogravía siguiente:

Bloque 1 (EV3 de la izquierda)

  • Puerto mini USB (lado superior) a PC.
  • Puerto USB (lado izquierdo) al mini USB del Bloque 2.
  • Puerto de entrada 1 al sensor de contacto.

Bloque 2 (EV3 de la derecha)

  • Puerto mini USB (lado superior) al USB del Bloque 1.
  • Puerto de entrada 4 al sensor infrarrojo.
  • Puerto de salida A al motor mediano.

Programa

Asegúrate de tener encendidos ambos bloques EV3, el Bloque 1 (izquierdo) conectado a la computadora, los sensores y motor conectados a los bloques EV3 como se indica en el punto Conexiones.

Inicia el software Lego Mindstorms EV3 (Home o Education). Crea un nuevo proyecto, el cual puedes llamar Conectar 2 EV3. Abre la pestaña Propiedades el proyecto y haz clic en la casilla de verificación Modo Daisy-Chain.

Regresa a la pestaña Program, y agrega los bloques de programación como se muestra en la imagen siguiente.

Observa que en la esquina inferior derecha, al hacer clic en el icono Vista del Puerto , se puede seleccionar de qué Bloque EV3 se desean ver los puertos. En la imagen siguiente está seleccionada la pestaña Capa del bloque 2, mostrando lo que tiene conectado el Bloque 2, un motor mediano en el Puerto A y un sensor infrarrojo en el Puerto 4.

El siguiente pseudocódigo explica lo que hace el programa:

Repetir siempre (Bucle):

Si el sensor de contacto (Bloque 1, Puerto 1) es presionado:

Muestra en la pantalla la imagen Touch sensor.
Reproduce el sonido Activate.
Gira el motor mediano (Bloque 2, Puerto A) una rotación.

Si no

Lee proximidad del sensor infrarrojo (Bloque 2, Puerto 4).
Muestra en la pantalla el valor de proximidad.
Hace una pausa de 0.2 segundos.

Fin Si

Fin Repetir

El programa se ejecuta en el Bloque 1, por lo tanto, todos los bloque de programación se ejecutan en el Bloque 1, y solamente los bloques de programación en los que se puede especificar una tarea sobre un Bloque EV3 en particular, tienen un campo llamado Número de capa, el cual se refiere al número de Bloque EV3 conectado en cadena.

A continuación se describe cómo están configurados los bloques de programación que permiten especificar un Bloque EV3 en particular.

Interruptor. En este bloque se tienen que configurar las opciones como se muestra en la imagen siguiente.

Motor mediano. En este bloque se tienen que configurar las opciones como se muestra en la imagen siguiente.

Sensor infrarrojo. En este bloque se tienen que configurar las opciones como se muestra en la imagen siguiente.

Ejecutar programa

Primero, enciende ambos bloques EV3. Conecta el Bloque 1 (EV3 de la izquierda) a la computadora y descarga el programa al EV3.

Una vez terminada la descarga del programa en el Bloque 1, ejecuta el programa. Acerca algo al sensor infrarrojo y observa cómo cambia el número en la pantalla del Bloque 1. Oprime el sensor de contacto y observa la imagen de la pantalla del Bloque 1, escucha el sonido que reproduce y observa que el motor mediano gira una rotación.

En el Bloque 2 (EV3 de la derecha) no es necesario cargar algo en particular, solamente debe estar encendido para que el Bloque 1 opere el sensor y motor conectados en él.

Dónde comprar

Si deseas adquirir un paquete completo Lego Mindstorms EV3 o solamente el bloque inteligente EV3, o algún sensor o motor, puedes buscar con nuestro patrocinador RobotSA.

Referencias

[1] Sanchís, Enrique (2002). Sistemas electrónicos digitales: Fundamentos y diseño de aplicaciones. Universitat de València. Pag. 33

Crea tu primera aplicación Android con App Inventor

El interés por crear esta guía de programación, nació por la necesidad de documentar parte del trabajo que se hace en el Instituto de Robótica de Xalapa A.C. (en Xalapa, Veracruz, México), en los cursos y talleres de robótica para niños, jóvenes y adultos. Y para ofrecer una guía en español para nuestras nuevas generaciones de niños y jóvenes ávidos por aprender cosas nuevas.

Este documento está dirigido a las personas que quieren aprender a crear aplicaciones para dispositivos móviles, ya sea teléfonos celulares o tabletas, con el sistema operativo Android. Se usa el ambiente de programación visual MIT App Inventor, que es muy fácil de usar y está disponible en línea sin costo alguno. Se ejemplifica el uso de App Inventor para crear una sencilla aplicación que mostrará en la pantalla del móvil la frase ¡Hola Mundo!, con la cual se empieza en muchos cursos de programación de computadoras, en diversos lenguajes de programación, especialmente el lenguaje C.

Technical Report · Sep 2017
DOI: 10.13140/RG.2.2.30688.99841
PDF disponible en: https://www.researchgate.net/publication/320014500

Robot Sanduino controlado via Bluetooth con Android

Robot Sanduino A01 con Bluetooth

En esta entrada mostramos como conectar un robot Sanduino A01 (basado en Arduino UNO) con módulo bluetooth a un teléfono Android, utilizando una aplicación creada por nosotros mismos.

Para esto necesitaremos el programa MIT App Inventor 2

DescargaAplicación en Linea

Y la libreria SoftwareSerial para Arduino

SoftwareSerialLibrary

Conexión del módulo Bluetooth a la placa Arduino


#include <SoftwareSerial.h>

int estado=0;
int multi=0;
#define RxD 10
#define TxD 11
SoftwareSerial BTSerial(RxD, TxD);
  

void setup(){
  Serial.begin(9600);
  BTSerial.flush();
  delay(500);
  BTSerial.begin(9600);
  //Insertar aquí
}

void loop(){
  if(BTSerial.available()>0){
    estado = BTSerial.read();
    Serial.write(estado);
    Serial.print("\r\n");
    //Insertar aquí
  }
}

Para controlar el robot Sanduino


#include <SoftwareSerial.h>

int tRetrocede = 500;
int tAvanza = 50;
int tAlto = 40;
int tGiro = 70;

int estado=0;
int multi=0;
#define RxD 10
#define TxD 11
SoftwareSerial BTSerial(RxD, TxD);
  
void setup(){
  Serial.begin(9600);
     BTSerial.flush();
  delay(500);
  BTSerial.begin(9600);

  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
  
}

void loop(){
  if(BTSerial.available()>0){
    estado = BTSerial.read();
    Serial.write(estado);
    Serial.print("\r\n");
    digitalWrite(9,HIGH);
  }
  if (estado == '1') {
    avanza(100);
    Serial.print("Avanza");
  }
  if (estado == '2') {
    derecha(100);
    Serial.print("Derecha");
  }
  if(estado == '3') {
    retrocede(100);
    Serial.print("Retrocede");
  }
  if(estado == '4') {
    izquierda(100);
    Serial.print("Izquierda");
  }
  if(estado == '5') {
    alto(0);
    Serial.print("Alto");
  }
}

void alto(int ms) {
  digitalWrite(6,LOW);
  digitalWrite(7,LOW);
  digitalWrite(8,LOW);
  digitalWrite(9,LOW);
  delay(ms);
}

void derecha (int ms) {
  digitalWrite(6,HIGH);
  digitalWrite(7,LOW);
  digitalWrite(8,LOW);
  digitalWrite(9,HIGH);
  delay(ms);
}
void izquierda (int ms) {
  digitalWrite (6, LOW);
  digitalWrite (7, HIGH);
  digitalWrite (8, HIGH);
  digitalWrite (9, LOW);
  delay (ms);
}
void avanza (int ms) {
  digitalWrite (6, HIGH);
  digitalWrite (7, LOW);
  digitalWrite (8, HIGH);
  digitalWrite (9, LOW);
  delay (ms);
}

void retrocede (int ms) {
  digitalWrite(6,LOW);
  digitalWrite(7,HIGH);
  digitalWrite(8,LOW);
  digitalWrite(9,HIGH);
  delay(ms);
}

Las funciones para mover el robot son las mismas funciones básicas describas en la entrada Robot Sanduino Control con funciones.

Lego Mindstorms EV3 código fuente disponible

Xander Soldaat publicó en 2013 un artículo en su blog botbench.com, dando a conocer que el código fuente del Lego Mindstorms EV3 está disponible para uso personal. Ver Enlace.

El código fuente está cargado en el espacio Mindboards Github: [LINK]. De donde se puede clonar el repositorio.

Entre los requisitos que Xander menciona para modificar el código fuente están:

  • Una máquina con Linux (puede ser virtual).
  • Eclipse.
  • Java JRE.
  • Code Sourcery Lite para ARM.
  • Un adaptador USB a puerto serial.
  • Una tarjeta SD.
  • Alicates de punta plana.
  • Un adaptador Netgear WNA1100 WiFi.

Si te gustan los robots Lego Mindstorms EV3, los retos de programación y te gustaría entra al mundo del desarrollo de código abierto (open source), este es un proyecto donde podrás aprender mucho e incluso hacer tus propias aportaciones.

Esta es la página de Xander: http://botbench.com/blog/2013/07/31/lego-mindstorms-ev3-source-code-available/

Instalación de Java Development Kit en Windows XP/Vista/7

El objetivo de esta guía es mostrar al programador nuevo en el lenguaje Java cómo instalar y poner a punto el Java Development Kit Standard Edition en Windows XP/Vista/7, con la finalidad de poder compilar y ejecutar aplicaciones de consola (programas que corren en una ventana de símbolo de sistema).

public class Hola {
  public static void main(String[] args) {
    System.out.println("Hola mundo");
  }
}

Presentation February 2010
DOI: 10.13140/RG.2.2.35144.32004
Disponible en https://www.researchgate.net/publication/317275548

Instalación de WampServer 3

Esta presentación muestra la instalación de WampServer 3, el cual es un ambiente de desarrollo para Windows que permite crear aplicaciones web con Apache2, PHP y bases de datos MySQL. También se muestra con ejemplos el uso de WampServer. Este material es parte de los cursos “Programación Web” y “Diseño de Bases de Datos Relacionales” que el autor ha impartido a estudiantes de nivel licenciatura y maestría en varias ocasiones.

Presentation · October 2016
DOI: 10.13140/RG.2.2.30976.23042
La intención de esta entrada es tener un punto de referencia sobre la instalación de Apache, MySQL y PHP en Windows, lo que nos permitirá tener un ambiente de desarrollo de aplicaciones web y de bases de datos para proyectos y aplicaciones en robótica e internet de las cosas, entre otras.

Sensor de luz con Arduino UNO

En esta página se muestra el uso del sensor de luz (Light Sensor Brick) con Arduino UNO. Este sensor puede funcionar como sensor analógico o sensor digital. Aquí se ejemplifica el uso analógico, con valores entre 0 y 1023.

Material usadoLightSensorBrick

1 Arduino UNO
1 Sensor de luz (Ligth Sensor Brick)
3 Cables hembra-macho

El sensor tiene una fotorresistencia, la cual se usa para detectar la cantidad de luz en el ambiente. También tiene un interruptor, con el cual se configura el sensor para enviar valores digitales o analógicos. Para el programa siguiente debe estar en la posición A (analógico).

Programa LightSensorBrick.ino

/* LightSensorBrick.ino
* Julio C. Sandria Reynoso - 24-Mayo-2017
* Este programa monitorea un sensor de luz del tipo
* Light Sensor Brick
*/

int lightValue = 0; // Muy iluminado 0..1023 Muy obscuro
 
void setup() {
  pinMode(A0, INPUT);
  Serial.begin(9600);
  Serial.println("Iniciando programa...");
  Serial.println("Valor\tSituacion");
}

void loop() {
  lightValue = analogRead(A0);
  Serial.print(lightValue);
  Serial.print("\t");
  if( lightValue < 205 )
    Serial.println("Muy iluminado");
  else if( lightValue < 410 )
    Serial.println("Iluminado");
  else if( lightValue < 615 )
    Serial.println("Sombreado");
  else if( lightValue < 820 )
    Serial.println("Obscuro");
  else
    Serial.println("Muy obscuro");
  delay(1000);
}

 

Sensor de presión BMP180 con Arduino UNO

BMP180En esta página se muestra el uso del sensor de presión barométrica BMP180 con Arduino UNO. Con este sensor también se puede obtener la temperatura y altura sobre el nivel del mar.

Material usado

1 Arduino UNO
1 Sensor BMP180
4 Cables hembra-macho

Libería

SFE_BMP180.zip que se puede descargar de esta misma página. La página oficial de la librería está en la dirección https://github.com/sparkfun/BMP180_Breakout.

El programa que se muestra aquí está basado en el Tutorial sensor de presión barométrica, en el cual se hace una muy buena explicación de la librería.

Diagrama de conexión del sensor BMP180 con Arduino UNO:

UNO-and-BMP180

Programa SensorBMP180.ino

/* 
* SensorBMP180.ino
* Julio C. Sandria Reynoso - 23-Mayo-2017
* Este programa toma la Temperatura y Presión de un sensor
* BMP180 conectado a Arduino UNO
* Esta basado en el Tutorial sensor de presion barometrica
* http://www.naylampmechatronics.com/blog/43_Tutorial-sensor-de-presi%C3%B3n-barom%C3%A9trica-BMP180.html
*/

#include <SFE_BMP180.h>
#include <Wire.h>

SFE_BMP180 bmp180;
char statusBmp180;
double P,T,A,PNivelMar=1013.25; //presion sobre el nivel del mar en mbar

void setup() {
  Serial.begin(9600);
  Serial.println("Iniciando programa...");
  delay(1000);

  if (bmp180.begin()) {
    Serial.println("Sensor BMP180 iniciado correctamente");
    Serial.println();
    Serial.println("  P mbar = Presion barometrica en milibares");
    Serial.println("  T *C = Temperatura en grados Celcius");
    Serial.println("  A msnm = Altura en metros sobre el nivel del mar");
    Serial.println();
  } else {
    Serial.println("Error al iniciar sensor BMP180");
  }
  Serial.println("P mbar\tT *C\tA msnm");
}

void loop() {
  delay(1000);
  if( leerBmp180() ) {
    Serial.print(P,2);
    Serial.print("\t");
    Serial.print(T,2);
    Serial.print("\t");
    Serial.println(A,2);
  } else
    Serial.println("pp.pp\ttt.tt\taa.aa?");
}

boolean leerBmp180() {
  //Inicio de lectura de temperatura
  statusBmp180 = bmp180.startTemperature(); 
  if (statusBmp180 != 0) {
    //Pausa para que finalice la lectura
    delay(statusBmp180); 
    //Obtener la temperatura
    statusBmp180 = bmp180.getTemperature(T); 
    if (statusBmp180 != 0) {
      // Inicio lectura de presión
      statusBmp180 = bmp180.startPressure(3); 
      if (statusBmp180 != 0) {
        //Pausa para que finalice la lectura
        delay(statusBmp180); 
        //Obtenemos la presión
        statusBmp180 = bmp180.getPressure(P,T); 
        if (statusBmp180 != 0) {
          A = bmp180.altitude(P,PNivelMar);
          return true; // Se tomo lectura de Temperatura, Presion y Altitud
        }      
      }      
    }   
  }
  return false; // No se tomo lectura de Temperatura, Presion y Altitud
} // leerBmp180

Ejemplo de corrida

Iniciando programa...
Sensor BMP180 iniciado correctamente
  T *C = Temperatura en grados Celcius
  P mbar = Presion barometrica en milibares
  A msnm = Altura en metros sobre el nivel del mar
T *C	P mbar	A msnm
26.11	866.66	1298.90
26.10	866.64	1299.06
26.10	866.61	1299.38
26.10	866.60	1299.45
26.08	866.61	1299.37
26.09	866.63	1299.15
26.09	866.64	1299.08
26.09	866.65	1298.94
26.10	866.65	1298.97
26.10	866.63	1299.17

 

Sensores de humedad y temperatura DHT11 y DHT22 con Arduino UNO

En este artículo se ejemplifica el uso de los sensores de humedad y temperatura DHT11 y DHT22 con Arduino UNO. El segundo sensor es más preciso en las mediciones, aunque, un poco más caro.

Material usado:

1 Arduino UNO
1 Sensor DHT11
1 Sensor DHT22
1 Protoboard
6 Cables hembra-macho
2 Cables macho-macho

Los ejemplos que se muestran aquí están basados en la libreria DHT de Mark Ruys disponible en https://github.com/markruys/arduino-DHT. Una característica de esta librería es que autodetecta el modelo de sensor, por lo que con el mismo programa se puede usar cualquiera de los dos sensores.

Conectores

En la siguiente imagen se muestran los cuatro conectores de ambos sensores.

DHT11-DHT22-v1-ch

En los programas mostrados a continuación los pines se conectan de la siguiente forma:

  1. VCC: al Pin 5V de Arduino.
  2. Data: al Pin 2 ó 3 de Arduino.
  3. NC: No conectado.
  4. Gnd: al Pin Gnd de Arduino.

Programa DHTxx_Ejemplo.ino

Programa ejemplo que obtiene la humedad y temperatura del sensor DHT11 o DHT22.

/*
* DHTxx_Ejemplo.ino
* Julio C. Sandria Reynoso - 22-Mayo-2017
* Ejemplo de uso de sensores de humedad y temperatura 
* DHT11 y DHT22
*
* Basado en la libreria DHT de Mark Ruys disponible en
* https://github.com/markruys/arduino-DHT
*/

#include "DHT.h"

DHT dht;

void setup() {
  dht.setup(2); // Pin data del DHT en Pin 2 de Arduino
  Serial.begin(9600);
  Serial.println("Iniciando DHTxx_Ejemplo...");
  Serial.println("Humedad\tTemperatura");
}

void loop() {
  delay(2000); // Pausa de 2 segundos
  Serial.print(dht.getHumidity());
  Serial.print("\t");
  Serial.println(dht.getTemperature());
}

Teniendo conectado a Arduino el sensor DHT11, este programa envió al Monitor Serie lo siguiente:

Iniciando DHTxx_Ejemplo...
Humedad Temperatura
57.00   29.00
57.00   30.00
57.00   30.00
57.00   30.00
57.00   29.00

Cuando se conectó el sensor DHT22 a Arduino, el resultado fue el siguiente:

Iniciando DHTxx_Ejemplo...
Humedad Temperatura
58.40   29.50
58.50   29.60
64.70   29.60
69.80   29.60
74.10   29.80
77.70   30.00
80.40   30.30
82.50   30.50

A diferencia del sensor DHT11, el DHT22 es más preciso, ya que también obtiene decimales para humedad y temperatura. A partir de la línea 7 empezaron a subir los valores de humedad y temperatura porque el sensor se sujetó dentro del puño cerrado.

Programa DHTxx_Ejemplo2.ino

En este ejemplo se usaron ambos sensores para comparar sus mediciones. El pin Data del DHT11 está conectado al pin 3 de Arduino, mientras que el pin Data del DHT22 está conectado al pin 2 de Arduino.

Arduino_UNO-DHT11-DHT22

Este programa toma la lectura de ambos sensores, DHT11 y DHT22 conectados a una tarjeta Arduino UNO.

/*
* DHTxx_Ejemplo2.ino
* Julio C. Sandria Reynoso - 22-Mayo-2017
* Ejemplo de uso de sensores de humedad y temperatura
* DHT11 y DHT22
*
* Basado en la libreria DHT de Mark Ruys disponible en
* https://github.com/markruys/arduino-DHT
*/
#include "DHT.h"
DHT dht11;
DHT dht22;

void setup() {
  dht22.setup(2); // Pin data del DHT22 en Pin 2 de Arduino
  dht11.setup(3); // Pin data del DHT11 en Pin 3 de Arduino
  Serial.begin(9600);
  Serial.println("Iniciando DHTxx_Ejemplo2...");
  Serial.println("DHT11\t\tDHT22\t");
  Serial.println("Hum\tTemp\tHum\tTemp");
}

void loop() {
  delay(2000); // Pausa de 2 segundos
  Serial.print(dht11.getHumidity());
  Serial.print("\t");
  Serial.print(dht11.getTemperature());
  Serial.print("\t");
  Serial.print(dht22.getHumidity());
  Serial.print("\t");
  Serial.println(dht22.getTemperature());
}

Para este programa, el Monitor Serie mostró los siguiente:

Iniciando DHTxx_Ejemplo2...
DHT11	     	DHT22	
Hum  	Temp 	Hum  	Temp
55.00	29.00	58.20	29.60
56.00	29.00	58.20	29.60
56.00	29.00	58.10	29.50
55.00	29.00	58.10	29.50
55.00	29.00	58.10	29.50
56.00	29.00	58.10	29.50
56.00	29.00	58.10	29.50
56.00	29.00	58.10	29.50
55.00	29.00	58.20	29.50
56.00	28.00	58.30	29.60

Referencias

  • Libreria DHT de Mark Ruys.
  • Ficha técnica del sensor DHT22.