CxemCAR on Arduino – Androidiga auto Bluetooth-juhtimine. Lihtne Bluetooth masin Arduino Bluetooth masinal Arduino telefonist

Android-telefoni Bluetooth-juhtimisega Arduino auto on väga lihtne, kuid huvitav projekt Arduino UNO-s, kasutades Motor Shield moodulit. Sellelt lehelt saate teada, milliseid komponente on vaja oma kätega Arduino robotmasina tegemiseks, samm-sammult juhised elektriahela kokkupanekuks ning saate alla laadida kõik Androidi ja Androidi jaoks vajalikud programmid. Arduino.

Selle projekti jaoks kasutasime Motor Shield L293D moodulit, kahte hammasratast, Arduino UNO plaati, HC-05 Bluetooth moodulit ja kahte LED-i esitulede jaoks. Juhtimine toimub kaugjuhtimisega nutitelefoni või tahvelarvuti Bluetooth-signaali kaudu. Pärast mudeli kokkupanemist ja programmide installimist saab nutitelefoni äpi abil autot keerata, edasi-tagasi sõita ning esitulesid sisse ja välja lülitada.

DIY Arduino masin

Selle projekti jaoks vajame:

  • Arduino Uno / Arduino Nano / Arduino Mega tahvel;
  • Mootori juhtkilp L293D;
  • Bluetoothi ​​moodul HC-05/06;
  • kaks mootorit käigukastide ja ratastega;
  • aku 9 volti (kroon);
  • 2 takistit ja 2 LED-i;
  • kere ja rattad vanast autost;
  • jootekolb, kuumsulatuspüstol, juhtmed, joodis jne.
Roboti osad - Arduino UNO autod

Arduino masina kokkupaneku skeem

Kui teil on kõik vajalikud osad olemas (projektis saate teha ilma LED-ide ja takistiteta), siis järgmisena vaatame, kuidas Arduino masinat oma kätega teha. Esiteks tuleks mootorite kontaktide külge jootma juhtmed ja kinnitada need elektrilindiga, et kontaktid lahti ei tuleks. Juhtmed tuleb ühendada mootorikilbi klemmi M1 ja M2 külge (polaarsust saab hiljem muuta).


Bluetooth-mooduli toide tuleb servoajami kontaktidest; me ei vaja projektis servosid. Ja toiteallikaks on stabiliseeritud pinge 5 V, mis meile sobib. Mugavam on jootma naisühendusi TX- ja RX-portidesse ning jootetihvte (BLS) mootorikilbi pin0- ja pin1-portidesse. Nii saate hõlpsasti Bluetooth-mooduli Arduinost lahti ühendada, kui peate visandi üles laadima.

LED-id juhitakse pordist “Pin2”, kus saab traadi otse pordi külge joota. Kui teete mitut Bluetoothiga masinat, mida samaaegselt juhite, soovitame HC-05 moodulil vilkuda. Mooduli vilkumine on väga lihtne ja siis ei aja te enam masinaid segadusse, kuna igaüks kuvab Androidis oma ainulaadse nime.

Rakendus ja eskiis Arduino masinale

Pärast vooluringi kokkupanemist laadige masina jaoks alla järgmine visand (ärge unustage allalaadimisel Bluetooth-moodulit Arduino küljest lahti ühendada) ja installige rakendus oma nutitelefoni. Kõik projekti failid (AFMotor.h teek, auto eskiis ja Androidi rakendus) saab otselingi abil alla laadida ühte arhiivi. Sketši toimimist saab kontrollida masinat arvutist Serial Monitori kaudu USB kaudu juhtides.

#kaasa // ühendage kilbi raamatukogu AF_DCMootori mootor1(1); // ühendage mootor klemmiplokiga M1 AF_DCMootori mootor2(2); // ühendage mootor M2 klemmiplokiga int val; // vabastage kontrolleris mälu void setup() (Serial.begin(9600); pinMode(2, OUTPUT); // LED-ide port motor1.setSpeed(250); motor1.run(RELEASE); // peatage mootor motor2.setSpeed(250); // määrake mootori maksimaalne kiirus motor2.run(RELEASE); // peatage mootor) tühisilmus () ( kui (Serial . saadaval ()) // kontrollib, kas käske võetakse vastu( val = Serial .read (); if (val == "f") ( // edasi liikuma motor1.run (FORWARD); motor1.setSpeed ​​​​(250); motor2.run (FORWARD); motor2.setSpeed ​​​​ (250) ; ) if (val == "b") ( // mine tagasi motor1.run (TAGASI); motor1.setSpeed ​​​​(200); motor2.run (TAGASI); motor2.setSpeed ​​​​(200) ) if (val == "s") ( // peatus motor1.run(RELEASE); motor2.run(RELEASE); ) if (val == "l") ( // pööra vasakule motor1.run(FORWARD); motor1.setSpeed(100); motor2.run(TAGASI); motor2.setSpeed(250); ) if (val == "r") ( // pööra paremale motor1.run(TAGASI); motor1.setSpeed(250); motor2.run(FORWARD); motor2.setSpeed(100); ) if (val == "1") ( // lülitage LED-id sisse digitalWrite(2,HIGH); ) if (val == "0") ( // lülitage LED-id välja digitalWrite(2,LOW); ) ) )

Koodi selgitused:

  1. testimiseks saate USB kaudu arvutist käske saata;
  2. mootorite pöörlemine akuga ühendamisel on erinev;
  3. saate mootoritega ise määrata pöörlemiskiiruse.

Pärast masina töö kontrollimist installige rakendus oma nutitelefoni või tahvelarvutisse. Kui loote esmakordselt ühenduse Bluetooth-mooduliga HC-05/06, peate siduma Androidiga (siis toimub sidumine automaatselt). Kui teil on ühenduse loomisega raskusi, lugege seda artiklit

Selles artiklis käsitleme Arduino ühendamist ja juhtimist Bluetoothi ​​​​kaudu.

Laialdaselt kasutatavat HC-06 hakatakse kasutama Bluetooth-moodulina.

Meie projektis lülitame sisse ja välja Bluetoothi ​​kaudu pordiga 13 ühendatud LED-i.

Alustame Androidi nutitelefoni rakenduse kirjutamisega. Rakendus kirjutatakse mugavas ja lihtsas programmeerimiskeskkonnas App Inventor. Programmid koostatakse veebis.

