Mikä pin on mcu. Kuka on Sysadmin? Web-palvelin NodeMCU:ssa LED-matriisiohjaukseen

Power-On Reset (POR) -piiri varmistaa, että mikro-ohjain käynnistyy vain, kun Vcc-jännite saavuttaa turvallisen tason. Kuten kuvassa näkyy. Kuvassa 24, sisäänrakennettu ajastin, jonka kello on sisäänrakennettu vahtikoirageneraattori, pitää MCU-käynnistyksen jonkin aikaa saavutettuaan käynnistyskynnysjännitteen Vpot riippumatta jännitteen Vcc nousunopeudesta (katso kuva 26). .

Taulukossa 6 on esitetty SUT1- ja SUT0-bittien asetukset, joilla asetetaan käynnistysmenettelyn viivejakson pituus. Käyttäjällä on mahdollisuus valita aloitusajan viive. Asetusta SUT 1/0 = 00, joka saa MCU:n käynnistymään 5 kellojaksossa, käytetään käytettäessä ulkoista kellosignaalia, joka on syötetty XTAL1-nastalle. Tämä asetus mahdollistaa nopean käynnistyksen virrankatkaisu- tai virransäästötilasta edellyttäen, että näissä tiloissa on kellosignaali. Yksityiskohdat Ohjelmointi-osiossa.

Jos sisäänrakennettu käynnistysviive on riittävä, RESET voidaan kytkeä Vcc:hen suoraan tai ulkoisen kuormitusvastuksen kautta. Pidä nastaa matalana jännitteen ollessa päällä, virran palautusaikaa voidaan pidentää. Esimerkki tällaisesta kellotuksesta on annettu. Riisi. 27.

Riisi. 25. MCU:n ensimmäinen käynnistys. RESET-nasta kytketty Vcc:ään, Vcc:n nopea nousu

Riisi. 26. MCU:n ensimmäinen käynnistys. RESET-nasta kytketty Vcc:hen, Vcc:n hidas nousu

12

Tarvitaanko liitettäviä vastuksia (sekä sisäisiä että ulkoisia) vain MCU INPUT -nastoihin? Sitä vastoin OUTPUT:ksi määritetty MCU-nasta "tietää, millä tasolla se on", koska se ohjaa - "kelluvalla" MCU OUTPUT -nastalla, joka on sidottu johonkin toisen piirin tuloon, ei ole merkitystä, koska MCU-nastan tila voi olla vain korkea tai matala. .. olenko oikeassa? Nyt, kun MCU käynnistyy tai kaatuu, voi olla edullista yhdistää "MCU-lähtö IC-tuloon" -rivi kyseiseen kanavaan, jotta varmistetaan, että minkään IC:n tulo ei koskaan kellu.

Ehkä vastasin vain omaan kysymykseeni täällä... pull-up/down vastuksia voidaan käyttää sekä tulo- että lähtönastoissa sovelluksesta riippuen?

  • 5 vastausta
  • Lajittelu:

    Toiminta

16

Vedä ja pop-toiminto käytetään yleensä varmistamaan, että linjalla on tietty tila sen sijaan, että se olisi aktiivinen. Niitä käytetään tuloissa estämään kelluvia linjoja, vaihtamaan nopeasti korkean ja matalan ja keskitason "määrittämättömän" alueen välillä. Lähtöjä ei yleensä tarvita.

Mutta useimmat mcu-nastat ovat GPIO:ita, ja joskus ne määritellään tuloiksi käynnistettäessä lähtöjen sijaan. Kuten jo sanoit, joskus et halua IC-nastan tulon kelluvan käynnistettäessä, etenkään kuten nollausnasta, jota tavallisesti käytät mikro-ohjaimesi GPIO:n kanssa.

Tämä on kun käytät Heikko Johdon vetäminen tai sammuttaminen. Koska ne ovat heikkoja ja valitset oletustilan, ne eivät häiritse piiriäsi (jos tulosignaalin oletetaan aina olevan matala ja sitten vedetään korkealle, valitset heikot pois ja päinvastoin), mutta ne vetävät vähän nykyinen. Siksi valitset työhön riittävän heikon (korkeamman, heikomman) vastuksen.

Toinen normaali ulostuloasetus, joka käyttää vetoa (tai harvemmin push-upia), on Avoin viemäri tai avoin keräilijä yhteyksiä. Ne johtavat vain matalaan yhteyteen tai vapauttavat siiman jättäen sen kellumaan. Vetoja käytetään tuomaan viiva korkeaan logiikan tilaan.

0

