Сообщество - Лига роботов

Лига роботов

45 постов 377 подписчиков
33

Мой первый проект на ардуино

Сразу скажу что все подсмотрено из интернетов. Это мой первый опыт. Делал из того что было под руками. Хочу услышать в коментариях советы или ваше мнение по поводу проекта. Когда начался карантин я решил сделать какой нибудь интересный проект. Выбор пал на руку манипулятор. Решено было поставить руку на движущуюся платформу и управлять все с помощью пульта. Далее расскажу про само создание:


1) Рука

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

Мой первый проект на ардуино Arduino, Робототехника, Робот, Видео, Длиннопост

Для большей прочности я пропитал детали супер клеем и еще подкрасил для красоты.  Для руки я использовал самые дешевые сервоприводы (SG90). В качестве соединений я просто использовал кусочки гвоздей склеенных супер клеем. В итоге получилось такая конструкция.

Мой первый проект на ардуино Arduino, Робототехника, Робот, Видео, Длиннопост

2) Пульт

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

Мой первый проект на ардуино Arduino, Робототехника, Робот, Видео, Длиннопост
Мой первый проект на ардуино Arduino, Робототехника, Робот, Видео, Длиннопост

3) Движущуюся платформа

Платформу я вырезал также из пвх пластика. На нее поставил 2 мотор редуктора и драйвер который ими управляет (L298N), такой же радиомодуль NRF24L01 и ардуино уно ( в схеме нано но у меня в наличии лишней не было). В эту же схему подключается 4 серво из которых состоит рука манипулятор. Хотел сделать что то на подобии гусеничной платформы но не закончил. Схему набросал в протеусе.

Мой первый проект на ардуино Arduino, Робототехника, Робот, Видео, Длиннопост
Мой первый проект на ардуино Arduino, Робототехника, Робот, Видео, Длиннопост

Программы тоже простенькие. Передатчик считывает значение  с 3 джойстиков и  непрерывно передает массив из 6 элементов (это x и y  каждого джойстика) по радиоканалу в приёмник. 2 джойстика управляют серво и 1 джойстик моторами. Значение одного джойстика я перевел из 1024 в 510 через функцию map ( для управления скоростью моторов). Приёмник непрерывно получает  массив и с помощью операторов  If оперирует ими. Я много пробовал программ и путем проб и ошибок выбрал наиболее как по мне работающие части кода и соединил их.

Вот программа передатчика:

#include <SPI.h> // библиотека для работы с шиной SPI

#include "nRF24L01.h" // библиотека радиомодуля

#include "RF24.h" // ещё библиотека радиомодуля

RF24 radio(9, 10);

byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера каналов

int transmit_data[6];

int xPin = A0; //1 джойстик

int yPin = A1; //1 джойстик

int x1Pin = A2;//2 джойстик

int y1Pin = A3; //2 джойстик

int x2Pin = A4;//3 джойстик

int y2Pin = A5; //3 джойстик

int D2 = 2; //светодиод

void setup() {

radio.begin(); //активировать модуль

radio.setAutoAck(0); //режим подтверждения приёма, 1 вкл 0 выкл

radio.setRetries(0, 0); //время между попыткой достучаться, число попыток

radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал

radio.setPayloadSize(32); //размер пакета, в байтах

radio.openWritingPipe(address[0]); //мы нулевой канал, открываем канал для передачи данных

radio.setChannel(0x60); //выбираем канал

radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика

radio.setDataRate (RF24_1MBPS); //скорость обмена. Скорость должна быть одинакова на приёмнике и передатчике

radio.powerUp(); //начать работу

radio.stopListening(); //не слушаем радиоэфир, мы передатчик

pinMode(xPin, INPUT);

pinMode(yPin, INPUT);

pinMode(x1Pin, INPUT);

pinMode(y1Pin, INPUT);

pinMode(x2Pin, INPUT);

pinMode(y2Pin, INPUT);

pinMode(D2, OUTPUT);

}

void loop() {

digitalWrite(D2, HIGH);

transmit_data[0] = map(analogRead(xPin), 0, 1035, 0, 510); // изменяем значение из 1024 в 510 для управления движения (ШИМ)

transmit_data[1] = map(analogRead(yPin), 0, 1023, 0, 510);

transmit_data[2] = analogRead (x1Pin);

transmit_data[3] = analogRead (y1Pin);

transmit_data[4] = analogRead (x2Pin);

transmit_data[5] = analogRead (y2Pin);

radio.write(&transmit_data, sizeof(transmit_data)); //отправляем получившийся массив

}

