BLE 키보드 제작, 아이패드 제어

ESP32를 사용하여 BLE 키보드를 만들었습니다.
아이패드↓를 제어합니다.

관련 보도


블 마우스도 제작했습니다.
https://zenn.dev/kotaproj/articles/esp32_blemouse

😟딱한 사정


나는 아이패드로 전자책을 자주 보지만 가지고 있으면 매우 피곤하다.
또한 페이지를 넘기는 데는 교환 조작이 필요해서 매우 번거롭다.
나는 가벼운 자세로 페이지를 넘길 수 있을지 고민했다.

💡해본 일


  • 사용자 조작 조종대/스위치
  • 스위치가 여러 개
  • ※ 조종대/스위치의 개요는 뒤에 서술
  • 마이크로컴퓨터 보드(ESP 32) 감시 스위치 상태
  • 스위치 변경에 응답하여 BLE 키보드 명령 발송
  • iPad 키보드 명령 수락 및 제어
  • 이번에는 ESP 32로 제작되었습니다.

    규격 탐구


    주로 전자 서적의 페이지를 넘기기 때문에 페이지를 축소하기 위해서는 화살표가 필요하다.
    또한 Kindle을 시작할 수도 있습니다.
    아래와 같다.
    디바이스
    액션
    아이패드 측으로 보내기
    🕹X축
    ← 조작
    키보드 Arrow Left
    🕹X축
    - 작업
    키보드 Arrow Right
    🕹Y축
    ↑ 조작
    키보드 Arrow Up
    🕹Y축
    ↓ 작업
    키보드 Arrow Down
    🕹스위치 1
    누르다
    Kindle 응용 프로그램 시작
    스위치
    누르다
    메인 화면
    스위치
    누르다
    키보드 Arrow Left
    스위치
    누르다
    키보드 Arrow Right

    🔧부품 일람


    기자재 명칭
    시험을 준비하다
    ESP32 평가판
    ESP32-WROVER 개발판/ESP32-WROOM 개발판 모두 가능
    🕹바둑판
    조이스틱 및 스위치 세트 - 아마존에서 구입
    리듬 스위치
    3개 사용
    !
    보드에 구축할 수도 있습니다.
    이번에는 한 손으로 조작할 수 있도록 3D 프린터로 케이스를 만들었다.

    연결 다이어그램


    MPU 측면에서 잡아당기기 설정이 되어 있어 저항이 필요 없습니다.

    💻컨디션


    VScode-PlaatformIO를 사용합니다.
    PlaatformaIO의 환경 구축은 ↓에 요약되어 있다.
    https://zenn.dev/kotaproj/articles/esp32_vscode_pio

    라이브러리 - ESP32 BLE Keyboard


    다음 라이브러리를 사용하여 ESP32를 BLE 키보드로 설정합니다.
    https://github.com/T-vK/ESP32-BLE-Keyboard
    설치 단계는 다음과 같습니다.
  • PlaatformIO-Libraries 선택, ESP32-BLE-Keyboard 검색
  • ESP32-BLE-Keyboard 선택
  • Addto Project 선택
  • 지정 항목 - 이번 지정 "아이패드 BleKbd"항목
  • Add 선택

  • platformio.ini에 다음 내용 추가


  • lib_deps = t-vk/ESP32 BLE Keyboard@^0.3.2
    
    이렇게 하면 안에 포함할 수 있다.
    #include <BleKeyboard.h>
    

    📝절차.


    아래 내용을 기재하다.
  • 케이스 제작
  • 소프트웨어 설계/코드
  • 케이스 제작


    3D 프린터로 케이스를 제작했습니다.
    엄지손가락으로🕹제어할 수 있도록 위에 놓여 있습니다.
    스위치는 측면에 배치됩니다.

    !
    스위치의 3D 데이터 제작에는 Solidpythhon이 사용됩니다.
    ↓ 참조
    https://zenn.dev/kotaproj/articles/a70464d8cd3540

    소프트웨어 설계/코드


    처음에는 한 항목의 임무에 썼는데, 나중에는 계속 확장하고 싶어서 다중 임무로 다시 한 번 썼다.
    FreeRTOS를 사용하고 있습니다.

    임무 구성


    작업 이름
    과업
    스위치 모니터 타이머
    스위치 DOWN/UP의 변경 사항 모니터링
    조종봉 감시 타이머
    조종대의 변화를 감시하다
    메시지 관리 작업
    키보드 관리에 스위치/핸들 이벤트 알림
    키보드 관리 작업
    메시지 관리 이벤트를 보내는 Ble 키보드 제어

    코드 관련


    코드 자체가github에 업로드되었습니다.
    요점을 기재하다.

    ble 키보드 라이브러리


    초기화는 다음과 같습니다.
    #include <BleKeyboard.h>
    
    static BleKeyboard s_xBleKbd;
    
    s_xBleKbd.begin();
    
    begin 이후 짝을 지을 수 있는 상태가 됩니다.
    아이패드에서 쌍을 지정할 수 있습니다.
    연결 여부는 다음과 같이 판단할 수 있다.
    if (s_xBleKbd.isConnected())
    {
        // !!!接続中!!!
    }
    
    키보드를 보낼 때는 다음과 같습니다.
    // 矢印←を送信
    s_xBleKbd.write(KEY_LEFT_ARROW);
    
    // Commandキー(Windowsキー)を押しながら、"h"を送信
    s_xBleKbd.press(KEY_LEFT_GUI);
    delay(10);
    s_xBleKbd.print("h");
    delay(10);
    s_xBleKbd.release(KEY_LEFT_GUI);
    delay(50);
    
    Kindle의 시작은 다음과 같습니다.
    아이패드에 너무 빨리 보내면 무시됩니다.
    실기 동작을 보면서 delay 함수를 넣는다.
    KbdTask.cpp
    /**
     * @brief kindle appの起動
     */
    static void vProcSw_StartKindle(void)
    {
        // ->home (Cmd + h)
        s_xBleKbd.press(KEY_LEFT_GUI);
        delay(10);
        s_xBleKbd.print("h"); //文字を送信
        delay(10);
        s_xBleKbd.release(KEY_LEFT_GUI);
        delay(50);
    
        // ->command (Cmd + Space)
        s_xBleKbd.press(KEY_LEFT_GUI);
        delay(50);
        s_xBleKbd.print(" "); // space
        delay(50);
        s_xBleKbd.release(KEY_LEFT_GUI);
        delay(50);
    
        // Erase the string with backspace
        for (int i = 0; i < 10; i++)
        {
            s_xBleKbd.write(KEY_BACKSPACE);
            delay(50);
        }
    
        // input - "kindle"
        delay(500);
        s_xBleKbd.print("kindle");
        delay(50);
    
        // input - "enter"
        s_xBleKbd.write(KEY_RETURN);
        delay(50);
    
        return;
    }
    

    감시 조종봉(/감시 스위치)


    감시 조종대를 예로 들어 설명하다.
    25밀리초마다 호출된 타이머를 사용했다.
    xTimerCreate()/xTimerReset()은 FreeRTOS-AAPI입니다.
    ApiJs.cpp
    #define JS_CHECK_TIME (25) // JoyStickチェック間隔:25msec
    ...
    static TimerHandle_t s_xTimerJs = NULL;
    ...
    
    ErType_t xInitJs(void)
    {
        ...
        // text name, timer period, auto-reload, number of times, callback
        s_xTimerJs = xTimerCreate(cName, JS_CHECK_TIME, pdTRUE, (void *)0, vTimerCallbackJs);
        if (NULL == s_xTimerJs)
        {
            Serial.printf("%s : error - xTimerCreate\n", __func__);
            return ER_FAIL;
        }
    
        if (pdTRUE != xTimerReset(s_xTimerJs, JS_CHECK_TIME))
        {
            Serial.printf("%s : error - xTimerReset\n", __func__);
            return ER_FAIL;
        }
    
    다음 함수는 25밀리초마다 호출됩니다.
    ApiJs.cpp
    static void vTimerCallbackJs( TimerHandle_t xTimer)
    {
        int32_t x = analogRead(JS_ASGN_AXIS_X);
        int32_t y = analogRead(JS_ASGN_AXIS_Y);
        ...
    
    x, y는 0-4095의 값으로 얻는다.
    이번 연결에서 아래 수치를 얻을 수 있습니다.
    조종봉 상태
    x값
    y값
    Idle
    근처
    근처
    왼쪽 [←]
    근처
    근처
    오른쪽 [→]
    근처
    근처
    위 [↑]
    근처
    근처
    내리다
    근처
    근처
    !
    스위치 감시 타이머도 똑같이 만들어서 안 좋아해요.
    오래된 기사지만 ↓에는 자세한 내용이 기재돼 있다.
    https://qiita.com/kotaproj/items/c191883a15cfc5ec27c0
    https://qiita.com/kotaproj/items/e9b2f56a89ff0a6a3d3a

    전체 코드


    https://github.com/kotaproj/esp32_kbd

    최후


    오랜만에 생활모를 만들 수 있어서 너무 좋아요.
    데이터 백업 없이 RTOS 디버깅은 상당히 힘들었습니다.
    같은 방법으로 블레 마우스를 제작했기 때문에 추후 소개해 주시기 바랍니다.

    참조 링크


    https://www.freertos.org/
    https://github.com/T-vK/ESP32-BLE-Keyboard

    좋은 웹페이지 즐겨찾기