Quantcast
Channel: はじめての電子工作超入門 – Device Plus –デバプラ
Viewing all 58 articles
Browse latest View live

改めてArduino基礎入門!電子工作初心者のためのまとめ(前編) ~ はじめての電子工作超入門 特別編

$
0
0

image03

 

これまで、Arduinoを使った電子工作のアレコレをしてきた本連載。改めてArduino(アルディーノ?アルドゥイーノ?アルデュイーノ?)を始めようと思った方に向けて、ここいらでいっちょベーシックをまとめてみます! 誰でもきっと、これを見れば何かが作れる!基礎体力が身につく!(はず!)

・・・

それでは改めて……、みなさんは「電子工作」と聞くとどんなイメージを思い浮かべるでしょうか?

中学校などで体験したハンダ付けや、なんか小さい部品をちまちまといじって地味だなあなんて思っていたりしますでしょうか? 確かに、ちょっと昔までは電子工作は始めるまでの敷居の高さからか、なかなか周りに電子工作してるよ!という人は多くはありませんでした。しかしここ最近、電子工作は非常に盛り上がっています!

「そんなこと知ってるワイ、だからこのページに来たんや〜」という方、もうちょっとお付き合いください。電子工作が盛り上がっている背景としては、ここ数年の間でパソコンに電子工作の母体となる「マイコン」をつなげてセンサーやモーターなどのパーツを誰でも容易に扱うことができるようになり、気軽に電子工作を楽しむことができるようになったことがあります。また、昨今IoT(Internet of Things)というキーワードの盛り上がりを下支えするArduino、Raspberry Pi、mbed、Edisonなどの数百円~数千円で購入できるマイコンのラインナップが充実してきたことと、Wi-FiやBluetooth、3G通信など他のデバイスと連携できる通信機能も備わってきたことが大きな要因になっています。未来はすでに現れている、と言っていいと思います。あとはアナタが何かを作り出すだけ!

言い換えれば、今や電子工作は、「新しい未来を作り出すスキル」です。このスバラシキ電子工作の世界に、あなたも飛び込んでみませんか?

目次

1. 電子工作ができるとこんなものが作れる

2. Arduinoにまずは入門したい方(初心者向け)

2-1. Arduinoを始めてみる

2-2. センサーで値を入力してみる

2-3. 色々なパーツを使ってみる(スピーカー、超音波モジュール etc…)

2-4. Arduinoの電源について考える(アダプタ、電池駆動、ソーラーパネルetc…)

 

1. 電子工作って? なにができる?

本連載で紹介しているArduinoをはじめとして、ラズベリーパイやmbed、さらには最近話題のVRで当時話題になったOculus Riftやジェスチャー入力が可能なKinectセンサーなど電子工作を取り巻くハードウェアの世界の紹介です。

006

第1回 日常生活をも変える「電子工作」はここまで進化したっ!

本連載で紹介するマイコン「Arduino」をはじめとして電子工作を取り巻く昨今の状況を紹介しています。電子工作ができるとどういうことができるのか、何はともあれ知りたい方はまずこの記事をご覧ください。

 

2. Arduino、どこから始める? Arduino入門の入門

2-1. Arduinoを始めてみる

すぐArduinoを触ってみたいという方はこの記事を。基礎の基礎、プログラミングの世界でいうところの「Hello world!」、LEDをチカチカ(通称:Lチカ)させる恒例の儀式から、Arduinoのプログラムの書き方、ソフトウェアの説明など、一通りの手順を紹介しています。

image02

第2回 Arduinoでお手軽電子工作:LEDを光らせてみる

Lチカを通じてArduinoの開発の一連の流れを知ることができます。ArduinoにLEDを直接さしていますがこのやり方は通常はNG。なんでNGなのかも実際に体感しながら紹介していきます。

 

image05

第3回 電流、電圧?抵抗器?オームの法則って?

電子工作で回路を作る際に必ず使うのが「抵抗器」。その使い方や、学校で学んだ電流・電圧をArduinoでどう扱うかなど紹介しています。

 


image11第4回 Arduinoのスケッチ〜プログラムを触ってみよう

Arduinoはソフトウェアとハードウェアの両面の開発が必要です。この記事ではArduinoのプログラムの基本的な書き方や処理の流れを紹介しています。

 

2-2. センサーで値を入力してみる

Arduinoの基本がわかってきたら次にデータの入力・出力という観点(Input/Output = I/O)で使い方を学んでいきます。

image04

第5回 光センサーでArduinoへの入力を試してみる!

光の明るさに応じてLEDを光らせたり消したりします。ここでは、光センサーを使ってセンサーからの入力・LEDへの出力を通じて、Arduinoにおける入出力の基本、アナログとデジタルの違いなどを紹介しています。

 

image13

第9回 Arduinoで作る簡易百葉箱(その3)湿度センサーの習得、そして電池で動かしてみる。

この記事の前半で温度センサと湿度センサの使い方を紹介しています。センサーにはそれぞれ仕様があり、その仕様をどう解釈してプログラムに落とし込むかを学びます。

 

2-3. 色々なパーツを使ってみる(スピーカー、超音波モジュール etc…)

センサーの使い方やArduinoにおけるデジタル・アナログの違いなどもわかってきたら、さらにいろいろなパーツを使ってみましょう。ここでは、スピーカーで音を出したり、超音波モジュールで距離を計測したりなど、パーツとアイデア次第で広がるArduinoの世界をご紹介。

image07

第19回 Arduinoでパーツやセンサーを使ってみよう~スピーカー編(その1)

スピーカーの鳴る仕組みから始まり、スピーカーとスイッチを使ってArduinoで簡易電子ピアノを作ってみます。

 

image00第17回 Arduinoでパーツやセンサを使ってみよう~加速度センサ編(その1)

XYZの傾きを検出できる加速度センサを使って常に水平を保ち続けるデバイスの作成にチャレンジです。これはカメラなどのカメラジンバルで応用されている技術ですね。→デバイス作成は成功したのでしょうか!?

 

image08第8回 Arduinoで作る簡易百葉箱(その2)。電光掲示板(7セグメントLED)を使って数値を表示。

Arduinoで数値などをPC上のシリアルモニター以外で表示する方法の一つである7セグLEDの使い方をご紹介。

 

image12第16回 Arduinoでパーツやセンサを使ってみよう~超音波モジュール編

距離を測ることができる超音波モジュールを使った簡易距離計測デバイスを作成してみました。センサーの値を正確に測るために、温度センサーなどとの組み合わせをするなどの工夫をしています。

 

image09第15回 Arduinoでパーツやセンサを使ってみよう~フォトリフレクタ編

距離を測ることができるのは超音波モジュールだけではない!数cm以内の近距離ならフォトリフレクタという選択肢も。このフォトリフレクタ、なんと人間の脈拍も測ることができちゃうのです。

 

2-4. Arduinoの電源について考える(アダプタ、電池駆動、ソーラーパネルetc…)

Arduinoで開発をしていて、部品などが増えたりPCなしで動かしたいと考えたときに、Arduinoの電源をどうするか、ということが非常に重要になってきます。ここではそのArduinoを動作させるための電源についての記事を紹介していきます。

image10第9回 Arduinoで作る簡易百葉箱(その3)湿度センサーの習得、そして電池で動かしてみる。

Arduinoは常にPCと接続しておかなくてもいいんです。この記事では9V電池やアダプターに接続してArduinoを動かす方法をご紹介。Arduinoの動作に必要な電圧や電流について解説しています。

 

