Go Down

Topic: Câmbio H-Sifther Standalone  (Read 986 times) previous topic - next topic

luisilva

#15
Jan 12, 2017, 05:30 pm Last Edit: Jan 12, 2017, 05:30 pm by luisilva
Em primeiro lugar, a última imagem foi feita com a última versão do programa ou com a primeira? (a ideia da versão em modo de DEBUG é servir apenas para verificação e não para funcionamento normal)
Em segundo lugar é normal que no monitor serial não apareça nada. O monitor está configurado para uma velocidade de 9600 (pode verificar isto no canto inferior direito da janela do monitor serial), enquanto o programa está configurado para uma velocidade de 115200 (pode verificar isto na função setup() na linha Serial.begin(115200)). Deve alterar a velocidade do monitor serial para a que está configurada no programa (isto é, 115200).


Esdrasrk

A última imagem foi feita com o primeiro código que me passou ( sem usar o debug).

Foram feitas as alterações que pediu e ainda sim nada é exibido no monitor da porta serial. Segue as imagens.

luisilva

#17
Jan 12, 2017, 06:50 pm Last Edit: Jan 12, 2017, 06:50 pm by luisilva
Aparentemente o programa que forneceu estava alterado. Consegui encontrar o programa original aqui. O resultado é o que se segue.

Code: [Select]
/* Arduino USB Joystick HID demo */

/* Author: Darran Hunt
 * Released into the public domain.
 * Update by RICLAMER in 25/03/2014 to use Analog ports and digital ports
 * This code is to be used with Arduino UNO (6 axis and 13 Button )
 * This code is compatible with Arduino Mega.
 */
 
 /* INSTALATION
Just install POT in each analog port. Using the _Grnd _Analog _5V Arduino.
Like this image: http://arduino.cc/en/uploads/Tutorial/joy_sch_480.jpg
To setup the buttons, just install you prefered button switch under GND and Port Digital 02~13.
Use Flip to erease and burn this firmware DFU: https://github.com/harlequin-tech/arduino-usb/blob/master/firmwares/Arduino-big-joystick.hex
I used Arduino R3 with Atmega 16U2.
 */

#undef DEBUG

#define NUM_BUTTONS 40             // you don't need to change this value
#define NUM_AXES 8        // 6 axes to UNO, and 8 to MEGA. If you are using UNO, don't need to change this value.

typedef struct joyReport_t {
    int16_t axis[NUM_AXES];
    uint8_t button[(NUM_BUTTONS+7)/8]; // 8 buttons per byte
} joyReport_t;

joyReport_t joyReport;

uint8_t btn[12];
int fulloff = 0;
void setup(void);
void loop(void);
void setButton(joyReport_t *joy, uint8_t button);
void clearButton(joyReport_t *joy, uint8_t button);
void sendJoyReport(joyReport_t *report);


void setup()
{
  //set pin to input Button 
  for( int portId = 02; portId < 13; portId ++ )
{
          pinMode( portId, INPUT_PULLUP);
}
    Serial.begin(115200);
    delay(200);

    for (uint8_t ind=0; ind<8; ind++) {
joyReport.axis[ind] = ind*1000;
    }
    for (uint8_t ind=0; ind<sizeof(joyReport.button); ind++) {
        joyReport.button[ind] = 0;
    }
}

// Send an HID report to the USB interface
void sendJoyReport(struct joyReport_t *report)
{
#ifndef DEBUG
    Serial.write((uint8_t *)report, sizeof(joyReport_t));
#else
    // dump human readable output for debugging
    for (uint8_t ind=0; ind<NUM_AXES; ind++) {
Serial.print("axis[");
Serial.print(ind);
Serial.print("]= ");
Serial.print(report->axis[ind]);
Serial.print(" ");
    }
    Serial.println();
    for (uint8_t ind=0; ind<NUM_BUTTONS/8; ind++) {
Serial.print("button[");
Serial.print(ind);
Serial.print("]= ");
Serial.print(report->button[ind], HEX);
Serial.print(" ");
    }
    Serial.println();
#endif
}

// turn a button on
void setButton(joyReport_t *joy, uint8_t button)
{
    uint8_t index = button/8;
    uint8_t bit = button - 8*index;

    joy->button[index] |= 1 << bit;
}

// turn a button off
void clearButton(joyReport_t *joy, uint8_t button)
{
    uint8_t index = button/8;
    uint8_t bit = button - 8*index;

    joy->button[index] &= ~(1 << bit);
}

/*
 * Read Digital port for Button
 * Read Analog port for axis
  */
