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

Простая и умная роботизированная рука с использованием Arduino

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

Arduino UNO
× 1
Микро сервоприводы
× 5
Потенциометры
× 5
Макет (общий)
× 1

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

В этом уроке я буду делать простую роботизированную руку, которой будет управлять мастер-рука. Рука будет запоминать ходы и играть по очереди. Идея не нова. Идею я получил от «мини-роботизированной руки - от Stoerpeak». Я давно хотел сделать это, но тогда я был полным новичком и ничего не знал о программировании. Теперь, наконец, я создаю один, сохраняю его простым, дешевым и делюсь им со всеми вами.

Итак, приступим ....

Шаг 1. Вещи, которые вам понадобятся

Вот список вещей, которые вам понадобятся:-

1. Серводвигатели x 5 (Amazon Link)

2. Потенциометры x 5 (Amazon Link)

3. Arduino UNO. (Ссылка на Amazon)

4. Аккумулятор. (Я использую адаптер на 5 В)

5. Макетная плата. (Ссылка на Amazon)

6. Картон / дерево / солнечная доска / акрил - все, что есть в наличии или легко найти.

И вам также понадобится установленная Arduino IDE.

Шаг 2. Изготовление руки

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

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

Для руки Master я приклеил потенциометры к палочкам для мороженого и сделал руку.

Обращение к изображениям даст вам лучшую идею.

Я установил все на холст формата A4, который использовался в качестве основы.

Шаг 3. Установление соединений

На этом этапе мы выполним все необходимые подключения, см. Изображения выше.

  • Сначала подключите все сервоприводы параллельно к источнику питания (красный провод к + ve и черный или коричневый провод к Gnd)
  • Затем подключите сигнальные провода, т.е. желтый или оранжевый провод, к выводу PWM Arduino.
  • Теперь подключите потенциометры к + 5В и Gnd на Arduino параллельно.
  • Подключите средний вывод к аналоговому выводу ardunio.

Здесь цифровые выводы 3, 5, 6, 9 и 10 используются для управления сервоприводами

Аналоговые контакты с A0 по A4 используются для ввода с потенциометров.

Сервопривод, подключенный к контакту 3, будет управляться потенциометром, подключенным к A0

Сервопривод, подключенный к выводу 5, будет управляться потенциометром на A1 и так далее ....

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

Шаг 4. Кодирование

Логика этого кода довольно проста:значения потенциометров хранятся в массиве, записи затем просматриваются с использованием цикла for, а сервоприводы выполняют шаги в соответствии со значениями. Вы можете ознакомиться с этим учебным пособием, которое я использовал для справки «Управление сервоприводом и памятью потенциометра Arduino»

Код:- (Загружаемый файл прилагается ниже.)

  • Сначала мы объявим все необходимые переменные глобально, чтобы мы могли использовать их во всей программе. Никаких особых пояснений для этого не требуется.
  #include  
