2017年3月10日金曜日

浅草ギ研さんの BLESerial2 を使ってモジュール側に信号を送信してみた

概要

環境

  • Arduino UNO
  • Arduino IDE 1.6.7
  • BLEモジュール BLESerial2
  • 砲弾型 赤色LED 1 個
  • 抵抗 1KΩ x2, 470Ω x 1
  • ジャンパケーブル 2 本

配線

Arduino の TX ピンを使って BLE モジュールに信号を送信します
bleserial2_tx_circuit.jpg

基本はここ に記載されている回路図を元に配線しているだけです
BLE モジュールから出ている TX ケーブルは直接 Arduino の TX ピンに接続しません
途中にいくつか抵抗を挟んでいます
Arduino の TX ピンからだと

Arduino TX ピン -> 抵抗 1KΩ -> BLE モジュール TX -> 抵抗 1KΩ + 抵抗 470Ω -> Arduino GND

になります
BLE モジュール TX と抵抗 1KΩ + 抵抗 470Ω の部分は分岐しています

P.S 20160420
この分岐の部分でなんで分圧しているのかあらためて確認してみたのですが、マイコン側の基準電圧が 5v マイコンの場合は BLESerial2 の TX ピンに 3.3v がかかるようにするために分圧回路を組んでいます
なのでマイコンの基準電圧が 3.3v の場合は TX ピンに入る電圧を分圧する必要はありません
http://www.robotsfx.com/robot/BLESerial2.html
このページの「接続例」の部分に記載がありました

左上の BLE モジュールの RX ピンが適当な場所に刺さっているのは撮影のため適当に場所にピン止めしているだけなので、回路には関係ありません

Arduino 側のプログラム

今回はシリアルで読み込んだ値をそのまま Serial.write で BLE モジュール側に送信するプログラムを作成しました

int rsvData = 0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  if(Serial.available() > 0){
    rsvData = Serial.read();
    Serial.write(rsvData);
    delay(100);
  }
}

プログラムは非常に簡単です
書いたらコンパイルしておきましょう

動作確認

さて、動作確認です
Arduino に書き込む際は Arduino の TX ピンを抜いておきましょう
まずコンパイルしたプログラムを Aruduino に書き込みます
書き込めたらシリアルで入力する必要があるのでシリアルコンソールを立ち上げておきます

書き込めたら例のごとく iPhone アプリの LightBlue を使って動作確認しましょう
まず LightBlue を使って BLESerial2 に接続します
接続できたらサービスの一覧に「Notify」があるのでタップします
Notify の状態になったら Arduino のシリアルコンソールに何か文字を入力してみましょう
すると LightBlue 側で Notify していたアプリが BLE モジュールから値を受け取れるのが確認できると思います
bleserial2_notify_data.png

写真では「0x31」という値が取得できています
これはシリアルコンソールで「1」を入力したときに取得できた値です
複数の文字列とかを入力すると受信できるデータも複数になると思います

最後に

3 回に渡って浅草ギ研さんの BLESerial2 の検証を行ってきました
簡単にまとめると

  • BLE アプリははじめから書き込まれており電源を入れるだけで動作する
  • BLE モジュール上の RX は write リクエストを行った際にシリアル信号として受信できる
  • BLE モジュール上の TX は Arduino 等からのシリアル情報を BLE モジュール上に送信するために利用できる

というのがメイン機能かと思います
Web で調べた限りですが、SmartBasic や C の開発用の API は公開されておらず自分で BLE アプリを作るのは無理そうです ( できる!というのを知っている方がいれば是非教えていただきたい。。。)

なので、簡単なデータの送受信を行うだけであれば十分ですが、独自のサービスを定義してデータを送りたいとか少し大きめのデーバの送受信を行う場合は BLESerial2 だけだと厳しいかもしれません

付属の説明書にもあったのですが、

15バイト以上のデータを送る場合は、15 バイト以内のデータを 20ms 間づつ空けてから送信するようにしてください

とありましたので、用途的には簡単な独自ビーコンといったところでしょうか

参考サイト

浅草ギ研さんの BLESerial2 を使って LED を点灯させてみた

概要

前回 BLESearial2 の電源を入れるところまで試し BLE モジュールとして動作することを確認しました
今回は更に BLE モジュールからシリアル信号を Arduino で受け取って LED を点灯させてみたいと思います

環境

  • Arduino UNO
  • Arduino IDE 1.6.7
  • BLEモジュール BLESerial2
  • 砲弾型 赤色LED 1 個
  • 抵抗 47Ω x 2
  • ジャンパケーブル 2 本

配線