void loop()
{
  // Create Matriz with value off switch button 
  for(int bt = 1; bt < 13; bt ++)
{
          btn[bt]= digitalRead(bt+1);
}

   // Power ON button if it is press. buton 17 at 28
   for(int on=01; on < 13; on++)
   {
       if (btn[on] == LOW)
       {
         setButton(&joyReport, on+16);
      //  Serial.println("botao ON");
      //  Serial.println(on+16);
       }else{
         fulloff = fulloff++;
       }   //Power off all Button, if all button are not press
       
      if(fulloff == 13)
         {
           for(uint8_t cont=0; cont<40; cont++)
             { 
               clearButton(&joyReport, cont);
             }
            //  Serial.println("Every buttons is off");
          }
   }
     
    /* Move all of the Analogic axis */
    /* Arduino UNO have only 6 port. Will be necessary set to 0; the not used port */
    /* In this example, i will use just 3 axis. X, Y, Z */
    /* if you will use all 6 analog ports, set axis < 3, to axis < 5 */
    for (uint8_t axis = 0; axis < 4; axis++) {
      joyReport.axis[axis] = map(analogRead(axis), 0, 1023, -32768,32767 );
    }
    //Set to 0; the not used analog port.
    //if you will use all 6 analog ports, exclude the lines, axis[3] at axis [5] */
    //joyReport.axis[3] = 0;
    joyReport.axis[4] = 0;
    joyReport.axis[5] = 0;
    joyReport.axis[6] = 0;
    joyReport.axis[7] = 0;
    joyReport.axis[8] = 0;
   
    Xaxis = analogRead(0);
    Yaxis = analogRead(1);
    btn[8] = digitalRead(1);
   
    if (Yaxis >= 860 && Yaxis <=900) {
      if (Xaxis >= 280 && Xaxis <= 320) {
        btn[1] = 1;
      }
      else if (Xaxis >= 520 && Xaxis <= 560) {
        btn[3] = 1;
      }   
      else if (Xaxis >= 680 && Xaxis <= 720) {
        btn[5] = 1;
      }
    }
    else if (Yaxis >= 10 && Yaxis <=50) {
      if (Xaxis >= 280 && Xaxis <= 320) {
        btn[2] = 1;
      }
      else if (Xaxis >= 520 && Xaxis <= 560) {
        btn[4] = 1;
      }   
      else if (Xaxis >= 680 && Xaxis <= 720) {
        if (btn[8] == HIGH) {
          btn[6] = 1;
        }
        else {
          btn[7] = 1;
        }
      }
    }
   
    for (int on = 1; on < 8; on++)
    {
      if (btn[on] == 1)
      {
        btn[on] = 0;
        setButton(&joyReport, on);
      }
      else {
        clearButton(&joyReport, on);
      }
      delay(1);
    }
     
   
    //Send Data to HID
    sendJoyReport(&joyReport);

    delay(100);
    fulloff = 0;
}

Esdrasrk

Meu amigo, quando fui carregar para o Arduino apareceu a mensagem dizendo que a variável não foi declarada.

luisilva

Code: [Select]
/* Arduino USB Joystick HID demo */

/* Author: Darran Hunt
 * Released into the public domain.
 * Update by RICLAMER in 25/03/2014 to use Analog ports and digital ports
 * This code is to be used with Arduino UNO (6 axis and 13 Button )
 * This code is compatible with Arduino Mega.
 */
 
 /* INSTALATION
Just install POT in each analog port. Using the _Grnd _Analog _5V Arduino.
Like this image: http://arduino.cc/en/uploads/Tutorial/joy_sch_480.jpg
To setup the buttons, just install you prefered button switch under GND and Port Digital 02~13.
Use Flip to erease and burn this firmware DFU: https://github.com/harlequin-tech/arduino-usb/blob/master/firmwares/Arduino-big-joystick.hex
I used Arduino R3 with Atmega 16U2.
 */

#undef DEBUG

#define NUM_BUTTONS 40             // you don't need to change this value
#define NUM_AXES 8        // 6 axes to UNO, and 8 to MEGA. If you are using UNO, don't need to change this value.

typedef struct joyReport_t {
    int16_t axis[NUM_AXES];
    uint8_t button[(NUM_BUTTONS+7)/8]; // 8 buttons per byte
} joyReport_t;

joyReport_t joyReport;

uint8_t btn[12];
int fulloff = 0;

int16_t Xaxis;
int16_t Yaxis;

void setup(void);
void loop(void);
void setButton(joyReport_t *joy, uint8_t button);
void clearButton(joyReport_t *joy, uint8_t button);
void sendJoyReport(joyReport_t *report);


void setup()
{
  //set pin to input Button 
  for( int portId = 02; portId < 13; portId ++ )
{
          pinMode( portId, INPUT_PULLUP);
}
    Serial.begin(115200);
    delay(200);

    for (uint8_t ind=0; ind<8; ind++) {
joyReport.axis[ind] = ind*1000;
    }
    for (uint8_t ind=0; ind<sizeof(joyReport.button); ind++) {
        joyReport.button[ind] = 0;
    }
}

