Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Взять под контроль функции Lego Power

Компоненты и расходные материалы

Arduino UNO
× 1
Драйверы двигателей Texas Instruments Dual H-Bridge L293D
(купите один с длинными контактами, а не версию для поверхностного монтажа, показанную на фото)
× 1
Макет (общий)
× 1
9 В для разъема Barrel Jack
× 1
Удлинительный провод Lego Power Functions (товар:8886)
× 3
Модуль Bluetooth HC-05
× 1

Об этом проекте

У вас есть одна из тех потрясающих моделей Lego Power Functions с электродвигателями и серводвигателями? В этом уроке я покажу вам, как вы можете управлять своей моделью Lego с помощью Arduino и минимум электронных компонентов. Я подробно объясню схемы и программирование, чтобы сделать это руководство простым и понятным для начинающих. Модель Lego, которую вам придется построить самостоятельно (если у вас нет сына), я вам в этом не помогу.

Мы также узнаем, как использовать изобретателя приложений MIT для программирования нашего собственного Android-приложения для удаленного управления. Скоро у вас на заднем дворе появится собственный марсоход Lego Mars!

Это мой первый проект Arduino, и у моего сына есть красивая модель автомобиля Lego Technic (9398 4X4 Crawler) с функциями Lego Power:один сервомотор Lego для рулевого управления и два L-двигателя Lego для вождения. Он разрешил мне использовать машину для этого проекта (при условии, что я не перерезал кабели двигателя). Здесь мы тестируем готовый прототип:

Понимание схемы подключения силовых функций

Сначала купите удлинители Lego Power Functions (товар 8886 в интернет-магазине Lego). Затем разрежьте их (серьезно). Мы сделаем несколько «отрывных» кабелей с кубиками Lego на одном конце и булавками на другом конце. Припаяйте штыри или что-то подобное. Вот объяснение проводки:

GND означает «Земля», которая является отрицательной клеммой (-) аккумуляторной батареи (анода). C1 и C2 могут переключать полярность, чтобы двигатели и сервоприводы переключали направление. Компания TechnicRobot сняла красивое видео, в котором все подробно объясняется. (ВНИМАНИЕ:вы делаете это под свою ответственность. Я не буду нести ответственности, если вы что-то испортите!) Для разъема сервопривода Lego вам необходимо припаять контакты ко всем четырем кабелям. Можно использовать светло-серый штекер. Для силового кабеля, соединяющего аккумуляторный блок с макетной платой, нам нужно только +9 Вольт и GND, но вы должны использовать темно-серый штекер (потому что вам нужен штекерный разъем):

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

Управление двигателем Lego с помощью микросхемы L293D

Нам нужно регулирование скорости для наших двигателей постоянного тока и регулирование положения для сервопривода Lego. Это достигается с помощью широтно-импульсной модуляции (ШИМ). Язык программирования Arduino упрощает использование ШИМ; просто вызовите analogWrite (pin, dutyCycle), где dutyCycle - это значение от 0 до 255. Контакты PWM отмечены знаком ~ на вашем Arduino.

Выходные контакты Arduino - 5 Вольт и макс. 30 мА, в то время как двигателям Lego требуется 9 Вольт, а каждый из них потребляет более 100 мА. Нам нужно какое-то промежуточное «переключающее устройство». Мы также хотим иметь возможность запускать двигатели постоянного тока в обоих направлениях. Эти функции решаются так называемым H-мостом. Мы будем использовать L293D, который содержит два H-моста на одной интегрированной микросхеме, что означает, что мы можем подключать двигатели Lego (M) параллельно с одной стороной, а сервопривод Lego (S) - с другой стороны микросхемы. (Если вы хотите управлять двумя двигателями независимо, вам понадобится второй L293D). Сервопривод Lego также необходимо подключить к GND и Lego +9 Вольт.

Чип полностью разделяет Lego +9 Вольт и Arduino +5 Вольт. Никогда не соединяйте их вместе, иначе вы что-нибудь повредите! Но вы должны соединить все линии заземления вместе с контактами заземления L293D.

В нашем Arduino мы будем использовать вывод 9 для управления скоростью двигателя и выводы 2 и 5 для управления направлением вращения. Сервопривод Lego управляется как мотор:мы подключаем штырь 3 для определения положения, а контакты 6 и 8 - для направления (влево или вправо).

