martes, 14 de septiembre de 2021

Midiendo distancias con un sensor HC-SR04

 Un complemento imprescindible para muchos de robots o vehículos controlados a distancia es un sensor que nos permita saber la distancia libre de obstáculos para movernos. Si las distancias van a ser pequeñas podemos emplear sensores de infrarrojos, pero si queremos movernos en áreas grandes y poder medir distancias en un rango de varios metros el complemento perfecto es un sensor de ultrasonidos. ¿Y porque hacer una entrada sobre un sensor sobre el que se han escrito miles de entradas? Pues por que la inmensa mayoría de entradas y revisiones sobre este sensor no se complican la vida y recurren a una librería para sacar el dato de la distancia. A ver, el uso de librerías está bien, es casi obligatorio para todo hardware minimamente complejo, pero este no es el caso ¿para que utilizar una librería cuando tan sólo hace falte un poco de ingenio y una sencilla operación matemática? Además repasaremos un concepto muy simple de física aplicada que no nos vendrá mal como argumento de que estudiar sirve para muchas cosas (además de no ser un ignorante).

Funciona exactamente igual que un radar, de hecho es un pequeño radar. Emite un pulso de sonido a una frecuencia tan alta que es imperceptible para el oído humano y cronometra el tiempo que el sonido tarda en llegar a un obstáculo, rebotar y volver al sensor. Así que tenemos 2 datos: la velocidad del sonido (343.2 m/s) y el tiempo, atención que ahora viene lo chulo, tal como aprendimos en el instituto en el nivel más básico de Física, que es la cinemática (ahora veréis como si que sirve de algo el haber estudiado) echamos mano de una conocidísima formula (e = v * t) y calculamos la distancia recorrida por el sonido. Parece fácil ¿verdad?... por que lo es y no hace falta recurrir a una librería para hacer una simple multiplicación.

Utilizaremos un sensor de ultrasonidos HC-SR04, conocidísimo, cuyo rango de medida va desde los 3cm a los 3m, suficiente para cualquier proyecto de robótica y que sólo necesita de 2 pines para  hacerlo funcionar:

El sensor de ultrasonidos sólo tiene 4 pines, uno de alimentación, uno de masa, uno de disparo (Triger) y, el último, el pin Echo por el cual nos dará la lectura del tiempo.  

A través del pin Triger enviaremos una señal de activación al sensor y para ello lo activaremos durante 10 microsegundos, es decir, le enviaremos un pulso muy corto, no necesita más. Luego transladaremos nuestra atención en el pin Echo, por este pin el sensor nos dará el tiempo que el sonido a tardado en ir, rebotar  y volver al sensor. Esto lo haremos cada vez que necesitemos tomar una media, que en el código de ejemplo será cada segundo.

La señal de salida del sensor será un pulso de la misma duración que el tiempo cronometrado, es decir, si el sonido tardó 10 microsegundos en ir del sensor al objeto y volver al sensor nos devolverá un pulso de una duración de 10 microsegundos. Así que será fácilmente medible mediante la función pulseIn(). También hay que tener en cuenta que ese tiempo es de ida y vuelta, por lo que tenemos que dividirlo por la mitad a la hora de hacer el cálculo.

Así que sin más preámbulos vamos a programar:

long tiempo;

int disparador = 7;   // triger

int entrada = 8;      // echo

float distancia;


void setup(){

  pinMode(disparador, OUTPUT);

  pinMode(entrada, INPUT);

  Serial.begin(9600);

}

            

void loop(){

  // lanzamos un pequeño pulso para activar el sensor

  digitalWrite(disparador, HIGH);

  delayMicroseconds(10);

  digitalWrite(disparador, LOW);

  

  // medimos el pulso de respuesta

  tiempo = (pulseIn(entrada, HIGH)/2); // dividido por 2 por que es el 

                                       // tiempo que el sonido tarda

                                       // en ir y en volver

  // ahora calcularemos la distancia en cm

  // sabiendo que el espacio es igual a la velocidad por el tiempo

  // y que la velocidad del sonido es de 343m/s y que el tiempo lo 

  // tenemos en millonesimas de segundo

  distancia = float(tiempo * 0.0343);

  // y lo mostramos por el puerto serie una vez por segundo

  Serial.println(distancia);

  delay(1000);

}