А вот приемника:


#include <SPI.h>

#include "nRF24L01.h"

#include "RF24.h"

#include <Servo.h>

Servo servo1, servo2, servo3, servo4;

RF24 radio(9,10);

byte address[][6] = {"1Node","2Node","3Node","4Node","5Node","6Node"}; //возможные номера каналов

int recieved_data[6];

int ENA = 5;

int in1 = 7;

int in2 = 4;

int ENB = 6;

int degree1 = 0; // DEL SERVO 1 DEGREES

int degree2 = 0; // DEL SERVO 2 DEGREES

int degree3 = 0; // DEL SERVO 1 DEGREES

int degree4 = 0; // DEL SERVO 2 DEGREES

void setup(){

pinMode(ENA, OUTPUT);

pinMode(ENB, OUTPUT);

pinMode(in1, OUTPUT);

pinMode(in2, OUTPUT);

servo1.attach (8);

servo2.attach (3);

servo3.attach (2);

servo4.attach (A5);

radio.begin(); //активировать модуль

radio.setAutoAck(0); //режим подтверждения приёма, 1 вкл 0 выкл

radio.setRetries(0,15); //(время между попыткой достучаться, число попыток)

radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал

radio.setPayloadSize(32); //размер пакета, в байтах

radio.openReadingPipe(1,address[0]); //хотим слушать нулевой канал

radio.setChannel(0x60); //выбираем канал

radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика.

radio.setDataRate (RF24_1MBPS); //скорость обмена

radio.powerUp(); //начать работу

radio.startListening(); //начинаем слушать эфир, мы приёмный модуль

}

void loop() {

byte pipeNo;

while( radio.available(&pipeNo)){ // слушаем эфир со всех каналов

radio.read( &recieved_data, sizeof(recieved_data) ); //читаем присланный массив

if (recieved_data[1] > 255){

analogWrite(ENA, recieved_data[1] - 255);

analogWrite(ENB, recieved_data[1] - 255);

digitalWrite(in1, HIGH);

digitalWrite(in2, LOW);

//digitalWrite(in3, HIGH);

//digitalWrite(in4, LOW);

} else if (recieved_data[1] < 255)

{ analogWrite(ENA, 255-recieved_data[1]);

analogWrite(ENB, 255-recieved_data[1]);

digitalWrite(in1, LOW);

digitalWrite(in2, HIGH);

}

else if (recieved_data[0] > 255){

analogWrite(ENB, recieved_data[0] - 255);

digitalWrite(in2, HIGH);

digitalWrite(in1, LOW);

}

else if (recieved_data[0] < 255){

analogWrite(ENA, 255 - recieved_data[0]);

digitalWrite(in2, LOW);

digitalWrite(in1, HIGH);

}

else if (recieved_data[0]==255 && recieved_data[1]==255){

digitalWrite(in2, LOW);

digitalWrite(in1, LOW);

delay(10);

}

// INCREASE MOTOR1 DEGREES

/////////////////////////////////////////////////////////////////////////////////////////////////////////////

if ( (recieved_data[2] > 550 ) && (recieved_data[2] <= 1023) ) // INCREASE DEGREES WHEN THE X-AXIS READING IS HIGHER THAN 550

{

degree1 = degree1 + 1;

}

// DECREASE MOTOR1 DEGREES

if ( (recieved_data[2] >= 0 ) && (recieved_data[2] < 480 )) // DECREASE DEGREES WHEN THE X-AXIS READING IS LOWER THAN 480

{

degree1 = degree1 - 1;

}

else // KEEP THE DEGREE VALUE STABLE MEANWHILE YOU ARE NOT USING THE JOYSTICK

{

degree1 = degree1;

}

// INCREASE MOTOR 2 DEGREES

if ( (recieved_data[3] > 550 ) && (recieved_data[3] <= 1023) ) // INCREASE THE DEGREES WHEN THE X-AXIS READING IS HIGHER THAN 550

{

degree2 = degree2 + 1;

}

// DECREASE MOTOR 2 DEGREES

if ( (recieved_data[3] >= 0 ) && (recieved_data[3] < 480) ) // DECREASE THE DEGREES WHEN THE X-AXIS READING IS LOWER THAN 480

{

degree2 = degree2 - 1;

}

else // KEEP THE DEGREE VALUE STABLE MEANWHILE YOU ARE NOT USING THE JOYSTICK

{

degree2 = degree2;

}

/////////////////////////////////////////////////////////////////////////////

if ( (recieved_data[4] > 550 ) && (recieved_data[4] <= 1023) ) // INCREASE DEGREES WHEN THE X-AXIS READING IS HIGHER THAN 550

{

degree3 = degree3 + 1;

}

// DECREASE MOTOR1 DEGREES

if ( (recieved_data[4] >= 0 ) && (recieved_data[4] < 480 )) // DECREASE DEGREES WHEN THE X-AXIS READING IS LOWER THAN 480

{

degree3 = degree3 - 1;

}

else // KEEP THE DEGREE VALUE STABLE MEANWHILE YOU ARE NOT USING THE JOYSTICK

{

degree3 = degree3;

}

// INCREASE MOTOR 2 DEGREES

if ( (recieved_data[5] > 550 ) && (recieved_data[5] <= 1023) ) // INCREASE THE DEGREES WHEN THE X-AXIS READING IS HIGHER THAN 550

{

degree4 = degree4 + 1;

}

// DECREASE MOTOR 2 DEGREES

if ( (recieved_data[5] >= 0 ) && (recieved_data[5] < 480) ) // DECREASE THE DEGREES WHEN THE X-AXIS READING IS LOWER THAN 480

{

degree4 = degree4 - 1;

}

else // KEEP THE DEGREE VALUE STABLE MEANWHILE YOU ARE NOT USING THE JOYSTICK

{

degree4 = degree4;

}

/////////////////////////////////////////////////////////////////////////////

servo1.write (degree1); // SEND THE DEGREES TO SERVO 1

servo2.write (degree2); // SEND THE DEGREES TO SERVO 2

servo3.write (degree3); // SEND THE DEGREES TO SERVO 1

servo4.write (degree4); // SEND THE DEGREES TO SERVO 2

delay (15);

}

}


