まごころせいじつ堂

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

センサ類のメモ これまでやったものとこれからやりたいもの

 センサ類を色々使ってきたのでちょっと整理。最近はSeeed StudioのGROVE Systemがいいかなと思っている。GROVEは4PのコネクタにVcc,GND,信号2本をつなぐ約束で色々なデバイスの実験が簡単に出来るもの。センサは基本的に端子が少なく、毎回Arduino用のシールドで作らなくてもGROVE用のelementとして工作したら組み合わせて使用できる。

センサ一覧(部品屋の扱いから)

秋月電子>センサ一般
共立エレショップ>センサ
共立エレショップ>センサボード
千石電商>センサー
ストロベリー・リナックス>センサ


・ロケーション
GPS GM318B
http://blog.livedoor.jp/hardyboy/archives/7345515.html

・超音波距離センサ HC-SR04
http://blog.livedoor.jp/hardyboy/archives/7043767.html

・温度センサ LM35DZ
http://blog.livedoor.jp/hardyboy/archives/6111809.html

・照度センサ S9705
http://blog.livedoor.jp/hardyboy/archives/6543874.html

・キーマトリックス
http://blog.livedoor.jp/hardyboy/archives/6288074.html

・CdS
・曲げ
・傾き
・加速度
・気圧
・湿度
・湿気(端子を植木鉢に差す)
・におい
・地磁気
・カラー
・赤外線
・紫外線
・視覚(カメラ)
・音声(マイク)
・プッシュスイッチ
・ロータリーエンコーダ
・PS/2キーボード

※スイッチ類も含めてみた


メモ:Intel Galileo Gen2の話題

 Galileo Gen2が出るらしい。