Mainitsit Open Drain- ja Open Collector -liitännät, ne eivät koske mikro-ohjaimia, eihän? Käytetäänkö Mossetteja yksinkertaisesti logiikkatason asettamiseen? Halusin selventää, voiko mikrokontrolleri ajaa linjaa, jolla on korkea työntövastus. - yleinen purppurakilpikonna 16. lokakuuta 17. 16. 10. 2017 klo 12.00.41

7

Sinulla on tämä oikeus; Uloskäynneissä ei yleensä tarvita vetoa, mutta niistä voi olla hyötyä turvallisuuden kannalta kuormauksen aikana jne.

Toinen syy käyttää ulosvetoa: jos jokaisessa yhteydessä on useita lähtöjä, jotka on kytketty useisiin toisen MPU:iin, sinä Todellaälä halua yhtä ajaa VCC:tä ja toista 0V:tä samalle johdolle! Joten valitset lähdön 0V:ksi tai poistat lähdön käytöstä (ehkä asettamalla sen tuloksi). Kun kaikki lähdöt on poistettu käytöstä, johto vedetään arvoon "1" (Vcc). Tätä kutsutaan "wire AND" -signaaliksi. (Voit tehdä saman ajon "1" tai pois päältä, kun R on pudonnut, niin sitä kutsutaan langalliseksi TAI).

Tällä kuviolla on useita käyttötarkoituksia, mukaan lukien se, että yksi MPU voi ilmoittaa virheestä tai sytyttää LEDin tai antaa niiden vuorotellen välittää viestejä toisilleen yhden johdon kautta.

2

Vastaus: Se riippuu mikro-ohjainperheestä ja oletusarvoisesta Power On Reset -asennosta. Jos mikro-ohjain voidaan konfiguroida vain joko "ulostuloksi" tai "tuloksi" nastalle, tämä tarkoittaa yleensä sitä, että lähtöön käytetään totem-napa-ajuria, mikä tarkoittaa, että se on olennaisesti CMOS-portin lähtö, jolloin tuotos ajetaan aina kiskoille, joten siihen ei ole mitään syytä passiivisesti vaikuttaa. Ainoa kerta, kun lähdössä on järkevää käyttää ylös-/alasvetoja, on silloin, kun se on määritetty Open Collector/Open Drain -topologiaksi. Paljon yleisempiä ovat sisäiset ylös-/alasvetoparametrit, joita voidaan käyttää vain, kun nasta on määritetty tuloksi. Jos voit taata, että järjestelmäsi tuloa ohjaa aina jokin, se vie vähän tehoa.

3

Kuten totesit, käyttämällä pullup/pulldown-vastuksia nastoissa, joiden odotetaan tulevan ulos, voidaan varmistaa tulotila.

Tämä tehdään MCU-salaman/vian vähentämiseksi, mutta se toimii vain suojaamaan korkean impedanssin olosuhteilta (periaatteessa nasta on konfiguroitu tuloksi vahingossa).

SPI (Serial Peripheral Interface) on sarjamuotoinen synkroninen tiedonsiirtostandardi full duplex -tilassa, jonka Motorola on kehittänyt tarjoamaan yksinkertaisen ja edullisen mikro-ohjainten ja oheislaitteiden liittämisen. SPI:tä kutsutaan joskus myös nelijohtimisrajapinnaksi SPI on synkroninen protokolla, jossa jokainen lähetys synkronoidaan isäntälaitteen (prosessorin) generoiman yhteisen kellosignaalin kanssa. Vastaanottava oheislaite (slave) synkronoi bittisekvenssin vastaanoton kellosignaalin kanssa. Useita siruja voidaan liittää yhteen siru-isäntälaitteen oheisliitäntään. Isäntä valitsee orjan lähetettäväksi aktivoimalla sirun valintasignaalin orjasirulla. Oheislaitteet, joita prosessori ei ole valinnut, eivät osallistu SPI-lähetykseen.
SPI käyttää neljää digitaalista signaalia:

  • MOSI tai SI – isäntälähtö, orjatulo (englanniksi: Master Out Slave In). Siirtää tietoja isäntälaitteesta orjalaitteelle;
  • MISO tai SO – isäntätulo, orjalähtö (englanniksi: Master In Slave Out). Siirtää tietoja orjalaitteesta isäntälaitteeseen.
  • SCK tai SCLK – sarjakellosignaali (englanniksi Serial CLocK). Toimii kellosignaalin lähettämiseen orjalaitteille.
  • C.S. tai SS – sirun valinta, orjavalinta (englanniksi: Chip Select, Slave Select) Sirun valinta tapahtuu pääsääntöisesti matalalla loogisella tasolla.

