• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Problem z kompilacją kodu dla Pro Micro
#1
Dzień dobry wszystkim forumowiczom, Chcieliśmy z bratem stworzyć kontroler do komputera wedle tego poradnika https://www.youtube.com/watch?v=Z7Sc4MJ8RPM

Fizycznie powtórzyliśmy wszystko w skali prawie 1:1 ("prawie" tylko dlatego że różnią się same przyciski tj. ilość pinów się zgadza, pozostaje tylko kwestia wyglądu) To nasz pierwszy kontakt z takimi rozwiązaniami.  Początkowo kupiliśmy arduino nano, dopiero potem zauważyliśmy, że pomiędzy wersją nano a pro micro występują różnice w pinach (pan w sklepie doradził, że nano w tym przypadku będzie podobne, tak więc poszliśmy za jego radą) Kiedy przyszedł czas na połączenie kabli z arduino okazało się, że brakuje na nim pozycji 15. Nie chcieliśmy kombinować i poszliśmy na łatwiznę, kupiliśmy dokładnie to co on. Co do kodu również skorzystaliśmy z jego pomocy. 

 No i właśnie od tego momentu wszystko zaczęło się psuć. Pierwszy problem pojawił się już na samym początku, kiedy nie znajdowało nam #include <keypad.h> i #include <joystick.h>. Z tym sobie jakoś poradziłem. Pogooglowałem trochę, i doszedłem do wniosku, że trzeba dodać bibliotekę. Tak więc zrobiłem. Natomiast ten błąd nas już przerasta. W załączniku wrzycamy wszystkie pliki jakich używamy. 

Nie umiemy sobie z tym poradzić, gdyby ktoś z forumowiczów pomógł, bylibyśmy zobowiązani.
Pozdrawiamy


Kod:
Arduino:1.8.5 (Windows Store 1.8.10.0) (Windows 10), Płytka:"Arduino/Genuino Micro"

ARDUINO_BUTTON_BOXV2:86: error: 'Keypad' does not name a type

Keypad buttbx = Keypad( makeKeymap(buttons), rowPins, colPins, NUMROWS, NUMCOLS);

^

ARDUINO_BUTTON_BOXV2:88: error: 'Joystick_' does not name a type

Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,

^

C:\Users\sebas\Downloads\32-FUNCTION-BUTTON-BOX-master\32-FUNCTION-BUTTON-BOX-master\ARDUINO_BUTTON_BOXV2\ARDUINO_BUTTON_BOXV2.ino: In function 'void setup()':

ARDUINO_BUTTON_BOXV2:94: error: 'Joystick' was not declared in this scope

  Joystick.begin();

  ^

C:\Users\sebas\Downloads\32-FUNCTION-BUTTON-BOX-master\32-FUNCTION-BUTTON-BOX-master\ARDUINO_BUTTON_BOXV2\ARDUINO_BUTTON_BOXV2.ino: In function 'void CheckAllButtons()':

ARDUINO_BUTTON_BOXV2:106: error: 'buttbx' was not declared in this scope

      if (buttbx.getKeys())

          ^

ARDUINO_BUTTON_BOXV2:108: error: 'LIST_MAX' was not declared in this scope

       for (int i=0; i<LIST_MAX; i++)  

                       ^

ARDUINO_BUTTON_BOXV2:113: error: 'PRESSED' was not declared in this scope

                    case PRESSED:

                         ^

ARDUINO_BUTTON_BOXV2:114: error: 'HOLD' was not declared in this scope

                    case HOLD:

                         ^

ARDUINO_BUTTON_BOXV2:115: error: 'Joystick' was not declared in this scope

                              Joystick.setButton(buttbx.key[i].kchar, 1);

                              ^

ARDUINO_BUTTON_BOXV2:117: error: 'RELEASED' was not declared in this scope

                    case RELEASED:

                         ^

ARDUINO_BUTTON_BOXV2:118: error: 'IDLE' was not declared in this scope

                    case IDLE:

                         ^

C:\Users\sebas\Downloads\32-FUNCTION-BUTTON-BOX-master\32-FUNCTION-BUTTON-BOX-master\ARDUINO_BUTTON_BOXV2\ARDUINO_BUTTON_BOXV2.ino: In function 'void CheckAllEncoders()':

ARDUINO_BUTTON_BOXV2:150: error: 'Joystick' was not declared in this scope

      Joystick.setButton(rotaries[i].ccwchar, 1); delay(50); Joystick.setButton(rotaries[i].ccwchar, 0);

      ^

