Stap 6: De ultrasone Sensor
Algemene procedure:
Master signaal start
Master stuurt adres byte (bepaalt welk apparaat wordt benaderd en of te lezen of schrijven)
Slaaf erkent
Gegevensoverdracht (van meester slave of van de slaaf meester)
Ontvanger erkent na elke byte
Master stuurt de opdracht Stop
U wilt de LEGO Hardware Developer Kit hier downloaden: http://mindstorms.lego.com/en-us/support/files/default.aspx
Als je kijkt naar de bijlage 7, ziet u alle mogelijke opdrachten voor de ultrasone sensor, alsmede de verwachte output.
Bytes worden geschreven als Hex of Base-16 (zoals aangeduid door "0 x").
Om een voorbeeld van een opdracht, laten we proberen het lezen van de product-ID die retourneren moet "LEGO"
Om dit te doen, zouden wij een opdracht start, dan van de sensor schrijven adres (2) die is erkend, dan de Product-ID opdracht (8) die is erkend gevolgd door een opdracht starten ('R' in het aanhangsel), en van de sensor Lees adres (3) dat moet worden erkend. Nadat het Lees adres is verzonden, de sensor zal terugkeren 5 bytes (L, E, G, O en een null 0x00). Elke byte moet worden erkend door de stempel.
Het commando Restart bestaat uit een begin, een einde en een klokcyclus. Die extra klokcyclus, vaak aangeduid als een "wiggle" maakt geen deel uit van het standaard I2C-protocol. Als u van een microcontroller die I2C ondersteunt gebruikmaakt, moet u ervoor zorgen dat u die extra klokcyclus.
We moeten nu, krijgen in de echte nitty-zanderige van de I2C-protocol. We beginnen met de pinout van de sensor.
Pin 1 - 9V (Vcc)
Pin 2 - grond
Pin 3 - grond
4 - 5V pin (Vcc)
Pin 5 - SCL
Pin 6 - SDA
SCL is uw clock lijn die wordt gebruikt voor het synchroniseren van gegevensoverdracht en SDA is de lijn van de feitelijke gegevens. Ik heb de neiging te noemen "klok" of "clk" en "data" dus geduld met mij.
Er zijn weerstanden zowel SCL en SDA aansluiten op de 5V-bron, zodat tenzij er iets gebeurt, ze standaard 5 volt. Communicatie wordt gedaan door deze lijnen trekken aan 0 en vervolgens het vrijgeven van hen. Merk op dat u niet hoeft te trekken van de lijnen hoog, als ze standaard hoog. Daarom, wanneer u klaar bent met een opdracht, is het beste om in te stellen zowel om in te voeren. Als je niet loslaat van de regels, kan u een korte met een hoog op het einde van de BS2 en een laag op het einde van de sensor.
De I2C-opdrachten zelf zijn eigenlijk vrij eenvoudig.
Start:
Begin met beide regels hoog, trek SDA laag, vervolgens trek klok laag. Het effect is dat SDA van hoog naar laag gaat terwijl klok hoog is.
Foutbericht ' Stop:
Beginnen met beide lijnen laag, laat ga hoge klok, daarna laat SDA gaan hoog. Het effect is dat SDA gaat van laag naar hoog terwijl klok hoog is.
Zie hoe Stop is het tegenovergestelde van Start?
Als u wilt bladeren van de klok, gewoon trek deze laag voor een moment en laat u het.
Het verzenden van gegevens:
Gegevens verzonden bytes en elke byte wordt gevolgd door een acknowledge door de ontvanger.
Eerst, de klok wordt getrokken laag, dan SDA is ingesteld op de volgende bits worden verzonden door de zender, dan klok is vrijgegeven hoge en SDA wordt gelezen door de ontvanger, dan klok opnieuw laag wordt getrokken. Dit wordt herhaald voor alle 8-bits. Gegevens is alleen geldig als de klok is hoog en gegevens kan alleen worden gewijzigd wanneer de klok is laag. SDA veranderen, terwijl de klok hoog is resulteert in een Start- of Stop-opdracht. Nadat de 8 bits hebben verzonden, houdt de ontvanger SDA laag als een ontvangstbevestiging terwijl de master releases en verlaagt klok één meer tijd. Bytes verzonden MSB eerste of meest significante bits eerste. Bijvoorbeeld de '2'-byte 00000010 zou worden verzonden met de bits aan de linkerkant beginnend en eindigend met de bit aan de rechterkant.
Bytes van het adres:
Elke sensor heeft een 7-bits adres dat wordt verzonden in combinatie met een directionele beetje.
Het adres van de 7 bit van de ultrasone sensor is "1" of "0000001"
De directionele bit is ofwel "0" voor schrijven (verzenden naar de slave) of "1" voor lezen (ontvangen slaaf).
Het resultaat is een adres verzenden van 00000010 of 2 en een lees 00000011 of 3.
Dus hoe doen we dit alles eigenlijk? Ik probeerde expliciet codering alles op de stempel, maar het liep te langzaam. De sensor loopt met een optimale snelheid van 9600 Hz, en de stempel niet komen dicht bij die bij het uitvoeren van de lijn door lijn. In plaats daarvan toevlucht ik tot het gebruik van SHIFTIN en SHIFTOUT opdrachten die eigenlijk veel makkelijker. Starten, stoppen en opnieuw starten zijn nog handmatig met behulp van hoge en lage opdrachten volbracht. Het resultaat ziet er zo uit:
byt0, byt1 en byt2 zijn gevonden in de Hardware Developer Kit aanhangsel 7.
bytes_receive is het aantal bytes worden ontvangen van de sensor
alpha is 1 als een ASCII-tekenreeks verwachte (denk "alfabet") en 0 als een numerieke antwoord verwacht
Zorg ervoor dat u schrijf een error-functie voor wanneer de sensor geen ACK Mij herstarten gewoon het hele proces.
' start
INPUT sda
INPUT clk
LAGE sda
' send0
SHIFTOUT sda, clk, MSBFIRST, [byte0] ' adres byte
SHIFTIN sda, clk, MSBPRE, [ack\1] ' ontvangstbevestiging ontvangen
Als ack = 1 dan fout ' als geen ack is ontvangen, voert u fout routine
' send1
SHIFTOUT sda, clk, MSBFIRST, [byt1] ' Stuur byte van de opdracht
SHIFTIN sda, clk, MSBPRE, [ack\1] ' ontvangstbevestiging ontvangen
Als ack = 1 dan fout ' als geen ack is ontvangen, voert u fout routine
' Herstart ' opnieuw opstarten van de opdracht (Stop, klok, Start)
LAGE clk
LAGE sda
HOGE clk
HOGE sda
LAGE clk
HOGE clk
LAGE sda
' send2
SHIFTOUT sda, clk, MSBFIRST, [byt2] ' Stuur byte van het adres voor terugkeer
SHIFTIN sda, clk, MSBPRE, [ack\1] ' ontvangen ack
Als ack = 1 dan fout ' als geen ack is ontvangen, voert u fout routine
' ontvangen
VOOR i = 0 TO bytes_receive-1
Sda, clk, MSBPRE, [bytr (i) \8] SHIFTIN ' ontvangen Byte
SHIFTOUT sda, clk, MSBFIRST, [0\1] ' Stuur bevestiging
ALS alpha = 0 dan DEBUG DEC bytr(i) ' als getal, de decimale waarde van elke byte debug
VOLGENDE ' Herhaal, afhankelijk van het aantal bytes dat verwacht
ALS alpha = 1 dan DEBUG STR-bytr ' als string, debug alle bytes als alfanumerieke tekenreeks
DEBUG CR
' Stoppen
LAGE clk
LAGE sda
INPUT clk
INPUT sda
Als een commando's derde byte (byte 2) is iets anders dan "R + 0x03", stuur de derde byte zonder de volgorde opnieuw opstarten en niet een antwoord verwachten.