Étape 2: BluCar
J’ai aussi pensé que l’arduino par défaut, en utilisant le Serial.read() seulement lire des caractères ASCII. (J’ai eu tort bien sûr)
Mais c’est pourquoi Uzzor est cool : Amarino utilise un tableau de 3 caractères pour envoyer des données d’accéléromètre, qui sont de 3 octets. Ces trois octets ne correspondent qu’à une variable. Un octet pour la marche avant, la seconde pour la direction, le troisième pour ce que vous voulez.
Uzzor envoie un octet, qui contient toutes les instructions pour marche avant, arrière, gauche, droite, phares, brakelights. plutôt cool.
Il s’agit de l’arrangement que j’ai trouvé :
| 7: phares | 6: BrakeLights | 5: inverser | 4: avant | 3:Right | 2: gauche | 1: inutilisés | 0: non utilisés |
Vous stockez le Serial.read() comme un int et créez des masques de bits afin de pouvoir pour lire les bits dont vous avez besoin de contrôler.
Voici un exemple :
Je reçois ce nombre binaire en nombre de Serial.read()
10010100 / / = 148
Les phares sont sur la voiture va avancer et tourner à gauche.
Si je veux lire l’état de marche avant/marche arrière :
créer un masque de bits : 00110000 & 10010100
qui se traduit par 00010000
Et je peux écrire du code pour comprendre que nombre et effectuer une tâche.
Je pourrais faire une mauvaise méthode ou quelque chose, mais comme je le faisais cela a fonctionné pour moi, si vous avez d’autres méthodes, postez-les !
==============================================================
Sorte de hors-sujet
mais la façon Qu'uzzor utilise ses données serial est jolie fricken chic. Comme quand j’ai enfin compris ce qui s’est passe je ressemblait woah!, c’est assez lisse !
Tout ce qu’il fait est bien droit écrire son numéro 8 bit à DDRB (ATTINY, qui dispose de 8 ports, ainsi que chaque port correspond directement à chaque fonction, l’ampoule LED est relié à la septième (huitième broche) plus important port). Ainsi quand il écrit un sommet dans la position de brakelight, elle correspond directement au port qui se connecte à le brakelight conduit.
Numéro de série de 8 bits--> DDRB--> matériel
Il crée également un masque de bits pour ignorer les quatre derniers bits (0 et 1 sont inutilisés 2 et 3 sont de direction) et il fait cela parce que le pilotage est commandé par un servo et faite une autre fonction pour convertir les données en un signal de servo PPM.
Cool hein ? Me croit qu’oui.
--------------------------------------------------------------------------------------------------------------------------------
Quand j’ai commencé à essayer de test/lire les données sérielles d’appli android de Uzzor, j’utilisais l’opérateur de l’équité, qui ne fonctionnait pas. Mais je suppose que c’est mauvaise programmation... Je n’ai pas amélioré mon code, mais ce que je fais est à la recherche pour les plages du parc ball. Effacer les bits dans les données que j’ai envie de lire. Si je voulais lire l’État moteur, j’ai lu les États avant et arrière
0001 0000 //serial données en temps réel
0011 0000 & //mask pour que j’ai ne lu que les données de marche avant/marche arrière
--------------------
0001 0000 //forward
//same 0000 0010 mais pour inverser
0011 0000 &
-------------------
0010 0000
Pour que je puisse soit obtenir valeurs 32 ou 16. (0010 0000 ou 0001 0000)
et j’ai & avec le numéro 48 48 en binaire étant 0011 0000.
Donc la façon dont j’ai écrit mon code était
int x ;
x = Serial.read() ; Se trouver en sécurité pourrait essayer int x = Serial.read() ;
inverse :
x & = 48 ; x = série & 0011 0000
Si (x > 24) servo.write(30) ; Ball park range la commande inverse de cible qui doit être de 32
ElseIf (x 24 < & & x > 15) servo.write(180) ; Ball park range le commandement avancé cible qui doit être de 16
d’autre servo.write(90) ;
--------------------------------------------------------------------------------------------------------------
Donc c’est ça, voici un code à utiliser app de Uzzor avec arduino :
#include < Servo.h >
Servo servo ;
Servo-moteur ;
void setup()
{
servo.Attach(9) ;
Motor.Attach(8) ;
Serial.Begin(9600) ;
pinMode (13, sortie) ; Il s’agit de mes « phares »
}
void loop()
{//start principal
int x ;
int y ;
int z ;
Si (Serial.available() > 0)
{//start si 1
x = Serial.read() ; x doit être déclaré un Serial.read() ici pour une raison quelconque
y = x ;
z = x ;
y & = 48 ; bit masques y cherche avant/revers
x & = 12 ; cherche à gauche/droite
z & = 128 ; ne cherche phare aucune lumière de frein encore
Si (x < 6 & & x > 3)
{
servo.Write(80) ; unique de gauche à mon projet
}
ElseIf (x > 6)
{
servo.Write(120) ; droit unique à mon projet
}
d’autre servo.write(105) ; Centre unique pour mon projet
Si (y > 24)
{
Motor.Write(30) ; inversée
}
ElseIf (y < 24 & & y > 15)
{
Motor.Write(150) ; vers l’avant
}
d’autre motor.write(90) ; ne bouge pas
Si (z > 0) digitalWrite (13, HIGH) ; phares
d’autre digitalWrite (13, faible) ;
} //end si 1
} //end principal
------------------------------------------------------------------------------------------------------
Je voudrais savoir si vous avez des conseils ou des améliorations.