2016年03月18日

シリアル通信の無線化 -第2回:Bluetoothモジュールの仕様確認

はじめに

今回はBluetoothモジュールRN-42の仕様を確認します。
 

目次

 

1. 使用する部品

RN-42は秋月電子に売っていますが、そのままですとブレッドボードに実装できません。
 
M-07612.jpg
図1 RN-42(秋月電子 通販コード:M-07612より引用)
 
ブレッドボードに実装するには2.54mmピッチのピンが付いていなければなりません。方法は色々ありますが、私が行ったのはRN-42 2mmピッチ変換モジュールと2.54mmピッチ変換基板を組み合わせる方法です。
この2つを組み合わせることでRN-42をブレッドボード上に実装できます。
 
M-08690.jpg
図2 RN-42 2mmピッチ変換モジュール(秋月電子 通販コード:M-08690より引用)
 
P-05060.jpg
図3 2.54mmピッチ変換基板(秋月電子 通販コード:P-05060より引用)
 
この2つの部品を使っていきます。
 

2. 電源周り

RN-42の電源に関する仕様です。
 
2016-03-18.png
図4 RN-42電源仕様(RN-42データシートより引用)
 
重要な電源電圧は3.3[V]最大消費電流は送信時に100[mA]です。
Arduinoにも3.3[V]出力はあるものの最大出力電流は50[mA]ですので、RN-42を動かすには新しく3.3「V]電源を用意する必要があります。
幸いにも2.54mmピッチ変換基板に出力電圧3.3[V]、最大出力電流150[mA]のレギュレータがあります。ですのでRN-42の電源には2.54mmピッチ変換基板のレギュレータを使います
 

3. I/O周り

RN-42のI/Oに関する詳細です。
 
2016-03-18 (1).png
図5 RN-42 I/O詳細1(RN-42データシートより引用)
 
2016-03-18 (2).png
図6 RN-42 I/O詳細1(RN-42データシートより引用)
 
ピンはたくさんありますが、およそ3つに分類できます。
  1. 電源関係
  2. シリアル通信関係
  3. 初期設定関係
電源関係やシリアル通信関係のピンはArduinoの専用ピンと接続すればよいです。
初期設定関係は設定項目や設定値を確認しながら、接続する必要があります。デジタルピンですので、High/Low固定にするかArduinoのI/Oピンと繋いで切り替えられるようにする方法などがあります。
 

まとめ

簡単ですがRN-42の仕様を確認しました。次回はRN-42を使うための回路を検討します。
 

Arduino+Bluetooth Androidプログラミング サブボード「シールド」で機能強化! 小型マイコンにつないだ外部アクセサリをスマホで制御

価格:2,052円
(2016/3/18 15:53時点)
感想(0件)

続きを読む
タグ:無線
posted by ました at 16:28| Comment(0) | TrackBack(0) | 電子工作の実践 | このブログの読者になる | 更新情報をチェックする

2016年03月11日

シリアル通信の無線化 -第1回:Bluetooth

はじめに

今回からはArduinoのシリアル通信を無線で行おうと思います。使用する無線方式はBluetooth(ブルートゥース)です。
 

目次

 

1. Bluetoothとは

Bluetoothとは無線通信の一つです。パソコンやスマートフォンなどのコンピュータとキーボードやヘッドセットなどの周辺機器を接続するのに使用されたりします。
ただ、互いの機器がBluetooth対応ならば全ての機器同士で通信が出来るというわけではありません。Bluetoothには接続する機器によってルールが変わります。このルールをプロファイルといいます。
代表的な物ですと、キーボードを扱えるようにするためのプロファイルはHID(Human Interface Device Profile)、ヘッドセットを扱うためのプロファイルはHSP(Headset Profile)です。
 
プロファイルにはシリアル通信を扱うためのプロファイル、SPP(Serial Port Profile)があります。そのためBluetoothだとシリアル通信の無線化が簡単にできます
 

2. 使用するモジュール

ArduinoでBluetooth通信を行うためには、ArduinoのBluetoothモジュールを接続する必要があります。
使うのはRN-42というモジュールです。
 
P1000587.jpg
図1 RN-42外観
 
選んだ理由は以下の通りです。
  • SPPに対応している
  • シリアル通信専用のピンがある
  • アンテナが基板上に実装されている(図1左側の青い部分)
  • 技適に対応している
  • ネット上に情報が豊富にある
  

まとめ

シリアル通信を無線化するにあたって、Bluetoothと使用するモジュールRN-42について紹介しました。
次回はRN-42の仕様を確認していこうと思います。
 