今回は BLE のシリアルを受信して LED を点灯させます
配線は以下の通り
bleserial2_led_circuit.jpg

まずは、LED を点灯させるための配線です
デジタルピン 7 番から抵抗を 2 つ挟んで LED のアノード側へ接続します
そして LED のカソード側を Arudino の GND に接続します

次に BLE モジュールの RX を Arduino の RX に接続します
注意点としては Arduino 側の RX ピンが接続されていると、後で Arduino にアップロードするプログラムが上手く書き込めないのでプログラムを書き込むときは RX ピンを抜いて書き込んでください

写真の左上の BLE モジュールの TX がブレッドボードに刺さっているのは写真を撮るためにわざとピンを指しているだけなのでどこにも接続されていない回路になります

Arduino 側プログラム

BLESerial2 からのシリアル信号を受信して LED を点灯させるプログラムです

const int LED = 7;
int rsvData = 0;

void setup() {
  pinMode(LED, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  if (Serial.available() > 0) {
    rsvData = Serial.read();
    Serial.println(rsvData);
    if (rsvData == 1){
      digitalWrite(LED, HIGH);
    } else if(rsvData == 0) {
      digitalWrite(LED, LOW);
    }
  }
  delay(100);
}

今回は 7 番ピンを使いました
ここは適宜変更してもらって OK です
コンパイルできたら RX ピンを一旦抜いてプログラムを Arduino に書き込みましょう
書き込みできたあとで再度 RX ピンを差し込んでください

動作確認

シリアルの受信は BLE モジュールに接続した後に write リクエストを送ることで、その信号をシリアル信号として受信することができます

じゃあどうやって write リクエストを送るかというと前回使った iPhone アプリ ( LightBlue ) を使います
アプリを立ち上げて接続したあとに「Write Without Response」のサービスを開きます
bleserial2_write_request.png

すると「Write new value」という部分があるのでタップして「1」を入力して Done してみましょう
すると Arduino に配線された見事光ると思います
次に「0」を入力すると LED が消灯するはずです

最後に

BLE モジュールから信号を受信して Arduino で LED を光らせてみました
今回、RX しか使わなかったので次回は TX を使って BLE モジュール側に信号を送信してみたいと思います

RaspberryPi で赤外線リモコンを制御してみた

概要

RaspberryPi + 赤外線受信モジュール + 赤外線 LED を使って自作リモコンを作ってみました
今回学習したリモコンはテレビのリモコンで SONY BRAVIA RM-JD025 のリモコンになります

環境

  • Raspberry Pi Type B Single Board Computer 512MB
  • Raspbian 8.0 (Jessie)
  • LIRC 0.9.0~pre1-1.2
  • Kernel Version 4.1.7+
  • Python 2.7.9
  • ジャンパケーブル オスxメス 12 本
  • 赤外線受信機 OSRB38C9AA
  • 赤外線リモコン OSI5FU5111C-40

リモコンから出る赤外線情報を学習する

はじめに LIRC ( Linux Infrared Remote Control ) という仕組み使って市販のリモコンから送信される赤外線情報を学習します

配線

赤外線リモコン受信モジュールである OSRB38C9AA を使って学習します
まずは学習するだけの配線を準備しましょう
rpi_Infrared_receiver_circuit.jpg

受信モジュールは出っ張っている方 ( 受信する方 ) を手前にして左から「OUTPUT」「GND」「VCC」になります
RaspberryPi と接続するときはそれぞれ「GPIO14」「GND」「5.0V」になるように接続します

今回使用した受信モジュールは Max 5.5V まで耐えられるので電源は 5.0V に接続しています
受信モジュールによっては 3.3V でなければいけないものもあるので、使用するモジュールの説明書等の電気特性を見て適宜変更してください

LIRC のインストール

赤外線信号を制御するためのパッケージをインストールします

  • sudo apt-get install lirc

0.9.0~pre1-1.2 というバージョンがインストールされました
インストールされただけでは RaspberryPi 上で LIRC は使用できません
デバイスを有効にして使えるようにします

  • sudo vim /boot/config.txt

で 51 行目あたりの dtoverlay=lirc-rpi をコメントアウトしましょう
そして GPIO 14 番を赤外線信号の受信に使って、GPIO 22 番を信号の送信に使うように設定します

51c51
< dtoverlay=lirc-rpi,gpio_in_pin=14, gpio_out_pin=22
---
> #dtoverlay=lirc-rpi

※別のサイト等で LIRC 用の GPIO の設定を modprobe コマンドで実施する方法を紹介していますが、自分の環境だと modprobe ではできませんでした
※GPIO も当初 24 と 25 を使っていたのですが、うまく動作せず 14 と 22 に後から切り替えました

設定が変更できたら有効にするために一旦再起動します
再起動したらデバイスが有効になっているか確認してください

  • lsmod | grep lirc

lirc_rpi 8602 0
lirc_dev 11060 1 lirc_rpi
rc_core 23630 1 lirc_dev

基本上記のようになっていれば問題ないですが、念のためデバイスファイルが作成されているかも確認するといいと思います

  • ls -l /dev/lirc*

学習する

これで LIRC が使えるようになったのでさっそくリモコンを受信モジュールに向けて学習してみたいと思います

まずは受信モジュールがちゃんと信号を受信するかテストしてみます

  • mode2 -d /dev/lirc0

で受信待ちになるので何かリモコンを向けてボタンを押してみてください
以下のように表示されれば OK です

pulse 4100698
space 3433
pulse 1635
space 475
pulse 363
space 479
pulse 1235
space 466
pulse 345
space 480
pulse 1202

一回ボタンを押しただけでも結構ずらーっと数字が流れると思います

/dev/lirc0 はデバイスファイルで特に他に使っていなければ 0 から始まります
デバイスファイルの番号が異なる場合は適宜変更してからコマンドを実行してください

信号送信用のファイルを作成する

これで信号を学習することができるようになりました
赤外線 LED を使って学習した信号を送信するには専用の設定ファイルを作成する必要があります
学習した信号を設定ファイルにするには irrecord コマンドを使います

  • mkdir -p ~/work/lirc
  • cd ~/work/lirc
  • irrecord -n -d /dev/lirc0 tv_controller.conf

引数に設定ファイルを作成するパスを指定します

でここからが結構面倒くさいです
まず Enter を 2 回押します
するとリモコンの信号を待ち受ける状態になるので受信モジュールに向けて学習したいボタンも含めていろいろなボタンを押します
まだ、ボタンを作成するフェーズではないのでとにかくいろんなボタンを押します
するとドットが次々増えていくので、80 個以上になるまでボタンを押しましょう
1 回 80 個を超えると再度 80 個を超えるまでリモコンの信号を待ち受ける状態になります

これが終了するとようやく信号を学習してリモコンを作ることができるようになります
先に作成したいボタンの名前を入力します
以下の例では「POWER_ON」というボタンを作成しています
入力したら、リモコンを受信モジュールに向けて電源 ON ボタンを押します
成功すれば設定ファイルに POWER_ON ボタンの定義が記載されているはずです

「Something went wrong」と出てうまく学習できない場合は再度ボタンの連打からやり直してみてください
コツは

  • 各ボタンを順番に 1 秒くらいの長押しにする
  • 実際にリモコンで操作できるデバイスや家電が近くにないところで学習させる

かなと感じました
これに関しては正直根気強く頑張るしかないかなと思います

※デバッグ文の一部抜粋

Press RETURN now to start recording.
................................................................................
Found const length: 134711
Please keep on pressing buttons like described above.
................................................................................
Space/pulse encoded remote control found.
Signal length is 99.
Found possible header: 3419 1639
Found trail pulse: 462
No repeat code found.
Signals are space encoded.
Signal length is 48
Now enter the names for the buttons.

Please enter the name for the next button (press <ENTER> to finish recording)
POWER_ON

Now hold down button "POWER_ON".

設定ファイルが上手く作成できたら LIRC の設定ファイルを配置する場所にコピーします

  • sudo cp /etc/lirc/lircd.conf{,.back}
  • sudo cp tv_controller.conf /etc/lirc/lircd.conf

LIRC を起動する

  • sudo lircd --driver=default --device=/dev/lirc0 /etc/lirc/lircd.conf

で LIRC のデーモンを起動しましょう
※ここがいろいろ悩んだんですが、なぜか systemctl 経由だとうまく起動できず手動で起動しました

停止したい場合は sudo pkill lircd で停止してください

赤外線 LED を使って信号を送信する

学習したリモコンの赤外線情報を LED を使って送信します
今度は赤外線 LED を使って配線します

配線

赤外線 LED を使って配線します
写真だとブレッドボード上に受信モジュールもまだ配線していますが、外してしまっても問題ありません
rpi_infrared_led_circuit.jpg

赤外線 LED は信号を送信するか家電などに向けてください
アノード側は GPIO22 -> 抵抗 47Ω と挟んで接続し、カソード側は GND に接続しています
抵抗は 47Ω で問題なく動作しましたが、もう少し大きめの抵抗にしたほうがいいかもしれません
また、トランジスタを使って信号を増幅する回路もありましたが、自分の場合は特に増幅しないでも信号を送信できました

信号送信

では LED から信号を送信しましょう
まずは学習したリモコン情報を確認します

  • irsend LIST '' ''
  • irsend LIST tv_controller.conf ''

これで先ほど登録したボタン「POWER_ON」が表示されることを確認してください
ここで学習したボタン情報が表示されない場合は lircd のデーモン起動がうまくいっていません

  • irsend SEND_START tv_controller.conf POWER_ON

これで赤外線 LED から信号を送信します
LED を家電に向けてコマンドを実行してください

距離はだいたい 1 - 2m くらい近づかないとダメです
また、家電等の赤外線受信口にほぼ真っすぐ向けないと反応しないので気をつけてください

赤外線 LED からちゃんと信号が送信されているか確認する方法としては携帯のカメラを使って覗き込むとちゃんと光っているか確認できるかと思います ( iPhone6 だとダメなのでガラケやデジカメを使ってください )

最後に

あとから気づいたのですが、今回一番苦労したのは lircd のデーモンが起動しなかったことでした
最終的に systemctl 経由ではなく lircd を直接起動して解決しました
本来は systemctl 経由で起動されるべきだと思うので、これは今後の課題かなと思います
いろいろと Web で調べると Jessie で試しているケースが少なかったので OS のバージョンやカーネルのバージョンが影響しているのかもしれません
たぶん /etc/init.d/lirc を少し書き換えれば動くとも思うのですが。。。

あとハマりポイントとしては最後の irsend の部分で SEND_ONCE というコマンドで信号を送信するサイトが多くあったのですが自分の場合は SEND_START でないとうまく信号を送信できませんでした

学習するリモコンも何個か試してみたのですが、学習しやすいリモコンと学習しづらいリモコンがあると感じました
学習しやすいと感じたリモコンは 80 個のドットを埋めるときにスムーズに埋まるほど学習しやすいリモコンかなと感じました
なかなか反応しないリモコンは学習しづらい印象でした ( 完全に所感になります )

とりあえず動いたので良かったですが、ちょっと力技な点があったのでそこは反省です

参考サイト

Arduino でサーボモータの速度制御をしてみた

概要

Arduino でサーボモータの角度制御を速度制御を行ってみました

環境

  • Mac OS X 10.10.5
  • Arduino UNO
  • Arduino IDE 1.6.7
  • サーボモータ SG90

配線

arduino_servo_circuit.jpg

サーボモータから出ている線の

  • 茶色 -> Arduino GND
  • 赤色 -> Arduino 5v電源
  • オレンジ色 -> Arduino GPIO 8 番

という具合に配線します

VarSpeedServo ライブラリをインポート

これ を使います
リリースページから最新版の zip をダウンロードし解凍します

2016/02/02 時点での最新版は v1.1.3 でした
https://github.com/netlabtoolkit/VarSpeedServo/releases/download/v1.1.3/VarSpeedServo.zip

Arduino IDE を起動して

スケッチ -> ライブラリをインクルード -> .ZIP形式のライブラリをインストール

を選択してください
arduino_include_libs.png

ダウンロードした zip ライブラリを選択する画面になるので選択します
arduino_select_zip_libs.png

追加が完了すると「Library added to your libraries. Check “include library” menu」と IDE に表示されればライブラリのインポートは OK です

制御用スクリプト

サンプルコードは以下の通りです

#include <VarSpeedServo.h> 

VarSpeedServo servo;

int pin = 8;
int deg = 0;
int speed = 50; // 1 - 255

void setup() {
  servo.attach(pin);
  Serial.begin(9600);
} 

void move_servo(int deg) {
  servo.write(deg, speed, true);
  servo.detach();
}

int serialRead() {
  char c[4];
  for (int i = 0; i < 3; i++) {
    c[i] = Serial.read();
    if (c[i] == '\0') {
      break;
    }
  }
  return atoi(c);
}

void loop() {
  move_servo(deg);
  if (Serial.available() > 0) {
    delay(10);
    int input = serialRead();
    if ( input >= 0 && input <= 180 ) {
      Serial.println(input);
      servo.attach(pin);
      deg = input;
    }
  }
}

まず setup でサーボモータを制御するピンとシリアルモニタの初期化をします

loop でメイン処理に入ります
move_servo メソッドで引数に与えられた角度にサーボモータを動かします
その際に servo.write(deg, speed, true) を使うことで角度を動かします
2 つ目の引数にサーボモータを動かすスピードを指定することができます
1 から 255 までの範囲で指定することができ、1 が低速で 255 が高速になります
プログラム内の speed という変数で速度を調整できます
最後の true はサーボモータが指定された角度に動くまで次の処理を待ちます

loop 処理内で常にシリアルの入力を受け付けています
シリアルに角度を入力すると入力された角度にサーボモータが動きます

最後に

今回は以上です
Arduino ではサーボモータを制御する標準のライブラリに Servo.h があります
これを使っても角度を動かすことはできますが、速度の制御は自分で実装する必要があります
やるとしたら Servo.write で角度を 1 ずつ変えてその度 delay で休ませる時間を調整する感じになると思います

たぶん、VarSpeedServo を使うほうが断然楽だと思います

参考サイト

Ansible で SSH に鍵認証を使用する方法

概要

前回 の入門では ID/PW による方法とノンパスログインによる方法を紹介しました
今回は秘密鍵と公開鍵を使った SSH 認証で Ansible を実行する方法を紹介します

環境

  • CentOS 6.7 64bit
  • Ansible 1.9.4

設定方法

鍵認証を使う方法はいくつかあります

設定ファイルに記載する方法

  • vim /etc/ansible/ansible.cfg

を編集します

private_key_file = /path/to/key/secret_key.pem

というパラメータがあるので、秘密鍵へのパスを設定します
これで実行すると実行時に鍵のパスフレーズの入力を求められます

$ ansible all -m ping
Enter passphrase for key '/path/to/key/secret_key.pem': 

実行時のパラメータで指定する

  • ansible all --private-key=/path/to/key/secret_key.pem -m ping

で同様にパスフレーズの入力を求められます

最後に

紹介は以上です
全サーバ共通の秘密鍵を使うなら設定ファイルに記載して、サーバごとに異なる場合は実行時のパラメータで指定する感じでしょうか
また、今回は ansible コマンドで紹介しましたが、ansible-playbook コマンドでも同様な指定方法になります

Tips

ちょっと気になった挙動があって、パスフレーズの入力を求められたあと認証に成功すると一定時間認証情報をどっかに保存しているのかパスフレーズを求められないことがありました
詳しく調査してないのですが、そんな機能があるのだろうか

Access to Tumblr account is not authorized.

概要

StackEdit から Tumblr に Publish するときにタイトルのエラーが発生しました
解決方法ではないですが対応方法を見つけたので紹介します

環境

  • StackEdit 2016/02/05

原因

おそらくですが、投稿の文字数の上限を超えてるんじゃないかなと思いました
別の Markdown を作成して投稿したところ問題なく投稿できて、非常に長い Markdown だとエラーになりました

もしかすると別の原因 ( 不正文字とか、アクセス制限を受けたとか、スパム登録されたとか ? ) が含まれているせいで投稿できなかった可能性はありますが、自分が遭遇したケースだとその可能性が高そうでした

対応方法

で、対処方法ですが自分は以下の手順で Tumblr に投稿しました

  1. StackEdit -> Export to disk -> As HTML
  2. .html ファイルをローカルに保存
  3. .html ファイルを開いてコピー
  4. Tumblr からテキストの記事を投稿、コピーした内容をペースト
  5. タイトルを付与
  6. Tag を付与

StackEdit が生成してくれた HTML を手動で Tumblr に投稿する感じです
その際に YAML Front-matter で指定した情報で タグ等の情報があれば忘れずに付与しましょう

非常に残念な感じですがとりあえずこれで対処できます

Markdown ファイルを更新した場合は同じ手順で Tumblr 側の記事を更新する必要があります

参考サイト

StackEdit から Tumblr に投稿する際に「Could not publish on Tumblr.」が出たときの対処方法

概要

こんな感じで StackEdit の右下にアラートが表示されて Tumblr に投稿できなくなった
error_on_stackedit.png
その時の対処方法を紹介します

環境

  • Firefox 43.0.4
  • Mac OS X 10.10.5
  • StackEdit 2016/01/28 時点

Tumblr の SSL 機能を OFF にする

ズバリ解決方法は上記の通り
Tumblr には SSL の機能がありすべての記事の閲覧を SSL にすることができます
これはこれで安全なのでいいのですが、どうやらまだ StackEdit がそれに対応していないようで有効にすると該当のエラーが発生します
なので、残念ながら StackEdit から登録する場合は SSL 機能を無効にしましょう

SSL 機能を無効にするのは

ダッシュボード -> 右上アカウント -> 自分のブログを選択 -> 外観を編集 -> 暗号化

のトグルボタンで設定できます
tumblr_config_ssl.png

最後に

紹介は以上です
今までできていたのに急にできなくなった場合には、これを怪しんでください
自分も SSL を有効にしたのを全然覚えていなくてなぜだろうと結構悩みました