Napaisuuden ja kellovaiheen yhdistelmistä riippuen neljä SPI-käyttötilaa on mahdollista.

SPI-tila Ajoituskaavio
SPI0-tila

SPI1-tila
Aktiivinen impulssitaso on korkea.

SPI2-tila

Ensin napsauta ja sitten liu'uta.

SPI3-tila
Aktiivinen impulssitaso on alhainen.
Ensin vuoro, sitten snap.

Taulukossa oletetaan:

  • MSB - tärkein bitti;
  • LSB - vähiten merkitsevä bitti.

Isäntälaitteen on mukauduttava orjan käyttämään tilaan.
SPI-liitännän kautta vaihdettaessa mikro-ohjain voi toimia isäntänä (Master mode) tai orjana (Slave mode). Tässä tapauksessa käyttäjä voi asettaa seuraavat parametrit:

  • toimintatila taulukon mukaisesti;
  • lähetysnopeus;
  • lähetysmuoto (vähiten merkitsevästä bitistä eniten merkitsevään bittiin tai päinvastoin).

Kahden mikro-ohjaimen yhdistäminen master-slave-rakenteessa SPI-liitännän kautta tapahtuu seuraavan kaavion mukaisesti.

Päämikro-ohjaimen nastat SCK, CS ovat lähtöjä ja orja-mikro-ohjaimen tuloja.

Tiedonsiirto tapahtuu seuraavasti. Kun kirjoitetaan isäntämikro-ohjaimen SPI-datarekisteriin, SPI-moduulin kellogeneraattori käynnistetään ja dataa aletaan lähettää bitti bitiltä MOSI-nastalle ja vastaavasti orjamikro-ohjaimen MOSI-nastalle. Kun nykyisen tavun viimeinen bitti on annettu, kellosignaalin generaattori pysähtyy ja samalla asettaa "Lähetys loppu" -lipun arvoon "1". Jos SPI-moduulin keskeytyksiä tuetaan ja ne on otettu käyttöön, keskeytyspyyntö luodaan. Tämän jälkeen isäntämikrokontrolleri voi aloittaa seuraavan tavun lähettämisen tai kohdistamalla loogisen "1" jännitetason orjan SS-tuloon, asettaa sen valmiustilaan.

Samalla kun dataa siirretään isännältä orjalle, siirto tapahtuu myös vastakkaiseen suuntaan edellyttäen, että orjan SS-tulossa on matala jännite. Siten jokaisessa vuorojaksossa dataa vaihdetaan laitteiden välillä. Jokaisen jakson lopussa keskeytyslippu asetetaan arvoon "1" sekä isäntä- että orjamikro-ohjaimessa. Vastaanotetut tavut tallennetaan vastaanottopuskureihin myöhempää käyttöä varten.

Tietoa vastaanotettaessa vastaanotettu tavu on luettava SPI-tietorekisteristä ennen kuin seuraavan tavun viimeinen bitti saapuu siirtorekisteriin. Muuten ensimmäinen tavu menetetään.

SS-nasta on tarkoitettu aktiivisen orjalaitteen valitsemiseen ja on aina tulona Slave-tilassa. Joka kerta kun SS-nasta käytetään logiikkaan 1, SPI-moduuli nollataan. Jos tämän nastan tilassa tapahtuu muutos tiedon siirron aikana, sekä lähetys että vastaanotto pysähtyvät välittömästi ja lähetetyt ja vastaanotetut tavut menetetään.

Jos mikro-ohjain on Master-tilassa, tiedonsiirron suunta SS-nastan kautta on käyttäjän määrittelemä. Jos nasta on määritetty ulostuloksi, se toimii yleiskäyttöisenä nastana eikä vaikuta SPI-moduulin toimintaan. Pääsääntöisesti tässä tapauksessa sitä käytetään ohjaamaan Slave-tilassa toimivan mikro-ohjaimen SS-nastaa.

Jos nasta on määritetty tuloksi, se on ajettava korkealle, jotta SPI-moduuli toimii oikein. Pienen jännitteen kytkeminen tähän tuloon mistä tahansa ulkoisesta piiristä, SPI-moduuli havaitsee mikro-ohjaimen valitsemisen orjaksi (ja tietoja aletaan siirtää siihen).

Esimerkki SPI-liitännän käytöstä STM32-mikro-ohjaimille on kuvattu hyvin artikkelissa

