低レベル勉強会がAVTOKYO 2019用に作ったバッジ。
ハードウェアの説明
「STM32 マイコンボードに 48 キーボードを実装」
https://qiita.com/nanbuwks/items/7c76bfd9360b68a3793c
AVTokyo2017 Badge との互換性
ハードウェアは互換性があり、同じように使うことができます。
しかしながらソフトウェア開発の環境が異なります。
頒布しているキットには、Bootloader をインストールしていません。プログラムは ST-Link で書き込むとして環境設定を行う必要があります。
最初の設定
- Arduino開発環境インストール
- STM32_Arduinoインストール
- ライブラリインストール
必要なライブラリは以下のみです。
- Adafruit GFX Library
以下を見てインストールしてください
「inside of AVTOKYO 10th HACK BADGE」
https://qiita.com/lowlevel/items/0fd3402e0dd4584de65f
Lチカ
以下、サンプルプログラムを使って動かしていきます。
まずはLEDを点滅するプログラムです。
void setup() {
pinMode(PC13,OUTPUT);
}
void loop() {
digitalWrite(PC13,HIGH);
delay(100);
digitalWrite(PC13,LOW);
delay(900);
}
OLED で画面表示
OLEDサンプルプログラムを呼び出す
「Generic STM32F103C series用のスケッチ例」から、ssd1306_128x64_spiを使ってみます。
# include <SPI.h>
# include <Wire.h>
# include <Adafruit_GFX.h>
# include <Adafruit_SSD1306.h>
// If using software SPI (the default case):
# define OLED_MOSI 9
# define OLED_CLK 10
# define OLED_DC 11
# define OLED_CS 12
# define OLED_RESET 13
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
を以下のように変える
# include <SPI.h>
# include <Wire.h>
# include <Adafruit_GFX.h>
# include <Adafruit_SSD1306_STM32.h>
// If using software SPI (the default case):
# define OLED_MOSI PA7
# define OLED_CLK PA5
# define OLED_DC PA6
# define OLED_CS PA4
# define OLED_RESET PA3
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
キーボードチェック
キーボード部分のスイッチが動作するかどうかのテストプログラムです。
# include <SPI.h>
# include <Wire.h>
# include <Adafruit_SSD1306_STM32.h>
# define OLED_MOSI PA7
# define OLED_CLK PA5
# define OLED_DC PA6
# define OLED_CS PA4
# define OLED_RESET PA3
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
# define BUTTONA PA0
# define BUTTONB PC14
# define BUTTONUP PB5
# define BUTTONDOWN PB6
# define KEYX0 PB1
# define KEYX1 PA2
# define KEYX2 PA1
# define KEYX3 PC15 // PC15 source is 0mA (Use Open Drain mode)
# define KEYX4 PB9
# define KEYX5 PB4
# define KEYY0 PB3
# define KEYY1 PA10
# define KEYY2 PA9
# define KEYY3 PA8
# define KEYY4 PB15
# define KEYY5 PB14
# define KEYY6 PB13
# define KEYY7 PB12
int i,counter=0;
int keyY[8]={KEYY0,KEYY1,KEYY2,KEYY3,KEYY4,KEYY5,KEYY6,KEYY7};
int keyX[6]={KEYX0,KEYX1,KEYX2,KEYX3,KEYX4,KEYX5};
# if (SSD1306_LCDHEIGHT != 64)
# error("Height incorrect, please fix Adafruit_SSD1306.h!");
# endif
void setup() {
display.begin(SSD1306_SWITCHCAPVCC);
display.display();
delay(1000);
disableDebugPorts(); // for use PA15/PB3/PB4
pinMode(BUTTONUP,INPUT_PULLDOWN);
pinMode(BUTTONDOWN,INPUT_PULLDOWN);
pinMode(BUTTONB,INPUT_PULLDOWN);
pinMode(BUTTONA,INPUT_PULLDOWN);
pinMode(KEYX0,OUTPUT_OPEN_DRAIN);
pinMode(KEYX1,OUTPUT_OPEN_DRAIN);
pinMode(KEYX2,OUTPUT_OPEN_DRAIN);
pinMode(KEYX3,OUTPUT_OPEN_DRAIN);
pinMode(KEYX4,OUTPUT_OPEN_DRAIN);
pinMode(KEYX5,OUTPUT_OPEN_DRAIN);
pinMode(KEYY0,INPUT_PULLUP);
pinMode(KEYY1,INPUT_PULLUP);
pinMode(KEYY2,INPUT_PULLUP);
pinMode(KEYY3,INPUT_PULLUP);
pinMode(KEYY4,INPUT_PULLUP);
pinMode(KEYY5,INPUT_PULLUP);
pinMode(KEYY6,INPUT_PULLUP);
pinMode(KEYY7,INPUT_PULLUP);
Serial.println("start ...");
delay(100);
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0,0);
display.setTextColor(WHITE,BLACK);
}
void loop() {
int keyx=0,keyy=0;
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println(" - keycheck -");
digitalWrite(KEYX0,1);
digitalWrite(KEYX1,1);
digitalWrite(KEYX2,1);
digitalWrite(KEYX3,1);
digitalWrite(KEYX4,1);
digitalWrite(KEYX5,1);
for ( int x=0; x<6;x++){
digitalWrite(keyX[x],0);
int key=0;
for ( int y=0; y<8;y++){
if ( 0==digitalRead(keyY[y])){ display.print(1);} else {display.print(0);}
display.print(" ");
}
display.println();
digitalWrite(keyX[x],1);
delay(10);
}
display.display();
delay(200);
}
文字を出す
先のプログラムのloop近辺を以下のように変更します。
char* keymap[6][8]= {
{"1","Symbol","TAB","Ctrl","Enter","ESC","BS","0"},
{"2","w","q","x","s","d","e","3"},
{"5","t","g","c","v","f","r","4"},
{"6","y","h","n","b","j","u","7"},
{"9","o","p","m","l","k","i","8"},
{"space","Caps","a","z","UP","DOWN","LEFT","RIGHT"}
};
void loop() {
int keyx=0,keyy=0;
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println(" - keycheck -");
digitalWrite(KEYX0,1);
digitalWrite(KEYX1,1);
digitalWrite(KEYX2,1);
digitalWrite(KEYX3,1);
digitalWrite(KEYX4,1);
digitalWrite(KEYX5,1);
for ( int x=0; x<6;x++){
digitalWrite(keyX[x],0);
int key=0;
for ( int y=0; y<8;y++){
if ( 0==digitalRead(keyY[y])){ display.print(keymap[x][y]);}
display.print(" ");
}
display.println();
digitalWrite(keyX[x],1);
delay(10);
}
display.display();
delay(200);
}
パソコンのキーボードにする
以下のプログラムを実行し、USBケーブルをPCに接続するとキーボードのように動かすことができます。
# include <USBComposite.h>
USBHID HID;
HIDKeyboard Keyboard(HID);
void setup() {
HID.begin(HID_KEYBOARD_MOUSE);
delay(2000);
}
void loop() {
Keyboard.println("Hello!");
delay(5000);
}
さらなるチャレンジ!
- キーボードで入力した文字をパソコンに送ってみよう
- Capsを押すと英語の大文字にするには?
- 文章を入力して画面に出すようにするには?
トラブルシューティング
以下のようになった場合
2019-11-24T08:44:22 INFO src/stlink-common.c: Loading device parameters....
2019-11-24T08:44:22 WARN src/stlink-common.c: unknown chip id! 0xe0042000
ジャンパーを切り替えます。