image01第25~27回 Arduinoでパーツやセンサーを使ってみよう~ソーラーパネルでArduinoを動かしてみる(前編中編後編

自然エネルギーの代名詞とも言えるソーラー発電。ソーラーパネルでArduinoを動かすことができたら、電池もアダプターもいらずに永久に動かすことができるはず…。そんな期待をもってソーラー駆動に取り組みます。

 

まとめ

電子工作に興味がある、Arduinoをまずは始めてみたい、という方に向けて、Arduinoの基礎知識から入門編と言える部分を、これまでの振り返りとともにご紹介しました。次回も引き続き、そのベーシックな使い方をまとめていきます!

関連リンク:改めてArduino基礎入門!電子工作初心者のためのまとめ(後編)


改めてArduino基礎入門!電子工作初心者のその次は(後編) ~ はじめての電子工作超入門 特別編

$
0
0

P1190984

これまで、Arduinoを使った電子工作のアレコレをしてきた本連載。改めてArduino(アルディーノ?アルドゥイーノ?アルデュイーノ?)を始めようと思った方に向けて、ここいらでいっちょベーシックをまとめてみます! 誰でもきっと、これを見れば何かが作れる!基礎体力が身につく!(はず!)

後編はちょっとArduinoと仲良くなってきてもっと楽しむにはどうすれば!?という内容です。

関連リンク:改めてArduino基礎入門!電子工作初心者のためのまとめ(前編)

目次

1. ちょっとArduinoが触れるようになってきた方

1-1. Arduinoの「ライブラリ」でさらにパーツを使いこなせ!

1-2. 色々なモーターを動かしてみる(モーター、サーボモーター、ステッピングモーター etc…)

1-3. Arduinoをネットワークにつないでみよう(イーサネットシールド etc…)

1-4. センサ評価キットを使ってみる(ロームセンサ評価キットによる8種のセンサ)

2. IoTの世界に踏み入れてみる

2-1. スマホやAPIと連携~Arduinoで様々な通信方式や関連ボードを試す(3G通信、Lazurite、ESP-WROOM-02 etc…)

 

1. ちょっとArduinoが触れるようになってきた方

Arduinoの基本的なプログラムや簡単な回路が作れるようになってきた方へ、さらに自分のやりたいことを実現させる手助けとしてライブラリや、さまざまなシールド・パーツを知ることでさらにArduinoの世界を深めることができます。

1-1. Arduinoの「ライブラリ」でさらにパーツを使いこなせ!

Arduinoには「ライブラリ」といって、あるまとまった機能群を持つ関数などが入ったプログラムを読み込んで利用することができます。パーツやシールドによってライブラリも一緒に配布されていることが多いので、そのライブラリを使うことでプログラムを最初から書く必要がなく手軽に開発ができるようになります。

download

第20回 Arduinoでパーツやセンサーを使ってみよう~スピーカー編(その2)

オープンソースのライブラリMozziを利用して、音の波形をプログラミングで操ってみたいと思います。本記事ではArduinoでライブラリを利用する際の基本的な流れを紹介しています。

 

aff2ecccb5b083a6d0a5302f428381e7

第21回 Arduinoでパーツやセンサを使ってみよう~SDカード編(その1)

センサーで取得したデータをSDカードで保存するための方法を紹介。SDカードもライブラリを使うと手軽に操作ができちゃいます。

 

P1190247

第23回 Arduinoでパーツやセンサーを使ってみよう~赤外線リモコン(前編)

Arduinoで赤外線リモコンデバイスを作成する方法をご紹介。実際にテレビなどの規格に従って赤外線信号を出力することで、Arduinoを通してテレビの操作をしてみます。

 

1-DSC_1733

第50回 フルカラーLEDテープを使ったちょっとお洒落な電子工作 〜Arduinoでパーツやセンサーを使ってみよう

最近イルミネーションでもよく見られるようになってきたフルカラーLED。フルカラーLEDテープもライブラリを利用すれば手軽に1つ1つのLEDを制御することができます。

 

1-2. 色々なモーターを動かしてみる(モーター、サーボモーター、ステッピングモーター etc…)

男のロマン「モーター」。LEDで光ったりセンサーで値を操作するのもいいけどやっぱり動く実感を何よりも感じられるのがモーター制御。ラジコンカーの操作や、ロボットなどさまざまな用途で利用されるモーターの種類と使い方の紹介です。

2014-10-024

第11回 Arduinoでモーターを制御する!(その1)モーターの基本を勉強してみる

Arduinoでモーター制御を知るならまずこの記事。Arduinoから出力される電流はそのままだとモーターを動かすには不足します。モーターのための外部電源を用意しつつ、Arduinoでモーターを動かすための方法をご紹介。

 

8463012988a073d29281fe685ad2a916

第12回 Arduinoでモーターを制御する!(その2)モータードライバって何?

モーターの速度や回転方向などさらに細かにモーターを制御したい場合に利用するのがモータードライバ。本記事ではモータードライバの使い方について紹介します。

 

2014-12-04-18.35.15

第13回 Arduinoでモーターを制御する!(その3)。自作ラジコンカーに挑戦!サーボモーターでステアリング実装。

サーボモーターは色々な種類があるモーターの中でロボットの関節などで使われていて、指定した角度に回転させることができるモーターです。ここでは、ラジコンカーのステアリング部分にサーボモーターを利用して使い方を学んでみます。

 

1-P1220657

第37回 ステッピングモーターの基本(前編)〜Arduinoでパーツやセンサーを使ってみよう

通常のモーターやサーボモーターよりもさらに綿密に回転角度や回転速度を制御することができるステッピングモーターの使い方を本記事では紹介しています。前編に続き、中編後編では3Dぷり実際に2輪走行ロボットを作ってみます。

 

1-3. Arduinoをネットワークにつないでみよう(イーサネットシールド)

センサーでデータを取得したらそれをインターネットにつないでみてみたいと思いませんか?ここでは、ArduinoにLANケーブルが接続できるイーサーネットシールドを使って、Arduinoでインターネット上からデータを取得したり、逆にArduinoをサーバーとして利用する方法を紹介していきます。

DSC_1057-e1407334746110

第6回 Arduinoを使ってWebサーバーをつくろう!

イーサネットシールドを使ってArduinoをWebサーバー化する方法を、サーバーに接続すると光センサで取得した数値が確認できるまでの流れとともにご紹介。

 

2014-10-09-17.36.44

第7回 Arduinoで作る簡易百葉箱(その1)。

イーサネットシールドと光センサや温度センサなどを組み合わせて簡易百葉箱の作成を第4回(その2その3その4)に分けてご紹介。

 

1-4. センサ評価キットを使ってみる(ロームセンサ評価キットによる8種のセンサ)

Arduinoで開発や実験をする際に、たくさんのセンサーを扱うとセンサを動かすための電源や、パーツなどが多くなり、回路の作成が大変になってきます。また、プログラムもセンサーごとで違うため、なかなか煩雑になりがちです。ここではローム社から発売されている8種類のセンサを手軽に使うことができる「センサ評価キット」の使い方、それを使ったデバイス作成の例を紹介します。

DSC_0086-1024x576

これを読めばローム・センサ評価キットで何ができるかわかる!〜Arduino+センサの開発が劇的に楽になる!ローム・センサ評価キットを試してみた

センサ評価キットに付属されている8種類のセンサの紹介と、通常のセンサ部品を使った開発の時でどういう点が違うのか、どんなものが作れるかなど、まずセンサ評価キットがどういうものか?ということを知りたい方にお勧めします。

 

1-P1220662

第40回 Arduinoでセンサを使った開発が劇的に楽になる!8種のセンサを持つロームセンサ評価キットを試してみた(導入&地磁気センサ編)

センサ評価キットの基本的な知識、センサ評価キットシールドの使い方やライブラリのインストール方法などをご紹介。さらに地磁気センサを使ってプログラム実装〜動作確認までの流れについて学んでみます。応用編では地磁気センサを使った「常に北を向き続けるだけのデバイス」の作成にチャレンジです。

 

1-P1220993

第43回 複数のセンサを組み合わせた照明デバイス制作に挑戦! 〜Arduino+センサの開発が劇的に楽になる!ローム・センサ評価キットを試してみた

センサ評価キットで複数のセンサを組み合わせて使う方法をご紹介。本記事ではカラーセンサ、温度センサ、気圧センサを利用して環境によって色や光り方が変わる照明デバイスの作成に挑戦しています。

 

DSC_1494-1024x576

第49回 加速度センサとTFT液晶パネルを使ったゲームを作ってみる! 〜Arduino+センサの開発が劇的に楽になる!ローム・センサ評価キットを試してみた

加速度センサとTFT液晶を利用して、ゲームなどで応用できる傾きを検出してグラフなどで表示してみる方法を紹介しています。

 

2. IoTの世界に踏み入れてみる

IoT(Internet of Things)とは、直訳すればモノ(Things)のインターネット(Internet)という意味のごとく、パソコンやスマホに限らず、家電や家具、生活雑貨などなど私たちの日常を取り巻くあらゆるモノがインターネットにつながる、そんな世界を言います。Arduinoも無線LANや3G回線を手軽に使うことができるシールドやパーツが出てきたり、ArduinoのIDEで開発が可能な小型で互換性のあるマイコンチップなどの登場でArduinoを使ってIoTの世界を感じることもできるようになってきました。

2-1. スマホやAPIと連携~Arduinoで様々な通信方式や関連ボードを試す(3G通信、Lazurite、ESP-WROOM-02 etc…)

P1210126-2

第35回 Arduinoマイコンとしても使える小型WifiモジュールESP-WROOM-02を使ってみる(Arduinoでwifi利用編)

Wi-Fi機能がついてArduinoプログラムが書き込めるESP-WROOM-02ボードの基本的な機能やスペックの紹介、またこのボードを使ってWi-Fi通信をする流れを紹介しています。(ESP-WROOM-02をArduinoとして使うための準備編はこちら)

 

02-e1438089293188

番外編① XOceanを使ってみた〜ArduinoとEnOceanを使用した温湿度表示

スイッチのオンオフや室内の照明の光などの微力なエネルギーで発電して無線信号を飛ばすEnOcean通信が可能なXOceanの使い方を番外編としてご紹介。

 

DSC_2350

第52回 SORACOM Airを使ってArduinoで通信できる?〜Arduinoで3G通信をする方法

Arduinoと3GIM×SORACOMのSIMを組み合わせて3G通信をする方法をご紹介。IoTに欠かせないデバイスに搭載されたセンサでデータを取得 → インターネット上のストレージに保存という基本的な流れを学びます。そして簡単なデータロガーを作成します

 

P11909561

第28回Arduino互換ボードのラズライト(Lazurite)で省電力を実現!

IoTには欠かせない、いかに省電力でデバイスを動かすかということ。Lazuriteボードでは、Arduinoに比べてものすごく省電力で動作させることができるボードなので、その使い方や開発方法などの流れを紹介します。

 

まとめ

今回は前回に比べて、Arduinoをもっと深くより実践的に楽しむための記事のまとめでした。ここまでArduinoを扱えるようになればあとは皆さんがこれは実現したい!というものを掘り下げて作っていく流れになるかと思います。回路雅に強い人、プログラムに強い人、Arduinoをさらに深めていくには知識や経験、そして何を作るか、作りたいかというアイデアや興味が重要になってきます。このまとめでは、少しでもそんな方たちの支えになれば幸いです。

 

第57回 Arduinoでモーター再入門(その1)サーボモーターの基本

$
0
0

DSC_0093

Arduinoで電子工作をするならやはりモーターは外せない部品です。これまで、連載の中でもいくつかモーターを扱ってデバイスなどを作成してきましたが、今回はおさらいの意味を込めて、特に利用頻度が高いと思われるサーボモーターの基本から詳しい使い方までじっくりと腰を据えて取り組んでみたいと思います。

目次

  1. サーボモーターってなに?
  2. サーボモーターの購入時のポイント
    1. トルクの計算について
  3. 必要な電圧と電源
  4. Arduinoのプログラムでサーボ制御
  5. まとめ

1. サーボモーターってなに?

写真1 サーボモーター

写真1 サーボモーター

サーボモーターはモーターの一種で、通常のモーターと違い、主に回転角度を指定して回転させる使い方を基本とするため、様々な工場で利用されているほか、ホビー用途ではロボットの関節や、ラジコンのステアリングなどに利用されています。

サーボモーター  – wikipedia
サーボモーター(Servomotor)とはサーボ機構において位置、速度等を制御する用途に使用するモーターである。モーターの種類としては、「電動機」、「油圧モーター」など、特定のモーター形式を示すものではない。しかし、現在は、ロボット用途などに使用される「検出器付の電動機」で、フィードバック制御するものが一般的である。

wikipediaにもあるように、サーボモーターは通常のモーターに回転角度を検出する機能がついていて、その信号を通信することができるため、回転角度を制御することが可能です。また、サーボモーターと第37回で出てきたステッピングモーターなどとの違いをおさらいしてみると

  • モーター:電力をかけるとひたすら回る
  • サーボモーター:信号に応じて0度からN度の範囲で回転する
  • ステッピングモーター:信号に応じてモーターを制限なく制御できる
  • ブラシレスモーター:安定した回転速度などの制御が可能(ドローンなどで利用されています)

となります。ですので、上記の用途に応じてモーターを使い分けることが重要です。

写真2 色々なモーター(左からブラシレス、ステッピング、サーボ、通常のモーター)

写真2 色々なモーター(左からブラシレス、ステッピング、サーボ、通常のモーター)

 

2. サーボモーターの種類と購入時のポイント

実際にサーボモーターを使う場合、どのサーボモーターを購入したら良いでしょうか?サーボモーターを購入する際の基本ポイントとしては、

  • トルク:モーターを動かす力、数値が大きければ大きいほど強い力になる(単位はkgf・cmなど)
  • 回転角度(制御角):モーターを表示されている角度まで回すことが可能
  • 動作速度:モーターを回転させるスピード
  • 動作電圧:動作させるための必要な電圧

基本、上記のポイントを抑えておけば、用途に応じたサーボモーターを手に入れることができると思います。

 

2.1 トルクの計算について

サーボモーターを扱う上で、もっとも大事なことはどれくらいの力で動かせるか(どれくらいのトルクが必要か)ということです。トルクは購入時にはkgf・cmやkgのみの単位で示されます。トルクの計算方法としてはkgf・cmの場合は1[cm]先でN[kg]のものを持ち上げられる力ということになります。例として5kgのものを持ち上げたい場合、サーボモーターの軸についている柄が2cmだと、5kgf × 2cm = 10kgf・cm以上のトルクが必要になります。

図2 トルクの計算方法

図1 トルクの計算方法

 

3. 必要な電圧と電源

サーボモーターをArduinoで動かす場合、他のモーターと同様にArduinoから取り出せる電圧や電流だと足りない場合がほとんどです。その場合は、外部に電源をとって、角度の制御信号のみArduinoから送信してサーボモーターを制御してください。本連載でよく利用しているArduino UNO R3ではI/Oピン(デジタル・アナログピン)は1つのピンから流せる電流が大体20mA(40mA以上流すと壊れる可能性)なので、サーボモーターの動作電圧が5Vでも、デジタル・アナログピンからの供給は電流が不足するためサーボモーターやArduinoが壊れたり、サーボモーターは動くが力が非常に弱いなどといった現象になりますので、利用する際には注意が必要です。ただし、5Vや3.3Vピンは絶対最大定格電流値(これ以上は流せない電流値)が200mAとなっているので、小さいサイズのサーボモーターは利用することが可能です。

例として、動作電圧が9Vのサーボモーターの場合は下記のような回路図でサーボモーターにArduinoとは別に電源を供給する必要があります。

図3 Arduinoとサーボモーターの回路

図2 Arduinoとサーボモーターの回路

また、サーボモーターの動作電圧が5Vなどの小さい場合で、Arduinoと電源を共用したい場合、下記のような回路で5Vから電流を引っ張ることが可能です。

図4 Arduinoとサーボモーターの電源を一緒に供給

図3 Arduinoとサーボモーターの電源を一緒に供給

 

 

 

4. Arduinoのプログラムでサーボ制御

サーボモーターの制御には、Arduinoの場合、ざっと2種類の方法があります。サーボモーターは本来PWMというパルス信号をオンオフしてモーターを制御する方法です(ステッピングモーターの回でも紹介)。PWMで直接サーボモーターを制御すると細かな動作の表現なども可能になりますが、プログラムとしては少し難易度が高くなるため、Arduinoで用意されているサーボモーター用のライブラリを利用することをお勧めします。

Arduino IDE – [ファイル] – [スケッチの例] – [10.StarterKit BasicKit] – [p05_ServoMoodindicator]

このサンプルでは、アナログ0番ピン(A0)の入力値をもとにサーボモーターの角度を変えることができるプログラムになっています。アナログピンにはボリュームスイッチなどの可変抵抗や光センサなどを利用することで、数値が変化した際にサーボモーターも動くようにしてみてください。

サーボモーターライブラリの関数

サーボモーターのライブラリはサーボモーターに送る制御信号のピン番号の指定と、サーボモーターを動かす際の角度指定の2種類の命令が基本となります。

myServo.attach(9); //サーボモーターの信号ピンを指定
myServo.write(angle); //サーボモーターを指定の角度(angle)まで動かす

下記の回路はFEETECH FS90 マイクロサーボを使った例です。このサーボモーターの動作電圧は6V、動作時の電流は200mAなのでサーボモーターの電源は単3電池を4本直列(6V)にしたものを利用します。

図4 サンプルスケッチの回路

図4 サンプルスケッチの回路

 

写真4 サーボモーター制御回路

写真3 サーボモーター制御回路

 

 

図4 サーボモーターのexample

図4 サーボモーターのexample


/*
Arduino Starter Kit example
Project 5 - Servo Mood Indicator

This sketch is written to accompany Project 5 in the
Arduino Starter Kit

Parts required:
servo motor
10 kilohm potentiometer
2 100 uF electrolytic capacitors

Created 13 September 2012
by Scott Fitzgerald

http://www.arduino.cc/starterKit

This example code is part of the public domain
*/

// include the servo library
#include <Servo.h>

Servo myServo; // create a servo object

int const potPin = A0; // analog pin used to connect the potentiometer
int potVal; // variable to read the value from the analog pin
int angle; // variable to hold the angle for the servo motor

void setup() {
myServo.attach(9); // attaches the servo on pin 9 to the servo object
Serial.begin(9600); // open a serial connection to your computer
}

void loop() {
potVal = analogRead(potPin); // read the value of the potentiometer
// print out the value to the serial monitor
Serial.print("potVal: ");
Serial.print(potVal);

// scale the numbers from the pot
angle = map(potVal, 0, 1023, 0, 179);

// print out the angle for the servo motor
Serial.print(", angle: ");
Serial.println(angle);

// set the servo position
myServo.write(angle);

// wait for the servo to get there
delay(15);
}

 

まとめ

今回、改めてサーボモーターの基本をおさらいしました。次回は、実際にいろいろなサーボモーターを使ってどんなことができるのかを考えてみたり、これまでの連載で未完成だったあのデバイス(!?)を完成に向けて取り組んでみたいと思います!

 

■関連記事

第58回 Arduinoでモーター再入門(その2)サーボモーターを遠隔で制御する!

$
0
0

2017-04-24 06.29.02

サーボモーターを改めて理解する企画、第2回です!

Arduinoで電子工作をするならやはりモーターは外せない部品です。これまで、連載の中でもいくつかモーターを扱ってデバイスなどを作成してきましたが、今回はおさらいの意味を込めて、特に利用頻度が高いと思われるサーボモーターの基本から詳しい使い方までじっくりと腰を据えて取り組んでみたいと思います。

前回の その1サーボモーターの基本 では、そもそもサーボモーターとは何か、どう動かすのか、という基本をおさらいしました。今回の記事では、さらに一歩踏み込んで、少し実用的なものを作ってみます。

目次

  1. サーボモーターでできること
  2. 組み合わせると可能性が広がる
  3. 遠隔でサーボモーターを操作する
  4. まとめ

1.サーボモーターでできること

サーボモーターでできることをおさらいしてみます。

まず、1つのサーボモーターでできることはどんなことがあるか見てみましょう。代表的な動作は、下記の二つでしょうか。

ボタンを押す

サーボモーターはその動作の角度を制御できます。というわけで、なんといってもボタンを押す機構を作るにはサーボモーターが最適です。下記の動画のような面白いデバイスを作ることもできますし、部屋のスイッチを押したり、カギをあけたり、ボタンを押すという動作ができるだけでいろいろなことができますね。

 

ものを動かす

第13回ではLEGOを使ったラジコンカーを製作しましたね。そこではステアリングの部分をサーボモーターを使って実装しました。

1つのサーボモーターだけだと操作の応用があまりないかもしれませんが、いろいろなパーツと組み合わせると世界が広がります!

 

2.サーボモーター実践編 組み合わせると可能性が広がる

実践編として、照明のスイッチを押す機械を作ってみたいと思います! Arduino+サーボ+3Dプリンター+Wi-Fiモジュールを組み合わせて実用的なものにしてみます。

まずは、せっかくなので、シンプルなスイッチを押すパーツを3Dプリンターで作ってみました。

今回使うサーボモーターは、これまで連載で使っていたものよりもトルクの強いMG996Rというサーボモーターを使います。このサーボモーターはトルクが9.4Kg、動作電圧は4.8~6.6Vとなっています。ほかの技術との組み合わせ、ということで今回は第3236回で利用したESP-WROOM-02のwifiと組み合わせて、PCやスマホからサーボモーターを動かしてスイッチを操作できるようにしてみます。

スイッチを押すためのパーツ

スイッチを押すためのパーツ

 

3Dプリンターで出力中

3Dプリンターで出力中

これで部屋のスイッチを押してみます。

部屋のスイッチ

部屋のスイッチ

 

サーボモーターにパーツの取り付け

サーボモーターにパーツの取り付け

部屋のスイッチに取り付け

部屋のスイッチに取り付け

部屋のスイッチへの取り付けは、壁紙が傷まないようにはってはがせるテープを利用。

はってはがせるテープ

はってはがせるテープ

準備ができたところで、さっそくスイッチオンの確認!

おぉ、スイッチが無事押されました。……んがしかし、このタイプのスイッチだとオン・オフができません。スイッチのオンオフができるように、両方を押せるようにします(早く気付け!)。

スイッチのサイズを計測

スイッチのサイズを計測

スイッチの幅を計測します。約4cmということで、4cm内の両脇にボタンがおさまるようなパーツを作成すればよいということがわかりました。ということで、下記のような両端に突起がついているパーツを作成しました。

両端を押せるパーツ

両端を押せるパーツ

 

サーボに取り付け

サーボモーターに取り付け

サーボモーターの取り付けが完了したら、次は離れた場所でも通信できるようにESP-WROOM-02にプログラムを書き込んでいきます。

2017-04-24 07.32.26

3.遠隔でサーボモーターを操作する

次に、このメカを部屋に設置されている無線ルーターにつないで、取得したIPアドレスをもとに、サーボモーターを操作できる機能を提供できるようにします。

今回、ESP-WROOM-02に電源が入ったとき、無線ルーターからIPアドレスを取得したあと、取得したIPアドレスをメールで伝えるための、外部APIをたたくための、報告用サーバー設定をできるようにしました。このIP報告用サーバー設定に、それぞれ作成した通知用のアドレスを利用することができます。(通知にIFTTTを使ってみるのもいいかもしれません)

#include <ESP8266WiFi.h>
#include <Servo.h> 

const char *ssid = "[wifi_ssid]";
const char *password = "[wifi_password]";

//IP報告用サーバー設定
const char* host = "xxxx.xx.xxx";
String url = "/xxxx/";
 
Servo myservo;
Servo myservo2;

WiFiServer server(80);

String IpAddress2String(const IPAddress& ipAddress)
{
 return String(ipAddress[0]) + String(".") +\
 String(ipAddress[1]) + String(".") +\
 String(ipAddress[2]) + String(".") +\
 String(ipAddress[3]) ; 
}
 
void setup() {
 Serial.begin(115200);
 delay(10);
 
 Serial.println("Start!");
 Serial.println();
 Serial.print("Connecting to ");
 Serial.println(ssid);
 
 WiFi.begin(ssid, password);
 
 while (WiFi.status() != WL_CONNECTED) {
 delay(1500);
 Serial.print(".");
 }
 Serial.println("");
 Serial.println("WiFi connected");
 
 server.begin();
 Serial.println("Server started");
 Serial.println(WiFi.localIP());

//*********************************************************
// IPアドレスの通知
//*********************************************************
 WiFiClient client;
 const int httpPort = 80;
 if (!client.connect(host, httpPort)) {
 Serial.println("connection failed");
 return;
 }
 
 url += IpAddress2String(WiFi.localIP());
 client.print(String("GET ") + url + " HTTP/1.1\r\n" +
 "Host: " + host + "\r\n" + "Connection: close\r\n\r\n");
 delay(1000);
 Serial.print("Connecting url to ");
 Serial.println(url);

//*********************************************************************

}
 
void loop() {
 WiFiClient client = server.available();
 if (!client) {
 return;
 }
 
 Serial.println("new client");
 while(!client.available()){
 delay(1);
 }
 
 String req = client.readStringUntil('\r');
 Serial.println(req);
 client.flush();

 // Match the request
 int selectServo = 0;

int posSlash0 = req.indexOf("/");
String tmp = req.substring(0,posSlash0);
int posSlash1st = req.indexOf("/",1+posSlash0);
String action = req.substring(1+posSlash0,posSlash1st);
int posSlash2nd = req.indexOf("/",1+posSlash1st);
String sel = req.substring(1+posSlash1st,posSlash2nd);
int posSlash3rd = req.indexOf("/",1+posSlash2nd);
String valueTmp = req.substring(1+posSlash2nd,posSlash3rd);
int posSpace = valueTmp.indexOf(" ");
String value = valueTmp.substring(0,posSpace);

if(action == "favicon.ico HTTP"){
 return;
}
//GET /servo/1/60 HTTP/1.1

Serial.print("POS:");
Serial.print(posSlash1st);
Serial.print(":");
Serial.print(posSlash2nd);
Serial.print(":");
Serial.println(posSlash3rd);

Serial.print("ACTION:");
Serial.println(action);
Serial.print("SELECT SERVO:");
Serial.println(sel);
Serial.print("VALUE:");
Serial.println(value);

if(sel == "0"){
myservo.write(value.toInt());
}

 
 client.flush();
 
 String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>";
 s += "<head><meta name='viewport' content='width=device-width, initial-scale=1'>";
 s += "<link href='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css' rel='stylesheet' media='screen'>"; 
 s += "<script type='text/javascript' src='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js'></script>";
 s += "</head><body>";
 s += "\r\nSERVO ";
 s += sel;
 s += " is ";
 s += String(value);
 s += "<div class='container'><div class='row'>";
 s += "<div class='col-md-12'><h3>Servo0</h3></div>";
 s += "<div class='col-md-12'><a class='btn btn-primary' href='/servo/0/0'>ON</a></div>\n";
 s += "<div class='col-md-12'><a class='btn btn-info' href='/servo/0/50'>OFF</a></div>\n";
s += "<div class='col-md-12'><a class='btn btn-info' href='/servo/0/30'>STAY</a></div>\n";
s += "</div></div>";
 s += "</body>";
 s += "</html>\n";
 
 client.print(s);
 delay(1);
 Serial.println("Client disonnected");
}

 

ということで、プログラムも書き込めたので、いざ起動!

PCからON/OFFを切り替えるとESP-WROOM-02を通じてサーボモーターを制御することができました!

 

まとめ

今回、サーボモーターを無線で動作させて部屋のスイッチを制御することができました。これを応用すれば、いろいろなことができそうですね!
(※ただしストーブなどの火気があるものの制御などは危険ですのでやめましょう)

次回は、サーボモーターを複数組み合わせて、例のブツの製作に再チャレンジ……です。ついにというかいよいよというか、筆者赤川、雪辱を晴らしたいと思います!

2017-04-24 08.52.18

 

■関連記事

第59回 Arduinoでモーター再入門(その3)サーボモーターを使ったデバイスに再チャレンジ!

$
0
0

2017-05-11 07.59.57

前回の記事では、無線LANを通じてサーボモーターを制御することができました。明らかに連載当初よりサーボモーターと仲良くなってきている実感を感じます。今回は、以前連載の第17回第18回で制作した水平カメラ台デバイスの実装に再挑戦してみます。正直に申し上げて、うまくいくかどうかはわかりません! 果たして、納得がいくものができるでしょうか……?

今回の電子工作レシピ

完成までの時間目安:60分
必要なパーツ

目次

  1. かつての生まれたての小鹿デバイス!
  2. デバイスの仕様検討
  3. 3Dプリンターによる形状作成
  4. プログラムの工夫について
  5. いざ動作!
  6. まとめ

1.かつての生まれたての小鹿デバイス!

水平カメラ台デバイス、一般的に「スタビライザー」とか「ジンバル」と呼ばれていて、昔は本格的な撮影現場などで利用されていることが多かったですが、最近ではドローン撮影やスマートフォンでも手軽に扱えるハンディタイプの製品もよく目にするようになりました。これらの製品では騒音性や速度などの面から現在ではブラシレスモーターが使われています。

写真1 スタビライザー

写真1 スタビライザー

そんなデバイスにあこがれて、第18回ではハンディタイプのデバイス作成にチャレンジしたのですが結果は下記のように、まるで生まれたての小鹿!のありさま。圧倒的な敗北です。

 

これはこれでなんとも愛嬌があるのですが、いかんせんデバイスとして機能しない時点でなんの役にもたちません。反省点は多々ありますが、明らかに使っているサーボモーターのトルクが追い付いていない感じがひしひしと伝わります。

そんなわけで、もう一度仕様を再検討しながら進めていきたいと思います。

 

2.デバイスの仕様検討

まず初めにサーボモーターの見直しです。以前利用したサーボモーターSG90は安価で手軽に使えるのは良いのですが明らかにトルクが足りてなかったです。そこで今回は、前回利用したMG996Rは動作速度は少しだけ遅くなるもののトルクが5倍近くある、このサーボモーターを利用します。

gimbal2

また、それ以外の部品は基本的にArduinoと加速度センサーになるので、これらはほぼ前回と同じ構成で進めてみます。サーボモーターが大きくなったので新たにアダプターから電源をとれるようにしました。回路については、第18回のものを参考にして制作していきます。

DSC_0360

6fab16e5322224d15f50cadcdbe6e2e4-e1424830428119

 

3.3Dプリンターによる形状作成

デバイスの形状に関しては、前回のようにホームセンターで木材や金具を購入してDIYでもよいのですが、せっかくなので3Dプリンターで出力してみます。今回、サーボモーターが大きくなったので、大きくなっても安定性を保てるようにすることと、カメラの三脚用ねじ穴を用意することで、カメラの三脚に固定しても使えて、小型の三脚につければハンディタイプでも利用できるような方向性でデザインしてみました。

7fc19c98c7fc0201d8acabfb17054d2d

最初にデザインして出力した形状です。組み立てると下記のようになります。

2017-04-24 08.52.18

これはこれで問題はなかったのですが、今回3Dプリンターの出力で利用しているABS樹脂の場合、素材が固まる際に縮みが発生してしまい、若干歪みが出てしまうことと、凹時ですべて出力すると各部品の組み立て時にねじが占めにくいなどの問題が発生してしまったため、試行錯誤した結果、下記のように2つのサーボモーターが付属する一番大きなパーツに関してはばらばらに出力することにしました。

223a656d6aef35e87cb0af86972f419c

実際に出力して、組み立てるとこんな感じになります。

2017-05-11 06.41.05 2017-05-11 06.42.25

2017-05-11 06.44.06

ケース自体はどんなカメラを載せるかなどで、載せる台は差し替えたり改良ができるようにしておきました。土台はできあがったので、次にプログラムの方を見ていきます。

 

4.プログラムの工夫について

プログラムに関しては、最初加速度センサーを実際に180度傾けて、出力される数値をもとにサーボモーターの傾き具合を調整するキャリブレーション作業が必要なので、第17回のプログラムを少し改良してキャリブレーション数値がわかりやすく出力されるようにしてみます。

 

int _maxX = 0;
int _minX = 1000;
int _maxY = 0;
int _minY = 1000;
int _maxZ = 0;
int _minZ = 1000;

//********************************
//加速度センサの値を取得するプログラム
//********************************
void setup()
{
// シリアルモニターの初期化をする
Serial.begin(9600) ;
}
void loop()
{
long x , y , z ;
x = y = z = 0 ;
x = analogRead(1) ; // X軸
y = analogRead(2) ; // Y軸
z = analogRead(3) ; // Z軸

if(_maxX < x){ _maxX = x; }
if(_minX > x){ _minX = x; }
if(_maxY < y){ _maxY = y; }
if(_minY > y){ _minY = y; }
if(_maxZ < z){ _maxZ = z; }
if(_minZ > z){ _minZ = z; }

int centerX = (_maxX-_minX)/2+_minX;
int centerY = (_maxY-_minY)/2+_minY;
int centerZ = (_maxZ-_minZ)/2+_minZ;

float rotateX = ((float)_maxX-(float)_minX)/180;
float rotateY = ((float)_maxY-(float)_minY)/180;
float rotateZ = ((float)_maxZ-(float)_minZ)/180;


Serial.print("X:") ;
Serial.print(_minX) ;
Serial.print(" ") ;
Serial.print(centerX) ;
Serial.print(" ") ;
Serial.print(_maxX) ;
Serial.print(" ") ;
Serial.print(rotateX) ;
Serial.print(" Y:") ;
Serial.print(_minY) ;
Serial.print(" ") ;
Serial.print(centerY) ;
Serial.print(" ") ;
Serial.print(_maxY) ;
Serial.print(" ") ;
Serial.print(rotateY) ;
Serial.print(" Z:") ;
Serial.print(_minZ) ;
Serial.print(" ") ;
Serial.print(centerZ) ;
Serial.print(" ") ;
Serial.print(_maxZ) ;
Serial.print(" ") ;
Serial.println(rotateZ) ;
delay(50) ;
}

f58002d4f68ba3b59c732393ea193af9

2017-05-11 06.53.15

このプログラムを動かして、シリアルモニターを立ち上げた後、センサをXY軸方向に-90度~90度までそれぞれ傾けて出力される数値を確認します。出力数値の最小値、最大値の幅を180度で割った数値が1度あたりの加速度センサーの傾き数値になるので、それをサーボモーターの動作とシンクロするようにします。

sirial

シリアルモニターで確認した数値をサーボモーターを動作させるプログラムに反映します。


//********************************
//加速度センサの値を取得するプログラム2
//********************************
#include <Servo.h>
Servo myservoX;
Servo myservoY;

void setup()
{
// シリアルモニターの初期化をする
Serial.begin(9600) ;
myservoX.attach( 5 );
myservoY.attach( 6 );
}

void loop()
{
int i ;
long x , y;
// 各データを100回読み込んで平均化する
x = y = 0 ;
for (i=0 ; i < 100 ; i++) {
x = x + analogRead(1) ; // X軸を読み込む
y = y + analogRead(2) ; // Y軸を読み込む
}

x = x / 100 ;
y = y / 100 ;

int rotateX = (x-493)/1.30; //角度を求める式
myservoX.write( 90-rotateX );
Serial.print("X:") ;
Serial.print(x) ;
Serial.print(" ") ;
Serial.print(rotateX) ;

int rotateY = (y-488)/1.23;
myservoY.write( 90-rotateY );
Serial.print(" Y:") ;
Serial.print(y) ; // Y軸
Serial.print(" ") ;
Serial.println(rotateY) ; // Y軸
delay(10) ;
}

準備は整った、はずです。

 

5.いざ動作!

一通り準備ができたので、いよいよリベンジです。スイッチを入れると……。

おお! 明らかにパワーはあるのですが肝心の動作がやはりカクカク……。

原因を調べてみると、手で持っている際に発生する微妙なブレを加速度センサーがとらえて、軸を合わせるわけですが、合わせ終わった時にまた違う角度のブレが発生しているため、この差分を適切に吸収して、回転をなめらかにする必要があることがわかりました。小さいものを載せているとブレが少ないので比較的軽快に動いてくれるのですがスマートフォンなど少し重量のあるものだとブレがひどくなり、動画のようになってしまいます。これ以上は、かなり綿密にプログラムを改良していく必要がありそうです。

実際にYoutubeなどで調べてみると、上手にそれらの問題をクリアしている人もいれば、苦戦している方もいるようです。

ドローンで試している方も結構いるみたいですが、ドローンは比較的手持ちに比べて姿勢が安定している状態なので相性がいいのかもしれません。

この方はかなりなめらかに制御ができているようです。

 

まとめ

今回リベンジ、ということでハードウェア部分の問題はクリアできたのですが、今度はなめらかな制御をするためのプログラム側の問題が発覚しました。実際に作ってみるとわかるこれらの問題、普段気軽に使っている製品は開発者の先人の汗と知恵が詰まったものだということを実感させられます。このデバイスが日の目を見るためには、まだまだ道のりは長そうです……。

 

■関連記事

第60回 ArduinoでGPS情報を取得 〜Arduinoでパーツやセンサーを使ってみよう

$
0
0

2017-05-11 11.22.18 (1)

今回は、GPSモジュールを使ってArduinoで位置情報を取得してみます。

今回の電子工作レシピ

完成までの時間目安:60分
必要なパーツ

目次

  1. GPSのしくみについて
  2. GPSモジュールについて
  3. 回路とプログラムの作成
  4. ライブラリを使って位置情報を整える
  5. まとめ

1.GPSのしくみについて

GPSという言葉自体はスマートフォンやカーナビなどで一般的な生活の中でもよく耳にする単語だと思います。なんとなくイメージでは「地球の周りをぐるぐる回っている衛星からの電波で位置がわかるんでしょ?」という感じだと思います(筆者だけ?)。実際どのようなしくみでGPSは衛星から位置情報をどうやって知ることができるのでしょうか?

gps

GPSのしくみは簡単に説明すると、上記図のように、地球上にたくさん回っているGPSで利用できる衛星からの電波を利用して、その衛星からの距離をもとに自分自身の位置情報を取得することができるしくみです。2009年12月の情報ではGPS衛星は31機(wikipedia)で、それ以降も衛星の打ち上げは各国で行われていて、日本国内の測量で利用できる衛星の数は大体50個前後らしいです。ただし、実際には地球の裏側を回っていたりするので、私たちの上空に位置する衛星の数は限られていて、その数が位置情報の精度に影響します。また、ビル街などのように電波を遮るものが多いところも衛星との通信電波が弱くなるため、精度が出ない、ということが多々あります。

 

2.GPSモジュールについて

今回利用するモジュールは「GPS受信機キット 1PPS出力付き 「みちびき」対応 [AE-GYSFDMAXB]」となります。「みちびき」対応とありますがどんなものなのでしょうか? まず「みちびき」を調べてみます。

2017-05-11 12.02.28

準天頂衛星システム「みちびき」とは

 

655610136b3b3a1b568bb13a525ce8c2
みちびき(内閣府) – http://qzss.go.jp/overview/services/sv01_what.html

みちびき(準天頂衛星システム)とは、準天頂軌道の衛星が主体となって構成されている日本の衛星測位システムのことで、英語ではQZSS(Quasi-Zenith Satellite System)と表記します。ただし、「準天頂衛星」という場合には、準天頂軌道の衛星と静止軌道の衛星の両方を合わせて呼ぶため、準天頂軌道の衛星を区別する必要がある場合は「準天頂軌道衛星」といいます。
衛星測位システムとは、衛星からの電波によって位置情報を計算するシステムのことで、米国のGPSがよく知られており、みちびきを日本版GPSと呼ぶこともあります。-引用

上記トップページの説明にあるように、簡単に理解するならば日本版GPSということですね。さらに調べるとすでにみちびきは3基打ち上げられていて、2017年中には4基目も打ち上げ予定とのこと。この打ち上げが成功すれば常に日本の上空には2基以上の即位することができるようになって、なんと誤差は数cmの精度までになるとのこと。

今回は、そんな衛星の力をお借りしてArduinoでGPSを使って位置情報を取得してみたいと思います。

 

 

3.回路とプログラムの作成

GPSモジュールを利用するためにさっそく回路とプログラムを作成していきます。このモジュールはそのままArduinoに接続して利用することができるので、下記図の対応を見ながら接続していきます。

setting

2017-05-11 11.22.18 (1)

今回はソフトウェアシリアル通信を使ってモジュールと通信を試してみます。ファイルの「スケッチ例」から「SoftwareSerial」-「SoftwareSerialExample」を開き、Arduinoに書き込み動作させてみます。

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

void setup() {
 // Open serial communications and wait for port to open:
 Serial.begin(57600);
 while (!Serial) {
 ; // wait for serial port to connect. Needed for native USB port only
 }


 Serial.println("Goodnight moon!");

 // set the data rate for the SoftwareSerial port
 mySerial.begin(9600);
 mySerial.println("Hello, world?");
}

void loop() { // run over and over
 if (mySerial.available()) {
 Serial.write(mySerial.read());
 }
 if (Serial.available()) {
 mySerial.write(Serial.read());
 }
}

書き込みが終わって、動作させると、シリアルモニター(通信レートは57600に設定)には何やらGPSモジュールからデータが返ってきていることがわかりますね。これがGPSの生データになります。

c74249062b826385ff23cee2e813090f

ひとまず、GPSモジュールから位置情報データらしきものが取得できることがわかりました!
でも、このままだとちょっと何をどう読んだらいいのかわかりませんね。

このGPSのデータの形式はNMEAフォーマットという形式で、その形式がわかれば理解することも可能なのですが、Arduinoのプログラムで扱うにはちょっと厄介ですので、ライブラリを使って手軽に扱えるようにしてみます。

 

4.ライブラリを使って位置情報を整える

NMEAフォーマットを手軽に扱うことができるArduino用のライブラリとして「TinyGPS++」を今回利用したいと思います。サイトのダウンロードボタンからライブラリのzipをダウンロードした後、「スケッチ」-「ライブラリをインクルード」-「.zip形式でライブラリを追加」から、ライブラリを追加してください。

23cdaae454939e2b17e3ae9ac9cdc9b3

このライブラリでは、下記のようにシリアル通信で受信したデータをエンコード関数で使いやすい形に変換することができます。

gps.encode([ソフトウェアシリアルからの受信データ]);
if (gps.location.isUpdated()){ // GPS情報が正常に更新されていたら
 Serial.print("LAT="); Serial.println(gps.location.lat(), 6); //緯度情報を表示
}

先ほどのソフトウェアシリアルのプログラムのloop関数部分を主にこのライブラリの出力に変換してみたものが下記のプログラムになります。
 

#include <TinyGPS++.h>
#include <SoftwareSerial.h>

TinyGPSPlus gps;
SoftwareSerial mySerial(10, 11); // RX, TX
//TinyGPSCustom magneticVariation(gps, "GPRMC", 10);

void setup() {
 // Open serial communications and wait for port to open:
 Serial.begin(57600);
 while (!Serial) {
 ; // wait for serial port to connect. Needed for native USB port only
 }

 Serial.println("Goodnight moon!");

 // set the data rate for the SoftwareSerial port
 mySerial.begin(9600);
 mySerial.println("Hello, world?");
}

void loop() { // run over and over
 while (mySerial.available() > 0){
 char c = mySerial.read();
 //Serial.print(c);
 gps.encode(c);
 if (gps.location.isUpdated()){
 Serial.print("LAT="); Serial.println(gps.location.lat(), 6);
 Serial.print("LONG="); Serial.println(gps.location.lng(), 6);
 Serial.print("ALT="); Serial.println(gps.altitude.meters());
 }
 }
}

e52205de346b5feed66c6702477fcf5e

実際にプログラムを書き込んで動作させると、緯度経度(LAT、LONG)などがわかりやすい形で表示されているのが確認できます。これを使ってほかのセンサーと連携したり、インターネットを通じてデータを貯えたりなど活用がしやすくなりましたね。

 

まとめ

今回はGPSモジュールの基本的な使い方を学ぶことができました。次回はこのGPSモジュールと第52回から取り組んだ3G回線を組み合わせて一定時間でサーバーに位置情報を送るGPSロガーの作成に取り組んでみたいと思います。

第62回 USBデバイスが作れるArduino?Arduino Pro Micro(Leonardo)でHID機能を使ってみる

$
0
0

DSC_0636

今回は、ちょっと変わったArduinoの使い方を紹介します。一見、これまでの連載でも使っているArduino Pro Miniのようにも見えますが、このArduinoは違う種類になります。その名も「Arduino Pro Micro」。MiniがMicroになっただけで、大きさもあまり変わらずどっちがどっちかわからなくなるような命名ですが、このArduinoはPCに接続した際にマウスやキーボードなどのHID(ヒューマン・インターフェイス・デバイス)として認識させることができるちょっと変わったArduinoなのです。今回は、このArduino Pro Microを利用してArduinoからPCを操作してみたいと思います。

今回の電子工作レシピ

完成までの時間目安:60分
必要なパーツ

目次

  1. Arduino Pro Microについて
  2. HIDとして認識させてみる
  3. ジョイスティックを使ったマウスデバイスの作成
  4. まとめ

1.Arduino Pro Microについて

Arduino Pro Microとは、ATmega32U4というチップを搭載したArduino(UNOなどはATmega328Pなどを搭載)で、このチップでは、USB接続された際にキーボードやマウスなどのヒューマンインタフェースデバイス(HID)のふりをすることができるという大きな特徴があります。このATmega32U4を搭載しているArduinoはこのPro Microのほか、Arduino Leonardoというボードが有名です。

プログラムを書き込む際は、「Arduino Leonardo」というボードを選択して書き込むことができます。

DSC_0629

一見Arduino Pro MiniとそっくりなArduino Pro Micro。

ただし、Pro Miniはシリアルコネクタ接続なのに比べて、Pro Microはスマートフォンなどが接続できる形式のUSBコネクタがついています。

 

2.HIDとして認識させてみる

さっそくArduino Pro Microにサンプルプログラムを書き込んでHIDとしてパソコンに認識させてみます。

Arduino IDEの「ファイル」-「スケッチの例」-「09.USB」-「Keyboard」-「KeyboardMessage」のプログラムを実行してみます。
このプログラムでは、4番ピンにスイッチをつけたシンプルな回路を作成して、4番ピンが押されたら押された回数のカウンターをキーボード入力で表示するプログラムになっています。
(今回は4番から7番ピンに変えています)

hid_vol62_01

#include "Keyboard.h"

const int buttonPin = 7; // input pin for pushbutton
int previousButtonState = HIGH; // for checking the state of a pushButton
int counter = 0; // button push counter

void setup() {
 // make the pushButton pin an input:
 pinMode(buttonPin, INPUT);
 // initialize control over the keyboard:
 Keyboard.begin();
}

void loop() {
 // read the pushbutton:
 int buttonState = digitalRead(buttonPin);
 // if the button state has changed,
 if ((buttonState != previousButtonState)
 // and it's currently pressed:
 &amp;&amp; (buttonState == HIGH)) {
 // increment the button counter
 counter++;
 // type out a message
 Keyboard.print("You pressed the button ");
 Keyboard.print(counter);
 Keyboard.println(" times.");
 }
 // save the current button state for comparison next time:
 previousButtonState = buttonState;
}


 

a12a976dfbc43316dfb11fcf25b94074

実際にプログラムを書き込んで、メモ帳などを開いたうえで、ボタンを押すたびにキーボードを触っていないのに上記の記述とともにカウントアップしていきます。

なんか、こんな手軽にUSB機器が作れてしまうなんていうのは、夢が広がりますね!

 

3.ジョイスティックを使ったマウスデバイスの作成

HIDとして利用ができることがわかりましたので、実際に部品と組み合わせてマウスデバイスを作ってみたいと思います。今回は以前ラジコン制作で1度使ったことがあるジョイスティックを使って、ジョイスティックとタクトスイッチでマウスの代わりになるようなデバイスにしてみます。

まず先に、ジョイスティックを使って上下左右とスイッチの状態を取得できるようにプログラムを用意します。

 

vol62_02_ブレッドボード20

 

DSC_0632

回路は、先ほどのタクトスイッチの回路に加えていきます。ジョイスティックと後に利用するLEDを2番ピンに接続しています。

const int _UDPIN = A0; // UD入力
const int _LRPIN = A1; // LR入力
const int _SWPIN = 7; // デジタルピン
int _UD = 0; // 上下の値
int _LR = 0; // 左右の値

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

void loop() {
 _UD = analogRead(_UDPIN);
 _LR = analogRead(_LRPIN);
 Serial.print("UP-DOWN:");
 Serial.print(_UD, DEC);
 Serial.print(" - Left-Rright:");
 Serial.println(_LR, DEC);
 if (digitalRead(_SWPIN) == HIGH) {
 Serial.println("switch on");
 }
 delay(100);
}

75c4dd1fe9f371a556293091db222221

プログラムを書き込んでジョイスティックをぐりぐり回すと数値が変わるのが確認できました。

では、実際にジョイスティックの値をマウス座標に変換させていきます。このプログラムについても実はサンプルに用意されているので、それを使ってみます。「ファイル」-「スケッチの例」-「09.USB」-「Mouse」-「JoystickMouseControl」を選択してください。

このプログラムを実行すると上下はアナログのA2番ピン、左右はA1番ピンの数値をマウス座標に反映させるようなプログラムになっています。また、2番に5Vの電源を入れることでスイッチになっていますので、2番とVCCを結線するか、スイッチを挟むことでデバイスのオンオフもできます。


&nbsp;

#include "Mouse.h"

// set pin numbers for switch, joystick axes, and LED:
const int switchPin = 5; // switch to turn on and off mouse control
const int mouseButton = 7; // input pin for the mouse pushButton
const int xAxis = A1; // joystick X axis
const int yAxis = A2; // joystick Y axis
const int ledPin = 2; // Mouse control LED

// parameters for reading the joystick:
int range = 12; // output range of X or Y movement
int responseDelay = 5; // response delay of the mouse, in ms
int threshold = range / 4; // resting threshold
int center = range / 2; // resting position value

boolean mouseIsActive = false; // whether or not to control the mouse
int lastSwitchState = LOW; // previous switch state

void setup() {
pinMode(switchPin, INPUT); // the switch pin
pinMode(ledPin, OUTPUT); // the LED pin
// take control of the mouse:
Mouse.begin();
}

void loop() {
// read the switch:
int switchState = digitalRead(switchPin);
// if it's changed and it's high, toggle the mouse state:
if (switchState != lastSwitchState) {
if (switchState == HIGH) {
mouseIsActive = !mouseIsActive;
// turn on LED to indicate mouse state:
digitalWrite(ledPin, mouseIsActive);
}
}
// save switch state for next comparison:
lastSwitchState = switchState;

// read and scale the two axes:
int xReading = readAxis(A0);
int yReading = readAxis(A1);

// if the mouse control state is active, move the mouse:
if (mouseIsActive) {
Mouse.move(xReading, yReading, 0);
}

// read the mouse button and click or not click:
// if the mouse button is pressed:
if (digitalRead(mouseButton) == HIGH) {
// if the mouse is not pressed, press it:
if (!Mouse.isPressed(MOUSE_LEFT)) {
Mouse.press(MOUSE_LEFT);
}
}
// else the mouse button is not pressed:
else {
// if the mouse is pressed, release it:
if (Mouse.isPressed(MOUSE_LEFT)) {
Mouse.release(MOUSE_LEFT);
}
}

delay(responseDelay);
}

/*
reads an axis (0 or 1 for x or y) and scales the
analog input range to a range from 0 to <range>
*/

int readAxis(int thisAxis) {
// read the analog input:
int reading = analogRead(thisAxis);

// map the reading from the analog input range to the output range:
reading = map(reading, 0, 1023, 0, range);

// if the output reading is outside from the
// rest position threshold, use it:
int distance = reading - center;

if (abs(distance) < threshold) {
distance = 0;
}

// return the distance for this axis:
return distance;
}

プログラムの書き込みができたら、実際に動かしてみます。

おお、実際に動いていますね!

 

まとめ

今回はArduino Pro Microを利用してUSBデバイスをArduinoで作るための基本的な処理を学びました。次回はさらに応用してデバプラ風のUSBデバイスの作成にチャレンジしてみたいと思います!

 

第61回 ArduinoでGPSデバイス実践編 〜Arduinoでパーツやセンサーを使ってみよう

$
0
0

DSC_0628

今回は、前回のGPSモジュールと第53回の3G通信ができる3GIMを使ってチャットサービスのslackに現在地情報を通知するGPSロガーデバイスを作成してみます。

目次

  1. GPS取得と3G通信のプログラムを組み合わせる
  2. 回路の作成
  3. Slackとは?
  4. Slack APIの設定
  5. まとめ

1.GPS取得と3G通信のプログラムを組み合わせる

前回GPS取得のプログラムができましたので、そのプログラムと第53回で利用した3G通信のプログラムを組み合わせて、一定間隔でGPS情報を取得したのち3GIMを通じてインターネット側にデータを送るプログラムを作成します。


#include &amp;amp;amp;amp;lt;TinyGPS++.h&amp;amp;amp;amp;gt;
#include &amp;amp;amp;amp;lt;SoftwareSerial.h&amp;amp;amp;amp;gt;
#include &amp;amp;amp;amp;lt;a3gim.h&amp;amp;amp;amp;gt;

#define baudrate 9600UL
const int powerPin = 7; // 3gim power pin(If not using power control, 0 is set.)
const char *server = "hooks.slack.com";
const char *path = "/services/[slackのwebhooksURL]";
int port = 443;
char res[a3gsMAX_RESULT_LENGTH+1];
int len;

float _lat;
float _lng;
int _alt;
 
TinyGPSPlus gps;
SoftwareSerial mySerial(10, 11); // RX, TX
//TinyGPSCustom magneticVariation(gps, "GPRMC", 10);
 
void setup() {
 // Open serial communications and wait for port to open:
 Serial.begin(57600);
 while (!Serial) {
 ; // wait for serial port to connect. Needed for native USB port only
 }
 
 Serial.println("Goodnight moon!");
 
 // set the data rate for the SoftwareSerial port
 mySerial.begin(9600);
 mySerial.println("Hello, world?");
}
 
/* GPSからデータを取得 */
void loop() {
 while (mySerial.available() &amp;amp;amp;amp;gt; 0){
 char c = mySerial.read();
 gps.encode(c);
 if (gps.location.isUpdated()){
 _lat = gps.location.lat();
 _lng = gps.location.lat();
 _alt = gps.altitude.meters();
 Serial.print("LAT="); Serial.println(_lat,6);
 Serial.print("LNG="); Serial.println(_lng,6);
 Serial.print("ALT="); Serial.println(_alt);
 sendData();
 }
 }
}

/* 3GIMでデータをサーバーに送信 */
void sendData(){
 Serial.println("START---3GIM");
 if (a3gs.start(powerPin) == 0 &amp;amp;amp;amp;amp;&amp;amp;amp;amp;amp; a3gs.begin(0, baudrate) == 0) {
 Serial.println(" SUCCESS---START 3GIM");

delay(25000); // ウェイトを持たせる
 len = sizeof(res);

//rssi - 電波強度を取得
 int rssi = 0;
 if (a3gs.getRSSI(rssi) == 0) {
 Serial.print(" SUCCESS---GET RSSI:");
 Serial.println(String(rssi));
 }

//time - 時刻を取得
 char date[a3gsDATE_SIZE], time[a3gsTIME_SIZE];
 if (a3gs.getTime(date, time) == 0) {
 }

//データを送信
 String s = String(_lat,6).concat(",");
 s = s.concat(String(_lng,6));
 char *header = "Content-Type: application/json";
 char body[44];
 sprintf(body, '{"username":"bots","text":"%s"}' , s);
 
 int rst = a3gs.httpPOST(server, port, path), header, body, res, len);
 if(rst == 0){
 Serial.println(res);
 Serial.println(len);
 Serial.println("success sended. Shutdown..");
 }
 else{
 Serial.println("faild sended. Shutdown..");
 }
 a3gs.end();
 a3gs.shutdown();
 return;
 }
 else{
 Serial.println("Failed.");
 }
 return;
}