В верхней части нашей программы мы определяем используемые выводы Arduino как константы. Далее мы определяем некоторые переменные, которые мы будем использовать для управления двигателями:

  // Выводы цифрового вывода управления двигателем определены как глобальные константыconst int controlPin1A =2; const int controlPin2A =5; const int ENablePin =9; // Выводы цифрового вывода сервоуправления определены как глобальные константы const int controlPin3A =6; const int controlPin4A =8; const int servoENablePin =3; // Глобальные переменные управления двигателем:int motorSpeed ​​=0; // Скорость двигателя 0..255int motorDirection =1; // Вперед (1) или назад (0) // Глобальные переменные сервоуправления:int рулевое управление =0; // Положение сервопривода 0..255int cabinDirection =0; // Влево (0) и вправо (1)  

В настройке мы определяем эти контакты как выходы с помощью команды pinmode (), а затем устанавливаем для них 0 Вольт с помощью digitalWrite ().

  void setup () {// прочее .... // Объявление цифровых выходных контактов:pinMode (controlPin1A, OUTPUT); // 1A pinMode (controlPin2A, OUTPUT); // 2A pinMode (ENablePin, OUTPUT); // EN1,2 pinMode (controlPin3A, OUTPUT); // 3A pinMode (controlPin4A, OUTPUT); // 4A pinMode (servoENablePin, OUTPUT); // EN3,4 digitalWrite (ENablePin, LOW); // двигатель выключен digitalWrite (servoENablePin, LOW); // по центру рулевого управления}  

Теперь нам нужно понять, как микросхема L293D управляет направлением вращения моторов. Мы должны подать следующие сигналы (высокий ==5 вольт; низкий ==0 вольт):

  • EN1,2 1A 2A
  • Высокий Высокий Низкий Мотор поворачивает влево (Вперед; motorDirection ==1)
  • High Low High Двигатель вращается вправо (Reverse; motorDirection ==0)
  • EN3,4 3A 4A
  • Высокий Высокий Низкий Сервопривод поворачивает налево (wheelDirection ==0)
  • Высокий Низкий Высокий Сервопривод поворачивает направо (wheelDirection ==1)

В порядке. Мы готовы написать подпрограмму, которая считывает глобальные переменные для направления и скорости / положения и управляет двигателями и сервоприводом:

  void SetMotorControl () {if (motorDirection ==1) // Вперед {digitalWrite (controlPin1A, HIGH); digitalWrite (controlPin2A, LOW); } else // Обратный {digitalWrite (controlPin1A, LOW); digitalWrite (controlPin2A, HIGH); } analogWrite (ENablePin, motorSpeed); // Скорость if (wheelDirection ==0) // Влево {digitalWrite (controlPin3A, HIGH); digitalWrite (controlPin4A, LOW); } else // Вправо {digitalWrite (controlPin3A, LOW); digitalWrite (controlPin4A, HIGH); } analogWrite (servoENablePin, рулевое управление); // Положение сервопривода}  

Простое Android-приложение на радиоуправлении с джойстиком

Затем давайте создадим простое приложение для Android для управления моделью. (Если вы хотите сначала протестировать готовое приложение:я сделал его доступным для вас в магазине Google Play. Вот ссылка:автомобильный Bluetooth Arduino RC).

Мы воспользуемся изобретателем приложений MIT 2. MIT App Inventor - новаторское введение в программирование и создание приложений для новичков. Марк Фридман из Google и профессор Массачусетского технологического института Хэл Абельсон совместно руководили разработкой App Inventor. Он работает как веб-служба, которую администрируют сотрудники Центра мобильного обучения Массачусетского технологического института.

На своем телефоне Android перейдите в Google Play и установите приложение MIT AI2 Companion. На вашем компьютере откройте ссылку на мое приложение RC в браузере Firefox или Chrome (Internet Explorer не поддерживается). Вам нужно будет войти в систему, используя свой gmail-адрес, и создать учетную запись, чтобы увидеть исходный код. Если вы откроете сопутствующее приложение на своем телефоне, вы сможете просмотреть исходный код в браузере, внести в него изменения и сразу же протестировать его на своем телефоне.

В браузере теперь вы увидите приложение в режиме конструктора:

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

Положение вашего пальца отслеживается двумя переменными currentX . и currentY и используется для расчета значений двух переменных рулевого управления и скорость (диапазон:-100..0 .. + 100). Сначала программа проверяет, находится ли ваш палец за пределами пэда, и ограничивает значения до +/- 100. Если палец находится внутри пэда, программа вычисляет значения для рулевого управления . и скорость . Затем программа генерирует командную строку вида:

Команда начинается с «RC» для дистанционного управления (идея состоит в том, что в будущем вы, возможно, захотите иметь больше команд), за которым следует запятая. Затем мы отправляем значения для рулевого управления и скорость . Символ новой строки ('\ n') в конце команды является сигналом для Arduino, что команда завершена. Эта командная строка отправляется через Bluetooth на Arduino. Для справки, строка также отображается на экране.

Чтение bluetooth-команд в Arduino

Для чтения командных строк Bluetooth нам необходимо подключить модуль Bluetooth HC-05. Взгляните на свой модуль:

У меня 6 контактов. Нам нужно всего четыре булавки. VCC - это (положительное) напряжение питания, а GND - это земля. Модуль выдерживает напряжение питания 6 вольт, что означает, что мы можем подключить его к 5-вольтовому выводу питания Arduino. TXD и RXD - это последовательные сигналы. Мы должны пересечь линии и подключить TXD к arduino RXD (контакт 0) и наоборот. Будьте осторожны: В нем указано УРОВЕНЬ:3,3 В, что означает, что RXD не может быть напрямую подключенным к 5V Arduino TXD (контакт 1). Мы должны сконструировать делитель напряжения с тремя резисторами 1 кОм, чтобы получить выходное напряжение, равное 2/3 от 5 В (см. Схемы). С другой стороны, сигнал TXD 3,3 В может быть напрямую подключен к Arduino RXD. Arduino распознает 3,3 Вольт как ВЫСОКОЕ.

Поскольку контакты 0 и 1 используются совместно с USB-портом вашего Arduino, вам придется отключить сигналы RXD и TXD от контактов 0 и 1 при загрузке программы через USB на плату. Загрузка не будет работать, если вы не отключите кабели.

Затем вам необходимо выполнить сопряжение модуля HC-05 с вашим устройством Android. Включите Bluetooth; запустить приложение; нажмите «Bluetooth-соединение»; сделайте свой телефон видимым и найдите устройство под названием HC-05 или подобное. Выберите устройство. Вам будет предложено ввести код. Нажмите «1234». Когда вы вернетесь к экрану джойстика, он должен отображаться зеленым цветом "подключен".

Теперь посмотрим на код:

  // Размер последовательного буфера:рассчитывается на основе максимального размера ввода, ожидаемого для одной команды # define INPUT_SIZE 30 void loop () {// Получить следующую команду из последовательного Bluetooth (добавить 1 байт для окончательного 0) char input [ INPUT_SIZE + 1]; // массив типа char (C-строка) // чтение Serial до заполнения новой строки или буфера или тайм-аута size =Serial.readBytesUntil ('\ n', input, INPUT_SIZE); // Добавляем последний 0 в конец C-строки input [size] =0; // Разделить строку вида:"RC, рулевое управление, скорость, \ n \ 0" char * command =strtok (input, ","); // команда (RC) // RCsteering в диапазоне:-100 (слева) .. 0 .. 100 (справа) char * RCsteering =strtok (NULL, ","); // RCspeed в диапазоне:-100 (полная скорость назад) .. 0 .. 100 (полная скорость вперед) char * RCspeed =strtok (NULL, ","); int iRCsteering =atoi (RCsteering); // преобразовываем строку в целое число int iRCspeed =atoi (RCspeed); // преобразование строки в целое число // остальная часть программы}  

Строка, отправляемая приложением Android, считывается специальной строковой конструкцией:C-строкой с нулевым завершением. (Символ 0 сообщает программе, что она подошла к концу строки). Это делается с помощью функции Serial.readBytesUntil ('\ n', input, ...), которая читает из последовательного интерфейса (bluetooth), пока не получит символ новой строки ('\ n'). Таким образом, мы продолжаем читать байты, пока не получим полную команду на вводе . :

Очень эффективный способ обработки ввода - функция токена строки, которая разрезает строку на части, используя запятую в качестве разделителя. Первый вызов strtok () возвращает «RC». Затем считываются последующие части команды путем передачи NULL в strtok (). Возвращаемые значения сохраняются в RCsteering . и RCspeed . Эти переменные на самом деле являются указателями на позиции в вводе . Функция atoi () окончательно конвертирует их в целые числа. Теперь у нас есть:

Мы почти закончили. Мы должны умножить эти значения на 2,55, прежде чем передавать их в нашу подпрограмму SetMotorControl () (помните, что скорость двигателя была в диапазоне 0..255). Изучите остальную часть программы в разделе КОД, соберите схему и протестируйте свою модель Lego с дистанционным управлением!

Что дальше?

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

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

Дайте мне знать о ваших интересных проектах!

Код

  • Legocar_v3_bluetooth
Legocar_v3_bluetooth Arduino
 / * Модель автомобиля Lego Powerfunctions, управляемая через Bluetooth. Arduino Uno управляет двигателями и сервоприводом. Дистанционное управление с помощью приложения для Android, разработанного с помощью MIT App Inventor 2. отключается при загрузке программы через USB) * L293D с двигателем (использует цифровые выводы Uno 2,5,9) * L293D с сервоприводом (использует цифровые выводы Uno 6,8,3) * /// Используемые библиотеки:#include  // Библиотека последовательного периферийного интерфейса # include  // содержит функцию strtok:разделить строку на токены // Размер последовательного буфера:рассчитать на основе максимального размера ввода, ожидаемого для одной команды через последовательный интерфейс Bluetooth # define INPUT_SIZE 30 / / Выводы цифрового выхода управления двигателем, определенные как глобальные константы (полный привод с 2 двигателями Lego):const int controlPin1A =2; // Вход 1A драйвера L293D на выводе 2 http://www.ti.com/lit/ds/symlink/l293.pdf, подключенный к контакту 2 цифрового выхода Arduinoconst int controlPin2A =5; // Вход 2A драйвера L293D на выводе 7 подключен к выводу 5 цифрового вывода Arduinoconst int ENablePin =9; // Вход L293D ENable (1,2) на контакте № 1, подключенном к контакту 9 цифрового выхода Arduino // Контакты цифрового выхода сервоуправления, определенные как глобальные константы (сервоуправление с 1 сервоприводом Lego):const int controlPin3A =6; // Вход 3A драйвера L293D на контакте № 10 подключен к контакту 6 цифрового выхода Arduinoconst int controlPin4A =8; // Вход 4A драйвера L293D на контакте № 15 подключен к контакту 8 цифрового выхода Arduino const int servoENablePin =3; // L293D Вход ENable (3,4) на контакте № 9, подключенный к контакту 3 цифрового выхода Arduino // Глобальные переменные управления двигателем:int motorSpeed ​​=0; // Скорость двигателя 0..255int motorDirection =1; // Вперед (1) или назад (0) // Глобальные переменные сервоуправления:int рулевое управление =0; // Положение сервопривода 0..255int cabinDirection =0; // Влево (0) и вправо (1) void setup () {Serial.begin (9600); // инициализируем последовательную связь Serial.setTimeout (1000); // Тайм-аут 1000 мс // Объявление контактов цифрового выхода:pinMode (controlPin1A, OUTPUT); // 1A pinMode (controlPin2A, OUTPUT); // 2A pinMode (ENablePin, OUTPUT); // EN1,2 pinMode (controlPin3A, OUTPUT); // 3A pinMode (controlPin4A, OUTPUT); // 4A pinMode (servoENablePin, OUTPUT); // EN3,4 digitalWrite (ENablePin, LOW); // двигатель выключен digitalWrite (servoENablePin, LOW); // управление по центру} void loop () {// Получить следующую команду из последовательного Bluetooth (добавить 1 байт для финального 0) char input [INPUT_SIZE + 1]; // массив типа char (C-строка) с завершающим нулем (https://www.arduino.cc/en/Reference/String) byte size =Serial.readBytesUntil ('\ n', input, INPUT_SIZE); // считываем серийный номер до заполнения новой строки или буфера или до истечения времени ожидания // Добавляем последний 0 для завершения C-строки input [size] =0; // Чтение команды, которая представляет собой C-строку вида:"RC, RCsteering, RCspeed, \ n \ 0" (заканчивается символом новой строки и нулем) char * command =strtok (input, ","); // пока игнорируем команду (RC для удаленного управления - единственная команда, отправляемая приложением на данный момент) char * RCsteering =strtok (NULL, ","); // далее идет RCsteering, который находится в диапазоне:-100 (слева) .. 0 .. 100 (справа) char * RCspeed =strtok (NULL, ","); // далее идет RCspeed, который находится в диапазоне:-100 (полная скорость назад) .. 0 .. 100 (полная скорость вперед) int iRCsteering =atoi (RCsteering); // преобразовываем строку RCsteering в целое число iRCsteering int iRCspeed =atoi (RCspeed); // преобразование строки RCspeed в целое число iRCspeed // Установка переменных управления двигателем и сервоприводом if (iRCsteering> 0) рулевое управление =1; // повернуть направо, если iRCsteering =1..100 else cabinDirection =0; // повернуть налево, если iRCsteering =-100..0 рулевое управление =int (2.55 * abs (iRCsteering)); // Положение сервопривода 0..255 на основе команды 0..100 if (iRCspeed> 0) motorDirection =1; // Устанавливаем машину вперед, если iRCspeed =1..100 else motorDirection =0; // Установить автомобиль в обратном направлении, если iRCspeed =-100..0 motorSpeed ​​=int (2.55 * abs (iRCspeed)); // Устанавливаем скорость 0..255 на основе команды 0..100 SetMotorControl (); // регулировка направления и скорости двигателя} void SetMotorControl () / * Логика L293:EN1,2 1A 2A HHL Двигатель вращается влево (вперед; motorDirection ==1) HLH Двигатель вращается вправо (Reverse; motorDirection ==0) EN3,4 3A 4A HHL Сервопривод поворачивается влево (рулевое управление ==0) HLH Сервопривод поворачивается вправо (рулевое управление ==1) Скорость двигателя:сигнал ШИМ на EN1,2 (490 Гц; цифровое выходное значение 0..255 для скорости двигателя) Положение сервопривода:сигнал ШИМ включен EN3,4 (490 Гц; значение цифрового выхода 0..255 для позиции; 0 - прямо вперед) * / {if (motorDirection ==1) // Вперед {digitalWrite (controlPin1A, HIGH); digitalWrite (controlPin2A, LOW); } else // Обратный {digitalWrite (controlPin1A, LOW); digitalWrite (controlPin2A, HIGH); } analogWrite (ENablePin, motorSpeed); // Скорость if (wheelDirection ==0) // Влево {digitalWrite (controlPin3A, HIGH); digitalWrite (controlPin4A, LOW); } else // Вправо {digitalWrite (controlPin3A, LOW); digitalWrite (controlPin4A, HIGH); } analogWrite (servoENablePin, рулевое управление); // Положение сервопривода} 
Github Lego-car-Arduino
Содержит исходный код Arduino; Диаграмма фрицинга; исходный код приложения для Android для загрузки в приложение MIT изобретатель https://github.com/Notthemarsian/Lego-car-Arduino

Схема

Github Lego-car-Arduino
Содержит исходный код Arduino; Диаграмма фрицинга; исходный код приложения для Android для загрузки в приложение MIT изобретатель https://github.com/Notthemarsian/Lego-car-Arduino Lego% 20rc% 20car% 20v2.fzz

Производственный процесс

  1. Возьмите под свой контроль обоюдоострый меч SaaS
  2. Производные степенных функций от e
  3. Производные силовых функций e
  4. Стратегии для более надежных компонентов передачи энергии
  5. Основы электрических панелей управления
  6. Сила ветра
  7. Британские производители тратят более 2,5 млн фунтов стерлингов на исправление ошибок
  8. Электроснабжение и климат-контроль
  9. 8 шагов для отладки вашей системы управления технологическим процессом
  10. Контроль натяжения при обработке паутины – ключевые компоненты