BLEnanoとRaspberry Piで、USBキーボードをBluetooth対応... <del>への道</del>

動きました.. <del><font color='red'>**...への道**</font> なので、まだ動作していない. (サギだー.</del>

- (2017-01-05) ↓これで、更新してます。<br>`キーボード` <=USB=> `RPi` <=UART(シリアル)=> `BLEnano` <= Bluetooth => `PC`<br>
![Qiita-USBKBD2BT.jpg](https://qiita-image-store.s3.amazonaws.com/0/75594/1cb2b87f-e315-5cf7-03fa-0af3dbc45999.jpeg)
    - どのキーも使えます。(HID USBでながれてくるキーコード、そのまま、BTへ投げてる)
    - LEDも点くよ(このキーボードについてる、CAPS、NumLock、ScrLkのみ確認)
    - ちょいと、不安定？一度、接続できれば、比較的安定。
    - 電源切るときは、ぶちっ、とやるしかないので、やばいかも？
    - iPhoneにもつながるよ
    - 実用性?? USB端子がたりないとき、とか?
    - らずぱいって、電気食うよね... => USBホストとUARTがつかえるマイコンが手元にない..(お勧めあったら、コメントへ)

## 概要
- `キーボード` <=USB=> `RPi` <=UART(シリアル)=> `BLEnano` <= Bluetooth => `PC`<br>でいくのではないかと...
- 関連: @Biaccoさんの記事「[ErgoDox BT の設計・実装に試行錯誤した話あらため試行錯誤している話](http://qiita.com/Biacco/items/259c36cfb36f4ee8dd49)」
- (2017-0105):動いたんだけど、、もっとちーぷなマイコンでやりたいよね.

## TODO
- buildrootとかでコンパクトにまとめる？
- (追加:2017-01-05)
    - 記事を整理する > 新しいエントリでかく？
    - (済:2017-01-05)とりあえず、nRF51側のソースコードとHEXをpushした.<del>コードをgithubへ..</del>
- (済:2017-01-05)<del>BLEnanoとRPiでシリアル通信するとこ。<br>nodejsの`serialport`でできるかな？</del>
    - <del>`serialport`使って、らずぱい側はできたかも？</del>
    - <del>BLENano側を対応させる..</del>
- (済:2017-01-05)<del>PCから送られてくるCAPSなどのLEDに対応。</del>

## 環境
- Raspberry Pi 2<br>RPi3で、UARTって<del>使うの面倒だったよね??</del> <br>=> MK-20のまま挿せば、`/dev/ttyACM0`でアクセスできる。
- Raspberry Pi Zero : `/dev/ttyAMA0`使用
- Windows 7 64bit



```js:/home/pi/hid/kbd_usb2bt.js____/etc/rc.localあたりから、よぶ。&つける
#!/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キーボードとして、タイプする。](http://qiita.com/mt08/items/50683e3e135ba13aed21)<br>=>シリアルからデータを受け取り、BLEnano経由で、文字のタイプ。

- RPi + nodejs + node-hidにて、キーコードの取得。

    ```bash: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　とタイプすると、キーコードがでてくる。
<Buffer 02 00 00 00 00 00 00 00>   L_SHIFT
<Buffer 02 00 0b 00 00 00 00 00>   L_SHIFT+ 'h'
<Buffer 02 00 00 00 00 00 00 00>   L_SHIFT
<Buffer 00 00 00 00 00 00 00 00>   (none)
<Buffer 00 00 08 00 00 00 00 00>   'e'
<Buffer 00 00 00 00 00 00 00 00>   (none)
<Buffer 00 00 0f 00 00 00 00 00>   'l'
<Buffer 00 00 00 00 00 00 00 00>   (none)
<Buffer 00 00 0f 00 00 00 00 00>   'l'
<Buffer 00 00 00 00 00 00 00 00>   (none)
<Buffer 00 00 12 00 00 00 00 00>   'o'
<Buffer 00 00 00 00 00 00 00 00>   (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);
          }
});
```
こんな感じで、出てくる。<br> ::Helloと打ったとこ。
![Qiita-BLENano-HID-Test02.png](https://qiita-image-store.s3.amazonaws.com/0/75594/0f79a183-572d-2eab-8722-01eec8b86694.png)



## その他
- blenoとかでで、HID-Keyboardに化けられれば...
<br>※[bleno](https://github.com/sandeepmistry/bleno): *A Node.js module for implementing BLE (Bluetooth Low Energy) peripherals*
<br>※[noble](https://github.com/sandeepmistry/noble): *A Node.js BLE (Bluetooth Low Energy) central module*