Я хочу разобраться сам!
- Войдите на сайт для отправки комментариев
Пнд, 13/08/2018 - 00:53
Уважаемые форумчане, всем доброго вечера.
Прошу помощи научиться и разобраться. Времени изучать весь материал по програмированию у меня не много - сб и вс, но у меня сыну 1,7 мес. и поэтому времени вообще нет.
1 год назад купил ему десткий электромобиль без пульта. И вот наконец пришло время подключить ее к гейпаду от PS2.
Пытаюсь разобраться с этими библиотеками и скетчем, но сразу не получается.
скачал стандартный скетч с сопутсвующими библиотеками для этого дела. Но там шаговый двигатель стоит на повороте вправо и влево, а у меня стоит двигатель постоянного тока.
Я переписал код на повороты с кода от движения вперед назад, указал распиновку и их действие, но что то не так.
#include <PS2X_lib.h> //for v1.6 включаем стороннюю библиотеку в ваш скетч
#include <Servo.h> //включаем стороннюю библиотеку в ваш скетч
PS2X ps2x;
int PS2 = 0; // Тип данных для хранения целых чисел. Переменная типа int хранит 16-битные значения в диапазоне от -32768 до 32767, PS2 - имя переменной, 0 - значение, присваиваемое этой переменной
Servo LXservo;
// Это спецификатор (const), который изменяет поведение переменной (int) и делает ее доступной только для чтения
const int in1 = 2; // именуем pin 2 под дальнейшим названием - in1, который пойдет на L298n
const int in2 = 4; // именуем pin 4 под дальнейшим названием - in2, который пойдет на L298n
const int ena = 3; // именуем pin 3 под дальнейшим названием - ena (PWM шим сигнал), который пойдет на L298n
const int in3 = 6; // иll;ko;lменуем pin 2 под дальнейшим названием - in1, который пойдет на L298n
const int in4 = 7; // именуем pin 4 под дальнейшим названием - in2, который пойдет на L298n
const int enb = 9;
//pin to change speed
int fspeed; // forward speed
void setup(){
// В этом примере слово setup – это название функции. Нужно писать именно так, именно в таком регистре.
// Слово перед названием описывает тип возвращаемых данных. В данном случае никаких данных подпрограмма не возвращает, поэтому мы должны указать слово void.
// Все команды должны размещаться внутри фигурных скобок {}.
// Чаще всего внутри void setup указываются следующие инструкции:
// 1) pinMode с указанием номера и типа пина. Это инструкция определяет режим работы пинов ардуино.
// 2) Serial.begin с указанием скорости (чаще всего, 9600). Эта инструкция инициализирует работы с последовательным портом на указанной скорости.
// 3) Инструкции подключения и инициализации различных объектов библиотек ардуино.
// Например, servo.atach(6) укажет библиотеке, что сервопривод мы подключили к 9 пину, и все последующие действия код библиотеки будет совершать именно с этим портом.
// 4) Инициализацию глобальных переменных, если мы по каким-то причинам не можем сделать это при определении переменных в глобальной области видимости.
// 5) Выполнение других настроек и начальных значений для переменных и объектов.
LXservo.attach(6); // подключчение сервопривода к 9 пину
PS2 = ps2x.config_gamepad(13,11,10,12, true, true); //Настройка выводов: (clock, command, attention, data, true, true)я так понимаю, что это как раз включение пинов для приемника PS2
// Необходимо включить пин, а аткже определить его тип на вход сигнала (INPUT), либо на его выход(OUTPUT).
// Для этого используем функцию pinMode(<номер пина>, <тип>)
pinMode(in1, OUTPUT); // connection to L298n
pinMode(in2, OUTPUT); // connection to L298n
pinMode(ena, OUTPUT); // connection to L298n
pinMode(in3, OUTPUT); // pin 6 connection to L298n
pinMode(in4, OUTPUT); // pin 7 connection to L298n
pinMode(enb, OUTPUT); // pin 9 connection to L298n
pinMode(8, OUTPUT); // Фары
pinMode(9, OUTPUT); // Стопаки
pinMode(5, OUTPUT); // Стопаки от кнопки
// pinMode(1, OUTPUT); // Поворот на лево
// pinMode(7, OUTPUT); // Поворот на право
}
void loop(){
ps2x.read_gamepad();
// Одна из самых популярных функций Arduino digitalWrite позволяет выставлять на пинах платы высокое (5В или 3.3 В)или низкое (0В) значения напряжения.
// Функция активно используется в реальных проектах, формируя выходные сигналы на пинах.
// При использовании функции с пином с типом INPUT, функция включает встроенный резистор, что переводит порт в режим PULLUP.
// Вот пример:
// 1| pinMode(10, INPUT); // активируем 10 пин на вход сигнала
// 2| digitalWrite(10, HIGH); // Включаем внутренний резистор 20К в качестве подтягивающего для порта
// 3| int val = digitalRead(10) ; // Считываем значение от устройства (например, нажатой кнопки).
if(ps2x.ButtonPressed(PSB_CIRCLE)) digitalWrite(8, HIGH); // это фары. Если кнопка нажата (я так понимаю это значение 0x2000), то подаеться сигнал на 8 пин
if(ps2x.ButtonPressed(PSB_TRIANGLE)) digitalWrite(8, LOW);// это фары. Если кнопка не нажата или нажата другая кнопка (я так понимаю это значение 0x1000), то сигнал на 8 пин не подается
if(ps2x.ButtonPressed(PSB_SQUARE)) digitalWrite(5, HIGH); // это стопаки. Если кнопка нажата (я так понимаю это значение 0x8000), то подаеться сигнал на 5 пин
if(ps2x.ButtonPressed(PSB_CROSS)) digitalWrite(5, LOW); // это стопаки. Если кнопка не нажата или нажата другая кнопка (я так понимаю это значение 0x4000), то сигнал на 5 пин не подается
// if(ps2x.ButtonPressed(PSB_R1)) digitalWrite(7, HIGH);
// if(ps2x.ButtonPressed(PSB_R2)) digitalWrite(7, LOW);
if (ps2x.Analog(PSS_LY) == 128) analogWrite(ena, 0);
if (ps2x.Analog(PSS_LY) > 128){
fspeed = map(ps2x.Analog(PSS_LY), 129, 255, 0, 255);
digitalWrite(in1, LOW); // подаем разноименные сигналы на каналы L298n, чтобы мотор крутился
digitalWrite(in2, HIGH); // подаем разноименные сигналы на каналы L298n, чтобы мотор крутился
analogWrite(ena, fspeed); // Функция генерирует ШИМ-сигнал на выбранном пине с заданным заполнением
// Сигнал будет генерироваться до следующего вызова analogWrite или digitalWrite на этом пине
digitalWrite(9, HIGH);
}
if (ps2x.Analog(PSS_LY) < 128){
fspeed = map(ps2x.Analog(PSS_LY), 0, 127, 255, 0);
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
analogWrite(ena, fspeed);
digitalWrite(9, LOW);
}
/* отключаем серво привод и вместо него включаем драйвер двигателя
LXservo.write(map(ps2x.Analog(PSS_RX), 0, 255, 65, 105));
if (ps2x.Analog(PSS_RX) < 120){
digitalWrite(1, HIGH);
digitalWrite(7, LOW);
}
if (ps2x.Analog(PSS_RX) > 150){
digitalWrite(7, HIGH);
digitalWrite(1, LOW);
}
if (ps2x.Analog(PSS_RX) > 120 && ps2x.Analog(PSS_RX) < 150){
digitalWrite(1, LOW);
digitalWrite(7, LOW);
}
delay(50);
}
*/
if (ps2x.Analog(PSS_RX) == 128) analogWrite(ena, 0); // управление правым джойстиком
if (ps2x.Analog(PSS_RX) > 128){
fspeed = map(ps2x.Analog(PSS_RX), 129, 255, 0, 255);
digitalWrite(in3, LOW); // подаем разноименные сигналы на каналы L298n, чтобы мотор крутился
digitalWrite(in4, HIGH); // подаем разноименные сигналы на каналы L298n, чтобы мотор крутился
analogWrite(enb, fspeed); // Функция генерирует ШИМ-сигнал на выбранном пине с заданным заполнением
// Сигнал будет генерироваться до следующего вызова analogWrite или digitalWrite на этом пине
digitalWrite(9, HIGH);
}
if (ps2x.Analog(PSS_RX) < 128){
fspeed = map(ps2x.Analog(PSS_RX), 0, 127, 255, 0);
digitalWrite(in4, HIGH);
digitalWrite(in5, LOW);
analogWrite(enb, fspeed);
digitalWrite(9, LOW);
я конечно могу заплатить чтобы мне все сделали, но тогда я лишу себя возможности разобраться во всем и уж тем более начать что то делать для сына в будующем.
все комментарии мои, поэтому есть там и ошибки, но они для меня все написаны. Мне надо как то разобраться с этой маленькой задачей, чтобы двигаться дальше. Неделя у меня в работе с у тра до ночи.
Всем кто откликнется, буду благодарен.
PS за меня не прошу ничего делать, прошу подсказки и направления, к примеру что не так или где прочитать и т.д и т.п
начните, пожалуйста, с того, что вставьте код как положено - с подсветкой синтаксиса и номерами строк. Для этого в окне ввода нового сообщения нажмите розовую кнопку @code@.
Не сочтите за придирку - обсуждать ваш код, когда он выглядит как слепой текст - очень неудобно.
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...
Доброе утро. Согласен. Смогу только вечером после работы поменять.
Я уже поменял. Это на будущее
30 строка - ошибка в комментарии? Вы все пины назвали, так используйте Ваши названия.
Также не понятны строки 80, 82, 89, 90 и т.д. Вы сами знаете, что хотели ими сказать?
Уважаемые форумчане, все доброго дня!
Итак, вечером голова совсем отключилась. Днем зашел еще раз посмотреть свой код и увидел много ошибок. Отдельное спасибо большое b707 и Alexander, которые подтветили мой код и ведь действительно ничего не прочитать было.
Ошибки:
1) отключил 14 пункт
2) не выключил 30
3) 62,63 тоже не нужны
4) 89,123 тоже лишние
5) с пинами напутано, думаю как я ее еще не спалил, надо было купить штуки 3 сразу)
да и вообще внимательности бы мне побольше.
Хочу сам, своими кодами весь скетч написать, дурное это дело переделывать другие, когда сам еще 0
mykaida, 30 строка - я так понял пока все коды расшифровывал
80, 89 строка, я хотел сказать что подаю аналоговый шим сигнал с пина 3 (int ena) на l298
82, 90 не понял, но этот код был изначально - я так понял что он нужен для нормальной работы логической if
(а если разобраться внимательно то этот сигнал дополнительно подается для зажигания диодов, которые идут на 9 пин и которые загараються когда машина едет назад либо вперед
#include <PS2X_lib.h> //включаем библиотеку для ps2 PS2X ps2x; int PS2 = 0; // Тип данных для хранения целых чисел. Переменная типа int хранит 16-битные значения в диапазоне от -32768 до 32767, PS2 - имя переменной, 0 - значение, присваиваемое этой переменной // Это спецификатор (const), который изменяет поведение переменной (int) и делает ее доступной только для чтения const int in1 = 2; // объявить константу in1 и присвоить ей число 2 const int in2 = 4; // объявить константу in2 и присвоить ей число 4 const int ena = 3; // объявить константу ena и присвоить ей число 3 const int in3 = 6; // объявить константу in3 и присвоить ей число 6 const int in4 = 7; // объявить константу in4 и присвоить ей число 7 const int enb = 9; // объявить константу enb и присвоить ей число 9 int fspeed; // forward speed поступательная скорость ??? void setup(){ /* функция setup используется для инициализации переменных, определения режимов работы выводов, запуска используемых библиотек и т.д. Слово перед названием описывает тип возвращаемых данных. В данном случае никаких данных подпрограмма не возвращает, поэтому мы должны указать слово void. Все команды должны размещаться внутри фигурных скобок {}. Чаще всего внутри void setup указываются следующие инструкции: 1) pinMode с указанием номера и типа пина. Это инструкция определяет режим работы пинов ардуино. 2) Serial.begin с указанием скорости (чаще всего, 9600). Эта инструкция инициализирует работы с последовательным портом на указанной скорости. 3) Инструкции подключения и инициализации различных объектов библиотек ардуино. */ PS2 = ps2x.config_gamepad(13,11,10,12, true, true); //Настройка выводов: (clock, command, attention, data, true, true)я так понимаю, что это как раз включение пинов для приемника PS2 /* Необходимо включить пин, а аткже определить его тип сигнала на вход (INPUT) либо на выход(OUTPUT). Для этого используем функцию pinMode(<номер пина>, <тип>) */ pinMode(in1, OUTPUT); // подключение L298n pinMode(in2, OUTPUT); // подключение L298n pinMode(ena, OUTPUT); // подключение L298n pinMode(in3, OUTPUT); // подключение L298n pinMode(in4, OUTPUT); // подключение L298n pinMode(enb, OUTPUT); // подключение L298n } void loop(){ ps2x.read_gamepad(); // Одна из самых популярных функций Arduino digitalWrite позволяет выставлять на пинах платы высокое (5В или 3.3 В)или низкое (0В) значения напряжения. // Функция активно используется в реальных проектах, формируя выходные сигналы на пинах. // При использовании функции с пином с типом INPUT, функция включает встроенный резистор, что переводит порт в режим PULLUP. // Вот пример: // 1| pinMode(10, INPUT); // активируем 10 пин на вход сигнала // 2| digitalWrite(10, HIGH); // Включаем внутренний резистор 20К в качестве подтягивающего для порта // 3| int val = digitalRead(10) ; // Считываем значение от устройства (например, нажатой кнопки). if (ps2x.Analog(PSS_LY) == 128) analogWrite(ena, 0); // управление левым джойстиком if (ps2x.Analog(PSS_LY) > 128){ fspeed = map(ps2x.Analog(PSS_LY), 129, 255, 0, 255); digitalWrite(in1, LOW); // подаем разноименные сигналы на каналы L298n, чтобы мотор крутился digitalWrite(in2, HIGH); // подаем разноименные сигналы на каналы L298n, чтобы мотор крутился analogWrite(ena, fspeed); // Функция генерирует ШИМ-сигнал на выбранном пине с заданным заполнением // Сигнал будет генерироваться до следующего вызова analogWrite или digitalWrite на этом пине // digitalWrite(9, HIGH); } if (ps2x.Analog(PSS_LY) < 128){ fspeed = map(ps2x.Analog(PSS_LY), 0, 127, 255, 0); digitalWrite(in1, HIGH); digitalWrite(in2, LOW); analogWrite(ena, fspeed); } if (ps2x.Analog(PSS_RX) == 128) analogWrite(enb, 0); // управление правым джойстиком if (ps2x.Analog(PSS_RX) > 128){ fspeed = map(ps2x.Analog(PSS_RX), 129, 255, 0, 255); digitalWrite(in3, LOW); // подаем разноименные сигналы на каналы L298n, чтобы мотор крутился digitalWrite(in4, HIGH); // подаем разноименные сигналы на каналы L298n, чтобы мотор крутился analogWrite(enb, fspeed); // Функция генерирует ШИМ-сигнал на выбранном пине с заданным заполнением // Сигнал будет генерироваться до следующего вызова analogWrite или digitalWrite на этом пине } if (ps2x.Analog(PSS_RX) < 128){ fspeed = map(ps2x.Analog(PSS_RX), 0, 127, 255, 0); digitalWrite(in3, HIGH); digitalWrite(in4, LOW); analogWrite(enb, fspeed); } delay(50); }Помогите найти ошибку
Убрал вообще все лишнее, оставил только 4 действия: вперед назад, влево, вправо
однако, что то не так.
Строка 38:
ps2x.read_gamepad(false,false);А вообще посмотрите тут у человека работает, хоть и не безупречно. От этого и пляшите.