Dobički:
- Zmožnost ustvarjanja vdelane kode glede na register in kontekst strojne opreme za Arduino/STM32/ESP32 z AI
- Sposobnost prepoznavanja in popravljanja vdelanih vzorcev, kot so prekinitve, časovniki in neblokirne zanke v izhodu AI
- Možnost pregleda ustvarjene kode glede pomnilnika, realnega časa in varnosti, preden jo naložite v strojno opremo
V mehatroniki je mikrokrmilnik mesto, kjer se ideje srečajo s fizičnim svetom. Kartice, kot so Arduino, STM32, ESP32; bere senzorje, poganja aktuatorje, komunicira in vse to počne pod omejenim pomnilnikom, omejeno procesorsko močjo in strogimi časovnimi zahtevami. Umetna inteligenca je na tem področju zelo uporabna: lahko izvleče nastavitve registra na podlagi podatkovnega lista senzorja, kodira komunikacijski protokol, nastavi prekinitev časovnika. Toda vgrajeni sistemi so eno od področij, kjer umetna inteligenca ustvarja največ »prepričljivih laži«; ker so naslovi registra, bitne maske in časovno vedenje specifični za ploščo in ena bitna napaka zmoti celotno vedenje. V tej enoti obravnavamo, kako vdelano kodo ustvariti z AI in kako jo pregledati, preden jo naložite v strojno opremo.
Razlika med vdelano kodo in čisto programsko opremo
Namizni program ima veliko pomnilnika, operacijski sistem in enostavno odpravljanje napak. Vdelani kodi manjka večina tega:
Velikost
namizje
vgrajeni sistem
spomin
raven GB
Raven KB (npr. 2 KB RAM-a)
čas
Na splošno prilagodljiv
Tesno, v realnem času
odpravljanje napak
Enostavno (razhroščevalnik, dnevnik)
Trdi (JTAG, serijski, LED)
Rezultat napake
Program se zruši
Aktuator/strojna oprema je lahko poškodovana
dostop do virov
Povzetki OS
Neposreden dostop do Registra
Te razlike določajo vaša merila za ocenjevanje izhoda AI: uporaba pomnilnika, natančnost registra v realnem času (brez blokiranja) in strojne opreme so vedno na vrhu vašega kontrolnega seznama.
Blokirna proti neblokirni kodi
Najpogostejša napaka začetnikov (in pogosto AI) je uporaba delay(). delay(1000) zaklene procesor za 1 sekundo; V tem obdobju ni mogoče brati nobenih drugih senzorjev, nobenih gumbov ni mogoče upravljati. To je v mehatroniki nesprejemljivo. Namesto tega se uporablja neblokirni vzorec, ki temelji na millis().
// SLABO: blokator -- procesor ne more opraviti nobenega drugega dela 1 sekundo void loop() { digitalWrite(LED, HIGH); zamuda (1000); // vse se ustavi digitalWrite(LED, LOW); zamuda (1000); // Gumba za nujne primere trenutno ni mogoče prebrati!}// DOBRO: neblokira -- zanka ni blokirana, druga opravila se izvajajo, če (nowMs - previousMs >= interval) { previousMs = nowMs; ledStatus = !ledStatus; digitalWrite(LED, ledStatus); } buttonCheck(); // lahko deluje v vsakem ciklu sensorRead(); //lahko deluje v kateri koli zanki}
Neblokirni vzorec je osnova vgrajene mehatronike: krmilna zanka teče neprekinjeno, nobena naloga ne zaklene druge. Če AI ob pisanju kode naročite, naj "ne uporablja zakasnitve, zapiši brez blokiranja na podlagi milimetrov", se izboljša kakovost izhoda.
Namig: poiščite zakasnitev( v vdelani kodi iz umetne inteligence. Če opazite zakasnitev v glavni krmilni zanki, najpogosteje ta koda ni primerna za sistem v realnem času in jo je treba prepisati.
Prekinitve in časovniki
Časovno kritične dogodke (impulz kodirnika, gumb, periodično vzorčenje) zajemamo s prekinitvami namesto s čakanjem v glavni zanki. Prekinitvena rutina (ISR) mora biti napisana kratko in previdno: brez zamud, Serial.print ali dolgih izračunov v njej; Spremenljivke v skupni rabi so označene kot spremenljive.
volatile long encoderCounter = 0; // ISR in zanka sta v skupni rabi -> nestanovitno stanje void enkoderISR() { // Kratek ISR: samo štetje, ne opravljajte drugega dela if (digitalRead(ENC_B)) enkoderCounter++; else encoderCounter--;}void setup() { pinMode(ENC_A, INPUT_PULLUP); pinMode(ENC_B, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(ENC_A), enkoderISR, RISING);}void loop() { dolg števec; noInterrupts(); //kratke prekinitve za števec atomskega branja = encoderCounter; prekinitve(); //varno transakcijo s števcem...}
Tri kritične točke v tem primeru so tiste, na katerih AI pogosto zgreši: (1) skupni encoderCounter mora biti `nestanoviten`, sicer bo optimizacija prevajalnika zamudila posodobitve; (2) ISR mora biti kratek; (3) Pri branju večbajtne spremenljivke v glavni zanki je treba prekinitve za atomsko branje za kratek čas zapreti, sicer lahko med branjem posreduje ISR in se lahko prebere polovična/pokvarjena vrednost (stanje tekmovanja). Ne pozabite preveriti, ali so ti trije prisotni v kodi AI.
Registrirajte točnost in podatkovni list
AI lahko verodostojno napačno predstavi naslov registra senzorja ali konfiguracijski bit MCU. Na primer, register upravljanja porabe energije MPU6050 IMU je 0x6B; Če AI to poda kot 0x6A, se koda prevede, zdi se, da deluje, vendar se senzor ne zbudi. Takšne napake so zaznane samo v primerjavi s podatkovnim listom.
// Prebujanje MPU6050: glede na podatkovni list PWR_MGMT_1 = 0x6B, vrednost 0x00#define MPU_ADDR 0x68#define PWR_MGMT_1 0x6B // <-- PREVERI iz podatkovni listWire.beginTransmission(MPU_ADDR);Wire.write(PWR_MGMT_1);Wire.write(0x00); // prebudi se iz načina spanjaWire.endTransmission(true);
Pozor: preverite vsak naslov registra, bitno masko in naslov I2C/SPI, ki jih je dal AI s podatkovnega lista. Te vrednosti so specifične za kartico in čip; Vrednost, ki si jo AI "zapomni", je lahko iz druge revizije čipa. Napačen register tiho vodi v nepravilno vedenje.
Šibek poziv / močan poziv
WEAK:»Preberite temperaturni senzor na ESP32.«(Kateri senzor? Kateri protokol? Kateri pin? Generično, verjetno napačna koda.)MOČNO:»Preberite temperaturni senzor DS18B20 na ESP32 (Arduino framework) iz GPIO4 z OneWire. Pišite brez blokiranja, vzorčite vsako 1 sekundo (z uporabo zakasnitve, na podlagi milisekov). Nastavite oznako napake v primeru napake pri branju (fiksna vrednost). -127 ali 85). Prosimo, navedite vsako knjižnico in pin povezavo, ki jo uporabljate, v prvem komentarju uporabite char buffer namesto String."
Močan poziv; Poda čip, ogrodje, senzor, protokol, pin, vzorec vzorčenja, stanje napake in omejitev pomnilnika. Tako je rezultat preverljiv in realističen.
Preglejte kontrolni seznam za vdelano kodo
Preden naložite izhod AI, ga prenesite skozi ta seznam:
- Blokiranje: Ali je v glavni zanki prišlo do zamude ali dolge blokade?
- volatile: Ali so spremenljivke v skupni rabi z ISR volatile?
- Atomski dostop: Ali je večbajtna spremenljivka v skupni rabi varna za branje?
- Register: Ali so naslovi in bitne maske združljivi s podatkovnim listom?
- Pomnilnik: Niz, velika polja, ali rekurzija povzroči prelivanje ravni KB?
- Obravnavanje napak: Ali se obravnavajo napake pri branju senzorja, časovne omejitve komunikacije?
- Varen zagon: Ali so izhodi aktuatorja ob zagonu postavljeni v varno (pasivno) stanje?
Mini etui
Inženir vgrajenih sistemov Baran naroči AI, da napiše kodo, ki bere IMU za dron. Koda se prevede in zdi se, da deluje, vendar so vrednosti kotov brez pomena. Baran uporabi kontrolni seznam: primerja naslove registrov s podatkovnim listom in ugotovi, da umetna inteligenca nepravilno izpiše register konfiguracije žiroskopa (0x1A namesto 0x1B), zato je lestvica občutljivosti napačna. Ko so popravljene, se vrednosti poravnajo. Nato obvestila delay(10) v glavni zanki; pretvorbo tega v strukturo, ki temelji na milisekundah, ker je blokiranje zanke za krmiljenje leta nesprejemljivo. Nazadnje vidi, da spremenljivka skupnega števca ni nestanovitna, in jo doda. AI je hitro dal okostje; Toda pregledni seznam je ujel tri ločene napake: register, blokiranje in volatile, strojna oprema pa sploh ni bila ogrožena.
Pogoste napake
- Uničenje odziva v realnem času z uporabo delay() v glavni krmilni zanki.
- Izogibajte se, da bi spremenljivka, ki je v skupni rabi z ISR, postala nestanovitna in da bi prišlo do tihe poškodbe podatkov.
- Neatomsko branje večbajtne spremenljivke v skupni rabi in generiranje pogojev tekmovanja.
- Ne preverjanje registrskih/bitnih mask, ki jih poda AI s podatkovnim listom.
- Ustvarjanje preliva pomnilnika z uporabo nizov in velikih nizov v omejenem RAM-u.
- Pozabili ste prvotno zavarovati izhode aktuatorja.
Če povzamem
- Vdelana koda; Deluje z omejenim pomnilnikom, tesnim časovnim razporedom in neposrednim dostopom do registra.
- V glavni zanki se namesto zakasnitve uporablja vzorec brez blokiranja, ki temelji na milisekundah.
- ISR je kratek; spremenljivke v skupni rabi morajo biti volatilne in dostopati atomarno.
- Naslovi registrov in bitne maske se vedno preverijo glede na podatkovni list; AI se lahko moti.
- Pomnilnik, obravnavanje napak in status varnega zagona so vedno preverjeni.
- Močan poziv; Vključuje čip, ogrodje, senzor, protokol, pin in omejitve.
Aplikacijska naloga
Izberite senzor (npr. DS18B20, MPU6050 ali HC-SR04) in mikrokrmilnik (Arduino/ESP32/STM32). Naj AI ustvari kodo za branje brez blokiranja z zmogljivo predlogo poziva v tej enoti. Nato enega za drugim sledite sedmim točkam kontrolnega seznama za pregled: primerjajte vsaj eno vrednost registra/pina s podatkovnim listom, preverite zakasnitve zanke, preverite nestanovitno stanje spremenljivk v skupni rabi. Koliko elementov je "prešlo" v prvem poskusu in koliko jih je bilo treba popraviti? Zabeležite si vsako težavo, ki jo najdete, in njeno rešitev.