В области робототехники и автоматизации точно управляемые механические движения произвели революцию в самых разных отраслях, от производства до здравоохранения. Благодаря появлению экономичных микроконтроллеров (Arduino, ESP8266, ESP32, STM32) и легкодоступных инструментов программирования, энтузиасты и любители теперь могут создавать собственные роботизированные руки с управлением по Bluetooth, используя плату Arduino, сервомоторы и драйвер двигателя.
Этот учебный материал послужит наглядным руководством по созданию роботизированной руки на базе платы Arduino, оснащенной беспроводным управлением и возможностью программирования с помощью специально разработанного Android-приложения. В интерфейсе приложения отдельные сервоприводы или оси роботизированной руки можно перемещать вручную с помощью специальных кнопок. Примечательно, что этот робот-машина выполняет две основные функции: режим автомобиля с приводом на два колеса и управление роботизированной рукой. Эта интеграция достигается за счет использования двух двигателей постоянного тока и роботизированной руки. Сама роботизированная рука представлена как в виде 3D-модели (разработанной с нуля), так и в виде физически собранной модели.
Также на нашем сайте вы можете посмотреть другие аналогичнын проекты робототехники:
- робот SCARA на Arduino своими руками;
- роботизированная рука Arduino на колесной платформе;
- роботизированная рука на Arduino управляемая со смартфона;
- 3D роботизированная рука на Arduino с записью и воспроизведением действий;
- управляемая жестами роботизированная рука на Arduino Nano.
Необходимые компоненты
- Плата Arduino (например, Arduino Uno) (купить на AliExpress).
- Сервомоторы MG 90 с металлическими шестернями (3 шт.)
- Драйвер двигателя L298N (купить на AliExpress).
- Bluetooth модуль HC-05 (купить на AliExpress).
- Корпус и механические компоненты роботизированной руки, вырезанные лазером.
- Литий-ионный аккумулятор 12 В.
- DC-DC понижающий преобразователь LM2596.
- Выключатель.
- Соединительные провода
- Макетная плата или печатная плата (PCB).
- Винты, гайки, прокладки.
Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158
Кинематика манипулятора робота
На первый взгляд, идея создания роботизированной руки может показаться сложной и пугающей. Но после изучения физики и кинематики, лежащих в её основе, и более глубокого погружения в тему, вы поймете, что это не так уж и сложно.
Этот роботизированный манипулятор состоит из 3 сервомоторов: 1 для захвата и 2 для перемещения суставов манипулятора. Это означает, что число степеней свободы (degree of freedom, DOF) этого робота равно 2. Угол и положение манипулятора зависят от кинематики.
Кинематика — это наука, изучающая движение объекта (робота) без учета причин этого движения. Кинематика изучает положение, скорость, ускорение и другие производные положения по времени. Следовательно, изучение кинематики охватывает все геометрические и временные свойства движения.
Манипулятор-рука представляет собой набор звеньев, соединенных шарнирами; нижняя часть называется основанием , а концевая часть — концевым эффектором. Количество шарниров и способ их перемещения определяют степень свободы (DOF). Шарниры подразделяются на вращательные и призматические. На рисунке ниже показан робот с 2 степенями свободы, состоящий из вращательных шарниров. Типичный промышленный робот имеет 5 или 6 шарниров. В данном проекте кинематика и динамика для простоты выводятся из системы с 2 степенями свободы.
Прямая кинематика
Прямая кинематика включает в себя использование кинематических уравнений робота для расчета положения концевого эффектора на основе заданных значений параметров сочленений, которые в данном контексте представляют собой положения сервомоторов. На приведенном ниже эскизе роботизированной руки можно визуализировать параметры Денавита-Хартенберга, являющиеся важным компонентом этого процесса. Кроме того, представлены выведенные уравнения прямой кинематики для роботизированной руки.
Хотя в конечном итоге был выбран альтернативный подход, не основанный на матрицах, полученные уравнения остаются ценными для тех, кто заинтересован в изучении различных методологий. Важно отметить, что «C» обозначает косинус, а «S» — синус.
Обратная кинематика
Решая уравнения обратной кинематики, мы можем точно управлять движением и ориентацией концевого эффектора роботизированной руки. Эти уравнения позволяют определить необходимые углы для каждого сустава, чтобы достичь желаемого положения в пространстве. На рисунке ниже наглядно показаны переменные, играющие решающую роль в этих уравнениях, что позволяет нам переводить математические концепты в практические движения руки.
Проектирование и создание роботизированной руки
Я специально для этого проекта разработал роботизированную руку, и на изображениях ниже вы можете увидеть скриншоты созданного мной CAD-проекта в Onshape , а также фотографии собственноручно изготовленной механической руки. Если вас интересует повторение этого проекта или использование моей разработки в вашей работе, я включил CAD- файлы в формате .dxf, которые вы можете скачать здесь.
Для изготовления манипулятора я использовал детали из акрила, вырезанные лазером. Однако, если у вас есть доступ к 3D-принтеру, вы также можете использовать его. Если вы выберете 3D-печать, вам потребуется открыть файлы в SolidWorks, преобразовать их в формат STL и сохранить. Для этого откройте любую деталь, нажмите «Сохранить как» и выберите формат файла STL.
Вот визуальное представление того, как будет выглядеть вырезанный лазером акриловый лист.
Роботизированные манипуляторы на базе Arduino, как и другие роботизированные манипуляторы, обычно оцениваются по числу степеней свободы (DOF). Этот термин обозначает количество вращательных шарниров, встроенных в конструкцию робота. Понятие DOF взаимозаменяемо с термином «оси», который в данном контексте является общепринятым. Например, роботизированный манипулятор с 2 степенями свободы (2 оси) оснащен двумя различными осями, обеспечивающими определенное движение.
Эта роботизированная рука поставляется в разобранном виде, что требует минимальной пайки для сборки и активации. Она оснащена двумя сервоприводами MG90, обеспечивающими две степени свободы движения. Примечательно, что она может эффективно захватывать легкие объекты с помощью захватного механизма.
Ключевые особенности нашего манипулятора:
- Основание, также известное как «талия», часто обеспечивает вращение манипулятора на 180° или 360° в зависимости от типа используемого сервопривода (в данном проекте использовался сервопривод с углом поворота 180°).
- Маневр «Плечо» отвечает за вертикальное поднятие или опускание руки.
- Захватное устройство активируется либо открываясь, либо закрываясь, чтобы «захватить предмет».
Сборка роботизированной руки
Для создания роботизированной руки в нашем проекте мы использовали акриловый лист, вырезанный лазером. Лист был точно вырезан, чтобы вместить все необходимые детали и компоненты, что позволяет легко собрать конструкцию с помощью отвёрток.
Перед началом сборки необходимо отрегулировать угол наклона сервомоторов. В противном случае ваш роботизированный манипулятор не будет работать должным образом.
Для начала прикрепите сервопривод к сервомотору, тщательно выровняв и закрепив его на месте. Мы можем вручную откалибровать и отрегулировать угол поворота сервомотора, но иногда ручная калибровка неточна или невозможна. Поэтому вы можете откалибровать свои сервомоторы, используя предоставленный код #1. Обратитесь к приведенной ниже схеме и подключите ваши сервомоторы к контактам 5, 6 и 3 Arduino соответственно. Загрузите предоставленный код #1 на вашу плату Arduino, что упростит процесс калибровки. Невыполнение этого шага может привести к нестабильной работе вашего робота.
Обеспечив правильное выравнивание и калибровку сервоприводов, вы закладываете основу для стабильной и хорошо функционирующей работы робота.
Угловые значения для движений роботизированной руки
Значение этого угла может изменяться в зависимости от регулировки сервопривода. После завершения регулировки сервопривода вы можете перейти к этапам сборки.
Шаг 1: На этом изображении показаны все необходимые компоненты для сборки роботизированной руки.
Шаг 2: Закрепите сервомотор на опорной пластине захвата с помощью гаек и болтов M2.5 10 мм.
Шаг 3: Прикрепите пару зубчатых колес захвата к сервоприводу и опорной пластине с помощью гаек и болтов M4 10 мм.
Шаг 4: Закрепите захватную руку на обеих шестернях в заданных положениях с помощью гаек и болтов M3 30 мм.
Шаг 5: Присоедините опорную тягу к захвату и опорной пластине сервопривода с помощью гаек и болтов M3 и M4 диаметром 10 мм.
Шаг 6: Наконец, прикрепите боковой ограничитель и опорные ножки для перемещения плеча к соответствующим местам с помощью гаек и болтов M3.
Схема роботизированной руки на автомобиле с управлением по Bluetooth
Схема роботизированной руки на автомобиле с управлением по Bluetooth и использованием платы Arduino (3 сервомотора) приведена на следующем рисунке.
В этой конфигурации двигатели постоянного тока работают как колеса робота, помогая ему двигаться в разных направлениях. В то же время три сервомотора выполняют функцию шарниров роботизированной руки, позволяя ей поворачиваться и вращаться в талии, поднимать или опускать плечо, а также открывать или закрывать захват.
Для этого проекта не требуется сложная проводка, поскольку все двигатели работают от 5 В. Мы управляем двигателями с помощью цифровых выводов . Мы не использовали вывод 5 В на Arduino, потому что он не обеспечил бы достаточного питания для корректной работы всех двигателей. Вместо этого мы используем понижающий DC-DC преобразователь и другой источник питания. Таким образом, мы можем обеспечить достаточное питание для корректной работы всех двигателей.
Подключение Arduino и модуля управления двигателем L298n:
- Подключите контакт заземления (GND) Arduino к заземляющей шине макетной платы.
- Подключите вывод Vin платы Arduino к положительной шине на макетной плате.
- Подключите выходное напряжение 5 В понижающего DC-DC преобразователя LM2596 к положительной шине на макетной плате.
- Подключите выход заземления (GND) понижающего DC-DC преобразователя LM2596 к заземляющей шине на макетной плате.
- Подключите выводы входа 1 (IN1) и входа 2 (IN2) драйвера двигателя L298N к двум цифровым выводам Arduino (например, выводам 7 и 8) для управления первым двигателем постоянного тока.
- Подключите выводы 3 (IN3) и 4 (IN4) драйвера двигателя L298N к двум цифровым выводам Arduino (например, выводам 12 и 11) для управления вторым двигателем постоянного тока.
- Подключите выводы ENA и ENB драйвера двигателя L298N к высокому выводу драйвера двигателя L298N на плате.
Подключение сервомотора:
- Подключите коричневый сигнальный провод сервопривода талии (первого сервомотора) к цифровому выводу Arduino (например, к выводу 5).
- Подключите красный положительный провод сервопривода талии к положительной шине на макетной плате.
- Подключите черный отрицательный провод сервопривода талии к заземляющей шине на макетной плате.
- Подключите коричневый сигнальный провод плечевого сервомотора (второго сервомотора) к цифровому выводу Arduino (например, к выводу 6).
- Подключите красный положительный провод плечевого сервопривода к положительной шине на макетной плате.
- Подключите черный отрицательный провод плечевого сервопривода к заземляющей шине на макетной плате.
- Подключите коричневый сигнальный провод сервопривода захвата (третьего сервомотора) к цифровому выводу Arduino (например, к выводу 3).
- Подключите красный положительный провод сервопривода захвата к положительной шине на макетной плате.
- Подключите черный отрицательный провод сервопривода захвата к заземляющей шине на макетной плате.
Подключение модуля Bluetooth:
- Подключите контакт TX модуля Bluetooth HC-05 к контакту RX (цифровой контакт 0) Arduino.
- Подключите контакт RX модуля Bluetooth HC-05 к контакту TX (цифровой контакт 1) Arduino.
- Подключите вывод VCC модуля Bluetooth HC-05 к 5-вольтовой шине макетной платы.
- Подключите контакт GND модуля Bluetooth HC-05 к заземляющей шине макетной платы.
Подключение питания:
- Подключите положительный полюс литий-ионного аккумулятора 12 В к входу Vin понижающего преобразователя постоянного тока LM2596.
- Подключите отрицательную клемму батареи к заземляющей шине на макетной плате.
- Подключите положительный полюс литий-ионного аккумулятора 12 В к входу 12 В модуля управления двигателем L298n.
- Подключите отрицательную клемму батареи к заземлению (GND) модуля управления двигателем L298n.
При работе с несколькими сервомоторами потребляемая мощность превышает возможности микроконтроллера Arduino Uno. Поэтому необходим внешний источник питания. Однако крайне важно убедиться, что входное напряжение не превышает 5 вольт, чтобы предотвратить повреждение микроконтроллера Arduino.
При использовании батареи с более высоким напряжением, используйте схему понижения напряжения (понижающий преобразователь постоянного тока), чтобы понизить его до 5 вольт. Подключите выход схемы понижения напряжения к Arduino и сервомоторам. Это обеспечит безопасное и эффективное электропитание.
Кроме того, обязательно настройте управление сервомотором и направлением вращения двигателя в вашем коде Arduino. Всегда дважды проверяйте соединения перед включением питания схемы.
Объяснение кода программы
Роботизированная рука-машина с управлением по Bluetooth управляется через приложение для Android на смартфоне. Приложение имеет различные кнопки для движения машины вперед, назад, влево и вправо. Оно также управляет движениями талии, плеч и захвата роботизированной руки.
Приложение отправляет сигналы сервомоторам робота при нажатии определенной кнопки, указывая им, как расположить манипулятор для каждого типа движения.
Перед началом сборки важно выполнить этот код №1. Он предназначен для калибровки и регулировки сервомоторов под нужными углами. Запустив этот код, вы можете убедиться в правильной работе и точном позиционировании сервомоторов. Это поможет предотвратить любые потенциальные проблемы или осложнения на последующих этапах процесса сборки.
Код #1
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#include <ESP32_Servo.h> // include servo library // Define 3 Servos Servo myServo1; // waist or base Servo Servo myServo2; // shoulder Servo Servo myServo3; // gripper Servo void setup() { // Attach servos to Arduino PWM Pins myServo1.attach(5); myServo2.attach(6); myServo3.attach(3); myServo1.write(90); myServo2.write(90); myServo3.write(90); } void loop() { } |
Далее код №2 включает в себя все необходимые движения сервомоторов для обеспечения работоспособности вашего робота. Без этого кода вы не сможете успешно завершить проект. Он имеет решающее значение для правильной работы робота.
В этом коде описаны механизмы настройки и управления роботизированной рукой и автомобилем Arduino с приводом на два колеса, использующими сервомоторы и двигатели постоянного тока. Он интегрирует связь Bluetooth для обеспечения дистанционного управления и демонстрирует, как изменять углы поворота сервомоторов и направления вращения двигателей для выполнения определенных движений.
Код #2
|
1 2 3 4 |
#include <Servo.h> Servo motor_1; Servo motor_2; Servo motor_3; |
Эти строки содержат необходимую библиотеку для использования сервомоторов и определяют три объекта Servo (motor_1, motor_2 и motor_3), которые создаются для управления тремя сервомоторами, подключенными к контактам 5, 6 и 3 соответственно.
|
1 2 3 4 |
#define in1 7 //Motor1 L298 Pin in1 #define in2 8 //Motor1 L298 Pin in1 #define in3 12 //Motor2 L298 Pin in1 #define in4 11 //Motor2 L298 Pin in1 |
Эти строки определяют цифровые контакты Arduino (контакты 7, 8, 12 и 11) для входов драйвера двигателя L298N, управляющего двигателями постоянного тока. Контакты in1 и in2 управляют одним двигателем, а контакты in3 и in4 — другим.
|
1 2 3 4 5 |
int servo1 = 90; int servo2 = 0; int servo3 = 90; int bt_data; int Speed = 130; |
Заданы начальные положения (углы) для трех сервоприводов: servo1, servo2 и servo3. Для хранения входящих данных Bluetooth используется переменная bt_data. Скорость изначально установлена на 130.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
void setup(){ Serial.begin(9600); // инициализация последовательной связи со скоростью 9600 бит в секунду: motor_1.attach(5); // Сервопривод пояса motor_2.attach(6); // Плечевой сервопривод motor_3.attach(3); // Сервопривод захвата motor_1.write(servo1); motor_2.write(servo2); motor_3.write(servo3); //pinMode(enA, OUTPUT); // объявляется как выход для вывода enA микросхемы L298 pinMode(in1, OUTPUT); // объявляем вывод in1 микросхемы L298 как выходной pinMode(in2, OUTPUT); // объявляется как выход для вывода in2 микросхемы L298 pinMode(in3, OUTPUT); // объявляем вывод in3 как выход для микросхемы L298 pinMode(in4, OUTPUT); // объявляем вывод in4 как выход для микросхемы L298 //pinMode(enB, OUTPUT); // объявляется как выход для вывода enB микросхемы L298 digitalWrite(in1, LOW); //Правый вывод двигателя для передачи вперед digitalWrite(in2, LOW); //Правый контакт двигателя для обратной связи digitalWrite(in3, LOW); //Контакт обратной связи левого двигателя digitalWrite(in4, LOW); //Контакт переднего хода левого двигателя delay(1000); } |
В функции setup() инициализируется последовательная связь со скоростью 9600 бит в секунду. Сервомоторы подключаются к определенным выводам, и задаются их начальные положения. Цифровые выводы для управления двигателями и выводы драйвера двигателя устанавливаются в качестве выходов. Выводы драйвера двигателя изначально устанавливаются в низкое состояние, чтобы гарантировать, что двигатели не будут двигаться во время настройки.
|
1 2 3 4 5 6 7 8 |
void loop(){ //if some date is sent, reads it and saves in state if(Serial.available() > 0){ bt_data = Serial.read(); Serial.println(bt_data); if(bt_data > 20) {Speed = bt_data;} } |
Функция loop() — это место, где основная логика программы выполняется в непрерывном цикле.
Этот блок кода считывает входящие данные Bluetooth из последовательного соединения. Если полученное количество данных превышает 20, он обновляет переменную Speed.
|
1 2 3 4 5 6 7 8 9 10 |
if(bt_data == 1) {forword(); } // if the bt_data is '1' the DC motor will go forward else if(bt_data == 2) {backword();} // if the bt_data is '2' the motor will Reverse else if(bt_data == 3) {turnLeft();} // if the bt_data is '3' the motor will turn left else if(bt_data == 4) {turnRight();} // if the bt_data is '4' the motor will turn right else if(bt_data == 5) {Stop(); } // if the bt_data '5' the motor will Stop |
Эти условные операторы проверяют значение bt_data и вызывают соответствующие функции (forward, backward, turnLeft, turnRight, Stop) в зависимости от полученных данных.
|
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 |
else if (bt_data == 8){ if(servo1<180){servo1 = servo1+1;} motor_1.write(servo1); } else if (bt_data == 9){ if(servo1>0){servo1 = servo1-1;} motor_1.write(servo1); } else if (bt_data == 10){ if(servo2>0){servo2 = servo2-1;} motor_2.write(servo2); } else if (bt_data == 11){ if(servo2<180){servo2 = servo2+1;} motor_2.write(servo2); } else if (bt_data == 16){ if(servo3>60){servo3 = servo3-1;} motor_3.write(servo3); } else if (bt_data == 17){ if(servo3<150){servo3 = servo3+1;} motor_3.write(servo3); } delay(30); } |
Эти условные операторы регулируют положение сервопривода на талии (motor_1) на основе полученных данных Bluetooth.
Остальные блоки else if аналогичным образом регулируют положение сервоприводов плеча и захвата (motor_2 и motor_3).
Функция delay вводит короткую паузу между итерациями цикла, чтобы предотвратить быстрое и непрерывное выполнение.
|
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 |
void forword(){ //forword digitalWrite(in1, ВЫСОКИЙ); //Правый мотор переднего контакта digitalWrite(in2, LOW); //Правый контакт двигателя для обратной связи digitalWrite(in3, HIGH); // Контакт переднего хода левого двигателя digitalWrite(in4, LOW); //Контакт для обратной тяги левого двигателя } void backword(){ //обратное слово digitalWrite(in1, LOW); digitalWrite(in2, HIGH); digitalWrite(in3, LOW); digitalWrite(in4, HIGH); } void turnRight(){ //turnRight digitalWrite(in1, LOW); digitalWrite(in2, HIGH); digitalWrite(in3, HIGH); digitalWrite(in4, LOW); } void turnLeft(){ //turnLeft digitalWrite(in1, HIGH); digitalWrite(in2, LOW); digitalWrite(in3, LOW); digitalWrite(in4, HIGH); } void Stop(){ //остановка digitalWrite(in1, LOW); digitalWrite(in2, LOW); digitalWrite(in3, LOW); digitalWrite(in4, LOW); } |
Эти функции (вперед, назад, поворот налево, поворот направо, остановка) определяют движения робота на основе состояний контактов драйвера двигателя.
Эти функции управляют направлением вращения двигателей для достижения желаемого движения.
Такая организация кода позволяет модульно структурировать функциональность и упростить понимание и сопровождение. Условные операторы гарантируют выполнение соответствующей функции перемещения при выполнении соответствующего условия на основе полученных данных.
Приложение для Android для управления автомобилем с роботизированной рукой
В Play Store есть множество различных приложений для управления роботизированной рукой. Но для этого проекта я создаю собственное Android-приложение с помощью MIT App Inventor. Подробнее о том как это делать можно прочитать в следующей статье — как создать собственное приложение Android для проекта Arduino с помощью MIT App Inventor.
Также вы можете скачать готовый APK файл данного приложения по следующей ссылке.
Для подключения роботизированной руки на автомобиле с управлением по Bluetooth к вашему телефону выполните следующие действия:
-
Откройте приложение «Robotic Arm Car» на своем устройстве Android. Обратите внимание, что в настоящее время это приложение недоступно для пользователей iOS.
-
Включите Bluetooth на своем телефоне, зайдя в настройки телефона.
-
Подключите свой телефон к модулю Bluetooth HC-05. Если у вас новый модуль HC-05, перед подключением потребуется выполнить дополнительные действия:
- Зайдите в настройки Bluetooth на своем телефоне.
- Найдите устройства Bluetooth.
- Вы найдете устройство Bluetooth под названием HC-05.
- Для сопряжения Bluetooth-устройства с телефоном выберите его.
- В процессе сопряжения вам будет предложено ввести пароль.
- Пароль по умолчанию для HC-05 обычно равен либо 1234, либо 0000.
- Введите пароль и продолжите процесс сопряжения.
-
После успешного сопряжения ваш роботизированный манипулятор на машине, управляемый по Bluetooth, будет подключен к вашему устройству Android.
Это приложение имеет в общей сложности 10 кнопок управления, разработанных для обеспечения бесперебойного взаимодействия. Четыре из этих кнопок предназначены для управления движениями робота — вперед, назад, вправо и влево. Остальные шесть кнопок специально выделены для точной настройки углов сервоприводов роботизированной руки.
После того, как модуль Bluetooth HC-05 будет правильно сопряжен с телефоном Android с помощью нашего специального приложения, пользователь сможет без труда активировать эти кнопки управления. При нажатии кнопки управления телефон Android оперативно отправляет и получает соответствующее значение, обеспечивая точное и быстрое управление роботом и его роботизированной рукой.
Заключение
Моделирование роботизированной руки — сложная задача, начинающаяся с кинематики движения и определения необходимого количества энергии в динамике. Создание роботизированной руки с управлением по Bluetooth на базе Arduino — это практическое знакомство с робототехникой и автоматизацией. В этом проекте представлен прототип роботизированного манипулятора с двумя степенями свободы для подъема и перемещения легких материальных объектов с помощью захвата. Объединив сервоприводы, драйвер двигателя и связь по Bluetooth, энтузиасты могут создать универсальную и интерактивную механическую систему. Этот проект не только демонстрирует слияние аппаратного и программного обеспечения, но и служит ступенькой к более сложным роботизированным проектам. Независимо от того, являетесь ли вы начинающим инженером или просто интересуетесь робототехникой, этот проект предлагает захватывающее и познавательное путешествие в мир автоматизации.
Полный код проекта
|
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 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
Code #1 #include // include servo library // Define 3 Servos Servo myServo1; // waist or base Servo Servo myServo2; // shoulder Servo Servo myServo3; // gripper Servo void setup() { // Attach servos to Arduino PWM Pins myServo1.attach(5); myServo2.attach(6); myServo3.attach(3); myServo1.write(90); myServo2.write(90); myServo3.write(90); } void loop() { } Code #2 #include <Servo.h> Servo motor_1; Servo motor_2; Servo motor_3; //#define enA 9 //Enable1 L298 Pin enA #define in1 7 //Motor1 L298 Pin in1 #define in2 8 //Motor1 L298 Pin in1 #define in3 12 //Motor2 L298 Pin in1 #define in4 11 //Motor2 L298 Pin in1 //#define enB 9 //Enable2 L298 Pin enB int servo1 = 90; int servo2 = 0; int servo3 = 90; int bt_data; int Speed = 130; void setup(){ Serial.begin(9600); // initialize serial communication at 9600 bits per second: motor_1.attach(5); // Waist Servo motor_2.attach(6); // Shoulder Servo motor_3.attach(3); // Gripper Servo motor_1.write(servo1); motor_2.write(servo2); motor_3.write(servo3); //pinMode(enA, OUTPUT); // declare as output for L298 Pin enA pinMode(in1, OUTPUT); // declare as output for L298 Pin in1 pinMode(in2, OUTPUT); // declare as output for L298 Pin in2 pinMode(in3, OUTPUT); // declare as output for L298 Pin in3 pinMode(in4, OUTPUT); // declare as output for L298 Pin in4 //pinMode(enB, OUTPUT); // declare as output for L298 Pin enB digitalWrite(in1, LOW); //Right Motor forword Pin digitalWrite(in2, LOW); //Right Motor backword Pin digitalWrite(in3, LOW); //Left Motor backword Pin digitalWrite(in4, LOW); //Left Motor forword Pin delay(1000); } void loop(){ //if some date is sent, reads it and saves in state if(Serial.available() > 0){ bt_data = Serial.read(); Serial.println(bt_data); if(bt_data > 20) {Speed = bt_data;} } //analogWrite(enA, Speed); // Write The Duty Cycle 0 to 255 Enable Pin A for Motor1 Speed //analogWrite(enB, Speed); // Write The Duty Cycle 0 to 255 Enable Pin B for Motor2 Speed if(bt_data == 1) {forword(); } // if the bt_data is '1' the DC motor will go forward else if(bt_data == 2) {backword();} // if the bt_data is '2' the motor will Reverse else if(bt_data == 3) {turnLeft();} // if the bt_data is '3' the motor will turn left else if(bt_data == 4) {turnRight();} // if the bt_data is '4' the motor will turn right else if(bt_data == 5) {Stop(); } // if the bt_data '5' the motor will Stop else if (bt_data == 8){ if(servo1<180){servo1 = servo1+1;} motor_1.write(servo1); } else if (bt_data == 9){ if(servo1>0){servo1 = servo1-1;} motor_1.write(servo1); } else if (bt_data == 10){ if(servo2>0){servo2 = servo2-1;} motor_2.write(servo2); } else if (bt_data == 11){ if(servo2<180){servo2 = servo2+1;} motor_2.write(servo2); } else if (bt_data == 16){ if(servo3>60){servo3 = servo3-1;} motor_3.write(servo3); } else if (bt_data == 17){ if(servo3<150){servo3 = servo3+1;} motor_3.write(servo3); } delay(30); } void forword(){ //forword digitalWrite(in1, HIGH); //Right Motor forword Pin digitalWrite(in2, LOW); //Right Motor backword Pin digitalWrite(in3, HIGH); //Left Motor forward Pin digitalWrite(in4, LOW); //Left Motor backward Pin } void backword(){ //backword digitalWrite(in1, LOW); digitalWrite(in2, HIGH); digitalWrite(in3, LOW); digitalWrite(in4, HIGH); } void turnRight(){ //turnRight digitalWrite(in1, LOW); digitalWrite(in2, HIGH); digitalWrite(in3, HIGH); digitalWrite(in4, LOW); } void turnLeft(){ //turnLeft digitalWrite(in1, HIGH); digitalWrite(in2, LOW); digitalWrite(in3, LOW); digitalWrite(in4, HIGH); } void Stop(){ //stop digitalWrite(in1, LOW); digitalWrite(in2, LOW); digitalWrite(in3, LOW); digitalWrite(in4, LOW); } |
