Arduino:Примеры/Graph

Материал из Онлайн справочника
Перейти к навигации Перейти к поиску

Перевод: Максим Кузьмин (Cubewriter) Перевел 364226 статей для сайта.</br>Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


График[1]

Этот пример показывает, как отправлять байт данных с Arduino на персональный компьютер, а затем выводить результат на график. Это называется последовательной передачей данных, потому что и Arduino, и компьютер будут видеть это как подключение через последовательный порт (даже если на самом деле используется USB-кабель). Для того, чтобы увидеть отправленные данные, можно воспользоваться окном Serial Monitor, или же прочитать их с помощью Processing (см. код ниже), Flash, PD, Max/MSP (тоже см. ниже) и т.д.

Необходимое оборудование

  • Плата Arduino;
  • Аналоговый датчик (потенциометр, фотоэлемент, силоизмерительный резистор и т.д.);

Необходимое ПО

Цепь

Подключите потенциометр или другой аналоговый датчик к 0-ому входному аналоговому контакту.

Graph-circuit3.png

Схема

AnalogReadSerial sch.png

Код для Arduino

 1 /*
 2   График
 3  
 4   Простой пример передачи данных от платы Arduino к компьютеру – данные от 0-ого входного аналогового контакта передаются на последовательный порт. 
 5 
 6  Мы называем это «последовательной» передачей данных, поскольку Arduino и компьютер воспринимают это подключение как подключение через последовательный порт, даже несмотря на то, что вы, возможно, используете для него USB-кабель. 
 7 
 8  Байты передаются от Arduino к компьютеру один за другим, т.е. последовательно. 
 9  
10  Для просмотра данных от Arduino можно воспользоваться окном Serial Monitor или же прочесть их при помощи Processing, PD, Max/MSP или любой другой программы, умеющей читать данные, переданные через последовательный порт.
11  
12  Код для Processing (см. ниже) делает из полученных данных график, поэтому за изменением данных от датчика можно следить в режиме реального времени.
13  
14  Цепь:
15  * Любой аналоговый сенсор, подсоединенный к 0-ому аналоговому контакту
16   
17  Создан в 2006 году Дэвидом А. Меллисом (David A. Mellis),
18  модифицирован 9 апреля 2012 Томом Иго (Tom Igoe) 
19  и Скоттом Фитцджеральдом (Scott Fitzgerald).
20 
21 Этот код не защищен авторским правом.
22  
23 http://www.arduino.cc/en/Tutorial/Graph
24  */
25 
26 void setup() {
27   // инициализируем последовательную передачу данных:
28   Serial.begin(9600);
29 }
30 
31 void loop() {
32   // отправляем данные на 0-ой входной аналоговый контакт:
33   Serial.println(analogRead(A0));
34   // ждем немного, чтобы аналогово-цифровой преобразователь
35   // стабилизировался после последнего считывания:
36   delay(2);
37 }

Код для Processing

 1 /* Код к Processing для этого примера */
 2  
 3  // Скетч для графика
 4  
 5  
 6  // Эта программа берет ASCII-строки, 
 7  // переданные через последовательный порт со скоростью 9600 бит в секунду,
 8  // а затем делает на их основе график.
 9  // Работает со значениями в диапазоне от 0 до 1023,
10  // заканчивающихся переводом строки (или переводом строки и разрывом строки)
11  
12  // Создан 20 апреля 2005, 
13  // обновлен 18 января 2008 Томом Иго (Tom Igoe).
14 
15  // Этот код не защищен авторским правом.
16  
17  import processing.serial.*;
18  
19  Serial myPort;        // последовательный порт
20  int xPos = 1;         // задаем горизонтальную позицию для графика
21  
22  void setup () {
23  // задаем размер окна:
24  size(400, 300);        
25  
26  // выдаем список всех доступных последовательных портов:
27  println(Serial.list());
28  // я знаю, что на моем Mac первый порт из этого списка всегда подключен к Arduino,
29  // поэтому я сразу открываю Serial.list()[0].
30  // разумеется, мой порт может не совпадать с вашим,
31  // поэтому имеет смысл подправить нижнюю строчку
32  // в соответствии с вашими реалиями.
33  myPort = new Serial(this, Serial.list()[0], 9600);
34  // не запускаем serialEvent() до тех пор, пока не увидим символ перевода строки:
35  myPort.bufferUntil('\n');
36  // задаем цвет заднего фона для графика:
37  background(0);
38  }
39  void draw () {
40  // тут описываем все, что происходит в serialEvent()
41  }
42 
43  void serialEvent (Serial myPort) {
44  // берем строку с ASCII-символами:
45  String inString = myPort.readStringUntil('\n');
46  
47  if (inString != null) {
48  // убираем любые пробелы:
49  inString = trim(inString);
50  // конвертируем данные в int и трансформируем их так, чтобы они соответствовали высоте экрана:
51  float inByte = float(inString); 
52  inByte = map(inByte, 0, 1023, 0, height);
53  
54  // рисуем линию:
55  stroke(127,34,255);
56  line(xPos, height, xPos, height - inByte);
57  
58  // если добрались до края экрана, возвращаемся к началу:
59  if (xPos >= width) {
60  xPos = 0;
61  background(0); 
62  } 
63  else {
64  // увеличиваем значение горизонтальной позиции:
65  xPos++;
66  }
67  }
68  }

Используя код, указанный выше, вы получите график данных от датчика. Если данные от аналогового датчика поменяются, вы получите что-то вроде этого:

Graph-output.png