// Сервообъекты
Серво Серво_0;
Серво Серво_1;
Серво Серво_2;
Серво Серво_3;
Servo Servo_4;
// Объекты потенциометра
int Pot_0;
int Pot_1;
int Pot_2;
int Pot_3;
int Pot_4;
// Переменная для хранения позиции сервопривода
int Servo_0_Pos;
int Servo_1_Pos;
int Servo_2_Pos;
int Servo_3_Pos;
int Servo_4_Pos;
// Переменная для хранения значений предыдущей позиции
int Prev_0_Pos;
int Prev_1_Pos;
int Prev_2_Pos;
int Prev_3_Pos;
int Prev_4_Pos;
// Переменная для хранения значений текущей позиции
int Current_0_Pos;
int Current_1_Pos;
int Current_2_Pos;
int Current_3_Pos;
int Current_4_Pos;
int Servo_Position; // Сохраняет угол
int Servo_Number; // Не хранит сервопривод
int Storage [600]; // Массив для хранения данных (при увеличении размера массива потребуется больше памяти)
int Index =0; // Индекс массива начинается с 0-й позиции
char data =0; // переменная для хранения данных из последовательного ввода.
  • Теперь мы напишем функцию настройки, в которой мы установим контакты и их функции. Это основная функция, которая выполняется первой.
  void setup () 
{
Serial.begin (9600); // Для последовательной связи между arduino и IDE.
// Сервообъекты прикрепляются к выводам ШИМ.
Servo_0.attach (3);
Servo_1.attach (5);
Servo_2.attach (6);
Servo_3.attach (9);
Servo_4.attach (10);
// Сервоприводы устанавливаются в положение 100 при инициализации.
Servo_0.write (100);
Servo_1.write (100);
Servo_2.write (100);
Servo_3.write (100);
Servo_4. write (100);
Serial.println («Нажмите« R »для записи и« P »для воспроизведения»);
}

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

  void Map_Pot () 
{
/ * Сервоприводы вращаются на 180 градусов
, но использовать его для ограничения
не очень хорошая идея, так как это делает сервоприводы постоянно гудят,
что раздражает, поэтому мы ограничиваем перемещение сервоприводов
между:1-179 * /
Pot_0 =analogRead (A0); // Считываем ввод из банка и сохраняем его в переменной Pot_0.
Servo_0_Pos =map (Pot_0, 0, 1023, 1, 179); // Отображение сервоприводов в соответствии со значением от 0 до 1023
Servo_0.write (Servo_0_Pos); // Перемещаем сервопривод в это положение.

Pot_1 =analogRead (A1);
Servo_1_Pos =map (Pot_1, 0, 1023, 1, 179);
Servo_1.write (Servo_1_Pos);

Pot_2 =analogRead (A2);
Servo_2_Pos =map (Pot_2, 0, 1023, 1, 179);
Servo_2.write (Servo_2_Pos);

Pot_3 =analogRead (A3);
Servo_3_Pos =map (Pot_3, 0, 1023, 1, 179);
Servo_3.write (Servo_3_Pos);

Pot_4 =analogRead (A4);
Servo_4_Pos =map (Pot_4, 0, 1023, 1, 179);
Servo_4.write (Servo_4_Pos);
}
  • Теперь напишем функцию цикла:
  void loop () 
{
Map_Pot (); // Вызов функции для чтения значений горшков

while (Serial.available ()> 0)
{
data =Serial.read ();
if (data =='R')
Serial.println ("Запись движений ...");
if (data =='P')
Serial.println ("Воспроизведение записанных движений .. . ");
}
if (data =='R') // Если введено 'R', начинаем запись.
{
// Сохраняем значения в переменная
Prev_0_Pos =Servo_0_Pos;
Prev_1_Pos =Servo_1_Pos;
Prev_2_Pos =Servo_2_Pos;
Prev_3_Pos =Servo_3_Pos;
Prev_4_Pos =Servo_4_Pos;

Map_Pot (); // Функция карты вызывается для сравнения

if (abs (Prev_0_Pos ==Servo_0_Pos)) // абсолютное значение получается путем сравнения
{
Servo_0.write (Servo_0_Pos); // Если значения совпадают, сервопривод перемещается
if (Current_0_Pos! =Servo_0_Pos) // Если значения не совпадают
{
Storage [Index] =Servo_0_Pos + 0; // В массив добавляется значение
Index ++; // Значение индекса увеличивается на 1
}
Current_0_Pos =Servo_0_Pos;
}
/ * Подобным образом сравнение значений выполняется для всех сервоприводов, для каждой записи добавляется +100
как дифференциальное значение. * /
if (abs (Prev_1_Pos ==Servo_1_Pos))
{
Servo_1.write (Servo_1_Pos);
if (Current_1_Pos! =Servo_1_Pos)
{
Хранилище [Индекс] =Servo_1_Pos + 100;
Индекс ++;
}
Current_1_Pos =Servo_1_Pos;
}

if (abs (Prev_2_Pos ==Servo_2_Pos))
{
Servo_2.write (Servo_2_Pos);
if (Current_2_Pos! =Servo_2_Pos)
{
Хранилище [индекс] =Servo_2_Pos + 200;
Индекс ++;
}
Current_2_Pos =Servo_2_Pos;
}

if (abs (Prev_3_Pos ==Servo_3_Pos))
{
Servo_3.write (Servo_3_Pos);
if (Current_3_Pos! =Servo_3_Pos)
{
Хранилище [индекс] =Servo_3_Pos + 300;
Индекс ++;
}
Current_3_Pos =Servo_3_Pos;
}
if (abs (Prev_4_Pos ==Servo_4_Pos))
{
Servo_4.write (Servo_4_Pos);
if (Current_4_Pos! =Servo_4_Pos)
{
Хранилище [Индекс] =Servo_4_Pos + 400;
Index ++;
}
Current_4_Pos =Servo_4_Pos;
}
/ * Значения печатаются на последовательном мониторе, '\ t' - для отображения значений в табличном формате * /
Serial.print (Servo_0_Pos);
Serial.print ("\ t");
Serial.print (Servo_1_Pos);
Serial.print ("\ t");
Serial.print (Servo_2_Pos);
Serial.print ("\ t");
Serial.print (Servo_3_Pos);
Serial.print ("\ t");
Serial.println (Servo_4_Pos);
Serial.print ("Индекс =");
Serial.println (Индекс);
задержка (50);
}
if (data =='P') // ЕСЛИ введено 'P', начать воспроизведение записанных ходов.
{
for (int i =0; i {
Servo_Number =Storage [i] / 100; // Находит количество сервоприводов
Servo_Position =Storage [i]% 100; // Находит положение сервопереключателя
(Servo_Number)
{
case 0:
Servo_0.write (Servo_Position);
break;
case 1:
Servo_1.write (Servo_Position);
break;
case 2:
Servo_2.write (Servo_Position);
break;
случай 3:
Servo_3.write (Servo_Position);
break;
case 4:
Servo_4.write (Servo_Position);
break;
}
задержка (50);
}
}
}
  • Когда код будет готов, загрузите его на плату Arduino.

Умная рука готова к работе. Функция еще не такая гладкая, как у Stoerpeak.

Если вы можете улучшить код или у вас есть предложения для меня, дайте мне знать в разделе комментариев.

С учетом сказанного, перейдем к тестированию ....

Record-Play.ino

Шаг 5. Тестирование

После успешной загрузки кода на плату откройте «Serial Monitor», вы можете найти его в разделе «Инструменты». Когда серийный монитор запускается, Arduino перезагружается. Теперь вы можете управлять роботизированной рукой с помощью главной руки. Но ничего не записывается.

Чтобы начать запись, введите «R» на мониторе, теперь вы можете выполнять движения, которые хотите записать.

После того, как ходы сделаны, вы должны ввести «P», чтобы сыграть записанные ходы. Сервоприводы будут продолжать выполнять движения до тех пор, пока плата не будет сброшена.

Надеюсь, вам понравился проект.

Спасибо ...

Код

  • Record-Play.ino
  • Фрагмент кода №1
  • Фрагмент кода №2
  • Фрагмент кода №3
  • Фрагмент кода 4
Record-Play.ino Arduino
Ошибка открытия файла.
Фрагмент кода №1 Обычный текст
 #include  // Servo ObjectsServo Servo_0; Servo Servo_1; Servo Servo_2; Servo Servo_3; Servo Servo_4; // Объекты потенциометраint Pot_0; int Pot_1; int Pot_2; int Pot_3; int Pot_4; // Переменная для хранения позиции сервопривода int Servo_0_Pos; int Servo_1_Pos; int Servo_2_Pos; int Servo_3_Pos; int Servo_4_Pos; // Переменная для хранения значений предыдущего положения int Prev_0_Pos; int Prev_1_Pos; int Prev_2_Pos; int Prev_3_Pos; int Prev_4_Pos; // Переменная для хранения значений текущей позиции int Current_0_Pos; int Current_1_Pos; int Current_2_Pos; int Current_3_Pos; int Current_4_Pos; int Servo_Position; // Сохраняет угол int Servo_Number; // Нет хранилищ Servoint Storage [600]; // Массив для хранения данных (при увеличении размера массива потребуется больше памяти) int Index =0; // Индекс массива начинается с 0-й позицииchar data =0; // переменная для хранения данных из последовательного ввода. 
Фрагмент кода 2 Обычный текст
 void setup () {Serial.begin (9600); // Для последовательной связи между arduino и IDE. // Сервообъекты прикреплены к выводам ШИМ. Servo_0.attach (3); Servo_1.attach (5); Servo_2.attach (6); Servo_3.attach (9); Servo_4.attach (10); // Сервоприводы устанавливаются в положение 100 при инициализации. Servo_0.write (100); Servo_1.write (100); Servo_2.write (100); Servo_3.write (100); Servo_4.write (100); Serial.println («Нажмите« R »для записи и« P »для воспроизведения»); } 
Фрагмент кода № 3 Обычный текст
 void Map_Pot () {/ * Сервоприводы вращаются на 180 градусов, но использовать его для ограничения - не лучшая идея, поскольку это заставляет сервоприводы постоянно гудеть, что раздражает, поэтому мы ограничиваем сервопривод, чтобы перемещаться между:1-179 * / Pot_0 =аналоговое чтение (A0); // Считываем ввод из банка и сохраняем его в переменной Pot_0. Servo_0_Pos =карта (Pot_0, 0, 1023, 1, 179); // Отображение сервоприводов в соответствии со значением от 0 до 1023 Servo_0.write (Servo_0_Pos); // Перемещаем сервопривод в это положение. Pot_1 =analogRead (A1); Servo_1_Pos =карта (Pot_1, 0, 1023, 1, 179); Servo_1.write (Servo_1_Pos); Pot_2 =analogRead (A2); Servo_2_Pos =карта (Pot_2, 0, 1023, 1, 179); Servo_2.write (Servo_2_Pos); Pot_3 =analogRead (A3); Servo_3_Pos =карта (Pot_3, 0, 1023, 1, 179); Servo_3.write (Servo_3_Pos); Pot_4 =analogRead (A4); Servo_4_Pos =карта (Pot_4, 0, 1023, 1, 179); Servo_4.write (Servo_4_Pos);} 
Фрагмент кода №4 Обычный текст
 void loop () {Map_Pot (); // Вызов функции для чтения значений горшков while (Serial.available ()> 0) {data =Serial.read (); if (data =='R') Serial.println ("Запись движется ..."); if (data =='P') Serial.println ("Воспроизведение записанных ходов ..."); } if (data =='R') // Если введено 'R', начать запись. {// Сохраняем значения в переменной Prev_0_Pos =Servo_0_Pos; Prev_1_Pos =Servo_1_Pos; Prev_2_Pos =Servo_2_Pos; Prev_3_Pos =Servo_3_Pos; Prev_4_Pos =Servo_4_Pos; Map_Pot (); // Функция карты вызывается для сравнения if (abs (Prev_0_Pos ==Servo_0_Pos)) // абсолютное значение получается путем сравнения {Servo_0.write (Servo_0_Pos); // Если значения совпадают, сервопривод перемещается if (Current_0_Pos! =Servo_0_Pos) // Если значения не совпадают {Storage [Index] =Servo_0_Pos + 0; // В массив добавляется значение Index ++; // Значение индекса увеличивается на 1} Current_0_Pos =Servo_0_Pos; } / * Подобным образом сравнение значений выполняется для всех сервоприводов, для каждой записи добавляется +100 в качестве дифференциального значения. * / if (abs (Prev_1_Pos ==Servo_1_Pos)) {Servo_1.write (Servo_1_Pos); if (Current_1_Pos! =Servo_1_Pos) {Storage [индекс] =Servo_1_Pos + 100; Индекс ++; } Current_1_Pos =Servo_1_Pos; } if (abs (Prev_2_Pos ==Servo_2_Pos)) {Servo_2.write (Servo_2_Pos); if (Current_2_Pos! =Servo_2_Pos) {Storage [индекс] =Servo_2_Pos + 200; Индекс ++; } Current_2_Pos =Servo_2_Pos; } if (abs (Prev_3_Pos ==Servo_3_Pos)) {Servo_3.write (Servo_3_Pos); if (Current_3_Pos! =Servo_3_Pos) {Хранение [индекс] =Servo_3_Pos + 300; Индекс ++; } Current_3_Pos =Servo_3_Pos; } if (abs (Prev_4_Pos ==Servo_4_Pos)) {Servo_4.write (Servo_4_Pos); if (Current_4_Pos! =Servo_4_Pos) {Хранение [индекс] =Servo_4_Pos + 400; Индекс ++; } Current_4_Pos =Servo_4_Pos; } / * Значения печатаются на последовательном мониторе, '\ t' - для отображения значений в табличном формате * / Serial.print (Servo_0_Pos); Serial.print ("\ t"); Serial.print (Servo_1_Pos); Serial.print ("\ t"); Serial.print (Servo_2_Pos); Serial.print ("\ t"); Serial.print (Servo_3_Pos); Serial.print ("\ t"); Serial.println (Servo_4_Pos); Serial.print ("Индекс ="); Serial.println (индекс); задержка (50); } if (data =='P') // ЕСЛИ введено 'P', начать воспроизведение записанных ходов. {for (int i =0; i  

Схема


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

  1. Система посещаемости с использованием Arduino и RFID с Python
  2. Универсальный пульт дистанционного управления с использованием Arduino, 1Sheeld и Android
  3. Вольтметр своими руками с использованием Arduino и смартфона
  4. Использование Интернета вещей для удаленного управления манипулятором
  5. IOT - Smart Jar с использованием ESP8266, Arduino и ультразвукового датчика
  6. Измерение частоты и рабочего цикла с использованием Arduino
  7. Роботизированная рука, напечатанная на 3D-принтере Arduino
  8. Умная обувь (автоматическая шнуровка и выработка электроэнергии)
  9. Роботизированная рука, управляемая нунчук (с Arduino)
  10. Умный дверной замок с использованием страницы входа в WiFi от Arduino и ESP8266