Toinen mielenkiintoinen ja jopa hyödyllinen projekti NodeMCU:ssa on WiFi-ohjattu ticker. Varmasti jokainen meistä näkee tällaisia ​​laitteita joka päivä kaupungin kaduilla. Esimerkiksi tickeriä käytetään laajalti liikenteessä näyttämään reitin numero, seuraava pysäkki ja kaikenlaisten asioiden tunkeileva mainonta. Tyypillinen ticker on LED-matriisi, jossa on skannausohjauspiiri ja mikro-ohjain. Tätä matriisia pitkin ryömivä teksti voidaan tallentaa paikallisesti tai päivittää dynaamisesti WiFin tai GSM:n kautta. Tietysti, jolla on niin tehokas alusta kuin NodeMCU (tai mikä tahansa muu ESP8266), ticker voidaan tehdä kotona. On järkevää asentaa se jonnekin julkiseen paikkaan, esimerkiksi kouluun. Tällaisen infotaulun kautta on kätevä raportoida koulun sisäisiä uutisia, lämpötila ikkunan ulkopuolella tai jopa erinomaisten oppilaiden nimiä! Laboratoriossamme asensimme tickerin ensimmäisen kerroksen ikkunaan. Tämän IoT-laitteen avulla toivotimme kaikille ohikulkijoille hyvää uutta vuotta ja joulua :)

1. LED-matriisin liittäminen NodeMCU:hun

Työskentelemme valmiiden matriisimoduulien kanssa, joita ohjaa MAX7219-siru. Olemme jo kirjoittaneet yksityiskohtaisesti tällaisten moduulien toiminnasta yhdessä Arduino-alustan oppitunnista -. Lyhyesti sanottuna jokaisessa tällaisessa moduulissa on 10 kontaktia. Viisi toisella puolella ja sama toisella. Tämä tehdään siten, että moduulit voidaan liittää peräkkäin ketjuun. Syöttössä meillä on:
  • kaksi kosketinta teholle: maadoitus GND ja +5V;
  • kolme kosketinta SPI-väylää varten: CS, DIN, CLK;
Oletetaan, että haluamme tehdä juoksevan linjan neljästä tällaisesta moduulista. Otamme ensimmäisen moduulin ja yhdistämme sen NodeMCU:hun kaavion mukaisesti:
8x8 LED-matriisi MAX7219:llä VCC GND DIN C.S. CLK
NodeMCU +5V GND D7 D8 D5
Sitten yhdistämme kolme muuta ensimmäiseen moduuliin:
Jalustan ulkonäkö:
Neljän erillisen moduulin sijaan on järkevää käyttää valmiita kokoonpanoja, esimerkiksi tätä:

2. Ohjelma MAX7219:n ohjaamiseen NodeMCU:ssa

Yritetään ajaa hiipivää linjaa matriiseilla ilman kykyä muodostaa etäyhteyttä NodeMCU:hun toistaiseksi. Eli hiipivä viiva pyörittää staattista tekstiä. Pohjimmiltaan tämä on koodi lähteestä . Ainoa asia, joka on muuttunut, on ketjun koko. Tässä emme käytä kuutta matriisia, vaan vain neljää. #sisältää #sisältää #sisältää Max72xxPanel-matriisi = Max72xxPanel(D8, 4, 1); allekirjoittamaton pitkä ticker_next; String tape = "Hei RobotClassilta!"; int spacer = 1; int leveys = 5 + välikappale; void setup(void)( matrix.setIntensity(7); ) void handleTicker())( for (int i = 0 ; i< width * tape.length() + matrix.width() - 1 - spacer; i++) { matrix.fillScreen(LOW); int letter = i / width; int x = (matrix.width() - 1) - i % width; int y = (matrix.height() - 8) / 2; while (x + width - spacer >= 0 && kirjain >= 0) ( if (kirjain< tape.length()) { matrix.drawChar(x, y, tape, HIGH, LOW, 1); } letter--; x -= width; } matrix.write(); delay(50); } } void loop(void){ handleTicker(); } Подаем питание и на матрице начинает двигаться бегущая строка с текстом «Hello from RobotClass!»

3. Web-palvelin NodeMCU:ssa LED-matriisin ohjaamiseksi