Код для Max

 1 /* Патч к Max/MSP v5 для этого примера */
 2  ----------begin_max5_patcher----------
 3 1591.3oc0YszbaaCD9r7uBL5RalQUAO3CvdyS5zVenWZxs5NcfHgjPCIfJIT
 4 RTxj+6AOHkoTDooroUs0AQPR73a+1cwtK3WtZxzEpOwqlB9YveAlL4KWMYh6
 5 Q1GLo99ISKXeJMmU451zTUQAWpmNy+NM+SZ2y+sR1l02JuU9t0hJvFlNcMPy
 6 dOuBv.U5Rgb0LPpRpYBooM3529latArTUVvzZdFPtsXAuDrrTU.f.sBffXxL
 7 vGE50lIHkUVJXq3fRtdaoDvjYfbgjujaFJSCzq4.tLaN.bi1tJefWpqbO0uz
 8 1IjIABoluxrJ1guxh2JfPO2B5zRNyBCLDFcqbwNvuv9fHCb8bvevyyEU2JKT
 9 YhkBSWPAfq2TZ6YhqmuMUo0feUn+rYpY4YtY+cFw3lUJdCMYAapZqzwUHX8S
10 crjAd+SIOU6UBAwIygy.Q1+HAA1KH6EveWOFQlitUK92ehfal9kFhUxJ3tWc
11 sgpxadigWExbt1o7Ps5dk3yttivyg20W0VcSmg1G90qtx92rAZbH4ez.ruy1
12 nhmaDPidE07J+5n2sg6E6oKXxUSmc20o6E3SPRDbrkXnPGUYE.i5nCNB9TxQ
13 jG.G0kCTZtH88f07Rt0ZMMWUw8VvbKVAaTk6GyoraPdZff7rQTejBN54lgyv
14 HE0Ft7AvIvvgvIwO23jBdUkYOuSvIFSiNcjFhiSsUBwsUCh1AgfNSBAeNDBZ
15 DIDqY.f8.YjfjV1HAn9XDTxyNFYatVTkKx3kcK9GraZpI5jv7GOx+Z37Xh82
16 LSKHIDmDXaESoXRngIZQDKVkpxUkMCyXCQhcCK1z.G457gi3TzMz4RFD515F
17 G3bIQQwcP3SOF0zlkGhiCBQ1kOHHFFlXaEBQIQnCwv9QF1LxPZ.A4jR5cyQs
18 vbvHMJsLll01We+rE2LazX6zYmCraRrsPFwKg1ANBZFY.IAihr8Ox.aH0oAL
19 hB8nQVw0FSJiZeunOykbT6t3r.NP8.iL+bnwNiXuVMNJH9H9YCm89CFXPBER
20 bz422p8.O4dg6kRxdyjDqRwMIHTbT3QFLskxJ8tbmQK4tm0XGeZWF7wKKtYY
21 aTAF.XPNFaaQBinQMJ4QLF0aNHF0JtYuHSxoUZfZY6.UU2ejJTb8lQw8Fo5k
22 Rv6e2PI+fOM71o2ecY1VgTYdCSxxUqLokuYq9jYJi6lxPgD2NIPePLB0mwbG
23 YA9Rgxdiu1k5xiLlSU6JVnx6wzg3sYHwTesB8Z5D7RiGZpXyvDNJY.DQX3.H
24 hvmcUN4bP1yCkhpTle2P37jtBsKrLWcMScEmltOPv22ZfAqQAdKr9HzATQwZ
25 q18PrUGt6Tst2XMCRUfGuhXs6ccn23YloomMqcTiC5iMGPsHsHRWhWFlaenV
26 XcqwgCQiGGJzptyS2ZMODBz6fGza0bzmXBj7+DA94bvpR01MffAlueO7HwcI
27 pWCwmzJdvi9ILgflLAFmyXB6O7ML0YbD26lenmcGxjVsZUN+A6pUK7AtTrPg
28 M+eRYG0qD9j4I7eEbco8Xh6WcO.or9XDC6UCiewbXHkh6xm5LiPEkzpJDRTu
29 mEB44Fgz4NCtJvX.SM1vo2SlTCZGAe7GZu6ahdRyzFOhYZ+mbVVSYptBw.K1
30 tboIkatIA7c1cTKD1u.honLYV04VkluHsXe0szv9pQCE9Ro3jaVB1o15pz2X
31 zYoBvO5KXCAe0LCYJybE8ZODf4fV8t9qW0zYxq.YJfTosj1bv0xc.SaC0+AV
32 9V9L.KKyV3SyTcRtmzi6rO.O16USvts4B5xe9EymDvebK0eMfW6+NIsNlE2m
33 eqRyJ0utRq13+RjmqYKN1e.4d61jjdsauXe3.2p6jgi9hsNIv97CoyJ01xzl
34 c3ZhUCtSHx3UZgjoEJYqNY+hYs5zZQVFW19L3JDYaTlMLqAAt1G2yXlnFg9a
35 53L1FJVcv.cOX0dh7mCVGCLce7GFcQwDdH5Ta3nyAS0pQbHxegr+tGIZORgM
36 RnMj5vGl1Fs16drnk7Tf1XOLgv1n0d2iEsCxR.eQsNOZ4FGF7whofgfI3kES
37 1kCeOX5L2rifbdu0A9ae2X.V33B1Z+.Bj1FrP5iFrCYCG5EUWSG.hhunHJd.
38 HJ5hhnng3h9HPj4lud02.1bxGw.
39 -----------end_max5_patcher-----------

Патч к Max указан в примере выше. Скопируйте его и вставьте в новое окно Max, чтобы увидеть этот скетч:

Max-graph.png

См.также

  1. Serial
  2. analogRead()
  3. Dimmer
  4. Physical Pixel
  5. Virtual Color Mixer
  6. Serial Call Response
  7. Serial Call Response ASCII
  8. Serial input (Switch (case) Statement)

Внешние ссылки