Нет, это вряд ли. Я в смысле
…или книжка к набору со скетчами ![]()
Нет, это вряд ли. Я в смысле
…или книжка к набору со скетчами ![]()
Так это @AEKravcov2001 должен @BABOS -у 2 косаря. Это чтобы @BABOS перестал ныть.
аааа тогда 10к, за ссылку на курс)))
А это с тебя, поскольку все присутствующие тебе пытаются онлайн читать лекции.
только те у кого нет ссылки на чужой грамотный курс! и там деньги и время на комплектующие нужны, практика сама обучит!
Просто согласись, что ии умнее тебя. Он докрутил, что надо сделать зазор для понимания движения джостика. Ты когда добавил управление блюпуп, то аналог отвалился. Я просто это увидел и пояснил ему.
конечно умнее, он способен выучить больше чем я и не потолстеть…
я вообще думал что вы как бы даете информацию, часть пазла, который надо ему доделать… + все таки решил изменить пины для блютуза…
а оно вон как оказывается…
Я обычно даю пендаль в нужном направлении, а вот куда и кто прилетает - это определяется его пониманием, не более.
p.s. а может просто вникли в проект))) я если что его вообще не смотрел)) там и пульт есть… только вот что делать если понетциометры будут мешать управлению по блютуз… в общем не знаю))) может еще и заработает, это они наборы выпускают, а мне с этого не платят!))))
Понятно - не туда полетел. Вернись к пендалю и повтори полет.
какой педаль, зачем пендаль ?
как я понимаю что вы код выложили с управлением через понетциометры, это вроде как тоже еще пульт…
но там есть приложение или блютуз терминал который шлет символы, и с вашем кодом они не стыкуются…
как я понимаю это проект кто то взял, наклепал плат, дал какие то кода, и начал продавать, в то что он там продает мне не важно, я просто вникал и видел другие проекты, для которых и давал советы, в общем не важно!))) я просто надеюсь вы понимаете зачем тот код дали… а еще ленюсь в их набор вникать, я советую как делали большинство людей которые похожие проекты собирали, и с единым курсом обучения…
Я не использую одновременно потенциомеетры и bluetooth модуль - я отключил их когда дошел до bluetooth - цель была сделать это - https://vk.ru/away.php?to=https%3A%2F%2Fvkvideo.ru%2Fvideo-97877471_456246513%3Ft%3D13m41s&utf=1
тогда насколько я знаю для блютуз пульта должны были оставить отдельный код…(я бы так сделал) и врядли смогли написать программу единую для них, скорее всего вам просто надо найти скетч для блютуз пульта, прошить и не пытаться его изменить)))
Diskless успехов!))))
Программа работает одновременно с двумя типами управления. Холостой ход от потенциометров сделан для понимания, что вы управляете с них. Это как проверка прихода по serial. Понял?
Для добавления двух двухосевых джойстиков (которые управляют 4 осями: X1/Y1 и X2/Y2) мы подключим их к новым аналоговым пинам.
Так как джойстики подпружинены и всегда возвращаются в центр, логика работы с ними отличается: отклонение джойстика будет плавно увеличивать или уменьшать текущий угол сервопривода, а не задавать его жестко (в отличие от потенциометров).
В схему добавлены новые пины: A4, A5, A6, A7 под джойстики. Код автоматически выбирает активный тип управления благодаря «зонам нечувствительности».
A4, ось Y A5A6, ось Y A7#include <Servo.h>
#include <SoftwareSerial.h>
// Создаем объекты для четырех сервоприводов
Servo servoBase;
Servo servoShoulder;
Servo servoElbow;
Servo servoGripper;
// Пины сервоприводов
const int pinServoBase = 9;
const int pinServoShoulder = 10;
const int pinServoElbow = 11;
const int pinServoGripper = 6;
// Пины потенциометров
const int pinPotBase = A0;
const int pinPotShoulder = A1;
const int pinPotElbow = A2;
const int pinPotGripper = A3;
// Пины джойстиков
const int pinJoyBase = A4; // Joy 1 X
const int pinJoyShoulder = A5; // Joy 1 Y
const int pinJoyElbow = A6; // Joy 2 X
const int pinJoyGripper = A7; // Joy 2 Y
// Настройка Bluetooth: RX - пин 2, TX - pin 3
SoftwareSerial bluetooth(2, 3);
// Текущие углы сервоприводов (диапазон float для плавности джойстиков)
float currentBase = 90.0;
float currentShoulder = 90.0;
float currentElbow = 90.0;
float currentGripper = 90.0;
// Настройки фильтрации
const int potDeadzone = 3; // Порог сдвига потенциометра
const int joyDeadzone = 50; // Мертвая зона джойстика вокруг центра (512)
const float joySpeed = 0.15; // Скорость движения от джойстика (меньше = плавнее)
void setup() {
servoBase.attach(pinServoBase);
servoShoulder.attach(pinServoShoulder);
servoElbow.attach(pinServoElbow);
servoGripper.attach(pinServoGripper);
Serial.begin(9600);
bluetooth.begin(9600);
// Установка стартовых позиций
servoBase.write((int)currentBase);
servoShoulder.write((int)currentShoulder);
servoElbow.write((int)currentElbow);
servoGripper.write((int)currentGripper);
}
void loop() {
// ==========================================
// 1. ОПРОС ПОТЕНЦИОМЕТРОВ
// ==========================================
int potBaseAngle = map(analogRead(pinPotBase), 0, 1023, 0, 180);
int potShoulderAngle = map(analogRead(pinPotShoulder), 0, 1023, 0, 180);
int potElbowAngle = map(analogRead(pinPotElbow), 0, 1023, 0, 180);
int potGripperAngle = map(analogRead(pinPotGripper), 0, 1023, 0, 180);
if (abs(potBaseAngle - (int)currentBase) > potDeadzone) currentBase = potBaseAngle;
if (abs(potShoulderAngle - (int)currentShoulder) > potDeadzone) currentShoulder = potShoulderAngle;
if (abs(potElbowAngle - (int)currentElbow) > potDeadzone) currentElbow = potElbowAngle;
if (abs(potGripperAngle - (int)currentGripper) > potDeadzone) currentGripper = potGripperAngle;
// ==========================================
// 2. ОПРОС ДЖОЙСТИКОВ (Плавное изменение)
// ==========================================
int joyBaseVal = analogRead(pinJoyBase);
int joyShoulderVal = analogRead(pinJoyShoulder);
int joyElbowVal = analogRead(pinJoyElbow);
int joyGripperVal = analogRead(pinJoyGripper);
// Если джойстик отклонен от центра (512), плавно меняем угол
if (abs(joyBaseVal - 512) > joyDeadzone) {
currentBase += (joyBaseVal > 512) ? joySpeed : -joySpeed;
}
if (abs(joyShoulderVal - 512) > joyDeadzone) {
currentShoulder += (joyShoulderVal > 512) ? joySpeed : -joySpeed;
}
if (abs(joyElbowVal - 512) > joyDeadzone) {
currentElbow += (joyElbowVal > 512) ? joySpeed : -joySpeed;
}
if (abs(joyGripperVal - 512) > joyDeadzone) {
currentGripper += (joyGripperVal > 512) ? joySpeed : -joySpeed;
}
// ==========================================
// 3. ОБРАБОТКА КОМАНД BLUETOOTH
// ==========================================
if (bluetooth.available() > 0) {
char key = bluetooth.read();
if (key == 'B' || key == 'S' || key == 'E' || key == 'G') {
int angle = bluetooth.parseInt();
angle = constrain(angle, 0, 180);
switch (key) {
case 'B': currentBase = angle; break;
case 'S': currentShoulder = angle; break;
case 'E': currentElbow = angle; break;
case 'G': currentGripper = angle; break;
}
}
}
// ==========================================
// 4. ОГРАНИЧЕНИЕ И ОТПРАВКА НА СЕРВОПРИВОДЫ
// ==========================================
currentBase = constrain(currentBase, 0, 180);
currentShoulder = constrain(currentShoulder, 0, 180);
currentElbow = constrain(currentElbow, 0, 180);
currentGripper = constrain(constrain(currentGripper, 0, 180), 10, 150); // Захват лучше ограничить физически
servoBase.write((int)currentBase);
servoShoulder.write((int)currentShoulder);
servoElbow.write((int)currentElbow);
servoGripper.write((int)currentGripper);
delay(10); // Задержка для общей стабильности циклов
}
Если у вас возникнут вопросы по плате, уточните:
A0-A5), а нам для потенциометров и джойстиков теперь нужно 8 аналоговых входов.И таки да - следующие мои запросы к ии будут платными при вопросах. Поскольку вы сами это не делаете. Бесплатный лимит решений закончился (не для меня, а для вас).
может теперь и будет работать…
Я вот не поленился
и мои подозрения подтвердились. Есть книжка на сайте продавца на сотни страниц с картинками, скетчами и прочими файлами.
На 160 примерно странице о блютуз соединении.
https://aliexpress.ru/item/1005012311902930.html
ссылка на файлы проекта.
https://fs.keyestudio.com/KS0198
…там же ссылка на приложение для телефона
#include <Servo.h> // add the servo libraries
Servo myservo1; // create servo object to control a servo
Servo myservo2;
Servo myservo3;
Servo myservo4;
int pos1=80, pos2=60, pos3=130, pos4=0; // define the variable of 4 servo angle and assign the initial value( that is the boot posture angle value)
char val;
char val2;
void setup()
{
// boot posture
myservo1.write(pos1);
delay(1000);
myservo2.write(pos2);
myservo3.write(pos3);
myservo4.write(pos4);
delay(1500);
Serial.begin(9600); // set the baud rate to 9600
}
void loop()
{
myservo1.attach(A1); // set the control pin of servo 1 to A1
myservo2.attach(A0); // set the control pin of servo 2 to A0
myservo3.attach(6); // set the control pin of servo 3 to D6
myservo4.attach(9); // set the control pin of servo 4 to D9
if(Serial.available()) // if receive the data
{
val=Serial.read(); // read the received data
val2=val; //Give the value of val to val2
Serial.println(val);
switch(val)
{
case 'L': T_left(); break; // execute the corresponding function when receive the value
case 'R': T_right(); break;
case 'f': RF(); break;
case 'b': rb(); break;
case 'F': ZK(); break;
case 'B': ZB(); break;
case 'l': LF(); break;
case 'r': lb(); break;
case 'S': servo_stop(); break; //stop instruction
}
}
else
{
switch(val2) //When the button is pressed and not released,
{ //"else" is executed because Bluetooth does not send characters,
// and the value of val2 is the value of the previously pressed button,
//so the command of pressing the button will be repeated
case 'L': T_left(); break; // execute the corresponding function when receive the value
case 'R': T_right(); break;
case 'f': RF(); break;
case 'b': rb(); break;
case 'F': ZK(); break;
case 'B': ZB(); break;
case 'l': LF(); break;
case 'r': lb(); break;
case 'S': servo_stop(); break; //stop instruction
}
}
}
//**************************************************
// turn left
void T_left()
{
pos1=pos1+1;
myservo1.write(pos1);
delay(5);
if(pos1>180)
{
pos1=180;
}
}
//turn right
void T_right()
{
pos1=pos1-1;
myservo1.write(pos1);
delay(5);
if(pos1<1)
{
pos1=1;
}
}
//********************************************
//open the claw
void ZK()
{
pos4=pos4-2;
Serial.println(pos4);
myservo4.write(pos4);
delay(5);
if(pos4<2)
{
pos4=0;
}
}
// close the claw
void ZB()
{
pos4=pos4+8;
Serial.println(pos4);
myservo4.write(pos4);
delay(5);
if(pos4>108)
{
pos4=108;
}
}
//******************************************
// the upper arm will lift up
void RF()
{
pos2=pos2-1;
myservo2.write(pos2);
delay(5);
if(pos2<0)
{
pos2=0;
}
}
// the upper arm will go down
void rb()
{
pos2=pos2+1;
myservo2.write(pos2);
delay(5);
if(pos2>180)
{
pos2=180;
}
}
//***************************************
// the lower arm will stretch out
void lb()
{
pos3=pos3+1;
myservo3.write(pos3);
delay(5);
if(pos3>180)
{
pos3=180;
}
}
// the lower arm will draw back
void LF()
{
pos3=pos3-1;
myservo3.write(pos3);
delay(5);
if(pos3<35)
{
pos3=35;
}
}
void servo_stop()
{
myservo1.write(pos1);
myservo2.write(pos2);
myservo3.write(pos3);
myservo4.write(pos4);
}
myservo1.attach(A1); // set the control pin of servo 1 to A1
myservo2.attach(A0); *// set the control pin of servo 2 to A0
В Arduino A0 и A1 — это не только аналоговые входы, но и цифровые пины с ШИМ
кхе кхе… я кажется ошибся, и их можно использовать)))
Кого использовать?
Это пособие от производителя…для детей этого конструктора.
…библиотека серво из пинов делает шим как ты говоришь
на каких хошь.
в вашем коде
опять 2 пина для серво аналоговые, открываю в сети распиновку уно и не вижу что там указывают что шим есть, обратился к ии с запросом разве можно использовать эти пины для серво, он говорит да…