スキップしてメイン コンテンツに移動

Fabbotかんなちゃんのハック方法

先日、コワーキングスペースHaLakeにて行われました「FabBotかんなちゃんで遊ぼう!IoT勉強会」で、半日かけてFabbotかんちゃんをハックしてみましたのでその方法を簡単にまとめてみます。




もともとついていないセンサーをArduinoに取り付けた場合、Raspberry Piと繋がるPCからどのようにセンサー情報を取得できるかという方法を試しましたが、センサー以外にもカスタマイズの参考になるかと思います。


  1. Arduinoへのセンサー取り付け
  2. ArduinoからRaspberry Piへのセンサーデータ送信
  3. Raspberry Piのサーバ対応
  4. Raspberry Piと繋がるPCからのArduinoのセンサーデータ取得
という手順で進めます。

Arduinoへのセンサー取り付け

今回使用しましたのは圧力センサーで、適当に空いていたGPIO8番ピンを利用し、10kΩの抵抗をGNDと繋ぎましたが、この辺はよくある取り付けですので省略します。
この時点で正しくセンサーの値が取れるかをArduino IDEで確認しています。


void setup() {
  Serial.begin(9600);
  pinMode(8, INPUT);
}

void loop() {
  Serial.println(analogRead(8));
}

(後で気付きましたが、analogRead関数を使っており、圧力センサーですのでアナログピンに刺すところでしたが、上記のコードのまま試し、圧力センサーに触れていない時は0で、触れた場合に高い数値が返ってきていましたので気づきませんでした。)

ArduinoからRaspberry Piへのセンサーデータ送信

FabbotかんちゃんのArduino部分にかかれていたのはもともとこちらのコードでした。


このコードに8番ピンの値を返すコマンドを追加すれば、Arduino部分のセンサー取得はできるようになります。
プログラムの後半にあるswitch文に対して、今回の場合"@"の場合を追記しています。


      case '@':
          pinMode(8, INPUT);
          Serial.println(analogRead(8));
          break;

真面目にやれば、特定のポートのピンの値を読みだす、あるいは出力にあたるdigitalWriteにも対応するようにすると汎用的ですし、別の設計方法としてはこちらのFirmataを予め書き込んでおくとRaspberry Piだけのコードで済むのかもとは思っています。

書き込んだらArduino IDEのシリアル通信で"@"を送信し、実際の値が帰ってくるかをチェックしました。(このときのボーレートは9600bpsです。)

Raspberry Piのサーバ対応

かんなちゃんはPC側からのScractchで操作できるようになっていますが、どのような仕組みを探るためRaspberry Piにログインして見ますと、ScratchServer1.0.rbというファイルが/home/piにあり、これが起動時にサーバとして動いていることが分かります。
JSONを受け付け、そのデータの中のactionというキーをコマンド名としてかんなちゃんをウィンクさせたり、首を動かしたりする仕組みになっていました。

さきほどのArduinoの方で"@"をセンサー値取得のために割り当てましたから、逆にこのサーバが"@"をArduinoに送るコマンドを追加してあげれば良いです。
具体的には、ScratchServer1.0.rbのRubyのcaseに以下を追記しました。

        when 'sensor' then
          puts sp.write('@')
          sleep(0.01)
          ret = sp.gets
          sock.write(ret)
          sleep(0.01)

ファイル編集後はこのプロセスを終了するなり、Raspberry Piを再起動させてください。

Raspberry Piと繋がるPCからのArduinoのセンサーデータ取得

サーバ部分が対応できたら、あとはPC上から直接以下のコードでデータを取得できました。取得だけではなく、特定の値より圧力センサーが強いと音声ファイルを再生するようになっています。(ただしPC上から)

# coding: utf-8
require 'socket'

socket = TCPSocket.open("192.168.1.10", 51234)
loop do
  socket.write "{\"action\":\"sensor\"}\r\n"
  socket.flush
  begin
    sensor = socket.gets.to_i
    puts sensor
    if sensor > 100
      socket.write "{\"action\":\"eye\", \"arg\":255}\r\n"
      `afplay hogehoge.m4a`
    else
      socket.write "{\"action\":\"eye\", \"arg\":0}\r\n"
    end
  socket.flush
  rescue
    nil
  end
end
socket.close

試せていませんが、かんなちゃんの動くRaspberry Pi上でもIPアドレスを変えれば動きますから、起動時に実行するようにすればかんなちゃん以外に外部のPCを必要としなくなりますね。

コメント

このブログの人気の投稿

ESP8266で書き込めない時に対処したこと