今回、Slackというチャットサービスに位置情報を送るのですが、そのために、これまで3GIMで利用していたhttpGETという関数ではなくhttpPOSTというPOST形式でデータを送信することができる関数を利用しています。また、それに伴い、portも80番から443番に変更となっています。

プログラム自体は、送信先のサーバー側でどのような形式でデータを受けるかでプログラムの内容は若干変わりますが、基本的には組み合わせるだけなので、シンプルですね。

 

2.回路の作成

次に回路を作成していきます。回路に関しても、前回のGPS取得の回路と、3GIMの回路を組み合わせるだけになりますが、一点だけ注意としては、3GIMは起動時や通信時にある程度の電流を必要とするため、Arduinoから供給されている電源のみのの場合、うまく動作しないことがあるため、その場合は3GIMのみ外部から電源(3.3~4.2V)を用意する必要があります。

 

vol61_ブレッドボード_re

DSC_0626

接続できたら、実際にサーバーに送信するためにslackの設定を進めていきます。

 

3.slackとは?

slackとは、ビジネス用途のチャットサービスです。主に、エンジニア・プログラマーなどの開発者の方がその手軽さから多く利用しているサービスです。

e53874bdf8f36d86125437116fa63e80

slackのトップ画面

 

11b57037ffc3676e529fae1b6ca30e4b