Lisätään nyt ohjelmaan web-palvelin, joka näyttää yhden HTML-sivun, jossa on kenttä hiipivän tekstin syöttämistä varten ja painike. #sisältää #sisältää #sisältää #sisältää #sisältää #sisältää const char* ssid = "ESP"; //aloita WiFi-piste ESP ESP8266WebServer server(80); // käynnistä palvelin portista 80 Max72xxPanel matriisi = Max72xxPanel(D8, 4, 1); allekirjoittamaton pitkä ticker_next; String tape = "RobotClass"; int spacer = 1; int leveys = 5 + välikappale; // HTML-sivu index.html const char page = " " "Tickerin ohjaus" "" "
" "" "" "
" "" ""; // funktiota kutsutaan, kun asiakas painaa painiketta void handleSubmit())( tape = server.arg("text"); server.send(200, "text/html", sivu); ) void handleRoot( ) ( if ( server.hasArg("teksti")) ( handleSubmit(); ) else ( server.send(200, "text/html", sivu); ) ) void setup(void)( delay(1000); WiFi .softAP(ssid ); server.on("/", handleRoot); server.begin(); matrix.setIntensity(7); ) void handleTicker())( for (int i = 0 ; i< width * tape.length() + matrix.width() - 1 - spacer; i++) { matrix.fillScreen(LOW); int letter = i / width; int x = (matrix.width() - 1) - i % width; int y = (matrix.height() - 8) / 2; // центровка по вертикали while (x + width - spacer >= 0 && kirjain >= 0) ( if (kirjain< tape.length()) { matrix.drawChar(x, y, tape, HIGH, LOW, 1); server.handleClient(); } letter--; x -= width; } matrix.write(); delay(50); } } void loop(void){ server.handleClient(); handleTicker(); } Загружаем программу на Node MCU и подаем питание. По-умолчанию, бегущая строка будет крутить текст «RobotClass». Чтобы его изменить, необходимо подключиться к WiFi точке «ESP» и зайти через браузер по адресу: http://127.0.0.1/ В ответ появится страница с полем для ввода текста бегущей строки и кнопкой «Set text». Вводим в поле новый текст, жмем кнопку и смотрим на бегущую строку! Your browser does not support the video tag.

4. Ticker venäjäksi

Laitteemme ei nykyisessä muodossaan tue venäjän kieltä. Jos yrität kirjoittaa tekstiä venäjäksi, matriisiin ilmestyvät utf8-koodit kirjainten sijasta. Tämän korjaamiseksi tarvitsemme lisätoiminnon utf2rus. Lisäksi lisäämme ohjelmaan salasanan WiFi-pisteelle. #sisältää #sisältää #sisältää #sisältää #sisältää #sisältää const char* ssid = "ESP"; const char* pwd = "makemyday"; // WiFi-pisteen salasana ESP8266WebServer server(80); Max72xxPanel-matriisi = Max72xxPanel(D8, 4, 1); allekirjoittamaton pitkä ticker_next; String tape = "RobotClass.ru"; int spacer = 1; int leveys = 5 + välikappale; const char page = " " "" "" "Tickerin ohjaus" "" "
" "" "" "
" "" ""; Merkkijono utf8rus(merkkijonon lähde)( int i,k; Merkkijonon kohde; etumerkitön merkki n; char m = ( "0", "\0" ); k = lähde.pituus(); i = 0; while (i< k) { n = source[i]; i++; if (n >= 0xC0) ( kytkin (n) ( tapaus 0xD0: ( n = lähde[i]; i++; if (n == 0x81) ( n = 0xA8; tauko; ) if (n >= 0x90 && n<= 0xBF) n = n + 0x2F; break; } case 0xD1: { n = source[i]; i++; if (n == 0x91) { n = 0xB7; break; } if (n >= 0x80 && n<= 0x8F) n = n + 0x6F; break; } } } // switch m = n; target = target + String(m); } return target; } void handleSubmit(){ tape = utf8rus(server.arg("text")); server.send(200, "text/html", page); } void handleRoot() { if (server.hasArg("text")) { handleSubmit(); } else { server..softAP(ssid, pwd); server.on("/", handleRoot); server.begin(); matrix.setIntensity(7); } void handleTicker(){ for (int i = 0 ; i < width * tape.length() + matrix.width() - 1 - spacer; i++) { matrix.fillScreen(LOW); int letter = i / width; int x = (matrix.width() - 1) - i % width; int y = (matrix.height() - 8) / 2; while (x + width - spacer >= 0 && kirjain >= 0) ( if (kirjain< tape.length()) { matrix.drawChar(x, y, tape, HIGH, LOW, 1); server.handleClient(); } letter--; x -= width; } matrix.write(); delay(50); } } void loop(void){ server.handleClient(); handleTicker(); } Готово! Теперь устройство готово к непрерывной эксплуатации. Осталось сделать крепление для матрицы и поставить бегущую строку на видное место. Чертежи подходящего крепления можно найти тут:

Aiempien viestien perusteella ja joidenkin teknisten tietojen lukemisen jälkeen heräsi todennäköisesti kysymys - mikä on tämä toinen mystinen MCU-prosessori, joka toimii 100 MHz:llä? Miksi sitä tarvitaan? Kuinka käyttää sitä?
Samaan aikaan MCU:n rooli on joissakin tapauksissa erittäin tärkeä. Ne, jotka ovat yrittäneet käyttää Edisonia työskennelläkseen erilaisten antureiden kanssa, ovat ehkä jo huomanneet, että Intel Edison ei anna reaaliaikaista vastausta heidän lukemiinsa työskennellessään Linuxilla. Ja tässä MCU tulee apuun. On aika puhua hieman tästä sulautetusta mikro-ohjaimesta, sen arkkitehtuurista, sovelluksista ja harkita käytännön esimerkkiä.

Versiosta 2.1 alkaen Intel Edisonin ohjelmisto on lisännyt mahdollisuuden käyttää sisäänrakennettua mikro-ohjainta.

Harkitse järjestelmää Intel Edison Compute Modulessa käytetyllä sirulla:

Intel Edison Compute Modulessa käytetty järjestelmä-siru sisältää kaksi prosessoria:

  1. Kaksiytiminen Intel Atom -prosessori, joka toimii 500 MHz:llä. Nimetty isäntäprosessoriksi.
  2. Mikro-ohjain Minute IA -arkkitehtuurilla, toimii 100 MHz:llä. Merkitty MCU:ksi.
Katsotaanpa tarkemmin mikro-ohjainta. Minute IA -laskentaydin on 486:een perustuva virtaa säästävä arkkitehtuuri, johon on lisätty ohjeita Pentium-yhteensopivuutta varten. Laskentaytimen lisäksi mikro-ohjain sisältää tulo/lähtö-alijärjestelmän (GPIO, I2C, High Speed ​​​​UART, DMA) ja SRAM-muistin. Mikro-ohjaimella on pääsy kaikkiin Edison Compute Module -moduulin GPIO-portteihin. SRAM-muistin kokonaismäärä koodille ja datalle on 192 kt. Mikro-ohjain käyttää Viper OS:n reaaliaikaista käyttöjärjestelmää WindRiveristä.

Mikro-ohjainsovellus toimii Viper-ytimen päällä ja ohjaa MCU:hun kytkettyjä oheislaitteita Intel Atom -prosessorista riippumatta. Se voi esimerkiksi ohjata GPIO-portteja, olla vuorovaikutuksessa antureiden kanssa I2C- tai UART-protokollan kautta ja kommunikoida Intel Atom -prosessorin kanssa.

Miksi Intel Edisonissa tarvitaan mikro-ohjain?

Haluaisin korostaa kahta aluetta, joilla voidaan käyttää sulautettua mikro-ohjainta:
  1. Työskentely I/O-porttien ja liitäntöjen kanssa reaaliaikaisesti.
  2. Energiatehokkuus.
Intel Atom -prosessori ja tavallinen Yocto Linux -jakelu eivät salli reaaliaikaisten sovellusten toteuttamista heti valmiina. Tehtävien ajoitus voi ennaltaehkäistä sovelluksen, mikä johtaa kelpaamattomaan ja arvaamattomaan viiveeseen. Mikro-ohjain käyttää yhtä sovellusta ja reaaliaikaista käyttöjärjestelmää, joten on mahdollista tarjota reaaliaikainen vastaus. Tätä vaaditaan monissa antureissa, joissa tiedonsiirtoprotokolla riippuu tiukasta lyhyiden aikaväleiden noudattamisesta. Jos haluat liittää ne ilman sisäänrakennettua mikro-ohjainta, sinun on käytettävä erillistä mikro-ohjainta, johon kaikki toiminnot voidaan toteuttaa tällaisten antureiden kanssa työskentelemiseen. Esimerkki ratkaisusta Intel Edisonille ulkoisella mikro-ohjaimella on SparkFun Block for Intel Edison - Arduino-laajennuslevy.

Voit lisätä energiatehokkuutta mikro-ohjaimella sovelluksissa, joissa pääprosessori saattaa olla lepotilassa ja mikro-ohjain odottaa tiettyä tapahtumaa (esimerkiksi anturin kynnysarvojen ylittämistä).
Tarvittaessa mikro-ohjain herättää pääprosessorin. Esimerkki toteutuksesta on artikkelissa MCU SDK:n ja API:n käyttö: Koodiesimerkkejä.

