Soros hívás és válasz (kézfogás)

Több változó küldése hívás és válasz (kézfogás) módszerrel.


Utolsó felülvizsgálat: 2022.02.04 16:50


Ez a példa több bájtos kommunikációt mutat be az Arduino kártyáról a számítógépre hívás és válasz (kézfogás) módszerrel.

Ez a vázlat indításkor ASCII A-t küld (65 értékű bájt), és ezt addig ismétli, amíg soros választ nem kap a számítógéptől. Ezután három szenzorértéket küld egyetlen bájtként, és vár egy újabb választ a számítógéptől.

Használhatja az Arduino Software (IDE) soros monitort az elküldött adatok megtekintéséhez, vagy kiolvasható a Processing (lásd a kódot lent), a Flash, PD, Max/MSP (lásd lenti példa) stb. segítségével.

Hardver szükséglet

  • Arduino kártya

  • 2 analóg érzékelő (potenciométer, fotocella, FSR stb.)

  • nyomógomb

  • 3 10 kohm-os ellenállás

  • összekötő vezetékek

  • dugdosós próbapanel (breadboard)

Szoftver szükséglet

Az áramkör

Csatlakoztassa az analóg érzékelőket a 0 és 1 analóg bemeneti kivezetésekhez 10 kohmos ellenállásokkal, amelyeket feszültségosztóként használnak. Csatlakoztasson egy nyomógombot vagy kapcsolót a 2. digitális I/O kivezetéshez egy 10 kohmos ellenállással a földre való hivatkozásként.

Vázlat

A kód

/*
  Serial Call and Response
  Nyelv: Wiring/Arduino

  Ez a program indításkor küld egy ASCII A-t (65-ös bájt), és ezt addig ismétli,
  amíg nem kap néhány adatot. Ezután vár egy bájtot a soros porton, és három
  érzékelőértéket küld, amikor egy bájtot kap.

  Az áramkör:
  - a 0 és 1 analóg bemenetekhez csatlakoztatott potenciométerek
  - nyomógomb a digitális I/O 2-höz

  created 26 Sep 2005
  by Tom Igoe
  modified 24 Apr 2012
  by Tom Igoe and Scott Fitzgerald
  Thanks to Greg Shakar and Scott Fitzgerald for the improvements

  Ez a kód nyilvános.

  https://docs.arduino.cc/built-in-examples/communication/SerialCallResponse
*/

int firstSensor = 0;    // az első analóg érzékelő
int secondSensor = 0;   // a második analóg érzékelő
int thirdSensor = 0;    // digitális érzékelő
int inByte = 0;         // a bejövő soros byte

void setup() {
  // soros port indítása 9600 bps-el:
  Serial.begin(9600);
  while (!Serial) {
    ; // várja meg a soros port csatlakozását. Csak a natív USB-porthoz szükséges
  }

  pinMode(2, INPUT);   // a digitális érzékelő a 2-es digitális kivezetésen van
  establishContact();  // küldjön egy bájtot a kapcsolatfelvételhez, amíg a vevő nem válaszol
}

void loop() {
  // ha érvényes bájtot kapunk, olvassuk el az analóg bemeneteket:
  if (Serial.available() > 0) {
    // bejövő bájt beszerzése:
    inByte = Serial.read();
    // olvassa be az első analóg bemenetet, ossza el 4-gyel, hogy a tartomány 0-255 legyen:
    firstSensor = analogRead(A0) / 4;
    // késleltesse 10 ms-ot az ADC helyreállításához:
    delay(10);
    // olvassa be a második analóg bemenetet, ossza el 4-gyel, hogy a tartomány 0-255 legyen:
    secondSensor = analogRead(1) / 4;
    // olvassa a kapcsolót, leképezheti 0 - 255L-re
    thirdSensor = map(digitalRead(2), 0, 1, 0, 255);
    // érzékelő értékek küldése:
    Serial.write(firstSensor);
    Serial.write(secondSensor);
    Serial.write(thirdSensor);
  }
}

void establishContact() {
  while (Serial.available() <= 0) {
    Serial.print('A');   // nagy A küldése
    delay(300);
  }
}

