Опубликовано

Взаимодействие Arduino с компьютерной программой Processing

По материалам книги Джереми Блума “Изучаем Arduino: инструменты и методы технического волшебства. 2-е изд.: пер. с англ.“(Глава 7. Последовательный интерфейс USB)

Изучаем Arduino: инструменты и методы технического волшебства. 2-е изд.

Прежде чем рассмотреть взаимодействие Arduino с компьютерной программой, рассмотрим как такое взаимодействие организовано посредством программы Монитора порта.

Отправка одиночных символов для управления светодиодом

Прежде чем приступать к обработке чисел, состоящих из нескольких цифр, разработаем скетч для управления светодиодом с помощью одного символа. В частности, при получении символа “1” скетч будет включать светодиод, а символа “0” — выключать его. Для работы этого скетча нужно подключить светодиод к контакту 9 платы Arduino, как показано на рис. 7.10.

C:\Users\Anansi\AppData\Local\Temp\FineReader10\media\image10.jpeg

Рис. 7.10. Подключение светодиода к контакту 9 платы Arduino (Рисунок создан в программе Fritzing)

Как мы разобрались в предыдущем разделе, при отправке одиночного символа проще всего сравнить его с целевым символом в операторе условия if. Каждый помещаемый в буфер символ сравнивается с символом ‘0’ или ‘1’, и в зависимости от того, с каким символом он совпадает, предпринимается соответствующее действие. Создайте новый скетч, скопируйте в него код из листинга 7.4, загрузите его в свою плату Arduino и экспериментируйте, отправляя одиночные символы 0 и 1 из монитора порта.

Листинг 7.4. Программа single_char_control.ino для управления светодиодом с помощью одиночных символов

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// Управление светодиодом с помощью одиночных символов
const int LED=9;
char data; // Переменная для хранения получаемого символа
void setup()
{
Serial.begin(9600); // Запускаем последовательный порт
// со скоростью в бодах = 9600
pinMode(LED, OUTPUT);
}
 
void loop()
{
// Предпринимаем действие только при наличии данных в буфере
if (Serial.available() > 0)
{
data = Serial.read(); // Считываем входящий байт данных
// Включаем светодиод
if (data == '1')
{
digitalWrite(LED, HIGH);
Serial.println("LED ON");
}
 
// Выключаем светодиод
else if (data == '0')
{
digitalWrite(LED, LOW);
Serial.println("LED OFF");
}
}
}

Обратите внимание на то, что вместо простого оператора условия if…else в коде присутствует его вариант if…else…if. Поскольку в каждой передаче вместе с символами управления светодиодом монитор порта также отправляет и символ новой строки, важно удалить этот символ из буфера. Считываемый функцией Serial.read() символ новой строки не проходит проверку на превышение символа ‘0’, и в скетче не предпринимается никакого действия по его обработке. Обрабатываются только получаемые символы ‘0’ и ‘1’. Если же в коде использовался бы вариант if…else, то светодиод выключался бы при получении как символа ‘0’, так и символа новой строки ‘\n’. Более того, даже при получении символа ‘1’ скетч сразу же после включения светодиода выключал бы его при получении символа новой строки ‘\n’, следующего за символом ‘1’.

Управление разноцветным светодиодом с помощью списка значений

Теперь, когда мы знаем, как управлять одним цифровым контактом, рассмотрим, как можно работать одновременно с несколькими, чтобы реализовать более сложные схемы управления. В частности, рассмотрим, как управлять несколькими устройствами, отправляя плате Arduino одновременно набор значений, разделенных запятыми. Для этого эксперимента нам нужно будет подключить к плате Arduino разноцветный светодиод с общим анодом, как показано на монтажной схеме на рис. 7.11.

C:\Users\Anansi\AppData\Local\Temp\FineReader10\media\image11.jpeg

Рис. 7.11. Подключение разноцветного светодиода к плате Arduino (Рисунок создан в программе Fritzing)

Для управления разноцветным светодиодом нам нужно посылать плате Arduino три значения в диапазоне 0–100, задающие яркость каждого из составляющих его трех светодиодов. Например, чтобы задать полную яркость для всех трех составляющих светодиодов, нам нужно отправить значения 100,100,100. Решение этой задачи сопряжено с несколькими проблемами:

  • Нам нужно как-то отличить числа от запятых.
  • Последовательность символов нужно преобразовать в целые числа и сопоставить эти числа значениям в диапазоне 0–255 для управления светодиодами, используя функции analogWrite().
  • Нам также нужно учитывать, что мы работаем со светодиодом с общим анодом, и сигналы управления подаются на катоды составляющих его светодиодов. Иными словами, значение 255 выключит светодиод, а значение 0 включит его на полную яркость.
  • Необходимо учитывать возможность, что значения яркости могут состоять из одной, двух или трех цифр.
  • Наша программа должна быть достаточно надежной, способной обрабатывать полученные данные, форматирование которых не соответствует норме, таким образом, чтобы они не искажали данные последующих передач (в разумных пределах).

К счастью среда Arduino IDE содержит очень удобную функцию Serial.parseInt() для определения и извлечения целых чисел. Функция ожидает, пока во входной буфер последовательного порта не поступит нецифровое значение, после чего она преобразовывает все предыдущие цифры в целое число. В нашем случае, первые два значения считываются по обнаружению следующих за ними запятых, а последнее — после обнаружения символа перевода строки.

Чтобы увидеть работу этой функции, загрузите код из листинга 7.5 в свою плату Arduino.

Листинг 7.5. Программа list_control.ino для управления разноцветным светодиодом

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
// Отправляем одновременно несколько значений
// Данные отправляются в следующем формате: <0-100>,<0-100>,<0,100)>\n
// Здесь числа представляют яркость в процентах красного,
// зеленого и синего светодиодов
// Контакты платы Arduino, к которым подключаются катоды светодиодов
const int RED = 11;
const int GREEN = 10;
const int BLUE = 9;
void setup()
{
Serial.begin(9600); // Запускаем последовательный порт
// со скоростью в бодах = 9600
Serial.setTimeout(10); // Таймаут, в течение которого
// ожидать целое число
// Задаем выходной режим работы для контактов управления светодиодами
pinMode(RED, OUTPUT);
pinMode(GREEN, OUTPUT);
pinMode(BLUE, OUTPUT);
// Выключаем светодиоды
// Поскольку светодиод имеет общий анод, для выключения светодиода
// на катод подается сигнал высокого уровня
digitalWrite(RED, HIGH);
digitalWrite(GREEN, HIGH);
digitalWrite(BLUE, HIGH);
}
void loop()
{
// Считываем данные, когда они присутствуют в буфере
if (Serial.available() > 0)
{
// Ожидаем получить три целых числа по последовательному каналу связи
// Функция parseInt() заблокирует исполнение следующего кода
// до тех пора, пока не будет получено действительное целое число
// Целое число определяется по завершающей запятой
// или символу новой строки
// Недействительные символы удаляются перед найденным целым числом,
// а не после него
int val1 = Serial.parseInt();
int val2 = Serial.parseInt();
int val3 = Serial.parseInt();
// После считывания всех целых чисел, очищаем буфер
while (Serial.available())
{
Serial.read();
}
// Ограничиваем полученные значения диапазоном 0–100%
int val1c = constrain(val1,0,100);
int val2c = constrain(val2,0,100);
int val3c = constrain(val3,0,100);
// Сопоставляем аналоговые значения процентным значениям
int rval = map(val1c,0,100,255,0); // Первое действительное
// целое число
int gval = map(val2c,0,100,255,0); // Второе действительное
// целое число
int bval = map(val3c,0,100,255,0); // Третье действительное
// целое число
// Устанавливаем яркость светодиода
analogWrite(RED, rval);
analogWrite(GREEN, gval);
analogWrite(BLUE, bval);
// Выводим на экран использованные значения яркости
Serial.println("Red: " + String(val1c) + "%");
Serial.println("Green: " + String(val2c) + "%");
Serial.println("Blue: " + String(val3c) + "%\n");
}
}

В функции setup() запускаем последовательный интерфейс, а затем с помощью функции setTimeout() задаем величину таймаута, равную 10 мс для функции parseInt(). Если в течение 10 мс по последовательному каналу не будет получен следующий символ, эта функция считает завершенным извлечение текущего целого числа. Это просто мера предосторожности, чтобы не допустить зависания программы в случае отправки неполного списка значений.

Вспомним, что поскольку наш разноцветный светодиод с общим анодом, мы управляем составляющими светодиодами, подключая их катоды на землю. Таким образом, подача высокого уровня на катод светодиода препятствует протеканию тока через него, т. е. выключает светодиод. Подобным образом необходимо инвертировать значения аргументов функции analogWrite(), т. е. значение 255 выключает светодиод, а значение 0 включает его на полную яркость. Код главного цикла loop() ожидает наличия данных в буфере последовательного порта и извлекает из него первые три целых числа. Если буфер содержит какие-либо дополнительные данные, все они удаляются функцией Serial.read(), оставляя буфер пустым. Затем вызывается функция constrain(), ограничивающая все значения диапазоном 0–100. Далее функция map() сопоставляет 0 процентов значению 255, а 100 процентов значению 0, чтобы обеспечить использование функции analogWrite(). Наконец, устанавливаются уровни яркости составляющих цветных светодиодов, значения которых также дополнительно выводятся в окно монитора порта. Затем цикл ожидает поступления следующего набора команд.

Загрузите эту программу в свою плату Arduino и откройте окно монитора последовательного порта. Наберите в строке ввода монитора порта три числа со значениями в диапазоне 0–100, например, 80,10,80, и нажмите кнопку Отправить. Попробуйте немного поэкспериментировать, устанавливая разные цвета для светодиода.

Взаимодействие с компьютерной программой

Со временем вам надоест взаимодействовать с платой Arduino посредством программы монитора порта. К счастью, это не единственная программа, с помощью которой можно обмениваться информацией между компьютером и платой Arduino: практически любой язык программирования содержит библиотеки, позволяющие работать с последовательным портом компьютера. Из наиболее популярных языков программирования, обладающих обширными, хорошо задокументированными библиотеками последовательной связи, можно назвать, например, Python, Java, C, Node.js и другие. Таким образом, если вы знаете какой-либо из этих языков программирования, то сможете разрабатывать на нем программы для двустороннего обмена данными через последовательный интерфейс между компьютером и платой Arduino.

В этой книге мы будем использовать для этого язык Processing, поскольку он очень похож на язык программирования Arduino, с которым вы уже знакомы. Более того, язык программирования Arduino разработан на основе языка Processing. Сначала мы разработаем программу на языке Processing для считывания данных, получаемых в последовательный порт, а затем создадим простой графический интерфейс пользователя для отправки команд плате Arduino.

Интерфейс программирования языка Processing достаточно простой, похожий на интерфейс среды Arduino IDE. В этом разделе мы установим язык Processing на компьютер, а затем разработаем на нем простой графический интерфейс для визуального представления данных, получаемых с платы Arduino по последовательному каналу. Разобравшись с работой этой программы, мы создадим другую: графический интерфейс для передачи данных с компьютера на плату Arduino.

Установка Processing

