RC toy Arduino PC kontrolleras av 2 ledare (signal och marken) (7 / 7 steg)
Steg 7: Skicka koder till RX
Nu är det dags att prova att skicka koderna från Arduino till RX, RX69A datablad säger att stift 6 (VI2) input (som V02 utdata som vi läser), absolut högsta betyg på databladet säger att max spänning är GND-0.2V till VDD + 0.2V (Jag mätte 1,57 volt med min multimeter, så om någon kan berätta vad datablad försöker säga , snälla hjälp ;)
Jag började spänningsavdelare med värden från 1 milliohms, men verkar det strömmen var otillräckligt, i slutet jag använde två 100 kilohms motstånd, släppa spänningen till 2.5V (spänning under 2 volt verkar inte träda i kraft).
Jag försökte skicka koden en gång bara och ibland fungerade ibland inte (släkt till 5684 micos dröjsmål?), skicka två gånger och det verkar ok.
< p > #define SYNC_US 1300 < br > #define SPACING_US 500
#define SIGNAL_US 800
#define PinPPM 8
#define cykler 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();
om (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);
}
annars om (inChar == ' o ') {
Serial.println(inChar);
uint16_t CodeToSend = 0b0000000110000000;
SendCode(CodeToSend);
}
}
} < /p >< p > / / Ange thr port hög/låg, som används i SendCode
void pulseOut (uint8_t stift, uint16_t TimeMicro) {
digitalWrite(pin,HIGH);
delayMicroseconds(TimeMicro);
digitalWrite (pin, låg);
delayMicroseconds(TimeMicro);
} < /p >< p > void SendCode (uint16_t CodeToSend) {
Serial.Print (F ("#SendCode: S"));
för (heltal index = 0; index < 13; index ++) {
uint8_t bit = (CodeToSend & (1 << index))! = 0;
Serial.Print(bit);
}
Serial.println();
för (int x = 0; x < cykler; x ++) {
pulseOut (PinPPM, SYNC_US);
för (heltal index = 0; index < 13; index ++) {
uint8_t bit = (CodeToSend & (1 << index))! = 0;
IF(bit == 1)
pulseOut (PinPPM, SIGNAL_US);
annat
pulseOut (PinPPM, SPACING_US);
}
}
} < /p >
Arbetat! Skicka "p" eller "o ' från seriella monitor jag kunde vända tanken på och av.
Testa "vänster motor fram" kod, verkar motorn fungerade för lite tid och slutade, att vi kommer att behöva hålla kommandot skickades samtidigt som vi vill ha tanken i rörelse.
Nu är det dags att den fullständiga ansökan. Använda ascii i seriella överföringar är det enklaste sättet, men jag vill ekonomin byte (ser att min framtida projekt, om vi använder en röding för varje knapp behövs 8 byte, med bitar vi behöver bara en byte).
Min kommunikation struktur har 10 byte på grund av en annan (samtidig) projekt, den första byten är prefix, andra är typ, byte 3 till 8 är data (kommandon, sensorer, etc) och byte 9 och 10 är för CRC. Ta en titt i koder.
Kompatibilitet med ascii meddelande jag använder "#" som prefix och "\r" som postfix, för min användning är det ok.
Jag bifogade två källkoder, en "registeransvarige" för visual studio 2010 c# .net och en för Arduino. Tänk på din att koden är inte komplett inte och buggfri. ;)
Om du inte har visual studio och du vill prova detta instructable, kan du köra Controller\bin\Debug\Controller.exe (require.net framework 4), ansluter till Arduino seriell port (du kan använda Arduino USB datakabel eller Bluetooth-enhet ansluten till TX/RX), kontrollera kryssrutan "fånga tangentbord för att styra" och Använd knapparna nedan (registeransvarige lyssnar endast dessa nycklar) :
UPP = Tank fram
NED = Tank bakåt
VÄNSTER = Tank vänster
HÖGER = Tank höger
Q = torn vänster
W = brand
E = torn höger
P = Power (på/av)
Controller få nyckeln ner (action) och nyckel (stop) händelser och anger bitarna i en byte och skicka till Arduino.
Arduino får den byten genom seriella och ange bitar till en 16 bitar variabel att skicka koden till RX.
Om du läser noga koderna, allt blir klart och tydligt (hoppas jag) ;)
Ledsen för min dålig engelsk (jag försökte mitt bästa. om du vill göra en översyn, är du välkommen att skicka mig ett privat meddelande)
Jag hoppas du gillar denna artikel.