WiFiBoy32 と呼ばれる、 ESP-WROOM-32 (ESP32) 搭載の Arduino 互換チップボード上での ESP-IDF の話です。
GPIO にて、プッシュボタン押下(IO)を検知し、Blutooth 経由で HID によるキーボード操作を考えています。
実現したい挙動は以下のとおりです。
①プッシュボタンを1度押下
②プッシュボタンに対応したキーボードキーを1度送信
サンプルを参考にコードを作成しましたが上手くいきません。
実際の挙動は
①プッシュボタンを1度押下(直後に指を離して押下前の状態に戻す)
②プッシュボタンに対応したキーボードキーが連続して送信(別のキーの送信に至るまで止まらない)
となります。また、キー定義は
C
1#define GPIO_INPUT_IO_UP 33 2#define GPIO_INPUT_IO_DOWN 27 3#define GPIO_INPUT_IO_LEFT 17 4#define GPIO_INPUT_IO_RIGHT 32 5#define GPIO_INPUT_IO_B 34 6#define GPIO_INPUT_IO_A 35 7#define GPIO_INPUT_IO_START 39 8#define GPIO_INPUT_IO_SELECT 23
としていますが、そのうち LEFT, DOWN, START のみ反応しており、他のキーは反応しません。
実際のコードは以下のとおりです。(文字数制限のため、関係ないと思われる箇所は変数や関数含め割愛しております。)
実現したい挙動に近づけるべくアドバイスいただけると助かります。
esp/ble_hid_device_demo/main/ble_hidd_demo_main.c
C
1#define GPIO_OUTPUT_IO_0 18 2#define GPIO_OUTPUT_IO_1 19 3#define GPIO_OUTPUT_PIN_SEL ((1<<GPIO_OUTPUT_IO_0) | (1<<GPIO_OUTPUT_IO_1)) 4#define GPIO_INPUT_IO_UP 33 5#define GPIO_INPUT_IO_DOWN 27 6#define GPIO_INPUT_IO_LEFT 17 7#define GPIO_INPUT_IO_RIGHT 32 8#define GPIO_INPUT_IO_B 34 9#define GPIO_INPUT_IO_A 35 10#define GPIO_INPUT_IO_START 39 11#define GPIO_INPUT_IO_SELECT 23 12#define GPIO_INPUT_PIN_SEL ((1<<GPIO_INPUT_IO_UP) | (1<<GPIO_INPUT_IO_DOWN) | (1<<GPIO_INPUT_IO_LEFT) | (1<<GPIO_INPUT_IO_RIGHT) | (1<<GPIO_INPUT_IO_B) | (1<<GPIO_INPUT_IO_A) | (1<<GPIO_INPUT_IO_START) | (1<<GPIO_INPUT_IO_SELECT)) 13#define ESP_INTR_FLAG_DEFAULT 0 14 15static xQueueHandle gpio_evt_queue = NULL; 16static uint16_t hid_conn_id = 0; 17 18void IRAM_ATTR gpio_isr_handler(void* arg) 19{ 20 uint32_t gpio_num = (uint32_t) arg; 21 xQueueSendFromISR(gpio_evt_queue, &gpio_num, NULL); 22} 23 24void gpio_task_example(void* arg) 25{ 26 static uint8_t i = 0; 27 uint32_t io_num; 28 for(;;) { 29 if(xQueueReceive(gpio_evt_queue, &io_num, portMAX_DELAY)) { 30 uint32_t value = gpio_get_level(io_num); 31 ESP_LOGI(HID_DEMO_TAG, "GPIO[%d] intr, val: %d\n", io_num, value); 32 if(io_num == GPIO_INPUT_IO_LEFT){ 33 uint8_t key_vaule_a = {HID_KEY_A}; 34 esp_hidd_send_keyboard_value(hid_conn_id, 0, &key_vaule_a, 1); 35 } 36 if(io_num == GPIO_INPUT_IO_UP){ 37 uint8_t key_vaule_w = {HID_KEY_W}; 38 esp_hidd_send_keyboard_value(hid_conn_id, 0, &key_vaule_w, 1); 39 } 40 if(io_num == GPIO_INPUT_IO_RIGHT){ 41 uint8_t key_vaule_d = {HID_KEY_D}; 42 esp_hidd_send_keyboard_value(hid_conn_id, 0, &key_vaule_d, 1); 43 } 44 if(io_num == GPIO_INPUT_IO_DOWN){ 45 uint8_t key_vaule_s = {HID_KEY_S}; 46 esp_hidd_send_keyboard_value(hid_conn_id, 0, &key_vaule_s, 1); 47 } 48 if(io_num == GPIO_INPUT_IO_B){ 49 uint8_t key_vaule_k = {HID_KEY_K}; 50 esp_hidd_send_keyboard_value(hid_conn_id, 0, &key_vaule_k, 1); 51 } 52 if(io_num == GPIO_INPUT_IO_A){ 53 uint8_t key_vaule_l = {HID_KEY_L}; 54 esp_hidd_send_keyboard_value(hid_conn_id, 0, &key_vaule_l, 1); 55 } 56 if(io_num == GPIO_INPUT_IO_SELECT){ 57 uint8_t key_vaule_h = {HID_KEY_H}; 58 esp_hidd_send_keyboard_value(hid_conn_id, 0, &key_vaule_h, 1); 59 } 60 if(io_num == GPIO_INPUT_IO_START){ 61 uint8_t key_vaule_j = {HID_KEY_J}; 62 esp_hidd_send_keyboard_value(hid_conn_id, 0, &key_vaule_j, 1); 63 } 64 } 65 } 66} 67 68static void gpio_demo_init(void) 69{ 70 gpio_config_t io_conf; 71 //disable interrupt 72 io_conf.intr_type = GPIO_PIN_INTR_DISABLE; 73 //set as output mode 74 io_conf.mode = GPIO_MODE_OUTPUT; 75 //bit mask of the pins that you want to set,e.g.GPIO18/19 76 io_conf.pin_bit_mask = GPIO_OUTPUT_PIN_SEL; 77 //disable pull-down mode 78 io_conf.pull_down_en = 0; 79 //disable pull-up mode 80 io_conf.pull_up_en = 0; 81 //configure GPIO with the given settings 82 gpio_config(&io_conf); 83 84 //interrupt of rising edge 85 io_conf.intr_type = GPIO_PIN_INTR_POSEDGE; 86 //bit mask of the pins, use GPIO4/5 here 87 io_conf.pin_bit_mask = GPIO_INPUT_PIN_SEL; 88 //set as input mode 89 io_conf.mode = GPIO_MODE_INPUT; 90 //enable pull-up mode 91 io_conf.pull_up_en = 0; 92 gpio_config(&io_conf); 93 94 gpio_set_intr_type(GPIO_INPUT_IO_UP, GPIO_INTR_ANYEDGE); 95 gpio_set_intr_type(GPIO_INPUT_IO_DOWN, GPIO_INTR_ANYEDGE); 96 gpio_set_intr_type(GPIO_INPUT_IO_LEFT, GPIO_INTR_ANYEDGE); 97 gpio_set_intr_type(GPIO_INPUT_IO_RIGHT, GPIO_INTR_ANYEDGE); 98 gpio_set_intr_type(GPIO_INPUT_IO_START, GPIO_INTR_ANYEDGE); 99 gpio_set_intr_type(GPIO_INPUT_IO_SELECT, GPIO_INTR_ANYEDGE); 100 gpio_set_intr_type(GPIO_INPUT_IO_A, GPIO_INTR_ANYEDGE); 101 gpio_set_intr_type(GPIO_INPUT_IO_B, GPIO_INTR_ANYEDGE); 102 103 gpio_evt_queue = xQueueCreate(10, sizeof(uint32_t)); 104 xTaskCreate(gpio_task_example, "gpio_task_example", 2048, NULL, 10, NULL); 105 106 gpio_install_isr_service(ESP_INTR_FLAG_DEFAULT); 107 108 gpio_isr_handler_add(GPIO_INPUT_IO_UP, gpio_isr_handler, (void*) GPIO_INPUT_IO_UP); 109 gpio_isr_handler_add(GPIO_INPUT_IO_DOWN, gpio_isr_handler, (void*) GPIO_INPUT_IO_DOWN); 110 gpio_isr_handler_add(GPIO_INPUT_IO_LEFT, gpio_isr_handler, (void*) GPIO_INPUT_IO_LEFT); 111 gpio_isr_handler_add(GPIO_INPUT_IO_RIGHT, gpio_isr_handler, (void*) GPIO_INPUT_IO_RIGHT); 112 gpio_isr_handler_add(GPIO_INPUT_IO_START, gpio_isr_handler, (void*) GPIO_INPUT_IO_START); 113 gpio_isr_handler_add(GPIO_INPUT_IO_SELECT, gpio_isr_handler, (void*) GPIO_INPUT_IO_SELECT); 114 gpio_isr_handler_add(GPIO_INPUT_IO_B, gpio_isr_handler, (void*) GPIO_INPUT_IO_B); 115 gpio_isr_handler_add(GPIO_INPUT_IO_A, gpio_isr_handler, (void*) GPIO_INPUT_IO_A); 116 117} 118 119 120void app_main() 121{ 122 /* コード中略 */ 123 gpio_demo_init(); 124 xTaskCreate(&hid_demo_task, "hid_task", 2048, NULL, 5, NULL); 125 126}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/02 10:16
2018/09/02 13:43 編集
2018/09/04 18:32
2018/09/04 23:19
2018/09/04 23:22