ARDUINO_BUTTON_BOXV2:153: error: 'Joystick' was not declared in this scope

      Joystick.setButton(rotaries[i].cwchar, 1); delay(50); Joystick.setButton(rotaries[i].cwchar, 0);

      ^

exit status 1
'Keypad' does not name a type

Ten raport powinien zawierać więcej informacji jeśli w
File -> Preferencje zostanie włączona opcja "Pokaż
szczegółowe informacje podczas kompilacji"


Załączone pliki
.zip   32-FUNCTION-BUTTON-BOX-master.zip (Rozmiar: 2.05 KB / Pobrań: 2)
.zip   ArduinoJoystickLibrary-master.zip (Rozmiar: 32.47 KB / Pobrań: 1)
 
Odpowiedź
#2
"#include <joystick.h>. Z tym sobie jakoś poradziłem. Pogooglowałem trochę, i doszedłem do wniosku, że trzeba dodać bibliotekę." Poradziłem sobie chyba nie do końca ? skąd wzięli ten joystick.h ? . Z tego foldera "ArduinoJoystickLibrary-master" trzeba skopiować "Joystick" i wkleić do folderu bibliotek ,nie używam tego systemu więc konkretnie nie podam miejsca.
 
Odpowiedź
#3
(03-08-2018, 14:25)-adamek napisał(a): "#include <joystick.h>. Z tym sobie jakoś poradziłem. Pogooglowałem trochę, i doszedłem do wniosku, że trzeba dodać bibliotekę." Poradziłem sobie chyba nie do końca ? skąd wzięli ten joystick.h ? . Z tego foldera "ArduinoJoystickLibrary-master" trzeba skopiować "Joystick" i wkleić do folderu bibliotek ,nie używam tego systemu więc konkretnie nie podam miejsca.

Zrobiłem tak z folderem joystick, w tym moemencie kod błędu wygląda tak:

Kod:
Arduino:1.8.5 (Windows Store 1.8.10.0) (Windows 10), Płytka:"Arduino/Genuino Micro"

ARDUINO_BUTTON_BOXV2:90: error: 'Keypad' does not name a type

Keypad buttbx = Keypad( makeKeymap(buttons), rowPins, colPins, NUMROWS, NUMCOLS);

^

C:\Users\sebas\Downloads\32-FUNCTION-BUTTON-BOX-master\32-FUNCTION-BUTTON-BOX-master\ARDUINO_BUTTON_BOXV2\ARDUINO_BUTTON_BOXV2.ino: In function 'void CheckAllButtons()':

ARDUINO_BUTTON_BOXV2:110: error: 'buttbx' was not declared in this scope

      if (buttbx.getKeys())

          ^

ARDUINO_BUTTON_BOXV2:112: error: 'LIST_MAX' was not declared in this scope

       for (int i=0; i<LIST_MAX; i++)  

                       ^

ARDUINO_BUTTON_BOXV2:117: error: 'PRESSED' was not declared in this scope

                    case PRESSED:

                         ^

ARDUINO_BUTTON_BOXV2:118: error: 'HOLD' was not declared in this scope

                    case HOLD:

                         ^

ARDUINO_BUTTON_BOXV2:121: error: 'RELEASED' was not declared in this scope

                    case RELEASED:

                         ^

ARDUINO_BUTTON_BOXV2:122: error: 'IDLE' was not declared in this scope

                    case IDLE:

                         ^

exit status 1
'Keypad' does not name a type

Ten raport powinien zawierać więcej informacji jeśli w
File -> Preferencje zostanie włączona opcja "Pokaż
szczegółowe informacje podczas kompilacji"
 
Odpowiedź
#4
Jak tu zakładasz post to wklej swój szkic, super również biblioteki. Gość na filmie zrobił dobrze, ale Ty jak nie masz pojęcia co piszesz to tak jakbyś przepisywał skrypt po japońsku, może gdzieś brakuje kropeczki (dla Ciebie niewidzialnej) i działać nie będzie. Pewnie dalej brakuje jakiejś biblioteki, tym razem wygląda na to, że w definicjach i w folderze.
Jak ktoś robi poradniki na YouTube to czasami zapomni o tym wspomnieć, bo on ma tę bibliotekę od roku, czyli "od zawsze".
 
Odpowiedź
#5
(03-08-2018, 17:20)kaczakat napisał(a): Jak tu zakładasz post to wklej swój szkic, super również biblioteki. Gość na filmie zrobił dobrze, ale Ty jak nie masz pojęcia co piszesz to tak jakbyś przepisywał skrypt po japońsku, może gdzieś brakuje kropeczki (dla Ciebie niewidzialnej) i działać nie będzie. Pewnie dalej brakuje jakiejś biblioteki, tym razem wygląda na to, że w definicjach i w folderze.
Jak ktoś robi poradniki na YouTube to czasami zapomni o tym wspomnieć, bo on ma tę bibliotekę od roku, czyli "od zawsze".

