Paso 2: BluCar
También pensé que el arduino por defecto, usando sólo el Serial.read() lee caracteres ASCII. (Me equivoqué por supuesto)
Pero esta razón Uzzor es cool: Amarino utiliza una matriz de 3 caracteres para enviar los datos de acelerómetro, que son de 3 bytes. Esos tres bytes corresponden sólo a una variable. Un byte para el avance, el segundo para el volante, la tercera para lo que quieras.
Uzzor envía un byte, que contiene las instrucciones para adelante, atrás, izquierda, derecha, faros, brakelights. muy bien.
Este es el arreglo que he encontrado:
| 7: faros | 6: BrakeLights | 5: invertir | 4: adelante | 3:Right | 2: izquierda | 1: | 0: |
Puede almacena la Serial.read() como un int y crea máscaras de bits para leer los bits que usted necesita para control.
Aquí está un ejemplo:
Obtener este número binario de Serial.read()
10010100 / / = 148
Los faros están en el coche se va hacia adelante y da vuelta a la izquierda.
Si quiero leer el estado de avance/retroceso:
crear una máscara de bits: 00110000 & 10010100
que se traduce en 00010000
Y puedo escribir código para saber que número y realizar una tarea.
Yo podría estar haciendo un mal método o algo, pero el camino lo hice funcionó para mí, si usted tiene cualquier otro método, publicarlos!
==============================================================
Tipo de fuera de tema
pero la forma que uzzor utiliza sus datos seriales es fricken bastante elegante. Como cuando finalmente entendí lo que era ir en I era como woah!, es muy suave!
Todo lo que hace es recta para escribir su número de 8 bits a DDRB (ATTINY, que tiene 8 puertos, cada puerto corresponde directamente a cada función, la luz LED está conectada con el séptimo (octavo pin) puerto más importante). Así que cuando escribe un alto en la posición de luz de freno, corresponde directamente al puerto que se conecta a la luz de freno led.
número de serie de 8 bits--> DDRB--> hardware
También crea una máscara de bits para omitir los últimos cuatro bits (0 y 1 están sin usar 2 y 3 son de dirección) y lo hace porque la dirección es controlada por un servo y otra función para convertir los datos en una señal de servo PPM.
Cool ¿no? Piensa que sí.
--------------------------------------------------------------------------------------------------------------------------------
Cuando empecé a tratar de lectura y prueba de los datos en serie desde la aplicación android de Uzzor, estaba usando el operador de igualdad, que no estaba funcionando. Pero supongo que es mala programación... Yo no he refinado mi código, pero lo que estoy haciendo es buscando rangos de Parque de bolas. Borrar los bits de los datos que quiero leer. Si quería leer el estado del motor, leer los Estados de avance y retroceso
0001 0000 //serial datos en tiempo real
0011 0000 & //mask por lo que he leído sólo los datos de avance/retroceso
--------------------
0001 0000 //forward
0010 0000 //same sino también para invertir
0011 0000 &
-------------------
0010 0000
Por lo que puede o bien obtener los valores de 32 o 16. (0010 0000 o 0001 0000)
y yo y con el número 48 porque 48 en binario es 0011 0000.
Así fue la forma en que escribí mi código
int x;
x = Serial.read(); Ser seguro podría intentar int x = Serial.read();
inversa:
x & = 48; x = serie & 0011 0000
Si (x > 24) servo.write(30); Ball park gama el comando reverso blanco que debe ser 32
else if (x < 24 & y x > 15) servo.write(180); Ball park gama el comando avance objetivo que debe ser 16
servo.write(90) otra cosa;
--------------------------------------------------------------------------------------------------------------
Así que eso es todo, aquí está algo de código para utilizar la aplicación de Uzzor con arduino:
#include < Servo.h >
Servo servo;
Motor servo;
void setup()
{
servo.Attach(9);
motor.Attach(8);
Serial.Begin(9600);
pinMode (13, salida); Este es mi "Faro"
}
void loop()
{//start principal
int x;
int y;
int z;
Si (Serial.available() > 0)
{//start si 1
x = Serial.read(); x tiene que ser declarado un Serial.read() aquí por alguna razón
y = x;
z = x;
y & = 48; y de máscaras de bits busca delantero/reverso
x y = 12; mira para la izquierda/derecha
z & = 128; no busca linterna luz de freno todavía
Si (x < 6 & & x > 3)
{
servo.Write(80); único de izquierda para mi proyecto
}
else if (x > 6)
{
servo.Write(120); derecho exclusivo de mi proyecto
}
servo.write(105) otra cosa; Centro exclusivo de mi proyecto
Si (y > 24)
{
motor.Write(30); inversa
}
else if (y < 24 & & y > 15)
{
motor.Write(150); hacia adelante
}
motor.write(90) otra cosa; no te muevas
Si (z > 0) digitalWrite (13, HIGH); faros
Else digitalWrite (13, bajo);
} //end si 1
} //end principal
------------------------------------------------------------------------------------------------------
me avisas si tienes consejos o mejoras.