Чтобы разрабатывать программы на языке Processing, нам нужно установить этот язык на свой компьютер. Загрузите установочный архив для своей операционной системы со страницы загрузки Processing (https://processing.org/download/) на свой компьютер. Для установки просто распакуйте загруженный архив в какую-либо папку. Запустите приложение Processing, выполнив двойной щелчок мышью по значку приложения. Должно открыться главное окно среды IDE, которое выглядит, как показано на рис. 7.12.

C:\Users\Anansi\AppData\Local\Temp\FineReader10\media\image12.jpeg

Рис. 7.12. Главное окно среды Processing IDE

Управление приложением Processing посредством платы Arduino

Для первого эксперимента с Processing мы будем управлять цветом окна приложения на компьютере с помощью потенциометра, подключенного к плате Arduino. Для этого подключите потенциометр к плате Arduino, руководствуясь монтажной схемой на рис. 7.6. Мы уже знаем, как передавать аналоговые значения сигнала потенциометра на компьютер. Тот факт, что принимаемые на компьютере данные подаются в программу на языке Processing, никак не влияет на способ их передачи.

Создайте новый скетч, вставьте в него код из листинга 7.6 и загрузите его в свою плату Arduino. Эта программа каждые 50 мс отправляет текущее значение величины сигнала с потенциометра на последовательный порт компьютера. Период передачи длительностью 50 мс важен. Если передавать значения с максимально возможной скоростью, то скетч Processing не сможет обрабатывать все поступающие значения, и со временем произойдет переполнение входного буфера последовательного порта компьютера.

Листинг 7.6. Программа Arduino arduino_read_pot.ino для передачи данных на компьютер

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Передача значения уровня сигнала с потенциометра на компьютер
const int POT=0; // Сигнал с потенциометра подается
// на аналоговый контакт A0
int val; // Переменная для хранения сопоставленного
// значения сигнала с потенциометра
void setup()
 
{
Serial.begin(9600); // Запускаем последовательную передачу данных
}
 
void loop()
{
val = map(analogRead(POT), 0, 1023, 0, 255); // Считываем сигнал
// с потенциометра и сопоставляем его
// значению в диапазоне 0–255
Serial.println(val); // Отправляем значение на компьютер
delay(50); // Выдерживаем паузу, чтобы
// не переполнить входной буфер
}

А теперь следует интересная часть задачи: создание скетча Processing для приема и обработки данных, передаваемых платой Arduino. Программа, приведенная в листинге 7.7, считывает данные из входного буфера последовательного порта компьютера, и изменяет яркость одного из основных цветов созданного им окна на основе значений, получаемых от Arduino. Создайте новый скетч Processing и скопируйте в него код из листинга 7.7. Затем вам нужно будет внести в скопированный код одну важную корректировку. В частности, скетчу Processing необходимо знать, на каком последовательном порту ожидать поступающие от Arduino данные. Это будет тот же самый порт, к которому подключена ваша плата Arduino. Поэтому в листинге 7.7 замените COM3 номером этого последовательного порта. (В системах под Linux и Mac OS обозначение этого порта будет выглядеть наподобие /dev/ttyUSB0). Чтобы избежать ошибок при ручном вводе, номер последовательного порта можно скопировать из среды Arduino IDE.

Листинг 7.7. Скетч processing_display_color.pde для приема данных по последовательному каналу и изменения цвета окна

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// Скетч Processing для приема данных по последовательному каналу
// и изменения цвета окна
// Импортируем и инициализируем библиотеку последовательного порта
import processing.serial.*;
Serial port;
float brightness = 0; // Переменная для хранения значения сигнала
// с потенциометра
 
void setup()
{
size(500,500); // Размер окна
port = new Serial(this, "COM3", 9600); // Инициализируем
// последовательный порт
port.bufferUntil('\n'); // Конфигурируем порт для чтения
// данных до символа новой строки
}
 
void draw()
{
background(0,0,brightness); // Обновляем окно
}
void serialEvent (Serial port)
{
brightness = float(port.readStringUntil('\n')); // Получаем значение
// от Arduino
}

Скопировав код в свой скетч и указав в нем правильный номер последовательного порта, проверьте, что программа монитора порта среды Arduino IDE не открыта. Последовательный порт компьютера может одновременно использоваться только одной программой. Нажмите кнопку Run окна Processing IDE (левая кнопка со значком треугольника в ней, расположенная в верхнем левом углу окна). Откроется небольшое окно (рис. 7.13). Вращайте подключенный к плате Arduino потенциометр; цвет окна должен плавно изменяться с черного на синий.

C:\Users\Anansi\AppData\Local\Temp\FineReader10\media\image13.jpeg

Increasing analog values

Увеличивающиеся аналоговые значения

Рис. 7.13. Пример исполнения скетча Processing для изменения цвета окна

Убедившись, что наш скетч работает должным образом, рассмотрим пошагово его код, чтобы разобраться, как он работает. В отличие от скетчей Arduino, библиотека для работы с последовательным портом не импортируется автоматически в программы на Processing. Эту задачу выполняет оператор import processing.serial.*, а оператор Serial port создает объект последовательной связи, называющийся port.

Подобно скетчам Arduino, программы на Processing содержат функцию setup(), которая исполняется один раз в начале кода. В данном коде Processing эта функция выполняет настройки последовательного порта и посредством команды size(500,500) создает окно размером 500 × 500 пикселов. Оператор port = new Serial(this, “COM3”, 9600) предоставляет Processing всю необходимую информацию для создания экземпляра объекта последовательного порта. При исполнении в этом скетче данный экземпляр порта (называющийся port) будет поддерживать связь через порт COM3 (или через другой конкретный порт) со скоростью 9600 бод. Скорость последовательной передачи данных должна быть одинаковой, как в скетче Arduino, так и в скетче Processing; в противном случае передаваемые символы будут искажаться в процессе приема. Оператор port.bufferUntil(‘\n’) дает указание Processing помещать полученные данные во входной буфер и не предпринимать никаких действий до тех пор, пока не будет получен символ новой строки.

В Processing вместо цикла loop() предусмотрены другие специальные функции, в частности, функции draw() и serialEvent(). Функция draw() Processing похожа на функцию loop() Arduino: она исполняется в бесконечном цикле и обновляет дисплей. Функция background() устанавливает цвет окна, задавая интенсивность составляющих цветов: красного, зеленого и синего (значения которых передаются функции в аргументах). В данном случае выходной сигнал от потенциометра управляет интенсивностью синего цвета, а для красного и зеленого цветов установлены нулевые значения. Можно изменить управляемый потенциометром цвет, просто разместив аргумент brightness в соответствующей позиции списка аргументов. Значения красного, зеленого и синего цветов задаются значениями в диапазоне от 0 до 255, поэтому значения выходного сигнала с потенциометра перед их передачей сопоставляются значениям в этом диапазоне.

Функция serialEvent() вызывается всякий раз, когда выполняется условие bufferUntil(), заданное в функции setup(). Таким условием является получение символа новой строки. Поступающие по последовательному каналу данные считываются в строку оператором port.readStringUntil(‘\n’). Строку можно рассматривать, как массив текстовых символов. Содержимое строки преобразуется в число с плавающей запятой посредством функции float(). Результат этой функции присваивается переменной brightness, в итоге изменяется цвет фона окна приложения.

Чтобы остановить исполнение приложения Processing, нажмите кнопку Stop в окне среды Processing IDE (круглая кнопка со значком квадрата внутри нее, расположенная справа от кнопки Run).

Передача скетчем Processing данных на плату Arduino

Очевидным следующим шагом будет передача данных в обратном направлении: с компьютера на Arduino. Для этого эксперимента нам нужно будет подключить к плате Arduino разноцветный светодиод с общим анодом, как показано на монтажной схеме на рис. 7.11 и загрузить в плату Arduino программу из листинга 7.5. Только теперь вместо отправки плате Arduino трех числовых значений через монитор порта, мы будем отправлять цвет, выбираемый с помощью палитры цветов, встроенной в Processing.

Создайте в Processing новый скетч, скопируйте в него код, приведенный в листинге 7.8, и запустите программу на исполнение. (Не забудьте изменить номер порта в коде на номер порта, используемый вашей платой Arduino, как это нужно было сделать в предыдущем скетче.)

Листинг 7.8. Скетч processing_control_RGB.pde для управления разноцветным светодиодом на Arduino

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import processing.serial.*; // Импортируем библиотеку serial
PImage img; // Объект изображения
Serial port; // Объект последовательного порта
void setup()
{
size(640,256); // Размер изображения в цветовой модели HSV
img = loadImage("hsv.jpg"); // Загружаем фоновое изображение
port = new Serial(this, "COM3", 9600); // Открываем последовательный
// порт
}
void draw()
{
background(0); // Черный фон
image(img,0,0); // Накладываемое изображение
}
void mousePressed()
{
color c = get(mouseX, mouseY); // Получаем цвет RGB в точке,
// где находится курсор мыши
int r = int(map(red(c), 0, 255, 0, 100));
int g = int(map(green(c), 0, 255, 0, 100));
int b = int(map(blue(c), 0, 255, 0, 100));
String colors = r+","+g+","+b+"\n"; // Извлекаем значения из цвета
print(colors); // Выводим значения цветов
// на экран для целей отладки
port.write(colors); // Отправляем значения
// на плату Arduino
}

Скетчи Processing автоматически загружают сопутствующие файлы из папки data, вложенной в папку скетча. Файл hsv.jpg входит в состав кода для этой главы. Загрузите его и поместите в папку data в папке своего скетча. По умолчанию Processing сохраняет скетчи в папке Processing, находящейся в папке Мои документы текущего пользователя, автоматически создавая папку для скетча с таким же самым названием, как и скетч. Структура папок проекта выглядит подобно показанной на рис. 7.14. Изображение в папке data будет использоваться в качестве цветовой палитры.

C:\Users\Anansi\AppData\Local\Temp\FineReader10\media\image14.jpeg

Рис. 7.14. Структура папок проекта Processing

Запустите скетч Processing на исполнение; отроется окно приложения, заполненное палитрой, как на рис. 7.15.

7

Рис. 7.15. Окно программы Processing для выбора цвета

Щелкайте мышью по разным цветам; в консоли окна среды Processing IDE будут выводиться значения составных цветов выбранного цвета, которые передаются на плату Arduino, вызывая соответствующее изменение цвета подключенного к ней разноцветного светодиода.

Убедившись, что все составляющие проекта функционируют должным образом, рассмотрим код скетча Processing более подробно, чтобы разобраться, как он работает. Как и в предыдущем скетче Processing, импортируется библиотека последовательного интерфейса serial и создается объект последовательного порта с названием port. Кроме этого создается объект типа PImage с названием img, который будет содержать фоновое изображение. В функции setup() выполняется инициализация последовательного порта, устанавливается размер окна приложения, равный размеру выводимого в нем изображения, и осуществляется импорт изображения в объект изображения, с помощью оператора img = loadImage(“hsv.jpg”). Операция импорта предполагает, что файл hsv.jpg находится в папке data текущего скетча Processing.

В функции draw() изображение загружается в окно посредством оператора image(img,0,0). В данном случае аргумент img обозначает изображение, которое мы хотим отображать в окне приложения, а аргументы 0,0 обозначают координаты, в которых нужно начинать выводить это изображение. Эти координаты представляют верхний левый угол окна приложения.

При каждом щелчке мышью по изображению палитры в окне приложения вызывается функция mousePressed(). Цвет пиксела, по которому пришелся щелчок, сохраняется в виде объекта типа color с названием c. Сам цвет извлекается методом get(), который предоставляет приложению информацию, откуда получить значения цвета (в данном случае, координаты X и Y щелчка мыши). Затем вызывается функция map(), которая сопоставляет значения составных цветов процентным значениям, ожидаемых скетчем Arduino. Полученные процентные значения далее конкатенируются в строку, которая отправляется по последовательному каналу на плату Arduino. Для справки эти значения также выводятся в консоли главного окна Processing IDE.

Подключите свою плату Arduino (с подсоединенным к ней разноцветным светодиодом) к компьютеру и загрузите в нее код из листинга 7.5. Запустите на исполнение скетч Processing (предварительно исправив в нем номер последовательного порта должным образом), и щелкайте по разным цветам в палитре в открывшемся окне приложения. Выбранный таким образом цвет должен устанавливаться на разноцветном светодиоде, подключенном к плате Arduino.

Резюме

В этой главе мы узнали следующее:

  • Платы Arduino подключаются к компьютеру через преобразователь USB/RS-232.
  • Для преобразования USB/RS-232 в разных платах Arduino может быть предусмотрена специальная микросхема или реализована встроенная поддержка функциональности USB.
  • Плата Arduino может отправлять данные на компьютер через интерфейс USB.
  • Для форматирования текста, выводимого в окне монитора порта, можно использовать символы новой строки и табуляции.
  • Данные передаются по последовательному каналу в виде символов, которые можно преобразовать в целые числа несколькими способами.
  • По последовательному каналу с компьютера в скетч Arduino можно отправлять наборы целых чисел, разделенных запятыми. В скетче Arduino составляющие числа можно извлечь из набора с помощью специальных функций и использовать их в качестве команд для скетча.
  • По последовательному каналу можно отправлять данные из скетча Arduino в программу на Processing, исполняющуюся на компьютере.
  • Из программы на Processing можно отравлять данные в скетч Arduino для управления подключенными к плате Arduino периферийными устройствами.
Опубликовано

Руководство по сопряжению модулей HC-05 (ver. 4.0 2019[1]) и HC-06 (BT SPP V3.0)

По материалам руководства к набору “Знакомьтесь! Я — Робот. Робототехнический набор + КНИГА

Для сопряжения модулей HC-05 (master-модуль) и HC-06 (slave-модуль) необходимо выполнить следующее:

  1. Установить одинаковую скорость передачи на обоих устройствах.
  2. Убедитесь, что пароли на HC-05 и HC-06 совпадают (при необходимости установить одинаковые)
  3. Определить MAC адрес HC-06
  4. Соединить HC-05 с HC-06
  5. Связать HC-06 с HC-05
  6. Настроить HC-05 на соединение только с сопряженным устройствам HC-06
  7. Соединить HC-05 с HC-06

Прежде чем приступить к сопряжению модулей, опишем их подключение к ПК для последующей настройки и тестирования соединения. Обращаем внимание, что кроме двух сопрягаемых модулей HC-05 и HC-06, нам понадобится дополнительный плата Arduino и модуль HC-05, который поможет определить MAC-адрес HC-06 в каждой паре. В качестве дополнительного модуля мы использовали HC-05 версии 3.0-20170601. Мы указываем конкретные версии модулей, т.к. выяснили, что порядок настройка модулей разных версий может немного отличаться.


Примечание

Также для определения MAC-адреса можно использовать смартфон на базе Android с установленной терминальной программой (например, Serial Bluetooth Terminal или Bluetooth Terminal HC-05)


1. Подключение модулей Bluetooth к ПК

1.1. Подключение модуля HC-06

# Действия Примечание
1 Подключаем Bluetooth HC-06 к преобразователю USB-UART с помощью проводов «мама-мама».

01_BT-USB-UART-HC06

Обратите внимание, контакт «Transmit Data» одного устройства подключен к контакту «Receive Data» другого!
2 Включаем преобразователь USB-UART в разъем USB ПК.
3 Запускаем Arduino IDE.
4 Выбираем порт, к которому подключен USB-UART (Инструменты | Порт)

5 Открываем монитор последовательного порта (Инструменты | Монитор порта). Выбираем настройки:.

Скорость 9600 бод

Режим «Нет конца строки»

6 Для контроля правильности подключения вводим команду

AT

и получаем в ответ отклик от модуля Bluetooth HC-06

OK

1.2. Подключение master-модуля HC-05 (ver. 4.0). Модуль брелка

# Действия Примечание
1 Подключаем Bluetooth HC-05 (ver. 4.0) к преобразователю USB-UART с помощью проводов «мама-мама» как показано на рис ниже.

01b_BT-USB-UART-HC05

Обратите внимание, контакт «Transmit Data» одного устройства подключен к контакту «Receive Data» другого!
2 Включаем преобразователь USB-UART в разъем USB ПК. Светодиод на BT будет медленно мигать. Обращаем внимание, что подача напряжения 3,3 В на контакт EN переводит BT при подключении к ПК в Режим AT-команд #1.

В этом режиме BT работает на скорости 38400 бод и реагирует на определенный набор команд.

3 Запускаем Arduino IDE.
4 Выбираем порт, которому подключен USB-UART (Инструменты | Порт)

5 Открываем монитор последовательного порта (Инструменты | Монитор порта). Настраиваем Arduino.

Скорость 38400 бод

Режим «NL & CR»

6 Для контроля правильности подключения вводим команду

AT

и получаем в ответ отклик от модуля Bluetooth HC-06

OK

1.3. Подключение master-модуля HC-05 (ver. 3.0 20170601). Модуль для определения MAC-адреса HC-06

Этот модуль мы используем, чтобы создать «испытательный стенд» для определения MAC-адреса модулей HC-06, которые мы будем сопрягать с «брелком». Он является «стационарным» устройством для определения адресов всех модулей HC-06 и настраивается только один раз перед началом работы.

1 этап

# Действия Примечание
1. Подключаем Bluetooth HC-05 (ver. 3.0) к плате Arduino Uno, как показано на рисунке.

Подключение HC-05 для для определения MAC-адреса

2. Запускаем Arduino IDE.
3. Откройте в Arduino IDE и загрузите скетч Bluetooth_INQ-1.ino на плату Arduino UNO (см. внизу)..
4 Переведите BT модуль в «первый» режим ввода команд. Для этого

– Отключите провод питания модуля BT (VCC)

– Подайте на пин EN напряжение 3,5В (можно и 5 В) и не отключайте. Напряжение можно подать от платы Arduino Uno (или кантакта 3V3 преобразователя USB-UART/TTL CP2102)

– Снова подключите провод питания модуля BT (VCC)

– Если вы успешно вошли в режим AT-команд #1, то светодиод будет медленно мигать, и вы сможете подключиться к нему со скоростью 38400 бод с помощью загруженного скетча..

BT V3.0 есть два AT-режима, которые «понимают» несколько разные наборы команд.

Вместо подачи на контакт EN напряжения +3,5 В можно при запуске держать нажатой кнопку на модуле BT и затем зафиксировать ее в таком положении, например прищепкой или «крокодилом».

5 Введите следующие AT-команды

AT
AT+UART=115000,0,0
AT+RMAAD
AT+ROLE=1
AT+RESET
AT+CMODE=1
AT+INQM=0,5,5

AT+UART=115000,0,0 устанавливает скорость. 115200.AT+RMAAD очищает все сохраненные соединения

AT+ROLE=1 устанавливает его в качестве ведущего

AT +RESET устройство перезапускается для перехода на master

AT+CMODE=1 принимает все виды устройств

AT+INQM=0,5,5 запрашивает в стандартном режиме, с 5 максимальными подключениями или 5 секундами


Листинг 1. Bluetooth_INQ-1.ino

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <SoftwareSerial.h>
SoftwareSerial BTserial(2, 3); // RX | TX`
<strong>const long baudRate = 38400; </strong>
char c=' ';
boolean NL = true;
void setup()
{
Serial.begin(9600);
Serial.print("Sketch: "); Serial.println(__FILE__);
Serial.print("Uploaded: "); Serial.println(__DATE__);
Serial.println(" ");
BTserial.begin(baudRate);
Serial.print("BTserial started at "); Serial.println(baudRate);
Serial.println(" ");
BTserial.println("AT");
delay(1000);
}
 
void loop()
{
// Read from the Bluetooth module and send to the Arduino Serial Monitor
if (BTserial.available())
{
c = BTserial.read();
Serial.write(c);
}
// Read from the Serial Monitor and send to the Bluetooth module
if (Serial.available())
{
c = Serial.read();
BTserial.write(c);
// Echo the user input to the main window. The "&gt;" character indicates the user entered text.
if (NL) { Serial.print("&gt;"); NL = false; }
Serial.write(c);
if (c==10) { NL = true; }
}
}

2 этап

1 Загрузите на плату Arduino скетч Bluetooth_INQ-2.ino.

По сравнению с Bluetooth_INQ-1.ino в нем изменен только один параметр.

const long baudRate = 115200;

т.к. вы на первом этапе уже задали для модуля BT скорость 115200 бод

2. Переведите BT модуль во «второй» режим ввода команд. Для этого:

  • включите питание (не удерживая кнопку и не подавая питание на пин EN). Светодиод LED на модуле BT начинет быстро мигать.
  • подайте питание +3,5 В на пин EN (или нажмите и удерживайте кнопку). Светодиод будет продолжать быстро мигать, но теперь вы можете подключиться к устройству с настроенной скоростью передачи данных.
Пример

Uploaded: Sep 3 2021
BTserial started at 9600
AT
OK
AT+STATE
+STATE:CONNECTED
OK
AT+INIT
ERROR:(17)
AT+INQ
+INQ:20:4:BDD6A7,1F00,7FFF
+INQ:20:4:BDD6A7,1F00,7FFF

Откройте Монитор последовательного порта и введите команды.

AT
AT+STATE?
AT + RMAAD
AT + ROLE= 1
AT + RESET
AT + RMAAD очищает все ранее сопряженные устройства.
AT + ROLE = 1 переводит HC-05 в режим Master.
AT + RESET сбрасывает HC-05. Иногда это необходимо после смены ролей.

HC-05_to_HC-06-HC-05_Connect01
AT + CMODE = 0
AT + INQM = 0,5,9
AT + INIT
AT + INQ
AT + CMODE = 0 позволяет HC-05 подключаться к любому устройству.
AT + INQM = 0,5,9 устанавливает запрос для поиска до 5 устройств в течение 9 секунд.
AT + INIT инициирует профиль SPP. Если SPP уже активен, вы получите сообщение об ошибке (17), которое можно игнорировать.
AT + INQ выполняет поиск других устройств Bluetooth.
HC-05_to_HC-06-HC-05_Connect02
На экране Монитора порта появится список обнаруженных устройств, например

+ INQ: A854: B2: 3FB035,8043C, 7FFF

Первая группа цифр определяет MAC- адрес найденного HС-06.

На приведенном выше снимке экрана видно, что HC-05 обнаружил 2 устройства Bluetooth.
+ INQ: A854: B2: 3FB035,8043C, 7FFF
+ INQ: 3014: 10: 171179,1F00,7FFFЧтобы узнать имя найденного устройства, мы можем использовать командуAT + RNAME?АдресДля первого устройства это будет команда

AT + RNAME?
A854, B2,3FB035

Для второго устройства

AT + RNAME?
3014,10,171179

Листинг 2. Bluetooth_INQ-2.ino

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include &lt;SoftwareSerial.h&gt;
SoftwareSerial BTserial(2, 3); // RX | TX`
//const long baudRate = 38400;
<strong>const long baudRate = 115200; </strong>
char c=' ';
boolean NL = true;
void setup()
{
Serial.begin(9600);
Serial.print("Sketch: "); Serial.println(__FILE__);
Serial.print("Uploaded: "); Serial.println(__DATE__);
Serial.println(" ");
BTserial.begin(baudRate);
Serial.print("BTserial started at "); Serial.println(baudRate);
Serial.println(" ");
}
void loop()
{
// Read from the Bluetooth module and send to the Arduino Serial Monitor
if (BTserial.available())
{
c = BTserial.read();
Serial.write(c);
}
// Read from the Serial Monitor and send to the Bluetooth module
if (Serial.available())
{
c = Serial.read();
BTserial.write(c);
// Echo the user input to the main window. The "&gt;" character indicates the user entered text.
if (NL) { Serial.print("&gt;"); NL = false; }
Serial.write(c);
if (c==10) { NL = true; }
}
}

2. Настройка модулей

2.1. Установка скорости и пароля HC-06

ATOKAT+VERSIONOKlinvorV1.8AT+BAUD8OK115200

# Действия Примечание
1 Отправляем команду AT, модуль отвечает OK. Все в порядке, можно продолжать.

Должен быть выбран режим ввода Мониторе порта «Нет конца строки»!

AT

OK

2 Изменяем скорость обмена на 115200

Вводим команду AT+BAUD8

AT + BAUD8 устанавливает скорость обмена 115200 для модуля Bluetooth HC-06

AT+VERSIONBT SPP V3.0
AT+BAUD4
OK9600
ATOKAT+VERSIONOKlinvorV1.8AT+BAUD8OK115200
3 Изменяем пароль на 1234

Вводим команду AT+PIN1234

AT+PIN1234

OK1234

Примечание

Полезно сразу пометить подготовленный модуль. Например, приклеить скотчем кусочек бумаги и записать прямо на нем всю нужную информацию.

2.2. Определение MAC-адреса HC-06

1 Переведите модуль BT HC-05 (ver.3.0 2017 20170601) во «второй» режим ввода команд. Для этого:

  • включите питание (не удерживая кнопку и не подавая питание на пин EN). Светодиод LED на модуле BT начинает быстро мигать.
  • подайте питание +3,5 В на пин EN (или нажмите и удерживайте кнопку). Светодиод будет продолжать быстро мигать, но теперь вы можете подключиться к устройству с настроенной скоростью передачи данных.
2 Выключите и включите BT HC-06
3 Откройте Монитор порта и запишите MAC-адрес устройств, которые обнаружил ваш «измерительный стенд» на базе bluetooth HC-05 (ver.3.0 2017 20170601)

2.3. Настройка HC-05 (ver. 4.0) и сопряжение BT-модуля

1 этап

1. Подключите BT-модуль в режиме AT-команд #1 (на контакт EN при включении подано напряжение 3,3 В)

AT#1-BT-USB-UART

Если вы успешно вошли в режим AT, то светодиод на BT будет медленно мигать, и вы сможете подключиться к модулю со скоростью 38400 бод с помощью загруженного скетча.
2 Подключитесь к модулю с помощью Монитора порта (или другой терминальной программы, например Termite) на скорости 38400
3 Настройте скорость и пароль модуля HC-05 (ver. 4.0) с помощью следующих AT-команд:

AT
AT+NAME=HC-05-20-4-BDD6A7
AT+PSWD=1234
AT+STATE?
AT + RMAAD
AT + ROLE= 1
AT + CMODE = 1
AT+UART=115200,0,0
AT+RESET

AT + CMODE = 1 — модуль в роли ведущего (HC-05) подключается к любому ведомому Bluetooth устройству. В нашем случае — и к HC-06

В качестве имени HC-05 удобно использовать MAC-адрес подключенного к нему HC-06

2 этап

1 Отключите питание BT HC-06 slave, к которому вы подключаете HC-05
2. Подключите модуль HC-05 к ПК в Режиме AT#2, пошагово как показано на рис. ниже.

AT#2_BT-USB-UART

3 Соедините HC-05 (ver.4.0) с HC-06

Для создания пары мы используем команду

AT + PAIR = <addr>, <timeout>.

Введите команду

AT + PAIR = 20,4,BDD6A7,9

Если HC-05 не может соединиться с HC-06 в течение 9 секунд, вы получите сообщение об ошибке.

Если соединение прошло успешно, будет выведено «ОК».

MAC-адрес модуля HC-06 мы определили на предыдущем шаге 1.3 (2 этап). В нашем примере это 20,4,BDD6A7
4 Свяжите HC-06 (ver.4.0) с HC-05.

Привязка просходит с помощью команды

AT + BIND = <addr>

В нашем примере это будет команда

AT + BIND = 20,4,BDD6A7

5 Настройте HC-05 на подключение только к сопряженным устройствам.

Делаем это с помощью команды CMODE

AT + CMODE = 0

AT + CMODE = 0 — модуль в роли ведущего подключается только к тому Bluetooth устройству, адрес которого указан командой AT+BIND. В нашем случае HC-05 (ver.4.0) подключается к HC-06
6 Ссылка на HC-06

Используйте команду ссылки

AT + LINK = <addr>

В нашем случае

AT + LINK = 20,4,BDD6A7

Если все в порядке, вы получите ответ «ОК»

 

7
  • Для проверки соединения
  • 1. Подключите питание к вашему модуля BT HC-06. Светодиод на модуле начинает быстро мигать.
  • 2. Подключите питание к вашему модуля BT HC-05. Светодиод на модуле также начинает быстро мигать.
  • 3. Если вы все сделали правильно, то через 5-10 сек индикация изменится.
  • Светодиод на HC-05 (ver.4.0) будет мигать 2 раза подряд каждые 2 секунды.
  • Светодиод на HC-06 должен гореть постоянно.

Поздравляем Вы успешно настроили HC-05 и сопрягли его с HC-06!

Теперь HC-05 будет автоматически подключаться к HC-06 при каждом включении и входить в режим связи.

Если вы хотите продолжить работу в режиме AT, вам необходимо перезагрузить модуль с помощью контакта 34 HIGH или с замкнутым кнопочным переключателем.

3. Проверка работы пары HC05-HC-06

Осталось проверить работоспособность созданной пары Bluetooth модулей.

  1. Отключим питание slave-устройства HC-06.
  2. Отсоединим преобразователь USB-UART от компьютера и отсоединим провод «+3.3V — EN», больше мы в нем не нуждаемся. Master-модуль остается подключенным лишь четырьмя проводами к USB-UART, теперь это законченное устройство. Для удобства можно заменить провода на более короткие, скрепить изолентой.
1. Установите модуль HC-06 в плату LV. Включаем питание. Модуль часто замигал, он готов к новому сеансу связи. index
2 Извлеките и вновь установите «брелок» в USB ПК. Пара секунд, и светодиодная индикация изменилась. Работает!
3 Откройте mBlock и выберите номер порта, к которому подключен HC-05 (ver. 4.0).

Соединить | Serial Port | Номер COM-порта

(в нашем случае это COM13)

4
5 Выберите вкладку simpleBot Programm и нажмите на блок _on board BUZZER. В ответ вы должны услышать звук динамика на плате LV.

Это означате, что все в порядке!

6

Примечание

Обратите внимание, что компьютер вообще ничего не знает о существовании Bluetooth. Для него наш «брелок» — просто COM-порт. Соответственно, мы больше не нуждаемся ни в драйверах Bluetooth, ни в какой бы то ни было его настройке Bluetooth. И потраченное нами время с лихвой будет компенсировано во время занятий.


Примечание

Стоит добавить, что slave-модуль по-прежнему допускает соединение с любого Bluetooth-устройства. Мы сможем управлять робоплатформой и с компьютера, и с планшета, а теперь еще при помощи пульта дистанционного управления на базе Arduino.


HC05-HC06

  1. Речь идет об HC-05 версии 4.0-20190728
Опубликовано

Установка имени, скорости и пароля Bluetooth-модуля HC-06

По материалам руководства к набору “Знакомьтесь! Я — Робот. Робототехнический набор + КНИГА

Вы можете самостоятельно с помощью AT-команд установить для модуля Bluetooth имя, пароль и скорость обмена.

Для этого:

1. Подключите модуль к плате, как показано на рисунке ниже. Включите питание на плате с помощью ползункового переключателя (ON).

2. Откройте среду разработки Arduino IDE.

3. Выберите плату Arduino UNO (Инструменты | Arduino AVR Boards | Arduino Uno) и номер Порта.

4. Загрузите на плату скетч для ввода AT-команд в модуль Bluetooth.


Примечание

В строке mySerial.begin(9600) указана скорость передачи данных, установленная на модуле Bluetooth. Набор комплектуется модулем, для которого уже установлена «правильная» скорость — 115 200 бод. В новом Bluetooth-модуле HC-06 по умолчанию установлена скорость 9600 бод.


Листинг 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "SoftwareSerial.h" // подключаем библиотеку
SoftwareSerial mySerial(9,10); // указываем пины tx и rx
 
void setup() {
pinMode(9,INPUT);
pinMode(10,OUTPUT);
Serial.begin(9600); // включаем hardware-порт
mySerial.begin(9600); // включаем software-порт
Serial.println("start setting");
}
 
void loop() {
if (mySerial.available()) {
char c = mySerial.read(); // читаем из software-порта
Serial.print(c); // пишем в hardware-порт
}
if (Serial.available()) {
char c = Serial.read(); // читаем из hardware-порта
mySerial.write(c); // пишем в software-порт
}
}

5. Откройте Монитор порта и выберите скорость обмена 9600 бод и режим ввода Нет конца строки.

6. Отправьте на модуль команду AT (без кавычек). Если модуль ответит OK, то всё в порядке, можно продолжать.

7. Для обмена Bluetooth-модуля HC-06 с приложением mBlock следует установить скорость модуля равной 115200 бод. Для этого в верхнем поле Монитора порта введите AT-команду

AT+BAUD8

и нажмите кнопку Отправить.

В ответ вы получите сообщение от модуля Bluetooth:

OK115200

Модуль готов к установке в стандартный разъём на плате робота.

В таблице ниже приведены AT-команды, доступные для модуля HC-06.

Список AT-команд для модуля HC-06

Назначение AT-команда Параметры Ответ от модуля
1 Изменение пароля AT+PIN1234 Здесь 1234 — пароль OK1234
2 Изменение имени AT+NAMEHC-06-1 Здесь HC-06-1 — новый пароль OKsetname
3 Узнать версию модуля AT+VERSION BT SPP V3.0
4 Изменение скорости AT+BAUDx BAUD1 – 1200 бод
BAUD2 – 2400 бод
BAUD3 – 4800 бод
BAUD4 – 9600 бод
BAUD5 – 19200 бод
BAUD6 – 38400 бод
BAUD7 – 57600 бод
BAUD8 – 115200 бод
BAUD9 – 230400 бод
OK1200

OK2400

OK4800

OK9600

OK19200

OK38400

OK57600

OK115200

OK230400

 


Совет

Полезно будет как-то пометить подготовленный модуль, например, подклеить скотчем кусочек бумаги и записать прямо на нём скорость и имя.

Опубликовано

Подключение робота к настольному компьютеру по каналу Bluetooth (Windows 11)

По материалам руководства к набору “Знакомьтесь! Я — Робот. Робототехнический набор + КНИГА

Для подключения робота к настольному персональному компьютеру (ПК) по каналу Bluetooth (без кабеля USB) вам потребуется приобрести внешний Bluetooth-адаптер, который подключается в USB-разъём ПК. В настоящее время в специализированных магазинах представлено большое количество подобных адаптеров. Мы тестировали подключение с недорогим адаптерами в ценовом диапазоне 250–300 руб.

Подключение осуществляется в четыре этапа:

  1. Установка драйверов для Bluetooth-адаптера.
  2. Сопряжение модуля Bluetooth HC-06 и компьютера.
  3. Настройка параметров.
  4. Подключение модуля HC-06 к компьютеру.

1. Установка драйвера адаптера Bluetooth

1. Установите Bluetooth-адаптер в разъём USB на настольном компьютере.

2. Практически во всех случаях для Windows 10/11 драйвер для Bluetooth установится автоматически, и в области уведомлений Windows появится значок Bluetooth .

3. В Диспетчере устройств должны появиться раздел Bluetooth и сам адаптер. Если адаптер не будет опознан и будет отображаться как неизвестное устройство (другое устройство), придётся устанавливать драйверы вручную.

2. Сопряжение модуля Bluetooth HC-06 и ПК

1. Установите модуль HC-06 на плату SPBot и включите питание. Светодиод на Bluetooth начинает часто мигать. Кабель USB подключать не надо.

2. Откроется окно Параметры | Bluetooth и другие устройства. Нажмите кнопку + Добавление Bluetooth или другого устройства.

3. Щёлкните по команде  Bluetooth.

4. Появится список устройств Bluetooth, обнаруженных компьютером поблизости. Среди обнаруженных устройств вы увидите и ваш модуль HC-06. Выберите его…

5. Введите пароль (обычно для HC-06 это 1234 или 0000) и нажмите кнопку Подключиться.

6. Появится сообщение «Ваше устройство готово к использованию!». Нажмите кнопку Готово внизу окна Добавить устройство. Светодиод на модуле Bluetooth HC-06 будет продолжать быстро мигать.

3. Настройка параметров

Вновь откройте правой кнопкой мыши контекстное меню приложения и выберите команду Открыть параметры.

Установите флажки, как показано на рисунке справа.

Выберите вкладку COM-порты и запишите, какие именно COM-порты использует ваше сопряжение.

Знание номеров портов вам понадобится, чтобы установить скорость 115 200 бод. Именно на этой скорости идёт обмен информацией с mBlock.

Примечание

По умолчанию для HC-06 установлена скорость 9600 бод. Для набора скорость увеличена до 115 200 бод с помощью AT-команд.

3. Откройте Диспетчер устройств.

4. В окне Диспетчер устройств в группе Порты (COM и LPT) вы увидите порты, выделенные для модуля HC-06. В нашем случае это COM32 и COM33.

5. Дважды щёлкните мышью по названию порта, в открывшемся окне Свойства выберите вкладку Параметры порта и установите параметр Бит в секунду в значение 115200.

Выполните эти действия для обоих портов (в нашем случае для COM32 и COM33).

4. Подключение HC-06 к компьютеру с помощью mBlock

1. В меню программы mBlock выберите команды Соединить | Блютус | Discover.

2. Компьютер начнёт поиск устройств Bluetooth, расположенных поблизости.

3. По окончании поиска на экране появится окно со списком всех обнаруженных устройств Bluetooth с указанием их имени и MAC-адреса. Выберите из списка наш модуль HC-06-20190901.

4. Появится окно Bluetooth Connected, и в течение 15–20 секунд будет осуществляться подключение HC-06 к роботу SPBot. По окончании соединения светодиод на модуле Bluetooth перестанет мигать. Закройте окно Bluetooth Connected.

5. Всё готово! Модуль HC-06 подключен к программе mBlock.

При повторном запуске приложения mBlock наш модуль уже будет прописан в меню программы Соединить | Блютус. Выберите HC-06-20190901 (00:21:06:08:51:05), и через 15–20 секунд модуль будет подключен.

Опубликовано

Подключение модуля Bluetooth HC-06 к ноутбуку (Windows 10/11)

По материалам руководства к набору “Знакомьтесь! Я — Робот. Робототехнический набор + КНИГА

Все современные ноутбуки оборудованы модулем Bluetooth (BT). Это позволяет подключиться к роботу по каналу BT без кабеля USB. Ниже это показано на примере ОС Windows 11.

Подключение осуществляется в три этапа:

  1. Сопряжение модуля Bluetooth HC-06 и ноутбука.
  2. Настройка COM-порта ноутбука на скорость 115 200 бод.
  3. Подключение модуля HC-06 к ноутбуку.

1. Сопряжение модуля Bluetooth HC-06 и ноутбука в Windows 11

1. Установите модуль HC-06 на плату SPBot и включите питание. Светодиод на Bluetooth начинает часто мигать. Кабель USB подключать не надо.

2. Откройте окно Параметры | Bluetooth и устройства. Нажмите на кнопку + Добавить устройство.

3. Щёлкните по команде  Bluetooth.

4. Появится список устройств Bluetooth, обнаруженных ноутбуком поблизости. Среди обнаруженных устройств вы увидите и ваш модуль HC-06. Выберите его…

5. Введите пароль (обычно для HC-06 это 1234 или 0000) и нажмите кнопку Подключиться.

6. Появится сообщение «Ваше устройство готово к использованию!». Нажмите кнопку Готово внизу окна Добавить устройство. Светодиод на модуле Bluetooth HC-06 будет продолжать быстро мигать.

7. Окно Добавить устройство закроется, и вы увидите, что ваш модуль BT HC-06 появился в списке устройств Bluetooth, которые сопряжены с вашим компьютером.

2. Настройка для COM-портов скорости на 115 200 бод

1. Прежде всего необходимо определить номер COM-порта, к которому подключен модуль HC-06. Для этого выберите команду Параметры | Bluetooth и устройства | Устройства | Дополнительные параметры Bluetooth.

2. В окне Параметры Bluetooth щёлкните по вкладке COM-порты, и вы увидите номера COM-портов, выделенных на ноутбуке для вашего HC-06.

3. Откройте Диспетчер устройств. Для этого щёлкните правой кнопкой мыши по логотипу Windows (меню Пуск) или нажмите сочетание клавиш <Win>+<X> и выберите Диспетчер устройств из списка параметров.

4. В окне Диспетчер устройств вы увидите в группе Порты (COM и LPT) порты, выделенные для модуля HC-06. В нашем случае это COM3 и COM4.

5. Дважды щёлкните мышью по названию порта, в открывшемся окне Свойства выберите вкладку Параметры порта и установите параметр Бит в секунду в значение 115200. Выполните эти действия для обоих портов (в нашем случае для COM3 и COM4).

3. Подключение HC-06 к ноутбуку с помощью mBlock

1. В верхнем меню программы mBlock выберите команды Соединить | Блютус | Discover.

2. Ноутбук начнёт поиск устройств Bluetooth, расположенных поблизости.

3. По окончании поиска на экране появится окно со списком всех обнаруженных устройств Bluetooth с указанием их имени и MAC-адреса. Выберите из списка наш модуль HC-06.

4. Появится окно Bluetooth Connected, и в течение 15–20 секунд будет осуществлять подключение HC-06 к роботу SPBot. По окончании соединения светодиод на модуле Bluetooth перестанет мигать. Закройте окно Bluetooth Connected.

5. Всё готово! Модуль HC-06 подключен к программе mBlock.

При повторном запуске приложения mBlock наш модуль уже будет прописан в меню программы Соединить | Блютус. Выберите HC-06 (00:20:04:BD:D3:A9), и через 15–20 секунд модуль будет подключен.

Опубликовано

Ходовая часть мобильных роботов

По материалам книги “Мобильные роботы на базе Arduino, 3-е изд.“, 3-е изд. (автор Михаил Момот) (глава 5. Ходовая часть)

Мобильные роботы на базе Arduino, 3-е изд.

Выбор двигателей

Итак, когда структура ходовой части выбрана, следует определить, какие двигатели будет использовать наш робот. На выбор: коллекторные двигатели постоянного тока с редуктором, сервопривод MG995 3600 постоянного вращения (скорость вращения задается сигналом на входе управления), шаговые двигатели. Их параметры представлены в табл. 5.1.

Таблица 5.1. Сравнительные параметры различных типов двигателей

Сравниваемые параметры Двигатель
постоянного тока с понижающим редуктором
Сервопривод MG995 3600 Шаговый
двигатель
Количество задействованных портов микроконтроллера для управления 2–3 1 2–3
Скорость реакции на поступившую команду, сек (чем больше, тем хуже) ~1/100 ~1/50 ~1/1000
Скорость вращения (с учетом понижающего редуктора), об/мин 10–240 1–60 0,1–300
Стоимость (за единицу принята стоимость двигателя постоянного тока с редуктором), сравниваются двигатели, равные по мощности 1 4 6
Минимальное количество портов управления ходовой частью для проекта колесного робота с двумя ведущими колесами 4 2 4+1
дополнительный контакт требуется для отключения всех моторов

Что мы здесь видим?

  • Коллекторные моторы с пластиковым редуктором — самые простые и самые дешевые.
  • Сервопривод MG995 3600 — наиболее экономичный по ресурсам контроллера Arduino. При его использовании хорошо регулируется скорость движения робота, если скорость колес нужно менять постоянно и держать в заданных пределах. Скорость оборота колеса, вращаемого сервоприводом, зависит только от установленного на порту управления значения сигнала, и при увеличении сопротивления (когда, например, робот движется в гору) меняется слабо, в то время как двигатель постоянного тока без обратной связи по скорости изменяет скорость своего вращения в зависимости от нагрузки.
  • Шаговый двигатель следует применять там, где нужна точность, и если это необходимо, обратитесь к книге «Мобильные роботы на базе ESP32 в среде Arduino IDE»[1], там как раз используются шаговые моторы в качестве ходовой части. Шаговым двигателем также можно держать постоянную скорость.

Все три вида двигателей применяются в ходовых частях колесных роботов, и выбор зависит от требований, предъявляемых к роботу.

Однако мы только учимся, и сверхскоростной болид нам ни к чему, скорость реакции и скорость вращения не важны, а вот низкая стоимость имеет определяющее значение на начальном этапе. Поэтому для дальнейшего рассмотрения выбираем самое распространенное решение: коллекторный мотор с пластиковым редуктором.

Драйверы двигателей

Платы Arduino, кроме специализированных, не поддерживают возможностей управления двигателями постоянного тока напрямую, и для этого нужно применять специализированные микросхемы, называемые драйверами двигателей. Наиболее распространенные из них приведены в табл. 5.2.

Таблица 5.2. Специализированные микросхемы драйверов двигателей (на платах)

Характеристики TB6612FNG
(рис. 5.6)
MX1508
(рис. 5.7)
L298N
(рис. 5.8)
Максимальный ток на канал, А 1,2 1,2 2
Количество подключаемых коллектроных моторов 2 2 2
Максимальное напряжение питания, В 13,5 10 35
Минимальное напряжение питания, В 2,5 2,5 6
Встроенная диодная защита от паразитных токов Есть Есть Есть

Все три платы драйверов подходят для управления направлением вращения и мощностью коллекторных двигателей постоянного тока. Они также могут применяться и для управления шаговыми двигателями.

Драйверы_2

Рис. 5.6. Плата драйвера TB6612FNG

Драйверы TB6612 и L298N имеют отдельные входы управления мощностью моторов (PWMA–PWMB и ENA–ENB соответственно), но если на эти входы подать высокое логическое напряжение (5 вольт), то управление драйверами TB6612, L298N и MX1508 будет осуществляться схоже по входам AIN1–AIN2 и BIN1–BIN2 — для TB6612, а также IN1–IN2 и IN3–IN4 — для L298N и MX1508. Именно такие режимы работы мы и будем использовать, чтобы наша программа вела себя одинаково и независимо от того, какой драйвер моторов вы решили использовать в своей модели.

5

Рис. 5.7. Плата драйвера MX1508

5

Рис. 5.8. Плата драйвера L298N

 

В табл. 5.3 приведены значения сигналов на входах и показана соответствующая реакция двигателя.

Таблица 5.3. Значения сигналов на входах и соответствующая реакция двигателя

IN1 (AIN1) IN2 (AIN2) Мотор A (направление вращения условное)
0 0 Отключен
0 1 Вал вращается против часовой стрелки
1 0 Вал вращается по часовой стрелке
1 1 Отключен

Таблица 5.3 (окончание)

IN3 (BIN1) IN4 (BIN2) Мотор B (направление вращения условное)
0 0 Отключен
0 1 Вал вращается против часовой стрелки
1 0 Вал вращается по часовой стрелке
1 1 Отключен

 

Сборка макета

Для закрепления материала полезно собрать несколько макетов, которые продемонстрируют работу двигателей постоянного тока вместе с драйвером L298N, можно также выполнить этот тест и на MX1508, а подключение TB6612FNG мы рассмотрим позднее.

Управляем двигателем без Arduino

Возьмем драйвер L298N (или MX1508), двигатели постоянного тока, аккумуляторы с боксом, провода, керамические конденсаторы 0,1 мкФ (маркируются числом 104) — они нужны для исключения электромагнитных наводок, которые возникают при работе двигателей и могут стать причиной сбоев в работе электроники робота, и паяльник. При пайке легко испортить поверхность стола, поэтому используйте фанеру или постелите на место работы с паяльником пару листов бумаги.

Очистим и залудим паяльником двужильный провод (или пару одножильных),
затем залудим контакты двигателя и ножки конденсатора (рис. 5.9).

2017-01-28 12-10-46

Рис. 5.9. Двигатель постоянного тока, керамический конденсатор и провода

Обмотаем ножки конденсатора вокруг залуженных кончиков проводов, как показано на рис. 5.10, — теперь ножки конденсатора хорошо держатся на проводе, и их легко можно припаять (рис. 5.11).

2017-01-28 12-13-24 2017-01-28 12-14-34 (2)
Рис. 5.10. Ножки конденсатора обмотаны
вокруг оголенных концов провода
Рис. 5.11. Пайка конденсатора

Далее припаяем кончики проводов к залуженным контактам двигателя (рис. 5.12). Если лужение контактов двигателя проходит плохо, аккуратно зачистите контакты перочинным ножом или обработайте паяльной кислотой (после паяльной кислоты нужно промыть контакты спиртом или водой).

Готовый к работе двигатель показан на рис. 5.13.

2017-01-28 12-16-20

Рис. 5.12. Припаивание проводов к контактам двигателя

5

Рис. 5.13. Двигатель с припаянными проводами и конденсатором

Картинка мотор+аккумул_bb

Рис. 5.14. Схема тестирования двигателя

Качество пайки можно проверить, присоединив двигатель к аккумуляторам (рис. 5.14), — если двигатель не работает, значит, пайка выполнена некачественно (предварительно проверьте наличие напряжения на контактах аккумуляторного бокса!).

Теперь, когда двигатели готовы, приступим к сборке схемы, изображенной на рис. 5.15. Перемычки на контактах ENA и ENB драйвера не убираем!

Картинка драйвер +мотор_стенд_bb

Рис. 5.15. Схема управления двигателями без контроллера Arduino

Двигатели подключаются к драйверу через винтовые зажимы, также подключается и аккумуляторный бокс, для контактов IN1–IN4 драйвера L298N лучше использовать провода с готовыми клеммами Dupont (см. главу 2), а для MX1508 требуется пайка.

Подключая 5 вольт к различным контактам IN1–IN4, можно проследить, как изменяется вращение двигателей M1 и M2 (используйте данные табл. 5.4).

Подсказка

Контакты IN1 и IN2 отвечают за работу двигателя М1, а IN3 и IN4 — двигателя М2.

Широтно-импульсная модуляция

Проведем наглядный эксперимент: отключим контакт IN1 мотора М1, а контакт IN2 будем руками быстро подключать к напряжению 5 вольт и отключать от него, — мотор станет вращаться с заметными рывками.

Если же делать эту операцию с высокой скоростью — такой, на которую способен контроллер, то вал мотора будет вращаться без рывков, но мощность на валу окажется меньше, чем при постоянно включенном IN2. То есть передаваемая на вал мощность зависит от частоты переподключения и длительности включения, и если время включения мало, а время отключения относительно времени включения
велико, то и выдаваемая мощность будет мала, и наоборот. Этот подход к регулированию мощности вращения двигателей постоянного тока называется широтно-импульсной модуляцией.

Мы в наших проектах будем использовать шкалу мощности от 0 до 255, где число — это относительная длительность импульса включения мотора за период (рис. 5.16). А чтобы иметь возможность изменять направление вращения, задействуем и отрицательную шкалу: –255…0…255, при этом изменяя вход драйвера, на который подается сигнал (при положительном вращении — на IN1, при отрицательном — на IN2 для мотора М1 и IN3/IN4 — для мотора М2).

рис 5_14

Рис. 5.16. Принцип работы ШИМ

Подключаем контроллер Arduino

Поскольку у нас есть три разных драйвера управления моторами, рассмотрим для них такие схемы подключения, которые позволят использовать один универсальный программный код.

Добавим к собранной схеме контроллер Arduino и научим его управлять двига-
телями. Дополнительно нам потребуется несколько проводов с клеммами Dupont.

l298nMP

Рис. 5.17. Схема управления двигателями для драйверов L298N и MX1508

На рис. 5.17 показана схема подключения драйверов L298N и MX1508, на рис. 5.18 и 5.19 — схема подключения TB6612FNG (она несколько сложнее).

Дело в том, что подключение драйвера TB6612FNG потребует немного больше соединений, т. к. нужно подать логическую единицу (5 вольт от Arduino) на контакты VCC, PWMA, PWMB и STBY, в остальном же схема схожа с подключением L298N и MX1508. Чтобы исключить на рисунках пересечение соединений и неверную их трактовку, схема подключения драйвера TB6612FNG разбита на две части: подключение силовой части (рис. 5.18) и логической части (рис. 5.19).

Удобно при этом задействовать дополнительные платы, которые упрощают реализацию соединений, — например Arduino Sensor shield V5.0 (для Arduino Uno) или NANO V3.0 Shield (для Arduino Nano).

Далее приведены примеры управления вращением двигателей при помощи программы, работающей на контроллерах Arduino UNO, Arduino Nano и Arduino Pro Mini.

23_tb6612fngPower_МП

Рис. 5.18. Схема управления двигателями для драйвера TB6612FNG (силовая часть)

23_tb6612fngCom_МП

Рис. 5.19. Схема управления двигателями для драйвера TB6612FNG (логическая часть)

Подключаем библиотеку mobrob3.zip и пишем тестовую программу

Специально для этого издания книги ее автор разработал библиотеку mobrob3.zip.
В ней, в частности, содержится модуль управления мощностью пары моторов
(см. далее).


Электронный архив

Электронный архив, включающий библиотеку mobrob3.zip, можно скачать с сервера издательства «БХВ» по ссылке https://zip.bhv.ru/9785977517034.zip или со страницы книги на сайте https://bhv.ru/ (см. приложение).


Перед использованием библиотеку mobrob3.zip нужно добавить в Arduino IDE стандартным способом: Скетч | Подключить библиотеку | Добавить .ZIP библиотеку, и выбрать с диска файл mobrob3.zip. В результате все модули и примеры из этой книги (по главам) станут доступны в Arduino IDE. Для управления моторами в библиотеку включен модуль mobrob3xmotor.h, в котором учтены некоторые особенности управления моторами для генерации ШИМ, заключающиеся в том, что в качестве левых моторов будущего робота можно использовать только контакты GPIO 2 и 3 (менять их местами можно), а для правого мотора — только 4 и 5 (их также можно менять местами, чтобы добиться вращения в нужную сторону). Подобное ограничение связано с тем, что генерация ШИМ возможна только на контактах 3 и 5 GPIO.

Логика работы тестовой программы управления двигателями (листинг 5.1) следующая.

В бесконечном цикле:

  1. Отключаем оба двигателя.
  2. Ждем 1 секунду.
  3. Подключаем двигатель 1 на полную мощность по часовой стрелке.
  4. Ждем 1 секунду.
  5. Отключаем двигатель 1.
  6. Ждем 1 секунду.
  7. Подключаем двигатель 1 на полную мощность против часовой стрелки.
  8. Ждем 1 секунду.
  9. Отключаем двигатель 1.
  10. Возвращаемся на пункт 1.

Самостоятельно измените эту программу для управления двигателем 2.

Листинг 5.1. Тестовая программа управления двигателями

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// Контакты управления левого мотора только 2 и 3.
# define GPIO_1F 2
# define GPIO_1B 3
// Контакты управления правого мотора только 4 и 5.
# define GPIO_2F 4
# define GPIO_2B 5
 
// Подключаем библиотеку управления моторами.
#include &lt; mobrob3xmotor.h&gt;
void setup()
{
// Вызываем функцию инициализации моторов.
motor_setup();
}
 
// Основная программа.
void loop()
{
motors_power(0, 0); // Отключены оба.
delay(1000);
motors_power(255, 0); // Включен мотор 1 +
delay(1000);
motors_power(0, 0); // Отключены оба.
delay(1000);
motors_power(-255, 0); // Включен мотор 1 -
delay(1000);
// Проделайте те же операции для двигателя 2 самостоятельно.
// ....
}

Добавляем регулирование на основе ШИМ

Рассмотренная и подключенная в предыдущем разделе библиотека mobrob3.zip уже содержит модуль mobrob3xmotor.h, который может регулировать мощность моторов при помощи ШИМ.

Напомню, что значения ШИМ в Arduino могут изменяться от 0 до 255. На практике вал двигателя не сразу начнет вращаться — сначала (при малых значениях) двигатель станет гудеть и лишь по достижении определенного значения ШИМ начнет медленно увеличивать обороты, что связано с недостатком мощности для компенсации сил трения.

Тестовая программа управления двигателями с регуляцией на основе ШИМ

Логика работы этой тестовой программы (листинг 5.2) следующая.

В бесконечном цикле:

  1. Отключаем оба двигателя.
  2. Ждем 1 секунду.
  3. Далее в цикле через 100 миллисекунд увеличиваем мощность от 70 до 255 для обоих моторов.
  4. Далее в цикле через 100 миллисекунд уменьшаем мощность от 255 до 70 для обоих моторов.
  5. Возвращаемся к пункту 1.

Итогом работы программы будет ускоряющееся вращение двигателей в одну сторону, а затем такое же торможение и остановка.

Самостоятельно измените программу так, чтобы моторы разгонялись в разные стороны.

Листинг 5.2. Тестовая программа управления двигателями с регуляцией на основе ШИМ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// Зададим номера контактов управления моторами.
// Контакты управления левого мотора только 2 и 3.
# define GPIO_1F 2
# define GPIO_1B 3
// Контакты управления правого мотора только 4 и 5.
# define GPIO_2F 4
# define GPIO_2B 5
// Подключаем библиотеку управления моторами.
#include &lt;mobrob3xmotor.h&gt;
void setup()
{
// Вызываем функцию инициализации моторов.
motor_setup();
}
//=================================================================
// Основная программа.
void loop()
{
motors_power(0, 0);
delay(500);
for (int i = 70; i &lt; 255; i++)
{
motors_power(i, i);
delay(100);
}
for (int i = 255; i &gt; 70; i--)
{
motors_power(i, i);
delay(100);
}
}

Выводы

Итак, тип ходовой выбран — это колесная ходовая часть с двумя ведущими колесами. Выбран и используемый тип двигателей — это двигатель постоянного тока
с понижающим редуктором. Рассмотрен способ управления двигателями посредством специального драйвера. Определен порядок подключения и управления двигателями.

Для закрепления теоретических знаний собраны и опробованы на практике различные схемы управления двигателями постоянного тока. Следующий шаг — сборка базовой модели робота.

  1. См. https://bhv.ru/product/mobilnye-roboty-na-baze-esp32-v-srede-arduino-ide/.
Опубликовано

Стабилизация электропитания

По материалам книги М.Момота “Мобильные роботы на базе Arduino, 3-е изд.” (глава 3. «Электропитание»)

Мобильные роботы на базе Arduino, 3-е изд.

Важным моментом в электротехнике является наличие прочного контакта в цепи источников питания — особенно это касается подвижных роботов, рывки и толчки которых могут приводфить к разрыву питающей цепи. Для того чтобы разрывов питающей цепи не происходило, следует использовать подпружиненные контакты и специальные боксы с подобными контактами (рис. 3.3).

рис3_3
Рис. 3.3. Бокс для элементов питания

Электронные компоненты — такие как контроллеры, датчики, приемопередающие устройства — очень чувствительны к скачкам напряжения в цепи электропитания. Аккумуляторы хотя и промаркированы номинальным напряжением, но реальное их напряжение колеблется в зависимости от уровня заряда в широких пределах. Решением вопроса стабилизации электрического питания занимаются специальные приборы — стабилизаторы питания.

Стабилизация напряжения

Самым доступным понижающим стабилизатором напряжения питания является микросхема КР142ЕН5А или ее аналог L7805CV. Схема подключения L7805CV показана на рис. 3.4: на вход поступает нестабилизированное напряжение 7 В или выше, а на выходе получаем стабильное постоянное напряжение 5 В.

а

 

б

Рис. 3.4. Стабилизация питания при помощи микросхемы L7805CV: а — схема соединений; б — электрическая схема

Существуют подобные стабилизаторы и на другое напряжение, а также настраиваемые стабилизаторы. Платы Arduino UNO и Nano содержат как минимум один стабилизатор напряжения на 5 и на 3,3 В.

Широкое применение получили портативные импульсные стабилизаторы. Они имеют высокий коэффициент полезного действия, достигающий 95%.

В последнее время стали популярны импульсные понижающие стабилизаторы
китайского производства с настройкой выходного напряжения на основе микросхемы LM2596 (рис. 3.5).

рис3_5импульсный понижающий

Рис. 3.5. Понижающий импульсный стабилизатор на основе микросхемы LM2596

Существуют также повышающие импульсные стабилизаторы. Они могут, имея на входе 3,7 В, преобразовать это напряжение в нужные для питания электроники робота повышенные значения. Визуально они мало отличаются от понижающих стабилизаторов напряжения, но работают на микросхеме XL6009 (рис. 3.6).

Хорошо зарекомендовал себя в работе повышающий импульсный стабилизатор со входным напряжением от 2 В и стабилизированным выходным напряжением 5,1–5,2 В (рис. 3.7). Такие стабилизаторы удобны, если требуется сэкономить на массе элементов питания и размерах создаваемого прибора, применяя низковольтную батарею, — например, один литий-ионный аккумулятор на 3,7 В. Таким образом, если для электропитания нашей схемы необходимо 5 В и небольшой ток (не более 0,5 А), можно получить довольно компактное устройство.

рис3_6 повышающий Повышающий стабилизатор 5_2в
Рис. 3.6. Повышающий импульсный стабилизатор на микросхеме XL6009 Рис. 3.7. Повышающий импульсный стабилизатор на заданное
напряжение 5,2 В

 

Стабилизация электрического тока

В некоторых случаях может потребоваться получить не стабильное напряжение, а стабильный ток, — например, при подключении светодиодов. В этом случае используются стабилизаторы тока. Стабилизатор тока несложно построить на микросхеме LM317T (рис. 3.8). Значение стабилизируемого тока зависит от величины сопротивления R1.

C:\Users\Momot_1\YandexDisk\Книга про простых роботов\Book_5\Работа\Отработано\pic\03\03-08.jpg

Рис. 3.8. Источник тока на базе LM317T

 

Защита от короткого замыкания по питанию

Возьмите солевую или алкалиновую батарейку формата ААА и на небольшое время (4–5 секунд) замкните проводом положительный и отрицательный контакт батареи. Батарея начнет нагреваться и через весьма непродолжительное время выйдет из строя — это результат короткого замыкания по питанию. Мы выбрали для эксперимента именно батарейку формата ААА не случайно, дело в том, что она не рассчитана на генерацию тока, величина которого приведет к серьезным последствиям, — например, к возгоранию или расплавлению изоляции провода. Если подобное сделать с Li-ion аккумулятором, то вполне возможен настоящий пожар.
У меня лично дело доходило до расплавления изоляции проводов и бокса, в котором находились аккумуляторы, при этом стальные контакты аккумуляторов аккумуляторного отсека накалялись докрасна, что может стать причиной пожара или серьезных ожогов.

На рис. 3.10 приведен пример схемы короткого замыкания. Здесь в правильную схему после выключателя добавлен проводник с надписью КЗ, который напрямую соединяет между собой положительный и отрицательный контакты блока питания. При этом ток потечет не через нагрузку, а по правилу наименьшего сопротивления через проводник КЗ, что приведет к короткому замыканию со всеми описанными последствиями. Как правило, короткое замыкание происходит вследствие ошибочного монтажа, плохой изоляции или случайного замыкания проводников питания.

КЗ присутствует.png

Рис. 3.10. Короткое замыкание в электрической цепи

Как не допустить короткого замыкания?

  1. Профилактика.

Мы уже научились пользоваться мультиметром. Вынем из робота батарею/
аккумулятор и включим мультиметр в режим тестирования наличия соединения (режим ). Если у робота есть выключатель, установим его в положение «Включено». Затем присоединим одну измерительную клемму к положительному контакту питания робота, а вторую — к отрицательному контакту (рис. 3.11). Прибор может сразу показать наличие прямого соединения, а через несколько секунд начать показывать высокое сопротивление, — это нормально и означает, что заряжаются конденсаторы внутри робота. Если же и через несколько секунд наличие прямого соединения не ушло, значит, в цепи вашего робота имеется короткое замыкание, и устанавливать в него элементы питания нельзя до устранения аварии.

Профилактика КЗ_.png

Рис. 3.11. Схема замера мультиметром для профилактики короткого замыкания

предохранитель.png

Рис. 3.12. Установка предохранителя в цепь питания

  1. Предохранители.

В цепь питания, например до выключателя питания, добавляем предохранитель (рис. 3.12). Задача предохранителя — разорвать электрическую цепь, если ток через предохранитель превысит установленный для конкретного предохранителя лимит. Существуют плавкие предохранители и восстанавливающиеся (многоразовые). Плавкий предохранитель при протекании через него высокого тока плавится и размыкает цепь, восстанавливающийся предохранитель при протекании через него тока больше установленного значения нагревается и перестает проводить ток.

Защита от неверной установки элементов питания (переполюсовки)

На предшествующих рисунках в качестве нагрузки (потребителя) для блока питания мы приводили мотор постоянного тока — для него изменение направления
тока в цепи питания не страшно, вал мотора просто начнет вращаться в другую сторону. Но есть потребители электричества, неправильное подключение которых приведет к выходу их из строя, — к ним относятся электронные схемы, микро­контроллеры, умные датчики. Для защиты их от неправильного подключения можно установить диод или диод Шоттки (рис. 3.13). Диод проводит электрический ток только в одну сторону, благодаря чему неправильное подключение аккумуляторов приведет к тому, что устройство не включится, — на него просто не будет подано напряжение.

На диоде при нормальном включении происходит небольшое падение напряжения: для обычного диода примерно 0,5–0,6 вольта, для диода Шоттки — примерно 0,2 вольта. Из-за этого напряжение, подаваемое на вашу схему, будет немного меньше того, что выходит от источника питания.

Защита от переполюсовки_МП.png

Рис. 3.13. Схема с защитой от переполюсовки питания

Зарядка аккумуляторов на примере Li-ion и Li-pol

Разберемся, каким образом производится зарядка аккумуляторов, на примере Li-ion-аккумулятора формата 18650 с номинальным напряжением 3,7 вольта (мы планируем использовать для питания нашего робота именно их).

Существуют профессиональные устройства для зарядки аккумуляторов, которые подключаются к сети ~220 вольт и заряжают, разряжают и тестируют аккумуляторы, но подобные устройства довольно дорогие и не всегда все их функции нам необходимы. Поэтому мы рассмотрим два самых простых примера.

На рис. 3.14 представлено зарядное устройство на основе модуля TP4056 для аккумуляторов формата 18650 с номинальным напряжением 3,7 В. Такой зарядкой, если ее припаять к аккумуляторному боксу, можно заряжать аккумуляторы поочередно. Модуль подключается к обычному зарядному устройству от смартфонов с разъ-
емом micro-USB или USB Type-C (в зависимости от того, какая это версия модуля), а к его контактам B+ и B– подключается заряжаемый аккумулятор. Если к контактам OUT+ и OUT– подключить нагрузку, модуль дополнительно защитит аккумулятор от глубокого разряда (отключит аккумулятор заранее). Когда идет заряд, на модуле горит красный светодиод, после прекращении заряда загорается синий.

Зарядное устройство на основе модуля TP4056 для одного аккумулятора

Рис. 3.14. Зарядное устройство на основе модуля TP4056 для одного аккумулятора

Следующий модуль заряда (рис. 3.15) появился недавно — его отличие от предыдущего в том, что он рассчитан на заряд двух последовательно соединенных аккумуляторов 18650. На практике этот модуль можно установить прямо на робота и заряжать аккумуляторы, не вынимая их из бокса, что весьма удобно. Однако учтите, что аккумуляторы должны иметь одинаковую емкость, иначе один из них, что с меньшей емкостью, быстро выйдет из строя.

Зарядное утройство для пары последовательно соединенных аккумуляторов 18650

Рис. 3.15. Зарядное утройство для пары последовательно соединенных аккумуляторов 18650

Выводы

Мы познакомились здесь с различными источниками электропитания, в том числе наиболее эффективными никель-металлогидридными или литий-ионными аккумуляторами, которые и рекомендуется использовать для питания роботов. Рассмотрели наиболее распространенные схемы стабилизаторов питания — от них следует запитывать контроллеры, датчики, приемопередающие устройства и другие чувствительные к питанию устройства, защиту от короткого замыкания и переполюсовки, а также простейшие устройства зарядки литий-ионных аккумуляторов.

В следующей главе мы обратимся к основам программирования контроллера Arduino, на котором строится система принятия решений робота, — его «компьютера».

Опубликовано

Источники питания

По материалам книги “Занимательные проекты на базе микроконтроллеров tinyAVR” (глава 1. «Источники питания»)

Занимательные проекты на базе микроконтроллеров tinyAVR

Для работы любой системы необходим источник энергии. Без него любая система — всего лишь “кусок железа”. Очень важно правильно выбрать источник питания. Подключение малогабаритного переносного устройства к электрической сети привязывает его к розетке, и такое решение вряд ли можно считать приемлемым.

Батареи

Батареи — самый распространенный источник энергии для портативных электронных систем. Батареи различаются по типам, корпусам и энергетическим показателям. Энергетический показатель батареи характеризует количество хранящейся в ней энергии. Батареи бывают двух типов: одноразовые (гальванические элементы) и перезаряжаемые (аккумуляторы). Гальванические элементы дают энергию сразу же после их сборки и продолжают давать ее до тех пор, пока не разрядятся. Перезарядить их нельзя, поэтому после эксплуатации их приходится выбрасывать.

Аккумуляторы необходимо зарядить перед использованием. В течение срока эксплуатации их можно перезаряжать много раз, и поэтому они являются предпочтительными (по сравнению с обычными батарейками), хотя и более дорогими. Кроме того, удельная энергия аккумуляторной батареи хуже, чем у обычной. Удельная энергия — это количество энергии, хранящейся в батарее, на единицу ее массы. Обычная батарея может выдавать рабочее напряжение дольше, чем аккумуляторная такой же массы.

Широко распространен угольно-цинковый гальванический элемент. Его корпус сделан из цинка (который служит отрицательным полюсом). Корпус заполнен пастой из хлорида цинка и хлорида аммония (которая служит электролитом). Положительный полюс батареи — угольный или графитовый стержень, окруженный смесью диоксида марганца и угольным порошком. По мере использования цинковая оболочка становится тоньше (вследствие химической реакции, ведущей к окислению цинка) и в конечном итоге электролит начинает вытекать из корпуса. Угольноцинковые батареи — самые дешевые. Выпускаются также щелочные батареи (рис. 1.16), которые похожи на угольно-цинковые, но в качестве электролита здесь применяется гидроксид калия. Номинальное напряжение угольно-цинковых и щелочных гальванических элементов равно 1,5 В.

Часто встречаются гальванические элементы на основе оксида серебра и лития. Батарейки на оксиде серебра (их напряжение равно 1,8 В) имеют гораздо более высокую удельную энергию, чем угольно-цинковые. В литиевых батареях используются различные химические соединения, в зависимости от комбинации которых напряжение может составлять от 1,5 до 3,7 В. На рис. 1.17 показаны литиевые и щелочные батарейки в форме таблеток.

Главная проблема с одноразовыми батареями состоит в том, что после разряда их необходимо сразу перерабатывать. В этом плане аккумуляторы гораздо привлекательнее: их можно несколько раз перезарядить (до того, как вам придется отправить их на переработку). Аккумуляторные батареи изготавливают как стандартныхразмеров, так и на заказ. Самые распространенные — свинцово-кислотные, никелькадмиевые, никель-металлогидридные, а также литий-ионные батареи. На рис. 1.18 показана литий-ионная батарея. Для зарядки аккумуляторных батарей требуются специальные зарядные устройства. Так, например, заряжать литий-ионную батарею зарядным устройством для никель-металлогидридных батарей нельзя, поскольку при этом батарея будет повреждена, что может привести даже к ее взрыву и пожару.

Рис. 1.16. Щелочные батареи типоразмеров 9 В и AAA

Рис. 1.17. Маленькая LR44 — щелочная батарея, большая CR2032 — литиевая батарея

Рис. 1.18. Литий-ионная батарея

Батареи гальванических элементов и аккумуляторов выпускаются нескольких стандартных размеров. Некоторые из самых распространенных перечислены в табл. 1.2.

Таблица 1.2. Обозначения батарей и их размеры

Обозначение Форма Длина, мм Диаметр/Длина, мм Высота, мм
ААА Цилиндр 44,5 12
АА Цилиндр 50,5 14,5
9V Прямоугольный параллелепипед 48,5 17,5 26,5
C Цилиндр 50 26,2
D Цилиндр 61,5 34,2

При выборе батареи необходимо учитывать следующие характеристики:

  • Энергетическая емкость. Выражается в ампер-часах (или в миллиампер-часах). Это важная характеристика, которая показывает, как долго “продержится” батарея до полного разряда. Помните, что чем больше емкость батареи, тем больше ее размеры.
  • Напряжение, выдаваемое батареей.
  • Условия хранения (когда батарея не используется).
  • Срок хранения. Показывает, сколько времени пройдет до полного саморазряда батареи. Не стоит покупать батареи про запас на десять лет вперед, если срок хранения составляет, к примеру, всего один год.
  • Рабочая температура. Все химические источники тока имеют плохие температурные характеристики, т. к. скорость протекания химических реакций сильно зависит от температуры. При слишком низких (и высоких) температурах батареи работают очень плохо.
  • Рабочий цикл. Некоторые батареи работают лучше тогда, когда они используются с перерывами. Рабочий цикл батареи показывает, можно ли включать батарею в непрерывном режиме без потери ее характеристик.

Батарея из фруктов

Для получения электричества можно использовать некоторые фрукты и овощи. Содержащиеся в них электролиты пригодны для изготовления простейших гальванических элементов. Для изготовления “фруктового” источника питания потребуется лимон, а также два электрода: медный и цинковый. Напряжение такого источника питания равно примерно 0,9 В. Величина тока зависит от площади электродов, контактирующих с электролитом, а также от качества самого электролита.

Для нашей “фруктовой” батареи потребуется несколько лимонов (это будет электролит) и несколько кусков меди и цинка (это будут электроды). В качестве меди мы возьмем кусок фольгированного текстолита, а в качестве цинка — полоски, вырезанные из корпуса обычной батареи.

Последовательность изготовления батареи.

  1. Начнем с куска текстолита. Его размер должен быть достаточным, чтобы на нем можно было создать три или четыре “острова”, на каждом из которых поместится половинка разрезанного лимона.
  2. Затем вскроем несколько батареек размера АА, сделаем из них цинковые полоски и зачистим их наждачной бумагой. Припаяем к каждой полоске по проводу. Вместо цинковых полосок подойдут даже гвозди. Гвозди обычно покрыты цинком, поэтому пригодны для изготовления батареи.
  3. На медной печатной плате нужно напильником (или пилой) вырезать “островки” и припаять к каждому из них второй конец провода (от цинковой полоски). На одну ячейку понадобится половина лимона, один медный островок и одна цинковая полоска.
  4. Положите половинки лимонов на медные островки. Сделайте на лимонах разрезы и вставьте в них цинковые полоски. На рис. 1.19 показана лимонная батарея из четырех элементов.

Рис. 1.19. “Лимонная” батарея

Адаптер переменного тока

Если вы используете адаптер переменного тока, то потребуется выпрямитель и емкостной фильтр (рис. 1.20). Выпрямитель можно собрать на отдельных диодах (например, 1N4001) либо взять готовый выпрямительный блок. Если источник питания выдает ток 500 мА, то диоды должны быть рассчитаны, по меньшей мере, на 1 А. Нужно учесть еще одну характеристику диода: максимальное обратное напряжение (Peak Inverse Voltage, PIV), которое диод может выдержать до пробоя. Так, например, максимальное обратное напряжение диода 1N4001 равно 50 В, а 1N4007 — 1000 В.

Рис. 1.20. Схема из выпрямителя и емкостного фильтра может использоваться как с переменным током, так и с постоянным

Амплитуда выпрямленного напряжения на конденсаторе фильтра в 1,4 раза выше среднеквадратического значения входного напряжения переменного тока. Значит, переменное напряжение в 10 В создаст на конденсаторе фильтра постоянное напряжение, равное примерно 14 В. Важно также правильно выбрать емкость и рабочее напряжение конденсатора фильтра. Чем больше емкость, тем меньше пульсации напряжения на выходе. При напряжении 14 В следует взять конденсатор с рабочим напряжением не менее 25 В. Схему, изображенную на рис. 1.20, можно использовать и с источником постоянного тока. При этом полярность подключенного источника тока не будет иметь значения.

Чтобы получить законченный блок питания, в схему необходимо добавить стабилизатор напряжения. В продаже имеются готовые микросхемы стабилизаторов. Мы рассмотрим интегральные линейные стабилизаторы напряжения с малым током покоя.

Широко распространены трехвыводные стабилизаторы типа 78ХХ. Они выпускаются многими компаниями и изготавливаются в разных корпусах. Для питания процессора AVR следует выбрать стабилизатор 7805 с выходным напряжением 5 В. Он может выдавать выходной ток до 1 А и питаться постоянным напряжением от 9 до 20 В. Подойдет также микросхема LM317, напряжение на выходе которой (1,25 В и выше) можно настроить при помощи двух резисторов.

Стабилизатор напряжения — это активный компонент, и при работе он потребляет некоторый ток. Этот ток называется током покоя и имеет порядок десятков миллиампер. Существуют специальные стабилизаторы напряжения с очень малым током покоя. Микросхемы LP2950 и LP2951 — это линейные микромощные стабилизаторы с низким током покоя (около 75 мА) компании National Semiconductor, имеющие очень малое падение напряжения (примерно 40 мВ при высокоомной нагрузке и 380 мВ при максимальном токе в 100 мА). Они идеально приспособлены для систем с питанием от батарей. Более того, ток покоя микросхем LP2950/LP2951 при повышении напряжения на них увеличивается очень незначительно. Это самые популярные трехконтактные стабилизаторы с низким током покоя, именно поэтому мы используем их во многих наших проектах.

Питание от разъема USB

USB — это популярный интерфейс, который есть и в персональных компьютерах, и в ноутбуках. В основном он служит для обмена данными между компьютером и периферийными устройствами (такими, как видеокамера, клавиатура и т. д.). USB — это четырехпроводной интерфейс с двумя контактами для питания и двумя для обмена данными. Питание на USB подается с компьютера. Номинальное напряжение равно +5 В, но по спецификации USB 2.0 оно может составлять от +4,4 до +5,25 В. Внешние устройства, подключаемые к компьютеру, например, мышь, могут получать питание от USB. Этим напряжением можно питать и другие внешние схемы, которые не связаны компьютером. Мы применяем питание от USB для устройств, расположенных недалеко от компьютера. С разъема USB можно взять ток до 100 мА (можно получить и больше, но для этого нужно дать запрос с устройства). В табл. 1.3 приведены питающие и сигнальные контакты порта USB.

Таблица 1.3. Контакты разъема USB (для форм-факторов Mini и Micro)

Контакт Наименование Цвет провода Назначение
1 Vcc Красный +5 В
2 D Белый Сигнал данных –ve
3 D+ Зеленый Сигнал данных +ve
4 ID Бесцветный Идентификация устройства
5 Gnd Черный Заземление

Солнечная энергия

Солнечную энергию можно преобразовать для питания электронных схем при помощи фотоэлементов. Солнечные батареи выдают мощность от долей ватта до нескольких сотен ватт. Выходная мощность солнечного элемента прямо пропорциональна интенсивности падающего света и обратно пропорциональна температуре элемента. Для максимально эффективной работы солнечный элемент должен быть расположен перпендикулярно падающему свету. Обычно выходную мощность солнечной батареи регулируют с помощью специальных схем. Чаще всего от солнечных элементов заряжают аккумуляторы, чтобы от них можно было постоянно получать электроэнергию. Подробности по использованию солнечных элементов описываются в одной из последующих глав.

Генератор на эффекте Фарадея

Рабочее напряжение для многих небольших встроенных систем можно получить при помощи интересного устройства, которое преобразует механическую энергию в электрическую. Подобная конструкция, действие которой основано на эффекте Фарадея, показана на рис. 1.21.

Рис. 1.21. Генератор напряжения на эффекте Фарадея

Рис. 1.22. Сигнал на выходе генератора Фарадея

Корпусом служит трубка из оргстекла подходящего диаметра и длины. Внутри нее находится магнит. Поверх трубки намотана катушка из нескольких сотен витков медного изолированного провода. Концы трубки закрыты заглушками. Для генерирования напряжения конструкцию встряхивают, магнит перемещается по трубке и создает в медном проводе переменное напряжение, которое можно выпрямить и отфильтровать, например, при помощи схемы, показанной на рис. 1.20. Единственная проблема состоит в том, что вам придется трясти эту трубку ровно столько времени, сколько вы хотите вырабатывать напряжение. Как только магнит останавливается, генерация напряжения прекращается и сохраняется только остаточное напряжение на конденсаторе. Но во многих случаях и этого оказывается достаточно. Одно из возможных решений — применение ионисторов. Однако для их зарядки до требуемого напряжения вам может понадобиться потратить много времени и сил.

В качестве стабилизатора к такому источнику рекомендуем использовать микросхему LP2950.

На рис. 1.22 показана осциллограмма сигнала на выходе генератора Фарадея. Ее размах превышает 17 В.

Питание от энергии радиоволн

Радиоволны вездесущи, и поэтому от них можно получать энергию (при помощи подходящей антенны) и преобразовывать ее в постоянное напряжение. К сожалению, для этого требуется либо значительная мощность источника, либо большая антенна, либо близость к радиопередатчику. Во многих коммерческих системах радиочастотная энергия для таких целей излучается специально. Одно из подобных применений — система радиочастотной идентификации (RFID), блок-схема которой показана на рис. 1.23.

Рис. 1.23. Принцип питания от источника радиочастоты

Система состоит из передатчика немодулированного сигнала на подходящей частоте. Рабочая частота определяется кварцем. Чем выше частота, тем меньшая передающая антенна потребуется. Передатчик питается постоянным напряжением. Излучаемый сигнал принимается резонансным контуром (состоящим из катушки индуктивности и конденсатора переменной емкости), настроенным на частоту передатчика. Сигнал от резонансного контура поступает на диодный выпрямитель, фильтр и далее на стабилизатор напряжения. На выходе стабилизатора присутствует требуемое рабочее напряжение. Такая система может выдавать несколько милливатт мощности при расстоянии между передатчиком и приемником в несколько десятков сантиметров.

Выполненная по этому принципу реальная система описана в документе “Wireless battery energizes low-power devices”: www.edn.com/article/CA6501085.html.

Опубликовано

Обзор “малюток” Tiny

По материалам книги “Занимательные проекты на базе микроконтроллеров tinyAVR” (глава 1. «Обзор “малюток” Tiny»)

Занимательные проекты на базе микроконтроллеров tinyAVR

В соответствии с законом Мура степень интеграции микросхем по-прежнему увеличивается в два раза (ну, почти в два) каждые 18 месяцев. Это означает, что каждые полтора года изготовители интегральных полупроводниковых схем могут разместить на той же самой площади микросхемы в два раза больше транзисторов и прочих компонентов. Эта важная гипотеза была впервые высказана Гордоном Муром (одним из основателей компании Intel) в середине 1960 годов и, как это ни удивительно, по-прежнему остается верной (более или менее). Габариты персо- нального компьютера постоянно уменьшаются. Существуют различные модели компьютеров: настольные, переносные, карманные и т. д. Недавно появились так называемые компактные компьютеры (Small Form Factor PC). Это доступные по- требителю небольшие универсальные компьютеры со стандартным программным обеспечением. Действие закона Мура распространяется не только на персональные компьютеры, но и на бытовые электронные устройства: мой нынешний мобильный телефон (который имеет гораздо больше функций, чем предыдущий) значительно компактнее своего предшественника!

Употребляя термин “компьютер”, мы чаще всего имеем в виду обычное вычис- лительное устройство для работы с текстовым редактором, выхода в Интернет и т. д. Но в наши дни почти любое электронное устройство обладает определенны- ми вычислительными способностями. Такие компьютеры называют “встроенны- ми”, поскольку они входят в состав более крупной системы и позволяют ей увели- чить свои возможности.

В стремлении к малогабаритным изделиям наше внимание привлекли компью- теры еще более компактных размеров: Tiny (“малютка”). В отличие от прочих ком- пьютеров, это миниатюрные специализированные компьютерные системы, кото- рые могут поместиться в нагрудном кармане рубашки. Многие изготовители поставляют наборы для сборки таких компьютеров (лидеры здесь — компании Microchip и Atmel). По размерам микросхема соизмерима с рисовым зернышком и все, что ей нужно, — это подходящий источник питания и схема сопряжения. За- программируйте микросхему соответствующим образом, и у вас получится свое собственное персональное электронное устройство, которое может быть совершен- но уникальным.

Что могут делать такие маленькие встроенные компьютеры? Есть ли от них хоть какая-то польза? Далее мы покажем, насколько маленькими они могут быть и что они могут делать.

Микроконтроллеры tinyAVR компании Atmel

Серия микроконтроллеров tinyAVR имеет много разновидностей. Число выво- дов может быть от 4 (у серии ATtiny4/5/9/10) и до 28 (у серии ATtiny48/88). Неко- торые микросхемы серии ATtiny48/88 имеют только 24 контакта. Широко приме- няется схема ATtiny13, которая имеет 8 контактов: два для питания и шесть для ввода/вывода. Это не слишком много, но даже при помощи шести контактов дос- тупны разнообразные возможности.

Из представленной далее в этой главе таблицы микросхем tinyAVR мы вы- брали для большинства наших проектов следующие: ATtiny13, ATtiny25/45/85 и ATtiny261/461/861. Они представляют собой весь спектр семейства Tiny. Все эти микросхемы снабжены статической памятью (SRAM) для программирования на языке С. Схема Tiny13 имеет всего 1 Кбайт памяти для хранения программ, а схемы Tiny861 и Tiny85 — 8 Кбайт. Схемы Tiny13 и Tiny25/45/85 совместимы по цоко- левке, но серия Tiny25/45/85 имеет больше памяти и функций. Если код не поме- щается в схеме Tiny13, то ее можно заменить схемой Tiny24/45/85 (в зависимости от требований к размеру памяти).

Почти все устройства, описанные в этой книге, отличаются привлекательным внешним видом благодаря большим светодиодным индикаторам. Новый метод управления большим числом светодиодов при помощи ограниченного числа управляющих выводов (Charlieplexing — “метод Чарли”) позволяет мультиплекси- ровать до 20 светодиодов, имея всего пять контактов ввода/вывода. Данный метод применялся для реализации привлекательных графических дисплеев и управления семисегментными индикаторами. В некоторых устройствах использованы графи- ческие жидкокристаллические дисплеи.

Любую описанную конструкцию можно собрать за один-два дня.

Микросхемы tinyAVR

Микросхемы tinyAVR отличаются друг от друга по нескольким признакам: по числу выводов, по размеру памяти, по типу корпуса (DIP — корпус с двумя рядами выводов по длинным сторонам; SOIC — то же для поверхностного монтажа; MLF — квадратный корпус для поверхностного монтажа), по периферийным функциям, по интерфейсам обмена и т. д. На рис. 1.1 показаны примеры микросхем tinyAVR в корпусах типа DIP, а на рис. 1.2 — в корпусах типа SOIC. Номенклатура микросхем постоянно меняется, поскольку компания Atmel регулярно добавляет новые устройства для замены старых. Последние изменения можно всегда посмот- реть на сайте по ссылке: www.avrgenius.com/tinyavr1.

Большинство микросхем организовано так, что каждая схема из одной серии от- личается от остальных всего несколькими функциями (размером памяти и т. п.).

Некоторые основные серии и схемы семейства tinyAVR приведены в табл. 1.1 и на рис. 1.1, 1.2.

Если в маркировке микросхемы имеется буква “А”, значит, схема выполнена по технологии picoPower и снабжена функцией для снижения потребления электро- энергии.

Рис. 1.1. Микроконтроллеры tinyAVR в корпусах DIP

Рис. 1.2. Микроконтроллеры tinyAVR в корпусах SMD

Таблица 1.1. Некоторые основные серии и микросхемы семейства tinyAVR

Номер п/п Серия/ Микросхема Описание
1 ATtiny4/5/9/10 Максимум 4 контакта ввода/вывода, рабочее напряжение 1,8–5,5 В, 32 байта SRAM, производительность до 12 MIPS (на частоте 12 МГц), Flash-память для хранения программ (1 Кбайт в ATtiny9/10 и 512 байт в ATtiny4/5), аналого- цифровой преобразователь (в ATtiny9/10)
2 ATtiny13 Максимум 6 контактов ввода/вывода, рабочее напряжение 1,8–5,5 В, 64 байта SRAM, 64 байта EEPROM, производи- тельность до 20 MIPS (на частоте 20 МГц), 1 Кбайт Flash- памяти для хранения программ, аналого-цифровой преобра- зователь (ADC)
3 ATtiny24/44/84 Максимум 12 контактов ввода/вывода, рабочее напряжение 1,8–5,5 В, 128/256/512 байт SRAM и 128/256/512 байтEEPROM (соответственно), производительность до 20 MIPS (на частоте 20 МГц), 2/4/8 Кбайт Flash-памяти для хранения программ (соответственно), аналого-цифровой преобразова- тель (ADC), температурный датчик (на кристалле), универ- сальный последовательный интерфейс (USI)
4 ATtiny25/45/85 Максимум 6 контактов ввода/вывода, рабочее напряжение 1,8–5,5 В, 128/256/512 байт SRAM и 128/256/512 байтEEPROM (соответственно), производительность до 20 MIPS (на частоте 20 МГц), 2/4/8 Кбайт Flash-памяти для хранения программ (соответственно), аналого-цифровой преобразова- тель (ADC), универсальный последовательный интерфейс (USI)
5 ATtiny261/461/8 61 Максимум 16 контактов ввода/вывода, рабочее напряжение 1,8–5,5 В, 128/256/512 байт SRAM и 128/256/512 байтEEPROM (соответственно), производительность до 20 MIPS (на частоте 20 МГц), 2/4/8 Кбайт Flash-памяти для хранения программ (соответственно), аналого-цифровой преобразова- тель (ADC), универсальный последовательный интерфейс (USI)
6 ATtiny48/88 Максимум 24/28 контактов ввода/вывода (в зависимости от корпуса), рабочее напряжение 1,8–5,5 В, 256/512 байт SRAM (соответственно), 64 байта EEPROM, производительность до 12 MIPS (на частоте 12 МГц), 4/8 Кбайт Flash-памяти для хранения программ (соответственно), аналого-цифровой преобразователь (ADC), последовательный внешний интер- фейс (SPI)
7 ATtiny43U Максимум 16 контактов ввода/вывода, рабочее напряже- ние 0,7–1,8 В, 256 байт SRAM, 64 байта EEPROM, произ- водительность до 1 MIPS на мегагерц, 4 Кбайт Flash- памяти для хранения программ, аналого-цифровой пре- образователь (ADC), температурный датчик (на кристал- ле), универсальный последовательный интерфейс (USI). Микросхема с низким энергопотреблением, встроенный преобразователь автоматически генерирует стабильное напряжение питания 3 В от низковольтного источника пи- тания (не ниже 0,7 В)

Архитектура tinyAVR

В этом разделе описывается внутреннее устройство микросхем семейства Tiny. Необходимо отметить, что здесь дан обзор только самых часто используемых функций серии Tiny. Некоторые функции в описании микросхем могут отсутство- вать. Дополнительную информацию по этим функциям смотрите в спецификациях конкретных микросхем.

Память

В архитектуре AVR предусмотрено два основных адресных пространства: па- мять данных и память программ. Кроме того, микросхемы имеют стираемую па- мять типа EEPROM для хранения данных. Flash-память для хранения программ организована как линейный массив 16-разрядных ячеек (поскольку размер всех команд AVR равен 16 или 32 бита). Адресное пространство внутренней памяти SRAM, внутренних регистров и регистров ввода/вывода общее. Младшие 32 байта заняты внутренними регистрами, следующие 64 байта — регистрами ввода/вывода; затем адресация SRAM продолжается с адреса 0х60. Внутренняя память EEPROM предназначена для временного хранения данных. На рис. 1.3 показана карта памяти микроконтроллеров семейства Tiny.

Рис. 1.3. Карта памяти микроконтроллеров семейства Tiny

Порты ввода/вывода

Порты ввода/вывода контроллеров AVR состоят из отдельных контактов, каж- дый из которых можно сконфигурировать для ввода или вывода. К любому вход- ному контакту можно присоединить нагрузку. Это необходимо для подключения датчиков, которые не выдают электрического сигнала (например, микропереклю- чателей). Каждый выходной буфер обеспечивает ток 40 мA, что позволяет напря- мую подключать светодиоды. Все контакты ввода/вывода защищены диодами по шинам питания и земли. На рис. 1.4 показана блок-схема портов ввода/вывода кон- троллеров AVR.

Рис. 1.4. Блок-схема порта ввода/вывода контроллеров семейства Tiny

Таймеры

В микросхемах tinyAVR обычно есть встроенные синхронные или асинхронные восьмиразрядные таймеры. Для синхронного тактирования служит сигнал от внут- реннего тактового генератора (или от делителя частоты), для асинхронного — внешний тактовый сигнал либо цепь фазовой автоподстройки частоты (Phase Lock Loop, PLL), которая работает на частоте до 64 МГц.

Рис. 1.5. Блок-схема таймера AVR

В состав некоторых контроллеров входят также 10- или 16-разрядные таймеры. Помимо счетчика, эти таймеры также имеют блоки сравнения, которые генерируют ШИМ-сигнал на контактах ввода/вывода. Таймеры могут работать в разных режи- мах (нормальный, захват, режим широтно-импульсной модуляции, сброс таймера по результату сравнения и т. д.). Каждый таймер имеет несколько связанных с ним источников прерываний, которые описываются в следующем разделе, посвящен- ном прерываниям. На рис. 1.5 показана блок-схема таймера AVR.

Прерывания

В контроллерах AVR предусмотрено несколько различных источников преры- ваний, которым выделены соответствующие векторы в адресном пространстве про- грамм. По умолчанию векторы прерываний занимают первые адреса в адресном пространстве программ. Самый младший адрес (0х0000) назначен вектору сброса, который вообще говоря, не является источником прерывания. Адрес прерывания определяет также и его приоритет. Чем ниже адрес, тем выше уровень приоритета прерывания. Поэтому сброс имеет самый высокий приоритет. Если одновременно происходит несколько прерываний, то первым выполняется прерывание с самым высоким приоритетом, за ним прерывание с более низким приоритетом и т. д. Пре- рывание приостанавливает нормальное выполнение основной программы и пере- ставляет счетчик команд на подпрограмму обработки прерывания (Interrupt Service Routine, ISR). После обработки прерывания счетчик команд устанавливается снова на основную программу. На рис. 1.6 показано выполнение кода ISR.

Рис. 1.6. Обработка прерывания

Каждому прерыванию присваивается свой бит разрешения, который для активи- зации прерывания должен быть установлен в логическую единицу (так же как и глобальный бит разрешения прерываний в регистре состояния). Глобальный бит разрешения прерываний при выполнении ISR по умолчанию сбрасывается, поэтому никакие другие прерывания произойти не могут (если только программа пользова- теля не выставила явным образом глобальный бит разрешения прерываний, чтобы разрешить вложенные прерывания (прерывания внутри другого прерывания)). Пе- риферийные устройства AVR (таймеры, интерфейс USI, АЦП, аналоговые компа- раторы и т. д.) имеют разные источники прерываний для различных состояний или режимов.

USI: универсальный последовательный интерфейс

Интерфейс USI обеспечивает основные аппаратные ресурсы для последователь- ного обмена. Этот интерфейс можно сконфигурировать для работы либо по трех- проводному протоколу (который совместим с последовательным периферийным интерфейсом SPI), либо по двухпроводному протоколу (который совместим с двух- проводным интерфейсом TWI). При минимальном управляющем программном обеспечении интерфейс USI допускает значительно более высокие скорости пере- дачи и требует меньше памяти для программ (чем чисто программные решения). Прерывания применяются для уменьшения нагрузки на процессор.

Аналоговый компаратор

Контроллеры AVR имеют компаратор, который измеряет аналоговое входное напряжение на двух входах и выдает цифровой выходной сигнал (0 или 1) в зави- симости от того, на каком входе (положительном или отрицательном) есть на- пряжение.

Рис. 1.7. Блок-схема аналогового компаратора

Положительный и отрицательный входы могут быть выбраны из нескольких контактов ввода/вывода. Изменение выхода компаратора можно использовать как источник прерывания. Выход компаратора можно увидеть на контакте выхода ана- логового компаратора (АСО). На рис. 1.7 показана блок-схема аналогового компа- ратора.

Аналого-цифровой преобразователь

Аналого-цифровой преобразователь (АЦП, ADC) представляет собой 10-разрядный преобразователь последовательного приближения с несколькими несимметричны- ми входами. В некоторых микросхемах есть также дифференциальные входы (для преобразования разности аналоговых напряжений в двух точках в цифровой код). Для повышения точности измерений иногда усиливают входное напряжение (до преобразования). Опорное напряжение для измерения можно брать с контактов AREF, VCC и от внутреннего источника опорного напряжения. На рис. 1.8 показа- на блок-схема аналого-цифрового преобразователя.

Рис. 1.8. Блок-схема аналого-цифрового преобразователя

Источники тактовых сигналов

Источники сигналов тактовой частоты: калиброванный RC-генератор, внешний тактовый генератор, кварцевый генератор, сторожевой генератор, низкочастотный кварцевый генератор, а также генератор с фазовой автоподстройкой частоты (PLL). Источник тактового сигнала можно задать (из этих вариантов) при помощи fuse- битов (конфигурационных ячеек). Частота сигнала от выбранного источника может быть впоследствии подвергнута предварительному делению (при помощи выстав- ления битов в регистре предварительного деления) во время инициализации программного обеспечения пользователя. Тактовый сигнал поступает в разные модули микросхемы (CPU, I/O, Flash и ADC):

  • CLK_CPU — синхронизирует те части системы, которые обеспечивают работу ядра AVR (внутренние регистры, регистр состояния и т. д.).
  • CLK_I/O — используется большинством модулей ввода/вывода (тайме- ры/счетчики, интерфейс USI, синхронные внешние прерывания и т. д.).
  • CLK_FLASH — управляет работой интерфейса Flash-памяти.
  • CLK_ADC — в отличие от других модулей ввода/вывода, АЦП получает от- дельный тактовый сигнал, чтобы во время работы АЦП можно было прервать другие тактовые сигналы (для снижения помех остальных цифровых цепей). Это позволяет получить более точные результаты аналого-цифрового преобра- зования. На рис. 1.9 показаны разные варианты подачи сигнала тактовой час- тоты.

Рис. 1.9. Источники сигнала тактовой частоты

Управление электропитанием и режимы ожидания

В современных контроллерах, в том числе и в микросхемах AVR, предусмотре- но самое эффективное управление электропитанием. Они поддерживают режимы ожидания, которые могут быть сконфигурированы пользовательским программ- ным обеспечением, и позволяют отключать неиспользуемые модули (снижая тем самым энергопотребление).

Возможны следующие режимы ожидания: выключение, энергосбережение, про- стой, уменьшение шумов АЦП и др. Разные микросхемы поддерживают различные режимы, подробности относительно которых можно всегда найти в спецификациях.

Более того, каждый режим имеет свой набор источников пробуждения (для вы- хода из данного режима и перехода в полноценное рабочее состояние).

Сброс системы

Источники сигнала сброса контроллеров AVR:

  • Сброс по включению питания — микроконтроллер сбрасывается, когда напря- жение питания уменьшается до заданного порога срабатывания.
  • Внешний сброс — когда на контакте RESET присутствует низкий уровень сигнала.
  • Сброс по сторожевому таймеру — когда активизирован сторожевой таймер и его период ожидания истек.
  • Сброс по падению напряжения питания — когда активизирован детектор паде- ния напряжения и напряжение питания VCC оказывается ниже заданного порога срабатывания.

После сброса его источник может быть определен программно посредством проверки отдельных битов регистра состояния микроконтроллера. Во время сброса все регистры ввода/вывода устанавливаются в свои начальные значения, и про- грамма начинает выполнение с вектора сброса. На рис. 1.10 показана блок-схема различных источников сигнала сброса.

Рис. 1.10. Источники сигнала сброса

Программирование микроконтроллеров

Программирование контроллеров AVR включает в себя установку битов блокиро- вания, fuse-битов, программирование Flash-памяти, а также программирование внут- ренней памяти EEPROM. Эти данные могут быть считаны с контроллера вместе с байтами идентификации устройства. Микросхемы семейства Tiny можно запро- граммировать при помощи последовательного или параллельного способа. В этой книге (если не оговорено другое) мы применяли последовательное программирова- ние микроконтроллеров семейства Tiny. Здесь тоже есть два варианта: системное программирование (ISP) и последовательное программирование при высоком напря- жении (HVSP). HVSP применим (как альтернатива параллельному программирова- нию) только для восьмиконтактных микроконтроллеров (поскольку эти микросхемы имеют слишком мало контактов для параллельного программирования).

Системное программирование использует внутренний последовательный перифе- рийный интерфейс (SPI) контроллеров AVR для загрузки кода в память Flash и EEPROM. При этом также программируются биты блокирования и fuse-биты. Для такого программирования требуются только контакты VCC, GND, RESET и три сиг- нальных линии. В некоторых случаях для ввода/вывода (или других целей) может потребоваться контакт RESET. Если этот контакт сконфигурирован как контакт для ввода/вывода (при помощи бита RSTDISBL), то программирование в режиме ISP не- возможно и микросхему следует программировать при помощи параллельного про- граммирования или последовательного программирования при высоком напряжении. Для программирования контроллеров AVR есть еще один метод — система отладки debugWIRE (описана в следующем разделе). Последняя серия шестиконтактных мик- росхем компании Atmel (ATtiny4/5/9/10) не поддерживает описанных ранее вариантов

программирования и имеет новый встроенный интерфейс программирования TPI.

Биты блокирования служат для защиты программного обеспечения пользовате- ля (во избежание дублирования), а fuse-биты применяются для начальной настрой- ки контроллера, которая не может (и не должна) выполняться программным обес- печением пользователя. На рис. 1.11 показаны сигналы для последовательного программирования ISP.

Рис. 1.11. Сигналы для последовательного программирования

Отладочная система debugWIRE

Отладочная система debugWIRE — это однопроводной интерфейс для аппарат- ной отладки и программирования памяти Flash и EEPROM. Этот интерфейс вклю- чается посредством программирования fuse-бита DWEN. После включения этого интерфейса обмен данными между микросхемой и эмулятором происходит через контакт RESET. Таким образом, при программировании через этот интерфейс внешний сброс не работает. Протокол программирования в данном случае анало- гичен JTAG ICE mkII (популярный инструмент отладки компании Atmel). На рис. 1.12 показан отладочный интерфейс debugWIRE.

Рис. 1.12. Отладочный интерфейс debugWIRE

Составляющие проекта

В этой книге рассмотрены проекты, охватывающие широкий спектр идей и включающие в себя несколько прикладных областей. Описанные конструкции при- годны как для развлечения, так и для обучения. Однако важно рассмотреть и сам процесс проектирования и разработки.

Как же создается система или проект, который до сих пор никому не приходил в голову? Конечно, вы должны обдумать, что вам нужно. Иногда толчком может по- служить другая разработка. Это абстрактный процесс, который можно проиллюстри- ровать примером. Предположим, что вы увидели использование светодиодов в какой-то системе: яркие и мигающие, они привлекли ваше внимание, и вы подума- ли, а что если я размещу эти веселенькие светодиоды на своей шапке и заставлю их мигать или менять интенсивность свечения? Самое главное — найти что-то ориги- нальное. На рис. 1.13 схематично изображен процесс проектирования и разработки.

После того как идея зародилась в вашей голове, вы можете начать развивать ее. Мы рекомендуем сразу же поискать по Интернету, чтобы убедиться в том, что она не пришла в голову кому-то еще. Не стоит повторно изобретать колесо. Если ваша идея уже реализована, то стоит подумать, как ее усовершенствовать. Если вы берете готовую реализацию и улучшаете ее, то вам следует поделиться своей работой с автором исходного проекта, чтобы получить признание своей работы и зафиксиро- вать сделанный вами вклад. Таким путем можно улучшить уже существующую конструкцию. Сказанное применимо к проектам, которые доступны в Интернете на условиях какой-нибудь бесплатной лицензии. В других случаях вам может понадо- биться уточнить юридические нюансы. В большинстве ситуаций нарушения закона не будет в том случае, когда вы используете оригинальную разработку (или ее адаптацию) исключительно в личных целях. Однако при коммерческом примене- нии нужно будет обязательно связаться с автором разработки (во избежание воз- никновения проблем в будущем).

В каждом проекте есть две отдельных составляющих (рис. 1.13): аппаратные компоненты и программное обеспечение. Аппаратную часть можно реализовать разными способами, но проще всего на основе микроконтроллеров. Поскольку на- ша книга посвящена применению микроконтроллеров, то именно на этом мы и со- средоточимся. Помимо микроконтроллера, для работы любого устройства нужен источник питания. Понадобятся и другие (специфичные для конкретного проекта) аппаратные компоненты (несмотря на то, что в современных микроконтроллерах интегрировано большое количество функций). Например, несмотря на то, что мик- роконтроллер имеет выходные контакты для управления семисегментными инди- каторами, он не способен обеспечить большой ток, который может понадобиться, поэтому вам потребуются внешние формирователи тока.

Рис. 1.13. Процесс проектирования и разработки

Еще пример: если вы хотите установить внешний датчик, который выдает ана- логовое напряжение для измерения физического параметра, то диапазон напряже- ния этого датчика может оказаться неподходящим для аналого-цифрового преобра- зователя микроконтроллера и придется добавить внешний усилитель. На рис. 1.14 показаны элементы современного микроконтроллера.

Рис. 1.14. Элементы современного проекта с использованием микроконтроллера

Программные компоненты — это прикладная программа, которая выполняется в микроконтроллере. Однако этим термином может также обозначаться и програм- ма для обмена с микроконтроллером, работающая на персональном компьютере.

Разработка проекта требует параллельной одновременной работы над обоими составляющими: аппаратным и программным обеспечением. Программу для мик- роконтроллера можно создавать на персональном компьютере, причем большую часть кода можно разработать даже в отсутствие готового аппаратного прототипа. Программный код можно протестировать на персональном компьютере на отсутст- вие логических ошибок. Некоторые части кода (требующие внешних сигналов или синхронизации с аппаратными событиями) протестировать не удастся, поэтому та- кую проверку придется отложить до стадии интеграции программного и аппарат- ного обеспечения. После появления аппаратного прототипа его нужно совместить с программным обеспечением и эту интегрированную реализацию проекта следует протестировать на соответствие требованиям. Процесс может оказаться не совсем гладким и потребовать нескольких итераций цикла разработки.

Помимо специфичных аппаратных компонентов и программного обеспечения для большинства проектов потребуются еще кое-какие стандартные блоки — ис- точники питания и сигнала тактовой частоты (рис. 1.15). Источник питания и ста- билизация питающего напряжения подробно описаны в одном из последующих разделов.

Для работы устройства очень важен источник сигнала тактовой частоты. К сча- стью, такой источник обычно есть в самом микроконтроллере. Обычно это RC- генератор, который не очень точен и частота которого зависит от рабочего напря- жения, но для многих устройств этого вполне достаточно. Внешний источник так- товой частоты понадобится только для тех приложений, которые критичны к изме- рению времени. Все микроконтроллеры семейства AVR снабжены встроенным источником сигнала тактовой частоты и в большинстве проектов этой книги мы используем именно его. Скорость выполнения программы напрямую зависит от тактовой частоты. Однако высокая тактовая частота имеет и недостаток: система потребляет больше электроэнергии. Между тактовой частотой и потреблением энергии существует линейная зависимость. Если вы удвоите тактовую частоту, то потребление энергии также возрастет в два раза. Поэтому неразумно выбирать са- мую высокую рабочую частоту, лучше определить ее исходя из требуемой скоро- сти выполнения программы. Как мы покажем в проекте 1 (далее в этой же главе), выбрав самую низкую тактовую частоту, мы можем снизить потребляемую мощ- ность до минимума. Основные компоненты устройства показаны на рис. 1.15.

Помимо источников тактовой частоты и питания, а также стабилизатора напря- жения потребуются устройства ввода/вывода и подходящий корпус.

Рис. 1.15. Основные компоненты устройства

Опубликовано

Шина SPI и библиотеки сторонних разработчиков

По материалам книги Т.Иго «Изучаем Arduino: инструменты и методы технического волшебства. 2-е изд.: пер. с англ.»  (Глава 11. Шина SPI и библиотеки сторонних разработчиков)

Изучаем Arduino: инструменты и методы технического волшебства. 2-е изд.

Исходный код, видеоуроки и прочие электронные ресурсы для этой главы можно загрузить с веб-страницы https://www.exploringarduino.com/content2/ch11.

Исходный код для проектов этой главы можно также загрузить на вкладке Downloads веб-страницы издательства Wiley для этой книги: https://www.wiley.com/go/exploringarduino2e.


Мы уже познакомились с двумя основными методами цифровой передачи данных, поддерживаемыми платформой Arduino: шиной последовательного интерфейса УАПП (RS-232) и шиной I2C. В этой главе мы рассмотрим третий метод цифровой связи, поддерживаемый Arduino: шиной SPI[1].

В отличие от шины I2C, шина SPI имеет несколько линий для обмена данными, а также использует отдельную линию для выбора каждого ведомого устройства. Хотя это увеличивает число проводов, в результате также устраняется необходимость в уникальном адресе для каждого ведомого устройства. Обычно с шиной SPI легче работать, чем с шиной I2C; она также обеспечивает более высокую скорость передачи данных. В этой главе мы узнаем, как использовать встроенные аппаратные возможности SPI платы Arduino для взаимодействия с цифровым акселерометром. В частности, мы рассмотрим, как находить и устанавливать библиотеки сторонних разработчиков для облегчения сопряжения со сложным оборудованием. Для иллюстрации полезности этого подхода мы с помощью акселерометра будем управлять яркостью светодиода и выдавать звуковые сигналы, создав своего рода инструмент, реагирующий на движение звуковыми и визуальными эффектами.


Примечание

В первом издании этой книги для демонстрации принципов работы шины SPI использовалась микросхема цифрового потенциометра MCP4231, поддерживающая возможности SPI. В последнее время эти микросхемы трудно найти и, кроме того, проекты на их основе не особенно стимулируют умственные способности, по сравнению с применением акселерометра. Но если вы хотите узнать, как реализовать сопряжение цифрового потенциометра с платой Arduino, это можно сделать, просмотрев учебный фильм на эту тему по ссылке blum.fyi/spi-digipot-tutorial.

Общие сведения о шине SPI

Шина SPI была разработана компанией Motorola для реализации полнодуплексной последовательной связи между ведущим устройством и одним или несколькими ведомыми устройствами. Поскольку для протокола SPI нет формального стандарта, часто можно встретить SPI-устройства, работающие немного по-разному. Например, количество передаваемых битов может быть другим, или линия выбора ведомого устройства может не использоваться. В этой главе мы сделаем акцент на сопряжении платы Arduino с устройствами, реализующими наиболее распространенные SPI-интерфейсы. Эти устройства поддерживаются средой разработки Arduino IDE и библиотеками сторонних разработчиков, которые мы будем использовать.

Внимание!

Следует иметь в виду, что, как уже упоминалось в тексте, в различных устройствах протокол SPI может быть реализован по-разному. Поэтому чрезвычайно важно внимательно ознакомиться с характеристиками устройства, которое планируется использовать, по его справочному листку.

Шина SPI может работать в четырех основных режимах, выбор конкретного из которых зависит от требований конкретного устройства. Устройства SPI работают в синхронном режиме, т. е. передача данных синхронизируется сигналом тактирования, подаваемым на линию SCLK. Данные могут вводиться в ведомое устройство или по положительному, или по отрицательному перепаду сигнала тактирования (называющемуся фазой сигнала тактирования), а уровень по умолчанию линии сигнала тактирования SCLK (называющийся полярностью сигнала тактирования) можно установить или высоким или низким.

Таким образом, две опции для фазы сигнала тактирования и два варианта его полярности определяют четыре способа конфигурации шины SPI. В таблице 11.1 приведены все четыре возможные комбинации фазы и полярности тактового сигнала и соответствующие режимы в библиотеке SPI языка Arduino.

Таблица 11.1. Режимы связи шины SPI

Режим SPI Полярность сигнала тактирования Фаза сигнала тактирования
Режим 0 Низкий уровень при простое Захват данных по положительному перепаду сигнала тактирования
Режим 1 Низкий уровень при простое Захват данных по отрицательному перепаду сигнала тактирования
Режим 2 Высокий уровень при простое Захват данных по отрицательному перепаду сигнала тактирования
Режим 3 Высокий уровень при простое Захват данных по положительному перепаду сигнала тактирования

При использовании библиотеки SPI, предназначенной для взаимодействия с конкретным устройством, правильный режим обычно устанавливается автоматически. Тем не менее, понимание этих низкоуровневых подробностей поможет вам диагностировать потенциальные проблемы передачи данных в будущем.

Подключение устройств SPI

Конфигурация системы обмена данными по шине SPI сравнительно проста. Для взаимодействия между ведущим устройством и всеми ведомыми устройствами предусмотрены три линии:

  • SCLK (serial clock) — последовательный тактовый сигнал.
  • MOSI (master out, slave in) — выход ведущего, вход ведомого.
  • MISO (master in, slave out) — вход ведущего, выход ведомого.

Кроме этих линий, для каждого ведомого устройства требуется отдельная линия для его выбора. Эта линия называется SS (slave select — выбор ведомого). Таким образом, общее число линий и контактов ввода-вывода ведущего устройства всегда будет равно 3 + n, где n обозначает число ведомых устройств.

На рис. 11.1 показан пример системы связи по шине SPI с двумя ведомыми устройствами.

image1

Рис. 11.1. Стандартная схема организации связи по шине SPI (Рисунок создан в программе EAGLE)

Конфигурация интерфейса SPI

Любая система связи по шине SPI содержит, как минимум, четыре линии данных. Кроме этого, для каждого подключенного к системе ведомого устройства требуется дополнительная линия SS для выбора этого устройства. Прежде чем приступать к изучению, как осуществлять обмен данными между устройствами SPI, нам нужно понимать функцию этих линий связи и как они должны подключаться. Назначение данных линий описано в таблице 11.2.

Таблица 11.2. Линии шины SPI

Линия шины SPI Описание
MOSI(выход ведущего, вход ведомого) Передача последовательных данных от ведущего устройства ведомому устройству
MISO(вход ведущего, выход ведомого) Передача последовательных данных от ведомого устройства ведущему устройству
SCLK(последовательный тактовый сигнал) Сигнал, синхронизирующий последовательные данные с принимающим устройством, чтобы оно знало, когда считывать входные данные
SS(выбор ведомого) Линия для выбора ведомого устройства. Установка на этой линии сигнала низкого уровня означает выбор данного ведомого устройства для обмена данными с ведущим устройством. Как правило, одновременно следует активировать только одну линию выбора ведомого устройства

В отличие от шины I2C для линий шины SPI подтягивающие резисторы не требуются, поскольку контакты ввода-вывода устройств сконфигурированы для работы в двухтактном режиме, а не в режиме открытого стока. Связь осуществляется в полнодуплексном режиме (т. е. она полностью двунаправленная). Чтобы подключить SPI-устройство к плате Arduino, нужно просто соединить соответствующие контакты MOSI, MISO, SCLK и SS обоих устройств. При этом следует иметь в виду уровни напряжения питания и логических сигналов. Если используется плата Arduino с питанием 5 В (как Arduino Uno), то подключаемое к ней ведомое SPI-устройство также должно поддерживать работу с логическими уровнями величиной 5 В.

О НАЗВАНИЯХ ЛИНИЙ

Поскольку протокол SPI официально не стандартизован, некоторые производители устройств SPI могут по-разному именовать линии связи для своих устройств. Например, линия SS (slave select — выбор ведомого) иногда называется CS (chip select — выбор микросхемы), линия SCLK (serial clock — последовательный тактовый сигнал) может называться просто CLK (clock — тактовый сигнал) или SCK (вариант SCLK), а контакты MOSI и MISO ведомых устройств иногда обозначаются как SDI (serial data in — вход последовательных данных) и SDO (serial data out —выход последовательных данных). В этой главе употребляются все разновидности наименований сигналов, согласно их применению производителями соответствующих устройств.

Протокол передачи данных SPI

Передача данных по протоколу SPI синхронизуется с помощью сигнала тактирования и управляется посредством линии SS для выбора ведомого устройства. Поскольку все устройства на шине SPI подключены к одним и тем же линиям MOSI, MISO и SCLK, посылаемые ведущим устройством сигналы видимы всем ведомым устройствам. Выбор устройства, которое должно реагировать на эти сигналы, осуществляется с помощью соответствующей линии SS. Важно отметить, что это означает необходимость следить за тем, чтобы в любой разрабатываемой программе низкий (активный) уровень одновременно подавался только на одну линию SS выбора ведомого устройства. Базовая процедура связи с устройством SPI следующая:

  1. Подаем сигнал низкого уровня на линию SS ведомого устройства, с которым необходимо выполнить обмен данными.
  2. Подаем на линию тактирования прямоугольный сигнал с частотой меньшей или равной скорости обмена в бодах, поддерживаемой ведомым устройством.
  3. В каждом цикле сигнала тактирования передаем один бит по линии MOSI и принимаем один бит по линии MISO.
  4. Продолжаем до тех пор, пока не будут переданы или приняты все данные, после чего снимаем сигнал тактирования с линии SCLK.
  5. Снова устанавливаем на линии SS сигнал высокого уровня.

Сравнительные характеристики протоколов SPI, I2C и UART

Многие устройства, включая акселерометры, цифровые потенциометры и дисплеи поддерживают как протокол SPI, так и протокол I2C. (В частности, акселерометр, с которым мы будем работать далее в этой главе, поддерживает оба протокола.) Это означает, среди прочего, что если вы хотите организовать взаимодействие между несколькими платами Arduino, то для этого можно разработать программу, которая будет работать с шиной SPI, I2C или RS-232 (UART). Но как решить, какой из протоколов выбрать? В таблице 11.3 приведены сравнительные характеристики этих трех протоколов, включая их преимущества и недостатки. В конечном итоге, решение будет зависеть от того, какой из них, по вашему мнению, легче всего реализовать и который лучше всего отвечает требованиям вашей задачи.

Таблица 11.3. Сравнительные характеристики протоколов SPI, I2C и UART

SPI I2C UART (RS-232)
Обеспечивает наивысшую скорость передачи данных Максимальная скорость передачи данных сильно зависит от физических свойств шины: длины линий, количества подключенных к ней устройств, значений сопротивлений повышающих резисторов и т.п. Скорость передачи в бодах должна быть согласована между обоими участвующими в обмене устройствами до начала обмена
В целом, с этим протоколом легче работать, чем с протоколом I2C. Требует всего лишь две линии связи Практически не требует никаких протокольных накладных расходов, в результате чего легко поддается реализации
Не требует повышающих резисторов для линий связи Поддерживает взаимодействие устройств с разными уровнями напряжения питания Нет предопределенных ведущего и ведомого устройств. Протокол определяется разработчиком
Количество ведомых устройств ограничено только количеством доступных контактов SS на ведущем устройстве Количество ведомых устройств ограничено доступностью микросхем с конкретных адресом ведущего устройства Поддержку нескольких ведомых устройств трудно реализовать
Поддерживает аппаратное и программное обеспечение платформы Arduino Поддерживает аппаратное и программное обеспечение платформы Arduino Поддерживает аппаратное и программное обеспечение платформы Arduino
  1. Англ. Serial Peripheral Interface — последовательный синхронный периферийный интерфейс — Пер.