Я хочу разобраться сам!

Noko123
Offline
Зарегистрирован: 13.08.2018

Уважаемые форумчане, всем доброго вечера.

Прошу помощи научиться и разобраться. Времени изучать весь материал по програмированию у меня не много - сб и вс, но у меня сыну 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);

 

я конечно могу заплатить чтобы мне все сделали, но тогда я лишу себя возможности разобраться во всем и уж тем более начать что то делать для сына в будующем.
 
 
Noko123
Offline
Зарегистрирован: 13.08.2018

все комментарии мои, поэтому есть там и ошибки, но они для меня все написаны. Мне надо как то разобраться с этой маленькой задачей, чтобы двигаться дальше. Неделя у меня в работе с у тра до ночи.

Всем кто откликнется, буду благодарен. 

PS за меня не прошу ничего делать, прошу подсказки и направления, к примеру что не так или где прочитать и т.д и т.п

b707
Offline
Зарегистрирован: 26.05.2017

начните, пожалуйста, с того, что вставьте код как положено - с подсветкой синтаксиса и номерами строк. Для этого в окне ввода нового сообщения нажмите розовую кнопку @code@.

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

Alexander
Offline
Зарегистрирован: 25.04.2010
Noko123
Offline
Зарегистрирован: 13.08.2018

Доброе утро. Согласен. Смогу только вечером после работы поменять.

Alexander
Offline
Зарегистрирован: 25.04.2010

Я уже поменял. Это на будущее

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

30 строка - ошибка в комментарии? Вы все пины назвали, так используйте Ваши названия.

Также не понятны строки 80, 82, 89, 90 и т.д. Вы сами знаете, что хотели ими сказать?

 

Noko123
Offline
Зарегистрирован: 13.08.2018

Уважаемые форумчане, все доброго дня!

Итак, вечером голова совсем отключилась. Днем зашел еще раз посмотреть свой код и увидел много ошибок. Отдельное спасибо большое b707 и Alexander, которые подтветили мой код и ведь действительно ничего не прочитать было.

Ошибки:

1) отключил 14 пункт

2) не выключил 30

3) 62,63 тоже не нужны

4) 89,123 тоже лишние

5) с пинами напутано, думаю как я ее еще не спалил, надо было купить штуки 3 сразу)

да и вообще внимательности бы мне побольше.

Хочу сам, своими кодами весь скетч написать, дурное это дело переделывать другие, когда сам еще 0 

Noko123
Offline
Зарегистрирован: 13.08.2018

mykaida, 30 строка - я так понял пока все коды расшифровывал

80, 89 строка, я хотел сказать что подаю аналоговый шим сигнал с пина 3 (int ena) на l298

82, 90 не понял, но этот код был изначально - я так понял что он нужен для нормальной работы логической if

(а если разобраться внимательно то этот сигнал дополнительно подается для зажигания диодов, которые идут на 9 пин  и которые загараються когда машина едет назад либо вперед

Noko123
Offline
Зарегистрирован: 13.08.2018


Есть ошибка в скобках, не могу понять только где
#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);
}  

 

 
 
 
 
 
 
 
 
In file included from sketch\PS2X_lib.cpp:1:0:
 
PS2X_lib.h:107:19: error: expected unqualified-id before ')' token
 
     unsigned int ();
 
                   ^
 
PS2X_lib.cpp:46:35: error: no 'unsigned int PS2X::ButtonDataByte()' member function declared in class 'PS2X'
 
 unsigned int PS2X::ButtonDataByte() {
 
                                   ^
 
sketch\PS2X_lib.cpp: In member function 'boolean PS2X::read_gamepad(boolean, byte)':
 
sketch\PS2X_lib.cpp:96:54: warning: narrowing conversion of 'motor2' from 'byte {aka unsigned char}' to 'char' inside { } [-Wnarrowing]
 
    char dword[9] = {0x01,0x42,0,motor1,motor2,0,0,0,0};
 
                                                      ^
 
exit status 1
expected unqualified-id before ')' token
 
Noko123
Offline
Зарегистрирован: 13.08.2018

Помогите найти ошибку

Убрал вообще все лишнее, оставил только 4 действия: вперед назад, влево, вправо

однако, что то не так.

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Строка 38: ps2x.read_gamepad(falsefalse);

А вообще посмотрите тут у человека работает, хоть и не безупречно. От этого и пляшите.