Tak się składa, że wszystkie pliki jakich użyłem wgrałem w pierwszym poście, skoro ten człowiek zrobił wszystko dobrze, niemożliwym jest żebym przepisał coś źle z tego powodu, że nic nie przepisywałem, kliknąłem tylko w plik o rozszerzeniu .ino i cały kod otworzył się w programie do kodowania. Z tego co czytałem w komentarzach ludzie mieli problemu z tą liniją keypad.h, w wyjaśnieniach dostali taką instrukcję [color=rgba(255, 255, 255, 0.88)]Sketch > Include library > Manage Library > search for Keypad.h

Może problem leży w miejscu znajdowania się plików na dysku ? (chodzi mi o biblioteki)
[/color]
 
Odpowiedź
#6
A keypad jest ten ? http://playground.arduino.cc/uploads/Code/keypad.zip jak nie to usuwamy tamten a kopiujemy ten .
Bo z ciekawości kompilowałem to i nie mam żadnych błędów .
 
Odpowiedź
#7
(03-08-2018, 20:21)-adamek napisał(a): A  keypad  jest ten ?   http://playground.arduino.cc/uploads/Code/keypad.zip    jak nie to usuwamy tamten a kopiujemy ten .
Bo z ciekawości kompilowałem to i nie mam żadnych błędów .

TAK ! O to chodziło. Dzięki wielkie. Już wyjaśniam o co chodzi. Nie użyłem biblioteki o podanej przez Ciebie nazwie, tylko stockowej Keyboard. Teraz wszystko działa oprócz jednego encodera, nie wiem tylko czy to przez kod czy raczej chodzi tu o fizyczne uszkodzenie przez moje lutowanie. Klik enkodera działa ale na obracanie gałką program nie wyłapuje. Do przypisania klawiszy używam JoyToKey
 
Odpowiedź
#8
Gość w opisie filmu dawał link do joystick.h także nie trzeba było nic googlować. Natomiast jest istotne gdzie wgrałeś ten KATALOG Joystick, lokalizacja pewnie zależy od systemu, na Windowsie ma być katalog "../Moje Dokumenty/Arduino/libraries/Joystick".
Na Nano to nie miało prawo działać, nawet nie chodzi o piny, ale o to że MICRO i LEONARDO (DUE)  mają wbudowany USB w procesor i to jest używane w tym programie. UNO/NANO/PRO MINI/MEGA mają USB tylko do zasilania i komunikacji UART.
Nie ja wymyślam zasady jak należy zadawać pytania, szkic ma być w formie do czytania a nie do ściągania, bo ktoś może Ci udzielić odpowiedzi jadąc pociągiem, nie ściągnie, nie rozpakuje i nie wczyta INO w telefonie. Biblioteki w załączniku - super, od razu można sprawdzić czy np. ja nie mam innej.
Kod:
//BUTTON BOX
//USE w ProMicro
//Tested in WIN10 + Assetto Corsa
//AMSTUDIO
//20.8.17

#include <Keypad.h>
#include <Joystick.h>

#define ENABLE_PULLUPS
#define NUMROTARIES 4
#define NUMBUTTONS 24
#define NUMROWS 5
#define NUMCOLS 5


byte buttons[NUMROWS][NUMCOLS] = {
 {0,1,2,3,4},
 {5,6,7,8,9},
 {10,11,12,13,14},
 {15,16,17,18,19},
 {20,21,22,23},
};

struct rotariesdef {
 byte pin1;
 byte pin2;
 int ccwchar;
 int cwchar;
 volatile unsigned char state;
};

rotariesdef rotaries[NUMROTARIES] {
 {0,1,24,25,0},
 {2,3,26,27,0},
 {4,5,28,29,0},
 {6,7,30,31,0},
};

#define DIR_CCW 0x10
#define DIR_CW 0x20
#define R_START 0x0

