pySerial
The serial monitor provides a convenient way for showing serial communication between the Arduino boards and the Computer. However, it does not allow the computer to react according to the value received. No worry, you can write your own Serial Monitor using Python! pySerial is a Library which allows python programs to access the serial port. Thus, we can now bridge Arduino board and the computer by ourselves.
If you haven’t tried pySerial or want to further familiarize yourself with Python:
Linux
Windows
-
Install Python https://www.python.org/ or install using Windows store
-
Remember to add python to your PATH
or do it manually https://datatofish.com/add-python-to-windows-path/
-
Visit https://phoenixnap.com/kb/install-pip-windows to install pip
-
Use python -m pip install pyserial«` to install pyserial package
Further reading
Read more about Arduino and Python from the following websites.
- Arduino and Python
- Using PySerial to read data from Arduino
Try it yourself 02
Take extra precautions while working at heights
Flash the following program to Arduino:
This should echo all data sent from PC back. Open Serial Monitor and type something to see if it works.
Linux
Copy the following 2 programs as 2 separate files. change the line according to the port name of Arduino in your OS. It should be something like .
Run the 2 programs together. Python programs can be executed with:
Windows
A serial port cannot be opened twice on Windows. Therefore, we have to use a multi-thread version. Copy the following program and save it as a file. change the line according to the port name of the Arduino in your OS. It should be something like .
Run the program. Python programs can be executed with:
IDLE can’t handle correctly. Use command prompt instead.
Words sent from the talker should be seen on the listener. Words have actually passed to the Arduino and back to the computer through USB Serial.
Пример работы
В качестве примера повторим первый эксперимент «Маячок» из набора Матрёшка. На плате уже есть встроенный пользовательский светодиод L, подключенный к 13 пину микроконтроллера.
blink.inovoid setup() { // Устанавливаем пин светодиода в режим выхода. // Используем определение LED_BUILTIN, // которое содержит в себе пин светодиода pinMode(LED_BUILTIN, OUTPUT);} void loop() { // Включаем светодиод digitalWrite(LED_BUILTIN, HIGH); // Ждём пол секунды delay(500); // Выключаем светодиод digitalWrite(LED_BUILTIN, LOW); // Ждём пол секунды delay(1000); }
После загрузки программы встроенный светодиод L начнёт мигать раз в секунду.
Это значит, всё получилось, и можно смело переходить к другим экспериментам на Ардуино.
Плоттер
Помимо монитора последовательного порта, в Arduino IDE есть плоттер – построитель графиков в реальном времени по данным из последовательного порта. Достаточно отправить значение при помощи команды Serial.println(значение) и открыть плоттер по последовательному соединению, например построим график значения с аналогового пина A0:
void setup() { Serial.begin(9600);}void loop() { Serial.println(analogRead(0)); delay(10);}
Плоттер поддерживает несколько линий графиков одновременно, для их отображения нужно соблюдать следующий протокол отправки данных: значение1 пробел_или_запятая значение2 пробел_или_запятая значение3 пробел_или_запятая значениеN перенос_строки, то есть значения выводятся в одну строку, одно за другим по порядку, разделяются пробелом или запятой, и в конце обязательно перенос строки. Давайте выведем несколько случайных величин:
void setup() { Serial.begin(9600);}byte val1, val2, val3;uint32_t timer;void loop() { // каждые 300 мс if (millis() – timer >= 300) { timer = millis(); val1 = random(100); val2 = random(100); val3 = random(100); } // вывод каждые 10 мс Serial.print(val1); Serial.print(‘ ‘); Serial.print(val2); Serial.print(‘ ‘); Serial.print(val3); Serial.println(‘ ‘); delay(10);}
Вывод значений происходит каждые 10 миллисекунд, а каждые 300 миллисекунд значения обновляются. Получаем вот такой график: В Arduino IDE с версии 1.8.10 добавили возможность подписать графики, для этого перед выводом нужно отправить названия в виде название 1, название 2, название n с переносом строки, и дальше просто выводить данные:
Section 2. Serial communication using Arduino and Serial Monitor
- We can send data to the Arduino via USB Serial using serial monitor in the VSCode. Let’s try it!
- Upload
-
With the Arduino is plugged into the computer, open serial monitor in VSCode.
-
Visit https://docs.platformio.org/en/latest/projectconf/section_env_monitor.html to see how to change settings of serial monitor by editing
-
Try to send the message «abc». You should see some text show up. That is the
message sent by the Arduino! -
You may notice that the TX and RX LED light up on the Arduino when you click
«send». This is because TX and RX indicate serial communication.
The comments should be self-explanatory. Some further elaboration is given below:
- 9600 bps baudrate means that the serial communication speed is 9600 bits per second.
-
essentially writes a c-string to the serial output, which is
actually a sequence of (1 byte).
The meaning of in the serial monitor is that is the decimal form of
the character in ASCII. In ASCII, every character is assigned a number from 0 to 127.
Try it yourself 1
- Connect the Arduino with an LED
- Now, modify the above (or write a new) program such that the brightness of the LED
is changed (using ) based on the serial input that is received. - After the brightness is changed, the Arduino should send a response message
(where is replaced by the brightness) via serial. - Perform serial I/O via the Serial Monitor.
- Hint: You need to use a function that translates c-string to integer (and perhaps vice-versa).
- Now, modify the above (or write a new) program such that the brightness of the LED
Методы связи
UART позволяет одновременно передавать и принимать данные, однако не всегда это возможно или нужно. Например, если Вам нужно только получать не критические данные (которые можно проверить следующим пакетом, например расстояние, посылаемое лидаром каждые несколько сотен миллисекунд) от цифрового датчика или любого другого устройства и не нужно ничего передавать, такой метод называется симплексным. Всего различают три метода связи:
- Полнодуплексная — когда ведущий и ведомый могут одновременно принимать и передавать (одновременная передача в обе стороны)
- Полудуплексная — когда ведущий и ведомый поочерёдно принимают и передают (Поочерёдная передача в обе стороны)
- Симплексная — когда ведущий или ведомый только передают (Передача в одну сторону)
Программирование Ардуино
В среде Arduino IDE необходимо создать новый проект: Файл -> НовыйЗатем сохранить его: Файл -> Сохранить как…Затем можно написать программу для микроконтроллера.Данная программа должна через строго определенное время выполнять аналого-цифровое преобразование (АЦП) и отправлять посылку в порт по определенному выше протоколу
Внимание! Использование обычной задержки delay не обеспечивает пригодной точности задания частоты дискретизации
Ниже представлен исходный код для Arduino, реализующий правильный алгоритм задания периода дискретизации. Он основан на вычислении времени, прошедшего с момента предыдущего измерения, привязавшись к внутреннему таймеру. Данный таймер стабилизирован кварцевым резонатором на плате Ардуино, поэтому достаточно точен.
Код Arduino:
//Обучающий модуль передачи многоканальных данных в ПК в бинарном виде. // (с) Роман Исаков, 2020 // (с) LabData.ru, 2020 // Объявление внешних подключений const int analogInPin = A0; // Разъем для подключения аналогового датчика const int Fs = 200; // Частота дискретизации сигнала (Гц) // Объявление переменных unsigned int sensorValue1 = 0; // Результат измерения 1 unsigned int sensorValue2 = 0; // Результат измерения 2 uint32_t ms_old = 0; // Время предыдущего измерения // Процедура инициализации void setup() { Serial.begin(19200); // Настройка скорости передачи на ПК (бод) pinMode( analogInPin, INPUT );// Настройка входа аналоговой части ms_old = millis(); // Инициализировать предыдущее время измерения текущим временем в мс } // Процедура отправки оного числа в порт void SendValue(unsigned int Value) { byte LB = 0, HB = 0; // Инициализировать переменные старшего и младшего байтов // Разбить число на два 8 битных пакета LB = Value & B11111111; // Выбор первых 8 бит из числа HB = Value >> 8; // Сдвинуть на 8 бит и записать первые из них Serial.write(LB); // Отправть на ПК младший байт Serial.write(HB); // Отправить на ПК старший байт } // Процедура формирования протокола передачи и отправки двух переменных в порт void SendPacket(unsigned int Value1, unsigned int Value2) { // Сфомировать протокол передачи Serial.write(B11111111); // Стартовый байт 1 Serial.write(B11111111); // Стартовый байт 2 SendValue(Value1); // Первое число SendValue(Value2); // Второе число // можно добавлять еще... } // Главный цикл работы void loop() { if (millis()-ms_old >= (1000/Fs)){ // Ожидание периода дисткретизации sensorValue1 = analogRead(analogInPin); // Провести АЦП sensorValue2 = round(random(0,500)); // Сгенерировать параметр (якобы второй датчик) ms_old = millis(); // Сразу после АЦП нужно отметить время измерения SendPacket(sensorValue1, sensorValue2); // Запуск передачи } }
После этого нужно подключить макет к персональному компьютеру и не забыть выбрать правильный порт Инструменты -> Порт, а также используемую версию Ардуино: Инструменты -> Плата.
Если при загрузке не возникло ошибок, можно проверить выходные данные в мониторе порта среды Ардуино (выбрать частоту передачи 19200). Должна пойти одна строчка, состоящая из непонятных символов, включая буквы «я» (это стартовые биты). Значит микроконтроллер передает данные!
Этапы настройки Arduino
- Во-первых, установите IDE. Вы можете скачать IDE с сайта Arduino.
- Установите программное обеспечение на свой компьютер.
- Теперь запустите .exe файл Arduino IDE. IDE выглядит так:
- Напишите в редакторе кода свою программу и загрузите её в Arduino. Чтобы сделать это, необходимо подключить Arduino к компьютеру, используя USB кабель.
- В IDE выберите тип Arduino, который вы используете, через меню Tools (Инструменты) → Boards (Платы).
- Теперь проверьте свой код, нажав на значок «галки» вверху окна IDE, затем нажмите на соседний значок «стрелка вправо», чтобы скомпилировать и загрузить код в Arduino.
Внимание: возможно, вам понадобится установить драйвера, если ваша система не обнаружит Arduino
Протокол I2C в Arduino
На следующем рисунке показаны контакты платы Arduino UNO, которые используются для связи по протоколу I2C.
Линия протокола I2C | Контакт платы Arduino UNO |
SDA | A4 |
SCL | A5 |
Для осуществления связи по протоколу I2C в плате Arduino используется библиотека <Wire.h>. В ней содержатся следующие функции для связи по протоколу I2C.
1. Wire.begin(address).
Эта команда производит инициализацию библиотеки Wire и осуществляет подключение к шине I2C в качестве ведущего (master) или ведомого (slave). 7-битный адрес ведомого в данной команде является опциональным и если он не указан , то устройство (плата Arduino) подключается к шине I2C в качестве ведущего (master).
2. Wire.read().
Эта функция используется для считывания байта, принятого от ведущего или ведомого.
3. Wire.write().
Эта функция используется для записи данных в устройство, являющееся ведомым или ведущим.
От ведомого ведущему (Slave to Master): ведомый записывает (передает) данные ведущему когда в ведущем работает функция Wire.RequestFrom().
От ведущему ведомому (Master to Slave): в этом случае функция Wire.write() должна использоваться между вызовами функций Wire.beginTransmission() и Wire.endTransmission().
Функцию Wire.write() можно использовать в следующих вариантах:
- Wire.write(value); value — значение передаваемого одиночного байта;
- Wire.write(string) – для передачи последовательности байт;
- Wire.write(data, length); data – массив данных для передачи в виде байт, length – число байт для передачи.
4. Wire.beginTransmission(address).
Эта функция используется для начали передачи по протоколу I2C устройству с заданным адресом ведомого (slave address). После этого вызывается функция Wire.write() с заданной последовательностью байт для передачи, а после нее функция endTransmission() для завершения процесса передачи.
5. Wire.endTransmission().
Эта функция используется для завершения процесса передачи ведомому устройству, который до этого был инициирован функциями beginTransmission() и Wire.write().
6. Wire.onRequest().
Эта функция вызывается когда ведущий запрашивает данные с помощью функции Wire.requestFrom() от ведомого устройства. В этом случае мы можем использовать функцию Wire.write() для передачи данных ведущему.
7. Wire.onReceive().
Эта функция вызывается когда ведомое устройство получает данные от ведущего. В этом случае мы можем использовать функцию Wire.read() для считывания данных передаваемых ведущим.
8. Wire.requestFrom(address,quantity).
Эта функция используется в ведущем устройстве чтобы запросить байты (данные) с ведомого устройства. После этого используется функция Wire.read() чтобы принять данные переданные ведомым устройством.
address: 7-битный адрес устройства, с которого запрашиваются байты (данные).
quantity: число запрашиваемых байт.
Режимы работы пинов
Цифровой пин может находиться в двух состояниях, вход и выход. В режиме входа пин может считывать напряжение от 0 до напряжения питания МК, а в режиме выхода – выдавать такое же напряжение. Режим работы выбирается при помощи функции pinMode(pin, mode), где pin это номер пина, а mode это режим:
mode – режим работы
- INPUT – вход
- OUTPUT – выход
- INPUT_PULLUP – подтянутый к питанию вход
Если со входом/выходом всё понятно, то с подтяжкой давайте разберёмся. В режиме входа пин микроконтроллера не подключен никуда и ловит из воздуха всякие наводки, получая практически случайное значение. Для задания пину “состояния по умолчанию” используют подтяжку резистором к земле или питанию. Вот режим INPUT_PULLUP включает встроенную в микроконтроллер подтяжку пина к питанию. Подробнее об этом, со схемами и примерами я рассказывал в начале вот этого видео урока.
Объяснение программ для Arduino
Нам будут необходимы две программы – одна для ведущей платы Arduino, а другая – для ведомой. Полные тексты обоих программ приведены в конце статьи, здесь же мы рассмотрим их основные фрагменты.
Объяснение программы для ведущей (Master) платы Arduino
1. Первым делом в программе мы должны подключить библиотеку Wire для задействования возможностей протокола I2C и библиотеку для работы с ЖК дисплеем. Также нам необходимо сообщить плате Arduino к каким ее контактам подключен ЖК дисплей.
Arduino
#include<Wire.h>
#include<LiquidCrystal.h>
LiquidCrystal lcd(2, 7, 8, 9, 10, 11);
1 |
#include<Wire.h> LiquidCrystallcd(2,7,8,9,10,11); |
- Далее в функции void setup():
— мы инициализируем последовательную связь со скоростью 9600 бод/с;
Arduino
Serial.begin(9600);
1 | Serial.begin(9600); |
— инициализируем связь по протоколу I2C на контактах A4 и A5;
Arduino
Wire.begin(); //Begins I2C communication at pin (A4,A5)
1 | Wire.begin();//Begins I2C communication at pin (A4,A5) |
— далее мы инициализируем ЖК дисплей для работы в режим 16х2, показываем на нем приветственное сообщение и очищаем его экран через 5 секунд.
Arduino
lcd.begin(16,2); //Initilize LCD display
lcd.setCursor(0,0); //Sets Cursor at first line of Display
lcd.print(«Circuit Digest»); //Prints CIRCUIT DIGEST in LCD
lcd.setCursor(0,1); //Sets Cursor at second line of Display
lcd.print(«I2C 2 ARDUINO»); //Prints I2C ARDUINO in LCD
delay(5000); //Delay for 5 seconds
lcd.clear(); //Clears LCD display
1 |
lcd.begin(16,2);//Initilize LCD display lcd.setCursor(,);//Sets Cursor at first line of Display lcd.print(«Circuit Digest»);//Prints CIRCUIT DIGEST in LCD lcd.setCursor(,1);//Sets Cursor at second line of Display lcd.print(«I2C 2 ARDUINO»);//Prints I2C ARDUINO in LCD delay(5000);//Delay for 5 seconds lcd.clear();//Clears LCD display |
- В функции void loop():
— сначала нам необходимо получить данные от ведомого, поэтому мы используем функцию requestFrom() с адресом ведомого равным 8 и запрашиваемым 1 байтом;
Arduino
Wire.requestFrom(8,1);
1 | Wire.requestFrom(8,1); |
Принятое значение считываем с помощью функции Wire.read().
Arduino
byte MasterReceive = Wire.read();
1 | byteMasterReceive=Wire.read(); |
— далее нам необходимо считать аналоговое значение с потенциометра, подключенного к контакту A0 ведущей платы Arduino;
Arduino
int potvalue = analogRead(A0);
1 | intpotvalue=analogRead(A0); |
Затем мы конвертируем это полученное значение к диапазону одного байта – от 0 до 127 (байт у нас 7-битный).
Arduino
byte MasterSend = map(potvalue,0,1023,0,127);
1 | byteMasterSend=map(potvalue,,1023,,127); |
— после этого нам необходимо передать это конвертированное значение, поэтому мы начинаем передачу ведомой плате с адресом 8;
Arduino
Wire.beginTransmission(8);
Wire.write(MasterSend);
Wire.endTransmission();
1 |
Wire.beginTransmission(8); Wire.write(MasterSend); Wire.endTransmission(); |
— затем мы отобразим на экране ЖК дисплея принятое значение от ведомой платы с задержкой 500 микросекунд и в дальнейшем мы будем непрерывно принимать и отображать эти значения.
Arduino
lcd.setCursor(0,0); //Sets Currsor at line one of LCD
lcd.print(«>> Master <<«); //Prints >> Master << at LCD
lcd.setCursor(0,1); //Sets Cursor at line two of LCD
lcd.print(«SlaveVal:»); //Prints SlaveVal: in LCD
lcd.print(MasterReceive); //Prints MasterReceive in LCD received from Slave
Serial.println(«Master Received From Slave»); //Prints in Serial Monitor
Serial.println(MasterReceive);
delay(500);
lcd.clear();
1 |
lcd.setCursor(,);//Sets Currsor at line one of LCD lcd.print(«>> Master <<«);//Prints >> Master << at LCD lcd.setCursor(,1);//Sets Cursor at line two of LCD lcd.print(«SlaveVal:»);//Prints SlaveVal: in LCD lcd.print(MasterReceive);//Prints MasterReceive in LCD received from Slave Serial.println(«Master Received From Slave»);//Prints in Serial Monitor Serial.println(MasterReceive); delay(500); lcd.clear(); |
Форматирование и конвертация строк
Если мы передаем в последовательный порт число и хотим, чтобы оно интерпретировалось как число определенной системы счисления и выводилось в соответствующем формате, то можем использовать второй аргумент функции.
Варианты значений констант для форматирования:
- DEC – обычное число в десятичной системе исчисления
- BIN – преобразует в двоичный код и выведет строку, содержащую только символы 0 и 1
- OCT – преобразует в восьмеричную систему исчисления
- HEX – преобразует в шестнадцатеричную систему
- Цифра от 0 до 9 – используется, если первый аргумент – вещественное число с плавающей запятой. Форма указывает количество знаков после запятой, которые останутся при выводе. Само число при этом будет округлено.
Примеры:
Serial.println(65, DEC); // выведет “65”Serial.println(65, BIN); // выведет “1000001”Serial.println(65, OCT); // выведет 101, т.к. 65 в 8-ной системе исчисления равно 101Serial.println(65, HEX); // выведет 41, т.к. 65 в 16-ной системе исчисления равно 41Serial.println(9.876, 2); // выведет два символа после запятой, предварительно округлив – 9.88Serial.println(9.876, 0); // выведет число 10
В старых версиях ардуино можно было использовать еще один параметр BYTE. Начиная с версии 1.0 эта константа не поддерживается и компилятор выдаст вам ошибку «Ключевое слово ‘BYTE’ больше не поддерживается». Для вывода ASCII символа по его коду нужно использовать метод write().
Connection Diagram Between Two Arduino Boards via Serial Pins
Following figure shows a connection diagram between two Arduino boards using digital pins to simulate a UART communication port using a pre-built library.
Consider we are using digital pin 11 and pin 10 as Tx and Rx for both Arduino boards.
- Connect virtual pin Tx of first Arduino board with pin Rx of second Arduino board.
- Connect virtual pin Rx of first Arduino board with pin Tx of second Arduino board.
- Virtual Tx pin of Arduino 1 transmit data to real buffer of receiver Arduino 2 and this data is written on virtual Tx pin of receiver Arduino 2 which is than shown on virtual terminal named as “Received Data”
- In order to monitor the status of transmitter and receiver Arduino, virtual terminals have been used.
- Connect the GND pin of both Arduino board together (if using real Arduino Boards)
- In case both Arduinos are not powered up using USB port than it is necessary to connect 5V pins of both Arduinos and power up one Arduino with USB port. (if using real Arduino Boards)
Serial Communication Code
The computer sends commands to Master Arduino, it is written on soft serial pins as defined in master code then it travels to the second Arduino through hardware connections made in pic 1 and it is communicated with Slave Arduino.
Code for Master Arduino
Description of Code for Master Arduino
Now lets see how above code works.
First includes the software serial library using its #include files. This line includes the SoftwareSerial.h library.
A serial object named as “softSerial” is declared here. Pin 10 will be used as Rx pin and pin 11 will be Tx pin. Using this “softSerial” object all functions of a normal serial connection can be used such as read, write and so on.
Here the baud rate of 9600 is being set for the softSerial object defined above. One important point to note here is that the baud rate of both Arduino boards such as master and slave should be same.
Here the statement “UART Communication” is being written repeatedly with a time delay of 0.1 second on Tx pin 11 of Arduino 1 for transmitting it to other Arduino.
Now add a delay of 100ms and this Arduino master will keep sending a string “UART Communication” on the transmit pin after every 100ms.
Code for Slave Arduino
Description of Code for Slave Arduino
This line includes the SoftwareSerial.h library.
SoftwareSerial softSerial () creates a serial object named as “softSerial” is declared here. Pin 10 will be used as Rx pin and pin 11 will be Tx pin. Using this “softSerial” object all functions of a normal serial connection can be used such as read, write and so on.
After that, this line sets the baud to 9600 for soft serial and serial communication.
Then presence of data is checked in buffer. if some data is available, it is stored in “ip” variable and then written on softserial transmit pin which is pin 11 of Arduino.
Proteus Simulation
Figure above shows the circuit diagram for simulating this communication.
Below figure shows the data being sent by Master device through Tx pin 11 of Arduino 1.
Below figure shows the data sent by Master device and data received by Slave device at pin 11 of Arduino 2.
So data is successfully being transmitted using serial communication and soft serial library of Arduino.
Three most important points should be kept in mind while performing simulated serial communication.
- Tx pin of one Arduino board should be connected to Rx of other Arduino board. If opposite connections are made, Arduino board might get damage.
- Both Arduino boards must share same ground connection from sup
- Also, both Arduino boards should operate at same speed which means baud rate of both board should be same.
Интересные проекты на базе МК Arduino
На Ардуино уже создано тысячи проектов, а многие инженеры ведут собственные блоги или каналы на YouTube, где вы можете ознакомиться с их творчеством. Из интересных идей, стоит отметить следующие:
- Умный дом. Практически каждый элемент умного дома можно создать собственными руками. От автоматических штор и дверей до сигнализаций и регулируемого освещения.
- Кодовые замки. Проект простой, и подойдёт для новичков. Достаточно использовать любой датчик и сделать замки, реагирующие на определённый ритм постукиваний или же на приближение вашего смартфона.
- Автоматизированные теплицы.
Проектов на деле в тысячи раз больше, вам остаётся лишь подключить свою фантазию, а инструментарием послужит Ардуино.
STEP 3 – SERIAL READ IN ARDUINO
In the above steps you learned how to begin Serial communication and to print data.
Now learn and know the method of how to read or receive data from the device or peripheral which was connected to the Serial port. There are built-in functions that read different types of data and convert into desired data type as per program.
FUNCTIONS
Serial.read(); Serial.readBytes(); Serial.readString(); Serial.parseInt(); Serial.parseFloat();
Serial.read() – Receive the incoming data in character form defined as in ASCII and store it in user defined variable.
Serial.readBytes() – It takes two arguments which decide types of data and length it will allow while receiving. Reads data from the serial port and stores it into a buffer. The function terminates if the determined length has been read, or its times out. Returns the number of characters placed in the buffer.
SYNTAX
Serial.readBytes(buffer, length);
PARAMETERS
buffer: the buffer to store the bytes in (char [] or byte [])
length: the number of bytes to read in integer value (8,10,14)
Serial.readString() – Read data in the form of string from serial buffer.
Serial.parseInt() – Reads data in the form of integer from serial buffer.
Serial.parseFloat() – Reads data in the form of float from serial buffer.
If you are reading the value from temperature sensor using built-in function analogRead() and comparing the value which is received from your phone via bluetooth method then you have to use Serial.parseInt() function instead of using Serial.read() or convert them in common data type by type casting.
Now you have a clear picture of other built-in functions for use in your program and you will observe the implementation of all these functions in chapters like GSM, RFID, Bluetooth and GPS.
READ NEXTBLUETOOTH HC05
5
1
vote
Article Rating
Raspberry Pi Software setup
You don’t need any special setup for Arduino. Just make sure you have downloaded and installed the Arduino IDE.
Now, on your Raspberry Pi, a few things are required to make the communication work.
Connect to your Raspberry Pi, either via ssh, or by plugin a screen+mouse+keyboard, and open a terminal. If you haven’t installed an OS on your Pi yet, you can install Raspbian or Ubuntu very easily on a SD card.
Detect the Arduino board
When connecting the Arduino with a USB cable, you should see it appear as /dev/ttyACM0, or /dev/ttyUSB0 (sometimes the number can be different, for example /dev/ttyACM1).
Simply run and you should see it. At this point if you’re not sure which device is the Arduino board, simply disconnect the board (remove the USB cable), and run again. This way you will easily spot the serial device name of your Arduino.
Hardware permissions for Serial
Also, you may want to add your user to the dialout group, to avoid errors such as: serial.serialutil.SerialException: could not open port /dev/ttyACM0: Permission denied: ‘/dev/ttyACM0’.
$ sudo adduser your_username dialout
This will make sure you have access to Serial devices (/dev/ttyACMx, /dev/ttyUSBx, …).
After you’ve added yourself to the dialout group, you need to reboot your Pi (or at least logout/login) to apply the change – learn more about Raspberry Pi hardware permissions.
Install Python Serial library on Raspberry Pi
You need to install a library to be able to use the Serial interface with Python.
For this tutorial we’ll use the pySerial library (documentation for Python 3). To install it:
python3 -m pip install pyserial
This Python library is well-known and used in a lot of applications.
When installing, if you get an error such as “/usr/bin/python3: No module named pip”, then you need to install pip first with .
Термины
Программный код для Arduino принято называть скетчами (англ. sketches). У скетчей есть два основных метода: и . Первый метод автоматически вызывается после включения/сброса микроконтроллера. В нём происходит инициализация портов и различных модулей, систем. Метод вызывается в бесконечном цикле на протяжении всей работы микроконтроллера.
Порты — неотъемлемая часть любого микроконтроллера. Через них происходит взаимодействие микроконтроллера с внешними устройствами. С программной стороны порты называются пинами. Любой пин может работать в режиме входа (для дальнейшего считывания напряжения с него) или в режиме выхода (для дальнейшей установки напряжения на нём).
Любой пин работает с двумя логическими состояниями: и , что эквивалентно логическому нулю и единице соответственно. У некоторых портов есть встроенный АЦП, что позволяет считывать аналоговый сигнал со входа (например, значение переменного резистора). Также некоторые пины могут работать в режиме ШИМ (англ. PWM), что позволяет устанавливать аналоговое напряжение на выходе. Обычно функциональные возможности пина указываются на маркировке самой платы.
Разработка скетча для управления светодиодом на плате через последовательный порт
Создаем новый скетч и сохраняем его с названием SerialTest. Проверяем, что выбрана правильная плата и порт.
В функции setup() инициализируем последовательный порт и 13-й пин для управления светодиодом:
Serial.begin(9600);
pinMode(13,OUTPUT);
В функции loop() проверяем, нет ли данных в последовательном порту. Читаем данные, и если пришел символ «1», включаем светодиод, во всех остальных случаях выключаем:
while(Serial.available())
digitalWrite(13,(Serial.read()==’1′)?HIGH:LOW);
Знакомство с монитором последовательного порта
Открываем монитор последовательного порта (Инструменты -> Монитор порта или кнопка вверху справа). Появляется следующее окно:
В данном окне выводится информация, поступающая от контроллера. В верхней строке слева от кнопки «Отправить» можно писать текст, который отправляется на контроллер. В нижнем правом окне настраивается скорость передачи данных и указывается, будет ли к тексту добавляться символ перевода строки NL, CR или оба сразу, или текст будет отправлен как есть. Для данной работы нужно выставить режим «Нет конца строки».
Оповещение о переключении светодиода
Доработаем скетч так, чтобы в мониторе порта отображалась информация о переключении светодиода. Для этого поменяем код функции loop():
while(Serial.available())
{
char c=Serial.read();
if(c==’1′)
{
digitalWrite(13,HIGH);
Serial.println(«Led On»);
}
else
{
digitalWrite(13,LOW);
Serial.println(«Led Off»);
}
}
Проверяем монитор порта и проверим, что теперь при переключении светодиода отображаются оповещения.
КОД СКЕТЧА void setup() { |
История Ардуино
Основателями компании, которая начала создавать платы Ардуино, являются итальянцы Массимо Банци, Девида Куартиллье, Тома Иго, Джанлука Мартино и Девида Меллиса. Такой была первоначальная команда создателей.
А название они позаимствовали у итальянского бара, который, в свою очередь, был назван в честь короля Италии.
Фрагмент портрета Ардуина из Ивреи. Замок Мазино. Картина пьемонтской школы около 1700 года.
Ардуин был итальянским дворянином, который был королем Италии с 1002 по 1014 год. В 990 году Ардуин стал маркграфом Ивреи, а в 991 году графом Священного дворца Латеранского в Риме.
Стоит также сказать, что для Соединенных Штатов Америки используется другое название — Genuino.
Как включить Serial Monitor Arduino
Утилита состоит из окна, разбитого на три части. В верхней части находится поле ввода, где можно с компьютера отправлять данные в последовательный порт. В центре отображаются данные, полученные из последовательного порта. В нижней части окна — меню настроек. Монитор порта Arduino может работать с одним последовательным портом, чтобы не было ошибки при загрузке скетча и открытии Serial Monitor, необходимо выбрать COM порт на котором определилась плата Arduino UNO.
Для открытия утилиты необходимо нажать на иконку в верхнем правом углу Arduino IDE, использовать комбинацию клавиш Ctrl+Shift+M или выбрать в панели меню: Сервис -> Монитор порта. По умолчанию в Serial Monitor для Ардуино установлена скорость передачи данных 9600 бит в секунду, поэтому во многих скетчах используется такая скорость. Если скорость передачи данных в скетче и в настройках монитора порта будут разные, то вся информация будет отображаться в виде иероглифов.
По производителю
Существуют как официальные версии плат Arduino, так и платы от сторонних производителей. Оригинальные платы отличаются высоким качеством продукта, но и цена тоже выше. Они производятся только в Италии и США, о чём свидетельствует надпись на самой плате.
На примере самой популярной платы Arduino UNO:
-
Оригинальная плата. Поставляется только в фирменной коробке, имеет логотип компании, на портах платы — маркировка. Цена от производителя 20 €.
-
Плата от стороннего производителя. Качество хуже, однако цена начинается от 150 рублей. Качество платы может отразиться на её работоспособности в дальнейшем. Хоть это и редкость, но плата и вовсе может не работать «из коробки» — всё зависит от добросовестности изготовителя и продавца. Для работы с подобными платами требуется драйвер CH340, который находится в свободном доступе. Во всём остальном процесс разработки идентичен процессу разработки на оригинальных платах.
ВВОД-ВЫВОД
pinMode(pin, mode); — установка вывода pin на вход (INPUT) либо выход (OUTPUT)
По умолчанию цифровые выводы в Arduino предустановлены на вход, так что их нет нужды явно объявлять как INPUT с помощью pinMode().
Выводы, сконфигурированные как INPUT, подразумеваются в состоянии с высоким импедансом (сопротивлением).
Если на порт ввода не поступает сигнал, то рекомендуется задать порту известное состояние. Это делается добавлением подтягивающих резисторов 10 кОм, подключающих вход либо к питанию +5 В, либо к земле.
Микроконтроллер ATmega имеет программируемые встроенные подтягивающие резисторы 20 кОм. Программирование данных резисторов осуществляется так:
Выводы, сконфигурированные как порты вывода находятся в низкоимпедансном состоянии. Данные выводы могут пропускать через себя достаточно большой ток. Выводы микросхемы ATmega могут быть источником тока до 40 мА.
digitalRead(pin) — Считывает значение заданного цифрового вывода (pin) и возвращает результат HIGH (=1) или LOW (=0). Вывод должен быть задан либо как переменная, либо как константа (0-13).
digitalWrite(pin, value); — задает либо логический уровень HIGH, либо LOW (включает или выключает) на заданном цифровом выводе pin.