実際の画面ではこのように、左に相手やチャンネル(チャットの部屋のようなもの)が表示されて、右側の画面で相手とチャットのやり取りができるようになっています。slackはチャット機能が充実しているほか、ボット機能も充実しているため、様々なサービスとの連携のほか、自分が作ったアプリとの連携も可能になります。

 

4.Slack APIの設定

slackのAPIの利用方法については、いろいろな方が紹介されているのでここでは詳しくは紹介しませんが、今回は「Incoming Webhooks」というAPIを使ってslackで発行されたURLにデータと一緒に接続すると、特定のチャンネルにチャットメッセージを送れる、というAPIを使いました。

 

0522eaf783d66c54c86e3b8377e27b35

APIのコンソール画面でWebhookを有効にして、URLなどを発行します。

 

cb46e7333d1023235e51b32277ae9a34

実際にWebhookが有効になると、Webhook URLとして利用できるキーとチャンネルなどが表示されます。この設定情報をプログラムのpath部分の[slackのwebhooksURL]に反映してください。

設定が完了したら実際にプログラムを起動してみてください。

serial

シリアルモニターに表示されたあと、実際にslack側にメッセージが表示されれば完成です。

gpsslack

位置情報が表示されました。これだとちょっと味気ないので、送信側のテキストを少し変更してみます。

{“username”:”bots”,”text”:”https://www.google.com/maps?q=[位置情報]”}

この形式で、[位置情報]が取得したGPS情報に差し替わるようにすると、Google mapのリンクがslack側に通知がきます。

gpsslack2

クリックしてみると…

0f8c0071bb74551a76803cb1aa2308a7

Google mapで現在地が表示されました。これだと、GPSロガーとして活用できそうですね!

 

まとめ

今回は3GIMの通信とGPSモジュールを組み合わせたデバイスを作成しました。このように1つの部品だけだとなかなか実際に活用、ところまで作るのは難しいかもしれませんが、複数の技術を組み合わせることで私たちの生活の中でちょっと使えるデバイス、なんてものが気軽に作ることができますので、ぜひほかのアイデアもチャレンジしてみてください!


第63回 USBデバイスが作れるArduino?Arduino Pro Micro(Leonardo)でデバイス作成に挑戦!

$
0
0

DSC_0649

前回は、マウスやキーボードなどと同じようにUSBデバイスとして利用できる「Arduino Pro Micro」の使い方をご紹介しました。今回は、その機能を使ってデバプラ的にどんなことができるかいろいろ触って試してみたいと思います!

今回の電子工作レシピ

完成までの時間目安:60分
必要なパーツ

目次

  1. ボリューム調整デバイスを作ってみる
  2. せっかくなのでケースを作ってみる
  3. まとめ

1.ボリューム調整デバイスを作ってみる

筆者はパソコンで何か作業をするときにはよく音楽をかけながら作業をするのですが、その際によく困るのが、ボリューム調整。ノートPCなどはキーボードに音量の変更キーがついているので、それを押せばOKなのですが、デスクトップの場合それがないので、Windowsの場合を例にとると画面の右下のスピーカーマークのアイコンをクリックして音量を変えたり、各再生ソフトのボリューム調整を利用する必要があり、とっさの変更に困っていたりしました。今回、そんな悩みを解消すべく、ボリュームを手軽に変更できるデバイスを作成してみます!

DSC_0629

今回も使うのはArduino Pro Micro。これを使って進めていきます。

と、まあ作ろうと思ったのですが、色々調べていて、先にオチからばらしちゃいますと、Windowsの場合、キーボードの「Win」+「PageUP」で音量アップ、「Win」+「PageDown」で音量ダウンが可能でした!orz…

でも、「Win」キーと「PageUP」「PageDown」はキーボードの距離が離れているので、結局両手を使わなければいけない!それに何よりボリュームのコントロールはツマミでやりたい!とわずかつたない理由のみを原動力としてデバイスを作ってみます。

 

Arduinoからボリュームの調整をする方法

オチで紹介してしまいましたが、今回Arduino Pro Microで実現する場合、キーボードコマンドをArduinoから送ってボリューム調整を実現する方法で考えてみます。

 

なので、今回は単純にボリューム抵抗が回ったらその状態を取得して、ボリュームアップ、ダウンを実現する方法で実装してみます。この方法だと、現在のボリュームの値がわからないので、細かな調整は難しいのですがざくっと使うのは問題ないのでレッツ実装です!

pd

写真のキーを組み合わせることでWindowsではボリューム調整ができるとのこと。このキーをArduino Pro Microで仮想的にキーコマンドを送ります。

ボリューム調整なので、部品もボリューム抵抗を用意します。回路はシンプルで、ボリューム抵抗の値をアナログ入力(A0ピン)で検出して、その値の増減に応じてWindows側にキーの送信をするようにしてみます。

 

vol63_01

ボリューム調整のプログラム

 #include "Keyboard.h"

int _pos = 0;

void setup() {
  Keyboard.begin();
  Serial.begin(9600);
}
 
void loop() {
  int ain = analogRead(A0);
  delay(10);
  // Volume UP:
  if((_pos-2) &amp;gt; ain){
    Keyboard.press(KEY_LEFT_GUI);
    Keyboard.write(KEY_PAGE_UP);
    Keyboard.releaseAll();
    delay(500);
    Serial.println("Volume UP");
  }

  // Volume Down:
  if((_pos+2) &amp;lt; ain){
    Keyboard.press(KEY_LEFT_GUI);
    Keyboard.write(KEY_PAGE_DOWN);
    Keyboard.releaseAll();
    delay(500);
    Serial.println("Volume Down");
   }
   _pos = ain;
}
 

条件文で_pos-2) > ainなどとして、ひとつ前の状態より抵抗値が大きかったら・小さかったらキー送信、というプログラムです。ボリューム抵抗を触っていないのに数値が+-1~3などと少し揺れる場合があったので、ここでは+-2として抵抗値が揺らいでも誤動作しないようにしています。

DSC_0640

ボリュームつまみを回すとWindows側の音量が変わっていますね!ちょっとだけパソコンでの作業が楽になりました!!

 

2.せっかくなのでケースを作ってみる

これだけだと味がないので、日常使いするように、ケースに入れてみたいと思います。ホームセンターで手ごろな木でできたブロックがあったので、電動ドリルでくりぬいてボリューム抵抗をつけてみました!

DSC_0644

機能のオンオフができるスイッチもつけてみました。

DSC_0645

くりぬいた穴の中にArduinoが入るようにして、パーツを収めていきます。

DSC_0646

Arduinoに直接はんだづけをしてもいいのですが、また使いたいので抜き差しできるようにしました。

あとはArduinoを穴の中に入れて完成です。さっそく動作確認をしてみます。

ちゃんと動きましたね!これで、机の上に置いておいてもArduinoむき出しではなくいい雰囲気のデバイスになったのではないでしょうか?

 

 

まとめ

今回はArduino Pro Microの使い方を踏まえてボリューム調整デバイスを作成しました。キーボードのショートカットキーを応用したり、特定のマウス操作だけに特化させると、例えばゲームなどの特定の処理に特化したデバイスができるので、こんな単純作業もっと簡略化したいんだよね…と思っている方はぜひチャレンジしてみてください!

 

第64回 ArduinoとSakura.ioで気軽にIoTデバイスを作ってみる-準備編

$
0
0

DSC_09162

今回はArduinoで手軽に通信ができるsakura.ioを試してみたいと思います。これまでの連載ではArduinoで3G通信できるモジュールとして3GIMのご紹介をしましたが、それらとの違いやsakura.ioモジュールの使い方を数回にわたりご紹介します。

今回の電子工作レシピ

完成までの時間目安:60分
必要なパーツ

目次

  1. sakura.ioとは?
  2. sakura.ioの特徴
  3. さくらの通信モジュール・Arduinoシールドボードについて
  4. まとめ

1.sakura.ioとは?

sakura.ioとはまずどんなものか調べてみます。サービス名?モジュール名?単体の製品名?という基本の基本からスタートです!

まず、sakura.ioの公式サイトを確認してみます。上のメニューに「sakura.ioとは」とあるのでそのページを見てみましょう。

3aefd2423c7ef0df202243bc0d9d729c

公式サイトではsakura.ioについて

本サービスは、モノとネットワークでデータを送受信するための「さくらの通信モジュール」(以下、「通信モジュール」)、通信環境、データの保存や連携処理に必要なシステムを一体で提供するIoTのプラットフォームです。日常の中でinputとoutputを繰り返す情報を当社のサービスでサポートし、「だれもが、データを活かせる世の中へ」のコンセプトのもと、新しい価値やサービスが世の中に広がるようにという思いを込めて、このたび「sakura.io」と名称を改め、サービスロゴも刷新しました。

と記載されています。「sakura.io」はサービス名ということがわかりました。そして実際の製品にあたる部分が「さくらの通信モジュール」という名称ですね。さらに読み進めると、

お客様の製品に通信モジュールを組み込んでいただくことにより、安全性が担保された通信環境や、データを保存/分類するためのクラウド環境を構築/運用することなく、簡単にセンサーデータを活用いただくことができます。通信モジュールにはSIM組み込み済みなのでSIMの購入/契約は不要です。

通信モジュールで外部との通信の際に必要なSIMがsakura.ioでは必要ないということがポイントですね。なんかすごくよさそうなサービスの予感がします。

 

2.sakura.ioの特徴

公式サイトをその後も読み進めてみて、できることを簡単に整理してみると、、、

gh01

という特徴がsakura.ioのサービスになるでしょうか。Arduinoで利用する場合の目線で考えると

ハードウェア側
Arduino本体には「Arduinoシールドボード」と、そのボードにSIMが組み込まれた通信モジュールの「さくらの通信モジュール」を設置することでハードウェア側は使うことができる

そのほか
実際の通信については、3G通信での通信が可能、通信料金はsakura.ioで提供されている料金プランでの利用、通信先はsakura.ioを経由して自身のサーバーや、他社のAPIを利用可能。

なので、ひとまずArduinoで使い始めるにはさくらの通信モジュールArduinoシールドボードを購入すれば良い、ということになるでしょうか。

sakura

sakura.ioの通信の仕組み

3.さくらの通信モジュール・Arduinoシールドボードについて

Arduino本体に接続するシールドボード、そしてさくらの通信モジュールを見ていきます。

DSC_0910

さくらの通信モジュールです。裏側にはSIMが装着されていますね。この通信モジュールから実際に3G通信を通してsakura.ioのサーバーと接続されて通信がされます。表側には利用に関してIDやパスワードが記載されているのでそれをもとにsakura.ioの設定をすることができるようになっています。アンテナが2本ついていますが、感度を良くするために2本になっているのでしょうか。

saku3

QRコードの読み込みでも確認できるようになっています。

 

DSC_0911

こちらはArduinoシールドボードです。Arduino UNOにそのままシールド利用できるサイズになっています。

DSC_0912

ArduinoとはI2C,SPI,UART方式で操作が可能です。これらの操作はジャンパを設定することで変更が可能になっています。

 

 

まとめ

今回はsakura.ioを使う前の基本について学びました。次回は実際にさくらの通信モジュールを使って通信を試してみます!

 

第65回 ArduinoとSakura.ioで気軽にIoTデバイスを作ってみる –管理画面の利用方法~通信モジュールの登録

$
0
0

IMG_20170916_221657

前回、sakura.ioのArduinoで通信できるモジュールがどういうものか?ということを紹介しました。今回は、実際にArduinoシールドとさくらの通信モジュールを、機器の登録から通信まで、まずは動かしてみる!という目標のもと、学んでいきたいと思います。

今回の電子工作レシピ

完成までの時間目安:40分
必要なパーツ

目次

  1. sakura.ioを使う上で必要なドキュメントなど
  2. sakura.ioの通信モジュール・連携サービスの登録
  3. Arduino側の準備(ライブラリの追加)
  4. まとめ

1.sakura.ioを使う上で必要なドキュメントなど

まず使いはじめるにあたり、開発に必要なドキュメントを確認しておきます。sakura.ioの公式サイトを見ると、上のメニューの右上に「開発者向け」というメニューがありますので、そこをクリックします。

8318e32c42840ef46cb5a96fcc0023fesakura.io公式ページ

 

開発者向けページが表示されたら、そのページの下部に「さくらのIoT β版ドキュメント」がありますので、その「さくらの通信モジュール」と「Arduinoシールド」の項目が今回利用する機器のドキュメント一式になります。今回は動かすことを目的に内容を進めていきますが、はじめにこのドキュメントを眺めておくと、どういうことが書かれているかを把握しておくと何かあった時に解決が早くなります。

b2aee02a5d13b53c12f309bf4289f4dc開発者向けページ

 

ドキュメントの中で「さくらの IoT プラットフォーム(β版)利用マニュアル」がモジュールの登録方法などsakura.ioのウェブサイトの管理画面ですること・できることが書かれていますので、このドキュメントは読んでおくことをお勧めします。

68a2d6576e812f3453c403f8f9800ea62

 

さくらの IoT プラットフォーム(β版)利用マニュアル

 

 

 

2.sakura.ioの通信モジュール・連携サービスの登録

さっそく通信モジュールをsakura.ioに登録して利用できるように準備していきます。公式サイトの右上の「ログイン」から、sakura.ioの管理画面にログインします。(さくらインターネットの会員登録はまだの方は、購入したsakura.ioの説明書などからさくらインターネットの会員登録をしてください)

138e2431e6bb98e455717983e5ea9747_3開発者向けページ

 

管理画面にログインします。

loginさくらインターネット会員ログイン

 

管理画面にログインすると下記のような画面になります。管理画面では登録されている通信モジュールや連携しているサービスなどの登録状況を見ることができます。

admin

sakura.io管理画面

 

管理画面で通信モジュールや連携サービスの登録を進めていきます。まず、最初に下記のようなデフォルトプロジェクトが表示されていない場合は、プロジェクトの追加から進めていきます。

この画面で必要な登録の流れは

  1. プロジェクトの追加(デフォルトプロジェクトがなければ)
  2. 通信モジュールの登録
  3. 連携サービスの登録

となります。

 

2-1.プロジェクトについて

sakura.ioでは、それぞれの通信モジュールや連携サービスを「プロジェクト」という単位で管理が可能です。

通信モジュールを複数持っている場合で、それぞれ違う用途や連携サービスで利用したい場合は、プロジェクトをわけて利用することになります。

例えば、1つめの通信モジュールはAWSと連携させて通信させたい、2つめはslackなどと連携させたいなどの場合は、それぞれプロジェクトを追加してモジュールや連携サービスをそれぞれ登録する形になります。

138e2431e6bb98e455717983e5ea9747_2sakura.ioの管理画面の説明

 

 

2-2.通信モジュールの登録

実際に通信モジュールを登録していきます。画面の「モジュール登録」で、通信モジュールに記載されているID/PSを入力して、利用したいプロジェクトを選択して登録します。「名称」は自分でわかりやすい名称をつけてください。