Järgige linki http://ai2.appinventor.mit.edu/. Seal palutakse teil sisse logida Google'i kontole, mille peate looma, kui teil seda veel pole.

Pärast sisselogimist suunatakse teid programmi, kus saate luua projekti, klõpsates nuppu "alusta uut projekti". Peate sisestama projekti nime. Nimetagem seda led_controliks.

Avaneb tühi rakenduse aken.

Siin asetame vajalikud komponendid. Valige vasakpoolsest aknast ListPicker ja pukseerige see projekti.

Parempoolses aknas oleva ListPickeri komponendi jaoks leidke atribuut Text ja muutke "Text for ListPicker1" väärtuseks "Valige BT-seade".

Avage vasakpoolses aknas vahekaart Layout, asetage rakendusse komponent HorizontalArrangement, muutke selle atribuudiks Width väärtuseks "Täida ema". Lisage horisontaalpaigutusele 2 nuppu, määrake igaühe atribuudiks Width väärtuseks "Täida ema". See peaks välja nägema selline:

Muudame nuppudel silte: esimene ütleb LED ON, teine ​​LED OFF.

Allpool lisame sildi ja tühjendame selle teksti.

Jääb vaid lisada komponent, mis korraldab andmeedastust Bluetoothi ​​kaudu. Avage vahekaart Ühenduvus ja asetage projekti BluetoothClient. See komponent ei ilmu telefoni ekraanile, vaid selle alla, sest see pole visuaalne.

Nüüd saate alustada programmi kirjutamist. Valige programmi paremas ülanurgas režiim Blocks.

Siin koostatakse programm graafikaplokkidest. Vasakul klõpsake komponendil ListPicker1 ja valige ListPicker1.BeforePicking.

Klõpsake uuesti ListPicker1 ja valige Seadista ListPicker1.Elements

Asetage see nagu ekraanipildil.

See annab meile loendi seotud Bluetooth-seadmetest. Nüüd loome ühenduse valitud seadmega. Kirjutage plokk nagu alloleval ekraanipildil.

Roosa plokk sildiga Ühendatud on esimene plokk vahekaardil Tekst. Sisestage tühjale väljale Connected.

Nüüd kirjutame nupukäitleja. Kui klõpsate esimesel nupul, saadetakse tekst "led_on" ja teisele klõpsates saadetakse "led_off". Samuti muutub silt Label1-s.

Jääb vaid projekt nutitelefoni alla laadida. Klõpsake nuppu Ehitamine ja valige allalaadimisviis.

Esimese valiku jaoks on teil vaja Internetti ja QR-koodi lugejat. Klõpsake ja oodake, kuni projekt on kokku pandud ja QR-kood genereeritud, seejärel avage nutitelefonis QR-koodi lugeja ja lugege koodi. Jääb vaid fail alla laadida ja installida.

Teise variandi puhul salvestatakse projekt .apk formaadis arvutisse ja saad selle igal mugaval viisil (näiteks USB kaudu) oma nutitelefoni alla laadida.

Nüüd alustame Arduino programmiga.

Andmete vastuvõtmine ja edastamine toimub COM-pordi kaudu, seega kasutame jada. Võtame signaale vastu tähemärgi haaval, moodustame stringi ja võrdleme genereeritud stringi led_on ja led_off käskudega.

Arduino

