まごころせいじつ堂

浜町庄金 研究開発  マイコンで遊んでばっかりで

Serial

シリアルで適当音出力

 Arduinoで音を出すにはポートに圧電ブザーなんかを接続してtoneライブラリを使うのだが、ただ音が出るだけでよければシリアルポートの出力が使用できる。

 こんだけ。実際Arduinoかどうかは関係ない。
 void setup() {
  Serial1.begin(9600);
  while(!Serial1); // for Leonardo
}
void loop() {
  Serial1.write("3333333333");
  delay(1000);
  for (int i=1;i<10 ;i++) Serial1.write(0x55);
  delay(1000);
}
  0x55を出力すると、01010101 というビット列が出力される(より正確には前後に1bitずつ0が追加される)。文字列"33333333"は、"3"が0x00110011なので0x55の時とくらべて÷2の高さの音がでる。



 例えばRx側でGPSやら赤外線やらを受け取ってTx側が余っているときに警告音を出したい場合はライブラリも不要で簡単に実現できるということです。

GalileoにGrove SerialLCDを接続する

 Galileoになんか表示器を付けるのはGPIO経由は無理。ということで部品箱を探してSeeed StudioのGrove SerialLCDを見つけてきた。これなら動きそうな気がする。

Grove - Serial LCD
Grove - Serial LCD(Wiki)

ライブラリは以下:
https://github.com/kc0tfb/Grove_LCD_Arduino

こっちにもあるが、少し違う:
https://github.com/Seeed-Studio/Grove_SerialLCD

 問題が。このライブラリはSoftwareSerialにしか対応していない。GPIOを制御してシリアル通信を行うのはGalileoではダメそうだ。通常のHardwareSerialで使えるようにと色々書き換えていたが降参。しばらく間を置いて検索したらHardware Serial用のライブラリがあった。

https://github.com/ElvisTheKing/SerialLCD

 入出力をストリームで抽象化したものらしいのだが、なぜかSoftwareSerialではなくなりHardwareSerial(従来のSerialやSerial1)だけに対応している。これを使った。Galileo用のArduino IDEライブラリのフォルダに入れて再起動。Grove Base Shield経由でPin0/1にSerialLCDを接続し、exampleにあるスケッチを呼び出す。ここでSerialの記述をすべてSerial1に書き換える。

2014galiserialLCD

 ライブラリは無修正で動作した。

いくつかの問題点:
・Grove SerialLCDは扱いが少ない(が、プロトコルは単純なので作れそうではある)
・Galileoのシールド、Pin0/1によるシリアル通信はSerial1()だった。Arduino互換のピン配置はUNO R3やLeonardoでない古い方に合わせているみたいなんだけど。なぜ新しい方に合わせなかったんだろうか?
・RTCバックアップ用の端子に接続しているとシールドと干渉する

Galileo用シリアル変換の工作

 前回、Galileo用のシリアルポート用ケーブルを作ったけど特殊なのでもっと汎用性のあるものを、と考えArduinoの通信などに使うUSBシリアル変換アダプタをRS232Cのレベルに変換する工作をした。使い勝手を考えてFRISKケースに入れた。

 USBシリアル変換アダプタはこういうものです→FTDI USBシリアル変換アダプター(5V/3.3V切り替え機能付き)
 レベル変換に使ったのは手持ちのADM3202。こちらのセットは必要なコンデンサやICソケットも一緒になっている→RS232CインターフェースIC(DIP)ADM3202AN(2個入)

 Galileoのシリアルポートは3.5mmのピンジャックで、先端がRxD、真ん中がTxD、根元がGND。なのでアダプタ側は先端がTxD、真ん中がRxD、根元がGNDになるようにしなければならない。

2014GalileoSerialschm

Intel Galileo回路図(PDF)

 こんな感じで作った。
