Paso 7: Envíe arancelario y al RX
Ahora es el momento de intentar enviar los códigos de Arduino a RX, RX69A hoja de datos dice que el pin 6 (VI2) de entrada (como V02 es la salida que leemos), grados máximos absolutos en hoja de datos nos dicen que el voltaje máximo es GND-0, 2V a VDD + 0,2 v (me mide 1,57 voltios con mi multímetro, así que si alguien puede decir qué hoja de datos está intentando decir , por favor ayuda ;)
Empecé el divisor de voltaje utilizando valores de 1 miliohmios, pero parece que actual era insuficiente, al final he utilizado dos resistencias de 100 kilohms, dejando caer la tensión de 2, 5V (debajo de 2 voltios parece no tener efecto).
He probado a enviarme el código una vez solamente y a veces trabajada a veces no (relacionado con retardo 5684 micos?), enviando dos veces y parece 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>
Funcionó! Envía 'p' o ' o ' del monitor serial podría dar vuelta el tanque encendido y apagado.
Pruebas de código "motor izquierda adelante", parece el motor trabajó para un poco de tiempo y parado, que tendremos que seguir enviando el comando mientras que queremos el tanque en movimiento.
Ahora es el momento de la solicitud completa. Usar ascii en transmisiones de la serie es la forma más sencilla, pero quiero economía de bytes (mirando a mis futuros proyectos, si usamos a un char para cada botón necesitaremos 8 bytes, use brocas sólo necesitamos un byte).
Mi estructura de comunicación tienen 10 bytes debido a otros proyectos (simultáneos), el primer byte es prefijo, la segunda es tipo, bytes 3 a 8 es datos (comandos, sensores, etc.) y bytes 9 y 10 es para CRC. Echa un vistazo en los códigos.
Compatibilidad con comunicación ascii usar "#" como prefijo y "\r" como postfix, para mi uso es aceptable.
Os adjunto dos códigos fuente, uno "el regulador" para visual studio 2010 c# .net y uno para Arduino. Ten en tu mente que el código no está completo y no está libre de error. ;)
Si no tienes visual studio y desea probar este instructable, puede ejecutar Controller\bin\Debug\Controller.exe (require.net framework 4), conecte al puerto serie de Arduino (puede utilizar Arduino USB cable o dispositivo Bluetooth conectado al TX/RX), verifique la casilla de verificación "captura las teclas del teclado a control" y las teclas de abajo (el controlador escuchará sólo estas teclas) :
ARRIBA = tanque adelante
ABAJO = hacia atrás el tanque
IZQUIERDA = izquierda del tanque
DERECHA = tanque derecho
Q = izquierda de la torreta
W = fuego
E = a la derecha de la torreta
P = potencia (encendido/apagado)
Controlador recibe la llave de abajo (acción) y clave (parada) eventos y establecer los bits en un byte y enviar a Arduino.
Arduino, recibirán ese byte a través de bits serie y en conjunto a una variable de 16 bits para enviar el código a la RX.
Si usted lee cuidadosamente los códigos, todo será claro y sencillo (espero) ;)
Lo siento por mi mala Inglés (he intentado mi mejor. Si usted quiere hacer una revisión, eres Bienvenido a enviarme un mensaje privado)
Espero que disfruten este artículo.