Работа с платформой Arduino в среде Tinkercad
В ходе неблагоприятной эпидемической обстановки проведение занятий по робототехнике в очном формате становится не всегда возможным, а личных наборов у учащихся обычно не бывает. Для объединений дополнительного образования занимающимся робототехникой на основе платформы Arduino, 3D-моделирования на помощь приходит онлайн сервис Tinkercad. Данный сервис позволяет учащимся и педагогам не только удобно собирать схемы и производить проверку работ, написанного учащимся кода, но и собирать простенькие объемный модели на основе заранее подготовленных разработчиками блоков. Работа в сервисе разделена по классам, а параллельно возможна работа с учащимися в Zoom. Таким образом, дети смогут как посмотреть сборку, так и ее повторить самостоятельно без лишних усилий и материальных затрат.
Однако работа в данном сервисе имеет некоторые особенности: не хватает распространенных библиотек, различие в подключении модулей и другие. В данном методическом материале рассмотрим подключение основных модулей и их программирование в среде Tinkercad.
Содержание Светодиоды 2
RGB светодиоды 3
Потенциометры 4
Кнопка 5
Датчик температуры 7
Сервопривод 8
Жидкокристаллический дисплей 9
Ультразвуковой датчик 11
Пьезодинамик 12
Фоторезистор 13
7-сегментный индикатор 14
Твердотельное реле 16
PIR датчик 17
Светодиоды
Светодиоды представляют собой полупроводниковый прибор, излучающий свет при прохождении по нему электрического тока. Светодиоды предназначены для световой индикации, часто используются в проектах. При подключении светодиодов от питания 5 В важно использовать резистор на 280 Ом во избежание выхода светодиодов.
void setup() { pinMode(2, OUTPUT); // цифровой пин } void loop() { digitalWrite(2, HIGH); // HIGH = 1, для цифровых пинов digitalWrite(2, LOW); // LOW = 0, для цифровых пинов analogWrite(3, 255); // пин с ШИМ, значения от 0 до 255 } |
RGB светодиоды
RBG (R – red – красный, G – green – зеленый, B – blue – синий) светодиоды представляют собой такой же полупроводниковый прибор, созданный для световой индикации, однако в отличие от обычного светодиода он способен излучать несколько цветов одновременно, создавая из их сочетаний новые цвета. В его основе лежит три цвета: красный, зеленый, синий. Программирование происходит так же, как и в обычном светодиоде, однако для каждого цвета (пина) нужно писать отдельные команды.
void setup() { pinMode(9, OUTPUT); // зеленый pinMode(10, OUTPUT); // синий pinMode(11, OUTPUT); // красный } void loop() // попробуем задать болотный цвет при помощи ШИМ { analogWrite(11, 172); // красный цвет получает значение 172 analogWrite(9, 183); // зеленый цвет получает значение 183 analogWrite(10, 142); // синий цвет получает значение 142 } |
Потенциометры
Потенциометр (переменный резистор) представляет собой компонент, при вращении ручки которого изменяются характеристики электрического тока в цепи, ограничиваются подобно резисторам. Потенциометры используются часто не только в робототехнике, но и в повседневной жизни - для настройки громкости музыки, регулировки яркостью света (диммеры) и т.д.
Потенциометры подключаются в аналоговые пины (A0-A5), передают значения от 0 до 1023.
void setup() { pinMode(A0, INPUT); // подключение пина потенциометра (A0), как вход } void loop() { potent = analogRead(A0); // чтение значения с потенциометра potent = map(potent, 0, 1023, 0, 255); // преобразуем значения переменной // принимаются значения от 0 до 1023, преобразуются в значения 0-255 // далее potent можно передавать, например, для яркости светодиода } |
Кнопка
Кнопка является классическим электронным компонентом, который мы используем каждый день, даже в наших гаджетах, для совершения какого-либо действия, выбора. Работа кнопки происходит при замыкании контактов при нажатии на нее. Рассмотрим несколько программ работы кнопки.
Работа при зажатии кнопки:
void setup() { pinMode(2, INPUT); } void loop() { boolean button = digitalRead(2); if (button == 1){ // пока нажата - работает команда (например, горит светодиод или вращается двигатель); } if (button == 0){ // не нажата, не работает команда (например, гаснет светодиод или перестает вращаться двигатель); } } |
Первое нажатие на кнопку включает устройство, второе – отключает:
int k = 0; // создаем счетчик нажатий void setup() { pinMode(2, INPUT); } void loop() { boolean button = digitalRead(2); if (button == 1){ k=k+1; // счетчик нажатий delay(200); } if (k % 2 == 1){ // если остаток приделении k на 2 = 1 - первое нажатие команда нужная при нажатии (обычно включение чего-либо); } if (k % 2 == 0){ // если остаток при делении k на 2 = 0 - второе нажатие команда нужная при нажатии (обычно выключение чего-либо); } } |
Датчик температуры
Датчик температуры представляется собой датчике TMP36, передающий плате Arduino аналоговый сигнал, напряжение, которое пользователю нужно обработать, чтобы получить температуру в градусах Цельсия или Фаренгейт.
void setup() { pinMode(A1, INPUT); // объявление аналогового пина датчика, как вход } void loop() { float reading = analogRead(A1); // считали напряжение в переменную float voltage = reading * 5 / 1024; // для получения напряжения, значение // полученное с пина умножаем на напряжение питания и делим на 1024 float temp = (voltage - 0.5) * 100; // конечная температура } |
Сервопривод
Сервопривод – механический привод, способный осуществлять вращение вала на заданный угол, а также передавать значение, в котором находится. Угол поворота сервопривода может быть задан через цифровой пин в значении от 0 до 180.
#include Servo.h // вызов библиотеки сервопривода Servo servo1; // инициализация сервы с именем servo1 void setup() { servo1.attach(2); // объявление servo1 пина сервопривода } void loop() { servo1.write(угол); // поворот на угол, от 0 до 180, задается в виде числа int x = servo1.read(); // чтение угла поворота сервопривода (где он сейчас находится) } |
Жидкокристаллический дисплей
Жидкокристаллическими дисплеями пользуются в различных проектах, связанных с Arduino, для наглядного отображения информации, как текстовой, так и графической.
Существует несколько видов жидкокристаллических дисплеев: 1602, 2002,2004, где первые две цифры – количество символов в строке, а вторые две – количество строк. Кроме того, дисплеи могут различаться наличием и отсутствием подсветки, ее цветом, а так же интерфейсом подключения.
Подключение дисплея происходит при помощи 16 контактов:
-
GDN - “-” питания;
-
VCC - “+” питания 5V;
-
V0 - через потенциометр контрастность;
-
RS - 12 пин;
-
RW - “-” питания;
-
E - 11 пин;
-
DB4 - 5 пин;
-
DB5 - 6 пин;
-
DB6 - 7 пин;
-
DB7 - 8 пин;
-
LED - “+” питания через резистор (280 Ом);
-
LED - “-” питания.
#include LiquidCrystal.h // подключение библиотеки для работы с дисплеем // LiquidCrystal lcd(RS, E, DB4, DB5, DB6, DB7); // пример объявления пинов по очереди LiquidCrystal lcd(12,11,5,4,3,2); // объявление пинов по очереди void setup() { } void loop() { lcd.setCursor(0,0); //установка курсора на 1 ячейку, 1 строки (ячейка, строка). Отсчет с 0! lcd.print(x1); // печать переменной lcd.print('Hello'); // печать строки (идет после предыдущей печати на след ячейке) lcd.print(76); // печать числа lcd.clear() // отчистить экран (удалить всё, что есть на экране) } |
byte simvol[8] = { // массив для создания символа типа char для экрана 0b01100, 0b10010, 0b10010, 0b01100, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000 }; lcd.createChar(1, simvol); // объявление символа home() – ставит курсор в начало экрана; clear() – ставит курсор в начало экрана, стирая всё, что на нем было; display(), noDisplay() – влючает/выключает дисплей; cursor(), noCursor() – показать/скрыть курсор; cursor() и noCursor() – если курсор был включен прошлой командой, то он будет мигать; scrollDisplayLeft(), scrollDisplayRight() – позволяет прокручивать экран на один знак влево/вправо; createChar(ch, bitmap) – создает символ с кодом ch (0 – 7), используя массив битовых масок. leftToRight(), rightToLeft() – вывод теста слева на право и справа на лево. |
Ультразвуковой датчик
Ультразвуковые датчики предназначены для определения расстояния путем передачи и приема отраженного ультразвукового сигнала. Эта разница во времени путем умножения на скорость распространения в среде и делением на 2 из-за двойного пути преобразуется в расстояние.
int trigPin = 6; // пин триггера – передача ультразвукового сигнала int echoPin = 7; // эхо – прием сигнала long duration, dist; // переменные времени, расстояния void setup() { Serial.begin (9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { digitalWrite(trigPin, HIGH); // генерируем импульсы в 10 мкс delayMicroseconds(10); digitalWrite(trigPin, LOW); // завершаем генерацию duration = pulseIn(echoPin, HIGH); // принимаем отраженный сигнал, разница между // передачей и приемом - duration dist = (duration / 2) / 29; // преобразование времени в расстояние delay(250); } |
Пьезодинамик
Пьезодинамик представляет собой акустическое устройство, способное воспроизводить звук определенной частоты. Используется для оповещения пользователей. Наиболее известные примеры использования зуммеров – микроволновые печи, будильники.
void setup() { pinMode(6, OUTPUT); } void loop() { tone(6,1000); // включить динамик 6 пина на частоте 1000 Гц delay(1000); // задержка 1 сек noTone(6); // отключить динамик 6 пина delay(1000); // задержка 1 сек } |
Фоторезистор
Фоторезистор — полупроводниковый прибор, изменяющий величину своего сопротивления при облучении светом. На его основе делают устройства, в которых необходимо знать либо уровень освещения (автоматические фонари), либо присутствие света в целом. Пример фонаря:
void setup() { pinMode(A0,INPUT); // подключение фоторезистора, как вход Serial.begin(9600); // подключение серийного порта } void loop() { int light = analogRead(A0); // чтение значения с фоторезистора, передача его переменной Serial.println(x); // печать значения в сериный порт x = map(x, 6, 679, 255, 0); // преобразование значений с фоторезистора в значения 255-0 analogWrite(3, x); // включение светодиода с относительной яркостью, противоположной // окружающему сопротивлению } |
7-сегментный индикатор
7-сегментный индикатор используется для вывода информации, в основном цифр для пользователя. Данные индикаторы отлично подходят для небольших счетчиков. По своей сути, 7-сегментный индикатор является сборкой светодиодов с общим минусом питания (средние пины). Соответственно, как и для светодиодов, для подключения используются резисторы на 280 Ом. Зажечь каждый отдельный сегмент возможно просто подав на него цифровой или аналоговый сигнал на его пин.
// зажжем светодиоды по кругу int k = 0; // создание счетчика k void setup() { pinMode(1, OUTPUT); // объявление пинов как выходы pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); Serial.begin(9600); // объявление работы серийного порта } void loop() { for (int i = 1; i i++){ // перебор светодиодов по кругу digitalWrite(i, HIGH); // зажигаем светодиоды по очереди delay(500); // задержка между включениями в 500 мс } |
// включение индикаторов по кругу после нажатия на кнопку int k = 0; // создание счетчика k void setup() { pinMode(1, OUTPUT); // объявление пинов как выходы pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, INPUT); Serial.begin(9600); // объявление работы серийного порта } void loop() { boolean button = digitalRead(7); // считывание нажатие на кнопку if (button == 1) { // если нажата k++; // в счетчик +1 delay(150); } if (k = 7) { // если значение кнопки больше или равно 7 for (int i = 1; i с 1 по 6 пин digitalWrite(i, LOW); // выключить индикаторы } k = 0; // счетчик k приравнять к нулю } if (k 0 and k k больше нуля и меньше 7 digitalWrite(k, HIGH); // включить k-тый индикатор } Serial.println(k); // вывести значение k в серийный порт } |
Твердотельное реле
Реле представляет собой удобный инструмент, позволяющий подключить дополнительное питание к модулям, а также включать и выключать модули при помощи логического сигнала, посылаемого с платы Arduino.
int k = 0; // создаем счетчик void setup() { pinMode(7, OUTPUT); // пин реле - выход pinMode(13, INPUT); // пин кнопки - вход } void loop() { boolean button = digitalRead(13); // чтение значения кнопки if (button == 1) { // если нажата k++; // добавляем в счетчик единицу delay(200); // задержка от дребезга } if (k % 2 == 1) { // если значение счетчика нечетное digitalWrite(7, HIGH); // передаем реле логическую единицу, включаем } else if (k % 2 == 0) { // если значение счетчика нечетное digitalWrite(7, LOW); // передаем реле логический нуль, отключаем } } |
PIR датчик
PIR датчики используются для обнаружения движения в различных охранных системах или автоматических светильниках, которые включают свет при прохождении человека. Датчик обнаруживает присутствие человека при помощи двух сенсоров температуры. Если температура изменяется в большую сторону одновременно на двух сенсорах в зоне их видимости, то датчик посылает на плату логическую единицу.
void setup() { pinMode(1, INPUT); // пин датчика - вход pinMode(2, OUTPUT); // пин пьезодинамика - выход } void loop() { boolean pir = digitalRead(1); // чтение состояния с датчика while (pir == 1){ // пока датчик передает 1 (присутствие) tone(2,1000); // пищать пьезодинамиком с частотой 1 кГц delay(80); // в течение 80 мс tone(2,3000); // пищать пьезодинамиком с частотой 3 кГц delay(80); // в течение 80 мс pir = digitalRead(1); // снова проверяем наличие человека } if (pir != 1){ // если датчик передает нуль noTone(2); // выключаем пьезодинамик } } |