Así de fácil es este ejemplo. Dentro de un proyecto sería aun mas sencillo pues no necesitaríamos sacar los datos por el puerto serie (al menos no los dos) y podríamos meter todo el procedimiento dentro de una función de modo que con tan solo llamarla nos diera la distancia. De hecho yo he modificado el código para mostrar el dato de distancia en el Micro-micro y me ha quedado tal que así:


Dentro del código hay que prestar atención a los distintos tipos de datos ya que trabajamos con un unsigned long y con un float y además tenemos que hacer operaciones entre ellos, lo cual puede ser delicado.

Terminaré comentando que haciendo las pruebas con el sensor y el código del ejemplo me sorprendió lo precisas que resultan las mediciones siempre que la superficie y el sensor estuviesen bien perpendiculares, si no el rebote del sonido o los ecos parásitos podían generar medidas erróneas.

Y nada más que añadir….. bueno si, quiero hacer hincapié en que las librerías están bien para muchos casos pero en otros como este es mejor, en mi opinión, utilizar los conocimientos que hemos adquirido en otras disciplinas, como física.





sábado, 4 de septiembre de 2021

Pantalla LCD grafica de 84x48 pixeles.

 Hemos vuelto!!! Despues de años sin publicar nada retomo este blog donde ire compartiendo cosas chulas sobre arduino, processing, raspberry pi, etc.


Uno de los LCDs gráficos más populares por sus prestaciones y bajo precio, tiene una resolución de 84x48 píxeles que dan para representar gráficos y hasta 5 filas de caracteres alfanuméricos, tiene iluminación por leds y comunicación por SPI. Es la misma pantalla que montaban modelos de Nokia como el 5110 y el 3310.




Cuando pensamos en una pantalla LCD para nuestro proyecto siempre nos fijamos primero en las pantallas LCD a color y con bastante resolución, pero estas requerir un montón de pines para su control. Otra opción son las pantallas LCD controladas por serie o I2C (me viene a la cabeza las pantallas Nextion con conexión Serial), pero en estas el precio aumenta sensiblemente. La opción mas barata y más sencilla de utilizar es esta pantalla gráfica LCD que se controla con 4 pines.

Esta mini-board incluye un controlador PCD8544 que es el que se encarga de toda la gestión de los 84x48 píxeles de la pantalla. La comunicación con el controlador se hace por SPI, así que los más valientes pueden buscar el datasheet del PCD8544 y comunicarse con el directamente, el resto de seres humanos recurriremos a las librerías que en su día desarrollaron en Adafruit para controlar esta pantalla.

Lo primero que hay que tener en cuenta para conectar la pantalla a nuestro Arduino es que esta pantalla trabaja 3.3v aunque es tolerante a 5v que es nuestro voltaje de trabajo con la mayoría de placas.

Conexiones del LCD

Vamos con las conexiones:

El pin VCC es el de alimentación, lo conectaremos al pin de 3.3v de Arduino.

GND de la pantalla al GND de Arduino.

SCE ó CS (Chip Select), también conocido como SS (Slave Select) en comunicación SPI, debe activarse para indicarle al dispositivo que se le van a enviar datos.

RST (reset), no es necesario, podemos conectarlo al pin de reset de nuestro Arduino y nos ahorramos un pin.

D/C (Data / Command select).

DN (MOSI) o DIN es la entrada de datos de la pantalla (MOSI = Master Out Slave IN).

SCLK, pin por el que Arduino manda la señal de reloj que rige la comunicación.

LED, el pin de Backlight, lo que viene a ser la iluminación de la pantalla, a la que no le podemos meter 5v para no dañar los ledes, pero vamos a ser muy pillos y este pin lo vamos a conectar a un pin con salida analógica de nuestro arduino y le mandaremos un voltaje analógico de entre 0 y 168 (3,3v), yo lo suelo dejar a 120, así se ve bien.

Para este ejemplo estoy utilizando mi montaje Micro-micro, como se puede ver en las fotos. Ya podemos pasar al IDE de Arduino, primero nos bajamos la librería PCD8544  y la  Librería GFX, ambas de Adafruit (lo podemos hacer desde el gestor de librerias). Abrimos el Arduino IDE y en Ejemplos  ya nos aparece PCD8544LCD y dentro el sketch pcdtest.

En la línea 27 del Sketch aparecen las asignaciones de pines de Arduino a la comunicación SPI con la pantalla, tal cual están no funcionará por que yo he utilizado un orden diferente. Entonces en la línea que aparece:


Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);