add通信モジュールの登録画面

 

無事登録できると、管理画面のトップに登録した名称で通信モジュールが表示されます。これで、通信モジュールの設定は完了です。138e2431e6bb98e455717983e5ea97473通信モジュールの登録完了

 

2-3.連携サービスの登録

通信モジュールが登録できたら管理画面の右側「サービス追加」より次にどのように何と通信をするか連携サービスを登録します。連携サービス画面では通信できる方式が表示されますので、今回は「WebSocket」を選択します。

webs
連携サービスの追加画面

 

WebSocketを選択して、何でもよいのでわかりやすいサービス名を入力します。

webs2
サービス連携の名前登録

 

無事登録できると、管理画面トップに追加した連携サービスが表示されます。

admin2

 

sakura.ioの通信の仕組み

 

これで、管理画面側でさくらの通信モジュールを利用する準備がすべて整いました!

 

3.Arduino側の準備

次はArduino側の準備をしていきます。まずはじめにArduino本体にシールドボードを接続します。

IMG_20170916_221657Arduinoにシールドボードを装着

 

次に通信モジュールのジャンパ設定を確認します。今回、ArduinoとはI2C方式で通信したいので、ジャンパを黄色の枠の部分に設定します。(他の通信方式は開発者向けページ「Arduino シールド 取扱説明書」で解説があります)

IMG_20170916_222019_BURST001_COVERジャンパの設定

 

ジャンパ設定が完了したら、本体の準備はOKなので、次にArduino IDEでライブラリを追加します。

Arduino IDEの上のメニューから「スケッチ」-「ライブラリをインクルード」-「ライブラリを管理」でライブラリマネージャを開きます。ライブラリマネージャの右上に「sakura」と入力するとSakuraIOのライブラリが表示されるので「インストール」を押してライブラリをインストールします。

 

cf9a3710f2849f3b65cf72ff7ad80bfb
SakuraIOライブラリのインストール

 

完了後、「スケッチ例」-「SakuraIO」が追加されていれば無事、ライブラリのインストールが完了です。

d1f1709a41b165de509c23ad43ed2f22
SakuraIOのライブラリ追加確認

 

 

 

まとめ

sakuraIOの動かす準備がすべて完了しました!次回は今回の続きで、実際に通信モジュールを操作してみたいと思います!!

 

第66回 ArduinoとSakura.ioで気軽にIoTデバイスを作ってみる –通信モジュールでいざ通信!

$
0
0

IMG_20170918_144946

前回の記事で、sakura.ioで通信モジュールやArduinoなどのすべての準備ができました。今回はサンプルプログラムを動作させるところからはじめて、実際に通信してみます。

今回の電子工作レシピ

完成までの時間目安:60分
必要なパーツ

目次

  1. 通信モジュールからデータをsakura.ioに送信
  2. sakura.ioから通信モジュールにデータを送信
  3. まとめ

 

1.通信モジュールからデータをsakura.ioに送信

前回、ライブラリをインストールしたので、さっそくサンプルプログラムを動作させてみます。「スケッチ例」-「SakuraIO」-「Shell」を選択して基本的な手動でデータを送信するプログラムを動かしてみます。

d1f1709a41b165de509c23ad43ed2f22
SakuraIOのサンプルプログラム

 


#include &amp;lt;SakuraIO.h&amp;gt;
#include "ntshell.h"
#include "commands.h"

static int func_read(char *buf, int cnt, void *extobj);
static int func_write(const char *buf, int cnt, void *extobj);
static int func_callback(const char *text, void *extobj);
static int ntopt_callback(int argc, char **argv, void *extobj);
static void ntshell_poll(ntshell_t *p);

ntshell_t ntshell;

cmd_list_t cmd_list[] = {
 {(char*)"version", cmd_version},
 {(char*)"serial", cmd_serial},
 {(char*)"status", cmd_status},
 {(char*)"sqi", cmd_sqi},
 {(char*)"unixtime", cmd_unixtime},
 {(char*)"update", cmd_update},
 {(char*)"reset", cmd_reset},
 {(char*)"enqueue", cmd_enqueue},
 {(char*)"sendnow", cmd_sendnow},
 {(char*)"send", cmd_send},
 {(char*)"size", cmd_size},
 {(char*)"cleartx", cmd_cleartx},
 {(char*)"dequeue", cmd_dequeue},
 {(char*)"peek", cmd_peek},
 {(char*)"clearrx", cmd_clearrx},
 {(char*)"file", cmd_file},
 {NULL, NULL}
};

//SakuraIO_SPI sakuraio(10);
SakuraIO_I2C sakuraio;

void setup() {
 Serial.begin(9600);
 Serial.println("Hello");
 Serial.print("&amp;gt;");
 ntshell_init(&amp;amp;ntshell, func_read, func_write, func_callback, (void *)&amp;amp;ntshell);
 ntshell_set_prompt(&amp;amp;ntshell, "&amp;gt;");
}

void loop() {
 ntshell_poll(&amp;amp;ntshell);
}


/* NT-Shell */
static int func_read(char *buf, int cnt, void *extobj) {
 if (Serial.available())
 return Serial.readBytes(buf, cnt);
 else
 return 0;
}

static int func_write(const char *buf, int cnt, void *extobj) {
 return Serial.write(buf, cnt);
}

static int func_callback(const char *text, void *extobj) {
 return ntopt_parse((const char *)text, ntopt_callback, extobj);
}

static int ntopt_callback(int argc, char **argv, void *extobj){
 if (argc == 0) {
 return 0;
 }

 int execnt = 0;
 const cmd_list_t *p = cmd_list;
 while (p-&amp;gt;command != NULL) {
 if (ntlibc_strcmp((const char *)argv[0], p-&amp;gt;command) == 0) {
 p-&amp;gt;func(argc, argv);
 execnt++;
 }
 p++;
 }
 if (execnt == 0) {
 Serial.println("unknown command");
 }

 return 0;
}


static void ntshell_poll(ntshell_t *p)
{
 if (p-&amp;gt;initcode != INITCODE) {
 return;
 }
 unsigned char ch;
 if(SERIAL_READ(p, (char *)&amp;amp;ch, sizeof(ch)) &amp;gt; 0)
 vtrecv_execute(&amp;amp;(p-&amp;gt;vtrecv), &amp;amp;ch, sizeof(ch));
}

 

プログラムを書き込んだ後に、シリアルモニタを開きます。シリアルモニタの設定は「9600 bps」で改行コードは「CRのみ」に設定します。

e2bed547e873dacbe1579be069cf9f28シリアルモニタの準備

 

シリアルモニタの準備ができたら、データの受信を確認する画面をsakura.ioの管理画面から表示します。前回登録した連携サービスをクリックすると、詳細画面が表示されます。

65f2b6ba8fe57ccb596aeddcd9108f202連携サービスの選択

 

76e280e09a8125986685e9d5455ff22c_2連携サービス詳細画面

 

この画面を開いたままで、シリアルモニタに戻ります。

シリアルモニタで「enqueue 0 i 5656」と入力します。

enqueue – 送信キューにデータを格納するコマンド

enqueueの後ろは「0-チャンネル番号、i-送信するデータの型、5656-送信データの内容」となります。

99e2d6e01d1354e2086b67cd1e2978abenqueueコマンドを入力

 

enqueueコマンドを入力するとシリアルモニタに表示されます。次に送信キューにためたデータを実際にsakura.ioに送るために「send」コマンドを入力します。

send – 送信キューにたまったデータをsakura.ioに送信する

 

a24ceffe32f38c57edf706471496e81e
sendコマンドを入力

f30e87844c2e8154979c7e353ee2aff1「送信」でsendコマンドを送信

 

sendコマンドでデータを送信すると、管理画面上にデータが届いたことが確認できれば無事送信が完了です!

76e280e09a8125986685e9d5455ff22c_3
Arduinoに載せた通信モジュールからデータがsakura.ioに届いている画面

 

これで、通信モジュールからsakura.ioへの簡単なデータの送信方法が確認できました。

 

sakura.ioに届いたデータの利用方法

実際に利用するには、このsakura.ioに届いたデータを上記「サービス連携の編集 WebSocket」の画面の上にあるURLやTokenを使って、別のサーバープログラムからアクセスしてデータを取得したりするようなプログラムを作っていく流れになります。

それらの流れはAPIドキュメントを見ると知ることができます。

 

2.sakura.ioから通信モジュールにデータを送信

Arduino側の通信モジュールからsakura.ioにデータが送ることができたので、次に逆のsakura.ioからArduino側の通信モジュールにデータを送信する方法を試してみます。

2-1.Incoming Webhookの設定

今回の通信方式はIncoming Webhookを利用します。その前に、Incoming Webhookとは何でしょうか?まずwebhookを簡単に説明すると「アプリなどの更新情報を他のアプリへリアルタイムに通知する仕組みや概念」となります。そしてその通知する仕組みはPOST方式で実行されます。

sakura.ioでIncoming Webhookを使うために、管理画面から連携サービスを登録します。連携サービス「サービス追加」よりWebSocketを追加したときのように追加画面に進みます。

138e2431e6bb98e455717983e5ea9747_2
「サービス追加」を選択

 

webs3
Incoming Webhookを選択

 

Incoming Webhookでは、名前とSecretの2箇所設定する必要があります。Secretは接続する際に必要なSecretキーを設定することができるのですが、今回は名前のみで設定しないで進みます。

878e8da6a90192d0a71c2098a5dc5e48
Incoming Webhookの登録画面

 

登録が完了したら、同じように連携サービスのIncoming Webhookの詳細画面を開きます。詳細画面では設定した名前とSecretのほかにTokenとURLという記載が表示されています。

webhookIncoming Webhookの詳細画面

 

URLには/v1/以降にTokenが表示されていると思いますが、このURLにPOSTデータを送信することで通信モジュールにデータを送ることができます

 

2-2.サーバ側のプログラムを用意する

今回のIncoming Webhookの一連の流れは下記の図になります。今回はサーバ側にプログラムを用意して、それをブラウザでアクセスした際に通知するようにしていますが、「ブラウザでアクセス」というのを、別のアプリやシステムに置き換えれば一般的なWebhookとして「他のアプリからの通知を通信モジュールに送信する」という利用が可能になります。

今回このIncoming Webhookを利用している例としてさくらインターネットさんの「さくらのナレッジ」のウェブサイトに「さくらのIoT Platformで、”ヤバい状況であることを光って知らせる装置”をできるだけ安価に作ったお話」一連の実装について紹介例がありますので、今回そのコードを参考に進めていきます。

webhook4今回のIncoming Webhookでの通知の流れ

 

サーバ側はPHPを利用します。PHPプログラムはそれぞれPHPが動作可能なサーバなどに設置してください。下記プログラムのモジュールのIDは管理画面の一覧に表示されているIDを設定します(通信モジュールに書かれているIDではありませんので注意)。tokenは連携サービスに記載されているtokenを設定します。


<?php $digit = htmlspecialchars($_GET["val"], ENT_QUOTES, 'UTF-8'); $module = "[モジュールのIDを記載]"; $token = "[tokenを記載]"; $secret = ""; function send_to_iot($token, $payload, $secret){ $webhook_url = "https://api.sakura.io/incoming/v1/{$token}"; $x_sakura_signature = hash_hmac("sha1", $payload, $secret); $headers = array( 'Content-Type: application/json', 'Accept: application/json', 'X-Sakura-Signature: '. $x_sakura_signature, ); $options = array( 'http' => array(
'method' => 'POST',
'header' => implode("\r\n", $headers),
'content' => $payload,
)
);
$response = file_get_contents($webhook_url, false, stream_context_create($options));
return $response === 'ok';
}

$data = array(
'type' => 'channels',
'module' => $module,
'payload' => array(
'channels' => array( array(
'channel' => 0,
'type' => 'i',
'value' => intval($digit),
)
)
)
);
$payload = json_encode($data);
send_to_iot($token, $payload, $secret);

サーバーに設置して下記のように?val=1などとvalのあとに0~9の数値を設定すると通信モジュールに通知されるような仕様になっています。(送信する内容は0~9以外でもよいですが、今回Arduino側で1桁のint型を受けるようにしています)

https://xxx.xxx.xxx/incoming_webhook.php?val=1

 

2-3.Arduino側のプログラム

次にArduino側のプログラムを用意します。こちらもさくらのナレッジで紹介されている例をもとに今回用に書き換えをしています。主な処理の流れは、sakura.ioからgetRxQueueLength関数で受信できるデータがあるかどうかを確認したのち、データがあればdequeueRx関数で取得して、その内容に合わせて2のLEDを光らせる処理を実施する、という流れになっています。

今回13番ピンにLEDを接続して光らせる・消すという処理を書いていますので、LEDをつけてみてください(LEDがなくてもArduino本体のLEDがついたり消えたりします)


#include <SakuraIO.h>

SakuraIO_I2C sakuraio;
#define LED 13
int cnt = 0;

void setup() {
delay(1000);
Serial.begin(9600);
Serial.print("Waiting to come online");
for (;;) {
if ( (sakuraio.getConnectionStatus() & 0x80) == 0x80 ) break;
Serial.print(".");
delay(1000);
}
Serial.println("");
pinMode(LED, OUTPUT);
}

void loop() {
uint8_t available;
uint8_t queued;
boolean signal_flg;
boolean blink_flg;
cnt++;
Serial.print("Count :");
Serial.print(cnt);
available = 0;

//************************************************************
//* 1.sakura.ioからデータを取得
//************************************************************
if (sakuraio.getRxQueueLength(&available, &queued) != CMD_ERROR_NONE) {
Serial.println("[ERR] get rx queue length error");
}

if (available > 0){
uint8_t ch, type, value[8];
int64_t offset;
sakuraio.dequeueRx(&ch, &type, value, &offset);
Serial.print(" Value :");
Serial.println(value[0]);
if (value[0] == 1) {
signal_flg = 1;
}else{
signal_flg = 0;
}
}

//************************************************************
//* 2.取得したデータをもとにLEDを光らせる
//************************************************************
if(signal_flg == 1){
//1-光らせる
digitalWrite(LED, HIGH);
blink_flg = 1;
}else{
//0-消す
digitalWrite(LED, LOW);
blink_flg = 0;
}
sakuraio.clearRx();
delay(1000);
}

 

実際にArduinoに書き込み、シリアルモニタを表示した状態で先ほどのサーバ側プログラムにval=1やval=0としてアクセスすると、ブラウザ上は真っ白なページが表示されるだけ。変化はありませんが、シリアルモニタに下記のように数値の変化が見られ、Arduino側に接続された通信モジュールに正常に値を送信できていることが確認できますね!

5fb752879e99b712b53bc09dad672280
Incoming Webhookでデータを受信

 

サーバ側プログラムを修正して、ON(val=1)/OFF(val=0)を切り替えるようにしてみました。

 

これで、手軽に外部からsakura.ioを通じてArduinoを制御することができますね!

 

まとめ

sakura.ioを使って実際に通信することができました!次回はさらにスマートフォンやほかのアプリから通信モジュールを通じてArduinoを制御するデバイスの作成に取り組んでみたいと思います!

 

第67回 ArduinoとSakura.ioで気軽にIoTデバイスを作ってみる – GPSロガーデバイスの作成(前編)

$
0
0

dav

前回までsakura.ioの使い方について学んできました。今回はsakura.ioの通信モジュールを使ってGPSロガーを作成してみたいと思います。

目次

  1. GPSモジュールについて
  2. sakura.ioのOutgoing Webhookについて
  3. GPSロガープログラム
  4. まとめ

 

1.GPSモジュールについて

つい先日のニュースで測位衛星「みちびき」4号の打ち上げ成功がニュースになっていましたね。みちびきは日本向けのGPS用衛星で、これまですでに3機が地球上を周回しており今回の打ち上げ成功で、4機目となります。これで8時間交代(3号機は電波補助を主目的とする)で日本の上空を周回するようになるので、GPSの精度がさらに高精度になることが期待されています。

ということで、今回は第60回でも紹介したみちびき対応のGPSモジュールを利用して、sakura.ioと組み合わせてGPSロガーを作成してみましょう。

setting

第60回でも利用したみちびき対応AE-GPSモジュール

このGPSモジュールはArduinoとソフトウェアシリアルを通じて利用することができます。簡単に使い方を振り返りましょう。回路とプログラムは下記のようにソフトウェアシリアルの10,11を利用して位置情報を取得します。プログラムはTinyGPS++というライブラリを利用していますのでインストールしていない場合は、事前にインストールしてください。屋内で実験する場合は、GPS衛星をアンテナがつかみにくい場合があるので、窓際などで実験してみてください。

2017-05-11 11.22.18 (1)


#include &amp;amp;amp;lt;TinyGPS++.h&amp;amp;amp;gt;
#include &amp;amp;amp;lt;SoftwareSerial.h&amp;amp;amp;gt;

TinyGPSPlus gps;
SoftwareSerial mySerial(10, 11); // RX, TX
//TinyGPSCustom magneticVariation(gps, "GPRMC", 10);
void setup() {
Serial.begin(57600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}

Serial.println("Goodnight moon!");

// set the data rate for the SoftwareSerial port
mySerial.begin(9600);
mySerial.println("Hello, world?");
}

void loop() { // run over and over
while (mySerial.available() &amp;amp;amp;gt; 0){
char c = mySerial.read();
//Serial.print(c);
gps.encode(c);
if (gps.location.isUpdated()){
Serial.print("LAT="); Serial.println(gps.location.lat(), 6);
Serial.print("LONG="); Serial.println(gps.location.lng(), 6);
Serial.print("ALT="); Serial.println(gps.altitude.meters());
}
}
}

シリアルモニターに緯度経度が整形された形で表示されていればGPS側の準備はOKです。

次にsakura.ioの通信モジュールを使いますので、Arduinoの上にsakura.ioシールドを重ねて、その上にGPSモジュールを接続してください。

 

dav

 

2.sakura.ioのOutgoing Webhookについて

次に取得したGPS位置情報をsakura.ioに送るために、通信モジュールの準備をします。これまでwebsocketやincoming webhookの方法を利用してきましたが、今回は通信モジュールから定期的にデータを送信するのに適しているOutgoing Webhookという方法で通信をします。

2-1.Outgoing Webhookの設定について

outgoing webhookの設定は、websocketやincoming webhook同様、まずsakura.ioの管理画面で設定を行います。下記画面の「サービス追加」を選択して連携サービスの選択画面を開いてください。

138e2431e6bb98e455717983e5ea9747_2

追加サービスの選択画面が表示されたら、「Outgoing Webhook」を選択します。

bbd305adaf3523c02b72979a6c5bd38a

Outgoing Webhookの設定に必要な項目を入力してください。

名前:任意のわかりやすい名前など
Payload URL:通信モジュールからデータを送る先のURL
Secret:シークレットキーを設定した場合、通信にこのSecretキーがあっているかどうか認証されます

92715b3ca5f2ababda02f3c9cb745dd4

入力が完了したら、「保存」を押して、sakura.ioの管理画面側の設定は完了です。

 

2-2.Outgoing WebhookのArduino側の送信プログラム

sakura.ioの設定ができたら、実際にArduinoプログラムで送信部分を作成します。Outgoing Webhookも基本的な送信方法はwebsocketの時と変わりません。その手軽さもsakura.ioの魅力の一つですね。

Outgoing Webhookのデータ送信プログラム


#include &amp;lt;SoftwareSerial.h&amp;gt;
#include &amp;lt;SakuraIO.h&amp;gt;
 
SakuraIO_I2C sakuraio;
uint32_t cnt;

void setup(){
 // Open serial communications and wait for port to open:
 Serial.begin(57600);
 while (!Serial) {
 ; // wait for serial port to connect. Needed for native USB port only
 }
}

//sakura.ioのoutgoingでデータを送信
void sendSakuraIo(float latitude,float longitude){
 //キューにデータを設定
 sakuraio.enqueueTx((uint8_t)0,(float)latitude);
 sakuraio.enqueueTx((uint8_t)1,(float)longitude);
 //データを送信
 sakuraio.send();
}
 
