9
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-01-04

動きました.. ...への道 なので、まだ動作していない. (サギだー.

  • (2017-01-05) ↓これで、更新してます。
    キーボード <=USB=> `RPi` <=UART(シリアル)=> `BLEnano` <= Bluetooth => `PC`

    Qiita-USBKBD2BT.jpg
    • どのキーも使えます。(HID USBでながれてくるキーコード、そのまま、BTへ投げてる)
    • LEDも点くよ(このキーボードについてる、CAPS、NumLock、ScrLkのみ確認)
    • ちょいと、不安定?一度、接続できれば、比較的安定。
    • 電源切るときは、ぶちっ、とやるしかないので、やばいかも?
    • iPhoneにもつながるよ
    • 実用性?? USB端子がたりないとき、とか?
    • らずぱいって、電気食うよね... => USBホストとUARTがつかえるマイコンが手元にない..(お勧めあったら、コメントへ)

概要

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/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);
  }
});

↓は、作業内容。まとまってない...


確認できてること

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);
          }
});

こんな感じで、出てくる。
::Helloと打ったとこ。
Qiita-BLENano-HID-Test02.png

その他

  • blenoとかでで、HID-Keyboardに化けられれば...

    bleno: A Node.js module for implementing BLE (Bluetooth Low Energy) peripherals

    noble: A Node.js BLE (Bluetooth Low Energy) central module
9
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?