参考資料

  1. "Q.【Bluetooth】Bluetoothとはなんですか?/接続方法がわかりません" エレコム. http://qa.elecom.co.jp/faq_detail.html?id=4500, (参照日:2016-03-11)
  2. "Q. BluetoothのSPPとは何ですか?". 無線化.com. http://www.musenka.com/faq/faq_bluetooth_spp.html, (参照日:2016-03-11)

ZigBee/Wi-Fi/Bluetooth無線用Arduinoプログラム全集 [ 国野亘 ]

価格:3,888円
(2016/3/11 17:09時点)
感想(0件)

posted by ました at 17:16| Comment(0) | TrackBack(0) | 電子工作の実践 | このブログの読者になる | 更新情報をチェックする

2016年03月04日

serialEvent(割り込みに失敗)

はじめに

今回はシリアル受信時に割り込み処理を行う予定でしたが、出来ませんでした。ですので文字表示器は前回から進展はないですが、やりかたったことや分かったことなどをまとめておきます。
 

目次

 

1. やりたかったこと

文字表示器は前回の時点で動いており、そのスケッチの動作を簡単に説明すると図1のような動きをしています。
 
 
Mar03_シリアル割り込み_1.png
図1 文字表示器の動作
 
シリアル受信に関する処理とスクロール処理を繰り返しています。
シリアル受信後に次の表示が更新されるまでの時間が短くなるよう、スクロール処理を行っている最中にシリアル受信が発生した場合はスクロール処理を中断してシリアル受信処理を実行します。
ただ、この方法だとスクロール処理を行っている最中にスクロールとは関係ないシリアル受信のチェックを行わないといけないので、無駄な処理が増えるような気がします。
 
そこでシリアル受信で割り込みを行うことができれば、無駄な処理を減らせると考えました。
 
Mar03_シリアル割り込み_2.png
図2 割り込み処理による文字表示器の動作
 
シリアル受信にて割り込みが発生したときにシリアル受信処理を行うようにすれば、スクロール中にシリアル受信をチェックしなくて済むと考えました。
 

2. serialEvent

ArduinoにはserialEvent()というシリアル受信が発生したときに処理を行う機能があります。この機能を使えばシリアル受信で割り込み処理を行えると思っていたのですが、それは勘違いで、serialEvent()が実行されるのはloop()文の処理が終わってからです。ですので割り込み処理のように、即座に処理を行うことが出来ません。
 
Mar03_シリアル割り込み_3.png
図3 serialEvent()による文字表示器の動作
 
文字表示器のスケッチをserialEvent()を使うよう書き換えたとしても、結局は図1と同じようにスクロール中にシリアル受信をチェックする必要があります。ですので、わざわざserialEventで書き換えてもArduinoの動きは書き換える前と同じです。
 

まとめ

serialEvent()を使えばシリアル受信で割り込みができると思っていましたが、それは勘違いでした。
Arduinoでもシリアル受信で割り込みはできなくもないようですが、難しそうなので今後の課題にしたいと思います。
 

参考資料

  1. 作者名:Arduino. "serialEvent". サイト名:Arduino. https://www.arduino.cc/en/Reference/SerialEvent, (参照日:2016-03-04)

posted by ました at 18:07| Comment(0) | TrackBack(0) | 電子工作の実践 | このブログの読者になる | 更新情報をチェックする

2016年02月26日

文字表示器 -第8回:シリアル通信の表示

はじめに

今回は今まで行ったことを組み合わせてシリアル通信で受信した文字列をキャラクタLCDに表示させます。
  

目次

 

1. 仕様検討

おおまかな仕様を考えます。
  • キャラクタLCDはAQM0802(8文字×2行)を使用
  • シリアル受信した文字列をLCDの1行目に表示
  • LCDの2行目には前回受信した文字列を表示
  • 文字数が8文字以上の場合はスクロール表示
  • 例外処理(受信した文字数が非常に多い、非対応文字の受信など)は行わない
以上の仕様を満たすように作成します。
 

2. ハードウェア

回路は文字表示器の第4回で作成した回路と同じです。
 
jan24_LCD回路図.png
図1 文字表示器回路図
 
部品の実装についてですが、今回はブレッドボードでなくプリント基板に実装しました。設計はEagleで行い、製造はユニクラフトさんに発注して行いました。
 
P1000569.jpg
図2 文字表示器基板
 
部品がいくつか実装されていますが、下部にあるのはBluetoothモジュールと周辺部品ですので文字表示器とは関係ありません。その内Bluetoothで受信した文字列を表示できるようにしたいと思っています。
 
これでハードウェアの実装は完成です。
 

3. ソフトウェア

作成したスケッチと簡単な説明を載せます。
  • シリアル通信にて文字を受信すると、文字を表示する処理を行う
  • できるだけ受信してから表示の間隔を短くするために、スクロール処理中はこまめに受信バッファをチェックしている
 
