2013年3月24日日曜日

パソピアプル

ついに完成

見た目はパソピアそのもの。。
でも中はNishipple

後ろのコネクタ、、
左から順に
USBキーボード切り替えスイッチ(上がPC接続用、下がNishipple用)
PC接続用USBコネクタ
内蔵スピーカーのボリューム
コンポジットビデオOUT
カセットOUT
カセットIN
USBジョイスティック・アダプタ

PACスロットは、
奥がSDISK II
手前がUSBキーボードのLED。左から順にNum Lock/Caps Lock/Scroll Lock

Nishippleとして利用したときの動画
特殊キーの割り当ては、
Reset : Graph+F6 (F12)
REPT : Graph+F5 (F11)

次はUSBキーボードとして利用したときの動画
OSはWindows8 32bit

HIDデバイスと認識するため、標準のドライバーでOK。XP 64bitでも使えた。

色々アドバスをくれた皆さんに感謝

2013年3月16日土曜日

USBキーボードコネクタ作り直し

下のUSBキーボードコネクタを作り直すことにした。
これはこれでコンパクトにまとまったので気に入っていたのだが、パソピア内部の設置場所に困ったのと、せっかくなのでNishipple用だけではなく、単体でUSBキーボードとして動くように切り替えスイッチを付けてみる。

基板は同じものを使用。右は今回一番高かった4回路のトグルスイッチ。780円

今回は基板をカットして使う
右は、キーボードと接続するソケット。今回は丸ピンを使った

電源ラインと抵抗とツェナーダイオードをセット

ソケットとスイッチを取り付け
スイッチには、外付け用のTypeBコネクタと、USBケーブルのTypeA側を付ける。

鉄板に追加の穴あけ

結構穴あけしたので、気休めかもしれないが防錆剤を噴射

4回路スイッチに付けたUSBケーブルのTypeA側が、Nishippleに届くことを確認

キーボードと接続したところ

後ろから見たところ
写真左下にスイッチ。
スイッチを上にするとTypeBコネクタでPCと接続、下にするとNishippleと接続。

2013年3月14日木曜日

LEDの作成

LEDはPACスロットに入れる予定なので、再びファミコンカセットを使う。

まずは、黄色LEDを購入。4個で110円
1.8-2.5V、20mA

基板とコネクタを接続
今回はカナLEDは用意せず、左からNum Lock/Caps Lock/Scroll Lock

ファミコンカセットを削って、LEDの穴を作成して高さを調整。
プラリペアで、基板を乗せる土台も作成

USBキーボードアダプタに接続して、試してみる。

ちゃんとPS2キーボードと同じように、LEDが点灯することを確認。

2013年3月13日水曜日

キーマップ

パソピアのキーマップを考えてみる。

オリジナルのキー配列は、こんなかんじ

USBキーボードのキーマップは、できるだけ同じキーを使うように配置してみた

GraphキーはFunctionキーとして使い、これが押された場合は以下のキーマップを変更する

これで、日本語の109キーが網羅できたと思う。

ファームもこれに合わせて修正。
「ibm_1391401.h」をコピーして作ったヘッダーで、キーマップを2つ作る

const unsigned char keymap[NUMROWS][8] PROGMEM = {
 ・・・
};

const unsigned char keymapFunction[NUMROWS][8] PROGMEM = {
 ・・・
};
Functionキーの定義も追加
#define FUNCTION_KEY_ROW 0 // "GRAPH" Key
#define FUNCTION_KEY_MASK 0x01

「main.c」で切り替え処理を入れる。
「scankeys()」の中で、Fnキーの押下をチェックして、
/* Check Function Key */
functionKey = !(bitbuf[FUNCTION_KEY_ROW] & FUNCTION_KEY_MASK);

これに応じてkeymapを使うかkeymapFunctionを使うか切り替える。