void loop() { // run over and over

sendSakuraIo(43.1245533,141.23355455);
 delay(5000);
}

このプログラムでは、sendSakuraIo関数に直接位置情報の数字(43~)などを指定して、sakura.ioに送信するサンプルになっています。このプログラムをArduinoに書き込みをして動作をさせつつ、受信側の準備を続けます。

 

2-3.Outgoing Webhookの受信プログラムについて

Outgoing Webhookでsakura.ioの通信モジュールから送信されたデータはどのような形で取得できるのでしょうか、2-2で動作させたプログラムでは5秒おきにPayloadURLに指定した場所にデータが届いているはずですので、そのURLに届いている受信したデータをすべて表示するプログラムを用意して中身を見てみます。下記はPHPで通信モジュールから受信したデータをそのままdata.txtに書き込むサンプルプログラムです。PayloadURLの場所に設置してみてください。


&amp;lt;?php
$secret = "";
 
$json = file_get_contents('php://input');
$object = json_decode($json, true);
 
if (!empty($secret)) {
 $hash = hash_hmac('sha1', $json, $secret);
 if ($hash != $_SERVER["HTTP_X_SAKURA_SIGNATURE"]) exit;
}
 
ob_start();
var_dump($object);
$str = ob_get_contents();
ob_end_clean();
 
file_put_contents("data.txt",$str);

9ba65310f6977c0792cc05baa33f34b5

data.txtの中身

data.txtを見てみると、module名や、受信した日時、channelsの中に送信したデータが確認できればOKです。実際にロガーとして活用するには、この位置情報のデータをデータベースにためたりするなどして活用を試みてください。

 

3.GPSロガープログラム

GPSモジュール、sakura.ioの通信モジュールのそれぞれの準備ができましたので、プログラムを組み合わせてGPSロガーとして利用できるようにします。GPSの位置情報が取得できたとき(if (gps.location.isUpdated()){)に通信モジュールからデータを送信する流れとなっています。


#include &amp;lt;TinyGPS++.h&amp;gt;
#include &amp;lt;SoftwareSerial.h&amp;gt;
#include &amp;lt;SakuraIO.h&amp;gt;
 
TinyGPSPlus gps;
SoftwareSerial mySerial(10, 11); // RX, TX
//TinyGPSCustom magneticVariation(gps, "GPRMC", 10);

SakuraIO_I2C sakuraio;
uint32_t cnt;

void setup(){
 // Open serial communications and wait for port to open:
 Serial.begin(57600);
 while (!Serial) {
 ; // wait for serial port to connect. Needed for native USB port only
 }
}

//sakura.ioのoutgoingでデータを送信
void sendSakuraIo(float latitude,float longitude){
 //キューにデータを設定
 sakuraio.enqueueTx((uint8_t)0,(float)latitude);
 sakuraio.enqueueTx((uint8_t)1,(float)longitude);
 //データを送信
 sakuraio.send();
}
 
void loop() {
 while (mySerial.available() &amp;gt; 0){
 char c = mySerial.read();
 //Serial.print(c);
 gps.encode(c);
 if (gps.location.isUpdated()){
 Serial.print("LAT="); Serial.println(gps.location.lat(), 6);
 Serial.print("LONG="); Serial.println(gps.location.lng(), 6);
 Serial.print("ALT="); Serial.println(gps.altitude.meters());
 sendSakuraIo(gps.location.lat(),gps.location.lng());
 }
 }
 delay(5000);
}

無事、データが受信できれば完成です。

 

まとめ

GPSモジュールとsakura.io通信モジュールを組み合わせてGPSロガーデバイスを作成しました。次回は、さらにこのGPSロガーで取得したデータをGooglemapやslackなどのサービスと連携して実際に活用できる形にしてみたいと思います。

 

第68回 ArduinoとSakura.ioで気軽にIoTデバイスを作ってみる – GPSロガーデバイスの作成(後編)

$
0
0

gps

前回までGPSモジュールで取得した位置情報をsakura.ioの通信モジュールを通じてサーバーに送信することができました。今回はさらに実用的に利用するために、送信されたデータを活用するためにslackやgoogleMapで見る方法など、いくつかの方法をご紹介します。

目次

  1. 位置情報データの表示活用について
  2. googleMapで見てみる
  3. slack連携してみる
  4. まとめ

 

1.位置情報データの表示活用について

前回取得したデータは緯度経度、そのままの数値情報になっていますが、それだと味気ないのでgoogleMapやslackなどの外部サービスと連携をしてみたいですよね。GPSロガーの一般的な使い方としては、例えばジョギングや登山などの際にどういうルートを通ったか後で確認するのに使ってみたり、車に載せてあとで振り返ったり、応用して子供に持たせて防犯で利用したりと位置情報が手軽に扱えるといろいろできそうな感じがしてきますね。

 

各データで活用するために、前回のサーバーサイドのプログラムを修正して、位置情報だけファイルに保存されるように変更してみます。data.csvに最新の位置情報が時刻とともに追加されるようにしています。(※実際に公開して運用するなどの場合は、エラー処理などを加えたり、外部からアクセスされた場合におかしな挙動をしないようにするなどの処理が必要になりますが、このプログラムでは中心となる部分を紹介しています)

位置情報を保存するプログラム(PHP)


&amp;amp;lt;?php
$secret = "";

$json = file_get_contents('php://input');
$object = json_decode($json, true);

if (!empty($secret)) {
$hash = hash_hmac('sha1', $json, $secret);
if ($hash != $_SERVER["HTTP_X_SAKURA_SIGNATURE"]) exit;
}
$gpsData = file_get_contents("data.csv"); //これまでのGPSデータの取得
//位置情報だけを保存
$lat = 0;
$lng = 0;

if($object["type"] == "channels"){
foreach($object["payload"]["channels"] as $val){
//lat
if($val["channel"] == 0){
$lat = $val["value"];
}
//lng
else if($val["channel"] == 1){
$lng = $val["value"];
}
}
$gpsData = date("Y/m/d H:i:s").",".$lat.",".$lng."\n".$gpsData; //最新のGPSデータの追加
file_put_contents("data.csv",$gpsData); //data.csvに保存

}

これで、data.csvには下記のようなデータが保存されるようになりました。

2017/10/15 10:05:10,43.235256,141.355345
2017/10/15 10:05:05,43.233256,141.355245
2017/10/15 10:05:00,43.232256,141.355145

2.googleMapで見てみる

csvに位置情報を溜まっていくのでさっそくGoogleMapで表示してみましょう。PayloadURLにアクセスするのは通信モジュールですが、ブラウザで開いた際(人がアクセスした際)にgoogleMapのリンクが表示されるプログラムを用意してみます。ファイル名は、PayloadURLとは違うものにして保存してください。このプログラムにアクセスするとgoogleMapのリンク一覧が表示されるようになっています。

googleMapリンク一覧のプログラム(PHP)


&amp;amp;lt;?php
$file = new SplFileObject("data.csv"); //PHP5.3以上の場合
foreach ($file as $line) {
$line = mb_convert_encoding($line, 'UTF-8', 'auto');
$gpsData[] = str_getcsv($line);
}

//viewモードの場合(URLのGETにviewが設定されている場合)は、googleマップで最新の位置情報リンクを表示
echo '&amp;amp;lt;html&amp;amp;gt;';
echo '&amp;amp;lt;head&amp;amp;gt;&amp;amp;lt;/head&amp;amp;gt;';
echo '&amp;amp;lt;body&amp;amp;gt;';
echo '&amp;amp;lt;ul&amp;amp;gt;';
foreach($gpsData as $val){
if(count($val) == 3){
echo "&amp;amp;lt;li&amp;amp;gt;".$val[0].":&amp;amp;lt;a href='https://www.google.com/maps?q=".$val[1].",".$val[2]."'&amp;amp;gt;googleMapで見る&amp;amp;lt;/a&amp;amp;gt;&amp;amp;lt;/li&amp;amp;gt;";
}
}
echo '&amp;amp;lt;/ul&amp;amp;gt;';
echo '&amp;amp;lt;/body&amp;amp;gt;';
echo '&amp;amp;lt;/html&amp;amp;gt;';

プログラムにブラウザでアクセスすると、下記のようなリンク一覧が表示され、リンクをクリックするとgoogleMapが表示されるようになりました。

9a86255d904db220fbd8dfd1f204da19

なんかサーバーサイドは大変そう…このCSVをもっと手軽に見たい!という人はGoogle Earthにcsvをインポートすることで地図上で手軽に見ることもできますので、それでまずは楽しんでみるのもいいかもしれません。

76957c5c5ee2cb56ff5675acb6de11db

Google EarthにCSVを読み込み

 

基本的なGPSロガーとしては、Google Earthに読み込むだけで十分な気もしてきますね!ただ、自分だけの使いやすいGPSロガーにするにはプログラムを改良する必要があるので、次はslackというサービスと連携してみます。

 

3.slack連携してみる

slack(スラック)は簡単に言うとビジネス向けチャットサービスで主にエンジニアなどを中心に世界的に利用されているサービスです。このslackにもsakura.io同様にincoming webhookやoutgoing webhookなどのほかのサービスと連携する口が用意されていて、今回それを使って位置情報が送られて来たらslackに通知をする仕組みを実現してみたいと思います。

21eb37106345d747cfd6b7ebd87923fb
slack

 

slackでincoming webhookを使う場合の設定画面は、下記のURLから設定を行います。

https://api.slack.com/apps

このURLにslackにログインした状態でアクセスすると「Create New App」という緑色のボタンがあるので、そこから連携するためのアプリを追加する流れに進みます。

6ae5c1c05b4af62fb2aa210c229086a8

「Create New App」をクリック

 

b382f070d23b6ba60fd5dc0f993a2f08

App名を任意で入力して、Workspaceを選択してCreate Appをクリック

 

必要事項を入力すると、slackとの接続用のアプリができますので、さらに表示された画面で「Incoming Webhooks」を選択して設定画面に進みます。

2f18bdf9baf1dbd7b60e316dd24bc3da

Incoming Webhooksの画面では、表示した際にはOffに設定されているので「Off」をクリックして「ON」に変更すると設定項目が表示されます。

67ff827b557c4b829a9cf677daf27d43

ONにすると、下記の表記が画面の下に追加されますので、「Add New Webhook to Workspace」を選択します。

fcdb3cc4f3fa542244bd260205c78a30

すると、どのチャンネルに通知するか選択する画面がでるので、今回は#botチャンネルを設定しました。
Authorize」を選択して設定完了となります。

a02bee19ea61a0dcc4e958baf28360c5

設定が完了するとWebhook URLの項目に通知用のURLが設定されますので、このURLに対して位置情報を送信するとslackに通知されるようになります。

1b13b9271d014b37929136db86fcdf65

slack側の準備ができたので、位置情報が届いた際にslackに通知する処理をプログラムに追加します。
先ほどの位置情報を保存するプログラム(PHP)の一番最後に下記のコードを追加します。

slack通知を加えたプログラム(PHP)


function send_to_slack($message) {
//$webhook_url = 'https://hooks.slack.com/services/XXXXX/XXXXX';
$webhook_url = 'https://hooks.slack.com/services/XXXXX/XXXXX';
$options = array(
'http' => array(
'method' => 'POST',
'header' => 'Content-Type: application/json',
'content' => json_encode($message),
)
);
$response = file_get_contents($webhook_url, false, stream_context_create($options));
return $response === 'ok';
}
$message = array(
'username' => 'Baroon',
'text' => "https://www.google.com/maps?q=".$object["lat"].",".$object["lng"],
);

//send_to_slack($message);

これで、正常に動作すると下記のようにslackに通知が届くようになります。

gpslogger

位置情報が変わったら通知をするなど、プログラムの工夫次第でいろいろ応用ができそうですね!

 

まとめ

今回、実際に取得したGPSの位置情報を活用して地図で表示したり通知する方法を紹介しました。デバイスをケースに入れてコンパクトに収納することで実際に本格的なGPSロガーとしても利用することができますので、ぜひいろいろなアイデアで試してみてください!

第69回 ESP-WROOM-32をArduinoで触ってみよう(環境構築セットアップ~Lチカ編)

$
0
0

Arduinoの互換ボードで、そのサイズやWi-Fiが搭載しているなどの理由から人気があり、本連載でも第32~36回で取り扱ったESP-WROOM-02。今回、その後継として今年の春に発売されたESP-WROOM-32の基本的な使い方や、新たに搭載されたBluetooth(BLE)機能などを扱ってみたいと思います。

今回の電子工作レシピ

完成までの時間目安:60分
必要なパーツ

目次

  1. ESP-WROOM-32って何?
  2. ESP-WROOM-32の機能・性能
  3. Arduinoで使うための環境構築セットアップ
  4. プログラムの作成~Lチカ
  5. まとめ

 

1.ESP-WROOM-32って何?

dav

ESP-WROOM-32

ESP-WROOM-32は、第32回から紹介したESP-WROOM-02と同様、Espressif Systems社が提供しているESP32というチップを搭載したWi-Fi通信やBluetooth(BLE)通信が可能なWi-Fiモジュールのことです。ESP-WROOM-02よりやや大き目ですが、小さいサイズながらもArduinoのプログラムを書き込める(Arduinoとして利用出来る)、Wi-Fi通信が可能、そして安価というメリットを持っています。

 

2.ESP-WROOM-32の機能・性能

下記の表はこれまでのモデルESP-WROOM-02との比較表になります。

左)ESP-WROOM-32 | 右)ESP-WROOM-02

左)ESP-WROOM-32 | 右)ESP-WROOM-02

 

ESP-WROOM-02(ESP8266) ESP-WROOM-32(ESP32)
サイズ 縦20mm × 横18mm 縦25.5mm × 横18mm
CPU Tensilica LX106 @ 80 / 160 MHz Tensilica Xtensa Dual-Core LX6 @ 160 / 240Mhz
RAM 36KB available to user 520 KB
フラッシュメモリ 1, 2, 4, 8, 16 MB 64MB
Wi-Fi 802.11n up to 65 Mbps,
802.11g up to 54 Mbps
802.11n up to 150 Mbps,
802.11g up to 54 Mbps,
802.11 b/g/n/d/e/i/k/r
Bluetooth Bluetooth v4.2 BR/EDR and BLE specification
ピン数 18pin 38pin
電源 3.0~3.6V / 80 mA 2.2~3.6V / 80 mA
利用可能温度 -40℃~125℃ -40℃~125℃

ざっくりとした違いの特徴としては、

  • ESP-WROOM-02よりやや大きい
  • Bluetoothが使える
  • CPU/RAM/フラッシュメモリなどの性能が上がっている
  • ピン数が増えた
  • 電源電圧の幅が広がった

となります。Bluetoothが使えることや性能が上がったことはもちろんですが、ピン数が増えたり電源電圧の幅が広がるのは実際に制作している際に非常に助かる部分ですね。

 

3.Arduinoで使うための環境構築セットアップ

さっそくArduinoとしてESP-WROOM-32を利用していきたいと思います。ESP-WROOM-02の時もそうですが、このボードもUSBで接続して、すぐArduino IDEを立ち上げてプログラムをすぐ書き込み、というわけにはいかず、最初に利用するための環境を構築する必要があります。

今回は、ESPr Developer 32という、基板にはんだづけなどをしなくてもすぐUSBにさして利用できる開発用ボードを使って進めていきたいと思います。

ESPr Developer 32

ESPr Developer 32

環境構築の主な流れ(Windows向け)は下記のとおりです。
構築に関する細かな情報はSWITCH SCIENCEさんのサイトで紹介されていますが、ここではそのポイントを押さえて紹介していきたいと思います。

  1. Arduino IDEにESP32のボードを追加する
  2. ドライバをインストールする
  3. ボードをPCに接続する

 

3-1.Arduino IDEにESP32のボードを追加する

はじめに、Arduino IDEの「ツール」-「ボード」にESP32が選択できるようにするためにボード情報を追加する必要があります。

下記のGithubのサイト上で必要なファイルが公開されていますので、ダウンロードします。

GitHub espressif arduino esp32 Arduino core for the ESP32

画面中央の右側に「Clone or download」というボタンがありますのでそこをクリックして、「Download ZIP」を選択します。

GitHub espressif arduino esp32 Arduino core for the ESP32

ダウンロードしたZIPの中身は下記のようになっていると思います。

d3663c3a7488677838c6d6dbc7aaeca8

これらのフォルダやファイルを、Windowsの場合は下記のArduinoをインストールしている場所に保存します。

例) C:\Program Files (x86)\Arduino\hardware\espressif\esp32\

次に、保存したファイルの中から、tools/get.exeを起動してさらに必要なファイルをダウンロードします。

472a83cae319af6afde8ffe54b127562

get.exeをクリックして起動します。すると、コマンドプロンプトの画面が表示されて、必要なファイルがダウンロードされます。

c4496ce7e93f0567061bf54dcea2a9923

※ダウンロードされたファイルは同じ場所に通常ダウンロードされますが、別の場所(C:\Users\配下など)にダウンロードされた場合は、esp32\tools配下に移してください

例) C:\Program Files (x86)\Arduino\hardware\espressif\esp32\tools\

これで、必要なファイルの準備は整いました。

 

3-2.ドライバをインストールする

次に、ボードのドライバをインストールします。ドライバはUSB UARTを利用するためのドライバが必要なので下記のサイトからダウンロードします。

※過去にESP-WROOM-02などを利用したことがある方はすでにインストールされている可能性がありますのでこの手順はスキップしてください。

544d6d912cd237122c60adc866885e91

UARTドライバのダウンロード

上記のサイトを開くとページの下にそれぞれのOSに合わせたドライバが用意されていますので、ダウンロードしてドライバをインストールしてください。

 

3-3.ボードをPCに接続する

ここまで準備ができたら、実際にESP-WROOM-32のボードをPCに接続します。

PCに接続すると赤色LEDが点灯

PCに接続するとPWRの赤色LEDが点灯

Arduino IDE側でも「ツール」-「シリアルポート」で接続が認識できれば準備は完了です。

 

4.プログラムの作成~Lチカ

準備ができたらさっそくArduino IDEでプログラムを書き込みしてみます。まずはLチカということで、スケッチの例から「01.Basics」-「Blink」プログラムを開きます。

プログラムを開いたら、「ツール」からボードを「ESP32 Dev Module」に設定してプログラムを書き込みしてください。

ide01

プログラムの書き込みが完了すると、無事Lチカができました!
(今回は13番ピンを指定していますので、ESPr Developer32側も13ピンとGNDにLEDを接続しています)

 

まとめ

今回無事ESP-WROOM-32を利用することができましたので、次回はBluetooth通信をしてみたいと思います!


第70回 ESP-WROOM-32をArduinoで触ってみよう(Bluetooth-BLE接続編)

$
0
0

前回、ESP-WROOM-32の準備編としてArduinoで利用する方法をご紹介しました。今回は、Bluetooth(BLE)機能などを扱い、ほかのデバイスとESP-WROOM-32をつないでみます。

今回の電子工作レシピ

完成までの時間目安:60分
必要なパーツ

目次

  1. Bluetoothって何?
  2. BluetoothとBLEの違い
  3. ESP-WROOM-32でBLEを使うための準備
  4. サンプルプログラムの動作
  5. まとめ

 

1.Bluetoothって何?

keyboard_mouse_smartphone最近はイヤホン・ヘッドホン、スピーカー、カーオーディオ、マウス、キーボードetc…いろいろな機器がBluetooth(ブルートゥース)通信に対応しています。Bluetooth通信は、Wi-Fiなどの無線通信と同じとは言えませんが、よく使う方には比較的身近な通信になってきているのではないでしょうか。

そもそも、このBluetooth通信というのはいったいどのような通信なのでしょうか?なんとなく近くのものをつなぐ、遠くのものとは通信できない、という印象がありますね。ざっとBluetoothの仕組みや仕様を学んでみます。

