Utilizando componentes de NXT con un Micro controlador (6 / 6 paso)

Paso 6: El Sensor de ultrasonidos

Este es el grande.  La complejidad de todo antes de este palidece en comparación.  Sin embargo, todavía no es tan malo.  El sensor de ultrasonidos utiliza el protocolo C Squared o I2C.  Este protocolo permite a un maestro (el LEGO RCX) controlar múltiples dispositivos esclavos (sensores) con sólo dos hilos (y cables).  Esto viene muy bien cuando empiezas a mirar multiplexores y utilizando más de un sensor en un puerto.  También permite una funcionalidad adicional para el sensor de ultrasonidos.  I2C es un protocolo digital, pero no es apoyada explícitamente por el BS2.  Por suerte, podemos hacer algo conocido como "bit-golpeando" el Protocolo por escribir nuestro propio código para él.  Esto es ventajoso porque el sensor de ultrasonidos no exactamente seguir protocolo I2C de todos modos.  Así, sin más preámbulos, aquí está un curso intensivo en I2C con énfasis en el sensor de ultrasonidos.

Procedimiento general:
Maestro envía señal de arranque
Master envía el byte de dirección (determina qué dispositivo está siendo accedido y si se va a leer o escribir)
Reconoce esclavo
Transmisión de datos (de maestro a esclavo o de esclavo a maestro)
Receptor reconoce después de cada byte
Maestro envía comando de Stop

Usted querrá descargar el LEGO Hardware Developer Kit aquí: http://mindstorms.lego.com/en-us/support/files/default.aspx

Si nos fijamos en el apéndice 7, verá todos los comandos posibles para el sensor de ultrasonidos así como la salida esperada.
Como hexadecimal o Base 16 se escriben los bytes (como se denota por "0 x").

Para dar un ejemplo de un comando, vamos a intentar leer el ID del producto que debe devolver "LEGO"
Para ello, enviamos un comando de start, seguido escribir dirección del sensor (2) que se reconoce, entonces el identificación del producto comando (8) que se reconoce por un comando de reinicio ("R" en el apéndice) y dirección lectura del sensor (3) que debe ser reconocido. Después de enviar la dirección de lectura, el sensor volverá 5 bytes (L, E, G, O y un nulo 0 x 00).  Cada byte debe reconocerse por el sello.

El comando de reinicio consiste en una parada, un ciclo de reloj y un comienzo.  Ese ciclo de reloj extra, refiere a menudo como un "meneo" no es parte del protocolo I2C estándar.  Si está utilizando un microcontrolador compatible con I2C, necesitará asegurarse de que usted envíe ese ciclo de reloj extra.

Ahora, tenemos que entrar en el meollo real del protocolo I2C.  Empezaremos con el pinout del sensor.
Pin 1 - 9V (Vcc)
Pin 2 - tierra
PIN 3 - tierra
Pin 4 - 5V (Vcc)
Pin 5 - SCL
PIN 6 - SDA

SCL es su línea de reloj que se utiliza para sincronizar la transmisión de datos y SDA es la línea de datos reales.  Tiendo a llamarlos "reloj" o "datos" y "clk" así que paciencia.

Hay resistencias de conexión SCL y SDA a la fuente de 5V para que a menos que se haga algo, por defecto a 5 voltios.  Comunicación se hace tirando de estas líneas a 0 y luego liberarlos.  Nota que no tienes que tirar las líneas de altas, ya que por defecto alto.  Por eso, cuando termines con un comando, es mejor establecer tanto a la entrada.  Si usted no puede liberar las líneas, podría causar un cortocircuito con un alto en el extremo de BS2 y una baja en el extremo del sensor.

Los comandos I2C ellos mismos son en realidad bastante sencillos.

Inicio:
Comienza con ambas líneas alta, tire SDA baja, entonces tire reloj baja.  El efecto es que SDA va de alta a baja, mientras que el reloj es alto.

Parada:
Comienza con ambas líneas bajos, deje ir alto del reloj y dejar los SDA alta.  El efecto es que SDA va de bajo a alto mientras el reloj es alto.

¿Vea cómo detener es lo contrario de inicio?

Para el reloj, simplemente tire de ella baja un momento y luego suéltelo.

