хрень какаята непонятня, вобщем этот код тоже не обрабатывает значения джойстика, зато вот этот код работают джойстики но почемуто не выводиться принт от нажатия кнопок
X * X - чтобы чем больше отклонение джойстика, тем больше скорость перемещения сервы
в моём трустмастере ооооооочень нелинейные джойстики :( , отклонение на четверть - уже дают 255
я делал пульт сам на линейных потенциометрах
только что проверял - работает код
#include <PS2X_lib.h> // for v1.6
#include <Servo.h>
PS2X ps2x;
int error = 0;
byte type = 0;
byte vibrate = 0;
byte xL;
byte yL;
byte xR;
byte yR;
float deltaAnglLR = 0.0001; // настройка - от времени лупа и сервы
float startAnglLR = 90.0;
float deltaAnglUD = 0.0001; // настройка - от времени лупа и сервы
float startAnglUD = 30.0;
Servo servoLR;
Servo servoUD;
//==================================================================================
void setup()
{
Serial.begin( 57600 );
servoLR.attach( 8 );
servoUD.attach( 9 );
error = ps2x.config_gamepad( 4, 5, 6, 7, true, true );
}
//==================================================================================
void loop()
{
if(error == 1) return;
{
int x;
ps2x.read_gamepad( false, vibrate );
// управление башней вправо-влево
xL = ps2x.Analog( PSS_LX ); Serial.println( xL, DEC );
if( xL < 127 )
{
x = xL - 127;
startAnglLR = startAnglLR - x * x * deltaAnglLR; Serial.println( startAnglLR );
if( startAnglLR < 0 ) startAnglLR = 0;
}
if( xL > 127 )
{
x = xL - 128;
startAnglLR = startAnglLR + x * x * deltaAnglLR; Serial.println( startAnglLR ); Serial.println( ' ' );
if( startAnglLR > 180 ) startAnglLR = 180;
}
if( ps2x.Button( PSB_L3 ) ) // по кнопке джойстика - в исходное
{
startAnglLR = 90.0;
}
servoLR.write( startAnglLR );
// управление стволом пушки вверх-вниз
// аналогичное
delay( 50 );
}
}
//==================================================================================
без строки 31 ps2x.read_gamepad( false, vibrate ); ничё не работает.....
в вышепредложенных кодах я не заметил такого оператора, гуглперевёл первоисточник так :
/*
Вы должны прочитать геймпад, чтобы получить новые значения
Читайте геймпадом и установить значения вибрации
ps2x.read_gamepad (маленький двигатель вкл / выкл, более мощный двигатель прочность 0-255)
Если вы не включите гул, используйте ps2x.read_gamepad (); без каких-либо ценностей
Вы должны назвать это по крайней мере один раз в секунду
*/
и ps2x.read_gamepad(false, ps2x_vibrate);
//read controller and set large motor to spin at 'vibrate' speed
прочитать контроллер и установить большой двигатель вращаться в «вибрировать» скорости
поменял дельты с 0.0001 на 0.0005 - пульт стал работать помягче.... короче, настраивать надо
угол сделал +/- 80 градусов - в крайних положениях серва подклинивает :(
спасибо скетч сразу заработал(только пины под свои поменял)
но есть нюансы. в крайних точках сервы и вправду клинит, они дрожат, правда возможно проблема именно в сг90 они вечно дрожат, если поставить мг 995 возможно дрож уйдет.
по скорости вращения и ее плавности. при небольшом отклонении серва всеравно достаточно быстро движеться а при резком до упор нажатии, движеться вроде быстрее но ненамного. подскажите как кими коэфицентами это регулировать?
самый первый? да. последний нет. он ездит, но туда так много всего нужно запихнуть, я пока не решил как все разместить, и не собрал то что запихивать. там еще много трудностей
у меня тоже первый вариант был с водометом и клешней, управлялся со смартфона.
потом вместо водомета установил пушку стреляющую 6мм шариками.
потом рещил что геймпад будет удобнее + решил добавить функционала. так что сейчас у меня через и2с рабюотает 2 платы.
в финале будет телега с клешней манипулятором, пушкой стреляющей шариками, водомет, причем и то и другое на независимых поворотных "башнях" на каждую по 2 сервы.
ну и еще добавлю форы, подсветку, может какието спец эффекты и тд...
корпус впринцыпе позволяет все это на себе разместить, но правда тоже не без проблем. впихнуть невпихуемое это нелегкая задача :)
по скорости вращения и ее плавности. при небольшом отклонении серва всеравно достаточно быстро движеться а при резком до упор нажатии, движеться вроде быстрее но ненамного. подскажите как кими коэфицентами это регулировать?
коэфф - floatdeltaAnglLR = 0.0005; // настройка
и формула - startAnglLR = startAnglLR + x * x * deltaAnglLR;
вернее брать надо не квадратическую зависимость , а экспоненциальную - потенциометры в джойстике применённые - для других целей,
поэтому и делал пульт самопальный....
чувствительность - если жать на манипулятор по микрону можно поймать ооооочееееееннннннььь меееееедлеееееннооооое перемещение сервы :)
но за это время тибя расстреляет jeka_tm из гауссовской :)
зато моя машина больше, тяжелее и мощьнее, вомнет его танк, раздавит, а потом схватит манипуляторо м увезет на свалку, и в завершении зальет водой, чтоб наверняка :))
ну раздавит врядли)) да и струйка воды ему нипочем. а при "правильной" экранировке гаусса электроника на машинке сойдет в ума или просто перестанет реагировать. шутка ли 350В 400А за 1-2 миллисекунды. больше и не понадобится. входные цепи хотя бы радиоприемного тракта не выдержат. наводки и мк могут попалить при удачном выстреле
попробуй если есть возможность. я может тоже проверю. только сервы остались только на самолете. медленно элероном можно подвигать. но это не так показательно
скорее всего проблема в считывании данных с приемника
у того кода привязка к градусам, а это крупный шаг. потом просто вместо градусов сделать миллисекунды как в твоем коде и все будет гораздо точнее. а delay заменить на миллис. хоть от просто к сложному, но что то не то
скорее всего проблема в считывании данных с приемника
у того кода привязка к градусам, а это крупный шаг. потом просто вместо градусов сделать миллисекунды как в твоем коде и все будет гораздо точнее. а delay заменить на миллис. хоть от просто к сложному, но что то не то
V=S/T.... я - через S , а это градусы.... ты через T - да, точнее и плавнее будет - согласен....
...пусть ТС ( второстепенный думает ) ( тема-то - твоя )
скорее всего проблема в считывании данных с приемника - согласен :)
не в тему ( но к тому же автору ) - калининградский катер L=1500 из оцинковки был арестован при первом же спуске на воду береговой охраной ФСБ ( погранцы ) :(
промежуточных снимков не делали ( дятлы ) , съёмка спуска, камера, катер - конфискованы на месте.....
ну раздавит врядли)) да и струйка воды ему нипочем. а при "правильной" экранировке гаусса электроника на машинке сойдет в ума или просто перестанет реагировать. шутка ли 350В 400А за 1-2 миллисекунды. больше и не понадобится. входные цепи хотя бы радиоприемного тракта не выдержат. наводки и мк могут попалить при удачном выстреле
эпицентр, и вся мощь импульса будет у вас на танке.... а экранировка это не так просто... это только в фильмах фольгой голову обвернул и порядок :)
да и сомниваюсь я что получиться сделать направленный "луч" а иначе все это пшик...
насчет катера 1,5 м длинной, а по какой причине его конфисковали, и видео камеры тоже? похоже на какойто беспредел?! даже если спуск на воду беспелотных средств запрещен какимито там нелепыми законами? , то на каком основании забирать видео камеры?
jeka_tm, Ваша ссылка на скетч и библиотеку для джойстика ps2 не работает (в начале темы есть), видимо Вы удалили его с яндексдиска прошу дать ссылку на скетч.
камеру вернули, запуски дронов разрешены только при установлении Временного или Местного режима, так что любой коптер транспортная полиция имеет право конфисковать.... лодка - там же нейтральные воды рядом, отчитаются что наркотрафик прикрыли :)
я специального все на яндекс диске храню чтобы доступ был с нескольких компов и не потерять. когда что то удаляешь все перемещается в корзину на сервере и можно восстановить. но тут почему то этого не произошло. после этого периодически делаю дополнительно копию всего. но старое уже не вернуть
в том управлении просто езда. пушка же не поворачивалась. это же модель ПТСАУ была. а поворот на 5-10 градусов делать не стал. так что ничего особенного
хорошо что хоть камеру вернули. значит катер не вернут?
камеру вернули, запуски дронов разрешены только при установлении Временного или Местного режима, так что любой коптер транспортная полиция имеет право конфисковать.... лодка - там же нейтральные воды рядом, отчитаются что наркотрафик прикрыли :)
я слышал про закон что беспелотники запрещены, только с разрешения можно летать. но беспилотники это только то что летает в воздухе. а р\у лодна ну никак не беспелотник... и если на ней небыло видео камер для телеуправления на больших расстояниях, то какой нафиг нарко трафик? какие нейтральные воды, это ей 12 км нужно проплыть...
короче просто беспредел со стороны силовиков. я думаю должны быть какието органы занимающиеся такими делами... имхо чтоб по шапке настучали этим оборотням в погонах!
Жека, подскажи, а управление мотоами с кнопко геймпада делал?
у меня хитрая система, блютус модуль геймпада подключен к ардуино нано. та в свою очередь через I2C управляет другой ардуиной которая управляет мотор шилдами.
в управляемую плату залит свой, неменяемый код, который принимает определенные команды.
в управляющую нану залит свой код.
вот пример управления моторами с джойстиков геймпада.
lmspeed = -(ps2x.Analog(PSS_LY)-128); //скопировать данные джойстика в регистры правого и левого двигателя
int tmp = -(ps2x.Analog(PSS_LX)-128); //
rmspeed = lmspeed;
lmspeed -= tmp; lmspeed *=2;
rmspeed += tmp; rmspeed *=2;
if (lmspeed>255) lmspeed =255; //ограничить макс. значения моторов
if (rmspeed>255) rmspeed =255; //
if (lmspeed<-255) lmspeed =-255; //
if (rmspeed<-255) rmspeed =-255; //
lmbrake =0; //выкл. стоп
rmbrake =0; //
теперь хочу сделать чтобы кнопками (вперед, назад, лево, право) ....
попробовал сделать так:
if(ps2x.Button(PSB_PAD_UP)) { //will be TRUE as long as button is pressed
Serial.print("Up held this hard: ");
Serial.println(ps2x.Analog(PSAB_PAD_UP), DEC);
lmspeed =80;
просто добавил в код строчку lmspeed =80;
поидее это должно закрутить левый мотор на 80 шим. но чтото некрутит, что я не так делаю? :)
у меня нет отдельного мотор драйвера, могу моторами только через и2с, причем через джойстик все уже работает. хочу через кнопки.
вот что у меня может посылать мастер плата на слейв
void MasterSend(byte sbyte, byte pfreq, int lspeed, byte lbrake, int rspeed, byte rbrake, int sv0, int sv1, int sv2, int sv3, int sv4, int sv5, byte dev,int sens,int lowbat, byte i2caddr,byte i2cfreq)
{
Wire.beginTransmission(I2Caddress); // transmit data to 7
Wire.write(startbyte); // start byte
Wire.write(pfreq); // pwm frequency
Wire.write(highByte(lspeed)); // MSB left motor speed
Wire.write( lowByte(lspeed)); // LSB left motor speed
Wire.write(lbrake); // left motor brake
Wire.write(highByte(rspeed)); // MSB right motor speed
Wire.write( lowByte(rspeed)); // LSB right motor speed
Wire.write(rbrake); // right motor brake
Wire.write(highByte(sv0)); // MSB servo 0
Wire.write( lowByte(sv0)); // LSB servo 0
Wire.write(highByte(sv1)); // MSB servo 1
Wire.write( lowByte(sv1)); // LSB servo 1
Wire.write(highByte(sv2)); // MSB servo 2
Wire.write( lowByte(sv2)); // LSB servo 2
Wire.write(highByte(sv3)); // MSB servo 3
Wire.write( lowByte(sv3)); // LSB servo 3
Wire.write(highByte(sv4)); // MSB servo 4
Wire.write( lowByte(sv4)); // LSB servo 4
Wire.write(highByte(sv5)); // MSB servo 5
Wire.write( lowByte(sv5)); // LSB servo 5
Wire.write(dev); // devibrate
Wire.write(highByte(sens)); // MSB impact sensitivity
Wire.write( lowByte(sens)); // LSB impact sensitivity
Wire.write(highByte(lowbat)); // MSB low battery voltage 550 to 30000 = 5.5V to 30V
Wire.write( lowByte(lowbat)); // LSB low battery voltage
Wire.write(i2caddr); // I2C slave address for T'REX controller
Wire.write(i2cfreq); // I2C clock frequency: 0=100kHz 1=400kHz
Wire.endTransmission(); // stop transmitting
и вот код управления через рычаг
//управление движением с левого джойстика
lmspeed = -(ps2x.Analog(PSS_LY)-128); //скопировать данные джойстика в регистры правого и левого двигателя
int tmp = -(ps2x.Analog(PSS_LX)-128); //
rmspeed = lmspeed;
lmspeed -= tmp; lmspeed *=2;
rmspeed += tmp; rmspeed *=2;
if (lmspeed>255) lmspeed =255; //ограничить макс. значения моторов
if (rmspeed>255) rmspeed =255; //
if (lmspeed<-255) lmspeed =-255; //
if (rmspeed<-255) rmspeed =-255; //
lmbrake =0; //выкл. стоп
rmbrake =0; //
// управление сервами манипулятора с правого джойстика
sv[0] = (map(ps2x.Analog(PSS_RY), 0, 255, 700, 2300)); ;
sv[1] = (map(ps2x.Analog(PSS_RX), 0, 255, 950, 1750)); ;
надо както при нажатии кнопок передавать значение rmspeed и lmspeed и поидее будет крутить, но чтото у меня не крутит, может не так сделал, есть примеры?
но там есть много мусора, который тоже почемуто неработает(4сервы) но это пока не суть важно :)
#include <PS2X_lib.h> //for v1.6
#include <Wire.h>
#include <Servo.h>
Servo RXservo;
Servo RYservo;
Servo myservoH; // Горизонтальная серва углы от 0 до 180 (центровка 89)
Servo myservoV; // Вертикальная серва углы от 1 до 45
Servo myservoZ; // серва Клешня
Servo myservoR; // серва рука клешни
const int Z_SERVO_PIN = 5; // добовляем пин захвата
const int R_SERVO_PIN = 6; // добовляем пин руки манипулятора
const int H_SERVO_PIN = 7; // Горизонтальная серва подключена к пину 7
const int V_SERVO_PIN = 8; //Пин вертикального сервопривода 8
const float Z_L_ANGLE = 116; // Максимальные угл поворота башни налево
const float Z_R_ANGLE = 45; // Максимальные угл поворота башни направо
const float Z_DEF_ANGLE = 150; // Дефолтный угол (центровка)
const float R_L_ANGLE = 178; // Максимальные угл поднятия руки
const float R_R_ANGLE = 3; // Максимальные угл наклона руки
const float R_DEF_ANGLE = 160; // Дефолтный угол руки
const float H_L_ANGLE = 180; // Максимальные угл поворота башни налево
const float H_R_ANGLE = 0; // Максимальные угл поворота башни направо
const float H_DEF_ANGLE = 120; // Дефолтный угол (центровка)
const float V_U_ANGLE = 140; // Максимальные угл поворота башни вверх
const float V_D_ANGLE = 45; // Максимальные угл поворота башни вниз
const float V_DEF_ANGLE = 60; // Дефолтный угол (центровка)
//Размер шага V_STEP и H_STEP побираем экспериментально для достижения нужной скорости поворота серв
const float V_STEP = 0.012; // Шаг - знаение отвечающее за скорость вращения по вертикали.
const float H_STEP = 0.012; // Шаг - знаение отвечающее за скорость вращения по горизонтали
const float Z_STEP = 0.012; // шаг захвата
const float R_STEP = 0.012; // шаг руки
float curVAngle = V_DEF_ANGLE; //Переменная текущего угла верт. сервы
float curHAngle = H_DEF_ANGLE; //Переменная текущего угла гор. сервы
float curZAngle = Z_DEF_ANGLE; //
float curRAngle = R_DEF_ANGLE; //
bool moveServoVUp = false; //Флаг движения верт. сервы вверх
bool moveServoVDown = false; //Флаг движения верт. сервы вниз
bool moveServoHLeft = false; //Флаг движения гор. сервы влево
bool moveServoHRight = false; //Флаг движения гор. сервы вправо
bool moveServoZLeft = false; //Флаг движения гор. сервы влево
bool moveServoZRight = false; //Флаг движения гор. сервы вправо
bool moveServoRLeft = false; //Флаг движения гор. сервы влево
bool moveServoRRight = false; //Флаг движения гор. сервы вправо
#define SHOT 1 // пин для водомета
#define ledPin 13
#define startbyte 0x0F
#define I2Caddress 0x07
int sv[6]={1000,1400,1500,1500,0,0}; // servo positions: 0 = Not Used
int sd[6]={5,10,-5,-15,20,-20}; // servo sweep speed/direction
int lmspeed,rmspeed; // left and right motor speed from -255 to +255 (negative value = reverse)
int ldir=5; // how much to change left motor speed each loop (use for motor testing)
int rdir=5; // how much to change right motor speed each loop (use for motor testing)
byte lmbrake,rmbrake; // left and right motor brake (non zero value = brake)
byte devibrate=50; // time delay after impact to prevent false re-triggering due to chassis vibration
int sensitivity=50; // threshold of acceleration / deceleration required to register as an impact
int lowbat=550; // adjust to suit your battery: 550 = 5.50V
byte i2caddr=7; // default I2C address of T'REX is 7. If this is changed, the T'REX will automatically store new address in EEPROM
byte i2cfreq=0; // I2C clock frequency. Default is 0=100kHz. Set to 1 for 400kHz
void performServo(); // добовляем сервы
/******************************************************************
* set pins connected to PS2 controller:
* - 1e column: original
* - 2e colmun: Stef?
* replace pin numbers by the ones you use
******************************************************************/
#define PS2_DAT 12 //14
#define PS2_CMD 11 //15
#define PS2_SEL 10 //16
#define PS2_CLK 9 //17
/******************************************************************
* select modes of PS2 controller:
* - pressures = analog reading of push-butttons
* - rumble = motor rumbling
* uncomment 1 of the lines for each mode selection
******************************************************************/
//#define pressures true
#define pressures false
//#define rumble true
#define rumble false
PS2X ps2x; // create PS2 Controller Class
int PS2 = 0;
//right now, the library does NOT support hot pluggable controllers, meaning
//you must always either restart your Arduino after you connect the controller,
//or call config_gamepad(pins) again after connecting the controller.
int error = 0;
byte type = 0;
byte vibrate = 0;
void setup(){
pinMode(SHOT, OUTPUT); // задаем выход для стрельбы водой
// устанавливаем пин как вывод управления сервой
myservoH.attach(H_SERVO_PIN);
myservoV.attach(V_SERVO_PIN);
myservoZ.attach(Z_SERVO_PIN);
myservoR.attach(R_SERVO_PIN);
myservoH.write(curHAngle);
myservoV.write(curVAngle);
myservoZ.write(curZAngle);
myservoR.write(curRAngle);
RXservo.attach(3);
RYservo.attach(4);
Serial.begin(57600);
pinMode(ledPin, OUTPUT);
Wire.begin(); // no address - join the bus as master
delay(300); //added delay to give wireless ps2 module some time to startup, before configuring it
//CHANGES for v1.6 HERE!!! **************PAY ATTENTION*************
//setup pins and settings: GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error
error = ps2x.config_gamepad(PS2_CLK, PS2_CMD, PS2_SEL, PS2_DAT, pressures, rumble);
if(error == 0){
Serial.print("Found Controller, configured successful ");
Serial.print("pressures = ");
if (pressures)
Serial.println("true ");
else
Serial.println("false");
Serial.print("rumble = ");
if (rumble)
Serial.println("true)");
else
Serial.println("false");
}
else
Serial.println("Большой еггог :)");
// Serial.print(ps2x.Analog(1), HEX);
type = ps2x.readType();
switch(type) {
case 0:
Serial.print("Unknown Controller type found ");
break;
case 1:
Serial.print("DualShock Controller found ");
break;
case 2:
Serial.print("GuitarHero Controller found ");
break;
case 3:
Serial.print("Wireless Sony DualShock Controller found ");
break;
}
}
void loop() {
/* You must Read Gamepad to get new values and set vibration values
ps2x.read_gamepad(small motor on/off, larger motor strenght from 0-255)
if you don't enable the rumble, use ps2x.read_gamepad(); with no values
You should call this at least once a second
*/
if(error == 1) //skip loop if no controller found
return;
if(type == 2){ //Guitar Hero Controller
ps2x.read_gamepad(); //read controller
if(ps2x.ButtonPressed(GREEN_FRET))
Serial.println("Green Fret Pressed");
moveServoVDown = true;
if(ps2x.ButtonPressed(RED_FRET))
Serial.println("Red Fret Pressed");
moveServoHRight = true;
if(ps2x.ButtonPressed(YELLOW_FRET))
Serial.println("Yellow Fret Pressed");
moveServoVUp = true;
if(ps2x.ButtonPressed(BLUE_FRET))
Serial.println("Blue Fret Pressed");
moveServoHLeft = true;
if(ps2x.ButtonPressed(ORANGE_FRET))
Serial.println("Orange Fret Pressed");
if(ps2x.ButtonPressed(STAR_POWER))
Serial.println("Star Power Command");
if(ps2x.Button(UP_STRUM)) //will be TRUE as long as button is pressed
Serial.println("Up Strum");
if(ps2x.Button(DOWN_STRUM))
Serial.println("DOWN Strum");
if(ps2x.Button(PSB_START)) //will be TRUE as long as button is pressed
Serial.println("Start is being held");
if(ps2x.Button(PSB_SELECT))
Serial.println("Select is being held");
if(ps2x.Button(ORANGE_FRET)) { // print stick value IF TRUE
Serial.print("Wammy Bar Position:");
Serial.println(ps2x.Analog(WHAMMY_BAR), DEC);
}
}
else { //DualShock Controller
ps2x.read_gamepad(false, vibrate); //read controller and set large motor to spin at 'vibrate' speed
if(ps2x.Button(PSB_START)) //will be TRUE as long as button is pressed
Serial.println("Start is being held");
if(ps2x.Button(PSB_SELECT))
Serial.println("Select is being held");
if(ps2x.Button(PSB_PAD_UP)) { //will be TRUE as long as button is pressed
Serial.print("Up held this hard: ");
Serial.println(ps2x.Analog(PSAB_PAD_UP), DEC);
lmspeed =80;
lmbrake =0; //выкл. стоп
}
if(ps2x.Button(PSB_PAD_RIGHT)){
Serial.print("Right held this hard: ");
Serial.println(ps2x.Analog(PSAB_PAD_RIGHT), DEC);
}
if(ps2x.Button(PSB_PAD_LEFT)){
Serial.print("LEFT held this hard: ");
Serial.println(ps2x.Analog(PSAB_PAD_LEFT), DEC);
}
if(ps2x.Button(PSB_PAD_DOWN)){
Serial.print("DOWN held this hard: ");
Serial.println(ps2x.Analog(PSAB_PAD_DOWN), DEC);
}
vibrate = ps2x.Analog(PSAB_CROSS); //this will set the large motor vibrate speed based on how hard you press the blue (X) button
if (ps2x.NewButtonState()) { //will be TRUE if any button changes state (on to off, or off to on)
if(ps2x.Button(PSB_L1))
Serial.println("L1 pressed");
moveServoRLeft = true;
if(ps2x.Button(PSB_R1))
Serial.println("R1 pressed");
moveServoZLeft = true;
if(ps2x.Button(PSB_L3))
Serial.println("L3 pressed");
if(ps2x.Button(PSB_R3))
Serial.println("R3 pressed");
if(ps2x.Button(PSB_L2))
Serial.println("L2 pressed");
moveServoRRight = true;
if(ps2x.Button(PSB_R2))
Serial.println("R2 pressed");
moveServoZRight = true;
if(ps2x.Button(PSB_TRIANGLE))
Serial.println("Triangle pressed");
moveServoHRight = true;
}
if(ps2x.ButtonPressed(PSB_CIRCLE)) //will be TRUE if button was JUST pressed
Serial.println("Circle just pressed");
if(ps2x.NewButtonState(PSB_CROSS)) //will be TRUE if button was JUST pressed OR released
Serial.println("X just changed");
moveServoHLeft = true;
if(ps2x.ButtonReleased(PSB_SQUARE)) //will be TRUE if button was JUST released
Serial.println("Square just released");
Serial.print("Stick:");
//--------— чтобы сервы не продолжали движения при отжатых кнопках —-------------
if(ps2x.ButtonPressed(GREEN_FRET))
{
moveServoVDown = false;
}
if(ps2x.ButtonPressed(RED_FRET))
{
moveServoVUp = false;
}
if(ps2x.ButtonPressed(YELLOW_FRET))
{
moveServoHRight = false;
}
if(ps2x.ButtonPressed(BLUE_FRET))
{
moveServoHLeft = false;
}
if(ps2x.Button(PSB_R2))
{
moveServoZRight = false;
}
if(ps2x.Button(PSB_R1))
{
moveServoZLeft = false;
}
if(ps2x.Button(PSB_L2))
{
moveServoRRight = false;
}
if(ps2x.Button(PSB_L1))
{
moveServoRLeft = false;
}
lmspeed = -(ps2x.Analog(PSS_LY)-128); //скопировать данные джойстика в регистры правого и левого двигателя
int tmp = -(ps2x.Analog(PSS_LX)-128); //
rmspeed = lmspeed;
lmspeed -= tmp; lmspeed *=2;
rmspeed += tmp; rmspeed *=2;
if (lmspeed>255) lmspeed =255; //ограничить макс. значения моторов
if (rmspeed>255) rmspeed =255; //
if (lmspeed<-255) lmspeed =-255; //
if (rmspeed<-255) rmspeed =-255; //
lmbrake =0; //выкл. стоп
rmbrake =0; //
sv[0] = (map(ps2x.Analog(PSS_RY), 0, 255, 700, 2300)); ;
sv[1] = (map(ps2x.Analog(PSS_RX), 0, 255, 950, 1750)); ;
//sv[1] = 1400 -(ps2x.Analog(PSS_RX)-128)*2,2;
Serial.print(lmspeed, DEC); //Left stick, Y axis. Other options: LX, RY, RX
Serial.print(",");
Serial.print(rmspeed, DEC);
Serial.print(",");
RXservo.write(map(ps2x.Analog(PSS_RX), 255, 0, 0, 180)); ;
delay(50);
ps2x.read_gamepad(false, 0);
RYservo.write(map(ps2x.Analog(PSS_RY), 0, 255, 0, 90)); ;
delay(50);
ps2x.read_gamepad(false, 0);
// Serial.print(ps2x.Analog(PSS_RY), DEC);
// Serial.print(",");
// Serial.print(ps2x.Analog(PSS_RX), DEC);
// Serial.println("\t");
}
digitalWrite(ledPin, HIGH);
MasterSend(startbyte,2,lmspeed,lmbrake,rmspeed,rmbrake,sv[0],sv[1],sv[2],sv[3],sv[4],sv[5],devibrate,sensitivity,lowbat,i2caddr,i2cfreq);
delay(20);
MasterReceive(); // receive data packet from T'REX controller
}
void MasterSend(byte sbyte, byte pfreq, int lspeed, byte lbrake, int rspeed, byte rbrake, int sv0, int sv1, int sv2, int sv3, int sv4, int sv5, byte dev,int sens,int lowbat, byte i2caddr,byte i2cfreq)
{
Wire.beginTransmission(I2Caddress); // transmit data to 7
Wire.write(startbyte); // start byte
Wire.write(pfreq); // pwm frequency
Wire.write(highByte(lspeed)); // MSB left motor speed
Wire.write( lowByte(lspeed)); // LSB left motor speed
Wire.write(lbrake); // left motor brake
Wire.write(highByte(rspeed)); // MSB right motor speed
Wire.write( lowByte(rspeed)); // LSB right motor speed
Wire.write(rbrake); // right motor brake
Wire.write(highByte(sv0)); // MSB servo 0
Wire.write( lowByte(sv0)); // LSB servo 0
Wire.write(highByte(sv1)); // MSB servo 1
Wire.write( lowByte(sv1)); // LSB servo 1
Wire.write(highByte(sv2)); // MSB servo 2
Wire.write( lowByte(sv2)); // LSB servo 2
Wire.write(highByte(sv3)); // MSB servo 3
Wire.write( lowByte(sv3)); // LSB servo 3
Wire.write(highByte(sv4)); // MSB servo 4
Wire.write( lowByte(sv4)); // LSB servo 4
Wire.write(highByte(sv5)); // MSB servo 5
Wire.write( lowByte(sv5)); // LSB servo 5
Wire.write(dev); // devibrate
Wire.write(highByte(sens)); // MSB impact sensitivity
Wire.write( lowByte(sens)); // LSB impact sensitivity
Wire.write(highByte(lowbat)); // MSB low battery voltage 550 to 30000 = 5.5V to 30V
Wire.write( lowByte(lowbat)); // LSB low battery voltage
Wire.write(i2caddr); // I2C slave address for T'REX controller
Wire.write(i2cfreq); // I2C clock frequency: 0=100kHz 1=400kHz
Wire.endTransmission(); // stop transmitting
//Serial.println("Master Command Data Packet Sent");
//-------------------------------- Make sure Master and Slave I2C clock the same ------------------------------------------------
if(i2cfreq==0) // thanks to Nick Gammon: http://gammon.com.au/i2c
{
TWBR=72; // default I²C clock is 100kHz
}
else
{
TWBR=12; // changes the I²C clock to 400kHz
}
}
//Функция управления сервоприводами (вызывается в теле loop на каждой итерации)
//Выполняет изменения положения серв на подобранный шаг согласно установленным флагам движения
//Флаги устанавливаются согласно поступившим символам управления сервами
void performServo()
{
//Установлен флаг движения вверх и текущий угол не максимальный
if (moveServoVUp && curVAngle + V_STEP <= V_U_ANGLE)
{
//К текущему верт. углу прибавляем шаг
curVAngle += V_STEP;
}
//Установлен флаг движения вниз и текущий угол не минимален
else if (moveServoVDown && curVAngle - V_STEP >= V_D_ANGLE)
{
//От текущего верт. угла отнимаем шаг
curVAngle -= V_STEP;
}
//Установлен флаг движения влево и текущий угол не максимален
if (moveServoHLeft && curHAngle + H_STEP <= H_L_ANGLE)
{
//К текущему гор. углу прибавляем гор. шаг
curHAngle += H_STEP;
}
//Установлен флаг движения вправо и текущий угол не минимален
else if (moveServoHRight && curHAngle - H_STEP >= H_R_ANGLE)
{
//От текущего угла отнимаем гор. шаг
curHAngle -= H_STEP;
}
//Установлен
if (moveServoZLeft && curZAngle + Z_STEP <= Z_L_ANGLE)
{
//К текущему гор. углу прибавляем гор. шаг
curZAngle += Z_STEP;
}
//Установлен флаг движения вправо и текущий угол не минимален
else if (moveServoZRight && curZAngle - Z_STEP >= Z_R_ANGLE)
{
//От текущего угла отнимаем гор. шаг
curZAngle -= Z_STEP;
}
//Установлен
if (moveServoRLeft && curRAngle + R_STEP <= R_L_ANGLE)
{
//К текущему гор. углу прибавляем гор. шаг
curRAngle += R_STEP;
}
//Установлен флаг движения вправо и текущий угол не минимален
else if (moveServoRRight && curRAngle - R_STEP >= R_R_ANGLE)
{
//От текущего угла отнимаем гор. шаг
curRAngle -= R_STEP;
}
//Если было движние по вертикали
if (moveServoVUp || moveServoVDown)
{
myservoV.write(curVAngle);
}
//Если было движение по горизонтали
if (moveServoHLeft || moveServoHRight)
{
myservoH.write(curHAngle);
}
if (moveServoZLeft || moveServoZRight)
{
myservoZ.write(curZAngle);
}
if (moveServoRLeft || moveServoRRight)
{
myservoR.write(curRAngle);
}
}
void MasterReceive()
{//================================================================= Error Checking ==========================================================
byte d;
int i=0;
Wire.requestFrom(I2Caddress,24); // request 24 bytes from device 007
while(Wire.available()<24) // wait for entire data packet to be received
{
if(i==0) Serial.print("Waiting for slave to send data."); // Only print message once (i==0)
if(i>0) Serial.print("."); // print a dot for every loop where buffer<24 bytes
i++; // increment i so that message only prints once.
if(i>79)
{
Serial.println("");
i=1;
}
}
d=Wire.read(); // read start byte from buffer
if(d!=startbyte) // if start byte not equal to 0x0F
{
Serial.print(d,DEC);
while(Wire.available()>0) // empty buffer of bad data
{
d=Wire.read();
}
Serial.println(" Wrong Start Byte"); // error message
return; // quit
}
//================================================================ Read Data ==============================================================
//Serial.print(". Trex Err:"); // slave error report
Serial.print(Wire.read(),DEC);
i=Wire.read()*256+Wire.read(); // T'REX battery voltage
Serial.print(" Akk:");
Serial.print(int(i/10));Serial.print(".");
Serial.print(i-(int(i/10)*10));Serial.print("V");
i=Wire.read()*256+Wire.read();
Serial.print("\tL Curr:");
Serial.print(i);Serial.print("mA"); // T'REX left motor current in mA
i=Wire.read()*256+Wire.read();
Serial.print(" Enc:");
Serial.print(i); // T'REX left motor encoder count
i=Wire.read()*256+Wire.read();
Serial.print("\tR Curr:");
Serial.print(i);Serial.print("mA"); // T'REX right motor current in mA
i=Wire.read()*256+Wire.read();
Serial.print(" Enc:");
Serial.print(i); // T'REX right motor encoder count
i=Wire.read()*256+Wire.read();
Serial.print(" X-axis:");
Serial.print(i); // T'REX X-axis
i=Wire.read()*256+Wire.read();
Serial.print(" Y:");
Serial.print(i); // T'REX Y-axis
i=Wire.read()*256+Wire.read();
Serial.print(" Z:");
Serial.print(i); // T'REX Z-axis
i=Wire.read()*256+Wire.read();
Serial.print(" X-delta:");
Serial.print(i); // T'REX X-delta
i=Wire.read()*256+Wire.read();
Serial.print(" Y:");
Serial.print(i); // T'REX Y-delta
i=Wire.read()*256+Wire.read();
Serial.print(" Z:");
Serial.println(i); // T'REX Z-delta
}
Здравтсвуйте, переделал код который выше, для того чтобы использовать серво и драйвер двигателя L298N, но он не управляет двигателем, подскажите, где я ошибся.
#include <PS2X_lib.h> //for v1.6
#include <Servo.h>
PS2X ps2x;
int PS2 = 0;
Servo LXservo;
int fspeed; // forward speed
int bspeed; // backward speed
const int in1 = 2; // direction pin 1
const int in2 = 4; // direction pin 2
const int ena = 3; // PWM pin to change speed
void setup(){
LXservo.attach(6);
PS2 = ps2x.config_gamepad(13,11,10,12, true, true); //Настройка выводов: (clock, command, attention, data, true, true)
pinMode(in1, OUTPUT); // connection to L298n
pinMode(in2, OUTPUT); // connection to L298n
pinMode(ena, OUTPUT); // connection to L298n
}
void loop(){
LXservo.write(map(ps2x.Analog(PSS_LX), 0, 255, 70, 165)); ;
delay(50);
ps2x.read_gamepad();
if (ps2x.Analog(PSS_LY) > 128) bspeed = map(ps2x.Analog(PSS_LY), 0, 255, 0, 69), backward(bspeed);
if (ps2x.Analog(PSS_LY) < 128) fspeed = map(ps2x.Analog(PSS_LY), 0, 255, 69, 0), forward(fspeed);
// if (ps2x.Analog(PSS_RY) >190 && msg[0] <200)data = msg[0], stop();
// dir_pwm(ps2x.Analog(PSS_RY),2); //
}
void forward(int fspeed)
{
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
analogWrite(ena, fspeed);
}
void backward(int bspeed)
{
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
analogWrite(ena, bspeed);
}
Спасибо, Жека. Работает, и мой код наверное тоже работает. Я на двигатель подключил через драйвер l298n аккумулятор 18650 он не работал по этому. А когда подал на двигатель без драйвера, то работало. Общим 2х18650 подключил и все нормально. Спасибо.
на джойстик не реагирует но в порте пишет
еще раз. также что в терминале
теперь такое
на команды не реагирует
странно проверим идут ли вообще данные
хрень какаята непонятня, вобщем этот код тоже не обрабатывает значения джойстика, зато вот этот код работают джойстики но почемуто не выводиться принт от нажатия кнопок
колдовство какоето...
код не нашёл, пришлось восстанавливать....
X * X - чтобы чем больше отклонение джойстика, тем больше скорость перемещения сервы
в моём трустмастере ооооооочень нелинейные джойстики :( , отклонение на четверть - уже дают 255
я делал пульт сам на линейных потенциометрах
только что проверял - работает код
без строки 31
перевёл первоисточник так :
ps2x.read_gamepad(
false
, vibrate );
ничё не работает.....в вышепредложенных кодах я не заметил такого оператора, гугл
и ps2x.read_gamepad(false, ps2x_vibrate);
//read controller and set large motor to spin at 'vibrate' speed
прочитать контроллер и установить большой двигатель вращаться в «вибрировать» скорости
поменял дельты с 0.0001 на 0.0005 - пульт стал работать помягче.... короче, настраивать надо
угол сделал +/- 80 градусов - в крайних положениях серва подклинивает :(
надо докопаться. проверяй
SU-27-16
спасибо скетч сразу заработал(только пины под свои поменял)
но есть нюансы. в крайних точках сервы и вправду клинит, они дрожат, правда возможно проблема именно в сг90 они вечно дрожат, если поставить мг 995 возможно дрож уйдет.
по скорости вращения и ее плавности. при небольшом отклонении серва всеравно достаточно быстро движеться а при резком до упор нажатии, движеться вроде быстрее но ненамного. подскажите как кими коэфицентами это регулировать?
это у вас код от какогото танка?
jeka_tm
почемуто точе ничего не реагирует на джой :(
ну если найду свой приемник побалуюсь
а что проект такна погиб? ушел на полку?
самый первый? да. последний нет. он ездит, но туда так много всего нужно запихнуть, я пока не решил как все разместить, и не собрал то что запихивать. там еще много трудностей
у меня тоже первый вариант был с водометом и клешней, управлялся со смартфона.
потом вместо водомета установил пушку стреляющую 6мм шариками.
потом рещил что геймпад будет удобнее + решил добавить функционала. так что сейчас у меня через и2с рабюотает 2 платы.
в финале будет телега с клешней манипулятором, пушкой стреляющей шариками, водомет, причем и то и другое на независимых поворотных "башнях" на каждую по 2 сервы.
ну и еще добавлю форы, подсветку, может какието спец эффекты и тд...
корпус впринцыпе позволяет все это на себе разместить, но правда тоже не без проблем. впихнуть невпихуемое это нелегкая задача :)
))) да. времени нужно свободного больше, тогда можно быстрее сделать
время наше все... я уже больше полу года собираю.... и вот недавно заказал новые комплектующие на али, вот жду...
по скорости вращения и ее плавности. при небольшом отклонении серва всеравно достаточно быстро движеться а при резком до упор нажатии, движеться вроде быстрее но ненамного. подскажите как кими коэфицентами это регулировать?
коэфф -
float
deltaAnglLR = 0.0005;
// настройка
и формула - startAnglLR = startAnglLR + x * x * deltaAnglLR;
вернее брать надо не квадратическую зависимость , а экспоненциальную - потенциометры в джойстике применённые - для других целей,
поэтому и делал пульт самопальный....
чувствительность - если жать на манипулятор по микрону можно поймать ооооочееееееннннннььь меееееедлеееееннооооое перемещение сервы :)
но за это время тибя расстреляет jeka_tm из гауссовской :)
2х мм алюминий его гаус не пробьет :)
зато моя машина больше, тяжелее и мощьнее, вомнет его танк, раздавит, а потом схватит манипуляторо м увезет на свалку, и в завершении зальет водой, чтоб наверняка :))
ну раздавит врядли)) да и струйка воды ему нипочем. а при "правильной" экранировке гаусса электроника на машинке сойдет в ума или просто перестанет реагировать. шутка ли 350В 400А за 1-2 миллисекунды. больше и не понадобится. входные цепи хотя бы радиоприемного тракта не выдержат. наводки и мк могут попалить при удачном выстреле
вот я ляпнул-то..... :(
и начался баттл.....
SLOM ! у jeka_tm и авиация, и флотилия катеров уже есть !
BREAK !!!!!!
завтра #409 пробовать хочу - самому интерессно стало...
кстати да. не стоит забывать про самолеты и катер. да и машинку-самоубийцу можно сделать. без вариантов))
попробуй если есть возможность. я может тоже проверю. только сервы остались только на самолете. медленно элероном можно подвигать. но это не так показательно
скорее всего проблема в считывании данных с приемника
у того кода привязка к градусам, а это крупный шаг. потом просто вместо градусов сделать миллисекунды как в твоем коде и все будет гораздо точнее. а delay заменить на миллис. хоть от просто к сложному, но что то не то
скорее всего проблема в считывании данных с приемника
у того кода привязка к градусам, а это крупный шаг. потом просто вместо градусов сделать миллисекунды как в твоем коде и все будет гораздо точнее. а delay заменить на миллис. хоть от просто к сложному, но что то не то
V=S/T.... я - через S , а это градусы.... ты через T - да, точнее и плавнее будет - согласен....
...пусть ТС ( второстепенный думает ) ( тема-то - твоя )
скорее всего проблема в считывании данных с приемника - согласен :)
не в тему ( но к тому же автору ) - калининградский катер L=1500 из оцинковки был арестован при первом же спуске на воду береговой охраной ФСБ ( погранцы ) :(
промежуточных снимков не делали ( дятлы ) , съёмка спуска, камера, катер - конфискованы на месте.....
:(
охренеть. сурово
ну раздавит врядли)) да и струйка воды ему нипочем. а при "правильной" экранировке гаусса электроника на машинке сойдет в ума или просто перестанет реагировать. шутка ли 350В 400А за 1-2 миллисекунды. больше и не понадобится. входные цепи хотя бы радиоприемного тракта не выдержат. наводки и мк могут попалить при удачном выстреле
эпицентр, и вся мощь импульса будет у вас на танке.... а экранировка это не так просто... это только в фильмах фольгой голову обвернул и порядок :)
да и сомниваюсь я что получиться сделать направленный "луч" а иначе все это пшик...
насчет катера 1,5 м длинной, а по какой причине его конфисковали, и видео камеры тоже? похоже на какойто беспредел?! даже если спуск на воду беспелотных средств запрещен какимито там нелепыми законами? , то на каком основании забирать видео камеры?
есть подробности инцедента?
jeka_tm, Ваша ссылка на скетч и библиотеку для джойстика ps2 не работает (в начале темы есть), видимо Вы удалили его с яндексдиска прошу дать ссылку на скетч.
старых скетчей к сожалению не осталось. был сбой. много чего пропало. совсем небольшую часть смог восстановить
старых скетчей к сожалению не осталось. был сбой. много чего пропало. совсем небольшую часть смог восстановить
C некоторых пор начал проекты еще и на облако дублировать.Мало ли что
я все на яндекс диске держу. но его заглючило и он почему то одну папку затер. и именно arduino
а на домашнем пк что нет ничего?
что в том управлении было реализовано?
камеру вернули, запуски дронов разрешены только при установлении Временного или Местного режима, так что любой коптер транспортная полиция имеет право конфисковать.... лодка - там же нейтральные воды рядом, отчитаются что наркотрафик прикрыли :)
я специального все на яндекс диске храню чтобы доступ был с нескольких компов и не потерять. когда что то удаляешь все перемещается в корзину на сервере и можно восстановить. но тут почему то этого не произошло. после этого периодически делаю дополнительно копию всего. но старое уже не вернуть
в том управлении просто езда. пушка же не поворачивалась. это же модель ПТСАУ была. а поворот на 5-10 градусов делать не стал. так что ничего особенного
хорошо что хоть камеру вернули. значит катер не вернут?
камеру вернули, запуски дронов разрешены только при установлении Временного или Местного режима, так что любой коптер транспортная полиция имеет право конфисковать.... лодка - там же нейтральные воды рядом, отчитаются что наркотрафик прикрыли :)
я слышал про закон что беспелотники запрещены, только с разрешения можно летать. но беспилотники это только то что летает в воздухе. а р\у лодна ну никак не беспелотник... и если на ней небыло видео камер для телеуправления на больших расстояниях, то какой нафиг нарко трафик? какие нейтральные воды, это ей 12 км нужно проплыть...
короче просто беспредел со стороны силовиков. я думаю должны быть какието органы занимающиеся такими делами... имхо чтоб по шапке настучали этим оборотням в погонах!
Жека, подскажи, а управление мотоами с кнопко геймпада делал?
у меня хитрая система, блютус модуль геймпада подключен к ардуино нано. та в свою очередь через I2C управляет другой ардуиной которая управляет мотор шилдами.
в управляемую плату залит свой, неменяемый код, который принимает определенные команды.
в управляющую нану залит свой код.
вот пример управления моторами с джойстиков геймпада.
теперь хочу сделать чтобы кнопками (вперед, назад, лево, право) ....
попробовал сделать так:
просто добавил в код строчку lmspeed =80;
поидее это должно закрутить левый мотор на 80 шим. но чтото некрутит, что я не так делаю? :)
я управлял крестиком. а там кстати было аналоговое управление. чем сильнее нажмешь. проверяй сначала пример к либе а не придумывай сразу
а можно пример управления с крестиком?
у меня нет отдельного мотор драйвера, могу моторами только через и2с, причем через джойстик все уже работает. хочу через кнопки.
вот что у меня может посылать мастер плата на слейв
и вот код управления через рычаг
надо както при нажатии кнопок передавать значение rmspeed и lmspeed и поидее будет крутить, но чтото у меня не крутит, может не так сделал, есть примеры?
вот полный код мастера:
но там есть много мусора, который тоже почемуто неработает(4сервы) но это пока не суть важно :)
не буду я за тебя код писать. залей пример и погоняй. и все поймешь
и не пиши пожалуйста в этой теме. ты слишком упертый человек, просишь совета но всеравно делаешь по своему, меня это раздражает
Здравтсвуйте, переделал код который выше, для того чтобы использовать серво и драйвер двигателя L298N, но он не управляет двигателем, подскажите, где я ошибся.
вот нафига делать такие длинные записи. нифига же непонятно
вот теперь сам подумай какой шим будет на выходе))) от 0 до 69. шим всего 69 максимум. может и не тронуться. зачем ограничиваешь?
да и если PSS_LY меньше 128 почему в map диапазон исходных данных от 0 до 255. надо было от 0 до 127)))
аналогично если больше 128
кстати почему в серву пишешь до того как обновил данные с джойстика? странно это
две переменные совсем незачем bspeed и fspeed. достаточно одной
короче должно получится что то вроде этого
Спасибо, Жека. Работает, и мой код наверное тоже работает. Я на двигатель подключил через драйвер l298n аккумулятор 18650 он не работал по этому. А когда подал на двигатель без драйвера, то работало. Общим 2х18650 подключил и все нормально. Спасибо.
пожалуйста. твой код работает, но не совсем корректно
нет отработки значения если =128 то стоп
да и двигатели будут еле крутится
видео выкладывай как соберешь
Првет, вот тест драйв машинки. https://youtu.be/XXXJG5udBK4
ну отлично)) с фарами реально прикольно
да) из механики самое сложное это поворотная система.
изначально в машинке колеса не поворачивались?
Првет, вот тест драйв машинки. https://youtu.be/XXXJG5udBK4
отличная машинка у вас получилась, скажите а вы управление на кнопки не пробовали задавать?
можно у вас ваш скетч попросить? можно на почту slom1@list.ru
заранее спасибо.
нет, сам вовороты организовал, завтра покажу видео.
Првет, вот тест драйв машинки. https://youtu.be/XXXJG5udBK4
отличная машинка у вас получилась, скажите а вы управление на кнопки не пробовали задавать?
можно у вас ваш скетч попросить? можно на почту slom1@list.ru
заранее спасибо.
Завтра скетч покажу и ссылку на то как сделать машинку.
Првет, вот тест драйв машинки. https://youtu.be/XXXJG5udBK4
отличная машинка у вас получилась, скажите а вы управление на кнопки не пробовали задавать?
можно у вас ваш скетч попросить? можно на почту slom1@list.ru
заранее спасибо.
Завтра скетч покажу и ссылку на то как сделать машинку.
Видел Ваш канал на ютюбе.Большая работа проведена и прекрасные технические решения.