まごころせいじつ堂

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

Grove

I2C接続のジョイパッド

 MICROCHIPのI/OエキスパンダMCP23008を使って簡単なジョイパッドをC基板で作ってみた。
MCP23008は8本のGPIOをI2C経由で制御できる。上位のMCP23017は16本制御できるが、ジョイパッドに必要なスイッチは上左下右ABなのでMCP23008を選択した。
 C基板のちょうど収まりのよい位置にタクトスイッチを配置してメッキ線でぜんぶ配線。上の方にI2C端子を出す。Groveの並び(SCL/SDA/Vcc/GND)に合わせる。
2014joypad1

     回路図はあとで整理するけどもほぼ見たまんま。

MCP23008
1 SCL Groveコネクタ1 SCLへ 3.3KΩプルアップ
2 SDA Groveコネクタ2 SDAへ 3.3KΩプルアップ
3 A2 Vdd
4 A1 Vdd
5 A0 Vdd
6 *RESET 10KΩプルアップ
7 NC
8 *INT NC
9 Vss
10 GP0 ジョイパッドUp
11 GP1 ジョイパッドLeft
12 GP2 ジョイパッド Down
13 GP3 ジョイパッド Right
14 GP4 ジョイパッド Trigger A
15 GP5 ジョイパッド Trigger B
16 GP6 NC
17 GP7 NC
18 Vdd

Groveコネクタ3 Vdd
Groveコネクタ4 Vss 

 マイコンボードはArduino Leonardoと互換のSeeeduino Liteを使用した。これはボード上にGrove端子(I2C,Serial)が付いていてそのまま接続できる。今回Seeeduino Lite用のドライバや定義ファイル(board.txt)は使わずにArduino Leonardoとして使っている。 

2014joypad2

   さて、I2Cの制御はどうしようかなと探していたらMCP23008用のライブラリがあった。これをArduino IDEにインストールしておく。
https://github.com/adafruit/Adafruit-MCP23008-library 

 動作テスト用のスケッチはこちら。
https://gist.github.com/houmei/4c5c3db0579f5b12a71e

 押したスイッチに対応してU L D R A B の記号が表示される。これでハードの動作確認ができた。

続きの予定:
・回路図描く
・コネクタを追加し、ATARI(MSX)仕様のジョイスティックをつないでみる。





 

Grove 4-Digit DisplayをCrowduinoで使うためのパッチ

 Groveの4-Digit Displayを使ってみたが、Arduino互換のCrowduinoではライブラリに修正が必要だった。これについてはモヤモヤするものがあるがメモ。

Grove - 4-Digit Display 

ライブラリは以下より。
File:DigitalTube.zip

 サンプルスケッチのClockDisplayはArduino LeonardoとArduino UNO(SMD)では問題なく動作したのだが、互換品のCrowduinoでは5Vモードで最初数回コロンが点滅して停止、3V3モードでは動作するという状態だったので調べた。
 スケッチ側から停止している部分を探すとtm1637.display()〜の箇所で止まっている。この部分に対応するライブラリがなんらかの原因で止まっている。動作電圧を切り替えると動いたり止まったりするのでタイミングの問題だろうか。LEDドライバはTM1637という石で最大6桁まで制御ができるらしいのだが、データシートを見つけることができなかった。仕方がないのでライブラリ TM1637.cpp 内のCLKとDATAをピンの信号を上げ下げしている部分に適当にdelay(10);をかませてみたら5Vでも動作するようになった。
 次はこのdelay(10);を少しづつ削っていく。最終的に

void TM1637:writeByte(int8_t wr_data) 以下にある

digitalWrite(Clkpin,LOW); //wait for the ACK の次の行に

delay(1);

が必須となった。これがないとCrowduinoの5Vではハングする。確認のためまる1日走らせて止まらないことを確認。

 さて、なにがモヤモヤしているかというとこれは
// なぜか動く
行になってしまっているからだ。本来どうすべきか。
・データシートを見て該当するタイミングの箇所を確認する
・波形を観測。5Vと3V3でどのような差があるか、タイミング違反はどの箇所か
・ソース修正によりタイミング違反が解消されていることを観測
・連続ラン確認
・さらに温度を振ってより厳しい条件で確認

 なぜか動くものはなぜか止まることもあり得るのよ。

 やはりリファレンスとして純正品のボードは必要。Arduino互換品はピンが直接マイコンから接続されているので問題ないように思えるのだが、違いはあるみたいだ。

2014ledtube

Grove LEDbarを使う

 GroveのLEDbarを使ってみた。10個のLEDがレベルメータのように並んでいるモジュール。

Grove - LED Bar

ライブラリは以下から。zipでまとめてダウンロードし、展開後できるフォルダ名の末尾-masterを削除し、Arduino IDEのライブラリフォルダにコピーする。

https://github.com/Seeed-Studio/Grove_LED_Bar


2014LEDbar1

 動作確認はArduino Leonardo、Crowduino(5V)で問題なし。
 仕様上3.3Vで動くようなことが書いてあったが、Crowduinoの3.3V設定では止まってしまった。
 おまけとしてIntel Galileoでもやってみたがまったく動かなかった。

Crowduinoはこれね。Crowduino With ATMega 328 V1.1

 なお、このLEDbarは0〜9の番号がそれぞれに振ってあるが、0が赤、1が橙、あとは緑になっている。オーディオのレベルメータとは直感的には反対なので注意。


超音波距離センサ HC-SR04を1ピンで使う

 超音波距離センサモジュール HC-SR04というのがある。なぜかAmazonで安かった。
HC-SR04 Demo For Arduino 
HC-SR04 User Guide[PDF] 

 TRIG端子にパルスを与えると距離に応じた時間の後ECHO端子に信号がでる。電源を除くと2端子必要。が、Groveの超音波距離センサモジュールのライブラリが使えないかと眺めていたら1端子しか使っていない。同じものに見えるのに?
GROVE - 超音波距離センサモジュール 

 TRIG端子とECHO端子をショートさせたらどうだろうかと考えたが発振してしまうように思える。調べてみたら抵抗で繋げてしまえばいいらしい。
Hack your HC-SR04 into one pin mode 
ForumMain PICAXE ForumActive PICAXE Forum HC-SR04 
これらによると 1.8KΩの抵抗で TRIGと ECHOを接続し、TRIG端子を使えば良いとのこと。手持ちの2.2KΩで試してみた。

2014grove1


2014grove2

これをGroveのケーブルで接続する。

2014grove3
 

 ライブラリは Grove用のものをそのまま使った。
Seeed-Studio / Grove_Ultrasonic_Ranger [Github]

注意:Githubからzipでまとめてダウンロードすると後ろに-masterが付くがArduino IDEのライブラリ名はハイフンを許さないので削除

 ライブラリインストール後、UltraSonicDisplayOnTermスケッチを使って確認。
ソース中、距離をインチで取得する部分とセンチメートルで取得する部分があるが、この間にディレイを適当に入れてやらないと後に書いたほうが0を返す。ひょっとしたらGroveのセンサと非互換の箇所かもしれない。

RangeInInches = ultrasonic.MeasureInInches();
        delay(100); ←これ
RangeInCentimeters = ultrasonic.MeasureInCentimeters();

ということで2ピン必要なところを1ピンにケチることができた。



HC-SR04 超音波距離センサーモジュール For ArduinoHC-SR04 超音波距離センサーモジュール For Arduino

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

Amazonで詳しく見る
by G-Tools

 
記事検索
プロフィール

hardyboy

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