Envío de datos:
Los datos se envían en bytes y cada byte es seguido por un reconocimiento por parte del receptor.
En primer lugar, el reloj se tira bajo, SDA se establece en la siguiente broca para ser enviada por el transmisor, luego reloj se libera alta y SDA es leído por el receptor, luego reloj se tiró bajo otra vez.  Esto se repite para todos los 8 bits.  Los datos sólo son válidos cuando el reloj es alto y los datos sólo pueden cambiarse cuando el reloj es bajo.  Cambiar SDA mientras el reloj es alto se traduce en comando de Start o Stop. Después de los 8 bits se han enviado, el receptor tiene SDA baja como un reconocimiento mientras los principales comunicados y baja del reloj una vez más.  Bytes se envían MSB primero o Bit más significativo primero.  Por ejemplo, el byte de "2" 00000010 se enviaría a partir de la broca a la izquierda y terminando con el bit a la derecha.

Bytes de la dirección:
Cada sensor tiene una dirección de 7 bits que se envía junto con un poco de dirección.
La dirección de 7 bits del sensor ultrasónico es «1» o "0000001"
La direccional es ya sea "0" para escribir (enviar al esclavo) o "1" para leer (recibir del esclavo).
El resultado es una dirección de envío de 00000010 o 2 y una dirección de lectura de 00000011 3.

¿Realmente hacemos todo esto?  He intentado explícitamente la codificación todo en el sello, pero corría demasiado lento.  El sensor funciona a una velocidad óptima de 9600 Hz, y el sello no se acercan a cuando se ejecuta línea por línea.  En su lugar, recurrí a usar los comandos SHIFTIN y SHIFTOUT que son realmente mucho más fáciles.  Inicio, parada y reinicio se logran todavía manualmente con alto y bajo comandos.  El resultado se ve así:

byt0, byt1 y byt2 se encuentran en el Hardware Developer Kit apéndice 7.
bytes_receive es el número de bytes a recibir desde el sensor
Alpha es 1, si una cadena ASCII es esperado (piénsese en "alfabeto") y 0 si se espera una respuesta numérica
Asegúrese de escribir una función de error para cuando el sensor no ACK.  Mina a reiniciar todo el proceso.

' empezar
ENTRADA sda
ENTRADA clk
Sda baja
' send0
SHIFTOUT sda, clk, MSBFIRST, [byte0] ' dirección de byte
SHIFTIN sda, clk, MSBPRE, [ack\1] ' recibe reconocimiento
IF ack = 1 error de entonces ' si no se recibe el ack, ejecutar la rutina de error
' send1
SHIFTOUT sda, clk, MSBFIRST, [byt1] ' envía el byte de comando
SHIFTIN sda, clk, MSBPRE, [ack\1] ' recibe reconocimiento
IF ack = 1 error de entonces ' si no se recibe el ack, ejecutar la rutina de error
' reiniciar ' reinicie comando (parada, reloj, Start)
BAJO clk
Sda baja
ALTA clk
Sda alta
BAJO clk
ALTA clk
Sda baja
' send2
SHIFTOUT sda, clk, MSBFIRST, [byt2] ' envía el byte de dirección de devolución
SHIFTIN sda, clk, MSBPRE, [ack\1] ' recibir ack
IF ack = 1 error de entonces ' si no se recibe el ack, ejecutar la rutina de error
' recibir
PARA i = 0 TO bytes_receive-1
SHIFTIN sda, clk, MSBPRE, [bytr (i) \8] ' recibir bytes
SHIFTOUT sda, clk, MSBFIRST, [0\1] ' enviar reconocimiento
Alfa IF = 0 entonces DEBUG DEC bytr(i) ' si número, depurar el valor decimal de cada octeto
SIGUIENTE ' repetir, dependiendo del número de bytes que se espera
Alfa IF = 1 entonces depuración STR bytr ' si string, depurar todos bytes como cadena alfanumérica
DEPURACIÓN CR
' Dejar de
BAJO clk
Sda baja
ENTRADA clk
ENTRADA sda

Si tercer byte un comando (byte 2) es algo diferente a "R + 0 x 03", envía el tercer byte sin la secuencia de reinicio y no esperar una respuesta.

Artículos Relacionados

Makey Makey Micro controlador

Makey Makey Micro controlador

Mientras la lluvia de ideas para nuestra noche Makey Makey de construir en el asilo de Phoenix, no estaba viniendo para arriba con una aplicación asesina. Todo eso cambió cuando en una caminata con la Sra. Zoid. Vi algo en el canal que me llamó la at
Control de un Robot NXT con Android y HTML5

Control de un Robot NXT con Android y HTML5

el objetivo de este proyecto es conectar un viejo Android smartphone (por ejemplo, HTC Magic) a un robot de Lego NXT, con el fin de conseguir que un robot de cámara WIFI GPRS UMTS disponible mundial.La forma más fácil de monitorear su hogar desde cua
Caja de la decisión libre de micro controlador

Caja de la decisión libre de micro controlador