// Send an HID report to the USB interface
void sendJoyReport(struct joyReport_t *report)
{
#ifndef DEBUG
    Serial.write((uint8_t *)report, sizeof(joyReport_t));
#else
    // dump human readable output for debugging
    for (uint8_t ind=0; ind<NUM_AXES; ind++) {
Serial.print("axis[");
Serial.print(ind);
Serial.print("]= ");
Serial.print(report->axis[ind]);
Serial.print(" ");
    }
    Serial.println();
    for (uint8_t ind=0; ind<NUM_BUTTONS/8; ind++) {
Serial.print("button[");
Serial.print(ind);
Serial.print("]= ");
Serial.print(report->button[ind], HEX);
Serial.print(" ");
    }
    Serial.println();
#endif
}

// turn a button on
void setButton(joyReport_t *joy, uint8_t button)
{
    uint8_t index = button/8;
    uint8_t bit = button - 8*index;

    joy->button[index] |= 1 << bit;
}

// turn a button off
void clearButton(joyReport_t *joy, uint8_t button)
{
    uint8_t index = button/8;
    uint8_t bit = button - 8*index;

    joy->button[index] &= ~(1 << bit);
}

/*
 * Read Digital port for Button
 * Read Analog port for axis
  */
void loop()
{
  // Create Matriz with value off switch button 
  for(int bt = 1; bt < 13; bt ++)
{
          btn[bt]= digitalRead(bt+1);
}

   // Power ON button if it is press. buton 17 at 28
   for(int on=01; on < 13; on++)
   {
       if (btn[on] == LOW)
       {
         setButton(&joyReport, on+16);
      //  Serial.println("botao ON");
      //  Serial.println(on+16);
       }else{
         fulloff = fulloff++;
       }   //Power off all Button, if all button are not press
       
      if(fulloff == 13)
         {
           for(uint8_t cont=0; cont<40; cont++)
             { 
               clearButton(&joyReport, cont);
             }
            //  Serial.println("Every buttons is off");
          }
   }
     
    /* Move all of the Analogic axis */
    /* Arduino UNO have only 6 port. Will be necessary set to 0; the not used port */
    /* In this example, i will use just 3 axis. X, Y, Z */
    /* if you will use all 6 analog ports, set axis < 3, to axis < 5 */
    for (uint8_t axis = 0; axis < 4; axis++) {
      joyReport.axis[axis] = map(analogRead(axis), 0, 1023, -32768,32767 );
    }
    //Set to 0; the not used analog port.
    //if you will use all 6 analog ports, exclude the lines, axis[3] at axis [5] */
    //joyReport.axis[3] = 0;
    joyReport.axis[4] = 0;
    joyReport.axis[5] = 0;
    joyReport.axis[6] = 0;
    joyReport.axis[7] = 0;
    joyReport.axis[8] = 0;
   
    Xaxis = analogRead(0);
    Yaxis = analogRead(1);
    btn[8] = digitalRead(1);
   
    if (Yaxis >= 860 && Yaxis <=900) {
      if (Xaxis >= 280 && Xaxis <= 320) {
        btn[1] = 1;
      }
      else if (Xaxis >= 520 && Xaxis <= 560) {
        btn[3] = 1;
      }   
      else if (Xaxis >= 680 && Xaxis <= 720) {
        btn[5] = 1;
      }
    }
    else if (Yaxis >= 10 && Yaxis <=50) {
      if (Xaxis >= 280 && Xaxis <= 320) {
        btn[2] = 1;
      }
      else if (Xaxis >= 520 && Xaxis <= 560) {
        btn[4] = 1;
      }   
      else if (Xaxis >= 680 && Xaxis <= 720) {
        if (btn[8] == HIGH) {
          btn[6] = 1;
        }
        else {
          btn[7] = 1;
        }
      }
    }
   
    for (int on = 1; on < 8; on++)
    {
      if (btn[on] == 1)
      {
        btn[on] = 0;
        setButton(&joyReport, on);
      }
      else {
        clearButton(&joyReport, on);
      }
      delay(1);
    }
     
   
    //Send Data to HID
    sendJoyReport(&joyReport);

    delay(100);
    fulloff = 0;
}

Esdrasrk

Luis, não consegui testar. Meu arduino não é mais reconhecido pelo computador. Ele fica com a luz "on" ligada porém não é reconhecido. Não consigo identificar e nem carregar códigos para ele. Talvez precise reprogramar o ATmega.

Esdrasrk

Luis, segue o teste do código que me mandou. O engate das marchas não acionam os botões.

As fotos são refentes as marchas : N, 2 e 3.

Go Up