La he cambiado para que quede así (comentario / chuleta incluida):
// Adafruit_PCD8544(SCLK, DIN, D/C, CS, RST);
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);

Y ya podemos subir el código de ejemplo y ver como en nuestra pantalla se despliega toda una demostración de sus capacidades gráficas y alfanuméricas.

Estudiando el código de ejemplo a fondo encontramos todos los métodos a emplear con la pantalla, que son:

begin() inicializa la pantalla.

setContrast(int contraste) establece el contraste, en el ejemplo está a 50.

display() si el buffer de memoria está vacío el logo de Adafruit, una vez empecemos a trabajar con ella y mandar contenido que se almacena en la memoria cuando llamemos a esta función hará que se muestre en pantalla lo que hayamos programado.

clearDisplay() borra la pantalla.

setPixel(int x,int y, color) dibuja un único pixel. El parámetro color nos lo encontraremos en más funciones y es muy simple, si ponemos un 1 se mostrará el texto o figura con pixeles negros sobre fondo transparente, en cambio si lo ponemos a 0 nuestro texto o dibujo aparecerá en pixeles blancos sobre fondo negro.

drawline(int x0, int y0, int x1, int y1, color) dibuja una línea de las coordenadas (x1, y1) a las coordenadas (x2, y2).

drawrect(int x, int y, int ancho, int alto, color) dibuja un rectángulo partiendo desde el punto (x, y) con el ancho y alto que le especifiquemos.

fillrect(int x, int y, int ancho, int alto, int color) dibuja un rectángulo sólido partiendo desde el punto (x, y) con el ancho y alto que le especifiquemos.

drawcircle(int x, int y, int radio, color) dibuja una circunferencia con el centro en (x, y) y del radio especificado.

fillcircle(int x, int y, int radio, color) dibuja una circunferencia solida con el centro en (x, y) y del radio especificado.

Los 6 métodos anteriores admiten el parámetro color, el cual puede ser 0 y 1, como he explicado antes pero también admite WHITE o BLACK, que quizá os sea más intuitivo.

setCursor(int x, int y) posiciona el cursor en la coordenada (x, y) para escribir texto a continuación, pero ATENCIÓN, las coordenadas corresponden a la esquina superior izquierda del cuadro de texto o gráfico, no os preocupéis, es fácil acostumbrarse.

print("Ardumania ") escribe el texto entre las comillas. El método print() admite los mismos parámetros de entrada que estamos acostumbrados a utilizar con el método print() de la clase Serial

println("mola") igual que el print() pero añadiendo un retorno de carro al final... vaya, igual que el println() que conocemos de la clase Serial.

drawbitmap(int x, int y, bitmap, int ancho, int alto, color) a partir de la coordenada (x, y) dibuja un mapa de bits guardado en formato binario en el array bitmap del ancho y alto especificados. En el código de ejemplo, tras los defines hay podéis ver como son los arrays binarios que he utilizado para los símbolos del estado de la batería.

El código de ejemplo está en GitHub, en la carpeta Micro_micro_main-batterie_status.

Nota: si he cometido algún error agradecería que me lo dejéis en los comentarios.

domingo, 27 de febrero de 2011

El HPI RS32 se distribuye a cuentagotas

NOVEDADES: en USA es posible comprarlo aquí y aquí, pero con limitaciones. Parece que están recibiendo unidades muy limitadas y es posible que despues de comprar os toque esperar algún tiempo, aunque una de las tiendas en el momento de escribir esta entrada asegura tener el HPI RS32 en stock.

Por su parte HPI USA y HPI EUROPA no responden a mis preguntas, lo cual me cabrea. Me consta que han visitado este blog y que han visto el trabajo de promoción que les estoy haciendo, pero aun así se empeñan en mantener silencio.

Desde un foro yanki me han dado una mala noticia, el HPI RS32 no es compatible con Spectrum, lo cual me ha sorprendido mucho. Hasta ahora todos los productos del grupo Horizon Hobbies (y recordemos que HPI pertenece a este grupo) han sido compatibles con el sistema Spectrum de 2.4GHz, era una buena estrategia para ellos el vender kits RTR con emisoras básicas de 2.4GHz compatibles con Spectrum pues el paso lógico para todo aficionado era comprar una emisora "buena" de la marca Spectrum. Que cada cual piense lo que quiera, pero me huele a "upgrade kit".