Bluetooth
Bluetooth(ブルートゥース、ブルーツース)は、デジタル機器用の近距離無線通信規格の1つである。
数mから数十m程度の距離の情報機器間で、電波を使い簡易な情報のやりとりを行うのに使用される。 当初、エリクソン、インテル、IBM、ノキア、東芝の5社(プロモーター企業)によって策定された。その後マイクロソフト、モトローラ、3COM、ルーセント・テクノロジーの4社がプロモーター企業として加わった。現在は3COM、ルーセント・テクノロジーの2社が脱退し、アップル、およびNordic Semiconductorが加わり、9社がプロモーター企業となっている。IEEEでの規格名は、IEEE 802.15.1である。 2.4GHz帯を使用してPC(主にノートパソコン)等のマウス、キーボードをはじめ、携帯電話、PHS、スマートフォン、タブレットでの文字情報や音声情報といった比較的低速度のデジタル情報の無線通信を行う用途に採用されている。

[引用:wikipedia] https://ja.wikipedia.org/wiki/Bluetooth

wikipediaに書かれているように、基本的にはデジタル機器で利用することを想定された近距離無線通信規格がBluetoothということですね。

どういう風に認識・接続するの?

Bluetoothは実際に利用する際には、「ペアリング」・「接続」という手順が必要になります。無線LAN等だと、アクセスポイントに対してパスワードを入力して接続というのが一般的ですが、Bluetoothの場合は、どちらかのデバイスがもう片方のデバイスを検出して登録する(認証する)、というプロセスが必要です。

pealing

ペアリングとは?

例えばスマホとヘッドホンをBluetoothで利用したい場合、最初にペアリング設定が必要になります。ここでは、お互いのデバイスが接続許可するための顔合わせ(認証登録)の儀式になります。この儀式がなく、例えばBluetoothが無線LANと同じような仕組みになってしまうと自分がヘッドホンを使っている最中に、Bさんがパスワードで認証してヘッドホンとBさんのスマホを接続してしまうとBさんのスマホの音楽がヘッドホンから流れてしまう、という状況になってしまいますね。そういう問題を防ぐために、Bluetoothでは、デバイス同士の認証登録をしたうえで、実際に利用するときはその登録されている機器のみ接続ができる、という仕組みになります。
ですので、基本的にこれらのデバイスの場合は、Bluetoothを使って接続できるのは一つのBluetoothモジュールに対して同時にお互い1台となります。

 

2.BluetoothとBLEの違い

Bluetoothと合わせてBLEという表記を見たことがある方はいますでしょうか? このBLEもBluetoothの一つの種類で、デバイスの種類や用途に応じてこのBLEでの通信をするケースがあります。BLEは正式にはBluetooth Low Energyということで、通常のBluetoothよりもさらに省電力で利用できるデバイスを想定した通信方式となります。

BluetoothとBLEの違いは通信速度と消費電力、と言えるでしょう。比較的大きなデータを送る用途の場合、Bluetoothヘッドホンなどのデバイスは音声データなどを送る必要があるため、通常のテキスト情報などと違い、ある程度の通信速度や消費電力が必要になり、BLEなどは向いていません。また、単純に電源のON/OFF状態や、テキストや数値データで単純に表現できるデータであれば消費電力の少ないBLEが向いています。(※BLEはペアリングが必要ないケースもあります)

bluetooth2

ESP-WROOM-32ではBLE通信にモジュールが対応していますので、さっそく利用してみましょう。

 

3.ESP-WROOM-32でBLEを使うための準備

さっそくESP-WROOM-32でBLEを使ってみます。前回環境構築をしましたが、それだけだとすぐArduinoでBLE通信をすることができません。利用に必要なファイルをダウンロードして展開します。

8b26d025d3b87b76fcf38541eb764d5e

必要なファイル-ESP-BLE-Arduino
https://github.com/nkolban/ESP32_BLE_Arduino/tree/98cd2290d036a4e27db061a76a512b526ef1cc14

このページからファイルをダウンロード(ページ上の「Clone or download」から、ZIPファイルをダウンロードしてください)したものを、前回同様Arduinoインストール先のlibraries/BLEディレクトリに保存します。

5dc1005b21d41c3cc2e165ee36123b25

libraries/BLEディレクトリ配下にダウンロードしたファイルを展開

このファイルを設置したのち、Arduino IDEを再起動すると、スケッチ例などにESP BLE Arduinoというものが作成されますので、それが見られれば準備はOKです。

 

BLE01

 

4.サンプルプログラムの動作

では、準備ができたところでESP-WROOM-32をBluetoothデバイスとして動かしてみます。「ファイル」-「スケッチ例」-「ESP32 BLE Arduino」-「BLE_client」のプログラムを開いて、ボードに書き込みをしてみてください。

書き込みが完了した段階でBLEのクライアントとして起動されます(BLEにはクライアントに対してサーバという概念が出てきますが次回以降説明します)。

お手持ちのスマホなどでBluetoothを有効にして、周囲のデバイスを検出すると、無事ESP-WROOM-32の端末が表示されました!

Screenshot_20171115-092519

 

まとめ

今回、ESP-WROOM-32をBLEデバイスとして利用する準備ができました。次回は実際にこのBLE通信でスマホからESP-WROOM-32を操作したり、ESP-WROOM-32からスマホにデータを送信したりしてみたいと思います!

 

第71回 ESP-WROOM-32をArduinoで触ってみよう(Bluetooth-BLE送信編)

$
0
0

IMG_20171215_170202

前回、無事ESP-WROOM-32でBluetooth機能を有効にして、スマホ側でデバイスを認識することができました。今回は実際にスマホとESP-WROOM-32をつなげて、デバイス側からスマホ側にデータを送信してみたいと思います。

今回の電子工作レシピ

完成までの時間目安:60分
必要なパーツ

目次

  1. ESP-WROOM-32からスマホに送信したデータを確認する
  2. ESP-WROOM-32のタッチセンサについて
  3. タッチセンサを利用してスイッチのON/OFFをBluetoothで通知
  4. まとめ

 

1.ESP-WROOM-32からスマホに送信したデータを確認する

ESP-WROOM-32からBluetoothを通じてデータを送信するプログラムは、スケッチのサンプルとして用意されています。
まずはそれを使ってスマホ側にデータを送信して、スマホ側でそのデータがきちんと受信できているか確認してみましょう。
Bluetoothのデータをそのまま確認することができるアプリは複数あります。今回は「BLE Scanner」というアプリで確認してみます。

blescanner

BLE Scanner(Android/iOS)

BLE Scannerをインストールして開くと、近くにあるBluetooth端末が表示されて、「CONNECT」ボタンで接続できるようになっています。ESP-WROOM-32にデータ送信サンプルのプログラムを書き込んだ状態でBLE Scannerを起動するとデバイスとして確認できますので、実際にCONNECTで接続してみます。

vol-5

書き込むサンプルプログラムはArduinoIDEの「ファイル」-「スケッチ例」-「ESP32 BLE Arduino」-「BLE_notify」です。

BLE送信用のサンプルプログラム

/*
    Video: https://www.youtube.com/watch?v=oCMOYS71NIU
    Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleNotify.cpp
    Ported to Arduino ESP32 by Evandro Copercini

   Create a BLE server that, once we receive a connection, will send periodic notifications.
   The service advertises itself as: 4fafc201-1fb5-459e-8fcc-c5c9c331914b
   And has a characteristic of: beb5483e-36e1-4688-b7f5-ea07361b26a8

   The design of creating the BLE server is:
   1. Create a BLE Server
   2. Create a BLE Service
   3. Create a BLE Characteristic on the Service
   4. Create a BLE Descriptor on the characteristic
   5. Start the service.
   6. Start advertising.

   A connect hander associated with the server starts a background task that performs notification
   every couple of seconds.
*/
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>

BLECharacteristic *pCharacteristic;
bool deviceConnected = false;
uint8_t value = 0;

// See the following for generating UUIDs:
// https://www.uuidgenerator.net/

#define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"


class MyServerCallbacks: public BLEServerCallbacks {
    void onConnect(BLEServer* pServer) {
      deviceConnected = true;
    };

    void onDisconnect(BLEServer* pServer) {
      deviceConnected = false;
    }
};



void setup() {
  Serial.begin(115200);

  // Create the BLE Device
  BLEDevice::init("MyESP32");

  // Create the BLE Server
  BLEServer *pServer = BLEDevice::createServer();
  pServer->setCallbacks(new MyServerCallbacks());

  // Create the BLE Service
  BLEService *pService = pServer->createService(SERVICE_UUID);

  // Create a BLE Characteristic
  pCharacteristic = pService->createCharacteristic(
                      CHARACTERISTIC_UUID,
                      BLECharacteristic::PROPERTY_READ   |
                      BLECharacteristic::PROPERTY_WRITE  |
                      BLECharacteristic::PROPERTY_NOTIFY |
                      BLECharacteristic::PROPERTY_INDICATE
                    );

  // https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.descriptor.gatt.client_characteristic_configuration.xml
  // Create a BLE Descriptor
  pCharacteristic->addDescriptor(new BLE2902());

  // Start the service
  pService->start();

  // Start advertising
  pServer->getAdvertising()->start();
  Serial.println("Waiting a client connection to notify...");
}

void loop() {

  if (deviceConnected) {
    Serial.printf("*** NOTIFY: %d ***\n", value);
    pCharacteristic->setValue(&value, 1);
    pCharacteristic->notify();
    //pCharacteristic->indicate();
    value++;
  }
  delay(2000);
}

プログラムのアップロードをして、実行した状態でBLE Scannerを起動してみてください。「MyESP32」という名称でデバイスが認識できると思います。

vol71-4

何やらいろいろ英語の文字が出てくるかと思いますが、その中で「CUSTOM SERVICE」という項目をタップしてください。
詳細情報が表示されて、R、W、N、Iといった文字が出てくると思いますが、そのR(Read)をクリックするとESP-WROOM-32から送られてきたデータを見ることができます。サンプルプログラムでは2秒ごとに1ずつカウントした値を送信するようなプログラムになっているので、Rを再度押すとValueの値が増えていることが確認できると思います。

db6c99d182d45c2e6d25f6169e355608

このように、ESP-WROOM-32からBluetooth端末側にデータを手軽に送ることができます。

 

2.ESP-WROOM-32のタッチセンサについて

実はESP-WROOM-32にはBluetoothやWi-Fiの他、デフォルトで内蔵されている様々なセンサ機能を利用することができます。
主な利用できるセンサは下記のとおりです。

・ホールセンサ
・温度センサ
・タッチセンサ

今回はタッチセンサを使って、Bluetoothと組み合わせてみたいと思います。
タッチセンサは、今では当たり前となったスマホの画面などに使われています。この主な仕組みとしては静電容量方式という方式で、人体とデバイスの電極の間に発生する静電容量の変化を読み取り、入力のオンオフを検知する方法です。
ESP-WROOM-32ではタッチセンサとして利用できるピンが複数あるので、それをうまく使うことで静電入力式のパネルなども作成することができます。

データシート参照(2.Pin DefinitionsにTouchとして利用できるピンが記載)

 

2-1.タッチセンサを使ってみる

ArduinoIDEの「ファイル」-「スケッチ例」-「ESP 32」-「Touch」-「TouchRead」のサンプルを呼び出してください。
このプログラムでは、T0(4番ピン)の入力値をシリアルモニタに表示する内容になっています。このプログラムをESP-WROOM-32に書き込んで実行すると、T0(4番ピン)に触れたときに、シリアルモニターの値が変化することが確認できます。
T0(4番ピン)に入力された数値の変化をON/OFFに利用したりすることでタッチセンサとして機能させることができます。

タッチセンサのサンプルプログラム

// ESP32 Touch Test
// Just test touch pin - Touch0 is T0 which is on GPIO 4.

void setup()
{
  Serial.begin(115200);
  delay(1000); // give me time to bring up serial monitor
  Serial.println("ESP32 Touch Test");
}

void loop()
{
  Serial.println(touchRead(T0));  // get value using T0
  delay(1000);
}

vol71-6

 

3.タッチセンサを利用してスイッチのON/OFFをBluetoothで通知

タッチセンサの入力が確認できたので、この処理をBluetooth通信側のプログラムに組み込みます。
Bluetoothにつながった状態のときに、T0(4番ピン)を触れるとスイッチがON、スイッチが入っている時にT3(14番ピン)を触れるとスイッチがOFFになるような処理にしてみます。

スイッチのON/OFFが分かりやすいようにLEDをつけておきます。Bluetooth接続の際には、12,13番ピンはBluetooth側で利用されているため、LED出力用には14番ピンを指定しています。(12,13番ピンなどを指定するとコンパイルや書き込みは成功しますが、エラーになってしまいます)

vol71-3

スイッチON/OFFのBluetooth送信プログラム

/*
    Video: https://www.youtube.com/watch?v=oCMOYS71NIU
    Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleNotify.cpp
    Ported to Arduino ESP32 by Evandro Copercini

   Create a BLE server that, once we receive a connection, will send periodic notifications.
   The service advertises itself as: 4fafc201-1fb5-459e-8fcc-c5c9c331914b
   And has a characteristic of: beb5483e-36e1-4688-b7f5-ea07361b26a8

   The design of creating the BLE server is:
   1. Create a BLE Server
   2. Create a BLE Service
   3. Create a BLE Characteristic on the Service
   4. Create a BLE Descriptor on the characteristic
   5. Start the service.
   6. Start advertising.

   A connect hander associated with the server starts a background task that performs notification
   every couple of seconds.
*/
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>

BLECharacteristic *pCharacteristic;
bool deviceConnected = false;
uint8_t value = 0;

bool ledFlg = false;

// See the following for generating UUIDs:
// https://www.uuidgenerator.net/

#define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"


class MyServerCallbacks: public BLEServerCallbacks {
    void onConnect(BLEServer* pServer) {
      deviceConnected = true;
    };

    void onDisconnect(BLEServer* pServer) {
      deviceConnected = false;
    }
};



void setup() {
  Serial.begin(115200);

  pinMode(14, OUTPUT);  

  // Create the BLE Device
  BLEDevice::init("MyESP32");

  // Create the BLE Server
  BLEServer *pServer = BLEDevice::createServer();
  pServer->setCallbacks(new MyServerCallbacks());

  // Create the BLE Service
  BLEService *pService = pServer->createService(SERVICE_UUID);

  // Create a BLE Characteristic
  pCharacteristic = pService->createCharacteristic(
                      CHARACTERISTIC_UUID,
                      BLECharacteristic::PROPERTY_READ   |
                      BLECharacteristic::PROPERTY_WRITE  |
                      BLECharacteristic::PROPERTY_NOTIFY |
                      BLECharacteristic::PROPERTY_INDICATE
                    );

  // https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.descriptor.gatt.client_characteristic_configuration.xml
  // Create a BLE Descriptor
  pCharacteristic->addDescriptor(new BLE2902());

  // Start the service
  pService->start();

  // Start advertising
  pServer->getAdvertising()->start();
  Serial.println("Waiting a client connection to notify...");

}

void loop() {

  if (deviceConnected) {
    int t0val  = touchRead(T0);  // get value using T0 - IO04
    int t3val  = touchRead(T3);  // get value using T3 - IO15
    bool flg = false;

    if(t0val < 70 && !ledFlg){
      //switch on
      digitalWrite(14,HIGH);
      flg = true;
      ledFlg = true;
      value = 1;
      Serial.println("*** SWITCH ON ***");
    }
    if(t3val < 70 && ledFlg){
      //switch off
      digitalWrite(14,LOW);
      flg = true;
      ledFlg = false;
      value = 0;
      Serial.println("*** SWITCH OFF ***");
    }

    if(flg){
      pCharacteristic->setValue(&value, 1);
      pCharacteristic->notify();
      //pCharacteristic->indicate();
      //value++;
    }

  }
  delay(2000);
}

実際に動作させてみた動画です。タッチセンサとして利用するピンにさしたジャンパケーブルを触れると静電容量が変わって入力の切り替えができていることがわかると思います。(動画の字幕をONにすると説明がでます)

スマホ側の数値も変更されていることが確認できますね。このタッチセンサがいいところは、ワイヤーの通電している金属部分を直接触らせなくても入力ができるので、防水加工をして手軽なスイッチに利用、などなどさまざまな可能性を感じることができますね。

 

 

まとめ

ESP-WROOM-32からスマホにデータを送ることができました。実際には、この応用として、AndroidやiOSでアプリを作成して、Bluetoothからの値をサーバーに送信してほかのサービスに連携させたり(以前紹介したIFTTTなど)すると、ESP-WROOM-32を手軽にIoTリモコンとして使うことができちゃいますね。

第1回 ラズパイでAIカメラを自作しよう! 初めの一歩、ラズパイに目、耳、口を追加する

$
0
0

今回は、先日日本でも発売され話題となった「Amazon Echo」や「Google Home」の機能をラズパイで自作してしまいます! いつもとちょっと趣向を変えて、MESHの記事で人気のヨシケンさんのおでましです! 自分独自のクールなガジェットを作ってみませんか?

◆ ◆ ◆

こんにちは、ヨシケンです!
私はRaspberry Piで、GoogleやAmazon、docomoなどのAPI、AI機能を使って、様々なスマート・デバイスを作っています。
スマート・デバイスって何?という方は、今、巷で話題になっている、Amazon Echoなどのスマート・スピーカーや、文字を読取り自動翻訳してくれるGoogleカメラ翻訳などの機能と思ってもらえばいいと思います。
そんなスマートな機器を、安価な小型LinuxコンピュータRaspberry Pi(以下ラズパイと呼んでいきます)を使って、形も機能も自分独自のデバイスを作れたら楽しくないでしょうか?
実際にラズパイを使ってスマート・スピーカーやAIカメラなどを作りながら、その先端的なAPIやAI機能を見ていきます。

AIカメラ

この記事の作例として、写真のようなAIカメラを作っていきたいと思います。カメラで写真を撮ると、写っている物を声で教えてくれたり、外国語を読み取って翻訳してくれるような面白いカメラです。

ラズパイをスマート・デバイスにするために必要なもの

スマート(賢さ)はもちろん最新のAPIやAI機能をラズパイにインストールする事になるのですが、今回はその前段として、それらに必要な情報を収集する検知機能をラズパイに追加していきます。
人間で言えば、目に当たるカメラ、耳となるマイク、そして口になるスピーカーがそれに当たります。
それらをセットアップする事により、ラズパイで音声を録音したり、再生したりする事ができるようになります。またカメラで写真や動画を撮るようにします。

では、スマート・デバイス化の第一歩、ハードウェアのセットアップをしていきましょう。

今回の記事で必要なもの一覧

Raspberry Pi 3 Model B
Raspberry Pi 3 Model B

小型USBマイク
(USBで使えるマイクなら何でも構いませんが、今回は小型で1,000円以下のこちらを使いました。)
小型USBマイク

小型スピーカー
(こちらもイヤフォン・ジャックに差さるものなら構いませんが、充電式アンプ付きのこちらを使っています。)
小型スピーカー

パイ・カメラ
(ラズパイ公式カメラです。これと同形状で夜間撮影が可能なPiNoIRというものもあります。)
パイ・カメラ

小型バッテリー
(小型ならどんなものでも構いません。)
小型バッテリー

今回の記事の流れ

1.Raspberry Piの基本設定を行う
2.スピーカーの設定をして、音を再生してみる
3.マイクの設定をして、録音する
4.カメラを設定して、静止画、動画を撮ってみる
5.まとめ

Raspberry Piの設定

ラズパイとSDカードを買ってきただけですと、まだOSなどのインストールが済んでいません。
ただラズパイのOS Raspbianのインストール方法は、たくさんの情報がインターネットにありますし、デバプラでもこの記事などを見て、まずOSのインストールをして下さい。

Raspberry Piの設定

その後のラズパイへのログイン方法、X-Windowの立ち上げやraspi-configによる最低限のセットアップなどは、こちらのラズパイで何かしたい!と思った人のまとめに詳しく載っていますので、見てみて下さいね。
また、ラズパイに画面やキーボードを繋がなくても、SSH(セキュア通信プロトコル)接続で自分のパソコンからログインして、パソコンのコマンドツールを使う方法もあります。こちらの記事などに詳しくまとまっていますので、参照しながら、パソコンからラズパイのコマンドを操れるようにして下さい。