Esimerkkinä Intel Edison -mikrokontrollerin kanssa työskentelystä voidaan harkita HC-SR04-ultraäänietäisyysanturin kytkemistä. Näytämme mitatun etäisyyden Grove LCD RGB Backlight -merkkinäytössä.



Anturissa on 4 lähtöä:
  • Vcc-5V.
  • Trig- Liipaisusignaali anturille. Mikro-ohjain antaa 10 mikrosekunnin pulssin anturille. Anturi käynnistää mittausprosessin.
  • Kaiku- Kaikusignaali anturista mikrokontrolleriin. Pulssin kesto on verrannollinen mitattuun etäisyyteen.
  • Gnd- Maa.
Tältä anturin kanssa työskentelyprosessi näyttää oskilloskoopin näytöllä:

  • 1 kanava- Trig
  • Kanava 2- Kaiku
Mikro-ohjain lähettää pulssin Trig. Tämän jälkeen anturi reagoi impulssilla Kaiku.
Pulssin kesto on verrannollinen mitattuun etäisyyteen.
Mitattu etäisyys lasketaan kaavalla (otettu anturin spesifikaatiosta):
etäisyys (cm) = Kaikupulssin kesto (mikrosekuntia) / 58
Erittelyn mukaan anturi voi mitata etäisyyksiä 2 - 400 cm.
Pulssin keston mittaaminen ennustetulla virheellä ilman reaaliaikaa on ongelmallista.
Mittausprosessi voi esim. ennaltaehkäistä ajoittajan toimesta ja mittaustulos on virheellinen.

HC-SR04:n liittäminen Intel Edisonin mikro-ohjaimeen


Käytetyt komponentit:

  • Edisonin laskentamoduuli
  • Edison Arduino Board
  • Grove Basic Shield
  • Character Screen Grove LCD RGB taustavalo
  • Ultraäänietäisyysanturi HC-SR04
  • Leipälauta
Ensinnäkin yhdistämme Edison Compute Module -moduulin Edison Arduino -levyyn. Sitten yhdistämme Grove Basic Shield -laajennuslevyn Edison Arduino Boardiin. Grove LCD RGB -taustavalo liitetään Grove Basic Shieldin I2C-otsakkeeseen.

Ultraääniläheisyysanturi HC-SR04 liitetään Grove Basic Shieldiin seuraavasti:

  • Vcc+5V asti.
  • Trig kiinnittää #3.
  • Kaiku kiinnittää #4.
  • Gnd Gnd:lle.
Pinssit 3, 4 valitaan satunnaisesti, muita voidaan käyttää niiden sijasta.

Intel Edisonin laiteohjelmistopäivitys

Mikro-ohjaintuki on saatavilla Intel Edison® Board Firmware Software Release -ohjelmistoversiossa 2.1 ja uudemmissa. Jos laiteohjelmistosi on vanhempi, se on päivitettävä.

Voit selvittää nykyisen laiteohjelmistoversion komennolla:
# configure_edison --versio
Tämä esimerkki luotiin laiteohjelmiston versiossa 146.

Laiteohjelmiston päivitysprosessi on kuvattu yksityiskohtaisesti artikkelissa Flashing Intel Edison. Henkilökohtaisesti käytän yleensä osiossa kuvattua menetelmää Vaihtoehtoinen vilkkutapa.
Lue ohjeet huolellisesti ennen laiteohjelmiston asentamista.

Intel Edisonin yhdistäminen Ethernet-over-USB:n kautta

Jotta voit työskennellä Edisonin kanssa MCU SDK -ympäristöstä, sinun on luotava verkkoyhteys.
Tätä varten sinun on esimerkiksi kytkettävä USB-kaapeli keskimmäiseen mikro-USB-porttiin (kytkimen tulee olla mikro-USB-portteja päin).
Linuxissa verkko on määritetty komennolla:
# ifconfig usb0 192.168.2.2
Intel Edison IP-osoite: 192.168.2.15
Liitäntäprosessi on kuvattu yksityiskohtaisemmin artikkelissa Yhdistäminen Intel® Edison -korttiin Ethernetin kautta USB:n kautta.

MCU SDK

Sulautetun mikro-ohjaimen kanssa toimivien sovellusten luomiseksi on julkaistu Eclipseen perustuva monialustojen kehitysympäristö, MCU SDK. Asennusprosessia käsitellään yksityiskohtaisesti artikkelissa MCU SDK:n asentaminen.
MCU SDK:n avulla voit luoda, kääntää, ladata ja korjata mikro-ohjainsovelluksia.

Vuorovaikutus MCU:n kanssa