ソースコードを表示するには下記をクリックしてください。
/* シリアル通信によるキャラクタLCD制御
 * 
 * シリアル受信した文字列をキャラクタLCD AQM0802に表示する。
 * 1行目には現在受信した文字列、2行目には前回受信した文字列を表示する。
 * 文字数が8文字以上の場合はスクロールを行う
 * 
 * 作成日:2016-02-26 作者:ぱなぺー http://play-arduino.seesaa.net/
 */
#include <Wire.h>
#include <ST7032.h> //作者:TOMO,  Web:"オレ工房" http://ore-kb.net/archives/195
#include <string.h>

ST7032 lcd;

/*
 * str1, str2:1行目と2行目に表示する文字列
 * n1, n2:str1とstr2の文字数
 * n:スクロール回数
 */
int i, n, n1=0, n2=0;
char str1[30]="", str2[30]="";

void setup(){
  //LCDとシリアル通信の初期化 
  lcd.begin(8, 2);
  lcd.setContrast(27);
  Serial.begin(9600);
}

void loop()
{
  //シリアル受信した場合、1行目に今受信した文字列を、
  //2行目に前回受信した文字列を表示
  if (Serial.available()) {
    delay(100); //シリアル受信待機
    
    //前回受信した文字列を2行目にコピー
    strcpy(str2, str1);
    n2=n1;

    //受信した文字列を読み込み、文字数をカウント
    i=0;
    while (Serial.available() > 0) {
      str1[i]=Serial.read();
      i++;
    }
    str1[i]='\0';
    n1=i;

    //スクロール回数の計算
    if(n2 > n1){
      n=n2-7;
    }
    else{
      n=n1-7;
    }

    // LCD表示処理
    lcd.clear();
    lcd.home();
    lcd.setCursor(0,0);
    lcd.print(str1);
    lcd.setCursor(0,1);
    lcd.print(str2);
  }
  
  // スクロール処理
  if(0<n){
    delay(1500); //スクロール開始時は1.5[sec]表示
    for(i=0; i<n; i++){
      //スクロール処理中にシリアル受信をした場合、スクロール処理を中断
      if (Serial.available()) {
        break;
      }
  
      lcd.scrollDisplayLeft();
      delay(500); //スクロール中は0.5[sec]表示
    }

    //スクロールを先頭に戻す ※シリアル受信をした場合、スクロールを先頭に戻さない
    if(i==n){
      delay(1000); //スクロール終了時は1.0[sec]表示
      if (Serial.available()==0) {
        lcd.clear();
        lcd.home();
        lcd.setCursor(0,0);
        lcd.print(str1);
        lcd.setCursor(0,1);
        lcd.print(str2);
      }
    }
  }
}
 

4. 動作確認

実際に動かしている動画です。文字数が8文字未満の場合はそのまま表示し、8文字以上の場合はスクロールしているのが分かると思います。
 
 

まとめ

これでシリアル通信にて受信した文字列をキャラクタLCDに表示することが出来ました。
次回はシリアル受信時の処理を割り込み処理で行うようにしたいと思います。
 

参考資料

  1. 作者名:TOMO. "I2C液晶のArduinoライブラリ - ST7032". サイト名:オレ工房. http://ore-kb.net/archives/195, (参照日:2016-02-26)
  2. 作者名:Arduino. "LiquidCrystal Library". サイト名:Arduino. https://www.arduino.cc/en/Reference/LiquidCrystal, (参照日:2016-02-26)
 

ボクのArduino工作ノート改訂版 [ 鈴木哲哉 ]

価格:2,646円
(2016/2/26 14:16時点)
感想(0件)

posted by ました at 16:46| Comment(0) | TrackBack(0) | 電子工作の実践 | このブログの読者になる | 更新情報をチェックする

2016年02月21日

今後の更新

普段でしたら日曜日に更新するのですが、試しに更新日を金曜日に変更してみようと思います。
ですので、次の更新日は2月26日(金)です。
更新日の連絡だけというのも寂しいので、今後記事として扱うだろう内容を紹介します。
 

Bluetoothによるシリアル通信

BluetoothモジュールRN-42とキャラクタLCD AQM0802を実装できるプリント基板を作成しました。
これを使って、シリアル通信を無線化しようと思っています。
 
P1000569.jpg
 

カラーLED

カラーLED PL9823を光らせてみました。ネットで検索すると「電源ラインに外付け抵抗を入れる」回路例が見つかりますが、色々調べてみると外付け抵抗は不要な気がしています。
 
P1000565.jpg
 
現在更新中のキャラクタLCDを終えたら、これらの記事を書こうかなと思っています。
posted by ました at 18:41| Comment(0) | TrackBack(0) | その他 | このブログの読者になる | 更新情報をチェックする