Este es un cuadro que toma la decisión al azar sin el uso de micro controlador inspirado en primera versión por victor y segunda versión por victor pero esto es diferente de ellos y barato y simple pero real ver video trabajandoPaso 1: Cómo hice esto
Sistema de reservas de autobús inteligente con tornillo micro-controller

Sistema de reservas de autobús inteligente con tornillo micro-controller

Hola hay colegas inventores,Deseo que me compartir algunas experiencias y mi equipo ganó al crear un proyecto de sistema de bus inteligente de reserva, que me llevó a utilizar un Arduino y el sorprendente regulador micro del perno.¿Por qué?Mientras q
Utilizando Shift Register 74HC595 con ULN2803, UDN2981 y BC327

Utilizando Shift Register 74HC595 con ULN2803, UDN2981 y BC327

Hola, todos!En muchas situaciones en tus proyectos con microcontroladores puede utilizar un registro de desplazamiento como 74HC595 directamente con LED y pantallas, pero si revisas la hoja de datos, verá necesita tener cuidado con la corriente máxim
Hidroponía con Edison el controlador Intel

Hidroponía con Edison el controlador Intel

Crear una IoT activado controlador de hidroponía con el Edison de Intel durante el IoT Hackathon de BostonNuestro objetivo:Dentro de un hackathon de 36 horas para construir un controlador a utilizar con nuestro anterior instructable (hidropónico gran
Tanque Robot: Conducir un tanque con motores y controladores con el Kinoma crear

Tanque Robot: Conducir un tanque con motores y controladores con el Kinoma crear

Hemos construido un mini tanque y controladores que utilizan dos dispositivos de Kinoma cree que comunican a través de CoAP (Protocolo de aplicación limitada). Las manijas giran potenciómetros que la tensión que generan. Los cambios de tensión se tra
Potencia su ladrillo de Mindstorms NXT con un adaptador de pared de 9V.

Potencia su ladrillo de Mindstorms NXT con un adaptador de pared de 9V.

Para este día de fiesta, Yo compré una viejo segunda mano Mindstorms NXT para jugar con. Sólo parecía más divertido que gasto mi dinero en fuegos artificiales y el alcohol.A jugar con él, me di cuenta de que usted puede ir a través de un buen montón
Utilizando un Arduino Uno R3 como un controlador de juegos

Utilizando un Arduino Uno R3 como un controlador de juegos

ACTUALIZACIÓN de 2016: yo ya no proporcionará soporte en la sección de comentarios. Este es un método anticuado y obsoleto que tiene muy pocas razones para utilizar. Mantenerlo sólo con fines de información.Naturalmente, la ONU no soporta nativamente
Cómo reparar una dreamcast con puertos de controlador muerto

Cómo reparar una dreamcast con puertos de controlador muerto

este instructable muestra cómo abrir su dreamcast y reemplazar un quemado hacia fuera resistente. Miré siempre donde se encuentra la manera de arreglar esto y podía solamente encontrar un atajo fácil rápido que podría destruir el sistema en el largo
Ballshooter Autónoma de NXT con NXTcam

Ballshooter Autónoma de NXT con NXTcam

este es mi robot que está programado para caza y matar a su enemigo jurado, una taza de plástico roja es la ballshooter construir desde el mindstorms NXT 2.0 set pero con un poco añade en el NXTcam de Mindsensors.com es una cámara especial para el la
Alimentar un robot Lego NXT con un taladro barato batería / acumulador

Alimentar un robot Lego NXT con un taladro barato batería / acumulador

uno de los aspectos más importantes y caros de diseñar un robot móvil, es encontrar el correcto acumulador que permite largos periodos de funcionamiento autónomo. Acumuladores más son acumulador muy costosas y modernas tecnologías, como LiPos (soport
Montaje eje de Sachs Vintage, utilizando componentes de Archer de Sturmey

Montaje eje de Sachs Vintage, utilizando componentes de Archer de Sturmey

un problema con las bicicletas vintage es la falta de repuestos. La bicicleta es un gran modelo de los años 70 mira compré un tiempo atrás tiene tres velocidades buje Sachs con un freno de contrapedal (Niza), pero lamentablemente le faltaba el víncul
Configuración de un reloj de tiempo Real (RTC) con un Micro Arduino Pro

Configuración de un reloj de tiempo Real (RTC) con un Micro Arduino Pro

Para un montón de proyectos, necesita saber el tiempo real. Siendo precisos segundos, la hora del día o la fecha del mes, un Módulo de reloj de tiempo Real RTC es la respuesta a esa necesidad.Con bajo consumo de energía, avanzadas de precisión y cali