Construcción de un centro multimedia Android para nuestro coche


Mediante una placa Arduino Mega  Aykut Çelik, ha cambiado  de una forma muy elegante  la vieja radio integrada de serie de su Volkswagen Polo de 2014 que  solo cuenta con radio con lector de cd  y no tienen ninguna conectividad bluetooth con teléfonos inteligentes y  tampoco ninguna aplicación de navegación GPS.,  pero es manejada por mandos especiales  en el volante

El  cambo es radical pues la propuesta es reemplazar la radio original  ,por una potente  tableta  con  Android   , con todo lo que se puede instalar en una tableta de ese tipo como  Google Maps, Spotify, Yandex, radio FM o cualquier  aplicación de Android  que se puede imaginar   pero además  manteniendo  los controles de volumen o  de otras funciones del coche colocados en el volante para controlar el volumen de su tableta o otras funciones.

Las partes que se necesitan son:

 

  • Un amplificador a 12V, Aunque  la radio de un coche incluye un amplificador , esta ocupa el  espacio reservada  a la tableta  y  si queremos usar solo el amplificador al no conocer habría que modificarla así que lo mejor es optar por un amplificador de audio  de calidad  ya construido, pues ademas los modernos  cuentan con mando a distancia  para regular sus diferentes as funciones 

amplificador

  • Un escudo del canbus es necesario para  poder leer comandos de la línea del canbus pues algunas de las informaciones del coche. Utiliza  este escudo para detectar los comandos del botón de rueda como los botones Subir volumen, Mute y Bajar volumen. Detrás de la radio hay dos cables de bus. Uno de ellos es Canbus – HIGH y el otro es Canbus-LOW:estos cables deben estar conectados a enchufes verdes en el escudo del canbus SeeedStudioescudo canbus
  • Un Arduino Mega  pues es responsable de analizar los datos canbus y enviarlos a la tableta Android. El envío de datos a la tableta Android es un trabajo realmente complicado, porque al principio el autor decidío utilizar un escudo de host USB y de hecho  funcionaba  arduino megapero resulta que el escudo de USB Host y el escudo de Canbus no pueden funcionar al mismo tiempo via SPI para comunicarse con el Arduino sobre el mismo pin.                                                
  • Modulo  bluetooth ; El autor  intentó cambiar el pin que estaba utilizando por el escudo del anfitrión del USB pero no funciono, asi que entonces quito el escudo host usb y  utilizo un módulo del bluetooth para comunicar la tableta Android .
  • Un adaptador del panel preparado para cada  modelo de coche. Hay personas que optan por fabricárselo a medida  con una impresora 3D  , pero también están accesibles  en tiendas online  de modo que soportan una tableta android de unos 7″ en este adaptador  quedando  muy bien estéticamente y completamente integrada en el salpicadero del automóvil.(incluso en algunos modelos se puede sacar  esta)

 

adaptador de panel

  • Convertidor 12v /2v DC de al menos 1 amp  pues serviría  para alimentar la tableta  y el modulo de  Arduino

 

Después de reunir estos elementos el sistema final es así:

Sistema completo

Este sistema parece no complicado a nivel  eléctrico ( a nivel hardware  ),  pero como vamos  a ver, si lo a nivel de sw  que debe usarse para procesar la señales del volante y enviarla a la tableta

En el siguiente vídeo, podemos  ver  como funciona el reproductor multimedia.

 

 

Vamos a continuar con la parte de programación, donde  a mi juicio es  quizás la parte mas complicada.

Usando el escudo del canbus Seeed se puede recoger  los datos del canbus del coche. Can Bus es un sistema de comunicación que cada paquete tiene un id y su carga útil. Puede ser difícil encontrar la identificación relacionada con los clics del botón de la rueda por lo que lo norma es utilizar un analizador de com serie, pero el autor tubo suerte pues después de un par de intentos encontró  los ids necesarios relacionados con los clicks  de botón de rueda que era “0xbf”.

A continuación podemos ver una parte del código arduino para identificar clics de botón:

 

witch ( buf [ 0 ] ) {
                 case 16 :
                     buttonState = VolUp ;
                     break ;
                 case 17 :
                     buttonState = VolDown ;
                     break ;
                 case 22 :
                     buttonState = Back ;
                     break ;
                 case 21 :
                     buttonState = Forward ;
                     break ;
                 case 32 :
                     buttonState = Mute ;
                     break ;
                 case 25 :
                     buttonState = Voice ;
                     break ;
                 case 28 :
                     buttonState = Phone ;
                     break ;
                 case 7 :
                     buttonState = OK ;
                     break ;
                 case 4 :
                     buttonState = Up ;
                 case 5 :
                     buttonState = Down ;
                     break ;
                 default :
                     buttonState = Nothing ;
                     break ;
             }
Como vemos  con el codigo adjunto se pueden recoger al menos 11  eventos; Volumen ,Mute, ok, atras, ariba , abajo  , voz y teleefono
Puede encontrar el proyecto Arduino en github: https://github.com/clkasd/vwcardasharduino
La información que se obtiene de canbus transferido a Android tablet vía bluetooth por lo que  finalmente en la tableta Android hay una pequeña aplicación que se encarga, por ejemplo, de reducir el volumen cuando se hace clic en el botón de la rueda ( es decir recoger las ordenes por bluetooth   y procesarla en Androi).
Ademas la app cuenta con una actividad del menú para abrir otras aplicaciones.
Puede encontrar el proyecto Android desde aquí: https: // github. com / clkasd / vwCarDashAndroid

 

Es sin duda  un excelente trabajo  muy interesante para  incluso adaptarlo a cualquier otro tipo de vehículo pues ademas el autor ha compartido el código  fuente tanto de la aplicación de captura de códigos como el de la tableta para que los pueda recoger   y hacer que cumplan su cometido

Más información en su web.

Anuncios

Diseño de una embarcación autopilotada


Mucho antes que aparecieran los coches autónomos , por su simplicidad  destacar que ya existían múltiples soluciones para embarcaciones autónomas  que no dependen del ser humano para moverse por el mundo

Leo Megliola, estudiante de 8 grado  invirtió un año construyendo una embarcación  autónoma    con ayuda de la academia de  Berwick Academia y su mentor Jeff gum

El  kayak era la octava tentativa  de conseguir una embarcación autónoma así que buscaba  desapoderadamente una idea innovadora  para conseguir el objetivo de construir una embarcación autónoma

La  idea de usar el kayak vino en de forma accidental de un paseo con su padre donde miraban  a un isla que estaban  a unas seis millas de distancia de  ellos ,  y el padre le preguntó si tuviese que enviar algo a  esa isla como lo haría . En principio Leo  pensó en  un cohete de globo o  incluso un avión de ala fija, pero decidió que la manera  más eficiente sería por barco, así que decidió  intentar nuevamente si proyecto esta vez centrándose en usar un  kayak que debería viajar todo el camino a Shoals totalmente sin ayuda.

El autor eligió una trayectoria desde una boya en el mar  cerca Portsmouth a otro justo en frente de Appledore Island  constituyendo un viaje de poco más de  cinco millas

TRAVESIA

El diseño de piezas  utiliza la fusión  en una impresora 3d para crear un prototipo , probando cada subsistema individualmente para aprender cómo cada pieza trabaja antes de intentar instalarlos en ambos sistemas principales

Usa   obviamente electrónica tanto para el control  de dirección como para  la  propulsión ,  y la verdad que en el vídeo vemos como va adelante rápidamente dirigiéndose  a  su destino así que todos esos  tres sistemas son buenos y probados

Nos  cuenta que la primera vez que probó el  sistema  pudo  ver un controlador de motor paso a paso   lleno de humo , pero como llevaban  un Arduino de repuesto  realizó  la primera prueba sin dirección.

Después corregido el problema hizo más pruebas en  la paya pudiendo  navegar incluso con corriente y  viento, pero lamentablemente  empezaron los  problemas de  filtraciones de  agua  y lentamente se  llenaba  de agua peligrando  la electrónica

Corregidas  las filtraciones el siguiente intento  conseguir llegar alrededor de la  mitad del itinerario , pero el kayak funcionaba perfectamente ,aunque confundió  algunas cosas en el  código que ejecuta el arduino

Los componentes del kayak  son lo siguientes:

  • El sistema de propulsión del kayak lo  constituye    un motor eléctrico de tipo trolling del que  hemos hablado  en numerosas veces es este blogyilon
  • Usa  tambien una batería  marina AGM    de ciclo profundo proporcionando la energía  necesaria tanto a la electrónica como al sistema de propulsión51AO+9H+NTL
  • Un Arduino Uno
  • Un modulo  GPS
  • Dos controladores de motor paso a paso(*)
  • Dos relés de potencia consecutivos(**)

 

(*)  En principio pare el timon  al  llevar dos cables el autor ha debido usar  un motor conectado solidariaemnte a cada uno de ellos

(**) Debido a la potencia del motor probablemente el autor ha optado por conectar dos reles en paralelo en lugar de un único relé

Como era de esperar  , Arduino es  responsable de dirigir el barco y encender y apagar el motor, así como navegar  en función de las señales  NMEA  que proporciona el escudo GPS

Cuenta con dos motores paso a paso que van girando en un sentido o en otro  para mover el timón de la embarcación . El autor ha optado  para no estropear la embarcación, situando  los  motores para  controlar la  dirección a una distancia  adecuada para por medio de dos cables de acero  tirar  de cada extremo del timón  hacia estribor o babor y no dirigir la dirección del barco entero pues el uso de la palanca  ayuda  a minimizar el consumo del motor de dirección

En la electrónica,  el GPS es responsable para decirle al kayak qué dirección está viajando calculando el  por medio del microcontrolador Arduino  las ordenes a dar  al motor  PaP  en en función de  las  señales que está recibiendo   dado que  no cuenta con brújula electrónica

El algoritmo inicial  tenia   en cuenta donde estaba hace unos segundos y donde está en el momento actual de modo que podía  calcular  de que manera  se había movido  sabiendo qué camino estába viajando bien, así que fruto  de la experimentación  consiguió escribir  el  programa adecuado para ir corrigiendo constantemente el rumbo para llegar al destino

El autor tubo algunos  problema a la hora sobre todo de escribir el código principalmente  por  tres  motivos principales:

  • Primero el autor  falló en  simulación de scratch donde tuvo la pequeño barco y la isla y nosotros fundamentalmente los rudimentos de la código que escribimos en Arduino idioma y se movió mucho y luego terminó simplemente haciendo un círculo  una y otra vez para que ese total  falló y terminamos arreglando que reescribió completamente el código y tomó enfoque diferente  SCARTACH1.PNG
  • El segundo fracaso vino  que trataron de navegar en el coche  usando la misma electrónica pero a la que añadieron  cuatro LEDs que indicaba  de qué manera había que dar la vuelta si el circuito sabe de alguna corrección GPS , así como si se estaba dentro del rango para detener o no . Por el resultado comprobado empíricamente, el algoritmo estaba mal ,pues indicaba  que estaba completamente fuera de la distancia cuando en realidad  estában a unos cien metros de distancia  y  dijo que está en algún lugar en el rango de cinco mil metros de distancia..
  • El tercer fallo vino con una  de las revisiones de código cuando íba hacia el norte pues en el código estaba dividiendo por cero y perdía el control .Arreglo eso también tomando una nuevo enfoque completamente nuevo de modo que finalmente  consiguio solucionar  el problema   incluso en una corriente cruzada como  se  puede ver en el vídeo .

 

