Подключение к р/у автомобилю Arduino, а также USB-руля и педалей Logitech Momo Racing 2004

Тема в разделе "Arduino & Shields", создана пользователем M0ln1a, 11 фев 2017.

  1. M0ln1a

    M0ln1a Гик

    Здравствуйте!
    Недавно решил сделать управление машинки при помощи руля и педалей. Не до конца понимаю, как соединить их с оригинальным пультом, да еще и Arduino надо между ними вставить. Arduino в схеме требуется для включения дополнительных функций (гудок, свет, датчики и т.д.).
    Руль и педали - Logitech Momo Racing 2004ого года
    Платы: Arduino Nano и Due
    Видел пример скетча в книге "Проекты с использованием контроллера Arduino", там этот код написан на С++, в котором я особо ничего и не понимаю... В скетче примерно 30 библиотек (они повторялись), включены функции, о которых я впервые слышал, матрицы, адреса. Возиться с изучением других языков я пока не планировал, но если надо, то надо! :)
    Да и устройства там не те были: руль Defender, а пульт от самолета
    Педали подключаются через обычный USB, а руль через провод, название которого я не знаю. Напоминает RS-232, сверху 3 контакта, снизу 4.
    Варианты подключения:
    1. Через Bluetooth
    2. Проводами: комплект (руль, педали) -> Ардуино -> Пульт
    3. Управление пультом при помощи сервомашинок
    Названия приемника и передатчика скажу при надобности, пока их не вскрывал!
    Также скину фотографии!

    Возможно ли воплотить в жизнь данный проект? Если да, то как это сделать?

    PS
    Извиняюсь, если задал вопрос не в той категории. Вообще в этом вопросе огромное количество различных тематик)

    Заранее спасибо!
    Фото: https://drive.google.com/open?id=0Bx6XCuT9H9a3c0dsbmFTbFJOSFk

    Вот код для приема команд (у меня не такой передатчик)

    Код (C++):

    // передатчик - HK-T6A
    // приемник :
    // Ch1 - Rudder (руль направления, рыскание, YAW)
    // Ch2 - Elevator (тангаж, PITCH)
    // Ch3 - Throttle (газ)
    // Ch4 - Aileron (элероны, ROLL)


    unsigned long Ch1Value,Ch2Value,Ch3Value,Ch4Value;
    unsigned long last1,last2,last3,last4;
    int pinCh1=11;
    int pinCh2=10;
    int pinCh3=9;
    int pinCh4=8;

    void setup()
    {
      Serial.begin(9600);
      Serial.println("Ready");
      pinMode (pinCh1, INPUT); // вход Rx channel 1 на чтение
      pinMode (pinCh2, INPUT); // вход Rx channel 2 на чтение
      pinMode (pinCh3, INPUT); // вход Rx channel 3 на чтение
      pinMode (pinCh4, INPUT); // вход Rx channel 4 на чтение
      last1 = pulseIn (pinCh1, HIGH); //чтение данных RC channel 1
      last2 = pulseIn (pinCh2, HIGH); //чтение данных RC channel 2
      last3 = pulseIn (pinCh3, HIGH); //чтение данных RC channel 3
      last4 = pulseIn (pinCh4, HIGH); //чтение данных RC channel 4
    }

    void loop()
    {
    //
      Ch1Value = pulseIn (pinCh1, HIGH, 20000); //чтение данных RC channel 1
    if (Ch1Value == 0) {Ch1Value = last1;}
    else {last1 = Ch1Value;}
      Serial.print ("  Ch1: ");Serial.print (Ch1Value);
    //
      Ch2Value = pulseIn (pinCh2, HIGH, 20000); //чтение данных RC channel 2
    if (Ch2Value == 0) {Ch2Value = last2;}
    else {last2 = Ch2Value;}
      Serial.print("  Ch2: ");Serial.print (Ch2Value);
    //
      Ch3Value = pulseIn (pinCh3, HIGH, 20000); //чтение данных RC channel 3
    if (Ch3Value == 0) {Ch3Value = last3;}
    else {last3 = Ch3Value;}
      Serial.print("  Ch3: ");Serial.print (Ch3Value);
    //
      Ch4Value = pulseIn (pinCh4, HIGH, 20000); //чтение данных RC channel 4
    if (Ch4Value == 0) {Ch4Value = last4;}
    else {last4 = Ch4Value;}
      Serial.print("  Ch4: ");Serial.print (Ch4Value);
      Serial.println("");
    }
    Вот это 3 скетча для руля:

    Код (C++):
    #include <avr/pgmspace.h>
    #include <avrpins.h>
    #include <max3421e.h>
    #include <usbhost.h>
    #include <usb_ch9.h>
    #include <Usb.h>
    #include <usbhub.h>
    #include <avr/pgmspace.h>
    #include <address.h>
    #include <hid.h>
    #include <hiduniversal.h>
    #include "hidjoystickrptparser.h"
    #include <printhex.h>
    #include <message.h>
    #include <hexdump.h>
    #include <parsetools.h>

    USB                                             Usb;
    USBHub                                          Hub(&Usb);
    HIDUniversal                                    Hid(&Usb);
    JoystickEvents                                  JoyEvents;
    JoystickReportParser                            Joy(&JoyEvents);

    #include <SPI.h>
    #include <Mirf.h>
    #include <nRF24L01.h>
    #include <MirfHardwareSpiDriver.h>
    #define MAX_BUFF 32 //Буфер приёма-передачи

    void setup()
    {
      Serial.begin( 115200 );
      Serial.println("Start");

    if (Usb.Init() == -1)
          Serial.println("OSC did not start.");
       
      delay( 200 );

    if (!Hid.SetReportParser(0, &Joy))
          ErrorMessage<uint8_t>(PSTR("SetReportParser"), 1 );


      Mirf.spi = &MirfHardwareSpi;
      Mirf.init();
      Mirf.setRADDR((byte *)"defender"); //Хдесь задаём адрес
      Mirf.payload = MAX_BUFF; //Здесь задаём буфер
      Mirf.channel = 10;
    //Это канал приёма-передачи - должен
    //быть одинаковым у устройств.
      Mirf.config();
      Serial.println("Start..");
    }

    char buff[MAX_BUFF];
    int c_count = 0;



    void loop()
    {
        Usb.Task();
       //if()
         //{
          Serial.print(JoyEvents.X,HEX);Serial.print(" ");
          Serial.print(JoyEvents.Y,HEX);Serial.print(" ");
          Serial.print(JoyEvents.Z1,HEX);Serial.print(" ");
          Serial.print(JoyEvents.Z2,HEX);Serial.print(" ");
          Serial.print(JoyEvents.Rz,HEX);Serial.print(" ");
          Serial.println();//}
          buff[0]=map(JoyEvents.X,0,255,1,100);
          buff[1]=map(JoyEvents.Y,0,255,1,100);;
          buff[2]=map(JoyEvents.Z1,0,255,1,100);
          buff[3]=map(JoyEvents.Z2,0,255,1,100);
          buff[4]=JoyEvents.Rz+1;
          buff[5]=0;
        Mirf.setTADDR((byte *)"automobile1"); //Адрес!
        Serial.print(">");
        Mirf.send((uint8_t *)buff);
       while(Mirf.isSending()){
       }
        Serial.println(buff);
       
        delay(300);
    }

    #include <SPI.h>
    #include <Mirf.h>
    #include <nRF24L01.h>
    #include <MirfHardwareSpiDriver.h>
    #define MAX_BUFF 32 //Буфер приёма-передачи

    void setup(){
      Serial.begin(9600);
      Mirf.spi = &MirfHardwareSpi;
      Mirf.init();
      Mirf.setRADDR((byte *)"automobile1"); //Здесь задаём адрес
      Mirf.payload = MAX_BUFF; //Здесь задаём буфер
      Mirf.channel = 10;
    //Это канал приёма-передачи - должен
    //быть одинаковым у устройств.
      Mirf.config();
    // настраиваем выводы для моторов
      pinMode(3, OUTPUT);
      pinMode(4, OUTPUT);
      pinMode(5, OUTPUT);
      pinMode(6, OUTPUT);
      Serial.println("Start..");
    }

    char buff[MAX_BUFF];

    void loop(){
      delay(10);
    //receiving
    if(Mirf.dataReady()) {
        Mirf.getData((uint8_t *)buff);
       int fb1=buff[0];
       int lr=buff[1];
        go12(fb1,lr1);
    }
      delay(100);
    }
    //
    void go12(int fb,int lr)
    {
    //вперед-назад
    if(fb>50)
         {digitalWrite(3,HIGH);digitalWrite(4,LOW);
          digitalWrite(5,HIGH);digitalWrite(6,LOW);}
    else if(fb<50)
         {digitalWrite(3,LOW);digitalWrite(4,HIGH);
          digitalWrite(5,LOW);digitalWrite(6,HIGH);}
    else
         {digitalWrite(3,LOW);digitalWrite(4,LOW);
          digitalWrite(5,LOW);digitalWrite(6,LOW);}
    //влево-вправо
    int lr1=map(abs(50-lr),1,50,1,255);
    int fb1=map(abs(50-fb),1,50,1,255);
    if(lr<50)
       {int left=min(255,max(0,fb1-lr1/2));
         int right=min(255,fb1+lr1/2)}
    else
       {int right=min(255,max(0,fb1-lr1/2));
         int left=min(255,fb1+lr1/2)}
      analogWrite(9, left);
      analogWrite(10, right);
    }

    #include <SoftwareSerial.h>
    SoftwareSerial mySerial(4,5);

    #include <PS3USB.h>
    USB Usb;
    PS3USB PS3(&Usb);
    Button Btarr[16]={UP,RIGHT,DOWN,LEFT,SELECT,START,L3,R3,L2,R2,L1,R1,TRIANGLE,CIRCLE,CROSS,SQUARE};
    AnalogHat Joyarr[4]={LeftHatX,LeftHatY,RightHatX,RightHatY};

    int status_buttons[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    long millis_buttons[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    long millis_buttons1[16]={500,500,500,500,2000,2000,2000,2000,2000,2000,2000,2000,2000,2000,2000,2000};

    int status_joys[4]={0,0,0,0};
    int millis_joys[4]={0,0,0,0};
    int map_joys[4]={2000,-500,2000,-500};
    int dHatLeft=0;
    int dHatRight=0;

    void setup() {
      Serial.begin(115200);
    if (Usb.Init() == -1) {
        Serial.print(F("\r\nOSC did not start"));
       while(1); //halt
    }
      Serial.print(F("\r\nPS3 USB Library Started"));

    }
    void loop() {
      Usb.Task();

       // joys
    for(int i=0;i<4;i++)
       {
       if((PS3.getAnalogHat(Joyarr[i]) != status_joys[i]) && (millis()-millis_joys[i]>200))
         {
           millis_joys[i]=millis();status_joys[i]=PS3.getAnalogHat(Joyarr[i]);
           int hat=map(PS3.getAnalogHat(Joyarr[i]),0,255,map_joys[i]*(-1),map_joys[i]);
           if(i<2) dHatLeft=1;
           else dHatRight=1;
           }
         }
       if(dHatLeft>0)
         {dHatLeft=0;}
       if(dHatRight>0)
         {dHatRight=0;
          go_irobot(status_joys[3],status_joys[2]);}
    // buttons
    for(int i=0;i<16;i++)
       {
       if(PS3.getButtonPress(Btarr[i]) && status_buttons[i]==0)
         {
           millis_buttons[i]=millis();status_buttons[i]=1;
           put_actions(i);
           }
       else
         {if(millis()-millis_buttons[i]>millis_buttons1[i]) status_buttons[i]=0;}
       }
    }

    void put_actions(int btn1)
    {Serial.println(btn1);
     
    Последнее редактирование: 13 фев 2017
  2. rkit

    rkit Гуру

    Если находитесь в районе Москвы, то тысяч за 20 выну из ваших рулей начинку и подключу прямо к пульту.
    me@rkit.pp.ru
     
  3. M0ln1a

    M0ln1a Гик

    Не, не... Я сам хочу) В том то и прикол Arduino, что с ним можно обучаться чему-либо! Мне б просто знать, с чего начать, может источники какие-нибудь подкинуть или пример кода для одной функции, по которому я бы смог сделать все остальное по аналогии
     
  4. rkit

    rkit Гуру

    Начать надо с того, чтобы изучить основные элементы. Потом заглянуть в руль, и разобраться, что внутри. Дальше по ситуации.
     
  5. mcureenab

    mcureenab Гуру

    C++ всяко изучить придется, хотя бы на уровне читателя, для начала. Что бы понимать готовый код. Если вы не знаете как называется та или иная конструкция в коде, то уточнить по справочнику её семантику очень сложно.

    Нужно исследовать протокол взаимодействия с пультом. Могу заметить, что некоторые протоколы настолько сложны, что остаются закрытыми до потери актуальности. В общем, или вы находите описание протокола или занимаетесь исследованиями. Занятие не безнадежное. Тем более для игрушки вряд ли придумано что то сложное. Но тут никаких гарантий нет. Главное знать о том, какие в принципе есть способы взаимодействия электронного оборудования чтобы разгадать код.

    Рекомендую занятия в кружке по электронике. По крайней мере там должно быть оборудование для исследований и специалисты, которые подскажут куда рыть.

    Для начала изобразите схему устройства как вы его представляете. По крайней мере можно будет указать на недостающие компоненты и т.п.

    Раз уж вы нашли прототипы своего устройства, поделитесь ими. Так будет проще понять что нужно доработать под ваши требования, а не изобретать велосипед.
     
  6. M0ln1a

    M0ln1a Гик

    Я не говорил, что не разбираюсь в Arduino) Не могу я разобраться в чистом С++
     
  7. rkit

    rkit Гуру

    Ардуино программируют на чистом C++
     
  8. M0ln1a

    M0ln1a Гик

    Вот код для приема команд (у меня не такой передатчик)
    Код (C++):
    // передатчик - HK-T6A
    // приемник :
    // Ch1 - Rudder (руль направления, рыскание, YAW)
    // Ch2 - Elevator (тангаж, PITCH)
    // Ch3 - Throttle (газ)
    // Ch4 - Aileron (элероны, ROLL)


    unsigned long Ch1Value,Ch2Value,Ch3Value,Ch4Value;
    unsigned long last1,last2,last3,last4;
    int pinCh1=11;
    int pinCh2=10;
    int pinCh3=9;
    int pinCh4=8;

    void setup()
    {
      Serial.begin(9600);
      Serial.println("Ready");
      pinMode (pinCh1, INPUT); // вход Rx channel 1 на чтение
      pinMode (pinCh2, INPUT); // вход Rx channel 2 на чтение
      pinMode (pinCh3, INPUT); // вход Rx channel 3 на чтение
      pinMode (pinCh4, INPUT); // вход Rx channel 4 на чтение
      last1 = pulseIn (pinCh1, HIGH); //чтение данных RC channel 1
      last2 = pulseIn (pinCh2, HIGH); //чтение данных RC channel 2
      last3 = pulseIn (pinCh3, HIGH); //чтение данных RC channel 3
      last4 = pulseIn (pinCh4, HIGH); //чтение данных RC channel 4
      }

    void loop()
    {
      //
      Ch1Value = pulseIn (pinCh1, HIGH, 20000); //чтение данных RC channel 1
      if (Ch1Value == 0) {Ch1Value = last1;}
      else {last1 = Ch1Value;}
      Serial.print ("  Ch1: ");Serial.print (Ch1Value);
      //
      Ch2Value = pulseIn (pinCh2, HIGH, 20000); //чтение данных RC channel 2
      if (Ch2Value == 0) {Ch2Value = last2;}
      else {last2 = Ch2Value;}
      Serial.print("  Ch2: ");Serial.print (Ch2Value);
      //
      Ch3Value = pulseIn (pinCh3, HIGH, 20000); //чтение данных RC channel 3
      if (Ch3Value == 0) {Ch3Value = last3;}
      else {last3 = Ch3Value;}
      Serial.print("  Ch3: ");Serial.print (Ch3Value);
      //
      Ch4Value = pulseIn (pinCh4, HIGH, 20000); //чтение данных RC channel 4
      if (Ch4Value == 0) {Ch4Value = last4;}
      else {last4 = Ch4Value;}
      Serial.print("  Ch4: ");Serial.print (Ch4Value);
      Serial.println("");
     
    }
    Вот это для руля:
    Код (C++):
    #include <avr/pgmspace.h>

    #include <avrpins.h>
    #include <max3421e.h>
    #include <usbhost.h>
    #include <usb_ch9.h>
    #include <Usb.h>
    #include <usbhub.h>
    #include <avr/pgmspace.h>
    #include <address.h>
    #include <hid.h>
    #include <hiduniversal.h>

    #include "hidjoystickrptparser.h"

    #include <printhex.h>
    #include <message.h>
    #include <hexdump.h>
    #include <parsetools.h>

    USB                                             Usb;
    USBHub                                          Hub(&Usb);
    HIDUniversal                                    Hid(&Usb);
    JoystickEvents                                  JoyEvents;
    JoystickReportParser                            Joy(&JoyEvents);



    #include <SPI.h>
    #include <Mirf.h>
    #include <nRF24L01.h>
    #include <MirfHardwareSpiDriver.h>
    #define MAX_BUFF 32 //Буфер приёма-передачи

    void setup()
    {
      Serial.begin( 115200 );
      Serial.println("Start");

      if (Usb.Init() == -1)
          Serial.println("OSC did not start.");
         
      delay( 200 );

      if (!Hid.SetReportParser(0, &Joy))
          ErrorMessage<uint8_t>(PSTR("SetReportParser"), 1  );


      Mirf.spi = &MirfHardwareSpi;
      Mirf.init();
     
      Mirf.setRADDR((byte *)"defender"); //Хдесь задаём адрес
      Mirf.payload = MAX_BUFF; //Здесь задаём буфер
      Mirf.channel = 10;
    //Это канал приёма-передачи - должен
    //быть одинаковым у устройств.
      Mirf.config();
     
      Serial.println("Start..");
    }

    char buff[MAX_BUFF];
    int c_count = 0;



    void loop()
    {
        Usb.Task();
        //if()
          //{
          Serial.print(JoyEvents.X,HEX);Serial.print(" ");
          Serial.print(JoyEvents.Y,HEX);Serial.print(" ");
          Serial.print(JoyEvents.Z1,HEX);Serial.print(" ");
          Serial.print(JoyEvents.Z2,HEX);Serial.print(" ");
          Serial.print(JoyEvents.Rz,HEX);Serial.print(" ");
          Serial.println();//}
          buff[0]=map(JoyEvents.X,0,255,1,100);
          buff[1]=map(JoyEvents.Y,0,255,1,100);;
          buff[2]=map(JoyEvents.Z1,0,255,1,100);
          buff[3]=map(JoyEvents.Z2,0,255,1,100);
          buff[4]=JoyEvents.Rz+1;
          buff[5]=0;
        Mirf.setTADDR((byte *)"automobile1"); //Адрес!
        Serial.print(">");
        Mirf.send((uint8_t *)buff);
        while(Mirf.isSending()){
        }
        Serial.println(buff);
         
        delay(300);
    }
    Код (C++):
    #include <SPI.h>
    #include <Mirf.h>
    #include <nRF24L01.h>
    #include <MirfHardwareSpiDriver.h>
    #define MAX_BUFF 32 //Буфер приёма-передачи

    void setup(){
      Serial.begin(9600);
      Mirf.spi = &MirfHardwareSpi;
      Mirf.init();
     
      Mirf.setRADDR((byte *)"automobile1"); //Здесь задаём адрес
      Mirf.payload = MAX_BUFF; //Здесь задаём буфер
      Mirf.channel = 10;
    //Это канал приёма-передачи - должен
    //быть одинаковым у устройств.
      Mirf.config();
     
      // настраиваем выводы для моторов
      pinMode(3, OUTPUT);
      pinMode(4, OUTPUT);
      pinMode(5, OUTPUT);
      pinMode(6, OUTPUT);
      Serial.println("Start..");
    }

    char buff[MAX_BUFF];

    void loop(){
      delay(10);
      //receiving
      if(Mirf.dataReady()) {
        Mirf.getData((uint8_t *)buff);
        int fb1=buff[0];
        int lr=buff[1];
        go12(fb1,lr1);
      }
      delay(100);
    }
    //
    void go12(int fb,int lr)
      {
      //вперед-назад
      if(fb>50)
         {digitalWrite(3,HIGH);digitalWrite(4,LOW);
          digitalWrite(5,HIGH);digitalWrite(6,LOW);}
      else if(fb<50)
         {digitalWrite(3,LOW);digitalWrite(4,HIGH);
          digitalWrite(5,LOW);digitalWrite(6,HIGH);}
      else
         {digitalWrite(3,LOW);digitalWrite(4,LOW);
          digitalWrite(5,LOW);digitalWrite(6,LOW);}
      //влево-вправо
      int lr1=map(abs(50-lr),1,50,1,255);
      int fb1=map(abs(50-fb),1,50,1,255);
      if(lr<50)
        {int left=min(255,max(0,fb1-lr1/2));
         int right=min(255,fb1+lr1/2)}
      else
        {int right=min(255,max(0,fb1-lr1/2));
         int left=min(255,fb1+lr1/2)}
      analogWrite(9, left);
      analogWrite(10, right);
      }
    Код (C++):
    #include <SoftwareSerial.h>
    SoftwareSerial mySerial(4,5);

    #include <PS3USB.h>
    USB Usb;
    PS3USB PS3(&Usb);
    Button Btarr[16]={UP,RIGHT,DOWN,LEFT,SELECT,START,L3,R3,L2,R2,L1,R1,TRIANGLE,CIRCLE,CROSS,SQUARE};
    AnalogHat Joyarr[4]={LeftHatX,LeftHatY,RightHatX,RightHatY};

    int status_buttons[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    long millis_buttons[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    long millis_buttons1[16]={500,500,500,500,2000,2000,2000,2000,2000,2000,2000,2000,2000,2000,2000,2000};

    int status_joys[4]={0,0,0,0};
    int millis_joys[4]={0,0,0,0};
    int map_joys[4]={2000,-500,2000,-500};
    int dHatLeft=0;
    int dHatRight=0;

    void setup() {
      Serial.begin(115200);
      if (Usb.Init() == -1) {
        Serial.print(F("\r\nOSC did not start"));
        while(1); //halt
      }
      Serial.print(F("\r\nPS3 USB Library Started"));

    }
    void loop() {
      Usb.Task();

       // joys
      for(int i=0;i<4;i++)
        {
        if((PS3.getAnalogHat(Joyarr[i]) != status_joys[i]) && (millis()-millis_joys[i]>200))
          {
           millis_joys[i]=millis();status_joys[i]=PS3.getAnalogHat(Joyarr[i]);
           int hat=map(PS3.getAnalogHat(Joyarr[i]),0,255,map_joys[i]*(-1),map_joys[i]);
           if(i<2) dHatLeft=1;
           else dHatRight=1;
           }
         }
       if(dHatLeft>0)
         {dHatLeft=0;}
       if(dHatRight>0)
         {dHatRight=0;
          go_irobot(status_joys[3],status_joys[2]);}
      // buttons
      for(int i=0;i<16;i++)
        {
        if(PS3.getButtonPress(Btarr[i]) && status_buttons[i]==0)
          {
           millis_buttons[i]=millis();status_buttons[i]=1;
           put_actions(i);
           }
        else
          {if(millis()-millis_buttons[i]>millis_buttons1[i]) status_buttons[i]=0;}
        }
    }

    void put_actions(int btn1)
    {Serial.println(btn1);
    switch(btn1)
      {
      case 4: mySerial.write(128);
           break;
      // start
      case 5: mySerial.write(132);
           break;
      // led
      case 8: mySerial.write((int)139);mySerial.write((int)8);mySerial.write((int)255);mySerial.write((int)255);
           break;
      case 10: mySerial.write(139);mySerial.write(4);mySerial.write((byte)0);mySerial.write(255);
           break;
      // music 6
      case 9: mySerial.write(141);mySerial.write(6);
           break;
    // 40 см и останов
      case 12: mySerial.write(152);mySerial.write(13);
           mySerial.write(137);mySerial.write(1);mySerial.write(44);mySerial.write(128);mySerial.write((byte)0);
           mySerial.write((int)156);mySerial.write((int)1);mySerial.write((int)144);
           mySerial.write(137);mySerial.write((byte)0);mySerial.write((byte)0);mySerial.write((byte)0);mySerial.write((byte)0);
           mySerial.write(153);
          break;
    // music 5
      case 11: mySerial.write(141);mySerial.write(5);
           break;
      case 13: mySerial.write(152);mySerial.write(17);
           mySerial.write(137);mySerial.write(1);mySerial.write(44);mySerial.write(128);mySerial.write((byte)0);
           mySerial.write((int)156);mySerial.write((int)1);mySerial.write((int)144);
           mySerial.write(137);mySerial.write(1);mySerial.write(44);mySerial.write((byte)0);mySerial.write(1);
           mySerial.write((int)157);mySerial.write((byte)0);mySerial.write(90);
           mySerial.write(153);
           mySerial.write(153);
           break;
      default:
           break;
      }
    }
    // отправка команд для движения робота
    void go_irobot(int v1,int r1)
      {
       int v2,r2,lf1,rt1;
       if(v1<128 && r1<128)
          {lf1=v1+abs(r1-128)/2;rt1=max(0,v1-abs(r1-128)/2);}
       else if(v1<128 && r1>=128)
          {lf1=max(0,v1-abs(r1-128)/2);rt1=v1+abs(r1-128)/2;}
       else if(v1>=128 && r1<128)
          {lf1=v1-abs(r1-128)/2;rt1=min(255,v1+abs(r1-128)/2);}
       else if(v1>=128 && r1>=128)
          {lf1=min(255,v1+abs(r1-128)/2);rt1=v1-abs(r1-128)/2;}
       else
          ;      
       //v2=map(v1,0,255,map_joys[3]*(-1),map_joys[3]);
       //r2=map(r1,0,255,map_joys[2]*(-1),map_joys[2]);
       lf1=map(lf1,0,255,250,-250);
       rt1=map(rt1,0,255,250,-250);
       mySerial.write(145);
       mySerial.write(highByte(rt1));mySerial.write(lowByte(rt1));
       mySerial.write(highByte(lf1));mySerial.write(lowByte(lf1));
      }
     
  9. mcureenab

    mcureenab Гуру

    Это вообще мало кто может. Язык очень сложный. Прочитайте букварь по C++. Не смотрите что тома толстые, в них много места уделено стандартной бибилиотеке шаблонов. Из нее вам мало что пригодится.
     
  10. M0ln1a

    M0ln1a Гик

    Разве вы прописываете public и private классы, когда пишете код на Arduino? Сомневаюсь...
     
  11. M0ln1a

    M0ln1a Гик

    Так, я немного переосмыслил сказанное... Скетчи не на C++, просто они очень усложнены
     
  12. mcureenab

    mcureenab Гуру

    По умолчанию все члены класса закрыты. Все члены структуры или объединения открыты. Так что public: всяко написать надо будет.
     
  13. rkit

    rkit Гуру

    Классы - нет, это бессмыслица какая-то. А члены обязательно. Без этого их вызывать не получится.

    Лол нет. Они именно на C++.
     
  14. mcureenab

    mcureenab Гуру

    А на чем же???
     
  15. M0ln1a

    M0ln1a Гик

    Вопрос вот в чем: Как изменить эти скетчи под мой проект, и связать их между собой? В книге они так же отдельно прописаны
     
  16. M0ln1a

    M0ln1a Гик

    Я имею ввиду не на классическом C++ . Даже не знаю как объяснить
     
  17. mcureenab

    mcureenab Гуру

    Фотки и ссылки на прототипы и код прицепите непосредственно к своему первому сообщению, чтобы они не затерялись в потоке сознания. И по ходу актуализируйте первое сообщение.

    Ардуино в режиме USB Host не работает. Т.е. к нему нельзя прицепить периферийное устройство, такое как USB руль. Для этого нужен шилд Arduino usb host.
     
  18. rkit

    rkit Гуру

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

    mcureenab Гуру

    Тут нечего объяснять, потому что это C++. Одна разница в том, что в Arduino IDE разработчик видит часть программы. Функция main спрятана в ядре. Но её не сложно найти и даже поправить под свои нужны.
     
  20. M0ln1a

    M0ln1a Гик

    Начнем с того, что у меня есть несколько вариантов собранного устройства
    Какой способ проще, таким я и буду пользоваться.
    Примерно я вижу это так: руль каким-то из предложенных образов подключен к пульту управления, к которому подключен Arduino.
    Педаль газа - машинка едет вперед, тормоз - назад, вправо, влево, на руле есть 6 кнопок, при нажатии на которых сигнал будет передан Arduino и будет включаться свет, поворотники, сигнал (это все я сделать смогу)