rumpはATmega32を使っているので、ATmega164Pで使う場合、レジスタをちょっと修正
TCCR0B = 5;      /* timer 0 prescaler: 1024 */
main()の中もちょっと修正
if (TIFR0 & (1 << TOV0)) { /* 22 ms timer */
* Reset flag */
TIFR0 = 1 << TOV0;
・・・ 
これでビルドが通った。
AVR DragonでATmega164Pに書き込んでPCに接続!!

2013年3月12日火曜日

ファーム作成

続いてファームの作成

ここまでV-USBReference Projectsの中からHIDKeysを試してみた。
今度はV-USB Human Interface Devicesからrump - The Model Mを参考にしてみる。

前に書いたがパソピアのキーボードは逆流防止用のダイオードが付いていないので、ゴーストキーの問題がある。
このrumpの良いところは、ゴーストキー対応とチャタリング対応がされている点

まずはHIDKeysをベースに「usbconfig.h」を書きかえる。
usbFunctionWrite()を使うので、「USB_CFG_IMPLEMENT_FN_WRITE」に1をセット

#define USB_CFG_IMPLEMENT_FN_WRITE      1

Device IDとVender Name、Device Nameは適当にセットして、Sub ClassとProtocolをセット。

#define USB_CFG_INTERFACE_SUBCLASS  0x01    /* Boot-device subclass */
#define USB_CFG_INTERFACE_PROTOCOL  0x01    /* Keyboard protocol */

USB Report Descriptorは64をセット

#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH    64  /* total length of report descriptor */
つぎにrumpから「main.c」を丸ごとコピー
日本語キーボードにするため、USB Report Descriptorを一部修正。
const PROGMEM char usbHidReportDescriptor[USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH] = {
  0x05, 0x01,            // USAGE_PAGE (Generic Desktop)
0x09, 0x06,            // USAGE (Keyboard)
0xa1, 0x01,            // COLLECTION (Application)
0x05, 0x07,            //   USAGE_PAGE (Keyboard)
0x19, 0xe0,            //   USAGE_MINIMUM (Keyboard LeftControl)
0x29, 0xe7,            //   USAGE_MAXIMUM (Keyboard Right GUI)
0x15, 0x00,            //   LOGICAL_MINIMUM (0)
0x25, 0x01,            //   LOGICAL_MAXIMUM (1)
0x75, 0x01,            //   REPORT_SIZE (1)
0x95, 0x08,            //   REPORT_COUNT (8)
0x81, 0x02,            //   INPUT (Data,Var,Abs)
0x95, 0x01,            //   REPORT_COUNT (1)
0x75, 0x08,            //   REPORT_SIZE (8)
0x81, 0x03,            //   INPUT (Cnst,Var,Abs)
0x95, 0x05,            //   REPORT_COUNT (5)
0x75, 0x01,            //   REPORT_SIZE (1)
0x05, 0x08,            //   USAGE_PAGE (LEDs)
0x19, 0x01,            //   USAGE_MINIMUM (Num Lock)
0x29, 0x05,            //   USAGE_MAXIMUM (Kana)
0x91, 0x02,            //   OUTPUT (Data,Var,Abs)
0x95, 0x01,            //   REPORT_COUNT (1)
0x75, 0x03,            //   REPORT_SIZE (3)
0x91, 0x03,            //   OUTPUT (Cnst,Var,Abs)
0x95, 0x06,            //   REPORT_COUNT (6)
0x75, 0x08,            //   REPORT_SIZE (8)
0x15, 0x00,            //   LOGICAL_MINIMUM (0)
0x26, 0xff, 0x00,      //   LOGICAL_MAXIMUM (255)
0x05, 0x07,            //   USAGE_PAGE (Keyboard)
0x19, 0x00,            //   USAGE_MINIMUM (Reserved (no event indicated))
0x29, 0xe7,            //   USAGE_MAXIMUM (Keyboard Right GUI)
0x81, 0x00,            //   INPUT (Data,Ary,Abs)
0xc0                   // END_COLLECTION
};
これを修正しておかないと、「ろ」「無変換」「前候補」あたりのキーが認識しない。。

あと、パソピアはキースキャンラインが12行なのと、AVRとスキャンラインの配線が違うので、そのあたりのコードを修正しておく。

更に欲張ってLEDもつけてみる。
150Ωを挟んで、以下のように配線をしてみる。
PB4: NumLock LED
PB5: CapsLock LED
PB6: ScrollLock LED
PB7: Kana LED

hardwareInit()でポートB設定をしとくのと、scankeys()の中でPB4~7を消さないようにちょっと修正。PB4~7はusbFunctionWrite()の中でセットする。

続いてrumpから「ibm_1391401.h」をコピー
スキャンラインが12行なので定義を変更
#define NUMROWS 12
enum keycodesが101キーまでしかないので、無変換キー(139)あたりまで追加しておく。
キーマップは次回

2013年3月8日金曜日

USBキーボードコネクタ作成

コネクタを作り始める。

左からUSB TypeBのコネクタ、基板、ソケット40ピン

基板の表面にもパターンが印刷されているので便利。
真ん中の縦ラインは、左Vcc、右GNDにしてみた。
真ん中にATmega164P用のソケット40ピン、左にパソピアキーボードの20ピンを配置する予定でパターンを作る

基本、HIDKeysと同じ配線。
PD0がD-で、PD2がD+
ATmega164Pとパソピアキーボードとは独自に配線。
PC0-7: 1(KR0)-8(KR7)ピン
PA0-7: 9(KS0)-16(KS7)ピン
PB0-3: 17(KS8)-20(KSB)ピン

出来るだけ表面で配線してみたが、裏面も2本ほど配線。

ソケットやコンデンサを取り付け。

意外とコンパクトにできた。

2013年3月7日木曜日

パソピアのキーボード

パソピア基板のキーボード端子近辺。

キーボード端子の下にLS38が3つ、その右にPIO、更に右にZ80CPU。
綺麗に並んでいる。

続いてキーボード側の端子
上がキーボードの基板側、下がコネクタ側
20ピンが並んでいる。

キーボード基板。
配線とスイッチの組み合わせ。

パターンを追いかけて、以下の配線になっていることが判明。
ピンマトリックスのライン
1KR0
2KR1
3KR2
4KR3
5KR4
6KR5
7KR6
8KR7
9KS0
10KS1
11KS2
12KS3
13KS4
14KS5
15KS6
16KS7
17KS8
18KS9
19KSA
20KSB

初代パソピアのキーマトリックス

パソピア7のマトリックスはこちら

パソピア7もそうだが、逆流防止のダイオードは付いてない。
そのため複数のキーを押すと違う文字が入力されることがある。
HIDKeysには、そのへんの処理が入っていないので別な方法を考えてみる。

2013年3月6日水曜日

ブレッドボード

HIDKeysは回路図が公開されているので、それを参考にブレッドボードで組み立ててみる
USBコネクタはTypeAしかなかったので、そのまま付けてみた。
PCとの接続は、両端がTypeAのUSBケーブルがあったので、それを使った。

ATmega8近辺は、こんなかんじ
クロックは、12MHzを選択。

電源は2パターン試した。
USBの5VをそのままAVRに入力して、D+とD-にはツェナーダイオードを入れるパターン

もうひとつは、USBの5Vを3端子レギュレータで3.3Vに落として、AVRに入れるパターン

USBケーブルでPCと接続すると、どちらの電源パターンでもHID Keyboardとして認識。
スイッチを押すと、ちゃんと「a」が入力された。すばらしい。

このままATmega8を使いたかったが、1つ問題が。
ATmega8は足が28ピンあるが、電源関係5ピンとクリスタル用2ピン、USBのD+, D-用の2ピンを差し引くと、使えるピンは19ピン。。

それに対し、パソピアのキーボードは20ピン。1ピン足りない。。
パソピア実機のようにLS38を3つを組み合わせて使うと15ピンで済むが、配線が大変になってしまう。。

そこでATmega164Pを購入。秋月で350円。
こいつなら足が40ピンあり、いろいろ差し引いても自由に使えるピンが30ピンになるので、パソピアのキーボード20ピンを全てAVRに接続できる。

fuse設定をして、ATmega164Pに書き込み。

ブレッドボードの配線をちょっと変えて、ATmega164Pをセット。
ん?動かない。。

個体差かもしれないが、3端子レギュレータでATmega164Pに3.3Vを入れるパターンの場合、動かず
5Vを入れるパターンでは動く。

データシートのグラフを見るとATmega164Pは12MHzで3.3Vはぎりぎり線が引いてあるが、許容範囲が狭いのかもしれない。
ただ足が40ピンあるのは魅力なので、5Vを入れるパターンでいってみる。

2013年3月5日火曜日

Atmel Studio

V-USBReference Projectsの中からHIDKeysを試してみる。
2013/03/05現在の最新版は「HIDKeys.2012-12-08.zip」

コンパイラは迷ったけど、Atmel Studioを使うことに。AVR Simulatorが使えるから。。
AtmelのサイトからAtmel Studio 6をダウンロードしてインストール
今回は、(Version: 6.0.1996 - Service Pack 2)というバージョンを使った

起動したら、メニューの「Tools」→「AVR Tools Firmware Update」を選択。

AVR Dragonをアップデートしておく。
アップデート中は電源を切らないようにと。

続いてプロジェクトの新規作成
「File」→「New」→「Project」で、「GCC C Executable Project」を選択。

デバイスは、HIDKeysのリファレンス通りATmega8を選択

ダウンロードしたHIDKeysのソースファイルをプロジェクトに追加

includeパスに「usbdrv」フォルダを追加
このままだとusbconfig.hを見つけられないので、ちょっとズルする。
usbdrv.hをちょっと変更
#ifndef __usbdrv_h_included__
#define __usbdrv_h_included__
#include "../usbconfig.h"
#include "usbportability.h"
あと、心苦しいがF_CPUのdefineも直接usbconfig.hに書いてしまう。。
/* ---------------------------- Hardware Config ---------------------------- */
#define F_CPU 12000000L
#define USB_CFG_CLOCK_KHZ       (F_CPU/1000)
とりあえずビルドが通るように環境を構築。
ビルドが通ったら、AVRへの書き込み。

梅沢で買ったATmega8(300円)をAVR Dragonにセット。

Fuse設定は、Makefile記載の設定通りにセット。

続いて、ビルドして生成されたHEXファイルをFlushへ書き込み。

これでATmega8の準備は完了