Для экономии места я убрал все отступления. Заранее извиняюсь за код если кому будет глаза резать.

Теперь о проблемах с которыми я столкнулся:

Значение на джойстиках было никак не 0 - 1024. На каждом джойстике было разное. По этому с помощью функции map значение переводились не совсем корректно и достаточно плавного изменения скорости я не добился. Так же я не решил проблему с питанием. Запитал устройство от блока питания на 12 v через драйвер двигателя, с 12 вольт подключил так же Ардуино. Далее  с клеммы 5 v отдельно подключил  4 серво. Так же у меня не хватало пинов чтобы управлять серво. Насколько я понял что серво ими лучше управлять через пины в которых есть шим но большинство пинов было занято радиомодулем и драйвером. При таком подключении все работало и потом узнал что аналоговые пины тоже можно использовать как цифровые. Серво в итоге пульсировали хотя контакты я припаял напрямую к плате. Если подскажете в чем проблема то буду очень благодарен. Ну и в конце демонстрация того что получилось.

Показать полностью 6 1
13

Человек против машины: настольный теннис

Шашки, шахматы, го, покер в прошлом, настало время активных видов спорта. Японская компания Omron представила робота, играющего в настольный теннис (пинг-понг).  Роботы-тренеры есть давно, но этот еще и играет, и как!

Человек против машины: настольный теннис Пинг-Понг, Робот, Настольный теннис, Видео, Длиннопост

Знакомтесь - Forpheus и его оппонент ... нет, не Эндрю Баггали (чемпион мира по пинг-понгу), но довольно сильный соперник -  Dan Ives из TableTennisDayly (пп рейтинг ~2300, где-то 200-й в мире)

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

Человек против машины: настольный теннис Пинг-Понг, Робот, Настольный теннис, Видео, Длиннопост

Новость довольно старая (версия 4 робота показана в 2017-м), здесь версия 5 (2019), но на Пикабу ее вроде не было

Показать полностью 1 1
12

Помогите с роботом!

Хочу сделать робота манипулятора как на фото ниже. Только управлять им я собираюсь  с помощью модуля джойстика ky-023. Не могу придумать толковый код что бы при движении джойстика (например вперед) серво работало а при возвращении в исходное положение не двигалась. Никто не сталкивался с подобным?

Помогите с роботом! Arduino, Робототехника
Помогите с роботом! Arduino, Робототехника
54

Кофейный робот.

У нас в городке поставили робота, который готовит кофе.

Кофейный робот. Робот, Кофе, Бариста, Автоматизация, Видео

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

Забавно что для выбора молока робот своей клешнёй нажимает на экран ))

Мои подписки
Подписывайтесь на интересные вам теги, сообщества,
пользователей — и читайте персональное «Горячее».
Чтобы добавить подписку, нужно авторизоваться.
Отличная работа, все прочитано!