El autor ha utilizado componentes y tutoriales principalmente de Adafruit, incluyendo un Arduino, un sensor GPS, un relé y un controlador de motor paso a paso y para programarlo ha usado Scratch

De momento aquí os dejamos un vídeo en el que nos enseña su proyecto  aunque  lamentablemente no ha compartido el código de Arduino .

 

 

 

 

Nos  consta  que has seguido intentando mejorar  su proyecto  como demuestra el siguiente vídeo  donde el kayak de Leo adquiere y encuentra una boya de mar a 1,5 km de distancia (prueba de mar abierto)  siendo el rumbo inicial  de 120 grados respecto al objetivo.

 

 

Sencillo exobrazo


Puede parecer una banalidad , pero la idea detrás de este prototipo es muy interesante ya que  puede suponer una ayuda importante   a la movilidad,  pues esta  assietncia puede ser especialmente importante para los ancianos y otras personas que necesitan este tipo de ayuda en la vida cotidiana.

El sistema que sugieren sus creadores destaca por su simplicidad : una estructura de aluminio  para sujetar el brazo, un motor y una placa Arduino con su correspondiente escudo (cuyos detalles, por cierto, han publicado en hackaday.com) ,

Nos explican   que en la construcción del  exo-brazo buscaban  que fuese relativamente barato, sencillo y potente que permitiera  un uso fácil del mismo , por lo cual  construir su prototipo no deberia costar mas de 100$ ,  lo cual es un precio bastante razonable ,sobre todo si nos vamos a soluciones que se  estan desarrollando la industria.

El desarrollo de este proyecto comenzó centrándose más en el control del brazo y luego en el propio diseño, por lo que  tal vez el  objetivo número de sus creadores  es   hacer que el control de ExoArm sea tan barato y tan intuitivo como sea posible.

En el siguiente video podemos verlo en acción:

Como podemos  apreciar, hay una estructura articulada de aluminio  y precisamente en la articulación esta el motor (en el codo) , aunque  sugieren que en otros diseños futuros  también proveen implementar  un  actuador en el hombro( de hecho el shield empleado admite dos motores).

Este  exo-brazo tiene   tambien apoyo trasero, de modo que todo el peso se distribuye uniformemente a su cuerpo siendo la capacidad de elevación  alrededor de 10 kg máximo o 22 libras.

 

Electrónica

 

 

modulo.PNG

 

 

Ademas de la placa Arduino, un componente básico es el driver del motor VNH2SP30 ,el cual es esencialmente una versión en rampa del escudo de motor Ardumoto. Esta placa se presenta como un escudo que  se conecta encima de Arduino  y es de bajo coste ( unos 6,5€ en Amazon).

Para este  Shield se usa  un par de drivers de motor de puente completo VNH2SP30. También incluye los circuitos de soporte para que esta placa sea capaz de controlar  un par de motores de alta corriente ,  aunque para esta aplicacion solo se usa uno .

El VIN y el motor son lanzados para  terminales de tornillo de 5mm , lo que facilita la conexión de cables de mayor calibre.

Al utilizar este escudo en aplicaciones de alta demanda extrema puede ser necesario mejorar el rendimiento térmico con un disipador de calor o ventilador y soldar los cables directamente a la placa en lugar de usar un terminal de tornillo (tenga en cuenta la alta corriente de este) , aunque  cuando se utiliza el escudo en corrientes de hasta 6A los chips apenas llegarán a ser perceptiblemente calientes.

Resumidamente  esta son algunas de las características del escudo empleado:

  • Voltaje: max. 16V
  • Regimen de corriente: 30A maximo 
  • Corriente permanente: 14 A
  • Resistencia MOSFET (solo ida): 19 m & OHgr;
  • Frecuencia PWM: 20 kHz Max.
  • Tamano placa: 6 * 5,2 * 2cm / 2,4 * 2 * 0,8pulg
  • Peso : 23 g / 0,8 oz

Una vez resuelto el driver, respecto a Arduino , los pines que se requieren , en la aplicación  son los pines siguientes:

  • Pines 3 y 4  como salidas binarias para configurar el motor vía el driver del motor VNH2SP30
  • Pin 5  como salida analógica para escribir el dato en el el driver del motor VNH2SP30
  • Pin 2  como entrada analógica para el encoder solidario al eje del motor para saber la posición de la articulación
  • Pines 8 como entrada binaria para ordenar subir la articulación via el motor
  • Pines 9  como entrada binaria para ordenar bajar  la articulación vía el motor

 

 

Antes de ver el codigo  final ,  es interesante apreciar como el control del motor se hace fijando los pins 3  y 4 a un valor  y luego sacando un valor analogico en el pin 5, por ejemplo, parar mover  arriba el motor   se usa esta función:

void moveup(float writemotor){ /
writemotor = map(writemotor, 0, -80, 255, 0);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
analogWrite(5, writemotor);

Y de forma similar para mover hacia  abajo :

void movedown(float writemotor){ 

writemotor = map(writemotor, 0,-255, 0, 255);
digitalWrite(3, LOW);
digitalWrite(4, HIGH);
analogWrite(5, writemotor);
}

Simplemente para  parar el moto,r   sacamos un  valor cero  en el pin 5 usan esta otra función:

void stopmove(){ //parar el motor
digitalWrite(3, LOW);
digitalWrite(4, LOW);
analogWrite(5, 0);
}

 

Una función  muy importante  es conocer la posición de la articulación  gracias a que hay conectado un potenciómetro solidario al aje de modo  que  capturando  el valor  de la salida del potenciómetro podemos   conocer el angulo ,gracias  al  siguiente código:

float errorSum;
float Kp = 2;
float Ki = 0;

float computePID(int setpoint){    
angle = analogRead(2);
angle = map(angle, 0, 344, 0, 90); 

double time_elapsed = micros();
dtrate = (time_elapsed – last) / 1000.f;
last = time_elapsed;

float error = setpoint – angle;
errorSum += error * dtrate;
errorSum = constrain(errorSum, -255, 255);

return (Kp * error) + (Ki * errorSum);

}

Por ultimo,  en la función loop miramos continuamente  los valores binarios de los pines 8 y 9  ,y en función de su estado, llamaremos a alguna de las rutinas anteriores:

 

void loop()   //bucle principal de ejecución
{
int program_runtime = millis();

int readingUp = digitalRead(8);
int readingDown = digitalRead(9);

if(readingUp == 1 && readingDown == 0){
if(program_runtime – previousMillis > interval) {
previousMillis = program_runtime;
Step -= 5;
}

}
if(readingDown == 1 && readingUp == 0) {
if(program_runtime – previousMillis > interval) {
previousMillis = program_runtime;
Step += 5;
}

 

Código arduino

El procesamiento de control como decíamos se hace con un Arduino, por lo que el código es  bastante fácil de entender y modificar cuanto se quiera para mejorarlo o adaptarlo a cada necesidad:

 

#include <ArduinoTimer.h>
#include <CircularBuffer.h>
#include <CommandHandler.h>
#include <CommandProcessor.h>
#include <DataStore.h>
#include <DeviceAddress.h>
#include <EEPROMStore.h>
#include <Filter.h>
#include <MegunoLink.h>
#include <MessageHeaders.h>

#include “MegunoLink.h” /Funciones útiles para comunicarse con MegunoLink Pro.

#include “filter.h”
#include “Servo.h”

TimePlot plot;

int potVal;
int angle;
float dtrate;
double last;

ExponentialFilter FilteredMuscleValue(5, 20); / peso de la derecha, valor de inicio izquierdo

void moveup(float writemotor){ //mover  arriba el motor
writemotor = map(writemotor, 0, -80, 255, 0);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
analogWrite(5, writemotor);

}

void stopmove(){ //parar el motor
digitalWrite(3, LOW);
digitalWrite(4, LOW);
analogWrite(5, 0);
}

void movedown(float writemotor){ //mover hacia  abajo

writemotor = map(writemotor, 0,-255, 0, 255);
digitalWrite(3, LOW);
digitalWrite(4, HIGH);
analogWrite(5, writemotor);
}

float errorSum;
float Kp = 2;
float Ki = 0;

float computePID(int setpoint){    //función de  calculo de la posición del encoder
angle = analogRead(2);
angle = map(angle, 0, 344, 0, 90); // dejanski kot
Serial.print(angle);

double time_elapsed = micros();
dtrate = (time_elapsed – last) / 1000.f;
last = time_elapsed;

float error = setpoint – angle;
errorSum += error * dtrate;
errorSum = constrain(errorSum, -255, 255);
//Serial.println(error);
return (Kp * error) + (Ki * errorSum);

// Serial.println(time_elapsed, 5);
}

int Step = 0;

void setup()     //inicializacion del brazo
{
pinMode(8, INPUT);
pinMode(9, INPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
Serial.begin(9600);
Step = 0;
}

int k = 1;
int previousMillis = 0;
int interval = 50;

void loop()   //bucle principal de ejecución
{
int program_runtime = millis();

int readingUp = digitalRead(8);
int readingDown = digitalRead(9);

if(readingUp == 1 && readingDown == 0){
if(program_runtime – previousMillis > interval) {
previousMillis = program_runtime;
Step -= 5;
}

}
if(readingDown == 1 && readingUp == 0) {
if(program_runtime – previousMillis > interval) {
previousMillis = program_runtime;
Step += 5;
}

}
Step = constrain(Step, -150, 150);
if(readingDown == 0 && readingUp == 0) Step = 0;

//plot.SendData(“pid”, writemotor);
Serial.println(Step);
if(Step > 0) moveup(Step);
if(readingUp == 0 && readingDown == 0) stopmove();
if(Step < 0) movedown(Step);

}

Componentes necesarios

1 × calibrador de tensión con el amplificador de celda de carga
1 × Aluminio 4 x 30 x al menos 2000 mm
1 × Arduino Uno / Nano
1 × controlador de motor VNH2SP30
1 × Motor del limpiador del parabrisas del coche
1 × cables largos
1 × Potenciómetro
1 × Li-Po batería 3S 5500mAh
1 × Tornillos y tuercas. M4 y M6
1 × Cinta adhesiva
1 × Zipties
1 × Correas
1 × Placas de madera
1 × Tubo termorretráctil

 

 

En el siguiente vídeo el autor describe mas detalles de construcción   de este excelente  exo-brazo:

 

 

Mas información en https://hackaday.io/project/20663-assistive-exoskeleton-arm-exoarm#menu-description

Alarma con estación meteorológica


También decidió utilizar un servidor MQTT para subir esta información en la web por lo que se puede desde cualquier lugar, tener un vistazo a la información meteorológica captada por este prototipo.

Elementos del montaje:

  1. nodeMCU (regulador Micro,  versión 0.9)
  2. Pantalla LCD – 16 x 2
  3. Botones – 3
  4. Sensor de temperatura DHT11
  5. Timbre o zumbador
  6. Placa de prototipos tamaño  mini
  7. Cables de puente
  8. Resistencia de 1000 Ω – 3
  9. Caja de madera para montar todas las cosas dentro.

Asignación de pines y planificación

Bien, así que vamos a hablar acerca de cómo tenía que distribuir los pasadores entre todos los componentes.

La pantalla LCD

La pantalla LCD,  necesita al menos 6 pines de I/O interfaz con el microcontrolador. Puede darse como sigue: Habilitar, register select, D04, D05, D06 D07.

  • Enable – pin I/O digital 0
  • Seleccione Registro – pin I/O digital 1
  • D04 – pin I/O digital 2
  • D05 – pin I/O digital 3
  • D06 – pin I/O digital 4
  • D07 – pin I/O digital 5

Los botones

Hay tres botones que vamos a usar, por lo queo bviamente  necesitaríamos tres pins de I/O digitales,

  • LeftButton – pin I/O digital 6
  • CenterButton – pin I/O digital 7
  • RightButton – pin I/O digital 8

El zumbador

El puede ser conectado al pin I/O digital 9.

El sensor de temperatura DHT11

Este sensor tiene un pin de salida y sigue para el pin de I/O digital 10

 

Ensamblaje

En una caja de madera ser practican agujeros para el lcd  y lo botones y entonces es hora de montar todo dentro de esa caja.

  1. Creo que tenemos que empezar con los botones. Usé un palito de helado estrecho para hacer una base para los botones.
  2. Luego tomar el nodeMCU y las placa de prototipos y pegarloo a la base de la caja con cinta de doble cara.
  3. Entonces conectar los botones a los pines de I/O digitales apropiados.
  4. En tercer lugar, colocar  la pantalla LCD y luego agarrarla bien a la caja con algunas cintas desde el interior. .
  5. Hacer las conexiones de la pantalla LCD.
  6. Luego conectar el timbre o buzzer en el interior de la caja con cinta de doble cara y conectar su terminal positivo al pin digital 9
  7. El sensor DHT11 tiene tres piness: 5v, gnd y la salida. Por lo tanto el pin de salida irá al pin digital 10 de la nodeMCU . 5v y tierra son obvias dónde deben ir.
  8. También para agregar, DHT11 es lo único que se quedará fuera de la caja para detectar la temperatura exterior. .

 

El código

El código qeu ha escrito Techovator0819      es cerca de 450 líneas de longitud. y cuenta  con  algunas bibliotecas importantes que se necesitan para descargar  asi que lo primero es asegúrarse de tener el IDE de Arduino instalado asi como tener los drivers del  esp8266 instaladas también. Si no lo ha hecho, haga clic aquí.

El primer paso antes de ver  el código, es entender la funcionalidad de nuestro dispositivo y el código en consecuencia:

  • Nestro WB(weather box)  accede a internet y recupera la información de tiempo apropiado a través de una llamada a la API.
  • También  tomara  la temperatura del medio ambiente  con un sensor propio y enviara esa información a un corredor de MQTT.
  • También podría mantener alarmas y temporizadores para usted.
  • También es capaz de mostrar hora y fecha.

Todo , esto significa que necesitamos integrar todas estas funciones bajo un título o código.

¿Cuáles son las bibliotecas que necesitamos?

  1. Librería LiquidCrystal . Como estamos usando una pantalla LCD como la principal interfaz entre usted y el NodeMCU, esta biblioteca es indispensable. Paranuestra comodidad, esta biblioteca, por defecto, es una biblioteca integrada en el IDE de Arduino.
  2. Biblioteca de ESP8266WiFi . Esta biblioteca permite el ESP8266 conectar con el Wifi y tener acceso a internet. Esta librería viene en un paquete que debe descargar durante la instalación del ESP8266 en el administrador de la placa.
  3. Biblioteca de ArduinoJson . Cuando se llama a la API, los datos que usted recibirá estaran en formato JSON (JavaScript Object Notation). Así que si quiere convertirlo a un formato utilizable, necesita analizarlo. Y la biblioteca de ArduinoJson lo hace por nosotros.
  4. Biblioteca para el sensor DHT11.
  5. Biblioteca en tiempo de. Para mantener a nuestro tiempo. Las funciones de biblioteca se enumeran aquí.
  6. Biblioteca de TimeAlarms . Se utiliza para que nos establezcan alarmas y temporizadores. Las funciones de biblioteca se enumeran aquí.

Las dos últimas bibliotecas deben utilizarse juntos. Puede usar la biblioteca en tiempo de forma independiente pero no de la biblioteca de TimeAlarms.


La llamada de API

 

The API Call

 

 

 

 

Lo más importante es una llamada a la API es la API key. Estoy conectando a la página web openweathermap.org para obtener toda la información de tiempo. Así que hay que seguir el procedimiento para abrir una cuenta allí y obtener un API key y es absolutamente gratis. Para llamar a la API key,
El primer paso es conectarse al servidor.

En segundo lugar, usted necesita utilizar su API key en la URL.Usted deberá utilizar el método GET para recuperar los datos de la URL.

Para hacer los datos disponibles en un formato utilizable,necesita para luego almacenar los datos en una cadena.

Los datos que reciba serán en formato JSON. Así que hay que analizarlo.

Y luego, se almacenan la información deseada en algunas variables globales que se pueden utilizar en cualquier lugar en el código.

     El siguiente es un ejemplo de código  para demostrar cómo funciona. Esta parte básicamente declara las bibliotecas utilizadas, crea las variables y objetos de la biblioteca a consultar.

include <ArduinoJson.h>
#include <ESP8266WiFi.h>
String result; 
// la cadena en la que se almacenarán los datos después de la llamada a la API
char servername[]="api.openweathermap.org"; //mombre servidor
String APIKEY = "YOUR_API_KEY"; //el API key
String CityID = "1264527"; //el  ID de la ciudad

//Asignación de sus variables globales para almacenar la información meteorológica recibida
String Description;
String Place;
float Temperature;
float Humidity;
float w;
WiFiClient client; >

Código de configuración básica.

void setup()

{

// Ponga su código de configuración aquí, para ejecutar una vez:
Serial.begin(9600);
WiFi.begin(“your ssid”, “your password”);

//empieza  conexion WIFI
while(WiFi.status() != WL_CONNECTED)

{

// espera hasta que se establezca la conexión
Serial.print(“.”);
delay(500);
}
Serial.println(“Connectado!”);
Serial.println(WiFi.localIP());   //imprime direccion  IP
}<

Código para crear una función que obtiene los datos.

void weatherData(){

if (client.connect(servername, 80)) {

// inicia la conexión del cliente, comprueba la conexión
client.println(“GET /data/2.5/weather?id=”+CityID+”&units=metric&APPID=”+APIKEY);

//// llama a la api usando el método get antes de la URL. Nota: La URL utiliza la clave api.
Serial.println(“Server esta accesible”);
client.println();
}
else { //  si el servidor no esta disponible
Serial.println(“fallo de conexion  “); //mensaje de errorsi no esta conectado el cliente
Serial.println();
}
result = “”;

//Hace que la cadena nula de cualquier dato almacenado previamente para almacenar nuevos datos
while (client.available()) { //connected or data available
char c = client.read(); //gets byte from ethernet buffer
result = result+c;
}
Serial.println(result);
result.replace(“[“, ” “);

//Estoy enfrentando un error. Sólo para evitarlo, tengo que escribir esto
result.replace(“]”, ” “);

//y esto tambien.
client.stop(); //para  cliente
Serial.println(“Recieved”);

//Analiza la cadena llamada resultado

StaticJsonBuffer<1024> jbuff;

JsonObject &root = jbuff.parseObject(result);
if (!root.success())
{
Serial.println(“parseObject() failed”);
}

// almacena toda la información deseada en variables temporales.
String location = root[“name”];
float temperature = root[“main”][“temp”];
float humidity = root[“main”][“humidity”];
String description = root[“weather”][“description”];
float wind = root[“wind”][“speed”];

//Transfiere toda la información de las variables temporales a variables globales a las //que puede acceder en cualquier parte del código.
Place = location;
Temperature = temperature;
Humidity = humidity;
w = wind * 3.6;
Description = description;
}

La función de bucle para mostrar todo lo que te quieren en el monitor serie.

void loop() {

weatherData(); //Llama a la función que hemos discutido anteriormente
Serial.println(Temperature);
Serial.println(Place);
Serial.print(“H: “);
Serial.println(Humidity);
Serial.print(w);
Serial.println(” kmph”);
Serial.println(Description);
delay(8000); //retardo de  8 segundos
}

Como vemos  es un ejemplo básico de una llamada a la API y el análisis de datos JSON.

 

MQTT cliente y agente

 

MQTT Client and Broker

 

 

Como hemos visto en este blog el autor h aoptado  por el frameworl Cayyene de MyDevices para salvar la informacion procedente del sensor DHT11

one.jpg

 

 

two.jpg

 

 

 

 

four.jpg

 

 

five.jpg

 

 

Como vemos va  subiendo nuestros datos de los sensores a un corredor de MQTT en internet por lo que podemos ver desde cualquier lugar.
Pesonalmente pienso que el tablero de instrumentos del Cayenne es el más conveniente así queno me sorprende que el autor lo hay usado
Resumidamente esto son los pasos  para usar el servicio
  • En primer lugar, debe crear una cuenta.
  • Después de haber conectado la placa a Cayena se le dirigirá automáticamente a la consola donde se pueden utilizar los widgets personalizados disponibles.
  • Asegúrese de especificar correctamente el canal y corresponden a ese canal para enviar datos en el código.
  • Después de que hayas hecho eso, cree un nuevo proyecto y arrastrar y soltar widgets como de sus dispositivos.
  • El siguiente es un código de ejemplo para que comprendas cómo Protocolo MQTT. También utilizaremos la biblioteca Cayena-MQTT-ESP8266 para hacer las cosas mucho más fácil para nosotros.
    <#include 
    
    char ssid[] = "ssid";
    char wifiPassword[] = "wifiPassword";
    
    char username[] = "MQTT_USERNAME";
    
    char password[] = "MQTT_PASSWORD";
    char clientID[] = "CLIENT_ID";
    
    void setup() {
    
      Serial.begin(9600);
      Cayenne.begin(username, password, clientID, ssid, wifiPassword);
    }
    
    void loop() {
    
     Cayenne.loop(); //this function must be called regularly to keep the connection stable
      float sensorInfo = analogRead(A0);
      Cayenne.virtualWrite(0, sensorInfo); //virtualWrite(channel, data) is function with two parameters. Channel - you want to send the data to and second parameter is the data itself.
    }
  • Después de eso, usted será capaz de enviar y recibir datos sin problemas. Para este , se ha usado sólo dos widgets icono es decir ‘temperatura’ y ‘humedad’.
  • Después de crear una cuenta, haga clic en ‘Add New’.
  • A continuación, haga clic en ‘Dispositivo/Widget’Haga clic en “Traiga su propia cosa”, que es en la parte inferior.Una nueva página aparecerá indicando su nombre de usuario MQTT, contraseña y el ID de cliente que son únicas para usted. Estos se aplicarán en el código para identificar el dispositivo.

Estructura del código final

La longitud total del código es alrededor de 550 líneas.

El código está dividido en dos secciones. Una PageDisplay y otra DecMaker (abreviatura de decisiones). Cada vez que usted pulsa cualquier botón, basado en que (derecha o izquierda), la pantalla mostrará esa página. Cuando en página y el centerButton, el código se moverá a la DecMaker. Dentro de la función DecMaker y basado en qué página estaba finalmente abierta, ejecutará las acciones correspondientes. Puede recibir datos meteorológicos, sensores, alarmas y temporizadores.

Las páginas se muestran según los modos. Los modos son cuatro. Pueden ser,

  1. Inicio modo: para obtener los datos meteorológicos y visualizarlos. Así como percibir el entorno.
  2. Modo set timer – establecer temporizadores para usted
  3. Modo de programar la alarma – establecer alarmas para que usted
  4. Panel de control – cuando tu no en cualquiera de los modos, prefiere podría quedarse en el tablero de instrumentos.

A continuación, vamos a hablar sobre el sketch principal 

Paso 9: El código principal

El siguiente es el código principal.

Para descargar el código, haga clic aquí.

LiquidCrystal lcd(16, 5, 4, 0, 2, 14);
#define rightButton 13
#define centerButton 15
#define leftButton 12
#define buzz 3
int page = 1;
byte leftArrow[8]
{ B00000,
 B00010,
 B00110,
 B01110,
 B11110,
 B01110,
 B00110,
 B00010
};
byte rightArrow[8]{
 B00000,
 B01000,
 B01100,
 B01110,
 B01111,
 B01110,
 B01100,
 B01000
};
byte line[8]
 { B00110,
 B00110,
 B00110,
 B00110,
 B00110,
 B00110,
 B00110,
 B00110
};
String result;
char servername[]="api.openweathermap.org";
String APIKEY = "Your Api key";
String CityID = "Your city ID";</p><p>String Description;<br>String Place;
float Temperature;
float Humidity;
float w;
WiFiClient client;
dht DHT;#define pin 1
int set=1; // for configuring the alarm
int a, b, c; // used to denote the hour, minute and second while setting an alarm</p>
char username[] = "MQTT_username";<br>char password[] = "MQTT_password";
char clientID[] = "Client ID";

void setup() {
 // put your setup code here, to run once:
 Serial.begin(9600);
 WiFi.begin("ssid", "password");
 lcd.print("Weather box");
 delay(2000);
 lcd.clear();
 if (WiFi.status() == WL_CONNECTED){
 Cayenne.begin(username, password, clientID);
 lcd.print("Connected!");
 delay(3000);
 lcd.clear();
 Serial.println(WiFi.localIP());
 } else {
 lcd.print("Not conn");
 delay(3500);
 }
 lcd.clear();
 lcd.begin(16, 2);
 lcd.createChar(0, leftArrow);
 lcd.createChar(1, rightArrow);
 lcd.createChar(3, line);
 
 pinMode(rightButton, INPUT);
 pinMode(centerButton, INPUT);
 pinMode(leftButton, INPUT);
 pinMode(buzz, OUTPUT);
 digitalWrite(buzz, LOW);
 
 setTime(15, 12, 50, 25, 5, 17);
 delay(1000);
}
int val = 1;
int x,y; //for setting timer minutes and seconds
int trig; //for coniguring the timer
int counter = 0;
void loop() {
 // put your main code here, to run repeatedly:
 while(val == 1){
 if (digitalRead(leftButton)==HIGH)
 { val = 0;}
 lcd.clear();
 lcd.print(hour());
 lcd.print(":");
 lcd.print(minute());
 lcd.write(byte(3));
 lcd.print("WiFi:");
 if (WiFi.status() == WL_CONNECTED){
 lcd.print("conn"); } 
 else {
 lcd.print("Nconn");} 
 lcd.setCursor(0, 1);
 lcd.write(byte(0));
 lcd.print("Menu");
 lcd.write(byte(3));
 
 if (digitalRead(centerButton)){
 DHT.read11(pin);
 lcd.print("T:");
 int a = DHT.temperature; //converting float to int
 lcd.print(a);
 int b = DHT.humidity; // converting float to int
 lcd.print(" H:");
 lcd.print(b);
 delay(3000);
 }else {
 date();
 }
 counter++;
 if (counter == 60){
 if (WiFi.status()==WL_CONNECTED){
 Cayenne.loop(); 
 DHT.read11(pin); 
 Cayenne.virtualWrite(1, DHT.temperature);
 Cayenne.virtualWrite(2, DHT.humidity); 
 } 
 counter = 0;
 }
 delay(50);
 }
 while (val != 1){
 delay(200);
 pageDisplay();
 if (digitalRead(rightButton)){
 if (page == 4){
 page = page;
 } else {
 page++;
 }
 pageDisplay();
 
 } else if (digitalRead(leftButton)){
 if (page == 1){
 page = page;
 } else {
 page--;
 }
 pageDisplay();
 
 } else if (digitalRead(centerButton)== HIGH){
 decMaker();
 }
 }
}
void pageDisplay()
{ switch(page){
 case 1:
 lcd.clear();
 lcd.setCursor(6, 0);
 lcd.print("Home");
 lcd.setCursor(15, 0);
 lcd.write(byte(1));
 break;
 case 2:
 lcd.clear();
 lcd.write(byte(0));
 lcd.setCursor(3, 0);
 lcd.print("Set Timer");
 lcd.setCursor(15, 0);
 lcd.write(byte(1));
 break;
 case 3: 
 lcd.clear();
 lcd.write(byte(0));
 lcd.setCursor(3, 0);
 lcd.print("Set Alarm");
 lcd.setCursor(15, 0);
 lcd.write(byte(1));
 break;
 case 4:
 lcd.clear();
 lcd.write(byte(0));
 lcd.setCursor(3, 0);
 lcd.print("Dash Board");
 break;
 default:
 lcd.clear();
 lcd.print("Error 002");
 break;
 }
}
void date(){
 lcd.print(day());
 lcd.print(" ");
 int a = month();
 switch(a){
 case 1:
 lcd.print("Jan");
 break;
 case 2:
 lcd.print("Feb");
 break;
 case 3:
 lcd.print("Mar");
 break;
 case 4:
 lcd.print("Apr");
 break;
 case 5:
 lcd.print("May");
 break;
 case 6:
 lcd.print("Jun");
 break;
 case 7:
 lcd.print("Jul");
 break;
 case 8:
 lcd.print("Aug");
 break;
 case 9: 
 lcd.print("Sep");
 break;
 case 10:
 lcd.print("Oct");
 break;
 case 11:
 lcd.print("Nov");
 break;
 case 12:
 lcd.print("Dec");
 break;
 default:
 lcd.print("005");
 }
 if (day()<10){
 lcd.print(" ");
 }
 lcd.print(year());
 }
void decMaker(){
 switch(page){
 case 1:
 lcd.clear();
 lcd.print(". . .");
 weatherData(); 
 lcd.clear();
 while (digitalRead(leftButton) == LOW){
 weatherData();
 digitalRead(leftButton);
 lcd.setCursor(6, 0);
 lcd.print("IST:");
 lcd.setCursor(5, 1);
 lcd.print(hour());
 lcd.print(":");
 lcd.print(minute());
 delay(3000);
 lcd.clear();
 lcd.print("Wthr in ");
 lcd.print(Place);
 lcd.setCursor(0, 1);
 lcd.print("T:");
 lcd.print(Temperature);
 lcd.setCursor(9, 1);
 lcd.print("H:");
 lcd.print(Humidity);
 delay(3000);
 lcd.clear();
 digitalRead(leftButton);
 lcd.print("Wind: ");
 lcd.print(w);
 lcd.print("kmph");
 lcd.setCursor(0, 1);
 lcd.print(Description);
 delay(2000);
 lcd.clear();
 DHT.read11(pin);
 lcd.print("Room: ");
 lcd.setCursor(0, 1);
 lcd.print("T:");
 lcd.print(DHT.temperature);
 lcd.setCursor(9, 1);
 lcd.print("H:");
 lcd.print(DHT.humidity);
 delay(2000);
 lcd.clear();
 }
 lcd.begin(16, 2); // In my case the lcd doesn't work without this. But don't know why.
 break;
 case 2:
 setTimer();
 break;
 case 3:
 setAlarm();
 Serial.print("THREE");
 lcd.begin(16, 2);
 break;
 case 4:
 Serial.print("FOUR");
 val = 1;
 break;
 default:
 Serial.print("not a valid entry");
 lcd.clear();
 lcd.print("error 001");
 break;
 }
}
void weatherData()
{ if (client.connect(servername, 80)) 
{ //starts client connection, checks for connection
 client.println("GET /data/2.5/weather?id="+CityID+"&units=metric&APPID="+APIKEY);
 Serial.println("Server is accessable");
 client.println();
 } 
 else {
 Serial.println("connection failed"); //error message if no client connect
 Serial.println();
 }
 result = "";
 while (client.available()) { //connected or data available
 char c = client.read(); //gets byte from ethernet buffer
 result = result+c;
 }
 result.replace("[", " ");
 result.replace("]", " ");
 client.stop(); //stop client
 Serial.println("Recieved");
 
 StaticJsonBuffer<1024> jbuff;
 JsonObject &root = jbuff.parseObject(result);
 if (!root.success())
 {
 Serial.println("parseObject() failed");
 }
String location = root["name"];
 float temperature = root["main"]["temp"];
 float humidity = root["main"]["humidity"];
 String description = root["weather"]["description"];
 float wind = root["wind"]["speed"];
Place = location;
 Temperature = temperature;
 Humidity = humidity;
 w = wind * 3.6;
 Description = description;
}
void alarm()
{ Serial.println("Alarm activated");
 lcd.clear();
 lcd.print("Wake up, Lazy");
 for (int i = 0; i <= 10; i++){
 digitalWrite(buzz, HIGH);
 delay(80);
 digitalWrite(buzz, LOW);
 delay(80);
 digitalWrite(buzz, HIGH);
 delay(80);
 digitalWrite(buzz, LOW);
 delay(800);
 }
 digitalWrite(buzz, LOW);
 set = 0;
}
void setAlarm(){
 set = 1;
 int pos = 1;
 a, b, c = 0;
 repeat:
 //timeDisplay();
 lcd.clear(); 
 lcd.setCursor(0, 0); 
 lcd.print(a); 
 lcd.print(":");
 lcd.print(b); 
 lcd.print(":");
 lcd.print(c); 
 lcd.setCursor(0, 1);
 if (pos == 1){ lcd.print("hours");}
 else if (pos == 2){ lcd.print("minutes");}
 else if (pos == 3){lcd.print("seconds");}
 delay(200);
 if (digitalRead(leftButton)){//leftButton
 if (pos == 3)
 {pos = 1;}
 else 
 {pos++;}
 } else if (digitalRead(rightButton)){
 switch (pos){
 case 1:
 if (a == 23){ a = 0;}
 else {a++;}
 break;
 case 2:
 if (b == 59){ b = 0;}
 else {b++;}
 break;
 case 3:
 if (c == 59){ c = 0;}
 else {c++;}
 break;
 }
 } else if (digitalRead(centerButton)){
 confirmAlarm();
 } 
 if (set == 0){
 goto endIt;
 }
 goto repeat;
 endIt:
 Serial.println("Alarm executed successfully");
}

void confirmAlarm()
{ lcd.clear();
 Alarm.alarmOnce(a, b, c, alarm);
 up:
 lcd.setCursor(1, 0);
 lcd.print("Alarm Running");
 lcd.setCursor(3, 1);
 lcd.print(hour());
 lcd.print(":");
 lcd.print(minute());
 lcd.print(":");
 lcd.print(second());
 Alarm.delay(200);
 delay(1);
 lcd.clear();
 //timeDisplay();
 Serial.println("...");
 if (set == 0||digitalRead(centerButton)){goto down;}
 goto up;
 down:
 set = 0;
}
void setTimer(){
 int cur = 1;
 x, y = 0;
 trig = 1;
 roof:
 lcd.clear();
 lcd.setCursor(2, 0);
 lcd.print("minutes: ");
 lcd.print(x);
 lcd.setCursor(2, 1);
 lcd.print("seconds: ");
 lcd.print(y);
 if (cur == true){lcd.setCursor(0, 0); lcd.write(byte(1));}
 else {lcd.setCursor(0, 1); lcd.write(byte(1));}
 delay(200);
 if (digitalRead(rightButton)){
 switch(cur){
 case 1:
 if (x == 20){x=0;}
 else {x++;}
 break;
 case 2:
 if (y == 59){y = 0;}
 else {y++;}
 break;
 default: 
 lcd.clear();
 lcd.print("ERROR 003");
 }
 } else if (digitalRead(leftButton)){
 if (cur == 2){cur = 1;}
 else {cur++;}
 }
 if (digitalRead(centerButton)){
 confirmTimer();
 } else {
 goto roof;
 }
 trig = 0;
 lcd.setCursor(0, 0);
 lcd.print("Timer successful");
 delay(2000);
 lcd.clear();
}</p><p>void confirmTimer(){<br> int z;
 z = x*60 + y;
 Alarm.timerOnce(z, timer);
 lcd.clear();
 
 sky:
 Serial.println(".");
 lcd.clear();
 lcd.setCursor(0, 0);
 lcd.print("CountDown Timer");
 lcd.setCursor(7, 1);
 lcd.print(z);
 z--;
 Alarm.delay(999);
 delay(1);
 if (trig == 0||digitalRead(centerButton)==HIGH){goto ground;}
 goto sky;
 ground:
 trig = 0;
 lcd.clear();
}
void timer(){
 Serial.println("Boom, timer is on!! :)");
 lcd.clear();
 lcd.setCursor(3, 0);
 lcd.print("Time's Up!");
 for (int i = 0; i<=10; i++){
 for (int j = 0; j<=3; j++){
 digitalWrite(buzz, HIGH);
 delay(70);
 digitalWrite(buzz, LOW);
 delay(70);
 }
 delay(700);
 }
 trig = 0;
}

Mas información en http://www.instructables.com/id/IoT-Weather-Box-with-Custom-Alarms-Timers/

Electrónica de una CNC


Cada  vez se  nos pone mas sencillo    interactuar con  el mundo físico , no solo desde el punto de vista  de complejidad, sino también debido a  la  simplicidad  conseguida gracias a  la elevada miniaturización, lo cual  que  se suele traducir en precios muy bajos y diseños sencillos, especialmente  en la parte de la electrónica necesaria.

Como ejemplo usando Arduino se pueden construir muchos tipos de proyectos CNC  gracias al ingenio de muchas personas  así como la ayuda de  la electrónica necesaria  que puede condensarse   simplemente en este escudo   con el que se   pueden  controlar  por medio de un Arduino   3 motores paso a paso gracias a que los propios  módulos de controladores pueden  insertarse en cada zócalo  proporcionando así  la capacidad al eje motor de impulsión 3 motores  paso a paso (X, Y y Z).

cnc_shield_v3_2

En este escudo  para Arduino,  los motores paso a paso se pueden conectar con conectores molex de 4 pines o también se  pueden soldar los cuatro  hilos de cada motor directamente al conector  en su lugar

A propósito de las conexiones soldadas del motor  : la conexión o desconexión de los cables de un motor paso a paso mientras el driver  está alimentado puede destruir al driver  (por ejemplo   soltando por accidente algún hilo, cruzando  entre si  hilos , etc) así que es buena idea que los cables de los  motores estén sólidamente  conectados a la placa.

Asimismo al  igual que otras controladoras, esta placa se alimenta aparte de la fuente de Arduino con una tensión continua entre 12-36V DC.  En este punto es de destacar que por el momento sólo los controladores DRV8825 pueden manejar hasta 36V , por lo que considere un  voltaje de funcionamiento menor  para  alimentar al escudo.

Respecto a los drivers de cada motor como se puede ver en la foto , son enchufables   para facilitar su remplazo en caso de avería o fallo  y   están basados en  controlados de motores paso a paso del tipo   A4988  o DRV8825. Cada driver incluye puentes para configurar el Micro-Stepping para los controladores paso a paso con cinco modos de paso seleccionables: full, 1/2, 1/4, 1/8 y 1/16. (algunos controladores como el DRV8825 pueden hacer hasta 1/32 micro-stepping)

Resumidamente estas son las características de este nuevo escudo controlador multi-driver:

  • Compatibilidad con Arduino GRBL
  • Baja salida RDS (On)
  • Se puede utilizar para una máquina de grabado
  • Es compatible con GRBL 0.9 (Firmware de código abierto que se ejecuta en un Arduino UNO que convierte los comandos de código G en señales para  los motores paso a paso)
  • Soporte de 4 ejes (X, Y, Z, A-Puede duplicar X, Y, Z o hacer un 4to eje completo con firmware personalizado usando los pins D12 y D13)

 

En la siguiente imagen  de un Arduino  vemos la correspondencia con los pines del escudo para el control de los tres motores:.

cnc_shield_v3_3

 

Excepto todos los pines  citados ,  este escudo ( Arduino CNC Shield V3.0 ) contiene otros pines que admiten más funciones:

Arduino-CNC-Shield-Scematics-V3.XX_

Arduino-CNC-Shield-V3-Layout

Las funciones de los pines extras son los siguientes:

  • Interruptor de límite de pines ha sido duplicado por que cada eje tenga un “Top / +” y “fondo /-“. Esto hace más fácil de instalar dos interruptores de límite para cada eje.(usar con un interruptor normalmente abierto)
  • EStop – estos pines se pueden conectar a un interruptor de parada de emergencia. Esto hace lo mismo que el botón RESET en la placa Arduino. ( también puede ser instalado un botón adicional de emergencia que corta la corriente a toda la maquinaria. )
  • Control del husillo y el refrigerante tiene sus propios pins.
  • Comando Pin externos GRBL  se han quitado lo que le permite añadir botones de pausa/espera, reanudar y abortar.
  • Los pines serie (D0-1) y  los de I2C (A4-5) tienen su propia salida   para futuras ampliaciones. Por ejemplo  I2C se podría implementar software para  controlar cosas como la velocidad del huso o control del calor.
  • Versión 3.00 añadió unos jumpers para configurar el eje 4 (clon el otro eje o pin D12-13), comunicaciones (RX+TX, I2C) y una cabecera de control paso a paso (todos los pines necesitan para ejecutar 4 steppers)

Instalación de hardware

Se deben observar las siguientes advertencias:

  • Inversión de la polaridad de la alimentación o conectar incorrectamente la energía destruirá el  escudo
  •  Siempre asegúrese de insertar conexiones en la a orientación correcta y en la toma adecuada  correctamente
  • El escudo de CNC Arduino es compatible con fuentes de alimentación hasta 36V. Eso significa que todos los drivers de chip paso a paso NO se deben alimentar con  ese valor pues  controladores A4988  no están diseñados para funcionar a 36V de modo que si lo alimenta con ese valor  puede destruirlos.  Alimentación de  36V son para los drivers  como la Pololu DRV8825 que pueden funcionar con + 36V

ESQUEMA CONEXIONES PARA MODULO A4988

A4988

ESQUEMA CONEXIONES PARA MODULO DRV8824/DRV8825

DRV8825

ESQUEMA CONEXIONES PARA MODULO TMC2100

TMC2100

Instalación del software

1) Obtener código GRBL en Arduino

Descargar el código GRBL desde enlace:grblmain.zip descomprimir el archivo y copiar a la carpeta de las bibliotecas de arduino IDE, haga clic en abierto arduino IDE File -> ejemplos -> grblmain -> GRBLtoArduino, elegir la mesa correcta y COM, luego cargar el código de GRBLtoArduino a UNO

IDE

2
3

2) Instalar software de controlador grbl

Descargar software de controlador grbl desde enlace:GrblController.exe , descarga e instala, abra el software de controlador grbl como sigue

grblcontroller361 (2)

Conectar el  Arduino UNO al PC con cable USB, seleccione el puerto correcto, ajustar la velocidad de Baute como “9600”, haga clic en “Abrir”, una vez conectado, el botón “Abrir” cambiará a “Cerrar/Reset” con color de fondo rojo. Haga clic en “seleccionar archivo” para seleccionar el archivo, haga clic en “Begin” para empezar a  el grabado  (si  es que los motores están configurados en una maquina CNC   al que se haya acoplado un diodo láser  como por ejemplo esta maquina hecha con piezas de CD’s )

Como construir una maquina CNC a partir de piezas recicladas


A veces las partes viejas de ordenadores pueden ser muy útiles para muchas cosas pero sobre todo es muy destacable    las fuentes de alimentación (tanto de portátiles como  de ordenadores fijos )  de las que tantas veces hemos hablado en este blog , no solo para  usar la salidas de 12 y 5V , sino incluso para hacer asociaciones de  varias fuentes  para generar fuentes con tensiones o intensidades mayores .
El reciclaje de las piezas de un ordenador  no queda en la fuente,  pues hay un sinfín de  otras piezas  útiles  que podemos  reciclar en un viejo ordenador, como por ejemplo:
  •  Las pantallas de los portátiles  que  pueden usarse  con una controladora barata como un  monitor.
  • Las memorias  que pueden utilizarse para otros aparatos electrónicos.
  • Los ventiladores  y radidadores  usados para refrigerar las CPU  nos pueden servir para refrigerar nuestros circuitos o  incluso para otras aplicaciones con celulas de Peltier
  •  Las cajas ATX  tienen un sinfín de aplicaciones
  • De los lectores de CD / DVD podemos usar los motores,la mecánica  y el láser
  • De las viejas disqueteras   podemos usar los motores,la mecánica
  • Tornillos , herrajes ,etc

En el post de hoy a vamos a  ver como es posible construir una maquina  CNC o una impresora 3D     con la mecánica  de dos  o tres lectores dvd ( o incluso incluyendo una disquetera) invirtiendo muy poco dinero, pues tan solo necesitaríamos una mínima  electronica de control aparte.

Las partes hardware que necesitamos son:
  •  3 lectores de CD o DVD que no usemos
  • 1 Arduino (Uno en nuestro caso)
  • 3 controladras de motor paso  a paso
  • Fuente de alimentación  de 5v DC ( nos vale una vieja fuente de PC)
El sofware necesario seria el siguiente:

Ensamblaje

Para empezar  con este proyecto  lo primero  es desmontar  los  lectores de CD o DVD
disco1
Como vemos  ,en su interior vamos a ver encontrar una placa  metálica con un motor paso paso (compuesto por  dos bobinados independientes ) y cuyo eje es un tornillo sin  fin , lo cual es la pieza clave  para   reciclar . Asimismo necesitaremos las carcasas de dos de ellas  y los componentes necesarios para fijarlos al chasis (  el laser  y los otros motores no son necesarias).
Cada motor va a simular cada uno de los ejes de la maquina (X,Y,Z)  por los que en los contactos de cada motor  soldaremos un cablecillo  a cada contacto para hacer las 4  conexiones  con las controladoras ( podemos eliminar el cable de cinta flexible que suelen llevar pues es muy difícil que den la medida).
En este punto es interesante identificar mediante una sencilla de prueba de continuidad con un polímetro   usándolo en modo  resistencia  para  saber cuales son los dos bobinados  ( entre si   no deben tener continuidad )
 cables.JPG
Una vez tengamos el cableado hecho de los motores nos tocaría la parte mecánica la cual quizás sea la parte mas engorrosa  y difícil de llevar a cabo   pues realmente no existe una única solución  a este problema   a la hora de afrontar el ensamblaje  que básicamente  consiste en  fijar los carros con  los motores paso a paso en los tres ejes x, y , z  para formar un único conjunto.
En primer  lugar  , nos centraremos en lo que será el eje Y  . Usando  una carcasa colocaremos uno de los  carros junto con el motor  por medio de  soportes tratando de alinearlo lo mas cercano a uno de los bordes  y centrándolo sobre este.
Los soportes pueden ser metálicos roscados ( se pueden comprar en ferreterias)  o separadores de plástico de los usadas para las placas madre.
ejey
De un modo similar  también fijaremos otro carro con su motor a otras de las carcasas de manera que crearemos para el eje X (obviamente la idea  es montarlo perpendicularmente al montaje del eje y). Asimismo también debemos fijarlos  a una de los bordes en la parte superior y centrados sobre este cuerpo.
Los soportes usados también  pueden ser metálicos roscados ( se pueden comprar en ferreterias)  o separadores de plástico de los usadas para las placas madre.
ejex.png
Ahora nos toca el eje z  que se diferencia   de los dos anteriores  que debe ir colocado sobre  uno de los ejes: más  concretamente el eje x.
El eje Z a diferencia de los otros dos lo instalaremos en una placa  liviana ( por ejemplo de vaquelita ,plástico, metílica,etc  ) para luego  montarla en los soportes del eje X
ejez.png
Una vez que tenemos los tres ejes es hora de  unir  ambas carcasa  por  las  base del eje Y y X  formando un angulo recto.
Normalmente muchos aficionados usan escuadras metálicas   e incluso pequeños perfiles metálicos entre ambas carcasas  : todo depende de lo solido que haya quedado la unión así que  quizás  no sea tan necesario en función de como queden fijadas ambas partes
escuadras1.png
Una vez que hayamos ensamblados  lso tres ejes , nuestro proyecto ha tomando toda su  forma, por  lo que solo nos queda conectar  los motores paso a paso a  los controladores   y estos a la placa Arduino Uno.
Las conexiones de cada motor irán a cada driver  de motor  paso  a paso y las entradas  de estos  a la placa Arduino Uno según las siguientes  conexiones digitales:
  • Eje x: puertos 3 y 6, GND
  • Eje Y : puertos 4 y 7,GND
  • Eje Z: puertos 5 y  8;GND

Asimismo no debemos olvidar las conexiones de alimentacion de la placas de los drivers (+5V) que se recomienda no se obtengan de Arduino  sino directamente desde  la fuente auxiliar

El esquema electrico final seria el  siguiente:
Diagramas
Cuando hayamos  conectado e instalado, lo que quedaría seria ir configurando el software necesario para hacerla funcionar.
En youtube podemos encontrar  miles de videotutoriales  que explican con detalles estos pasos por lo que no lo vamos a repetir aquí
Como pinceladas  dejamos dos vídeos muy claros al respecto para que sirvan  como guía:
Con eso concluimos  de este proyecto, lo cual es la base para diferentes usos como puede ser un plotter , una fresadora o incluso colocando un extrusor una impresora 3D,una grabadora láser , etc
final.png

Plataforma de sensores e-Health V1.0 para Arduino y Raspberry Pi [aplicaciones biométricas / medicina]


En agosto de 2013 Cooking Hacks lanzó la nueva versión del primer escudo biométrica para Arduino y Raspberry Pi: la plataforma  e-Health Sensor. Gracias a la retroalimentación de la comunidad y varios proyectos que han sido creados con esta, han mejorado la plataforma de e-Health con nuevas características tales como:

  • Nuevo sensor de músculo
  • Sensor de presión de la sangre nueva
  • Glucómetro actualizado
  • Nuevas posibilidades de conexión

En este post  vamos a explicar cómo trabajar cplataforma  e-Health Sensor.V2.0.

E-Health Sensor Shield V2.0 permite a los usuarios de Arduino y Raspberry Pi realizar aplicaciones biométricas y médicas donde la supervisión del cuerpo sea necesaria mediante el uso de 10 sensores diferentes: pulso, oxígeno en sangre (SPO2), flujo de aire (respiración), temperatura corporal, Electrocardiograma (ECG), glucómetro, respuesta galvánica de la piel (GSR – sudoración), presión arterial (esfigmomanómetro), posición del paciente (acelerómetro) y sensor de músculo/eletromyography (EMG).

Esta información puede utilizarse para monitorizar en tiempo real el estado de un paciente o para obtener datos sensibles para ser analizados posteriormente para el diagnóstico médico. La información biométrica obtenida puede enviarse sin cables usando cualquiera de las 6 opciones de conectividad: Wi-Fi, 3 G, GPRS, Bluetooth, 802.15.4 y ZigBee dependiendo de la aplicación.

Si para  el diagnóstico de la imagen en tiempo real es necesaria una cámara puede conectarse el módulo 3G para enviar fotos y videos del paciente a un centro de diagnóstico médico.

Los datos pueden enviarse a la nube para almacenamiento permanente o visualizarlos en tiempo real enviando los datos directamente a un ordenador portátil o Smartphone. También  hay desarrollado  varias aplicaciones iPhone y Android  para poder ver fácilmente la información del paciente.

La privacidad es uno de los puntos clave en este tipo de aplicaciones. Por esta razón, la plataforma incluye varios niveles de seguridad:

    • En la capa de enlace de comunicación: AES 128 para 802.14.5 / ZigBee y WPA2 para Wifi.
    • En la capa de aplicación: mediante el protocolo HTTPS (seguro) nos aseguramos de un túnel de seguridad de punto a punto entre cada nodo de sensor y el servidor web (este es el mismo método utilizado en las transferencias bancarias).

e-Health protector del Sensor sobre Arduino (izquierda) frambuesa Pi (derecha)

Importante: La plataforma de e-Health Sensor ha sido diseñada por Cooking Hacks (la división de hardware abierto de Libelium) para ayudar a los investigadores, desarrolladores y artistas para medir datos de sensor biométrico para fines de experimentación, diversión y prueba proporcionando una alternativa barata y abierta en comparación con las soluciones propietarias  debido al precio prohibitivo de llas profesionales usadas por el  mercado médico. Precisamente por esta razon, como la plataforma no tiene certificaciones médicas no puede  ser utilizada para monitorizar pacientes críticos que necesitan un control médico preciso o aquellos cuyas condiciones deben medirse con precisión para un diagnóstico profesional ulterior.
Gracias a la comunidad Arduino y Raspberry  Pi ,es  posible  una rápida prueba de concepto y servir de  base de una nueva era de productos médicos de código abierto.

El paquete que vamos a utilizar en este tutorial se basa en la plataforma de Sensor de eHealth de Cooking Hacks. La E-Health protector del Sensor es totalmente compatible con las nuevas y viejas versiones de Arduino USB, Duemilanove y Mega y Rsapberry.

  • 8 sensores médicos no invasiva + 1 invasoras
  • Almacenamiento y uso de las mediciones de glucosa.
  • Monitoreo de señales ECG.
  • Señales de monitorización EMG.
  • Control de flujo de aire del paciente.
  • Control de flujo de aire del paciente.
  • Datos de la temperatura del cuerpo.
  • Medidas de respuesta galvánica de la piel.
  • Detección de la posición del cuerpo.
  • Funciones de pulso y oxígeno.
  • Dispositivo de control de la presión arterial.
  • Múltiples sistemas de visualización de datos.
  • Compatible con todos dispositivos UART.

Características eléctricas:

La placa puede ser alimentada por el PC o por una fuente externa. Algunos de los puertos USB en los ordenadores no son capaces de dar toda la corriente para que el módulo pueda  trabajar, si el módulo tiene problemas cuando funcione, se puede utilizar una fuente externa (12V – 2A) en el Arduino/RasberryPi

El escudo

 

Escudo de e-Health sobre Raspberry Pi

Para conectar el protector del Sensor e-Health para Raspberry Pi es necesario un  adaptador que haga de puente de conexión .

La idea detrás del  puente de conexión Arduino shields es permitir utilizar cualquiera de los escudos, placas y módulos diseñados para Arduino en Raspberry Pi. También incluye la posibilidad de conectar sensores analógicos y digitales, utilizando el mismo pinout de Arduino pero con la potencia y capacidades de Raspberry Pi

La conexión puente es compatible con Raspberry Pi, Raspberry Pi (modelo B +), Raspberry Pi 2 y el Raspberry Pi 3.

Para hacer completa la compatibilidad han creado la biblioteca de arduPi que permite el uso de frambuesa con el mismo código utilizado en Arduino. Para ello, han implementado funciones de conversión de modo que usted puede controlar de la misma manera como en Arduino la entrada-salida interfaces: i2C, SPI, UART, analógica, digital, en Raspberry Pi.

Vamos a resumir lo que podemos hacer con este escudo junto con la biblioteca de arduPi:

ADVERTENCIAS:

  • Los módulos LCD, esfigmomanómetro y comunicación utilizan el puerto UART y no pueden trabajar al mismo tiempo.
  • El glucómetro es ahora compatible con otros dispositivos UART y tiene su propio conector. Pero no puede trabajar con el esfigmomanómetro conectado.
  • El sensor de EMG y el ECG no pueden trabajar al mismo tiempo. Utilizar los puentes integrados en el tablero para utilizar uno u otro
  • Para utilizar el sensor de EMG, usted tiene que tener los puentes en la posición de EMG. Para utilizar el sensor de ECG, usted tiene que tener los puentes en la configuración de ECG.

El escudo

Versión 2 del escudo:

  • Esta versión incluye un conmutador Digital para activar/desactivar la toma de corriente para módulos inalámbricos usando GPIO23 (Digital Pin 3).

Versión 1 del escudo:

  • 8 pines digitales.
  • Conector para módulos inalámbricos.
  • Pernos de RX/TX.
  • pasadores de i2C (SDA, SCL).
  • Pasadores de SPI (SCK MISO, MOSI, CS). Puede utilizarse también como GPIO.
  • 8 canales convertidor analógico a digital.
  • Interruptor para activar la fuente de alimentación externa.

 La biblioteca: arduPi

arduPi es una librería C++ que permite escribir programas para Raspberry Pi como si estuvieras escribiendo un programa de arduino. Todas las funciones para el control de comunicaciones del puerto serie, i2C, SPI y GPIO pins están disponibles mediante la sintaxis de arduino.

arduPi ha sido probado en una distribución Raspbian. Para grabar una imagen de Raspbian a la tarjeta SD se pueden descargar los NOOBS aquí y siga estas instrucciones.

Una vez instalado Raspbian, descargue e instale arduPi biblioteca en una carpeta nueva, por ejemplo: “página de inicio/pi/ardupi”

Para Rasberry Pi:

wget http://www.cooking-hacks.com/media/cooking/images/documentation/raspberry_arduino_shield/raspberrypi.zip && unzip raspberrypi.zip && cd cooking/arduPi && chmod +x install_arduPi && ./install_arduPi && rm install_arduPi && cd ../..
Para Raspberry Pi 2 y 3:
wget http://www.cooking-hacks.com/media/cooking/images/documentation/raspberry_arduino_shield/raspberrypi2.zip && unzip raspberrypi2.zip && cd cooking/arduPi && chmod +x install_arduPi && ./install_arduPi && rm install_arduPi && cd ../..

Descargar arduPi biblioteca para Raspberry Pi

Descargar biblioteca de arduPi de frambuesa Pi 2 y 3

Usted puede encontrar una biblioteca de cambios aquí.

Funciones generales de Arduino:

  • Delay()
  • delayMicroseconds()
  • Millis()
  • pinMode()
  • digitalWrite()
  • digitalRead()
  • analogRead() (en pines de A0 a A7. Ejemplo: analogRead(5) leerá A5)
  • shiftIn()
  • shiftOut()
  • attachInterrupt() *
  • detachInterrupt()

[*] Podemos detectar interrumpe el ascenso y descenso. Cualquier pin digital (de 2 a 13) puede ser utilizado en attachInterrupt(). Por ejemplo, si queremos estar al tanto de eventos de levantamiento en el pin 6 que podemos hacer attachInterrupt(6,function_to_call,RISING).

Biblioteca  serie:

  • available()
  • begin()
  • end()
  • Flush()
  • Peek()
  • Print()
  • println()
  • Read()
  • readBytes()
  • readBytesUntil()
  • Find()
  • findUntil()
  • parseInt()
  • parseFloat()
  • setTimeout()
  • Write()

Biblioteca wire:

  • begin()
  • requestFrom()
  • beginTransmission()
  • endTransmission()
  • Write()
  • Read()

Biblioteca SPI:

  • begin()
  • end()
  • setBitOrder()
  • setClockDivider()
  • setDataMode()
  • Transfer()

Uso de la biblioteca arduPi:

En la carpeta de biblioteca encontrarás 3 archivos: arduPi.cpp, arduPi.h y arduPi_template.cpp
el archivo arduPi_template.cpp está destinado a ser utilizado como punto de partida para crear programas con el mismo comportamiento como un programa de arduino.

Aquí puede ver el código de plantilla:

//Include arduPi library
    #include "arduPi.h"

    /*********************************************************
     *  IF YOUR ARDUINO CODE HAS OTHER FUNCTIONS APART FROM  *
     *  setup() AND loop() YOU MUST DECLARE THEM HERE        *
     * *******************************************************/

    /**************************
     * YOUR ARDUINO CODE HERE *
     * ************************/

    int main (){
        setup();
        while(1){
            loop();
        }
        return (0);
    }

Como se puede ver en la función main() la función setup() es llamada una vez y luego la función loop() se llama contínuamente hasta que el programa se ve obligado a terminar.

Ya sea si están empezando a escribir un nuevo programa, o si usted tiene un programa de arduino escrito que utiliza las funciones portadas puede utilizar la plantilla (ardupi_template.cpp) y poner el código de arduino donde dice: el código de ARDUINO aquí. Recuerde que el programa que está escribiendo un programa C++ para que todas las bibliotecas de C++ pueden utilizarse.

También recordar, como se puede leer en la plantilla que si el código de arduino utiliza otras funciones setup() y loop() debe declararlos en el área indicada.

 Habilitación de Interfaces:

Los siguientes pasos han sido probados con Raspbian Jessie: 4.4.9 (Linux versión 4.4.9-v7+ ([email protected]) (gcc versión 4.9.3 (crosstool-NG crosstool-ng-1.22.0-88-g8460611)) #884 SMP el viernes 6 de mayo 17:28:59 BST 2016)

Raspberry Pi 2:

  • Abrir un terminal en la Raspberry Pi, o conecte al Raspberry Pi a través de SSH.
  • Abra el archivo /boot/config.txt: sudo nano /boot/config.txt
  • Agregue las líneas siguientes al archivo:
#enable uart interface
enable_uart=1

#enable spi interface
dtparam=spi=on

#enable i2c interface
dtparam=i2c_arm=on
  • Presione CTRL + X para salir y guardar el archivo.
  • Actualizar el sistema operativo con los últimos parches.
sudo apt-get update
sudo apt-get upgrade
  • Reiniciar la Raspberry Pi.
sudo reboot

Raspberry Pi 3:

  • Abrir un terminal en la Raspberry Pi, o conecte al Raspberry Pi a través de SSH.
  • Abra el /boot/config.txt archivo <:sudo nano /boot/config.txt
  • Agregue las líneas siguientes al archivo:
#map mini-UART to internal bluetooth an free-up main UART to handle CookingHacks modules
dtoverlay=pi3-miniuart-bt

#enable uart interface
enable_uart=1

#enable spi interface
dtparam=spi=on

#enable i2c interface
dtparam=i2c_arm=on
  •  Presione CTRL + X para salir y guardar el archivo.
  • Abra el archivo /boot/cmdline.txt:sudo nano /boot/cmdline.txt
  • Este archivo contiene algo similar a esto (el contenido puede variar):
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
  • Eliminar los parámetros que hacen referencia al puerto serie UART (ttyAMA0):
dwc_otg.lpm_enable=0  console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait ip=192.168.1.160:::255.255.255.0
  • Presione CTRL + X para salir y guardar el archivo.
  • Actualizar el sistema operativo con los últimos parches.
sudo apt-get update
sudo apt-get upgrade
  • Reiniciar la Raspberry Pi.
sudo reboot
    

Ejecución de su programa

Para ejecutar el programa debe tener los permisos adecuados para utilizar GPIO (/ dev/mem debe accederse en la frambuesa). Puede ejecutar el programa con sudo:

sudo ./MY_PROGRAM

 Circuitos básicos.

ADVERTENCIA: los niveles de voltaje GPIO 3.3 V y no 5 V tolerantes. No hay ninguna protección de sobretensión en el tablero. Entradas digitales utilizan un nivel de lógica de 3V3 y no son tolerantes de niveles 5V, como se podría encontrar en un Arduino 5V alimentado.Tenga extrema precaución cuando trabaje con GPIO, puede dañar su Raspberry Pi, su equipo y potencialmente a sí mismo y otros. Si lo hace es bajo su propio riesgo!

4.1 GPIO de entrada

Periféricos GPIO varían bastante. En algunos casos, son muy simples, por ejemplo un grupo de pines pueden activarse como un grupo a la entrada o salida. Los voltajes de entrada y de salida son por lo general limitado a la   tensión de alimentación del dispositivo con los GPIOs por lo que pueden resultar dañados por una mayor tensión.

Algunos GPIOs tienen 5 entradas tolerantes V: incluso en los voltajes de la fuente baja, el dispositivo puede aceptar 5V sin daño.

Para Raspberry Pi, presentamos un ejemplo de cómo adaptar el nivel de voltaje de una medida de sensor de 5V para evitar posibles daños.

Componentes para este ejemplos y circuito de adaptación de tensión pueden fundados en el Starter Kit para Raspberry Pi.

Cuando un pin GPIO se configura como una entrada con un ejemplo de botón básico, podemos tener estos problemas de incompatibilidad de voltajes.

Este circuito es malo porque cuando usted presiona el botón de la entrada GPIO está conectada a 5 voltios, por lo tanto nuestro dispositivo puede dañarse.

Sin embargo, esto puede evitarse utilizando simplemente una resistencia en el cable del pulsador. El valor de la resistencia se determina por la corriente de la salida de los pines GPIO (la corriente por el circuito solía para leer el pin) y la cantidad de caída de voltaje que crea como resultado de ello. Con el resistor de 5K se obtiene 3, 3V en lo GPIO de entrada.

Vgpio = 5V· (10K/(10K+5K)) = 3, 3V

 medición del Sensor GPIO

Tenemos el mismo problema si utilizamos un sensor funcionando a 5 voltios.

Aquí está un ejemplo usando un sensor PIR.

Como se muestra en la imagen, utilizamos el mismo divisor resistivo utilizado para adaptar el nivel de tensión.

 ADC.

El escudo incluye a un ADC de 12b de la resolución que permite para conectar cualquier sensor a frambuesa con mayor precisión que Arduino. La comunicación entre la Raspberry Pi  y el ADC del escudo se realiza vía i2C.

La información de cada canal se puede obtener dos bytes de lectura de i2C, pero previamente un byte (que corresponde a la dirección de canal) debe enviar a través de i2C dependiendo del canal que queremos seleccionar. Aquí está una lista con las direcciones de canal:

Canal Dirección
0 0xDC
1 0x9C
2 0xCC
3 0x8C
4 0xAC
5 0xEC
6 0xBC
7 0xFC

Veremos un ejemplo de un programa que lee cada canal continuamente esperando 5 segundos entre repeticiones.

Con un cable de conexión el pin de 5V con algunos de los pines del ADC un valor cerca de 5.000000 debe leerse.

Todos los ejemplos en esta guía utilizan la biblioteca arduPi

//Include arduPi library 
#include "arduPi.h" 

char selected_channel[1];
char read_values[4];

int channel_0 = 0; 
int channel_1 = 0; 
int channel_2 = 0; 
int channel_3 = 0; 
int channel_4 = 0; 
int channel_5 = 0; 
int channel_6 = 0; 
int channel_7 = 0; 

float analog_0 = 0.0; 
float analog_1 = 0.0; 
float analog_2 = 0.0; 
float analog_3 = 0.0; 
float analog_4 = 0.0; 
float analog_5 = 0.0; 
float analog_6 = 0.0; 
float analog_7 = 0.0; 

void setup() 
{ 
  Wire.begin(); // join i2C bus (address optional for master) 
} 

void loop() 
{ 
  // channel 0 
  Wire.beginTransmission(8); 
  selected_channel[0] = 0xDC;
  Wire.read_rs(selected_channel, read_values, 2);
  Wire.read_rs(selected_channel, read_values, 2);
  channel_0 = int(read_values[0])*16 + int(read_values[1]>>4); 
  analog_0 = channel_0 * 5.0 / 4095.0;
  printf("Channel 0:\n");
  printf("Digital value = %d / Analog value = %fV\n\n", channel_0, analog_0); 


  // channel 1 
  Wire.beginTransmission(8); 
  selected_channel[0] = 0x9C;
  Wire.read_rs(selected_channel, read_values, 2);
  Wire.read_rs(selected_channel, read_values, 2);
  channel_1 = int(read_values[0])*16 + int(read_values[1]>>4); 
  analog_1 = channel_1 * 5.0 / 4095.0;
  printf("Channel 1:\n");
  printf("Digital value = %d / Analog value = %fV\n\n", channel_1, analog_1); 
  
 
  // channel 2 
  Wire.beginTransmission(8); 
  selected_channel[0] = 0xCC;
  Wire.read_rs(selected_channel, read_values, 2);
  Wire.read_rs(selected_channel, read_values, 2);
  channel_2 = int(read_values[0])*16 + int(read_values[1]>>4); 
  analog_2 = channel_2 * 5.0 / 4095.0;
  printf("Channel 2:\n");
  printf("Digital value = %d / Analog value = %fV\n\n", channel_2, analog_2); 
  
  
  // channel 3 
  Wire.beginTransmission(8); 
  selected_channel[0] = 0x8C;
  Wire.read_rs(selected_channel, read_values, 2);
  Wire.read_rs(selected_channel, read_values, 2);
  channel_3 = int(read_values[0])*16 + int(read_values[1]>>4); 
  analog_3 = channel_3 * 5.0 / 4095.0; 
  printf("Channel 3:\n");
  printf("Digital value = %d / Analog value = %fV\n\n", channel_3, analog_3); 
  
  
  // channel 4 
  Wire.beginTransmission(8); 
  selected_channel[0] = 0xAC;
  Wire.read_rs(selected_channel, read_values, 2);
  Wire.read_rs(selected_channel, read_values, 2);
  channel_4 = int(read_values[0])*16 + int(read_values[1]>>4); 
  analog_4 = channel_4 * 5.0 / 4095.0; 
  printf("Channel 4 (vertical header):\n");
  printf("Digital value = %d / Analog value = %fV\n\n", channel_4, analog_4); 
  
  
  // channel 5 
  Wire.beginTransmission(8); 
  selected_channel[0] = 0xEC;
  Wire.read_rs(selected_channel, read_values, 2);
  Wire.read_rs(selected_channel, read_values, 2);
  channel_5 = int(read_values[0])*16 + int(read_values[1]>>4); 
  analog_5 = channel_5 * 5.0 / 4095.0; 
  printf("Channel 5 (vertical header):\n");
  printf("Digital value = %d / Analog value = %fV\n\n", channel_5, analog_5); 
  
  
  // channel 6 
  Wire.beginTransmission(8); 
  selected_channel[0] = 0xBC;
  Wire.read_rs(selected_channel, read_values, 2);
  Wire.read_rs(selected_channel, read_values, 2);
  channel_6 = int(read_values[0])*16 + int(read_values[1]>>4); 
  analog_6 = channel_6 * 5.0 / 4095.0; 
  printf("Channel 6 (vertical header):\n");
  printf("Digital value = %d / Analog value = %fV\n\n", channel_6, analog_6); 
  
  
  // channel 7 
  Wire.beginTransmission(8); 
  selected_channel[0] = 0xFC;
  Wire.read_rs(selected_channel, read_values, 2);
  Wire.read_rs(selected_channel, read_values, 2);
  channel_7 = int(read_values[0])*16 + int(read_values[1]>>4); 
  analog_7 = channel_7 * 5.0 / 4095.0;
  printf("Channel 7 (vertical header):\n");
  printf("Digital value = %d / Analog value = %fV\n\n", channel_7, analog_7); 
  
  
  printf("***********************************\n"); 



  delay(1000); 

} 


int main (){ 
    setup(); 
    while(1){ 
        loop(); 
    } 
    return (0); 
}
                

Aquí está la salida de este programa que se conecta al pin de 5V de la Raspberry  Pia la entrada analógica 0:

UART.

Acceso al UART con arduPi biblioteca es tan simple como hacerlo con Arduino.

Necesita incluir arduPi.h en el código y crear una instancia de clase SerialPi nombrarlo serie.

Nombre de la instancia como serie le permite utilizar la sintaxis de arduino. (Todo esto está ya hecho si utilizas la plantilla proporcionada para crear sus programas).

Las funciones disponibles son:

  • Serial.Available()
  • Serial.Begin()
  • Serial.end()
  • Serial.Flush()
  • Serial.Peek()
  • Serial.Print()
  • Serial.println()
  • Serial.Read()
  • Serial.readBytes()
  • Serial.readBytesUntil()
  • Serial.Find()
  • Serial.findUntil()
  • Serial.parseInt()
  • Serial.parseFloat()
  • Serial.setTimeout()
  • Serial.Write()

Todas estas funciones tienen la misma funcionalidad que el arduino unos. Puede encontrar más información en:http://Arduino.CC/en/Reference/serial

Un ejemplo de código que se pueden encontrar en el tutorial de frambuesa Pi XBee acess el UART

 i2C.

Un ejemplo de uso de i2C puede encontrarse en la sección de ADC .

Aquí mostramos otro ejemplo usando lo BlinkM RGB i2C controlado dirigido.

BlinkM utiliza una alta calidad, poder más elevado LED RGB y un pequeño Microcontrolador AVR para permitir que un usuario de una interfaz i2C simple digital control de un LED RGB.

En el ejemplo vamos a cambiar el color led usando fade transiciones y también cambiando directamente. Más información sobre lo LED y los comandos que podemos enviar a él puede encontrarse en la hoja de datos.

Conectar la clavija (-) del led con el pin GND del escudo.

Conecta (+) del pin del led con el pin de 5V de la pantalla.

Conectar la clavija d del led con el pin SDA del escudo.

Conectar la clavija c del led con el pin SCL del escudo.

Aquí está el código:

/*  
 *  Raspberry Pi to Arduino Shields Connection Bridge
 *  
 *  Copyright (C) Libelium Comunicaciones Distribuidas S.L. 
 *  http://www.libelium.com 
 *  
 *  This program is free software: you can redistribute it and/or modify 
 *  it under the terms of the GNU General Public License as published by 
 *  the Free Software Foundation, either version 3 of the License, or 
 *  (at your option) any later version. 
 *  a
 *  This program is distributed in the hope that it will be useful, 
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of 
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 *  GNU General Public License for more details.
 *  
 *  You should have received a copy of the GNU General Public License 
 *  along with this program.  If not, see http://www.gnu.org/licenses/. 
 *  
 *  Version:           2.0
 *  Design:            David Gascón 
 *  Implementation:    Jorge Casanova & Luis Martín
 */


//Include arduPi library
#include "arduPi.h"


void setup(){
    Wire.begin();
    Wire.beginTransmission(9);
    Wire.write('o'); //End the current Light script
    Wire.endTransmission();
}

void loop(){
    for (int i=0;i < 5;i++){
        Wire.beginTransmission(9);
        Wire.write('n'); //Change to color
        Wire.write(byte(0xff)); //Red component
        Wire.write(byte(0x00)); //Green component
        Wire.write(byte(0x00)); //Blue component
        Wire.endTransmission();

        delay(500);
        
        Wire.beginTransmission(9);
        Wire.write('n'); //Change to color
        Wire.write(byte(0x00)); //Red component
        Wire.write(byte(0x00)); //Green component
        Wire.write(byte(0xff)); //Blue component
        Wire.endTransmission();
        
        delay(500);
    }
    
    for (int i=0;i < 10;i++){
        Wire.beginTransmission(9);
        Wire.write('c'); //Fade to color
        Wire.write(byte(0xff)); //Red component
        Wire.write(byte(0x00)); //Green component
        Wire.write(byte(0x5a)); //Blue component
        Wire.endTransmission();

        delay(150);
        
        Wire.beginTransmission(9);
        Wire.write('c'); //Fade to color
        Wire.write(byte(0x55)); //Red component
        Wire.write(byte(0x20)); //Green component
        Wire.write(byte(0x5a)); //Blue component
        Wire.endTransmission();

        delay(150);
    }
}

int main (){
    setup();
    while(1){
        loop();
    }
    return (0);
}

Este código alternativo de rojo a azul cinco veces y luego hacer unas transiciones suaves entre colores violáceos.

 SPI.

Es posible comunicar con dispositivos SPI usando las funciones arduPi.

En este ejemplo utilizamos las funciones SPI para imprimir mensajes en la ST7920 LCD12864 (LCD SPI)

En primer lugar, tenemos que poner el interruptor de la pantalla LCD en modo SPI.

Ahora procedemos con la conexión entre el LCD y el Raspberry Pi a arduino shield:

VCC de la LCD a 5v del escudo

GND de la LCD a GND del escudo

SCK de lo LCD a SCK del escudo

SID de la LCD a MOSI del escudo

CS de la pantalla LCD al pin 8 del escudo

Como puedes ver estamos utilizando el número pin 8 del escudo frambuesa Pi como chip select. Así que cuando tenemos que seleccionar la pantalla LCD como el dispositivo de destino para la comunicación SPI tenemos poner el pin 8 a alta.

Aquí está el código

/*  
 *  Raspberry Pi to Arduino Shields Connection Bridge
 *  
 *  Copyright (C) Libelium Comunicaciones Distribuidas S.L. 
 *  http://www.libelium.com 
 *  
 *  This program is free software: you can redistribute it and/or modify 
 *  it under the terms of the GNU General Public License as published by 
 *  the Free Software Foundation, either version 3 of the License, or 
 *  (at your option) any later version. 
 *  a
 *  This program is distributed in the hope that it will be useful, 
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of 
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 *  GNU General Public License for more details.
 *  
 *  You should have received a copy of the GNU General Public License 
 *  along with this program.  If not, see http://www.gnu.org/licenses/. 
 *  
 *  Version:           2.0
 *  Design:            David Gascón 
 *  Implementation:    Jorge Casanova & Luis Martín
 */

//Include arduPi library
#include "arduPi.h"

int latchPin = 8;
unsigned char char1[]=" Cooking Hacks  ";
unsigned char char2[]="  SPI LCD for   ";
unsigned char char3[]="  Raspberry Pi  ";

void initialise();
void displayString(int X,int Y,unsigned char *ptr,int dat);
void writeCommand(int CMD);
void writeData(int CMD);
void writeByte(int dat);
void clear();

void setup(){
    SPI.begin();
    SPI.setBitOrder(MSBFIRST);
    SPI.setDataMode(SPI_MODE0);
    SPI.setClockDivider(SPI_CLOCK_DIV128);

    initialise();
}

void loop(){
    displayString(0,0,char1,16);
    delay(2000);
    clear();
    displayString(1,0,char2,16);
    displayString(2,0,char3,16);
    delay(2000);
    clear();
}

void initialise(){
    pinMode(latchPin, OUTPUT);     
    digitalWrite(latchPin, LOW);

    delayMicroseconds(80);

    writeCommand(0x30);
    writeCommand(0x0c);
    writeCommand(0x01);
    writeCommand(0x06);
}


void displayString(int X,int Y,unsigned char *ptr,int dat){
    int i;

    switch(X){
        case 0:  Y|=0x80;break;

        case 1:  Y|=0x90;break;

        case 2:  Y|=0x88;break;

        case 3:  Y|=0x98;break;

        default: break;
    }

    writeCommand(Y);

    for(i=0;i < dat;i++){ 
        writeData(ptr[i]);
    }

}

void writeCommand(int CMD){
    int H_data,L_data;
    H_data = CMD;
    H_data &= 0xf0;
    L_data = CMD;
    L_data &= 0x0f;
    L_data <<= 4;
    writeByte(0xf8);
    writeByte(H_data);
    writeByte(L_data);
}

void writeData(int CMD){
    int H_data,L_data;
    H_data = CMD;
    H_data &= 0xf0;
    L_data = CMD;
    L_data &= 0x0f;
    L_data <<= 4;
    writeByte(0xfa);
    writeByte(H_data);
    writeByte(L_data);
}

void writeByte(int dat){
    digitalWrite(latchPin, HIGH);
    delayMicroseconds(80);
    SPI.transfer(dat);
    digitalWrite(latchPin, LOW);
}

void clear(){
    writeCommand(0x30);
    writeCommand(0x01);
}


int main (){
    setup();
    while(1){
        loop();
    }
    return (0);
}

Este programa mostrará los mensajes “Cooking Hacks” y “SPI LCD para Raspberry Pi” con un retraso de 2 segundos en el medio.

 Mas ayuda

Se puede obtener ayuda en la sección específica creada en este  foro.

Fuente cooking-hacks