Step02 Buttonsのサンプルソース


#1

#include <Arduboy.h>

#define CHR_CX          6
#define CHR_CY          8

#define TEXT_CX         ((sizeof(t) - 1) * CHR_CX)
#define TEXT_CY         (CHR_CY)
#define TEXT_MAX_X      (WIDTH  - TEXT_CX)
#define TEXT_MAX_Y      (HEIGHT - TEXT_CY)


Arduboy ab;

char t[] = "Press Buttons!";
byte x;
byte y;


void setup()
{
    ab.begin();
    ab.setFrameRate(30);

    x = (WIDTH  / 2) - (TEXT_CX / 2);
    y = (HEIGHT / 2) - (TEXT_CY / 2);
}

void loop()
{
    if(!(ab.nextFrame()))
    {
        return;
    }


    if(ab.pressed(RIGHT_BUTTON) && (x < TEXT_MAX_X))
    {
        x++;
    }

    if(ab.pressed(LEFT_BUTTON) && (x > 0))
    {
        x--;
    }

    if((ab.pressed(DOWN_BUTTON) || ab.pressed(A_BUTTON)) && (y < TEXT_MAX_Y))
    {
        y++;
    }

    if((ab.pressed(UP_BUTTON) || ab.pressed(B_BUTTON)) && (y > 0))
    {
        y--;
    }

    ab.clear();
    ab.setCursor(x, y);
    ab.print(t);
    ab.display();
}

■ソースコードの場所

ファイル→スケッチの例→Arduboy→Buttons

■解説

今回はボタン操作が行えるようになっています。
ポイントは新しい関数pressedです。さっそく中身を追いかけてみましょう。

https://github.com/Arduboy/Arduboy/blob/stable/src/Arduboy.cpp#L742

boolean Arduboy::pressed(uint8_t buttons)
{
    return (buttonsState() & buttons) == buttons;    //  「== buttons;」いらなくない??
}

https://github.com/Arduboy/Arduboy/blob/stable/src/core/core.cpp#L311

// 見やすいように整形しました
uint8_t ArduboyCore::buttonsState()
{
    uint8_t buttons;

#ifdef AB_DEVKIT

    buttons = ((~PINB) & B01110000);                    // down, left, up
    buttons = buttons | (((~PINC) & B01000000) >> 4);   // right button
    buttons = buttons | (((~PINF) & B11000000) >> 6);   // A and B

#elif defined(ARDUBOY_10)

    buttons = ((~PINF) & B11110000);                    // down, up, left right
    buttons = buttons | (((~PINE) & B01000000) >> 3);   // A (left)
    buttons = buttons | (((~PINB) & B00010000) >> 2);   // B (right)

#endif

    return buttons;
}

ARDUBOY_10を使います。AB_DEVKITは無視してください。
PINの説明についてはArduinoリファレンスを参照願います。
ええ、丸投げです(汗。

それにしてもOSがないっていいですよね。ライブラリの下層は物理ピンです。
スイッチが押された/押されない(ビットあり/ビットなし)、というシンプルな構造になっています。

最後に一点だけ。

ab.setFrameRate(30);

の30を60に変えてテストしてみてください。1秒/60 ≒ 0.0167秒で動作します。