#ifdef HALF_STEP
#define R_CCW_BEGIN 0x1
#define R_CW_BEGIN 0x2
#define R_START_M 0x3
#define R_CW_BEGIN_M 0x4
#define R_CCW_BEGIN_M 0x5
const unsigned char ttable[6][4] = {
 // R_START (00)
 {R_START_M,            R_CW_BEGIN,     R_CCW_BEGIN,  R_START},
 // R_CCW_BEGIN
 {R_START_M | DIR_CCW, R_START,        R_CCW_BEGIN,  R_START},
 // R_CW_BEGIN
 {R_START_M | DIR_CW,  R_CW_BEGIN,     R_START,      R_START},
 // R_START_M (11)
 {R_START_M,            R_CCW_BEGIN_M,  R_CW_BEGIN_M, R_START},
 // R_CW_BEGIN_M
 {R_START_M,            R_START_M,      R_CW_BEGIN_M, R_START | DIR_CW},
 // R_CCW_BEGIN_M
 {R_START_M,            R_CCW_BEGIN_M,  R_START_M,    R_START | DIR_CCW},
};
#else
#define R_CW_FINAL 0x1
#define R_CW_BEGIN 0x2
#define R_CW_NEXT 0x3
#define R_CCW_BEGIN 0x4
#define R_CCW_FINAL 0x5
#define R_CCW_NEXT 0x6

const unsigned char ttable[7][4] = {
 // R_START
 {R_START,    R_CW_BEGIN,  R_CCW_BEGIN, R_START},
 // R_CW_FINAL
 {R_CW_NEXT,  R_START,     R_CW_FINAL,  R_START | DIR_CW},
 // R_CW_BEGIN
 {R_CW_NEXT,  R_CW_BEGIN,  R_START,     R_START},
 // R_CW_NEXT
 {R_CW_NEXT,  R_CW_BEGIN,  R_CW_FINAL,  R_START},
 // R_CCW_BEGIN
 {R_CCW_NEXT, R_START,     R_CCW_BEGIN, R_START},
 // R_CCW_FINAL
 {R_CCW_NEXT, R_CCW_FINAL, R_START,     R_START | DIR_CCW},
 // R_CCW_NEXT
 {R_CCW_NEXT, R_CCW_FINAL, R_CCW_BEGIN, R_START},
};
#endif

byte rowPins[NUMROWS] = {21,20,19,18,15};
byte colPins[NUMCOLS] = {14,16,10,9,8};

Keypad buttbx = Keypad( makeKeymap(buttons), rowPins, colPins, NUMROWS, NUMCOLS);

Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,
 JOYSTICK_TYPE_JOYSTICK, 32, 0,
 false, false, false, false, false, false,
 false, false, false, false, false);

void setup() {
 Joystick.begin();
 rotary_init();}

void loop() {

 CheckAllEncoders();

 CheckAllButtons();

}

void CheckAllButtons(void) {
     if (buttbx.getKeys())
   {
      for (int i=0; i<LIST_MAX; i++)  
       {
          if ( buttbx.key[i].stateChanged )  
           {
           switch (buttbx.key[i].kstate) {  
                   case PRESSED:
                   case HOLD:
                             Joystick.setButton(buttbx.key[i].kchar, 1);
                             break;
                   case RELEASED:
                   case IDLE:
                             Joystick.setButton(buttbx.key[i].kchar, 0);
                             break;
           }
          }  
        }
    }
}


void rotary_init() {
 for (int i=0;i<NUMROTARIES;i++) {
   pinMode(rotaries[i].pin1, INPUT);
   pinMode(rotaries[i].pin2, INPUT);
   #ifdef ENABLE_PULLUPS
     digitalWrite(rotaries[i].pin1, HIGH);
     digitalWrite(rotaries[i].pin2, HIGH);
   #endif
 }
}


unsigned char rotary_process(int _i) {
  unsigned char pinstate = (digitalRead(rotaries[_i].pin2) << 1) | digitalRead(rotaries[_i].pin1);
 rotaries[_i].state = ttable[rotaries[_i].state & 0xf][pinstate];
 return (rotaries[_i].state & 0x30);
}

void CheckAllEncoders(void) {
 for (int i=0;i<NUMROTARIES;i++) {
   unsigned char result = rotary_process(i);
   if (result == DIR_CCW) {
     Joystick.setButton(rotaries[i].ccwchar, 1); delay(50); Joystick.setButton(rotaries[i].ccwchar, 0);
   };
   if (result == DIR_CW) {
     Joystick.setButton(rotaries[i].cwchar, 1); delay(50); Joystick.setButton(rotaries[i].cwchar, 0);
   };
 }
}

Niestety masz zapewne złą wersję biblioteki keypad, szukaj innej, u mnie się skompilowało po dodaniu biblioteki Joystick.h.


Kod:
Sketch uses 9402 bytes (32%) of program storage space. Maximum is 28672 bytes.
Global variables use 487 bytes (19%) of dynamic memory, leaving 2073 bytes for local variables. Maximum is 2560 bytes.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości