質問編集履歴

2

追記

2019/12/19 15:48

投稿

nakapy0918
nakapy0918

スコア18

test CHANGED
File without changes
test CHANGED
@@ -361,3 +361,29 @@
361
361
 
362
362
 
363
363
  ```
364
+
365
+
366
+
367
+ ###追記
368
+
369
+ ・12/20 一度変数に格納することでコンパイル成功、どのキーを押しても169と表示されるので、1byte×8個の表記にするにはどうすればいいか、どこに問題があるのか模索中。
370
+
371
+ ```Arduino
372
+
373
+ Serial.println(&keyReport);//コンパイル時にエラー
374
+
375
+
376
+
377
+ //↓一度変数に格納するとコンパイル成功
378
+
379
+
380
+
381
+ uint8_t a =&keyReport;
382
+
383
+ Serial.println(&keyReport);//169 の数値が固定でログに表示される。
384
+
385
+
386
+
387
+
388
+
389
+ ```

1

参考とさせて頂いてるコードを追記。

2019/12/19 15:48

投稿

nakapy0918
nakapy0918

スコア18

test CHANGED
File without changes
test CHANGED
@@ -69,3 +69,295 @@
69
69
  VBA,GAS,UWSCと操作の自動化でしか取り扱いの経験がなく、
70
70
 
71
71
  Arduino(C/C++)言語は初めてまだ日が浅いため、修練中の身です。
72
+
73
+ ###参考とさせて頂いてるコード
74
+
75
+ ```Arduino
76
+
77
+ #include "HID.h"
78
+
79
+
80
+
81
+ #include <hidboot.h>
82
+
83
+ #include <usbhub.h>
84
+
85
+ #include <SPI.h>
86
+
87
+
88
+
89
+ static const uint8_t _hidReportDescriptor[] PROGMEM = {
90
+
91
+ 0x05, 0x01, // USAGE_PAGE (Generic Desktop)
92
+
93
+ 0x09, 0x06, // USAGE (Keyboard)
94
+
95
+ 0xa1, 0x01, // COLLECTION (Application)
96
+
97
+ 0x85, 0x02, // REPORT_ID (2) --- Mouse.cppがID==1。
98
+
99
+
100
+
101
+ 0x05, 0x07, // USAGE_PAGE (usage = keyboard page)
102
+
103
+ // モデファイヤキー(修飾キー)
104
+
105
+ 0x19, 0xe0, // USAGE_MINIMUM (左CTRLが0xe0)
106
+
107
+ 0x29, 0xe7, // USAGE_MAXIMUM (右GUIが0xe7)
108
+
109
+ 0x15, 0x00, // LOGICAL_MINIMUM (0)
110
+
111
+ 0x25, 0x01, // LOGICAL_MAXIMUM (1)
112
+
113
+ 0x95, 0x08, // REPORT_COUNT (8) 全部で8つ(左右4つずつ)。
114
+
115
+ 0x75, 0x01, // REPORT_SIZE (1) 各修飾キーにつき1ビット
116
+
117
+ 0x81, 0x02, // INPUT (Data,Var,Abs) 8ビット長のInputフィールド(変数)が1つ。
118
+
119
+ // 予約フィールド
120
+
121
+ 0x95, 0x01, // REPORT_COUNT (1)
122
+
123
+ 0x75, 0x08, // REPORT_SIZE (8) 1ビットが8つ。
124
+
125
+ 0x81, 0x01, // INPUT (Cnst,Var,Abs)
126
+
127
+ // LED状態のアウトプット
128
+
129
+ 0x95, 0x05, // REPORT_COUNT (5) 全部で5つ。
130
+
131
+ 0x75, 0x01, // REPORT_SIZE (1) 各LEDにつき1ビット
132
+
133
+ 0x05, 0x08, // USAGE_PAGE (LEDs)
134
+
135
+ 0x19, 0x01, // USAGE_MINIMUM (1) (NumLock LEDが1)
136
+
137
+ 0x29, 0x05, // USAGE_MAXIMUM (5) (KANA LEDが5)
138
+
139
+ 0x91, 0x02, // OUTPUT (Data,Var,Abs) // LED report
140
+
141
+ // LEDレポートのパディング
142
+
143
+ 0x95, 0x01, // REPORT_COUNT (1)
144
+
145
+ 0x75, 0x03, // REPORT_SIZE (3)  残りの3ビットを埋める。
146
+
147
+ 0x91, 0x01, // OUTPUT (Cnst,Var,Abs) // padding
148
+
149
+ // 押下情報のインプット
150
+
151
+ 0x95, 0x06, // REPORT_COUNT (6) 全部で6つ。
152
+
153
+ 0x75, 0x08, // REPORT_SIZE (8) おのおの8ビットで表現
154
+
155
+ 0x15, 0x00, // LOGICAL_MINIMUM (0) キーコードの範囲は、
156
+
157
+ 0x25, 0xdd, // LOGICAL_MAXIMUM (221) 0~221(0xdd)まで
158
+
159
+
160
+
161
+ 0x05, 0x07, // USAGE_PAGE (Keyboard)
162
+
163
+ 0x19, 0x00, // USAGE_MINIMUM (0はキーコードではない)
164
+
165
+ 0x29, 0xdd, // USAGE_MAXIMUM (Keypad Hexadecimalまで)
166
+
167
+ 0x81, 0x00, // INPUT (Data,Ary,Abs)
168
+
169
+ 0xc0 // END_COLLECTION
170
+
171
+ };
172
+
173
+
174
+
175
+ #define REPORT_KEYS 6
176
+
177
+ typedef struct {
178
+
179
+ uint8_t modifiers;
180
+
181
+ uint8_t reserved;
182
+
183
+ uint8_t keys[REPORT_KEYS];
184
+
185
+ } KeyReport;
186
+
187
+
188
+
189
+ KeyReport keyReport;
190
+
191
+
192
+
193
+ void sendReport() {
194
+
195
+ HID().SendReport(2, &keyReport ,sizeof(KeyReport));
196
+
197
+ }
198
+
199
+
200
+
201
+ void releaseAll() {
202
+
203
+ memset(&keyReport, 0, sizeof(KeyReport));
204
+
205
+ sendReport();
206
+
207
+ }
208
+
209
+
210
+
211
+ void report_press(uint8_t key, uint8_t mod) {
212
+
213
+ if (key != 0) {
214
+
215
+ bool already = false;
216
+
217
+ int empty_slot = -1;
218
+
219
+ for(int i = 0; i < REPORT_KEYS; i++) {
220
+
221
+ if (keyReport.keys[i] == key)
222
+
223
+ already = true;
224
+
225
+ if (keyReport.keys[i] == 0 && empty_slot < 0)
226
+
227
+ empty_slot = i;
228
+
229
+ }
230
+
231
+ if (empty_slot < 0) // error condition.
232
+
233
+ return;
234
+
235
+ if (!already)
236
+
237
+ keyReport.keys[empty_slot] = key;
238
+
239
+ }
240
+
241
+ keyReport.modifiers = mod;
242
+
243
+ sendReport();
244
+
245
+ }
246
+
247
+
248
+
249
+ void report_release(uint8_t key, uint8_t mod) {
250
+
251
+ if (key != 0) {
252
+
253
+ for(int i = 0; i < REPORT_KEYS; i++) {
254
+
255
+ if (keyReport.keys[i] == key) {
256
+
257
+ keyReport.keys[i] = 0;
258
+
259
+ break;
260
+
261
+ }
262
+
263
+ }
264
+
265
+ }
266
+
267
+ keyReport.modifiers = mod;
268
+
269
+ sendReport();
270
+
271
+ }
272
+
273
+
274
+
275
+ class KeyboardEvent : public KeyboardReportParser {
276
+
277
+ protected:
278
+
279
+ void OnControlKeysChanged(uint8_t before, uint8_t after);
280
+
281
+ void OnKeyPressed(uint8_t key) {};
282
+
283
+ void OnKeyDown (uint8_t mod, uint8_t key) { report_press(key, mod); };
284
+
285
+ void OnKeyUp (uint8_t mod, uint8_t key) { report_release(key, mod); };
286
+
287
+ };
288
+
289
+
290
+
291
+ void KeyboardEvent::OnControlKeysChanged(uint8_t before, uint8_t after) {
292
+
293
+ uint8_t change = before ^ after;
294
+
295
+ if (change != 0) {
296
+
297
+ if (change & after)
298
+
299
+ report_press(0, after);
300
+
301
+ else
302
+
303
+ report_release(0, after);
304
+
305
+ }
306
+
307
+ }
308
+
309
+
310
+
311
+ USB Usb;
312
+
313
+ HIDBoot<USB_HID_PROTOCOL_KEYBOARD> HidKeyboard(&Usb);
314
+
315
+ KeyboardEvent kbd;
316
+
317
+
318
+
319
+ void error_blink(int period) {
320
+
321
+ for(;;) {
322
+
323
+ TXLED1; delay(period); TXLED0; delay(period);
324
+
325
+ RXLED1; delay(period); RXLED0; delay(period);
326
+
327
+ }
328
+
329
+ }
330
+
331
+
332
+
333
+ void setup() {
334
+
335
+ static HIDSubDescriptor node(_hidReportDescriptor, sizeof(_hidReportDescriptor));
336
+
337
+ HID().AppendDescriptor(&node);
338
+
339
+ delay(200);
340
+
341
+ releaseAll();
342
+
343
+ if (Usb.Init() == -1)
344
+
345
+ error_blink(400);
346
+
347
+ delay( 200 );
348
+
349
+ HidKeyboard.SetReportParser(0, &kbd);
350
+
351
+ }
352
+
353
+
354
+
355
+ void loop() {
356
+
357
+ Usb.Task();
358
+
359
+ }
360
+
361
+
362
+
363
+ ```