ここでは、直近のRaspbian(Stretch with Desktop)がインストール済で、ラズパイにSSH接続して、パソコンからコマンド操作が出来るようになっている前提で進めていきます。

ハードウェアの設定

ではラズパイに付けるスピーカー、マイク、カメラなどの設定、接続確認をしていきます。
ハードウェアの設定 width=

モバイルバッテリーは、あっても無くても構いませんが、作例のような箱に入れる時にかさばらない小さめのバッテリーがあるといいと思います。

スピーカーの設定

スピーカーは、大きな音が出るように充電式アンプ付きのものを使っていますが、音声ジャックがあるものであれば何でも構いません。スピーカーをラズパイのジャックに差してみて下さい。
スピーカーの設定

ここから先ほどのラズパイにSSH接続する記事などを参照して、ラズパイにSSH接続してコマンド操作をしていきます。

スピーカーが認識されているか、aplay -lでスピーカーのカード番号を確かめます。

ここでは[bcm2835 ALSA]となっている、card 0. Device 0にスピーカーが認識されている状態です。
サンプル・サウンドを流してみて、音が出るか確認します。

[aplay]

aplay -l

aplay /usr/share/sounds/alsa/Front_Center.wav

ラズパイにSSH接続してコマンド操作

フロント、センター、という英語の女性の声が聞こえたでしょうか?

マイクの設定

次に、マイクをラズパイのUSB端子に差し、使っていきます。
マイクの設定
音声入力の方は、arecord -lでマイクのカード番号を確認する事ができます。この場合は [USB Audio]の部分で、card 1, device 0になっています。
ではarecordで音を録音し、それを先ほどのaplayで聞いてみましょう。
音量の調整は、alsamixerで行います。キーを上にすると音量が上がり、Escで保存後、元の画面に戻ります。

[arecord]arecord -l

arecord test.wav
# 又は
arecord -f S16_LE -r 16000 -D 1 test.wav
# 録音を止める時は、CTRL+C

alsamixer #音量の調整など。止めるときは、Esc

aplay test.wav
# 又は
aplay -f S16_LE -r 16000 test.wav

音量の調整
arecordとaplayを繋げる
最後に、arecordとaplayを繋げて、ファイルにせずに、喋った事をそのままオウム返しに出力してみます。

arecord | aplay
# 又は
arecord -f cd -Dhw:1 | aplay -Dhw:0

しゃべったままの声が、スピーカーから再生
多少ハウリングするかもしれませんが、しゃべったままの声が、スピーカーから再生されればOKです。

カメラの設定

次にカメラの設定に移ります。
カメラは、USB経由でつながる通常のウェブカムでも使えますが、ここではラズパイのカメラ端子にそのまま差せる、パイ・カメラを使っていきます。
白いカメラケーブルをカメラの裏側に差し、ラズパイの中ほどにあるカメラ端子にも差し込みます。端子の白いフックを引き上げ、ロックを外した後に、ケーブルを差しフックを深く入れる事で固定できます。
カメラの設定

では、パイ・カメラで写真を撮ってみます。
ちなみによく間違えるのですが、カメラをつなぐケーブルが下、レンズ上の黒い端子が上側になっていると、上下正しく写真を撮ることができます。(この写真の向きであればOKです。)

パイ・カメラで写真を撮ってみます
ラズパイには標準で、静止画を撮るraspistillと、動画を撮るraspividのコマンドがあるので、簡単に画像を扱えます。念の為apt-get updateをして、全体をアップデートしておいて下さい。

[raspistill]sudo apt-get update #ラズパイをアップデートしておきます

sudo raspistill -o image.jpg

パイ・カメラで写真を撮ってみます
raspistillのコマンドだけで、image.jpgという画像が撮れたと思います。ラズパイのデスクトップ画面経由でその写真を開くか、自分のPCにscpなどでファイルを転送して確認してみて下さい。

パイ・カメラで撮った写真
(パイ・カメラで撮った写真)

それでは、動画も撮ってみます。
ここではh264というフォーマットで、動画を5秒間撮影しています。

[raspivid]
sudo raspivid -o video.h264 -t 5000

動画を5秒間撮影
こちらもデスクトップで開くか、ダウンロードして、動画が撮られているかチェックしてみて下さいね。

(パイ・カメラで撮った動画)

カメラ、スピーカー、マイク、バッテリーが全て付いた状態
(カメラ、スピーカー、マイク、バッテリーが全て付いた状態)

まとめ

今回はラズパイをスマート・デバイスにする最初の一歩、ハードウェアのセットアップを行いました。
人間の目、耳、口に当たる、カメラ、マイク、スピーカーを設定し、最低限の検知機能が備わった訳です。
コマンド操作により、映像を撮影したり、音を聞いて、それを再生したりする事ができるようになったと思います。

次回以降は、小さなお弁当箱のようなケースに入れて、ガジェットっぽくしていきたいと思います。
そしてラズパイに頭脳となるAPIやAI機能を付け加え、スマート・デバイスにしていきます。

次回以降は、小さなお弁当箱のようなケースに入れて、ガジェットっぽくしていきたい今後も「ラズパイを使ってAIカメラを自作しよう」を、お楽しみに!

第2回 ラズパイでAIカメラを自作しよう!ボタンとウェブサーバー機能を付けて、カメラ、マイクを操作

$
0
0

こんにちは、ヨシケンです!
小型LinuxコンピュータRaspberry Pi(以下ラズパイ)を使って、おしゃべり機能やAIが使えるスマート・デバイスを作っていく記事の第二回です。
前回はラズパイに、目となるカメラ、耳になるマイク、口になるスピーカーを追加しました。もしこれらの設定が済んでいない方は、前回の記事を参照して、準備しておいて下さいね。

ボタン追加やウェブサーバー化して、デバイスを操作する

デバイスをスマートにするまで、今回もあと少し準備を進めます。
まずラズパイに物理的なボタンを付けて、それを押すことにより、カメラやマイクを使えるようにします。
またラズパイをウェブサーバーにして、撮った写真などを確認したり、簡単な操作ができるようにもして行きます。

ラズパイに物理的なボタンを付けて、カメラやマイクを使えるようにします

今回の記事で必要なもの一覧

Raspberry Pi 3 Model B

小型USBマイク

小型スピーカー

パイ・カメラ

LED付きタクト・スイッチ(例えばこのような赤や緑に光るスイッチです)
LED付きタクト・スイッチ
ブレッドボード、抵抗、ケーブルなど(必要に応じて)

今回の記事の流れ

1.ラズパイにボタンを追加する
2.ラズパイをウェブサーバー化する
3.ボタン、ウェブサーバーを自動起動して使う
4.まとめ

1.ラズパイにボタンを追加する

前回まではコマンドラインだけの操作でしたが、物理的なボタンを付けて、カメラなどを使えるようにしていきます。

ボタン(タクト・スイッチ)をつなぐ

ボタンとして、押している間だけ通電するタクト・スイッチを使っていきます。今回は、ボタンの中に予めLEDが入っているものなので、ボタン自身が光ってステータスなどの確認ができるので便利です。実際のLED付きスイッチの端子は、このようになっています。
タクト・スイッチ
このスイッチの接続は図のように、LEDのアソード側(細い長い端子)をGPIOの16番につなぎ、短い方をGNDにつなぎます。またスイッチ側(2本端子が2組ある方)の片側をGPIO20と3.3V、反対側をGNDにつなぎます。適宜抵抗をはさんで下さい。
スイッチの接続
実際ブレッドボードを使ってつないだ写真はこちらです。(黒いコードがGND、黄色がLEDでGPIO16に、青がスイッチでGPIO20につながっています。)

実際ブレッドボードを使ってつないだ写真

ボタンのプッシュ回数を検知する

ボタンの操作としては、ワンプッシュ、ダブルプッシュ、長押し、の三種類のアクションに対応できるようにします。
ボタンのプッシュに応じたPythonプログラムを書いていきます。ボタンを押した回数により、その数が表示され、1.5秒以上押すと長押しとして0を表示させるようにします。サンプル・スクリプトbutton_led.pyはこのようになります。

[button_led.py]

さあ、このプログラムを流してみましょう。

ボタンを一回押したり、長押ししたりする事で、LEDが光ったり、コマンドラインに押した数が表示されたでしょうか?

ボタン・プッシュに応じて、動きを変える

では更に、ボタンのプッシュに応じてカメラ、マイクなどを動作させます。
ここでは、ワンプッシュで写真を撮影する事にします。またボタン長押しで、録音を開始(5秒間)するようにします。LEDは押された数だけ点滅し、録音中は点灯するようにします。
さきほどのプログラムにカメラ、マイクなどの呼び出し(前回の記事を参照)を追加し、button_action.pyとしています。

[button_action.py]

さあこれで、ボタンを一回押して、LEDが赤く光り、写真が1枚撮影できたでしょうか?ここでは撮った時間を写真のファイル名にしています。
また1.5秒以上長押しすると、LEDが点滅し、5秒間録音をします。
作られたファイルをダウンロードし、確認してみて下さい。

2.ラズパイをウェブサーバー化する

ボタンにより画像撮影、録音などを操作できるようになりましたが、毎回結果をダウンロードして確認するのは手間がかかります。
ラズパイをWifiにつないで、ウェブサーバーにする事で、簡単にラズパイのファイルにブラウザ経由でアクセスできるようになりますので、この機会に設定しておきましょう。

ウェブサーバーのCGIスクリプト

ラズパイのWifiへの接続方法などは、こちらの最初のセットアップの記事などにまとまっていますので、参照しながらWifiにつながるようにして下さい。
ラズパイをウェブサーバーにするのですが、apacheなど本格的なサーバーを使う方法もありますが、ここではラズパイ内のデータの確認、簡単なコマンド操作だけなので、cgi(common gateway interface、ウェブ上でのプログラム)を動かせるスクリプトを作ります。

[web_server.py]

ウェブサーバーの起動

今回のディレクトリ構成としては、サーバー(web_server.py)は/home/pi/webというディレクトリに配置します。またこの下にimageというフォルダを作り、写真ファイルはそちらに保存するようにします。
また今後このサーバー下で動く実行プログラムなどは、cgi-binというフォルダに入れるようにします。

[ラズパイ上のウェブサーバーのディレクトリ構成]

さきほどのweb_server.pyを流す事により、ウェブサーバーを立ち上げます。&を付けることによりバックグラウンド処理になります。
[cgiserver.py]

これで、同じWifi環境下にあるパソコンのブラウザから http://localhost:8000/ にアクセスしてみましょう。ウェブのホーム以下(ここでは/home/pi/web/)にあるフォルダやファイルが見られると思います。
また先ほど撮った写真が保存されたimageフォルダに行ってみましょう。日付の入ったjpgファイルがあったら、ブラウザで選んで開いてみて下さい。ちゃんと写真が見られたでしょうか?

日付の入ったjpgファイル

3.ボタン、ウェブサーバーを自動起動して、カメラ、マイクをまとめて使う

それでは最後に、ボタン機能やサーバーをラズパイ起動時に自動的に立ち上げるようにして、デジカメのように使って行きましょう。
ラズパイ、ボタン、バッテリーなどを一つの箱に入れて、全体的に動くかどうかの確認もします。

ラズパイ、ボタン、バッテリーなどを一つの箱に入れて、全体的に動くかどうかの確認

自動起動サービスの設定

ラズパイ起動時のプログラム実行は、systemdというサービスを設定します。
/etc/system/system/の下に、xxxx.serviceというファイルを作っていきます。まずウェブサーバーの方のファイル設定です。

[webd.service]

このサービスに対するパーミッションや起動コマンドは、以下のようなものです。

これで、ウェブサーバーのサービスを登録する事ができました。ログファイルなどは/var/log/syslogの場所にあります。

同様に、ボタン機能の登録も行います。

[buttond.service]

ボタンの方も同じようにサービスの登録、スタート、ステータス確認などを行います。

ボタン、ウェブサービス、カメラなどをまとめて使ってみる

それでは、一度ラズパイをリブートして、正常に立ち上がっているか確認しましょう。
再立ち上げすると、自動でLEDが三回点滅するようにしているので、それまで待って下さい。
その後、ボタンをワンプッシュして、写真を撮る事ができたでしょうか?ブラウザからこのラズパイにアクセスして、写真を確認してみて下さい。
またボタン長押しで録音ができる事も確認してください。

ボタン、ウェブサービス、カメラなどをまとめて使ってみる

実際に写真撮影、録音などを行っている動画はこちらです。

まとめ

今回はデバイスの準備として、ラズパイにボタンを付け、ワンプッシュするとカメラのように写真を撮ったり、長押しにより録音をできるようにしました。簡易デジカメやレコーダーのようになったのではないでしょうか?
またラズパイをウェブサーバーにして、撮影した写真などをブラウザから確認できるようにもしました。

次回は、いよいよ頭脳となるAPIやAI機能を、ラズパイに導入していきたいと思います。
お楽しみに!

第3回 ラズパイでAIカメラを自作しよう!NTT docomoのAPIを使って、画像認識カメラを作る

$
0
0

こんにちは、ヨシケンです!
ラズパイを使ったデバイス作りの第3回になりましたが、いよいよ今回から高度なAPIなどを導入して、カメラをスマートなものにしていきましょう。
ハードウェアの設定、ボタン、ウェブからの操作などは、第1回第2回の記事を見て、準備しておいて下さいね。

NTT docomoの画像APIを使って、風景や料理を認識する

それでは今回は、カメラで写真を撮って、そこに何が映っているかを解析するようにして行きたいと思います。
画像認識は、自分でモデルデータやディープラーニングを駆使する方法もありますが、既に各社から高機能で便利なAPIが出ていますので、今回はそれを利用していきます。
画像APIの中でも様々なものがありますが、登録のみで無料で使え、日本語にも対応したNTT docomoのAPIを使う事にします。

この図のように、写真の中に写っている料理が何なのかを、APIを適用するだけで識別する事ができます。
写真の中に写っている料理が何なのかを、APIを適用するだけで識別する事ができます

今回の記事で必要なもの一覧

Raspberry Pi 3 Model B

パイ・カメラ

今回の記事の流れ

1.docomo APIの登録、導入
2.画像認識APIでカテゴリ認識を使う
3.Pythonで画像解析プログラムを作る
4.まとめ

 

1.docomo APIの登録、導入

撮った画像から、そこに何が写っているのかを認識するのは、ちょっと高度で難しそうに思えるかもしれません。ただNTT docomoが、スマホや、しゃべってコンシェルなどのこれまでの実績、データの蓄積を生かし、外部からでも使用できるdocomo APIを公開してくれています。
登録さえすれば、6ヶ月間無料で使用する事ができますので(追加登録により延長も可能)、この機会に是非登録をしてみて下さい。

docomo APIの使用開始

docomo APIを使い始めるには、まずこちらdocomo Developer Supportページにアクセスします。
docomo Developer Supportページ
docomo Developerサイトには、以下のように様々なAPIがあり、登録すればどれも無料で使う事ができます。(一部企業登録などの必要があります。)
様々なAPI
今回はこの中で、「画像認識」APIを使っていきます。「画像認識」のリンクを押して、進めて下さい。
画 像認識画面
右上のログイン/新規登録 からアカウントを作成していきます。
新規アカウント登録
メールアドレス、パスワードを設定します。法人か個人かはご自身のステータスにより決めて下さい。今回の画像認識に関しては、個人の登録でも使用することができます。
その後メールアドレスの確認が行われ、ログインする事ができるようになります。最初のアプリ画面で「新規API利用申請へ」を選び、APIを追加します。
法人情報の登録メリット
その後、各種必要な情報を入れていきます。
アプリケーション登録
そしてメインのAPI選択画面になりますが、ここには様々な機能/APIが並んでいます。興味のある機能を選んで下さい。今回は画像系の「画像認識」APIを使います。
画像認識
その後、個人情報などを入力し、最後に申請を押します。
するとほどなく申請が通り、アプリケーション一覧に戻ると、以下のようにAPI Keyなどが付与されます。このAPI Keyは後でAPIを呼び出す時に使用しますので、記録しておいて下さい。
登録アプリケーション一覧

 

2.画像認識APIを使ってカテゴリ認識を行う

ではこのAPIを使って、写真に写っている物の認識をしていきましょう。
詳細なドキュメントはこちらの機能別リファレンスに詳しく書かれています。その中でもまず「カテゴリ認識」を使っていきます。
プログラムを書く前に、まずサンプル・コマンドから、このカテゴリ認識機能を試してみましょう。
cURLコマンドサンプル
コマンドのimageパラメータに、写真のファイル名を設定します。modelNameには以下のようなカテゴリがあり、認識したいものに合わせてmodelName値を指定してください。
カテゴリ認識
APIKEYには、もちろん先ほど取得したAPI Keyを入れます。
まずmodelでfoodを選び、このような料理の写真を認識させてみましょう。
料理の写真

そうすると、グラタンの可能性0.951…(95%)、などと出てきました。これは自宅で作ったポテトグラタンで、見かけも悪かったのですが、見事当ててくれて、少しホッとしました。
それ以外のmodelでは、scene(風景)やfashion_type(ファッションの種類)、landmark(観光名所)などが選べます。

 
flowerを指定して、花の写真を使うと、このような結果になりました。
花の写真

結果は、一番目に「ユリ」の確率98%と出ましたが、これってポインセチアですよね。。惜しい!兎にも角にも、たくさんの花の候補を挙げてくれました。

 

3.Pythonで画像解析プログラムを作る

それではラズパイでPythonを使って、解析結果を出力させるプログラムを作ります。

Pythonで画像を扱うには、OpenCV (Computer Vision)というオープンソースの画像ライブラリを使うのが一般的です。ラズパイに以下のコマンドでOpenCVをインストールしておいて下さい。

 

sudo apt-get install libopencv-dev
sudo apt-get install python-opencv

このOpenCVを使って、Pythonプログラムを書いていきます。
先ほどのカテゴリ認識APIのurlに、パラメータに指定されたイメージファイルとモデルを適用させます。
ここでは確からしさ(score)が70%以上であれば、その物を認識できたとして、コマンドラインに出力しています。docomo_keyにはご自身のAPI Keyを設定して下さいね。
以下がそのサンプル・プログラムですが、画像解析に関わる部分は、黄色でハイライトしています。

[category_camera.py]

それではこのプログラムを実行してみましょう。
先ほどの料理や花の写真をパラメータの -imageに、また–modelにfoodやflowerを指定して、流してみます。

python category_camera.py –image /home/pi/web/image/image.jpg –model food
1 food detected. グラタン(95.1%)

python category_camera.py –image /home/pi/web/image/images/n1.jpg –model flower
1 flower detected. ユリ(98.8%)

プログラムからでも、同様の結果が出力されましたね。
またmodelにsceneを適用して、風景写真を読み込ませてみます。
風景写真

撮られた夕日の画像に、「夜景82.8%」と出ていますが、まあまあの結果が出ました。
画像解析APIをPythonプログラムとしても、動くことが確認できました。
今後は、このプログラムに機能を順次追加し、どんどんできる事を増やしていきたいと思います。

 

4.まとめ

今回は、ラズパイで撮った写真を解析するために、NTT docomo APIを導入しました。
これまで、写真が撮るだけだったものが、その写真に何が写っているのかを自動で判別する画像解析APIを付け加えました。
最低限のプログラミングで、写真に写ったものをおおよその精度で検出してくれるのが、こんなに簡単とは少し驚きですね。カテゴリ認識には、食べ物や風景、花だけでなく、ファッションや毒キノコなど、面白いものがありますので、色々試してみて下さい。

今回の最終的なサンプル・プログラムはこちらにも保存されています。[category_camera.py]

さて次回は、音声系APIを使い、撮った画像に何が写っているのか、しゃべってお知らせするような面白いカメラにしたいと思います。
お楽しみに!

Viewing all 58 articles
Browse latest View live