AtsEXを使用してスイッチで扉の開閉を行おう の続きとしてCH552でドア開閉を行ってみましょう。
CH552とは
CH552 は約1ドル程度で購入可能な格安マイコンボードになります。
CH552 は Arduino での開発も可能です。
ただし、書込み回数に制限があり 100回程度 で書込みできなくなるので注意してください。
また、ピン数についても、前回使用した Raspberry Pi Pico に比べると少ないです。
今回は、このCH552ボードを使って、ATSexのスイッチを作ってみましょう。
CH55x系ボード WeActStudio CH552CoreBoardをArduinoで使う
HID キーボードを作る
最初にHIDキーボードを試しましょう。
ファイル⇒スケッチ例⇒Generic_Example⇒05USB⇒HidKeyboard
をコンパイルしましょう。
設定
ツール⇒USB Settingsを変更します。
USBコードのサイズを 0B以上 を選択します。
これは、文字列を入力するプログラムのためです。
今回は USB CODE w/256B USB ram を選択しました。
プログラム
上記プログラムをもとにほかのポートを追加しました。
今回は、 Keyboard_press,Keyboard_release で構成されています。
前回のように、 write,press,release ではないので、わかりやすいプログラムになっていると思います。
/*
HID Keyboard example
created 2020
by Deqing Sun for use with CH55xduino
This example code is in the public domain.
cli board options: usb_settings=user148
*/
//For windows user, if you ever played with other HID device with the same PID C55D
//You may need to uninstall the previous driver completely
#ifndef USER_USB_RAM
#error "This example needs to be compiled with a USER USB setting"
#endif
#include "src/userUsbHidKeyboard/USBHIDKeyboard.h"
#define BUTTON0_PIN 10
#define BUTTON1_PIN 11
#define BUTTON4_PIN 14
#define BUTTON5_PIN 15
#define BUTTON6_PIN 16
#define BUTTON7_PIN 17
#define LED_BUILTIN 30
#define BUTTON31_PIN 31
#define BUTTON32_PIN 32
#define BUTTON33_PIN 33
#define BUTTON34_PIN 34
#define BUTTON35_PIN 35
bool button0PressPrev = false;
bool button1PressPrev = false;
bool button4PressPrev = false;
bool button5PressPrev = false;
bool button6PressPrev = false;
bool button7PressPrev = false;
bool button31PressPrev = false;
bool button32PressPrev = false;
bool button33PressPrev = false;
bool button34PressPrev = false;
bool button35PressPrev = false;
void setup() {
USBInit();
pinMode(BUTTON0_PIN, INPUT_PULLUP);
pinMode(BUTTON1_PIN, INPUT_PULLUP);
pinMode(BUTTON4_PIN, INPUT_PULLUP);
pinMode(BUTTON5_PIN, INPUT_PULLUP);
pinMode(BUTTON6_PIN, INPUT_PULLUP);
pinMode(BUTTON7_PIN, INPUT_PULLUP);
pinMode(LED_BUILTIN, OUTPUT);
pinMode(BUTTON31_PIN, INPUT_PULLUP);
pinMode(BUTTON32_PIN, INPUT_PULLUP);
pinMode(BUTTON33_PIN, INPUT_PULLUP);
pinMode(BUTTON34_PIN, INPUT_PULLUP);
pinMode(BUTTON35_PIN, INPUT_PULLUP);
}
void loop() {
//button 0 is mapped to letter 'w'
bool button0Press = !digitalRead(BUTTON0_PIN);
if (button0PressPrev != button0Press) {
button0PressPrev = button0Press;
if (button0Press) {
Keyboard_press('e');
} else {
Keyboard_release('e');
}
}
//button 1 is mapped to letter 'e'
bool button1Press = !digitalRead(BUTTON1_PIN);
if (button1PressPrev != button1Press) {
button1PressPrev = button1Press;
if (button1Press) {
Keyboard_press('r');
} else {
Keyboard_release('r');
}
}
//button 4 is mapped to letter 'r'
bool button4Press = !digitalRead(BUTTON4_PIN);
if (button4PressPrev != button4Press) {
button4PressPrev = button4Press;
if (button4Press) {
Keyboard_press('t');
} else {
Keyboard_release('t');
}
}
//button 5 is mapped to Capslock
bool button5Press = !digitalRead(BUTTON5_PIN);
if (button5PressPrev != button5Press) {
button5PressPrev = button5Press;
if (button5Press) {
Keyboard_press(KEY_RETURN);
} else {
Keyboard_release(KEY_RETURN);
}
}
//button 6 is mapped to Capslock
bool button6Press = !digitalRead(BUTTON6_PIN);
if (button6PressPrev != button6Press) {
button6PressPrev = button6Press;
if (button6Press) {
Keyboard_press(0xDE);
} else {
Keyboard_release(0xDE);
}
}
//button 7 is mapped to Capslock
bool button7Press = !digitalRead(BUTTON7_PIN);
if (button7PressPrev != button7Press) {
button7PressPrev = button7Press;
if (button7Press) {
Keyboard_press(0xDF);
} else {
Keyboard_release(0xDF);
}
}
//button 31 is mapped to letter 's'
bool button31Press = !digitalRead(BUTTON31_PIN);
if (button31PressPrev != button31Press) {
button31PressPrev = button31Press;
if (button31Press) {
Keyboard_press('o');
} else {
Keyboard_release('o');
}
}
//button 32 is mapped to letter 'd'
bool button32Press = !digitalRead(BUTTON32_PIN);
if (button32PressPrev != button32Press) {
button32PressPrev = button32Press;
if (button32Press) {
Keyboard_press('i');
} else {
Keyboard_release('i');
}
}
//button 33 is mapped to letter 'd'
bool button33Press = !digitalRead(BUTTON33_PIN);
if (button33PressPrev != button33Press) {
button33PressPrev = button33Press;
if (button33Press) {
Keyboard_press('u');
} else {
Keyboard_release('u');
}
}
//button 34 is mapped to letter 'd'
bool button34Press = !digitalRead(BUTTON34_PIN);
if (button34PressPrev != button34Press) {
button34PressPrev = button34Press;
if (button34Press) {
Keyboard_press('g');
} else {
Keyboard_release('g');
}
}
//button 35 is mapped to letter 'd'
bool button35Press = !digitalRead(BUTTON35_PIN);
if (button35PressPrev != button35Press) {
button35PressPrev = button35Press;
if (button35Press) {
Keyboard_press('h');
} else {
Keyboard_release('h');
}
}
//map capsLock to LED
//Bit 0: NUM lock, Bit 1: CAPS lock, Bit 2: SCROLL lock, Bit 3: Compose, Bit 4: Kana,
if (Keyboard_getLEDStatus() & 2) {
digitalWrite(LED_BUILTIN, HIGH);
} else {
digitalWrite(LED_BUILTIN, LOW);
}
delay(50); //naive debouncing
}
動作の様子
BVE CH552でドア開閉をする
— usashirou (@usashirou1) January 7, 2024
AtsEX pic.twitter.com/lvc8Gqjs2R