Si alguno de los lectores del blog no puede esperar y se lanza a comprar un HPI RS32 ya espero que me lo haga saber. Por mi parte no lo voy a comprar, con toda la promoción que les estoy haciendo espero que me lo regalen.

domingo, 20 de febrero de 2011

Tenemos vídeo del HPI RS32

En la última entrada de este blog posteé las primeras fotos conocidas del HPI RS32 con carrocerías de slot. Carrocerías del Citroen Xsara y del Ford Focus Rally de Carlos Sainz, carrocerías que la mayoría de aficionados a los mini-z desearian tener, pero lo cual es imposible.

De la mano del mismo yanki me ha llegado este vídeo en el que se puede ver uno de los HPI RS32 rodanto. Supongo que el coche va totalmente de serie, solo cambia la carrocería, lo cual es muy prometedor pues se puede ver que el coche tiene un comportamiento excelente.




A pesar de la resolución del vídeo se puede ver que el coche es rápido en las rectas y muy maniobrero, de hecho al piloto le hace falta un poco más de práctica a la hora de negociar las curvas. Se puede apreciar que gira muy bien y responde con mucha agilidad. Tengo previsto hacer un análisis de las características del coche basadas en las pocas fotos que tenemos del HPI RS32 que aclararán por que se conduce tan bién.

En otro orden de cosas: me he puesto en contacto con el distribuidor de HPI en España para hecerle varias preguntas sobre la disponivilidad y distribución del coche en España. No era un email tipo ladrillo pero contenía varias preguntas fáciles de responder si uno tiene ganas de quedar bien con sus futuros clientes. La respuesta (copio/pego):

BUENOS DIAS: ESTE COCHE NO SE COMERCIALIZA EN EUROPA SI LO DESEAS CONSEGUIR TENDRAS QUE BUSCARLO POR U.S.A. O JAPON     SALUDOS   JESUS

Ejem, escueto... demasiado escueto. Respondo con otro email mas corto aun que el  primero con solo una pregunta: "¿y el distribuidor de HPI en España no se plantea trarelo?".

Respuesta (de nuevo copio y pego): "BUENAS TARDES NO POR EL MOMENTO   SALUDOS". Increible el interés que se toman por el cliente. Dentro de unos meses lo traerán y querrán que lo compremos al precio que a ellos les salga de los cojones.

La respuesta de HPI USA ha sido... ninguna, ha pasado una semana y no han respondido. De verdad que no lo entiendo, si yo sacase un producto nuevo con muchas posivilidades a un mercado que ya está ocupado por la competencia perdería el culo por promocionarlo... y si encontrara a quien me hace publicidad gratis por lo menos lo trataría bien... creo que esto no va a terminar aquí.

Seguiremos hablando mucho del HPI RS32... y de los que lo fabrican, distribuyen y venden.

lunes, 14 de febrero de 2011

Primeras fotos del HPI RS32 con carrocerías de slot

Esto está que arde ayer publicaba la noticia de que el HPI RS32 ya está disponible en tiendas y comentaba algunos precios.

Hoy mismo me llega la noticia de un pavo en Estados Unidos que ya tiene dos HPI RS32, les ha montado carrocerías de slot y el resultado es este:





¿Algun minizetero ha deseado alguna vez conducir el Ford Focus de Carlos Sainz?, seguro que si.

Ponte las pilas Kyosho, pero ya.

domingo, 13 de febrero de 2011

HPI RS32 ya a la venta.

Para este segundo post acerca de HPI RS32 tenía pensado comentar las interesantes caracteristicas técnicas que incorpora, pero eso tendrá que esperar unos días más.

Me han llegado interesantes noticias acerca de la disponibilidad del coche en USA y en Japón.

Parece que en USA ya está disponible el HPI RS32 en algunas tiendas a un precio de 170$, lo cual traducido son unos 125€, un precio más que interesante si al cruzar el charco nos lo respetan... que va a ser que no, pero como siempre está la posibilidad de comprar directamente a USA no me preocupa (paso de pagar 200 pavos en una tienda española) que se espabile quien se tenga que espabilar (fabricante, importador o distribuidor, me da igual) el que pretenda ganar más de lo razonable no va a ganar nada conmigo.

También circulan muchos rumores por los foros yankis de que el precio finalde HPI RS32 en tiendas rondará los 100$, lo cual me parece mucho más razonable... una vez más en España ya veremos.

Esto era hasta ayer. Hoy mismo he recibido una noticia bomba: en la página de HPI en japón se anuncian precios oficiales para el HPI RS32... y no están nada mal.  La versión RTR del HPI RS32 se anuncia por 19740 yenes (175€ aproximadamente), pero parece que si se hace una preorden sale por 9800 yenes ¡87€!. Los precios son aun mejores para la versión BND (sin emisora) del HPI RS32: el precio oficial son 8190 yenes (72€) y con la oferta se queda en 3980 yenes... ¡35 euricos de ná!.

Voy a ver si consigo alguna información oficial y os mantendré informados.

domingo, 30 de enero de 2011

HPI RS32... por fin!!

Hace más de un año que se empezó ha hablar de la llegada de este pequeñín. Y prometía ser un coche RC de escala 1/32 muy interesante, con electónica en 2.4GHZ y compatible con carrocerías de slot de la misma escala.

Ayer mismo saltaba una alarma: el la página oficial de HPI ya está el RS32. Dan poca información, pero estudiando las fotos y leyendo las características podemos deducir muchas cosas:

RS32 Caracteristicas:
- Radio en 2.4GHz, y como HPI pertenece al grupo Horizon suponemos que será compatible con Spectrum
- Emisora TF-21 con dual rate en la dirección y trim, trim  en acelerador e inversor de servos. Es decir, una emisora básica para el kit RTR
- Control electronico de velocidad proporcional con marcha atrás, no sorprende
- Servo de dirección SH-34, micro servo de 3 hilos por lo que se aprecia en las fotos.
- Salva servos, habrá que verlo mas detenidamente
 - Batería de
Ni-MH de 4.8V y 150mAh, esto no es bueno, los que tenemos un micro-t sabemos que esta batería dura un suspiro, habrá que ver las posibilidades de meter otra batería o empezar ha hacer bricos.
- Motor traser acoplado directamente a la corona del diferencial, simple y efectivo, parecido a tren trasero de MR-02
- Tracción trasera, es evidente tras el punto anterior
- Cargador rápido C32, a pilas, y en forma de base de carga. Por mi experiencia con los micro-t este tipo de cargador es muy útil, no te obliga a estar cerca de un enchufe.
- Botón ON/OFF en el fondo del coche, no entiendo por que incluyen esto en las caracteristicas, ¿donde pretendían ponerlo si no?
- Recorrido de suspensión delantera ajustable y de muelles, interesante, muy interesante
- Brazos de suspensión delantera y suspensión trasera por barra T, lo de la suspensión trasera en T está muy visto, pero lo de la suspensión delantera por brazos en un coche de pista de esta escala si es una novedad, tengo ganas de probarlo.
- Ruedas moldeades de larga duración (compuesto medio delante, compuesto blando detrás), hombre pues si me alegro de que no vengan las cuatro igual, pero todos sabemos lo que pasa con las ruedas... que es lo primero de lo que hay que hacer acopio.
- Diferencial de engranajes, todos sabemos lo que pasa con estos diferenciales que para empezar están bien, pero luego hay que pasar a los de bolas, no creo que los fabricantes independientes tarden mucho a sacar recambios.
- Sistema de cambio rápido de carrocería. A ver, la variedad de carrocerías de slot 1/32 es muuuy amplia y no son caras, esta es una gran característica.
- Varios piñones para el motor, de plástico, poco serios
- Kit de herramientas y accesorios de mantenimineto, de plástico, para los primeros retoques, a sustituir por herramienta seria lo más rápido posible

Sepecificaciones:
Longitud total: 141.8mm
Anchura total: 56.6mm
Altura total: 42mm
Distancia entre ejes: 81.5mm
Peso totalmente equipado: 100g

Equipamiento necesario:
12 baterías tamaño AA (6 para la emisora y  6 para el cargador), sería la bomba que vinieran incluidas en el RTR, pero vale, no nos vamos a poner exigentes.
Resumiento, un RTR de coche micro escala con muchas posivilidades, muy apetecible para los adictos a mini-z o a los que quieren practicar RC sin salir de casa ni grandes inversiones. No es un mini-z-killer, al menos no de momento... pero las ventas de dNano si se van a ver afectadas.

Dejo para una próxima entrada el hacer ampliaciones de la foto y comentar detalle por detalle.