Jotta voit olla vuorovaikutuksessa Linuxin mikro-ohjaimen kanssa, käytettävissä on useita käyttöliittymiä:
/dev/ttymcu0 - Kanava tiedonvaihtoa varten. Linuxissa voit työskennellä tavallisilla tiedostotoiminnoilla. Mikrokontrollerin ohjelmasta vaihto suoritetaan käyttämällä host_send- ja host_receive-funktioita.
/dev/ttymcu1 - Kanava, jonka kautta mikro-ohjain lähettää virheenkorjausviestejä debug_print-funktiolla.
/sys/devices/platform/intel_mcu/log_level - Voit määrittää virheenkorjausviestien tason (kuolema, virhe, varoitus, tiedot, virheenkorjaus).

Ohjelma Linuxille

Pieni Python-skripti, joka vastaanottaa tietoja sisäänrakennetusta mikro-ohjaimesta ja näyttää sen merkkinäytöllä. Käytämme merkkinäytön kanssa työskentelemiseen UPM-kirjaston Jhd1313m1-moduulia.

show_distance.py-skripti:

tuontiaika tuonti pyupm_i2clcd RET_ERROR = -1 if __name__ == "__main__": lcd = pyupm_i2clcd.Jhd1313m1(6, 0x3E, 0x62) with open("/dev/ttymcu0", "w while True") muodossa: f:+t f.write("get_distance\n") # Lähetä komento MCU:lle f.flush() line = f.readline() # Lue vastaus MCU:lta, -1 = VIRHE arvo = int(line.strip("\n\r \t ")) lcd.clear() jos arvo == RET_ERROR: lcd.setColor(255, 0, 0) # PUNAINEN lcd.write("VIRHE") else: lcd.setColor(0, 255, 0) # VIHREÄ lcd.write("%d cm" % (arvo,)) time.sleep(1)

Ohjelma mikro-ohjaimelle

Mikro-ohjaimen ohjelman on vastaanotettuaan get_distance komennon isännältä mitattava etäisyys ja lähetettävä tulos isännälle (etäisyys senttimetreinä tai virheen sattuessa -1).
Porttien asettaminen Edison Arduino Boardiin:
./init_DIG.sh -o 3 -d lähtö ./init_DIG.sh -o 4 -d -tulo
Haluan muistuttaa, että mikro-ohjain toimii Edison Compute Module -moduulin GPIO-porttien kanssa, jotka eroavat Edison Arduino Boardin numeroinnista. Vastaavuustaulukko on esimerkiksi artikkelin lopussa LEDin vilkkuminen MCU:n avulla.

Ohjelma mikro-ohjaimelle MCU SDK:ssa:

#include "mcu_api.h" #include "mcu_errno.h" // Arduino Extension PIN = 3 #define TRIG 12 // Arduino Extension PIN = 4 #define ECHO 129 // HC-SR04-tietolomakkeesta #define MIN_DISTANCE MAX_D #define MIN_DISTANCE MAX_D #define 400 #define MAX_WAIT 10000 #define RET_ERROR -1 int get_distance() ( // Lähetä trig-signaali HC-SR04:lle gpio_write(TRIG, 1); mcu_delay(10); gpio_write(TRIG, 0); // Lue kaikusignaali osoitteesta -SR04 int i; i = 0; while ((gpio_read(ECHO) == 0) && (i< MAX_WAIT)) { mcu_delay(1); i++; } unsigned long t0 = time_us(); if (gpio_read(ECHO) == 0 || i == MAX_WAIT) { return RET_ERROR; } i = 0; while ((gpio_read(ECHO) == 1) && (i < MAX_WAIT)) { mcu_delay(1); i++; } unsigned long t1 = time_us(); if (gpio_read(ECHO) == 1 || i == MAX_WAIT) { return RET_ERROR; } unsigned long distance = (t1 - t0) / 58; if (MIN_DISTANCE < distance && distance < MAX_DISTANCE) { return distance; } else { return RET_ERROR; } } #define MAX_BUF 255 unsigned char buf; void mcu_main() { // Setup Trig as OUTPUT gpio_setup(TRIG, 1); // Initially set Trig to LOW gpio_write(TRIG, 0); // Setup Echo as INPUT gpio_setup(ECHO, 0); while (1) { unsigned int len; len = host_receive(buf, MAX_BUF); if ((len >= 12) && (strncmp(buf, "get_distance", 12) == 0)) ( etumerkitön int etäisyys; etäisyys = get_distance(); len = mcu_snprintf(buf, MAX_BUF, "%d\n", etäisyys); host_send (buf, len); ) ) )