Stap 7: Stuur Codes naar RX
Nu is het tijd om te proberen om de codes van Arduino naar RX, RX69A gegevensblad zegt dat de pin 6 (VI2) wordt ingevoerd (zoals V02 is de output die we lezen), absolute maximale waarderingen op gegevensblad vertellen ons dat max spanning is GND-0.2V aan VDD + 0.2V (ik heb gemeten 1.57 volt met behulp van mijn multimeter, dus als iemand welke gegevensblad probeert vertellen kan te zeggen , gelieve te helpen ;)
Ik begon de scheidingslijn van de spanning met behulp van waarden uit 1 gelijkstroomweerstand, maar lijkt dat stroom was onvoldoende, aan het einde ik gebruikte twee 100 kilohms weerstanden, daalt de spanning te 2.5v (spanning onder 2 volt lijkt niet kracht).
Ik heb geprobeerd om de code één keer alleen en soms werkte soms niet (gerelateerd aan 5684 micos vertraging?), verzenden van twee keer, en het lijkt ok.
<p>#define SYNC_US 1300<br>#define SPACING_US 500 #define SIGNAL_US 800 #define PinPPM 8 #define CYCLES 2</p><p>void setup() { Serial.begin(57600); Serial.println(F("#Serial Ready")); pinMode(PinPPM, OUTPUT); }</p><p>void loop() { if(Serial.available() > 0){ char inChar = Serial.read(); if(inChar == 'p'){ Serial.println(inChar); //Power pulseOut(PinPPM,SYNC_US); pulseOut(PinPPM,SPACING_US); pulseOut(PinPPM,SPACING_US); pulseOut(PinPPM,SPACING_US); pulseOut(PinPPM,SPACING_US); pulseOut(PinPPM,SPACING_US); pulseOut(PinPPM,SPACING_US); pulseOut(PinPPM,SPACING_US); pulseOut(PinPPM,SIGNAL_US); pulseOut(PinPPM,SIGNAL_US); pulseOut(PinPPM,SPACING_US); pulseOut(PinPPM,SPACING_US); pulseOut(PinPPM,SPACING_US); pulseOut(PinPPM,SPACING_US); //Power pulseOut(PinPPM,SYNC_US); pulseOut(PinPPM,SPACING_US); pulseOut(PinPPM,SPACING_US); pulseOut(PinPPM,SPACING_US); pulseOut(PinPPM,SPACING_US); pulseOut(PinPPM,SPACING_US); pulseOut(PinPPM,SPACING_US); pulseOut(PinPPM,SPACING_US); pulseOut(PinPPM,SIGNAL_US); pulseOut(PinPPM,SIGNAL_US); pulseOut(PinPPM,SPACING_US); pulseOut(PinPPM,SPACING_US); pulseOut(PinPPM,SPACING_US); pulseOut(PinPPM,SPACING_US); } else if (inChar == 'o'){ Serial.println(inChar); uint16_t CodeToSend = 0b0000000110000000; SendCode(CodeToSend); } } }</p><p>// set thr port high/low, used in SendCode void pulseOut(uint8_t pin, uint16_t TimeMicro){ digitalWrite(pin,HIGH); delayMicroseconds(TimeMicro); digitalWrite(pin, LOW); delayMicroseconds(TimeMicro); }</p><p>void SendCode(uint16_t CodeToSend){ Serial.print(F("#SendCode: S")); for (int index = 0; index < 13; index++) { uint8_t bit = (CodeToSend & (1 << index)) != 0; Serial.print(bit); } Serial.println(); for(int x = 0; x < CYCLES; x++){ pulseOut(PinPPM, SYNC_US); for (int index = 0; index < 13; index++) { uint8_t bit = (CodeToSend & (1 << index)) != 0; if(bit == 1) pulseOut(PinPPM, SIGNAL_US); else pulseOut(PinPPM, SPACING_US); } } }</p>
Werkte! Verzenden 'p' of ' o ' van seriële monitor ik kan het Tank aan en uit zetten.
Testen "linker motor vooruit" code, lijkt de motor werkte voor een tijdje en gestopt, dat we zullen moeten blijven de opdracht verzenden, terwijl we de tank in beweging willen.
Nu is het tijd om de volledige toepassing. Het gebruik van ascii in seriële transmissies is de eenvoudigste manier, maar ik wil economie van bytes (op zoek naar mijn toekomstige projecten, als wij voor elke knop een char gebruiken zullen we 8 bytes, met behulp van bits moeten we slechts één byte).
Mijn communicatiestructuur hebben 10 bytes vanwege een andere (gelijktijdig) projecten, de eerste byte is voorvoegsel, de tweede is type, bytes 3 tot en met 8 is gegevens (opdrachten, sensoren, enz.) en bytes 9 en 10 is voor CRC. Neem een kijkje in de codes.
Compatibiliteit met de mededeling van de ASCII-ik gebruik "#" als voorvoegsel en "\r" als postfix, voor mijn gebruik it's ok.
Ik aangesloten de twee broncodes, een "de controller" voor visual studio 2010 c# .net en één voor de Arduino. Houd in gedachten dat de code niet compleet is en niet bug vrij. ;)
Als u niet over visual studio beschikt en u wilt proberen dit instructable, kunt u uitvoeren van Controller\bin\Debug\Controller.exe (het kader van het require.net 4), sluit aan op de seriële poort Arduino (u kunt Arduino USB kabel of Bluetooth-apparaat aangesloten op TX/RX), Controleer het vakje 'capture toetsenbordtoetsen te controleren' en gebruik de toetsen hieronder (de controller zal luisteren alleen deze sleutels) :
OMHOOG = Tank vooruit
OMLAAG = Tank achteruit
LINKS = links van de Tank
RECHTS = rechts van de Tank
Q = torentje links
W = brand
E = rechts van het torentje
P = vermogen (aan/uit)
Controller zal ontvangen van de toets ingedrukt (actie) en toets omhoog (stop) evenementen en instellen van de bits in een byte en verzenden van Arduino.
Arduino ontvangt dit byte-bereik via seriële en set bits aan een 16-bits variabele de code te sturen naar de RX.
Als je goed de codes leest, alles zal duidelijk en gemakkelijk (hoop ik) ;)
Sorry voor mijn slechte Engels (ik probeerde mijn best. als je wilt om een herziening, u bent welkom bij Stuur me een prive bericht)
Ik hoop dat u geniet van dit artikel.