GalileoSerial_2014-02-07 11_28_38
 ピンジャックには3.5mmステレオミニジャックDIP化キットを使っているがFRISKケースにぎりぎり収まらないのでハンダ付けした足をカットする必要がある。というか基板にハンダ付けするんじゃなかった。ユニバーサル基板は適当にカット。基板裏にハンダを盛るとやはりケースに収まらなくなるので、ICは浮かせてハンダ付けしてある。C5は電解コンデンサを使ってるが実際は0.1μFでもよい。
 RTSはオープン。CTSは一応GNDに落としている。

 USBシリアル変換アダプタは3.3Vでも5Vでも動作する。

 これでGalileoのブートメッセージを採取した。https://gist.github.com/houmei/8856634


 さてここからは失敗談。簡単な回路だと思いデータシートを見ながら適当に工作して接続したら、受信はできるが送信はできないという状態になった。Windows/TeraTerm接続とMacOSX/SerialTools接続で送信文字が見えたり化けたりする。エコーバックはおかしいがブートメッセージの表示はできるので送信のレベル変換がおかしいのでは?とおもいV+とV-を観測したらVccと同じレベルだった。見なおしてみるとチャージポンプ用のコンデンサ付けるのを忘れてた。ということで簡単な回路でもちゃんと自分で回路図描きましょう。
 

Galileo シリアルポート用ケーブルの工作とRTC設定

 GalileoのLinux側にログインしてなんかしようとするにはスケッチ経由でやる方法もあるがシリアルケーブルがあると便利。が、Galileoは3.5mmのステレオプラグをシリアルポートとして使っているので手持ちのもので工作してみた。

 たまたま、Dsub9ピン→RJ45のコンソールケーブルとサンハヤトのRJ45変換基板CK-18があったのでこれとステレオプラグを使って組み立てた。コンソールケーブルはCiscoのネットワーク機器以外の一部のサーバ機でも使われているのでたまたま持ってた。

参考:
Ciscoコンソール用 DB9-RJ45変換コネクタの自作
RS-232(Wikipedia)
「Intel Galileo Development Board」を起動して動作確認
【CK-18】コネクタ変換基板・モジュラー88タイプ


※追記 秋月電子のUSB-シリアル変換ケーブルでも動作確認
USB-シリアル変換ケーブル グレー色 延長ケーブル付

 プラグ加工。ケーブルの赤が先端、緑が中央、黒が根元。
2014galiseri1

 これをCK-18基板の端子に接続。赤=3,緑=6,黒=4または5。
 RJ45端子における信号は
1 CTS (in)
2 DTR (out)
3 TxD (out)
4 GND
5 GND
6 RxD (in)
7 DSR (in)
8 RTS (out)
 となる。フロー制御をなしにするのでTxDとRxDだけの接続でよい。
ハードフロー制御をONにしてしまった場合は端末側が送受信できなくなるのを防ぐため、CTS/DSRをGNDに落とせばよい。または、CTS-DTRをショートなど。
2014galiseri2

 TeraTermによる画面表示。 通信速度は115200bps。起動時はGRUBのブートメニューが出る。10秒ほほど待つと起動し、login:プロンプトが出たらrootでログイン。
2014galiseri3


 さて、ついでにRTCのバッテリバックアップも作ったので動作確認する。CR2032の電池ボックスから2本線出してくっつけただけ。

2014galirtc

 時刻の設定は以下のようにする。

# date -s "2014-01-31 01:45:00"

 時刻設定が終わったら、RTCに転送しておく。

# hwclock --systohc

 電源をいったん切って、起動後にdateコマンドで確認。

参考:
システムの時計を設定する方法
 

 
エムサーブ コンソールケーブル(RJ45-DB9)エムサーブ コンソールケーブル(RJ45-DB9)

エムサーブ
売り上げランキング : 22506

Amazonで詳しく見る
by G-Tools
記事検索
プロフィール

hardyboy

カテゴリ別アーカイブ
月別アーカイブ
QRコード
QRコード
  • ライブドアブログ