動きました.. ...への道 なので、まだ動作していない. (サギだー.
- (2017-01-05) ↓これで、更新してます。
キーボード
<=USB=> `RPi` <=UART(シリアル)=> `BLEnano` <= Bluetooth => `PC`
- どのキーも使えます。(HID USBでながれてくるキーコード、そのまま、BTへ投げてる)
- LEDも点くよ(このキーボードについてる、CAPS、NumLock、ScrLkのみ確認)
- ちょいと、不安定?一度、接続できれば、比較的安定。
- 電源切るときは、ぶちっ、とやるしかないので、やばいかも?
- iPhoneにもつながるよ
- 実用性?? USB端子がたりないとき、とか?
- らずぱいって、電気食うよね... => USBホストとUARTがつかえるマイコンが手元にない..(お勧めあったら、コメントへ)
概要
-
キーボード
<=USB=> `RPi` <=UART(シリアル)=> `BLEnano` <= Bluetooth => `PC`
でいくのではないかと... - 関連: @Biaccoさんの記事「ErgoDox BT の設計・実装に試行錯誤した話あらため試行錯誤している話」
- (2017-0105):動いたんだけど、、もっとちーぷなマイコンでやりたいよね.
TODO
- buildrootとかでコンパクトにまとめる?
- (追加:2017-01-05)
- 記事を整理する > 新しいエントリでかく?
- (済:2017-01-05)とりあえず、nRF51側のソースコードとHEXをpushした.
コードをgithubへ..
- (済:2017-01-05)
BLEnanoとRPiでシリアル通信するとこ。
nodejsのserialport
でできるかな?serialport
使って、らずぱい側はできたかも?BLENano側を対応させる..
- (済:2017-01-05)
PCから送られてくるCAPSなどのLEDに対応。
環境
- Raspberry Pi 2
RPi3で、UARTって使うの面倒だったよね??
=> MK-20のまま挿せば、/dev/ttyACM0
でアクセスできる。 - Raspberry Pi Zero :
/dev/ttyAMA0
使用 - Windows 7 64bit
#!/home/pi/.nvm/versions/node/v6.9.3/bin/node
var comDevName = "/dev/ttyAMA0";
var bSendText = false; //Textにして送る。;
var bVerbose = false;
var HID = require('node-hid');
var device = new HID.HID(HID.devices()[0].path)
var SerialPort = require("serialport");
//SerialPort.list(function (err, ports) {console.log(ports);}
var port = new SerialPort(comDevName, {
baudRate: 38400
});
const bufLFCR = new Buffer([0x0d,0x0a]);
var buf = new Buffer(10);
// 0xfe 始端 : 8バイトデータ : 0xfd 終端 みたいな?.
buf.writeUInt8(0xfe,0);
buf.writeUInt8(0xfd,9);
port.on('data', function (data) {
//bit 0: Num Lock
//bit 1: Caps Lock
//bit 2: Scroll Lock
//bit 3: Compose
//bit 4: Kana
//bit 5: Shift
if (bVerbose) console.log((('0'+data[0].toString(16)).slice(-2)));
device.write([0x80+data[0]]);
});
device.on("data", function(data) {
//console.log(data);
data.copy(buf, 1,0,8);
if (bVerbose) console.log(buf);
if (bSendText) {
buf.forEach(function(a,b,c){port.write(('0'+a.toString(16)+' ').slice(-3));});
port.write(bufLFCR);
} else {
port.write(buf);
}
});
↓は、作業内容。まとまってない...
確認できてること
-
BLEnano Nordic nRF51 UARTで受け取った文字を、HIDキーボードとして、タイプする。
=>シリアルからデータを受け取り、BLEnano経由で、文字のタイプ。 -
RPi + nodejs + node-hidにて、キーコードの取得。
node.jsの準備など
sudo apt-get install libusb-1.0-0-dev
古いnodejsを削除
sudo apt-get autoremove nodejs -y
nvmをインストール
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.0/install.sh | bash
export NVM_DIR="/home/pi/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
node LTS版をインストール
nvm install --lts
nvm use --lts
node-hidをインストール
mkdir /home/pi/hid ; cd /home/pi/hid
npm install node-hid
```bash:rootにて実行
sudo bash
export NVM_DIR="/home/pi/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
cd /home/pi/hid
node
```js:rootで実行.らずぱいのUSBにキーボードのみ挿してテスト
var HID = require('node-hid');
var deviceFirst = new HID.HID(HID.devices()[0].path)
deviceFirst.on("data", function(data) { console.log(data) });
/*
ここで Hello とタイプすると、キーコードがでてくる。
L_SHIFT
L_SHIFT+ 'h'
L_SHIFT
(none)
'e'
(none)
'l'
(none)
'l'
(none)
'o'
(none)
*/
=> これ、そのまま、送信すればいいんじゃね?
- シリアル(UART)動作<br>`npm install serialport node-hid` にて。
らずぱいのUART(ttyAMA0)と、Windows(USBのPL2303)のTeraTermにて通信
- `ttyAMA0`を使えるようにする。<br>ログインのコンソールとして使用するようになってるので、それをしないようにする。
```txt:/boot/cmdline.txtから、console=serial0,115200を消す.
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles
#元.
#dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles ```
```bash:serial-getty@ttyAMA0.serviceを停止。
sudo systemctl stop serial-getty@ttyAMA0.service
sudo systemctl disable serial-getty@ttyAMA0.service
- rootにて、node実行
```javascript:nodeこんそーるにて
var bSendText = true; //Textにして送る。
var HID = require('node-hid');
var device = new HID.HID(HID.devices()[0].path)
var SerialPort = require("serialport");
//SerialPort.list(function (err, ports) {console.log(ports);}
var port = new SerialPort("/dev/ttyAMA0", {
baudRate: 38400
});
const bufLFCR = new Buffer([0x0d,0x0a]);
var buf = new Buffer(10);
// 0xfe 始端 : 8バイトデータ : 0xfd 終端 みたいな?.
buf.writeUInt8(0xfe,0);
buf.writeUInt8(0xfd,9);
port.on('data', function (data) {
console.log(data);
});
device.on("data", function(data) {
//console.log(data);
data.copy(buf, 1,0,8);
console.log(buf);
if (bSendText) {
buf.forEach(function(a,b,c){port.write(('0'+a.toString(16)+' ').slice(-3));});
port.write(bufLFCR);
} else {
port.write(buf);
}
});