ESP8266のチップで書き込めなかった問題が起こり、それについての対処を参考になる可方がいるかもということでブログにもメモとして残しておきます。 書き込みで失敗したケースとしては、 スイッチサイエンスさんのESP-WROOM-02ピッチ変換済みモジュール《シンプル版》 へのシリアル通信での書き込みができなかった問題 Over The Air(OTA)の機能を使うコードを、同じくESP-WROOM-02に対して転送するも、更新の途中でクラッシュし、書き込みが失敗するという問題 の二つです。 OTAまで使って書き込もうとしている背景は、ニャンパスとして Robip というプログラミング学習環境を作っていて、そのツールの中でWi-Fi経由での書き込み機能を対応することでスマートフォン、タブレットなどでのビジュアルプログラミングしたものが、OTA経由で電子工作のプログラミングができるようという機能があり、いくつかのESP8266を積んだモジュールへのサポートを増やそうとしたところ(ようはRobipとしての対応デバイスを広げたかった)上記の書き込みできない問題にぶつかりました。 Facebookのこちらに書いたことの詳細版です。 ESP-WROOM-02への書き込み出来ない問題 もともと、HaLake KitというコワーキングスペースHaLakeオリジナル基板は、ESP8266を積んでいますので、この書き込みツールとしてClojureで書いた robip-tool というのを用意していました。 このツールであればHaLake Kitには書き込めていたのですが、ESP-WROOM-02ピッチ変換済みモジュール《シンプル版》ですと最初の書き込みの段階で失敗することが分かりました。 そこで世界中で人気のESP8266ですので、色んなバージョンの書き込みツールがありまして、書き込みに成功するツールを探す旅が始まりました。 その際には、シンプル版だけでなく、HaLake Kit、ESPr Developer(ESP-WROOM-02開発ボード)、ESP-WROOM-02ピッチ変換済みモジュール《フル版》でも試して、全てで動くツールを検証しました。 途中、Go言語で書きなおしてみたりいろいろテストもしたのですが、結果的に全て

ClojureScriptとBLE

2017年Clojure Advent Calendar 15日目の記事として書きました。 今年、ニャンパスとして、またプライベートでいろいろとBLEを扱うコードをClojureScriptで書きましたので、まとめてみます。 使用したデバイスは、micro:bitです。秋葉原や通販等で手に入り、BLE、25個のLED、加速度センサーがついている学習用のボードです。ブラウザ上でビジュアルプログラミングでの開発ができたりと面白いので、年末年始に遊んでみてください。 ClojureScriptでの環境の作り方から始まって、micro:bitとPCとの接続、リモートでのLチカを試すというIoTなClojureScriptの内容となってます。 1. ClojureScriptで、BLEな環境を作る Node.js、npm、Leiningenを入れておいてください。プロジェクトを作ります。   $ lein new figwheel-node ble figwheel-nodeテンプレートを使い、できたファイルはこんな感じです。 ./project.clj ./README.md ./package.json ./.gitignore ./src ./src/ble ./src/ble/core.cljs ./dev ./dev/user.clj 今回、PC側をBLEのセントラルとして振る舞わせ、micro:bitをペリフェラルとして操作しますので、そのためセントラル側のプログラムとしてnobleというライブラリを使います。 OS毎に依存するものが違いますので、サイトで事前に確認しておいたほうが良いです。    https://github.com/sandeepmistry/noble ※nobleはMac、Linux、Windows、FreeBSDをサポートしており、 僕自身今年nobleを使ったコードをClojureScriptを使って、Windos、Mac、Linuxそれぞれで動かしていて動作は安定していました。 では、nobleを以下のコマンドを実行しておきます。   $ npm install noble ※普段はlein-npm等を使

ClojureでCompojureを使わずにサーブレットを書く方法

Clojureでgen-class、proxyを使ってみようと思い、試しにサーブレットを書くとどうなるかを試してみました。 コンパイルにLeiningenを使うためプロジェクトを作ります。 lein new sample-servlet まずはsrc/sample_servlet/servlet.cljを書いてみます。 (ns sample_servlet.servlet (:gen-class :extends javax.servlet.http.HttpServlet)) (defn -servlet [this request response] (.setContentType response "text/html; charset=UTF-8") (let [out (.getWriter response)] (.. out (println "<html><body>hello world</body></html>")))) (defn -doGet [this request response] (-servlet this request response)) 依存関係とクラスファイル生成のオプションを与えたproject.cljファイルを作りました。 (defproject sample-servlet "1.0.0-SNAPSHOT" :description "FIXME: write" :dependencies [[org.clojure/clojure "1.1.0"] [org.clojure/clojure-contrib "1.1.0"] [javax.servlet/servlet-api "2.5"] ] :namespaces [sample_servlet.servlet]) 必要なライブラリを取得しコンパイル。 lein deps lein compile 無事生成されたことが分かります。 % ls -lr