Я хочу разобраться сам!
- Войдите на сайт для отправки комментариев
Пнд, 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 пин и которые загараються когда машина едет назад либо вперед
Помогите найти ошибку
Убрал вообще все лишнее, оставил только 4 действия: вперед назад, влево, вправо
однако, что то не так.
Строка 38:
ps2x.read_gamepad(
false
,
false
);
А вообще посмотрите тут у человека работает, хоть и не безупречно. От этого и пляшите.