String val = ""; void setup() ( Serial.begin(9600); pinMode(13, OUTPUT); ) void loop() ( while (Serial.available()) ( //while andmed saabuvad char c = Serial.read(); // loe neid val += c //ja moodusta stringi viivitus (3) ( Serial.println(val); ) if (val == "led_on") ( digitalWrite(13, HIGH); ) else if (val == "led_off") ( digitalWrite(13, LOW); ) val = "" )

String val = "" ;

void setup() (

Sari. begin(9600);

pinMode(13, VÄLJUND);

void loop() (

samas (seeria . saadaval () ) ( //andmete saabumise ajal

char c = Jada. loe(); //loe neid

val += c; //ja loo string

viivitus(3);

}

Laadige kood üles Arduinosse.

Nüüd saate ühendada Bluetooth-mooduli HC-06. See ühendab väga lihtsalt:

Vcc 5v (3,3 V võimalik)

KUI ÜHENDATUD MOODULIGA PROGRAMMI ARDUINOsse LAADIDA, TULEB VÄLJA VIGA, SEST NII MOODUL KUI PROGRAMMI LADIMINE KASUTAVAD RX- JA TX-PORTE!

Rakendage Arduinole toide. Bluetooth-mooduli LED-tuli peaks vilkuma, see tähendab, et see ootab ühendust. Võtke nutitelefon, leidke seadetest bluetooth, lülitage see sisse ja alustage otsimist. Otsige üles seade nimega hc-06 ja looge sellega ühendus. See ei pruugi esimesel korral õnnestuda. Pärast ühekordset edukat sidumist saate programmi oma nutitelefonis käivitada.

Esmalt klõpsake "Vali BT-seade" ja valige seotud seadmete hulgast moodul. Järgmisena vajutage LED-i sisse- ja väljalülitusnuppe. Kui kõik on õigesti tehtud, siis kõik toimib.

Tegime Bluetoothi ​​abil väga lihtsa rakenduse, ilma disainita või isegi kontrollimata, kas oleme mooduliga ühendatud või mitte. Järgmistes tundides teeme keerukamaid rakendusi ja tutvume paremini App Inventoriga.

Ja tööta temaga koos.

Mootori kilbi uuendamine

Selgus, et Motor Shield mooduli tootjad võtsid oma klientidelt võimaluse paigaldada oma toote peale teine ​​moodul. Ilmselt meeldib neile peal olla või lihtsalt tavalist kontaktpaneeli pigistada.

See nüanss mulle üldse ei sobi. Seetõttu otsustasin jootekolvi kätte võtta ja Motor Shieldi enda jaoks sobivasse vormi viia.


Rebisin ettevaatlikult originaalkontaktipesad välja ja viskasin minema.


Nende asemele paigaldasin tavalised.


Sellisel kujul on moodul muutunud palju mugavamaks kasutamiseks. Nüüd saan Bluetoothi ​​juhtmed korralikult pistikutega ühendada, mitte jootma neid tihedalt mootorikilbi kontaktidega.

Bluetoothi ​​moodul JY-MCU Arduino jaoks


JY-MCU Bluetoothi ​​moodul ise on üsna pisike. Tarnekomplekt sisaldab ühenduskaablit. Nõelte määramised on näidatud tagaküljel.


Seda saab toita 3,6-6V toiteallikast. See annab meile võimaluse ühendada see otse Arduinoga ilma regulaatorit või pingejaoturit kasutamata.

Seadmega ühendamisel kasutatav kood: 1234.

Bluetooth JY-MCU ühendamine Arduino Mega 2560-ga

Ühendus on üsna lihtne.

Ametlik ühendusskeem:

  • JY-MCU TXT ühendage Arduino RX-iga (0).
  • Ühendage JY-MCU RXD Arduino TX-ga (1).

Selle ühendusvalikuga peate iga kord enne visandi laadimist Bluetooth-mooduli toite välja lülitama. Ärge unustage seda.

Ma ei ole selle valikuga rahul, seetõttu otsustasin kasutada jadatoega diskreetseid porte.

Mitteametlik ühendusskeem:

  • JY-MCU VCC on ühendatud +5V Arduinoga
  • Ühendage JY-MCU GND GND Arduinoga
  • JY-MCU TXT on ühendatud Arduino diskreetse PIN-koodiga 50
  • Ühendage RXD JY-MCU-ga, et luua Arduino diskreetne PIN-kood 51

Nüüd saate visandeid üles laadida ilma Bluetooth-mooduli toite välja lülitamata.

Bluetoothi ​​turvalisuse tagamiseks otsustasin kasutada Proto Shieldi plaati ja miniatuurset jooteta leivalauda. Edaspidi ühendan sellega muud seadmed, juhtnupud ja näidikud.




Sketš roboti juhtimiseks Arduinos Bluetoothi ​​kaudu Androidi nutitelefoni kaudu

Oma visandis rakendasin järgmisi funktsioone:

  • Edasi liikumine
  • Tagurpidi liikumine
  • Pööra vasakule
  • Pööra paremale
  • Edasiliikumisel sujuv vasakpööre
  • Edasiliikumisel sujuv parempööre
  • Tagurpidi liikumisel sujuv vasakpööre
  • Tagurpidi liikumisel sujuv parempööre
  • Peatus
  • Kiiruse seadistus 0%

    Kiiruse seadistus 10%

    Kiiruse seadistus 20%

    Kiiruse seadistus 30%

    Kiiruse seadistus 40%

    Kiiruse seadistus 50%

    Kiiruse seadistus 60%

    Kiiruse seadistus 70%

    Kiiruse seadistus 80%

    Kiiruse seadistus 90%

    Kiiruse seadistus 100%

Kasutasin sketšis funktsioone, et mitte dubleerida sarnaste sündmuste koodi.

#kaasa // Ühendage mootori juhtimisteek
#kaasa // Ühendage servode raamatukogu
#kaasa // Ühendage raamatukogu diskreetsete portide kaudu jadaga töötamiseks

//Mootorite jaoks objektide loomine
AF_DCMootori mootor1(1); //kanal M1 mootorikilbil – tagumine vasak
AF_DCMootori mootor2(2); //kanal M2 mootorikilbil – taga paremal
AF_DCMootori mootor3(3); //kanal M3 mootorikilbil – ees vasak
AF_DCMootori mootor4(4); //kanal M4 mootorikilbil – ees paremal

// Servo jaoks objekti loomine
Servo vsservo;

SoftwareSerial BTSerial(50, 51); // RX, TX

// Bluetoothi ​​käskude jaoks muutuja loomine
char vcmd;
// Looge muutujad mootorite kiiruste meeldejätmiseks
int vspdL, vspdR;
/* Loo muutuja, mille väärtus vähendab sujuvate pöörete ajal kiirust.
Praegune kiirus peab olema sellest väärtusest suurem. Vastasel juhul pöörlemissuunas olevad mootorid lihtsalt ei pöörle */
int vspd = 200;

void setup() (
// Bluetoothi ​​andmeedastuskiiruse määramine
BTSerial.begin(9600);
// Määrake andmeedastuskiirus kaabli kaudu
Serial.begin(9600);
// Valige viik, millega servo on ühendatud
vservo.attach(9); // või 10, kui see on ühendatud välimisesse pistikupessa
// Pöörake servot iga kord, kui see sisse lülitate, 90 kraadi
vservo.write(90);
// Määrake mootorite maksimaalne pöörlemiskiirus
vspeed(255 255);
}

void loop() (
// Kui andmeid on
kui (BTSerial.available())
{
// Lugege käske ja pange need muutujasse. char teisendab käsu märgi koodi märgiks
vcmd = (char)BTSerial.read();
// Saada pordile käsk, et neid saaks "Port Monitoris" kontrollida
Serial.println(vcmd);

// Edasi
if (vcmd == "F") (
vforward();
}
// Tagasi
if (vcmd == "B")
{
vbackward();
}
// Vasak
if (vcmd == "L")
{
vleft();
}
// Õige
if (vcmd == "R")
{
vright();
}
// Otse ja vasak
if (vcmd == "G")
{
vforwardleft();
}
// Otse ja õige
if (vcmd == "I")
{
vforwardright();
}
// Tagasi ja vasakule
if (vcmd == "H")
{
vbackwardleft();
}
// Tagasi ja paremale
if (vcmd == "J")
{
vbackwardright();
}
// Peatu
if (vcmd == "S")
{
vrelease();
}
// Kiirus 0%
if (vcmd == "0")
{
vspeed(0,0);
}
// Kiirus 10%
if (vcmd == "1")
{
vspeed(25,25);
}
// Kiirus 20%
if (vcmd == "2")
{
vspeed(50,50);
}
// Kiirus 30%
if (vcmd == "3")
{
vspeed(75,75);
}
// Kiirus 40%
if (vcmd == "4")
{
vspeed(100,100);
}
// Kiirus 50%
if (vcmd == "5")
{
vspeed(125,125);
}
// Kiirus 60%
if (vcmd == "6")
{
vspeed(150,150);
}
// Kiirus 70%
if (vcmd == "7")
{
vspeed(175 175);
}
// Kiirus 80%
if (vcmd == "8")
{
vspeed(200 200);
}
// Kiirus 90%
if (vcmd == "9")
{
vspeed(225 225);
}
// Kiirus 100%
if (vcmd == "q")
{
vspeed(255 255);
}
}
}

// Edasi
void vforward() (
vspeed(vspdL,vspdR);
vforwardRL();
}

// Edasi RL-ile
void vforwardRL() (
motor1.run(FORWARD);
motor2.run(FORWARD);
motor3.run(FORWARD);
motor4.run(FORWARD);
}

// Tagasi
void vbackward() (
vspeed(vspdL,vspdR);
vbackwardRL();
}

// Tagasi RL-i
void vbackwardRL() (
motor1.run(TAGASI);
motor2.run(TAGASI);
motor3.run(TAGASI);
motor4.run(TAGASI);
}

// Vasak
void vleft() (
vspeed(vspdL,vspdR);
motor1.run(TAGASI);
motor2.run(FORWARD);
motor3.run(TAGASI);
motor4.run(FORWARD);
}

// Õige
tühine vright() (
vspeed(vspdL,vspdR);
motor1.run(FORWARD);
motor2.run(TAGASI);
motor3.run(FORWARD);
motor4.run(TAGASI);
}

// Edasi ja vasakule
void vforwardleft() (
if (vspdL > vspd) (
vspeed(vspdL-vspd,vspdR);
}
muidu
{
vspeed(0,vspdR);
}
vforwardRL();
}

// Edasi ja paremale
void vforwardright() (
if (vspdR > vspd) (
vspeed(vspdL,vspdR-vspd);
}
muidu
{
vspeed(vspdL,0);
}
vforwardRL();
}

// Tagasi ja vasakule
void vbackwardleft() (
if (vspdL > vspd) (
vspeed(vspdL-vspd,vspdR);
}
muidu
{
vspeed(0,vspdR);
}
vbackwardRL();
}

// Tagasi ja paremale
void vbackwardright() (
if (vspdR > vspd) (
vspeed(vspdL,vspdR-vspd);
}
muidu
{
vspeed(vspdL,0);
}
vbackwardRL();
}

// Peatu
tühine vrelease())(
motor1.run(RELEASE);
motor2.run(RELEASE);
motor3.run(RELEASE);
motor4.run(RELEASE);
}

// Muuda kiirust
void vspeed(int spdL,int spdR)(
if (spdL == spdR) (
vspdL=spdL;
vspdR=spdR;
}
motor1.setSpeed(spdL);
motor2.setSpeed(spdR);
motor3.setSpeed(spdL);
motor4.setSpeed(spdR);
}

Bluetooth RC Car programm - robotauto juhtimine Android nutitelefonist

Installisin oma nutitelefoni Bluetooth RC Car programmi. Minu arvates on see parim tarkvara robotauto juhtimiseks.


Programm võimaldab teil edastada käske, kui vajutate nuppe või reageerite nutitelefoni kiirendusmõõturi andmetele, reguleerige liuguriga liikumiskiirust, lülitage sisse esi- ja tagatuled, lülitage sisse ja välja helisignaal, lülitage sisse ja välja hädasignaal.




Programm nõuab Androidi versiooni 2.3.3 või uuemat. Programmi suurus on 3 megabaiti.

Käskude loend:

  • F – edasi
  • B – tagasi
  • L - vasakule
  • R – õige
  • G – otse ja vasak
  • Mina – otse ja paremale
  • H – tagasi ja vasakule
  • J – tagasi ja paremale
  • S – peatus
  • W – esituled sisse lülitatud
  • w – esituli on välja lülitatud
  • U – tagatuli põleb
  • u – tagatuli on välja lülitatud
  • V – helisignaal on sisse lülitatud
  • v – helisignaal on välja lülitatud
  • X – hädaabisignaal on sisse lülitatud
  • x - hädaabisignaal on välja lülitatud
  • 0 – liikumiskiirus 0%
  • 1 – liikumiskiirus 10%
  • 2 – liikumiskiirus 20%
  • 3 – liikumiskiirus 30%
  • 4 – liikumiskiirus 40%
  • 5 – liikumiskiirus 50%
  • 6 – liikumiskiirus 60%
  • 7 – liikumiskiirus 70%
  • 8 – liikumiskiirus 80%
  • 9 – liikumiskiirus 90%
  • q – liikumiskiirus 100%

Nagu näete, on loovuse proovikivi üsna hea. Lisaksin ka võimaluse panna eraldi sisse parem ja vasak tuled esi- ja tagatuledele.

Olen esile tõstnud paksus kirjas käsud, mida visandis juba toetatakse. Ülejäänu kasutan mõnel muul otstarbel.

Käskude edastamise põhimõte: programmis nuppu vajutades edastatakse käsk Bluetoothi ​​kaudu üks kord ja nupu vabastamisel koheselt S-stopp käsk.

Töö demonstreerimine

Järgmisel korral plaanin robotiga ühendada ultraheli kaugusmõõtja ja rakendada takistuste vältimise algoritmi.

Ärgem ostkem hiinlastelt halbu mänguasju, vaid ostkem neilt odav ehituskomplekt-šassii, paar moodulit ja paneme käed külge!

Selle ma lõpuks sain: läbitav šassii, juhitav - TA-DA!!! - minu Android nutitelefonist.


"Ma olen sirge, olen külili,
Pöörde ja hüppega,
Nii jooksust kui ka kohapeal,
Ja kaks jalga koos..."

Täna ehitame Bluetoothi ​​kaudu kaugjuhtimispuldiga naljaka auto. Kaasas Androidi juhtimisprogrammi allikad.

Korralik näide mänguasjast

Mul on kaks last, tütar ja poeg. Mõlemale kingitakse sünnipäevaks mänguasju. See, mida nad mu tütardele annavad, ei põhjusta reeglina minu negatiivseid reaktsioone. Ja pojale antakse ootuspäraselt kõikvõimalikke autosid, paake ja muud varustust. Kogu sellest Hiina kraami laviinist on mul ainuke asi, mille peale mul pole etteheiteid, mängumootorsaag, mille kinkisin endale.

Miks nii? Ilmselt sellepärast, et see saag müüdi STIHLi tööriistapoes. Usun, et STIHL tegi oma toodetest väikeses reklaamväljaandes mänguasja analoogi. Selle tulemusena sündis täiesti terve mõistusega mänguasi, mis on väga sarnane oma vanemale vennale. Kummist kett pöörleb, 80 protsenti juhtnuppudest on rakendatud. Seal on isegi käepidemega juhe sae kerimiseks, lüliti ja gaasinupp. Komplektis on varukett ja tööriist keti vahetamiseks.


Siin on mängusaag

Millest ma räägin? Oh jah, arhitektuurist! Pean silmas seda, et kui soovite, saate teha suurepärase mänguasja. Ja on, millele otsa vaadata.

Ehitame puldiga auto!

Raadio teel juhitavad mänguasjad pakuvad praktilist ja tehnilist huvi. 4–6-aastasele lapsele aga ei anta mänguasju, millel on „täiskasvanu“ proportsionaalne kontroll. Tõenäoliselt läheb mänguasi katki ja raha läheb raisku.
Selle tulemusena annavad nad tavaliselt midagi odavat. Sellest kõigest - "odavalt" - on autod kas väga kiired või aeglased; tankid on nõrgad; ja muud ilmsed ja varjatud puudused. Ja kindlasti ei mingit proportsionaalset kontrolli.

Ühel ilusal päeval lõpetas ühe auto parem ratas pöörlemise. Võtsin lahti ja kontrollisin mootorit - töötas.
Juhtplaadil on kolm mikrolülitust - Hiina on loll, ma ei leidnud mõistlikku dokumentatsiooni. Üks kiip on raadiosignaali vastuvõtja, millel on loogilised väljundid ja kaks sillamootori draiverit. Üks juhtidest on ebaõnnestunud. Ma ei saanud kohe diskreetsetest komponentidest sillamootori draiverit kokku panna.

Kohalikus raadioosade poes polnud midagi sobivat. Nii ma läksin kaugetesse riikidesse imeliste mikroskeemide järele. Korjasin oma asjad kokku, täitsin taskud kreekeritega, valasin tassi kohvi, käivitasin brauseri ja läksin... .
Leidsin parameetritele vastava mootoridraiveri ja tellisin kaks korraga. Igaks juhuks äkki on mõni vigane või põletan end ära. Siis hakkas tekkima idee oma autost. Pärast seda, kui pakk kuulsusrikkast Hiinast saabus, vahetasin edukalt juhi välja ja masin saigi remonditud.

Oma auto ideed riiulile jätmata valisin taas aluse - tulevase auto šassii. Šassiid on maismaatranspordi jaoks erinevad: roomik-, ratas-, kahe-, kolme-, neljarattalised jne.

Kuidas ma šassii valisin

Esiteks valisin maapealse transpordiviisi, mis tähendab, et mul on maapealne šassii. Roomikšassiid on tavaliselt kallimad ja mitte eriti kiired. Kahe- või kolmerattalised sõidukid tunduvad mulle halvasti läbitavad, sellise veermikuga saab sõita vaid tasasel pinnal.
Asusin edasi. Minu arvates on sellisel šassiil suurepärane manööverdusvõime ja kiirus.


Kaasas šassii:
kaks akrüülplaati hunniku tehnoloogiliste aukudega kõigi võimalike andurite, juhtpaneelide ja muude komponentide paigaldamiseks
4 ratast
4 ajamit kokku pandud (elektrimootor + käigukast)
4 ketast pesaga kiirusandurite jaoks, üks iga ratta jaoks
kinnitusvahend
Jah, see on jälle Hiina. Jah, odav. Jah, päris hea kvaliteediga. AGA! Parem proovime seda kõigepealt. “Täiskasvanud” šassii maksab ju nagu täiskasvanu, me pole selleni veel kasvanud.

Mõtete ja lähteülesannete soo

Kui hoiate oma kätes paljutõotavat asja, näiteks mudeli varustamise võimaluste osas kõikvõimalike andurite, servode jms, hakkate uppuma mõtete sohu ja väljavaadete mülkasse. Aga ütleme endale – STOP! Ja me koostame prototüübi minispetsifikatsiooni koos kõigi komponentide lühikirjeldusega.
Meil peaks olema Bluetoothi ​​kaudu juhitav maismaasõiduki RC-mudel, millel on võimalus tagurdada ja sujuvalt juhtida ratta kiirust.

Mida me vajame masina kokkupanekuks?

.


Pöörlevaid rattaid pole, mis tähendab, et pöördejuhtimine on nagu roomiksõidukil. See tähendab, et edasi/tagasi liikumise korral pöörlevad ajamite parem ja vasak pool sama kiirusega. Ja pöörde tegemiseks peab pöörlemiskiirus ühel küljel olema väiksem või suurem.


Masina kaugjuhtimiseks kasutame Bluetoothi ​​kanalit. Moodul “HC-06” on Bluetoothi ​​sild, jadaliides, mis võimaldab edastada andmeid mõlemas suunas. Sisend sisaldab TTL jadaliidese signaale “RxD” ja “TxD” ühendamiseks mikrokontrolleriga (sihtplaat).
Androidi mobiiltelefon toimib kaugjuhtimispuldina. Kirjutame oma programmi!



Juht on kahe kanaliga, vasaku ja parema rattapaari jaoks. Draiveril on loogilised sisendid väljundi polaarsuse (pöörlemissuuna) muutmiseks ja PWM-sisend, mis võimaldab juhtida pöörlemiskiirust.


See juhatus valiti sellepärast lebas lauasahtlis ja on meie otstarbeks täiesti sobiv. Seal on diskreetsed sisendid/väljundid, väljastatakse MK signaalid “RxD” ja “TxD”, kuhu ühendatakse “HC-06”.
Tulevikku vaadates ütlen, et Olimexi MOD-IO toode on kõva liialdus. Tore oleks kasutada tavalist, millest loo jätkus räägime!

Kokku:šassii + juhtplaat + Bluetooth moodul + juhtprogramm Androidile.

Üldine ühendusskeem

Mitte skeem puhtal kujul, vaid ühendusskeem, kuna meil on kõik plaadid valmis ja jääb üle vaid omavahel ühendada.

Skeem Proteuses


Ma ei kirjelda, mida ja kuhu ühendasin. Tõenäoliselt on teil teistsugune juhtpaneel. Lisan lähtekoodi, et saaksite püsivara redigeerida. Noh, kui keegi ei saa oma tahvli püsivara kompileerida, võtke minuga ühendust - aitan, kui mul on vaba aega.

Mikrokontrolleri programm

MK-programm saab Bluetooth-moodulilt jadaliidese kaudu käske vastu võtta.
Ja vastavalt käskudele juhtige vasakut ja paremat draivi paari. Tagurdus- ja kiiruse reguleerimine töötab PWM-i abil.

Kood on piisavalt kommenteeritud. Eraldi tahaksin peatuda oma andmevahetuse rakendamisel.
Ma saan andmeid helipuhvri kaudu. Asi pole uus ja teostusi on palju.

Olen paigutanud helipuhvri funktsioonid eraldi teeki, mis koosneb:
päisefail ring_buffer.h ja funktsiooni rakendusfail ring_buffer.c
Teegi kasutamiseks peate selle lisama kausta main.c
#include "ring_buffer.h"

Järgmisena peate päisefailis konfigureerima teegi. Konfigureerimiseks peate määrama ainult neli direktiivi:
#define RX_PACKET_SIZE 7 // RxD paketi suurus #define BUFFER_SIZE 16 // Vastuvõtupuhvri suurus. Peab olema kaks korda suurem kui RX_PACKET_SIZE #define START_BYTE "s" // Algbait #define STOP_BYTE "e" // Lõpeta bait

Tegelikult pole enam midagi seadistada.

Koodi kasutamine Main.c-s konfigureerime mikrokontrolleri USART-i.
USART konfiguratsioonifunktsiooni helistamine
USART_Init(MYUBRR);

#define BAUD 9600 #define MYUBRR F_CPU/16/BAUD-1 void USART_Init(unsigned int ubrr) ( /* Määra boodikiirus */ UBRRH = (unsigned char)(ubrr >> 8); UBRRL = (signed char)ubrr; /* Luba vastuvõtja ja saatja */ UCSRB = (1<< TXCIE) | (1 << RXCIE)| (1 << TXEN) | (1 << RXEN); /* Set frame format: 8data, 2stop bit */ UCSRC = (1 << URSEL) | (0 << USBS) | (3 << UCSZ0); }

Andmepaketi vastuvõtmine

USART baitide vastuvõtu katkestuse töötleja funktsioonis peame lihtsalt vastuvõetud baidi helina puhvrisse panema. Parsisime paki hiljem.
ISR(USART_RXC_vect) ( uint8_t Data = UDR; RB_push_char(Data); // Vastuvõetud baidi lisamine helinapuhvrisse )
Jah, ma olen praegu kõik kaadrikontrollid tähelepanuta jätnud.

Nüüd jääb meil vaid aeg-ajalt puhvrit kontrollida. Selleks käivitasin taimeri, milles panin lipu, mis võimaldab helipuhvrit kontrollida
ISR(TIMER0_OVF_vect) ( TCNT0 = 0x64; ReadRingBuffer = 1; )

Põhitsüklisse lisame tingimuse lipu kontrollimiseks.
if (ReadRingBuffer) ( if (RB_read_buffer((uint8_t*)&RxPacket) == 1) Puhvri lugemine ( // Parsi paketti, tee midagi ) ReadRingBuffer = 0; )

Funktsioon RB_read_buffer kontrollib rõngaspuhvrit, kui paketi suurus, algus- ja lõppbaidid on paigas - pakett loetakse kehtivaks, funktsioon tagastab argumendina "1".
Suurema usaldusväärsuse huvides võib paketi varustada kontrollsummaga ühes minu kommertsprojektis. See tähendab, et lisaks suuruse ja start/stop baitide kontrollimisele lisatakse ka kontrollsumma kontroll. Aga praegu saame ilma selleta hakkama.

Kuidas pakendit lahti võtta

Nüüd on huvitav osa see, kuidas ma pakendi lahti võtan. Pakett võib edastada andmeid, mis on suuremad kui bait, allkirjastatud andmed või ujukomaandmed.
Selgitan šassii juhtimise paketi näitel. Lisaks algus- ja lõppbaitidele pean oma paketis edastama ühe käsu ja kaks PWM-väärtust draivi vasakule ja paremale küljele. Käsu jaoks piisab mulle ühest baidist ja iga PWM-i väärtuse kohta edastan int16- 16-bitine, signeeritud tüüp. See tähendab, et ma ei edasta suunalippu (baiti/märki). Suuna muutmiseks edastan positiivse või negatiivse PWM väärtuse.

Minu vastuvõtupakett on organiseeritud struktuuri kujul.
struct RxPacket ( uint8_t StartByte; uint8_t käsk; int16_t Left_PWM; int16_t Right_PWM; uint8_t StopByte; ) RxPacket;

Funktsiooni kutsumine RB_read_buffer ((uint8_t*)&RxPacket ), argumendina edastame vastuvõtva paketi struktuurile osuti. See tähendab, et kui pakett on vastu võetud, sorteeritakse kõik RxPacketi struktuuris oma kohtadesse. Siis jääb üle vaid need andmed struktuurist lugeda, näiteks nii:
lCmd = RxPacket.Command; lLPWM = RxPacket.Left_PWM; lRPWM = RxPacket.Right_PWM;

Andmepakettide edastamine

Kuigi edastust minu programmis veel ei kasutata, on sellegipoolest edastamise võimalus rakendatud. Andmete ülekandmine on lihtsam. Samamoodi nagu vastuvõtva paketi puhul, loome struktuuri:
struct TxPacket ( uint8_t StartByte; uint8_t Rc5System; uint8_t Rc5Command; uint8_t StopByte; ) TxPacket;

Kus on algus- ja lõppbait ning teabeosa. Oleme USART-vastuvõtja juba lähtestanud.
Pakettedastuse algatamiseks helistage funktsioonile
void send_packet() ( // Kirjutage algusbait UDR-i registrisse UDR = START_BYTE; )
Selles näites kirjutan selles funktsioonis UDR-i registrisse ainult algusbaidi. See ei tundu palju, kuid samas funktsioonis saate rakendada pakendi ettevalmistamist või midagi muud kasulikku. Ja see on minu arvates loogilisem. See on isedokumenteeriva koodi mõttes mõistlik. See tähendab, et kui olen koodis, siis kirjutan lihtsalt väärtuse UDR-registrisse, seda võib tajuda kui ühe baidi ülekandmist ja isekõneleva funktsiooni väljakutsumist. send_packet()- Ma räägin sellest, et saadan andmepaketi.

Järgmisena, kui USART-saatja saadab UDR-registrist kogu baidi, kutsutakse välja edastuskatkestuse töötleja.
ISR(USART_TXC_vect) ( unsigned char * Pointer = (signed char *)&(TxPacket); staatiline märgita märk TxIndex = 1; if (TxIndex< sizeof(TxPacket)) { UDR = *(Pointer + TxIndex); TxIndex++; } else TxIndex = 1; }

Käitlejas deklareerin kursori muutuja ja määran sellele TxPacketi struktuuri aadressi. Järgmisena deklareeritakse staatiline muutuja - edastatud baidi indeks, millele deklareerimisel omistatakse väärtus 1 . Alustame ühega, sest oleme struktuurist esimese baidi juba saatnud. Üldiselt saab struktuur ilma algusbaidita nagunii hakkama, saadan selle eraldi, aga selle baidi deklaratsioon jäetakse struktuuris aru, kuidas pakett välja näeb.

Tingimus, kui (TxIndex< sizeof(TxPacket)) проверяет, что индекс меньше чем размер пакета. Если условие верно, то записываем байт в регистр UDR: UDR = *(Pointer + TxIndex);
TxIndexi juurdekasv. Kui USART edastab järgmise baidi, jõuame jälle käitlejasse, kuid edastatakse struktuurist järgmine bait ja nii edastatakse kõik struktuuri baidid. Kui TxIndex on suurem kui struktuuri suurus, ei ole tingimus tõene ja saame tulemuseks muidu TxIndex = 1; Kus TxIndex initsialiseeritakse, kuid UDR-registrisse ei kirjutata midagi, nii et töötlejat ei kutsuta enam enne, kui on algatatud järgmine paketiedastus. Seega on edastusprotsess täiesti automaatne ja isegi kui muudame paki struktuuri, ei pea käitlejat ümber kirjutama.

MK programmi kirjelduse raames jääb üle rääkida autojuhtide juhtimise rakendamisest. Juhti juhivad kolm signaali: A1 (B1), A2 (B2) ja PWMA (PWMB). A1 ja A2 on mõeldud draiveri sisse/välja lülitamiseks ja väljundi polaarsuse muutmiseks. PWMA-sisendisse suunatakse MK-st saadav PWM-signaal - saate reguleerida pöörlemiskiirust. PWM-signaali jaoks kasutasin kahte riistvaralist PWM-taimerit 1.
#define _WGM13 0 #define _WGM12 1 #define _WGM11 0 #define _WGM10 1 // Taimer 1 init TCCR1A = (1<< COM1A1) | (0 << COM1A0) | (1 << COM1B1) | (0 << COM1B0) | (_WGM11 << WGM11) | (_WGM10 << WGM10); TCCR1B = (0 << CS12) | (0 << CS11) | (1 << CS10) | (_WGM13 << WGM13) | (_WGM12 << WGM12); TCNT1 =0x0000; OCR1A = 0; OCR1B = 0;

Taimer on 16-bitine, kuid PWM on lähtestatud 8-bitiseks. Ja nagu te ilmselt juba märkasite, on mul vastuvõtvas paketis kaks väärtust PWM-i seadistamiseks, vastavalt vasaku ja parema draivi jaoks. Signeeritud muutujad on 16-bitised.
Ma selgitan, miks ma seda tegin.

Esiteks, tuli see Androidi programmist. Fakt on see, et Javas pole ühtegi signeeritud tüüpi ja ma olen selle reha otsa juba astunud. Ja numbrite 0–255 edastamiseks peaksin kuidagi kõrvale hiilima. Otsustasin valida lihtsama tee – saadan allkirjastatud 16-bitise numbri. Samas on signeeritud tüüpi 16 bitti vahemikus -32786 kuni 32768, mis on meile piisav.

Teiseks, minu arvates on see läbipaistvam - pöörlemiskiirust ja suunda kirjeldab vaid üks muutuja.

Ja kolmandaks, mida iganes võib öelda, meie eesmärkidel on võimatu hoida seda vähem kui kolmes baidis. Ohverdame veel ühe baidi, aga kõik saab selgeks: positiivne PWM väärtus tähendab edasipööret, negatiivne väärtus vastupidist pöörlemist.

Draivide juhtimiseks kirjutasin funktsiooni drive(int vasakPWM, int paremPWM);.
void drive(int leftPWM, int rightPWM) ( // Liiguta EDASI vasak ratas if (leftPWM > 0)( ClearBit(A2_PORT, A2_PIN); SetBit(A1_PORT, A1_PIN); ) // Liiguta TAGASI vasak ratas if (leftPWM< 0){ ClearBit(A1_PORT, A1_PIN); SetBit(A2_PORT, A2_PIN); } // Движение ВПЕРЁД правое колесо if (rightPWM >0)( ClearBit(B2_PORT, B2_PIN); SetBit(B1_PORT, B1_PIN); ) // Liiguta TAGASI parem ratas if (rightPWM< 0){ ClearBit(B1_PORT, B1_PIN); SetBit(B2_PORT, B2_PIN); } // Остановка if (leftPWM == 0){ ClearBit(A1_PORT, A1_PIN); ClearBit(A2_PORT, A2_PIN); } // Остановка if (rightPWM == 0){ ClearBit(B1_PORT, B1_PIN); ClearBit(B2_PORT, B2_PIN); } set_PWM((uint8_t)(abs(leftPWM)), (uint8_t)(abs(rightPWM))); }
Vastavalt PWM väärtusele juhitakse signaale A1 (B1), A2 (B2) ja PWM väärtus määratakse funktsiooni kutsumisega. set_PWM(vasakPWM, paremPWM).

Uff, mul läheb hingetuks...
Kokkuvõtteks: võttis paketi vastu, sõelus selle, edastas funktsioonile PWM-i väärtuse sõita.

Androidi rakendus autodele

Ei, ma ei lasku nii palju üksikasjadesse kui MK programm. Olen Androidi tarkvaraarenduse alal alles uus ja ma pole valmis piisavalt asjatundlikult ja sügavalt rääkima.

Programmi põhifunktsioon- andmete edastamine moodulile HC-06 Bluetoothi ​​kaudu. Programmil on lihtne liides.

Ülaosas on mooduli valimiseks seotud Bluetooth-seadmete rippmenüü. Alguses seda loendit seal ei olnud, kuid artikli kallal töötamise lõpus otsustasin seda teha inimlikult, sest kõik ei saa lähtekoodist aru.

Järgmisena lülitab nupp "Väljas" sisse/välja side seadmega "HC-06". All vasakult paremale: vasaku kanali edastatud PWM väärtus, anduri tüüp, parempoolse kanali väärtus. Allpool on kaks liugurit kiiruse ja pöörlemistundlikkuse reguleerimiseks.

Programm rakendab kahte tüüpi masina juhtimist. Anduri tüübi vahetamiseks peate puudutama anduri nime: "Tilt" või "Shuffle".

1. Juhtige masinat telefoni kallutades. Telefoni nullasend on horisontaalne. Kui telefon on ette kallutatud, suureneb PWM väärtus proportsionaalselt kaldega vahemikus 0 kuni 255. Kui kallutate telefoni tagasi, väheneb PWM väärtus proportsionaalselt kaldega vahemikus 0 kuni -255


Vasakule või paremale pööramiseks peate telefoni kallutama ette või taha ja samal ajal vastavalt vasakule või paremale. Jah, nagu päris autos, ei keera see enne, kui gaasi vajutada.

2. Puutejuhtimine. Minu kaubanimi seda tüüpi juhtseadise jaoks on "shuffle".


Seda võib pidada puuteplaadiks. Kui puudutate hallis ruudus, suureneb/väheneb PWM väärtus sõltuvalt puudutuse asukohast, mida allapoole või keskpunktist ülespoole, seda suurem/väiksem on väärtus.

Kellasid ja vilesid pole. See näib olevat kõik.

Väike kärbseseen “suuskadel”

Minu telefoniga on probleem. Jah, "suusa" telefon on LG G2 mini. See ei loo piisavat Bluetooth-ühendust. Ühendus luuakse tavaliselt ainult siis, kui Bluetooth oli vahetult enne rakenduse käivitamist sisse lülitatud.
Tegin nii: rakenduse käivitamisel kontrollin, kas Bluetooth on sisse lülitatud, kui see on välja lülitatud, esitan taotluse selle sisselülitamiseks. Ja kui ma "minimineerin" või sulgen rakenduse, lülitan Bluetoothi ​​jõuliselt välja.
Ja veel üks asi, kui muudate ekraani orientatsiooni, lülitub Bluetooth välja ja jälle palutakse see sisse lülitada, peate ekraani pööramise automaatse ümberlülitamise välja lülitama.

Kokkuvõte

Usun, et olen oma eesmärgi saavutanud! Vähe vaevaga lõin mõistliku proportsionaalse juhtimisega RC-mudeli. Autoga saab innukalt mängida ka täiskasvanu, tehes kohapeal pöördeid, sooritades keerulisi piruette, vajadusel aeglustades ja kiirendades.
Ja seda on lihtne parandada, kui see puruneb.

Veel on ruumi tegutsemiseks, on ruumi kasvada. Saate kohandada šassiid, saate uuendada ja täiustada oma telefoni tarkvara.
Ja sellele tuleb jätk!


Selles materjalis soovitame õppida, kuidas saate kodus raadio teel juhitavat autot valmistada.

Masina valmistamiseks vajame:
- mänguauto;
- kaks Arduino Uno kaarti;
- kaks NRF24 raadiomooduli plaati;
- kondensaator 470 mF, 25 volti;
- L298N mootori juhiplaat;
- mootor;
- servoajam;
- analoogjuhtkang;
- laetavad akud;
- kroonpatarei;
- kaks sisse- ja väljalülitusnuppu;
- raam.

Esimene samm on kondensaatori jootmine raadiomooduli toitekontaktide külge. Samuti peate esmalt kokku panema akud, et saada mootori ja Arduino plaadi toiteks 12 volti koguvõimsust.

Vajalik on hoolitseda auto pöördesüsteemi eest. Selleks lõikasime välja esirataste kinnitamiseks mõeldud osa.

Nüüd tuleb masina kere ja rataste alumisse ossa teha 4 mm läbimõõduga augud.

Kogume kõike. Me sisestame kruvi rattasse ja kinnitame selle kahe mutriga.

Me sisestame teise kruvi korpusel olevasse auku ja kinnitame selle mutritega.

Lõpuks ei jää muud üle, kui panna ratas nurgaga masina korpuses oleva mutri peale ja kinnitada veel paari mutriga. Teeme sama teise rattaga.

Nüüd peate ühendama servoajami pöörleva süsteemiga.

Mootoril on ka spetsiaalsed kinnitusavad, millesse tuleb sisestada kaks kruvi, et mootor masina kere külge kinnitada.

Nüüd peate koodi Arduino tahvlile üles laadima. Artikli lõpus esitatakse nii vastuvõtja kood kui ka saatja kood.

Esitame skeemi juhtkangi või saatja kokkupanekuks.

Allpool näete vastuvõtja koostu skeemi.

Lõpuks jääb üle vaid isetehtud raadio teel juhitava auto elektroonika ja mehaanika kokku panna. Selle sisselülitamisel peate esmalt sisse lülitama juhtpaneeli, seejärel masina enda.

Nagu lubatud, anname allpool lingid plaadi programmeerimiseks vajalikele koodidele
Vastuvõtja kood: (allalaadimisi: 3609)
Saatja kood: (allalaadimisi: 2617)

Samuti esitame lühikesed juhised Arduino Uno plaatide püsivara vilkumise kohta. Plaat tuleb ühendada arvutiga USB-kaabli kaudu. Järgmisena peate ametlikult veebisaidilt () alla laadima tasuta programmi, installima selle, installima tahvli draiverid ja selle programmi abil välguma.

Kui kasutate Hiina tahvlit, siis saate selle draiveri alla laadida sellelt lingilt: