Med NXT komponenter med en mikro-Controller (6 / 6 steg)
Steg 6: Ultraljud sensorn
Allmänt förfarande:
Master skickar startsignalen
Master skickar adressen byte (bestämmer vilken enhet används och om du vill läsa eller skriva)
Slav erkänner
Dataöverföring (från master till slav eller från slav till master)
Mottagare erkänner efter varje byte
Master skickar stoppkommando
Vill du ladda ner LEGO Hardware Developer Kit här: http://mindstorms.lego.com/en-us/support/files/default.aspx
Om du tittar på tillägg 7, kommer du se alla möjliga kommandon för ultrasonic sensor samt förväntad utdata.
Byte skrivs som Hex eller Base 16 (som betecknas med "0 x").
För att ge ett exempel på ett kommando, låt oss försöka läsa produkt-ID som ska returnera "LEGO"
För att göra detta, skulle vi skicka ett startkommando, då sensorns skriva adress (2) som erkänns, sedan det produkt-ID-kommandot (8) som är erkänt följt av en omstart kommando ("R" i tillägget), och sensorns Läs adress (3) som måste erkännas. När Läs adressen skickas, sensorn kommer tillbaka 5 byte (L, E, G, O och en null 0x00). Varje byte måste erkännas av stämpeln.
Kommandot starta om består av en Start stopp och en klockcykel. Det extra klockcykel, som ofta en "vicka" inte är en del av standard I2C-protokollet. Om du använder en mikrokontroller som stöder I2C, måste du se till att du skicka det extra klockcykel.
Nu måste vi få in den verkliga praktiska detaljer av I2C-protokollet. Vi börjar med sensorns pinut.
Stift 1 - 9V (Vcc)
Stift 2 - marken
PIN 3 - marken
Stift 4 - 5V (Vcc)
Stift 5 - SCL
Stift 6 - SDA
SCL-värdet är den klocka som används för att synkronisera dataöverföring och SDA är den faktiska data linjen. Jag brukar kalla dem "klocka" eller "clk" och "data" så bär med mig.
Det finns motstånd ansluter både SCL och SDA till 5V källan så att om inte något görs, de som standard 5 volt. Kommunikationen sker genom att dra dessa rader till 0 och sedan släppa dem. Observera att du inte behöver dra rader högt, som de standard högt. Därför, när du är klar med ett kommando, är det bäst att sätta båda till insatsen. Om du inte släppa raderna, kan du orsaka en kort med en hög på BS2 slutet och en låg på sensorn slutet.
Kommandona I2C sig är faktiskt ganska enkelt.
Start:
Börja med båda linjerna hög, dra SDA låg, sedan dra klockan låg. Effekten är att SDA går från högt till lågt medan klockan är hög.
Stanna:
Börja med båda linjerna låg, låt klockan gå hög, sedan låta SDA gå högt. Effekten är SDA går från låg till hög medan klockan är hög.
Se hur stopp är motsatsen till Start?
Att cykla klockan, helt enkelt dra den låg en stund och sedan släppa den.
Skicka Data:
Data skickas i byte och varje byte följs av en kvittering av mottagaren.
Först klockan dras låg, då SDA är inställd till nästa lite som ska skickas av sändaren, då klockan är släppt höga och SDA läses av mottagaren sedan klockan dras låg igen. Detta upprepas för alla 8 bitar. Data är endast giltig när klockan är hög och data kan bara ändras när klockan är låg. Ändra SDA medan klockan är hög resulterar i en Start eller stopp kommando. Efter de 8 bitarna har skickats, håller mottagaren SDA låg som bekräftelse medan den master och sänker klocka en gång. Byte skickas MSB första eller mest betydande Bit först. Till exempel byten för "2" 00000010 skulle skickas från och med lite till vänster och slutar med lite till höger.
Adress byte:
Varje sensor har en 7-bitars adress som skickas tillsammans med lite riktad.
7 bitars adress ultraljud sensorn är "1" eller "0000001"
Den riktade biten är antingen "0" för skriva (skicka till slav) eller "1" för Läs (får från slav).
Resultatet är en skicka adress 00000010 eller 2 och en Läs adress 00000011 eller 3.
Så hur vi faktiskt gör allt detta? Jag försökte uttryckligen kodning allt på stämpeln, men det gick för långsamt. Sensorn går med en optimal hastighet på 9600 Hz, och stämpeln komma inte i närheten som när verkställande rad för rad. I stället tillgrep jag med SHIFTIN och SHIFTOUT kommandon som är faktiskt mycket lättare. Starta, stoppa och starta om är fortfarande fulländade manuellt med höga och låga kommandon. Resultatet ser ut så här:
byt0, byt1 och byt2 finns i Hardware Developer Kit tillägg 7.
bytes_receive är antalet byte som tas emot från sensorn
alpha är 1 om en ASCII-sträng är förväntade (Tänk "alfabet") och 0 om en numerisk svar förväntas
Var noga med att skriva upp en fel funktion för när de sensorn inte bekräftelse mig bara startas om hela processen.
"starta
INGÅENDE sda
INGÅENDE clk
LÅGA sda
"send0
SHIFTOUT sda, clk, MSBFIRST, [byte0] ' adress byte
AT sda, clk, MSBPRE, [ack\1] "får svar
OM ack = 1 då fel "om ack inte tas emot, köra fel rutin
"send1
SHIFTOUT sda, clk, MSBFIRST, [byt1] "Skicka kommandobyte
AT sda, clk, MSBPRE, [ack\1] "får svar
OM ack = 1 då fel "om ack inte tas emot, köra fel rutin
"starta om" starta om kommandot (Stop, klocka, Start)
LÅGA clk
LÅGA sda
HÖG clk
HÖG sda
LÅGA clk
HÖG clk
LÅGA sda
"send2
SHIFTOUT sda, clk, MSBFIRST, [byt2] "Skicka adress byte för återgång
AT sda, clk, MSBPRE, [ack\1] ' ta emot ack
OM ack = 1 då fel "om ack inte tas emot, köra fel rutin
"ta emot
FÖR i = 0 till bytes_receive-1
AT sda, clk, MSBPRE, [bytr (i) \8] ' få Byte
SHIFTOUT sda, clk, MSBFIRST, [0\1] "Skicka bekräftelse
OM alpha = 0 då DEBUG DEC bytr(i) ' om tal, felsöka decimalvärde på varje byte
Nästa "upprepar, beroende på antalet förväntade byte
OM alpha = 1 då DEBUG STR bytr "om sträng, felsöka alla byte som alfanumerisk sträng
FELSÖKA HP
"Stoppa
LÅGA clk
LÅGA sda
INGÅENDE clk
INGÅENDE sda
Om ett kommando tredje byte (2 byte) är något annat än "R + 0x03", skicka den tredje byten utan omstart sekvensen och förvänta dig ett svar.