Arduino STM32 用の VT100 エミュレータです。
以下のハードウェアが必要です。
- Blue Pill (STM32F103 minimum development board)
- ILI9341 TFT LCD Display (SPI)
- PS/2 Keyboard Connector
- Passive Buzzer (Option)
- LED (Option)
See also:
接続は以下のようになります。
SPI 接続です。
TFT LCD | Blue Pill (STM32) |
---|---|
1 VCC | 3.3V |
2 GND | GND |
3 CS | PA4 |
4 RESET | PA3 |
5 DC | PA2 |
6 MOSI | PA7 |
7 SCK | PA5 |
8 LED | 3.3V |
9 MISO | PA6 |
ピンを移動させる場合には 5V トレラントのピンを選んでください。CLK と DAT ピンは 10kΩ でプルアップする必要があります。
PS/2 | Blue Pill (STM32) |
---|---|
1 CLK | PB6 |
2 DAT | PB7 |
3 VCC | 5V |
4 GND | GND |
PA8 に接続します。
PB15 ~ PB12 に接続します、電流制限抵抗をお忘れなく。
コンパイルするには以下のソフトウェアが必要です。
- Arduino IDE (arduino.cc)
- Arduino STM32 (rogerclarkmelbourne@GitHub)
- Arduino_PS2Keyboard (Tamakichi@GitHub)
- [Option] TTVoutfonts (Tamakichi@GitHub) - 視認性のいい 6x8 フォントです。
転送はブートローダーでもシリアルでも ST-Link でも構いません。
See also:
Arduino STM32 のデフォルトである 64 だと 9600bps で描画が追い付かない事があるためシリアルバッファを増やします (usart.h)。
/*
* Devices
*/
#ifndef USART_RX_BUF_SIZE
#define USART_RX_BUF_SIZE 512
#endif
#ifndef USART_TX_BUF_SIZE
#define USART_TX_BUF_SIZE 128
#endif
Ctrl キーに対応させるため、Arduino_PS2Keyboard の PS2Keyboard.cpp を編集します。
#define BREAK 0x01
#define MODIFIER 0x02
#define SHIFT_L 0x04
#define SHIFT_R 0x08
#define ALTGR 0x10
/* 追加 BEGIN */
#define ALT 0x20
#define CTRL 0x40
/* 追加 END */
static char get_iso8859_code(void)
{
static uint8_t state = 0;
static uint8_t sState = 0; // 追加
uint8_t s;
char c;
while (1) {
s = get_scan_code();
if (!s) return 0;
if (s == 0xF0) {
state |= BREAK;
} else if (s == 0xE0) {
state |= MODIFIER;
} else {
if (state & BREAK) {
if (s == 0x12) {
state &= ~SHIFT_L;
} else if (s == 0x59) {
state &= ~SHIFT_R;
} else if (s == 0x11 && (state & MODIFIER)) {
state &= ~ALTGR;
}
// CTRL, ALT & WIN keys could be added
// but is that really worth the overhead?
state &= ~(BREAK | MODIFIER);
continue;
}
if (s == 0x12) {
state |= SHIFT_L;
sState |= SHIFT_L; // 追加
continue;
/* 追加 BEGIN */
} else if (s == 0x11) {
sState |= ALT;
continue;
} else if (s == 0x14) {
sState |= CTRL;
continue;
/* 追加 END */
} else if (s == 0x59) {
state |= SHIFT_R;
sState |= SHIFT_R; // 追加
continue;
} else if (s == 0x11 && (state & MODIFIER)) {
state |= ALTGR;
sState |= ALTGR; // 追加
}
c = 0;
if (state & MODIFIER) {
switch (s) {
// case 0x70: c = PS2_INSERT; break;
// case 0x6C: c = PS2_HOME; break;
// case 0x7D: c = PS2_PAGEUP; break;
case 0x71: c = PS2_DELETE; break;
// case 0x69: c = PS2_END; break;
// case 0x7A: c = PS2_PAGEDOWN; break;
case 0x75: c = PS2_UPARROW; break;
case 0x6B: c = PS2_LEFTARROW; break;
case 0x72: c = PS2_DOWNARROW; break;
case 0x74: c = PS2_RIGHTARROW; break;
case 0x4A: c = '/'; break;
case 0x5A: c = PS2_ENTER; break;
default: break;
}
} else if (state & ALTGR) {
// [右ALT]+[カナ/かな]キーが押された
if (s == 0x13) {
kana_f = ~kana_f ;
if (kana_f == 0) {
keymap = &PS2Keymap_JP ; // 日本語キーマップに戻す
} else {
keymap = &PS2Keymap_KANA ; // カタカナキーマップにする
}
c = PS2_KANA ; // この行をコメントにすればキーコードは返りません
}
} else if (state & (SHIFT_L | SHIFT_R)) {
if (s < PS2_KEYMAP_SIZE)
c = pgm_read_byte(keymap->shift + s);
} else {
if (s < PS2_KEYMAP_SIZE)
c = pgm_read_byte(keymap->noshift + s);
}
state &= ~(BREAK | MODIFIER);
if (c) {
/* 追加 BEGIN */
if (sState & 0x40) {
c &= 0x1F;
sState = 0;
}
/* 追加 END */
return c;
}
}
}
}
キーボードを接続し、Blue Pill (STM32) と通信相手をつなぎます。
COM | Blue Pill (STM32) |
---|---|
TXD | PB11 (Serial3: RXD) |
RXD | PB10 (Serial3: TXD) |
GND | GND |
※ この VT100 エミュレータの通信速度は 9600 bps、画面サイズは 53 x 30 です。
VT100 のエスケープシーケンスは以下のサイトを参考にしました。
- VT100のエスケープシーケンス (BK class)
- 対応制御シーケンス - Tera Term ヘルプ 目次 (Tera Term Home Page)
- Chapter 3 Programmer Information - VT100 User Guide (VT100.net)
- ANSI/VT100 Terminal Control Escape Sequences (termsys.demon.co.uk)
- VT100 escape codes
- ANSI Escape sequences - VT100 / VT52
パク...インスパイア元です。