IntelがIntel Galileoボード(Gen2)の概要情報を公表
(KEI SASAKI's PAGE.)
Intel Galileo Gen 2は8月に発売予定(KEI SASAKI's PAGE.)

Intel unveils second generation Galileo hacker SBC(LinuxGizmos.com)

 プロセッサはそのまま。不評だったGPIOの速度、シリアルインターフェースが改善されているようだ。
 

RTC DS1307 その1

 しばらくRTC(Real Time Clock)のRTC1307をArduino上でいじってみる。

DS1307 64 x 8、シリアル、I²Cリアルタイムクロック
https://www.sparkfun.com/datasheets/Components/DS1307.pdf

 I2C接続でバッテリバックアップ可、水晶をつなぐだけ、NVRAMあり、アラーム機能あり。

以下のモジュールを購入した。AT24C32(EEPROM)も載っている。トランジスタ?の空きパターンもある。
SainSmart Arduino I2C RTC DS1307 AT24C32 Real Time Clock Module For AVR ARM PIC

使い方はこちらを参考にした。
Sleep Cycle Alarm Clock with Motion Sensor

使用したのはArduino Leonardo。モジュールのVcc、GND、SCL、SDAをそのまま対応するピンに接続する。簡単。
2014ds1307

 ライブラリは以下にあるDS1307RTC.zipをダウンロードして使用する。
DS1307RTC Library(PJRC)

 サンプルスケッチのSetTimeでホストPCの時刻をRTCに設定する。
2014ds1307set


 サンプルスケッチのReadTestでシリアルコンソールに時刻を表示する。Arduinoの電源を外してまた接続しても正しい時刻を表示する。
 2014ds1307disp
 さて、この辺を調べているのはDS1307がGroveでも使われていたり86Duinoにも互換ライブラリがあったりしたため。同じように使えるかもしれない。

メモ:Time Library(PJRC)

 
サインスマート(SainSmart)I2C RTC DS1307 AT24C32 時計 モジュール for AVR ARM PICサインスマート(SainSmart)I2C RTC DS1307 AT24C32 時計 モジュール for AVR ARM PIC

サインスマート(SainSmart)
売り上げランキング : 51261

Amazonで詳しく見る
by G-Tools
サインスマート Tiny RTC I2C DS1307 AT24C32 24C32 メモリ リアルタイムクロックモジュール for Arduinoサインスマート Tiny RTC I2C DS1307 AT24C32 24C32 メモリ リアルタイムクロックモジュール for Arduino

サインスマート(SainSmart)
売り上げランキング : 63365

Amazonで詳しく見る
by G-Tools

GPSモジュールGM318Bの確認

 aitendoでGPSモジュールGM318Bを購入。ちょっと動作確認。
 このモジュールは4800bpsで受信したデータをシリアルから送り出す。フォーマットについてはよく知らないのでこれからやる予定。今回はハードウェアの接続のみ。Groveのコネクタに合わせてシリアル通信させればよいだろう。このモジュールは3.3V動作なのでCrowduinoを3.3V設定にしSoftwareSerialを使おう。

 Grove用コネクタにこんな感じで工作した。
2014GPS1

 配線はこんな感じ。Grove用のケーブルを中央から半分にカットする。黄=TX,白=RX,赤=Vcc,黒=GNDに接続。PWR_CTRLはメッキ線でGNDに接続。

2014GPS2

 これをGroveシールドのD10/D11コネクタに接続。スケッチは以下のとおり。(SoftwareSerialExampleをちょっと変えただけ)
https://gist.github.com/houmei/5020ac8527de0fa9c26f

2014GPS3


 今気付いたがこっちのほうが値段も変わらず楽だったか?……GROVE GPS 

Raspberry Piの電源補強

 ずっと積んでたRaspberry Pi、久々に取り出した。USB機器をつなぐと不安定になるという話を聞くので以下を参考に電源ラインにコンデンサを追加した。
RaspberryPiにコンデンサ追加で電源強化(blacknikka)

 C6 220μF。ここの端子に並列に電解コンデンサを追加する。
2014raspi1

    330μFの電解コンデンサ。足をこんな感じに加工。
2014raspi2

 二箇所ハンダ付け。極性に注意。(外側がマイナス)
2014raspi3

 動作確認。まあ予防保守的な工作ということで。
2014raspi4

 僕のは出たばっかりの頃に買ったのでType Bでも256MBなのよ。

 
Raspberry Pi Type B 512MBRaspberry Pi Type B 512MB

RS Components Ltd (ソースマーキング及び販売 Umemoto LLP)
売り上げランキング : 182

Amazonで詳しく見る
by G-Tools

メモ:ENGINEER NZ-12ミクロカッター

 ありがとうございました!活用します!
2014enginnertool

ミクロカッター NZ-12ミクロカッター NZ-12


売り上げランキング : 1106279

Amazonで詳しく見る
by G-Tools
 
メモ:

USB関連
MacOS XのUSBデバイスのメモ
8ピンPICでUSB -16FUSBの移植-
USB ホスト倶楽部

MSP430
Going Steampunk With The MSP430 – A Retro Calculator
第20回 MSP430™ LaunchPadでキッチンタイマを作ろう ~ダイナミック点灯編~

AVR LCD interfacing : LCD part I
Tiniest Linux COM yet?

86Duino+SainSmartの1.8"TFT

 前回調べた86DuinoのICSP端子(と呼ぶのは正確ではないと思うが)、Digital I/Oとして使うには以下の番号を指定するとよい。
86DuinoICSP
 さて、ここを使ってAdafruit 1.8" TFT Shieldと同じTFT、ST7735Rを使っているSainSmartのモジュールを使ってみる。Amazonで買えて1590円と安価。キャラクタ液晶の代わりとしてどうだろうか。

SainSmart 1.8 ST7735R TFT LCD Module with MicroSD LED Backlight For Arduino Raspberry Pi

Adafruit/SainSmart 1.8" TFT LCD display for Raspberry Pi

 このモジュールはmicroSDカードとTFT部分のインターフェースが独立しているので別々のSPIで使用可能。

201486duinoTFT1 
 さて、 TFTのCSをENC0_A(42)、RS/DCをENC0_B(43)、SDAをSPIDOに接続、あとはVcc/GND/SCLK/RESETを対応する場所に接続してハードウェアSPI制御にする。
スケッチは以下のとおり。
https://gist.github.com/houmei/3c4cf9613f20c755b911

SPIクロックの指定は、86Duinoだと100MHz÷(2×設定値)となっている。実力ではn=2(25MHz)まで動作した。もし動かなければ以下の部分を書き換えて大きな数値にする。
SPI.setClockDivider(2);
 
201486duinoTFT2 
 動作状態でICSP端子のVcc-GND間を測定したら4.46Vだった。


サインスマート(SainSmart) 1.8サインスマート(SainSmart) 1.8" TFT カラー LCD ディスプレイ モジュール SPI インタフェース & MicroSD 付き for Arduino UNO MEGA R3

サインスマート(SainSmart)
売り上げランキング : 18506

Amazonで詳しく見る
by G-Tools

86Duinoのその他の端子を使ってみる

 ArduinoのICSP端子に相当する86Duinoの端子は拡張されて10ピンになっている。
http://www.86duino.com/wp-content/uploads/2014/03/86Duino-ZERO_Pinout_M.jpg

86duino_icsp

   こんな具合に従来のSPI関連以外にSPICS,EMC0_A,ENC0_B,ENC0_Zが追加されている。これらを使えばSPIで接続するTFT液晶がこの端子だけを使って動かせるのではないかと思ったのだがピン番号はどう割り当ててあるんだろうか?

 86Duino ZeroはArduino UNO、86Duino ONEはArduino Due相当とピン割り当てが合わせてあるのでより大きな86Duino ONEの回路図で調べてみた。
Circuits Schematics for DM-222 (Daughter Board)[PDF]

86duino_pindefine
 
 うーんこれだけではわからんのでソースに当たる。
hardware/86duino/x86/cores/arduino/parduino.hを見てみると:
#define PINS    (45) static int pinMap[PINS] = {11, 10, 39, 23, 37, 20, 19, 35, 33, 17,
                                                                          28, 27, 32, 25, 12, 13, 14, 15, 24, 26,
                                                                          29, 47, 46, 45, 44, 43, 42, 41, 40,  1,
                                                                            3,  4, 31,  0,  2,  5, 22, 30,  6, 38,
                                                                          36, 34, 16, 18, 21};  
 ここでArduino IDE相当のピン番号を86Duino内の番号に置き換えているらしい。その割当ルールだけど、0,1,2,3,...が GP00,GP01,...,GP07,GP10,GP11,...,GP17,GP20,... に対応しているようだ。

確認してみた。
https://gist.github.com/houmei/5def00298417a19cb5f3

ENC0_A,ENC0_Z端子にLEDをつないでチカチカさせてみた。

201486duino_icsp



 OK。これで86Duinoで拡張した端子も利用することができた。
 

Adafruit 1.8" TFT Shield用ゲタ

 Adafruitの1.8" TFT Shield、SPI関係の信号線をICSP端子からではなくArduino UNOのD13、D11から取っているのでそのままではArduino LeonardoやDueで動かない。そこで端子を変換するゲタを作った。

2014tftshield1


(1)Arduinoのバニラシールドは、ICSP端子の部分が使えるものを選ぶ。秋月電子扱いのものは該当部分に穴がない。
(2)ピンヘッダのうち、D13(SCLK)、D11(MOSI)、D10(CS)はピンを曲げて下のシールドに刺さらないようにする。
(3)バニラシールド上のD13をICSP端子のSCLK、D11をMOSIに接続。D10はD9にハンダ付け。
※D10はD9とICSP端子の横にジャンパで接続が切り替えられるようにしているが、これは86DuinoのハードウェアCSに繋ごうと思ったため。
※手抜きでメッキ線の空中配線しています。


2014tftshield2


 このようにArduino DueでハードウェアによるSPIで動作。Arduino DueはSPI.setClockDivider()の指定が数値で、SPI.setClockDivider(2);とすると動作クロック÷2=42MHzとなる。しかし、Adafruit 1.8" Shieldのレベルコンバータの仕様で10MHzが上限とあった。動作クロックは観測していない。

Arduino Due Hardware SPI (The 21st Century Digital Home)

 なお、Arduino Leonardo、86Duinoでの動作も確認できた。
2014tft86duino



Arduino用バニラシールド基板ver.2(黒)Arduino用バニラシールド基板ver.2(黒)

スイッチサイエンス
売り上げランキング : 204199

Amazonで詳しく見る
by G-Tools
Arduino用バニラシールド基板ver.2(赤)Arduino用バニラシールド基板ver.2(赤)

スイッチサイエンス
売り上げランキング : 298693

Amazonで詳しく見る
by G-Tools
Arduino用バニラシールド基板ver.2(緑)Arduino用バニラシールド基板ver.2(緑)

スイッチサイエンス
売り上げランキング : 349393

Amazonで詳しく見る
by G-Tools
Arduino用バニラシールド基板ver.2(青)Arduino用バニラシールド基板ver.2(青)

スイッチサイエンス
売り上げランキング : 125733

Amazonで詳しく見る
by G-Tools
Arduino用バニラシールド基板ver.2(白)Arduino用バニラシールド基板ver.2(白)

スイッチサイエンス
売り上げランキング : 134964

Amazonで詳しく見る
by G-Tools

メモ:Arduino TFTライブラリの調査 →解決 SDカードのせい

 Adafruit 1.8" TFTシールドがハングしてしまう問題、解決した。microSDカードのせいだった。

 いよいよ波形観測しないといかんかな〜と思ってて気付いた。μSDカードが繋がってる。
μSDカードを外してテストしたらハングアップしない。試しにSanDiskのμSDカードを挿したら問題なく動いている一時間程度でハング。ノーブランドのμSDカードが悪さしていたようだ。ちょっと気づくの遅かったですね。(その後、SDカードなしで12HランOK)
となると、SDカードからイメージを転送して表示するものはこのトラブルが発生する可能性がある。注意。

 あと、調査中色々検索してわかったことだが、3.3V-5VレベルシフタのCD4050、動作上限が10MHzなのであまり高いSPIクロックだと動かないということだった(Arduino UNOでは問題ない)。3.3V系でよければバイパスしてしまうという方法がある。

2014tft1





 以下は記録として残しておく。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

 Arduino IDE 1.0.5から提供されたTFTライブラリだが、ランダムに線を引くのを繰り返していると画面がおかしくなり、真っ白になる。

2014softTFThang


 

Arduino IDE 1.5.6-r2 + Arduino Due /  Arduino Leonardo (TFT.h/TFT.cppにソフトSPIのパッチ)→発生
Arduino IDE 1.0.5 + Arduino UNO (ハードSPI)→発生

 これから、IDEやマイコンボードの違いは関係なく、TFTライブラリ〜TFTモジュールの問題と考えられる。

 まだ原因は分からないが再現性を高めてみた。Arduino IDE 1.0.5+Arduino UNOで調査。
 約1分で上記写真のようになるスケッチ。
https://gist.github.com/houmei/5dc5fde18425b24e53d8

 TFT.hとTFT.cppはutilityフォルダ以下にあるAdafruit_ST7735とAdafruit_GFXを呼び出している。以前はこれらのライブラリを直接使っていた。Adafruit_ST7735が直接TFT-LCDの制御を行っている。
 SPIのタイミングはどうか、とSPI.setClockDivider(SPI_CLOCK_DIV4);などと変えてみた。結果は発生する時間は伸びたが描画のコマンドを実施した回数は同じと思われた。また、線を引くコマンドの後にdelayを入れても時間が伸びるだけで現象は発生する。
 
 TFTのline()はAdafruit_GFX経由で水平ならAdafruit_ST7735のdrawFastVline()を、垂直ならdrawFastHline()を、斜めならばdrawPixel()で点を描画している。そこでdrawFastVline()を呼び出してさらに低レベルで表示を行うスケッチを書いた。
https://gist.github.com/houmei/e3ed1cb2f2a630b6089e

 drawFastVline()を8個並べたループを10000回。二周目の途中で表示が真っ白になる。プログラムの動作自体は進行しているのでTFTモジュールがコマンドを受け付けない状態になっているように思える。
なお、シリアルコンソールを開くとリセットがかかるが、これはUNOの仕様?
 drawFastVline()の回数をこれより減らすと発生する時間が伸びる。ループが5000回でも発生する時間が伸びる。発生時間は再現性があるので特定のタイミングによってTFTが反応しなくなるように思える。

 今日はここまで。

TFT LCD Library(arduino.cc)
ST7735R datasheet(PDF)
https://github.com/adafruit/Adafruit-ST7735-Library
https://github.com/adafruit/Adafruit-GFX-Library

記事検索
プロフィール

hardyboy

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