/* Processing vázlat a példával való futtatáshoz:

  // Ez a kód nyilvános.

  import processing.serial.*;

  int bgcolor;           // Háttér szín
  int fgcolor;           // Kitöltőszín
  Serial myPort;                       // A soros port
  int[] serialInArray = new int[3];    // Hová tesszük, amit kapunk
  int serialCount = 0;                 // Számlálás, hogy hány bájtot kapunk
  int xpos, ypos;                      // A labda kiinduló helyzete
  boolean firstContact = false;        // Függetlenül attól, hogy hallottunk-e a mikrokontrollerről

  void setup() {
    size(256, 256);  // Színpad mérete
    noStroke();      // Nincs határa a következő dolognak

    // Állítsa be a labda kiindulási helyzetét (a színpad közepén)
    xpos = width / 2;
    ypos = height / 2;

    // Nyomtassa ki a soros portok listáját hibakeresés céljából
    // ha a Processing 2.1 vagy újabb verzióját használja, használja a Serial.printArray()-t
    println(Serial.list());

    // Tudom, hogy a Mac gépen a soros lista első portja mindig az FTDI
    // adapterem, ezért a Serial.list()[0]-al nyitom meg.
    // Windows rendszerű gépeken ez általában a COM1-et nyitja meg.
    // Nyissa meg azt a portot, amelyet éppen használ.
    String portName = Serial.list()[0];
    myPort = new Serial(this, portName, 9600);
  }

  void draw() {
    background(bgcolor);
    fill(fgcolor);
    // Rajzolja meg az alakzatot
    ellipse(xpos, ypos, 20, 20);
  }

  void serialEvent(Serial myPort) {
    // olvass be egy bájtot a soros portról:
    int inByte = myPort.read();
    // Ha ez az első kapott bájt, és ez egy A, törölje a soros puffert, és vegye
    // figyelembe, hogy először kapcsolatba lépett a mikrokontrollerrel.
    // Ellenkező esetben adja hozzá a bejövő bájtot a tömbhöz:
    if (firstContact == false) {
      if (inByte == 'A') {
        myPort.clear();          // törölje a soros port pufferét
        firstContact = true;     // először lépett kapcsolatba a mikrokontrollerrel
        myPort.write('A');       // kérdezd tovább
      }
    }
    else {
      // Adja hozzá a soros port legújabb bájtját a tömbhöz:
      serialInArray[serialCount] = inByte;
      serialCount++;

      // If we have 3 bytes:
      if (serialCount > 2 ) {
        xpos = serialInArray[0];
        ypos = serialInArray[1];
        fgcolor = serialInArray[2];

        // nyomtassa ki az értékeket (csak hibakeresés céljából):
        println(xpos + "\t" + ypos + "\t" + fgcolor);

        // Írjon nagy A-t, ha új érzékelőt szeretne leolvasni:
        myPort.write('A');
        // serialCount alaphelyzetbe állítása:
        serialCount = 0;
      }
    }
  }

*/

