SNSへはこちら

STM32でUSBをベアメタル(9) - HIDマウスの完成!

タイトルにもある通り、マウスとして動きました!やった〜〜〜〜〜〜〜〜〜〜〜〜

今回は、前回の実装の元で、main 関数をいじることだけをやっていきます。

マウスのレポート形式

「レポート」という呼び方が正しいのかわかりませんが、ひとまずこの記事ではそう読んでいきます。

まずはレポートの形式です。前回から無限にお世話になっているこちらのサイトから図は拝借しています。

先頭から1バイトずつの情報です。よって、レポート全体でサイズは 3bytes になります。

例えば、{0x01, 127, -127} とすると、マウスのボタン1 を押しながら、X 方向に最速で、-Y 方向に最速でドラッグしている感じになります。

星を描こう。星を

せっかくの自作ポインティングデバイスなので、なにか図形を書かせましょう。そうですね、、、星を描かせるのはどうでしょうか(名案)。流石にマウスボタン押下まで任せるのは危険な気がするので、あくまでもマウスポインタを動かすだけという挙動にします。

コード

いきなりコードです。星を書くための計算はすぐできると思います。三角関数使えばイチコロですよ。

#include "stm32f0xx.h"
#include "sysclk_systick.h"
#include "usb.h"
#include <stdio.h>

extern volatile int8_t __attribute__((aligned(2))) report[4];

int main(void) {
    sysclk_HSI48_init();
    usb_init();

    ms_wait(3000);

    const int r = 20;
    const int sin_18_by_10000 = 3090;
    const int cos_18_by_10000 = 9511;
    const int sin_36_by_10000 = 5878;
    const int cos_36_by_10000 = 8090;
    const int sin_72_by_10000 = 9511;
    const int cos_72_by_10000 = 3090;

    const int8_t dr[][2] = { // (y, x)
            {r  * cos_18_by_10000 / 10000, -r * sin_18_by_10000 / 10000},
            {-r * sin_36_by_10000 / 10000, r  * cos_36_by_10000 / 10000},
            {0, -r},
            {r  * sin_36_by_10000 / 10000, r  * cos_36_by_10000 / 10000},
            {-r * sin_72_by_10000 / 10000, -r * cos_72_by_10000 / 10000}
    };
    while(1) {
        for(int i = 0; i < 5; i++ ) {
            report[2] = dr[i][0];
            report[1] = dr[i][1];
            ms_wait(200);
            report[1] = report[2] = 0;
            ms_wait(10);
        }
    }
}

あとはこれを書き込んでブートさせるだけです。
ペイントソフトのキャンバス上で、マウスボタンを押しながらどうさせたのがこちらです。おお〜〜、動いてますね〜〜
若干エッジがズレているのは許してください。

ということで、「HAL 等に頼らずマイコンで USB デバイスを作る」という悲願の目標達成です!これまで何回も挫折してきましたが、春休みという時間を有効に利用してここまで完成させることが出来ました!とても嬉しいですし、達成感が半端ではありません。
ただ、今回の実装は「USB HID で要求されたコマンドのみを実装している」ということに注意せねばなりません。つまり、今回実装していない標準リクエストや、HID リクエストはちゃんと実装しないと正式には USB に準拠しているとは言えません。今回は「取りあえず動くものを作る」という、ある意味大雑把な目標だからこと「まあいいっか」とスルーしているのですが、これは良くないことであるということはご理解ください。
まあぶっちゃけ、趣味なんだからこれで全然いいじゃんね

今後はやはり HID についてもう少し調べてみたり、同じ HID デバイスであるキーボードを作ってみたりしたいなあと思います。このへんは改めて記事にするまでもないでしょう。どうせ僕自信もまた他の人のコードを見ながら書いたり、ちょろっと調べるだけでしょうから。どっちかというと、マウスよりキーボードの方が可能性に満ちています。本当の意味での自作キーボードを作れますしね。フットスイッチなんかにも応用できそうです。
一方で、「闇が深そう」といって断念した USB CDC は今後の課題です。USB マイコンを CDC として使えるようになると、今後色々捗りそうな予感がするので、今後も検討を続けていきます。

それでは、本シリーズは一旦ここで締めたいと思います。本シリーズでは試行錯誤をそのままに日記形式で綴ったため、長文・乱文が非常に多かったと思います。不十分な記述も多かったかと思いますが、ぜひ「STM32 HAL 等のライブラリに頼りたくない!」という方は参考にしてみてください。ご覧頂きまして、誠にありがとうございました。