-
Notifications
You must be signed in to change notification settings - Fork 0
Embedded
Există o mulțime de microcontrolere care alcătuiesc MARCEL, unele mai importante decât altele. În această secțiune veți înțelege utilizarea fiecăruia și modul în care funcționează.
Toate microcontrolerele au fost dezvoltate folosind framework-ul Arduino, urmând structura proiectului PlatformIO.
Deoarece MARCEL necesită multă putere de calcul, a trebuit să împărțim întregul corp în diferite sarcini pe care microcontrolerele individuale le-ar putea procesa pentru a asigura o performanță bună și un timp de răspuns aproape de 0. Având în vedere acest lucru, credem că următoarea schemă se potrivește cel mai bine.

Creierul întregii operațiuni, așa cum sugerează și numele său, este un Raspberry PI 5 situat în baza lui Marcel. Acesta comunică direct cu 2 dispozitive care controlează părțile superioară și inferioară ale robotului:
- ESP32 Bază
- ESP32 Torso
ESP32 Bază comunică direct cu alte 2 microcontrolere care gestionează mișcarea directă:
- ESP32 Roți
- Arduino Nano Ultrasonic
Scopul unic al ESP32 Torso este de a transmite informații către mâini sau ochi. După cum probabil ați ghicit, acesta controlează:
- ESP32 Ochi
- Arduino Nano Mâna dreaptă
- Arduino Nano Mâna stângă
Pentru simplitate, această documentație va folosi doar numele părților pentru a se referi la diferitele microcontrolere, după cum urmează:
- Creier
- Bază
- Ultrasonic
- Roți
- Torso
- Mâna dreaptă
- Mâna stângă
- Ochi
- Bază
Datorită numărului mare de microcontrolere care comunică între ele, este necesară o comunicare eficientă și rapidă. Pentru a beneficia de distanța mică dintre unele microcontrolere, folosim următoarele protocoale:
- Creier - Bază (UART)
- Bază - Ultrasonic (I2C)
- Bază - Roți (I2C)
- Creier - Torso (UART)
- Torso - Mâna dreaptă (I2C)
- Torso - Mâna stângă (I2C)
- Torso - Ochi (UART)
Datorită complexității ridicate a unor module și complexității reduse a altora, folosim 2 modalități principale de comunicare:
- Transmisie brută
- Comunicare bazată pe comenzi
Prin transmisie brută, ne referim la trimiterea directă a datelor brute prin protocol pentru ca microcontrolerul să le proceseze. În cele mai multe cazuri, RT ar fi un flux continuu sau necontinuu de date de dimensiune fixă care vor veni și pleca, făcându-l ușor de utilizat datorită formatului datelor, fără adăugiri personalizate.
Comunicarea bazată pe comenzi este mai complexă decât RT, utilizând un sistem similar cu modul în care funcționează mașinile de control numeric computerizat (CNC). Utilizează un șablon predefinit pe care fiecare lot de date individuale ar trebui să îl urmeze, permițând date de dimensiuni dinamice.
Toate datele trebuie trimise folosind comenzi. O comandă are următorul șablon:
Comanda (separator de valori) Valoare1 (separator de valori) Valoare2 (separator de valori) ... ValoareN (separator de comenzi)
Unde:
-
Comand- O comandă predefinită care gestionează o acțiune. -
ValueN- Valoarea la indexul$N$ din lista de valori transmise comenzii. Numărul și formatul valorilor variază în funcție de comandă. -
Value separator- Un caracter separator / șir între valori -
Command separator- Un șir de caractere separator care definește unde se termină o comandă
[!NOTĂ]
Pentru cazurile mai simple în care este necesară organizarea sau când înțelegerea umană este mai puțin obligatorie, poate fi utilizată și o versiune mai ușoară a CBC care elimină separatoarele și poate avea valori de comandă de dimensiune fixă.
Pentru ca Marcel să pornească corect, toate dispozitivele trebuie să dea un fel de „undă verde”, pentru a arăta că au pornit corect. Marcel poate porni numai după ce toate microcontrolerele sale au transmis un mesaj de pornire valid necorupt, după formatul:
Componenta sus
Dacă una sau mai multe componente nu au raportat înapoi, înseamnă că mesajul nu a fost trimis niciodată sau că mesajul s-a pierdut pe drum, indicând fie o problemă de conexiune software sau hardware, ceea ce înseamnă că ceva trebuie remediat.
[!AVERTISMENT]
Microcontrolerele vor fi blocate într-o stare de pauză la pornire până când li se va cere prima dată starea inițială. Pentru a face un microcontroler să funcționeze, trebuie să-i acordați aprobarea pentru a vă trimite mesajul de pornire. Acest lucru se face pentru a evita situațiile în care o componentă imbricată mai adânc pornește înaintea masterului său, trimite un mesaj, dar mesajul se pierde din cauza sistemului de procesare care nu funcționează încă. [!IMPORTANT] Mesajul universal de solicitare de confirmare primit de la un master va fi*.
În secțiunile următoare, vor fi discutate scopul, funcționalitatea, comunicarea, mesajele de eroare, jurnalele și alte aspecte importante. Acum că am definit un set de reguli și limite, putem face asta mai ușor.
| Parametru | Valoare |
|---|---|
| Model | ESP32 |
| Comanda sus | Base up |
| Comunicare | CBC |
| Componenta | Protocol |
|---|---|
| Roți | I2C (master) |
| Ultrasunete | I2C (master) |
| Creierul | UART |
Microcontrolerul de bază este menit să gestioneze comunicarea dintre creier și roți și ultrasunete. Comenzile sale sunt în principal legate direct de cele 2 microcontrolere copii.
| Comanda | Valoare | Descriere |
|---|---|---|
| S | orice | Modifică valoarea unei setări |
| T | Niciuna | Obține setările curente |
| M | <viteza_stânga> <viteza_dreapta> | Setează viteza roților |
| $ | Niciuna | Obțineți valorile ultrasonice actuale. Funcționează exact ca și comunicarea dintre Base și Ultrasonic |
| ! | Niciuna | Modul de alarmă. Face ca Wheels să intre în modul alarmă |
| ~ | Niciuna | Oprește modul de alarmă pentru roți |
| Setare | Valoare | Descriere | Exemplu |
|---|---|---|---|
| S | masca de 6 biti | Stabilește dacă robotul ar trebui să oprească automat mișcarea într-o anumită direcție atunci când detectează un obstacol cu unul dintre senzorii cu ultrasunete. Ordinea în mască este dată de ordinea senzorilor | S 001011 |
| D{index} | număr (cm) | Determină distanța care ar trebui considerată prea apropiată pentru un indice dat | D3 23 |
| Parametru | Valoare |
|---|---|
| Model | Arduino Nano |
| Comanda sus | Ultrasunete sus |
| Comunicare | RT |
| Componenta | Protocol |
|---|---|
| Baza | I2C (slave) |
Microcontrolerul cu ultrasunete este menit să raporteze distanța curentă citită de senzorii ultrasonici. Funcționează trimițând mai întâi distanța curentă, apoi așteptând trimiterea unui mesaj din nou.
[!NOTĂ] Ultrasonic nu va trimite date noi decât dacă este solicitat, acest lucru a fost implementat pentru a evita umplerea oricărui tip de buffer cu date care vor fi procesate într-o perioadă mai lungă de timp, făcând informațiile de distanță depășite. Acest lucru poate evita accidentele.
| Comanda | Valoare | Descriere | Exemplu de ieșire |
|---|---|---|---|
| $ | Niciuna | Solicită un nou lot de date ale senzorului. Datele vor fi returnate ca numere (cm) în ordinea poziției | 25 12 37 4 15 9 |
| Poziție | index |
|---|---|
| Față-Stânga | 0 |
| Față-Mijloc | 1 |
| Față-Dreapta | 2 |
| Spate-Stânga | 3 |
| Spate-Mijloc | 4 |
| Spate-Dreapta | 5 |
| Parametru | Valoare |
|---|---|
| Model | Arduino Nano |
| Comanda sus | Roțile sus |
| Comunicare | CBC |
| Componenta | Protocol |
|---|---|
| Baza | I2C (slave) |
Singurul scop al microcontrolerului Wheels este de a muta roțile. Primește întârzierea în microsecunde pe care ar trebui să o aibă fiecare roată și setează viteza motorului pas cu pas pentru fiecare.
| Comanda | Valoare | Descriere | Exemplu de ieșire |
|---|---|---|---|
| M | <viteza_stânga> <viteza_dreapta> | Setează viteza roților furnizând 2 numere din 4 cifre separate printr-un spațiu | |
| ! | Niciuna | Modul de alarmă. Oprește complet toate mișcările și ignoră comenzile viitoare | - |
| ~ | Niciuna | Oprește modul alarmă | - |
Microcontrolerul de bază este menit să gestioneze comunicarea dintre creier și roți și ultrasunete. Comenzile sale sunt în principal legate direct de cele 2 microcontrolere copii.
| Parametru | Valoare |
|---|---|
| Model | ESP32 |
| Comanda sus | Tnur în sus |
| Comunicare | CBC |
| Componenta | Protocol |
|---|---|
| Mâna stângă | I2C (master) |
| Mâna dreaptă | I2C (master) |
| Ochii | UART |
Microcontrolerul Torso este menit să stabilească comunicarea între ochi și mâini cu creierul. Spune mâinilor cum să se miște și ochilor ce să afișeze. De asemenea, redirecționează orice ieșire din mâini și ochi înapoi către creier.
| Comanda | Valoare | Descriere |
|---|---|---|
| L | Comanda manuală | Execută o comandă de mișcare pe mâna stângă |
| R | Comanda manuală | Execută o comandă de mișcare pe mâna dreaptă |
| M | <viteza_stânga> <viteza_dreapta> | Setează viteza roților |
| ! | Niciuna | Setează mâna stângă, mâna dreaptă și ochii în modul alarmă. Toată mișcarea va fi oprită instantaneu și ochii vor arăta doar negru |
| ~ | Niciuna | Oprește modul de alarmă pentru mâna stângă, mâna dreaptă și ochi |
| Parametru | Valoare |
|---|---|
| Model | Arduino Nano |
| Comanda sus | Mâna dreaptă sus |
| Comunicare | CBC |
| Componenta | Protocol |
|---|---|
| Torso | I2C (slave) |
Controlează servomotoarele din mâna dreaptă.
| Comanda | Valoare | Descriere |
|---|---|---|
| S | număr | Setează viteza pe care ar trebui să o aibă cea mai lungă operațiune. Orice operațiuni mai scurte vor fi încetinite pentru a se sincroniza cu cea mai lungă |
| M | {index1}{valoare1} {index2}{valoare2} ... {indexN}{valoareN} | Mută anumite motoare în anumite unghiuri. Indicele este indicele în ordinea motoarelor |
| ! | Niciuna | Setează mâna în modul alarmă. Toate mișcările vor fi oprite instantaneu |
| ~ | Niciuna | Oprește modul de alarmă pentru mână |
| Poziție | index |
|---|---|
| Umăr interior | 0 |
| Umăr exterior | 1 |
| Sub umăr | 2 |
| Cot | 3 |
| încheietura mâinii | 4 |
| Gheara | 5 |
| Parametru | Valoare |
|---|---|
| Model | Arduino Nano |
| Comanda sus | Mâna stângă sus |
| Comunicare | CBC |
| Componenta | Protocol |
|---|---|
| Torso | I2C (slave) |
Controlează servomotoarele din mâna stângă. Folosește comenzile Mână și ordonă la fel ca mâna dreaptă.
| Parametru | Valoare |
|---|---|
| Model | ESP32 |
| Comanda sus | Ochii sus |
| Comunicare | CBC |
| Componenta | Protocol |
|---|---|
| Torso | UART |
| Ochiul stâng | SPI (master) |
| ochiul drept | SPI (master) |
Controlează ceea ce este afișat pe ochi
| Comanda | Valoare | Descriere |
|---|---|---|
| ! | Niciuna | Setează mâna în modul alarmă. Toate mișcările vor fi oprite instantaneu |
| ~ | Niciuna | Oprește modul de alarmă pentru mână |
Mai multe în curând pentru ochi...
În afară de microcontrolere, Marcel folosește și un difuzor pentru a produce sunet și 2 camere pentru a vedea lumea din jurul lui.