Stap 2: BluCar
Ik dacht ook dat de arduino, met behulp van de Serial.read() alleen standaard ASCII-tekens lezen. (Ik was verkeerd natuurlijk)
Maar dit is de reden waarom Uzzor cool is: Amarino maakt gebruik van een 3 karakter array versnellingsmeter-gegevens, dat 3 bytes verzendt. Die drie bytes corresponderen alleen met één variabele. Één byte voor forward, de tweede voor de stuurinrichting, de derde voor wat je wilt.
Uzzor stuurt één byte, die alle instructies voor vooruit, achteruit, links, rechts, koplampen, brakelights bevat. vrij koel.
Dit is de regeling die ik gevonden heb:
| 7: koplampen | 6: BrakeLights | 5: reverse | 4: vooruit | 3:Right | 2: links | 1: ongebruikte | 0: ongebruikte |
U de Serial.read() opslaat als een int en bitmaskers maken om te lezen van de stukjes die u bepalen moet.
Hier is een voorbeeld:
Ik krijg dit binaire getal van Serial.read()
10010100 / / = 148
De koplampen zijn op, de auto gaat vooruit, en draaien links.
Als ik wil om te lezen van de status van vooruit-/ achteruitspoelen:
Maak een bitmasker: 00110000 & 10010100
wat resulteert in 00010000
En ik kan code schrijven om te begrijpen dat nummer en uitvoeren van een taak.
Ik kan een verkeerde methode doen of iets, maar de manier waarop ik deed dat het werkte voor mij, hebt u andere methoden, post ze!
==============================================================
Soort van onderwerp
maar de manier die uzzor zijn seriële data gebruikt is mooie fricken chique. Net als wanneer ik eindelijk begreep wat was ik aan de hand was zoals woah!, dat is vrij glad!
Alles wat hij doet is rechtop schrijven zijn 8 bit nummer DDRB (ATTINY, die 8 poorten, dus elke poort heeft komt overeen rechtstreeks met elke functie, de koplamp LED is aangesloten op de zevende (achtste pin) belangrijkste haven). Dus wanneer hij een hoog in de brakelight positie schrijft, het komt overeen rechtstreeks op de poort die met de brakelight geleid verbindt.
8 bit serienummer -> DDRB -> hardware
Hij creëert ook een bitmasker om te negeren de laatste vier bits (0 en 1 zijn ongebruikte 2 en 3 zijn sturing) en hij doet dit omdat de besturing is gecontroleerd door een servo en gemaakt van een andere functie de gegevens converteren naar een servo PPM signaal.
Cool he? Me er zo over denkt.
--------------------------------------------------------------------------------------------------------------------------------
Toen ik begon eerst proberen te test/lezen de seriële data uit Uzzor de android app, was ik met behulp van de "equity"-operator, waarmee niet werkte. Maar ik denk dat dat is slechte programmering... Ik heb niet mijn code verfijnd, maar wat ik doe is op zoek naar bal park bereiken. Ik schakel de bits rond de gegevens die ik wil lezen. Als ik wilde om te lezen van de motor staat, lees ik de voorwaartse en omgekeerde Staten
0001 0000 //serial real time-gegevens
0011 0000 & //mask zodat ik alleen de vooruit-/ achteruitspoelen gegevens lezen
--------------------
0001 0000 //forward
0010 0000 //same maar voor omkeren
0011 0000 &
-------------------
0010 0000
Dus ik kan krijgen beide waarden 32 of 16. (0010 0000 of 0001 0000)
en ik & met het nummer 48 omdat 48 in binaire 0011 0000.
Dus de manier waarop ik schreef mijn code was
int x;
x = Serial.read(); Veilig kon proberen int x = Serial.read();
omgekeerde:
x & = 48; x = Serial & 0011 0000
Als (x > 24) servo.write(30); bal park bereik de doelgroep omgekeerde opdracht die 32 moet
anders als (x < 24 & & x > 15) servo.write(180); bal park bereik de doelgroep voorwaartse opdracht die 16 moet
anders servo.write(90);
--------------------------------------------------------------------------------------------------------------
Dus dat is het, is hier wat code te gebruiken Uzzor van app met arduino:
#include < Servo.h >
Servo de servo;
Servomotor;
VOID Setup
{
Servo.attach(9);
motor.attach(8);
Serial.begin(9600);
pinMode (13, OUTPUT); Dit is mijn "koplamp"
}
void loop
{//start belangrijkste
int x;
int y;
int z;
Als (Serial.available() > 0)
{//start als 1
x = Serial.read(); x heeft een Serial.read() hier om wat voor reden worden verklaard
y = x;
z = x;
y & = 48; bits maskers y zoekt vooruit/revers
x & = 12; zoekt naar links/rechts
z & = 128; zoekt koplamp geen remlicht nog
Als (x < 6 & & x > 3)
{
Servo.write(80); unieke links toe aan mijn project
}
anders als (x > 6)
{
Servo.write(120); direct unieke toe aan mijn project
}
anders servo.write(105); Centrum unieke toe aan mijn project
Als (y > 24)
{
motor.write(30); omgekeerde
}
anders als (y < 24 & & y > 15)
{
motor.write(150); voorwaarts
}
anders motor.write(90); niet verplaatsen
Als (z > 0) digitalWrite (13, hoge); koplampen
anders digitalWrite (13, laag);
} //end als 1
} //end belangrijkste
------------------------------------------------------------------------------------------------------
Laat me weten of u geen advies of verbeteringen hebt.