/* Max/MSP version 5 patch a példával való futtatáshoz:

  ----------begin_max5_patcher----------
  3908.3oc6ckziiaiE9b0+J3XjCIXpp.WzZNMURv.jCInQ5fYNjNngrDssRKK
  4nkp6JA4+973hrkrsjncKu0SRiXasQ83G+dKj7QV+4qtaxzrOxKlf9Zzuft6
  t+7U2cm7ThSbm936lrL3igIAExaaRJ+CYS+sI2qtTI+ikxSuBMKNojm+N3D4
  Aua5KkPwpuoUAkgKhSm+tbdXo5cQXVOhuGwrohuHD4WT7iXzupen3HY4BuqG
  rH0kzrrzxzfkb4kdJONHo9JoUKiSS3kRgjt4jYUk0mkznPJh+CYgHewpSqty
  xWVwUh3jIqkEYEfmqQEMr.ETbB+YddQbVZix+tIAqV03z203QDX4ukIKHm6W
  ep3T0ovqOUN+435m2Rcx+5U0E+FTzVBh9xOsHXIh5YuADg1x4IYgumG0r3mj
  shmFmtJmWvSKCJ0um0WNhOKnJo7c6GmZe8YAg7Ne381Rc2j44wQYoBgn0SJN
  c8qCHH1RhQqJi7NRCVsmGt.pGUESCxE31zDdCV.PRyxRZeo0MU.WOHMdYPIu
  LVIrT75BMd4p73zxVuHdZ.TFKJByyRRZUTpq77dtRDzZFx+PbT4BYY0DJgaO
  dUcSvj0XTT7bdQY6yUFLun8YZo71jl0TIt042RYNLa4RfCTWfsznKWDWfJpl
  tJHrbgV6t.AZInfzWP.4INpJHA8za91u+6QN1nk7hh.PpQwonxEbTAWzpilV
  MimilkmsDtPbo3TPiUdY0pGa9ZShS4gYUJz1pwE1iwCpxbAgJI9DGGwWNzFT
  ksLf3z7M0MybG6Hj1WngsD7VEXS8j5q7Wu5U0+39ir8QJJS5GMHdtRimL4m1
  0e1EVX0YsE2YssINriYRoFRyWVMoRRUGQvnkmms3pnXDYHbBKMPpIOL5i1s8
  3rMPwFcRCsGRyPH780.8HBnpWz.vlEQBWJ+0CSunehJSmJxiIZRtNGhhDYrU
  jt3ZQyA2fHJhZDifXIQHUHH8oGYgOREI5nqHIzhFWUndPyBdB3VzHJGwUhkV
  rgvRl2UCVNMHcd234lf1DN16HFEIdHt99A5hrp7v5WWMSBQZgMP.Tkwoqig8
  W1.Sn1f3h3nn1wLpBypPDzlJ7XinEGkLiMPloWOhrgR7dpZWJQV1faDy35Qj
  MThMFkWFGsJChQPqrQp8iorV6Q28HBVF4nMVDJj7f1xyYACFScisg.ruLHOW
  uMUS4Am4pI4PTnHi.6bi02HNzSYnDBe4cgAgKzRk1jc8PJLoH3Ydz6.Q.7K8
  tfxx73oUkJq1MGuCy5TpAi.POWZ3AenidLOOIaZPhdjZVW3sdk6LXEGzHb7p
  Mfr7SEy3SXHyBSxJ3J2ncNNYVJsXG6Me10nj4cfCRFdTFjLo7q3SiCpjjEDM
  .nvra.GN39.E2CDTHWXPo8.xzfqrHCHKnf5QUYUVdoZPUjCSC7LU8.XtTUXl
  X8vr51GjwFGLC2AlMdLkU4RiaRrnmJuiudnDk0ZW+9p6TuKBe433JUCzp6fU
  iOF0SUk2UQYUPNTEkiZubvKa1tsmgL5SCTXGHnnG0CceLpkpR9Rs28IUESWl
  EwWNKfHlg.zj6Ee7S+nE8A+m9F7Cu40u9gMm+aRp3kYYkKd3GDOz5y+c7b96
  K9gfvuIK68uNO6g2vUUL80WxihCVFD9vlB30e2SOrmxUb527RZ3nZNrljGrR
  70vs1J9suWuZ3zaHVdG3RIJLgGj2Gfn6TcGcstEfvtH.hpFLlnBndjOLGQAI
  z98BXc6yQxghmOn6gZqj0ShPOXhynLOjzCESt+XwE8TxrCvrdXo16rqnLgvb
  HaFmbh29QD+K0DyNdjDwvzQL.NXpoMvoOBxkger0HwMRQbpbCh91fjjG9Idw
  prTH9SzaSea5a.GQEPnnh43WNefMlsOgx18n.vgUNO.tKl7tDyI3iHzafJHZ
  VVNedVEbGgYIY42i93prB0i7B7KT1LnnCiyAiinpBnsPV7OG.tYKfBsrJOkG
  UG5aq26iJw6GyJ4eM5mEgEKaNQPMEBUp.t8.krplOVTlZdJAW27bjvGK7p2p
  HQPgLOSJDYv4E9gQBYBjMUselRxDy+4WplIzm9JQAWOEmfb.E364B43CAwp5
  uRRDEv8hWXprjADMUOYpOg9.bVQpEfhKgGCnAnk.rghBJCdTVICA3sDvAhE5
  oU4hf67ea5zWPuILqrD8uiK+i477fjHIt9y.V88yy3uMsZUj7wnxGKNAdPx5
  fAZMErDZOcJU4M01WFQokix.pKa+JE1WacmnKFeYd7b.0PeIzB8Kk+5WIZpB
  Ejt34KJeHgOCh4HK8Y3QiAkAfs8TRhhOkG7AAGQf0qxyfmQxa+PLb8Ex.2PS
  4BdO5GB9Hvg+cfJCMofAIMu9Qz+UPCjckqVJlEmyA8Bf.rC6.3hAEuG8TdTU
  bZljQ0nr1ayIqmTwQYfyRGafZhur5vfuyMSqYNWmtAPwWHalDSuUgT0Bosh.
  JpAR89Y6Ez5QEfPTQO4J0DHLInIliz8BZV2JfV3Bd36qsQwAVVXbr1BGXp6s
  Sd5sSDruo74wofx.HxUgxQwTnMLqTXvRmiGh2PUZr5pBynKChjl6feNUjSRn
  hEUfRPT1GfG9Ik4TQBm.hEZZ.bc38HjAMKGzDRijEm1ifx1dbgzQyKh6FZc3
  wOCkRJH+KUh0daWs6wzltWx1puXxlWW6NZWY2JiTBzzILRIANku02NourySM
  VI1VJTvQZff32AJr+dS9e34QAoA6EGXlGFH9yk7yyQAlVd3SR94g+TxOu1sU
  Flgd6ICI96LzazyPu1cgqsZ8r74SgF.65+efbMf4pGHT7lgHh30Sha3N5Ia.
  oqjMf7nsuMwycf7iYDybiAAVr3eC.oTMjpzEr8GDRc9bFRGHYXDrzg.Tlx+q
  NW8TY1IkzCfZ2IftkQstbB08HUezoDS+oFyI.cWIhWBaDiUo7qIrDO7f.L6n
  AXqCmyNT9act.z+Iv.GR0uES0ZXfjdz.IczAxQOUR+zvRsUTigRxmyPYeNlj
  yXv8Peef2ZFzuLzWPPeAE8ELzWXYlhe8WzAcUg+b1UkIoCLzIH60zwASGXau
  a1Dq2nUY.sox4vng+m0nACePngC9lEMLZMBPodOxf+yx5d4uMCTHm3kJvIIG
  jcLMedEQldkjpoBkQyjY1Hk.hmSY95Iwos8NDb9VSlIWOIntqgxryUjL6bCJ
  y1lli5tWWxrQ7YmqGYlc6shK1iY2dr0wtNjYxgHyzaq0OznY235awCr8zSz6
  EGd1QNUKf.74dADTBbTbeotjpW95IolY0WpKYONY8M83Rx2MChx3fL+iG5Mm
  tXpdmvXj8uTvaAL1WjbbarQD4Z6kXBpnm6a69oKV2PY9WY174IbC3CaRQ9iK
  Q4sYGQpwdtZ5wFrc7n569.M83OOR5ydSB1ZcAWCxdbKuavz9LILxfD.wWO.W
  Nq+Zu4Es+AP6s5p9jDWH8ET+c85+XbW0.N1nDCTD7U4DGc6ohnU019fS7kQ0
  o43luuOGjv5agHp0DT.CysOfgLR3xXlXTUKm16RivRsn3z0O6cl3YScAvtrb
  hwekGB7BZuqESUzBJWmCvK7t9HF8Ts6cUAPoFWso3aP8ApWyJ3wqOPo2pJDC
  BQ0NI0Pj8QCQ2r1L5vKaU5lDRYX7yRur1UYYZmJQ9iDHwN9dndB5n5ejflmm
  UsBwLHnDkKXWRuAkb3NeuzqRstiQGP.fCQFdHNzaE.8u58Nz9svFE9SGIE1X
  kv9Iwfl1BdNWjA7xcThsWCS847loyFD8pZq2E2F04lYULzBTDYhrFSDDJdjo
  fisN2NUN26e4xRu51zD5ZseJ4HC63WyIX6jRqsp0jangBnK.Qlo58PCpWevt
  ahzqK7fbKsdX6R64aao8LmWhBPh9jKVAPMzb5a2cV6opdWHneMmqMEmAGsPh
  ieigIjV+4gF1GgbMNXg+NH44YaRYyd..S1ThHzKhFwwGRaWVITqyj9FvPqMT
  d0pDuSqDrOGF.Uogf.juCFi9WAUkYR+rFPanDcPG8SbrtjyG03ZQ8m3AqC5H
  NcUUoXSwVrqXKVcZu.5ZnkwIfIVdXVZTwAuTTUiYuxwjZDK6ZgnRtYV8tJmP
  hEcuXgz2Goxyaiw35UkaWbpqtfzD02oUkkYqi.YQbZqIIWrIljFolsdmMKFR
  wCJ2+DTn.9QlkOld+d9Qy9IJdpLfy05Ik2b8GsG9h8rdm1ZFx1FrmmlA2snw
  qI9Mcdi2nr6q3Gc87nLawurbw1dda+tMyGJ9HaQmlkGwy6davisMgrkM65oz
  eulfYCzG46am8tSDK144xV4cEvVMTRXq9CIX8+ALNWb6sttKNkiZetnbz+lx
  cQnb1Nds2C0tvLNe14hwQtxYbxhqc17qHfamUcZZ3NYSWqjJuiDoizZ+ud2j
  naRK4k3346IIVdR1kKiQjM39adMamvc6n+Xp36Yf3SIGh3uKbquqs1JksTII
  kuJ7RrZSFb2Cn9j5a6DT8cMo0iczU+lsYaU8YNVh5k5uzJLU26ZcfuJE6XLY
  0mcRp9NTCp+L+Ap+in7Xf3b9jFQBLtIY06PbrGhcrU6N00Qlaf9N0+QPo9nS
  P6qsI7aYNLSNOHpsAxis0ggnZLjYqyyFkdSqinVsPaqSDZaYBZ6c93uLCjGm
  iCroJVLzU45iNE.pIUfs3TWb.0FejHp9uANr0GcJPTroFDNOHpkIweLnI1QT
  dHl3P7LhOF3Ahd9rnvLwAMy5JSdNezGlsIsW9mW44r26js+alhxjlkdhN0YE
  YqiH5MTeWo6D4Qm.ieLS7OynmuVGSbmbFUlnWWhiQlhOeN+Yl35bq.tGo9JR
  cj8AVqdz7nSgVB9zNj.FTOU68o5d9KO5TUOGxVMw+jTO8T6wqD0hEiHsOJO5
  TTOMoS.zlqN0SpZjz6GcH05ylVM0jwuidlkmAif374ih5M5QPfccr8Hqifff
  otN8pt3hUcaWu8nosBhwmD0Epw5KmoF.poxy4YHbnjqfPJqcM3Y2vun7nS.i
  f3eETiqcRX2LR.4QmhZrkoCSGwzZrqKHrVR8caari+55d2caPqmq5n.ywe8Q
  WrZL9fpwVXeaogMByE6y1SMdjk+gbavbN7fYvVtt1C2XwHJSzpk+tidUO25H
  UB9onw9mlFQ10fhpZBaDatcMTTEGcJpwzqg92qqiVtM6Cu0IRQ0ndEdfCAqV
  l0qYAUmPrctbxO4XCuPMa1asYzKDks1D52ZCne6Mednz9qW8+.vfqkDA
  -----------end_max5_patcher-----------

*/

A Processing kód

Másolja ki a Processing vázlatot a fenti kódmintából. Ahogy megváltoztatja az analóg érzékelő értékét, egy ehhez hasonló golyót fog látni a képernyőn. A labda csak akkor jelenik meg, ha megnyomja a gombot:

A Max kód

A max patch így néz ki. A patch szövege a fenti kódban található. Másolja ki és illessze be egy "New patcher" ablakba a vázlat megtekintéséhez.

Tudj meg többet

További alapvető oktatóanyagokat a beépített példák részben talál.

Felfedezheti a nyelvi referenciát is, az Arduino programozási nyelv részletes gyűjteményét.