LoginSignup
9
7

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

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


確認できてること

  • 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
    
    rootにて実行
    sudo bash
    export NVM_DIR="/home/pi/.nvm"
    [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
    cd /home/pi/hid
    node
    
    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)動作
    npm install serialport node-hid にて。
    らずぱいのUART(ttyAMA0)と、Windows(USBのPL2303)のTeraTermにて通信

    • ttyAMA0を使えるようにする。
      ログインのコンソールとして使用するようになってるので、それをしないようにする。

      /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                                                       ```
      
      serial-getty@ttyAMA0.serviceを停止。
      sudo systemctl stop serial-getty@ttyAMA0.service
      sudo systemctl disable serial-getty@ttyAMA0.service
      
    • rootにて、node実行

      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