Paso 6: 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.