NXT onderdelen met een Micro-Controller (6 / 6 stap)

Stap 6: De ultrasone Sensor


Dit is de grote.  De complexiteit van alles vóór deze verbleekt in vergelijking.  Het is echter nog niet zo slecht.  De ultrasone sensor gebruikt de ik kwadraat C of I2C protocol.  Dit protocol kan een meester (de LEGO RCX) waarmee meerdere slaaf apparaten (sensoren) met slechts twee draden (plus macht draden).  Dit is handig wanneer u begint te kijken naar multiplexers en met behulp van meer dan één sensor op één poort.  Het laat ook aanvullende functionaliteit voor de ultrasone sensor.  I2C is een digitaal protocol, maar het is niet expliciet ondersteund door de BS2.  Gelukkig kunnen we iets als "bit-banging" het protocol bekend door onze eigen code schrijven voor het.  Dit is gunstig omdat de ultrasone sensor I2C protocol niet precies toch volgen.  Dus, zonder verdere omhaal, hier is een spoedcursus in de I2C met de nadruk op 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.

Gerelateerde Artikelen

Het aandrijven van een Lego NXT robot met een goedkope boor batterij / accu

Het aandrijven van een Lego NXT robot met een goedkope boor batterij / accu

een van de meest belangrijke en dure aspecten van het ontwerpen van een mobiele robot, is het vinden van de juiste accu waarmee lange periodes van autonome werking. De meeste accu's zijn vrij duur en moderne accu technologieën, zoals LiPos (staat voo
Communiceren met arduino micro controller en computer door usb met een vb-programma

Communiceren met arduino micro controller en computer door usb met een vb-programma

Als u als me bent en wilt worden kundig voor zeggenschap uw items op uw arduino via uw computer aangesloten, dan moet je een manier om een verbinding tot stand brengen en communiceren met je arduino vanaf uw computer. Deze video en tutorial toont je
Gebruik van een Arduino met een N64-controller

Gebruik van een Arduino met een N64-controller

er zijn tutorials die er voor het gebruik van een NES-controller met een Arduino, maar met behulp van de meer gecompliceerde N64-controller en de analoge joystick heeft een duidelijke aantrekkingskracht. Als u een Arduino rond hebt en wil niet te kop
Controle Arduino functioneert met een USB-controller, geen solderen vereist-ik maakte het op TechShop

Controle Arduino functioneert met een USB-controller, geen solderen vereist-ik maakte het op TechShop

eerder dit jaar besloot ik dat het zou leuk om mijn bedrade controller van de Xbox 360 gebruiken om te bepalen Arduino projecten - in dit geval een RGB LED. De meest gebruikte methode om dit te doen impliceert echter toegang tot de elektronica binnen
Maken van metalen onderdelen met een 3D-Printer (verloren polymeer gieten tutorial)

Maken van metalen onderdelen met een 3D-Printer (verloren polymeer gieten tutorial)

Bent u in liefde met 3D printen, maar moe van dun plastic onderdelen? Bent u klaar om uw werk op de volgende niveau?! Dus was ik.Tijdens zijn studie Electrical and Engineering explosieven aan New Mexico Tech, leerde ik een techniek genaamd verloren w
Bedien uw computer met een PS3-Controller met rumble - SixAxis of DualShock

Bedien uw computer met een PS3-Controller met rumble - SixAxis of DualShock

de titel is pretty zelfstandige toelichting. U gaat een PS3-controller op de computer installeren en gebruiken om het zelfs te beheren. Ik heb dit getest met beide types van controllers. Het werkt.Voordat u begint, gaat u de volgende items wilt.Een P
Hoe te spelen de PSP Go met een PS3-controller

Hoe te spelen de PSP Go met een PS3-controller

ik was verrast waren er geen Instructables hierover, of om het even wat over de PSP gaan helemaal niet, dus ik dit maakte omdat het kostte me een tijdje om erachter te komen hoe dit te doen, en ik dacht anderen kunnen profiteren, enzovoort met de ins
Maken van vervangende onderdelen met een 3D-printer en 123D app

Maken van vervangende onderdelen met een 3D-printer en 123D app

hier is een beetje van een ruwe versie over hoe maakte ik een plastic bearing houder voor een schuifdeur. Mijn vader vroeg me of ik hem een kon maken met de Printrbot die ik gekocht voor de school die ik leren. Omdat ik dacht dat zou het een goede pr
Controle van een Game Boy met een NES-controller!

Controle van een Game Boy met een NES-controller!

u nog steeds dat gameboy in uw kast?Hoe zit dat NES-controller?buste laten we hen uit!(:Stap 1: Items die u nodig hebt:-Music (optioneel, maar aanbevolen)-Soldeerbout-Draad solderen Items:, solderen, etc.-Nes-controller.-Gameboy (dit instructable zal
7 segment LED-display met een PIC controller en Flowcode V5

7 segment LED-display met een PIC controller en Flowcode V5

Allereerst, als u vragen hebt, voel je vrij om commentaar te leveren! Ik zou meer dan blij om uw vraag zo goed mogelijk beantwoorden!Gebruikte materialen:-PIC 18F452 Microcontroller (PIC-microcontroller met genoeg pinnen zal doen)-7 segment gemeensch
Een Servo-Controller verwijderen

Een Servo-Controller verwijderen

servomotoren zijn erg leuk als u wilt gemakkelijk interface een motorreductor met een micro-controller. Nochtans, soms, u wilt een mooie beetje gericht motor en niet wilt worden gehinderd met controlecircuits om te rijden. Op momenten als dit is het
Gemakkelijk om te bouwen van zuurstof Analyzer met behulp van een Arduino compatibele Micro Controller

Gemakkelijk om te bouwen van zuurstof Analyzer met behulp van een Arduino compatibele Micro Controller

Als een bouwer van gadgets en een scuba diver heb ik geprobeerd om te bouwen van een zuurstof-analyzer voor een beetje nu. Het grote probleem is dat de meest micro controllers de mv dat de sensor steekt niet kunnen lezen. Ik speelde met opamps, maar
Gebruik een PS3-Controller te controleren van een Arduino NXT Bot

Gebruik een PS3-Controller te controleren van een Arduino NXT Bot

UPDATE:Ik heb een paar insecten met het gegevenspakket vast, en ik heb bewerkt de NXTI2CDevice bibliotheek zodat ze compatibel zijn met Arduino 1.0.Het bijgevoegde zip-bestand heeft1. een nieuwe schets van de Arduino2. een nieuwe Processing Schets3.
Zet een N64-Controller in een USB-Gamepad met behulp van een Arduino Leonardo

Zet een N64-Controller in een USB-Gamepad met behulp van een Arduino Leonardo

De gemakkelijkste manier om te zetten een N64-Controller in een USB-Gamepad is om te kopen een N64-Controller-Adapter voor ongeveer £15. Maar het kan ook worden gedaan hebt u een Arduino Leonardo of elke andere Arduino board met ingebouwde USB-commun