サーボ雲台のジョイスティック操作というコンテキストの中で、ちょっと目先を変えてARDUINO PRO MINIというArduinoのマイコンモジュールを買ってみた。5V 16MHz動作版で、スイッチサイエンスの通販で1,243円。
秋月のAE-ESP-WROOM02が650円なことを考えると、わずかなポートしか必要のない用途で別のマイコンユニットを使う必要はないような感じなのだけど、基板に占める面積が小さいこと、サーボ用ロジックと同様に5V動作て電圧レギュレータが不要なこと、A/Dコンバータを後付けする必要もないことなどで、ちょっと試してみることにした。
表(実装)面と裏面。大きさ的には、SDカードをちょっとスマートにしたくらいで、とてもコンパクトなのだけど、 AVR ATmega328Pがちゃんと載っている。
表面には電源オンを表す赤いLEDとポート#13に接続された緑色のLED(いずれも小さくて見えない)やリセットスイッチが載っている。リセットスイッチは小さくかたいので、安定した台に載っていないと押しにくい。
裏面は製造元のsparkfun社のロゴが目立つ。左端に、動作電圧(5V)と動作周波数(16MHz)に黒いマークが付けられているのが見える。
アナログ入力用のポートは、基板両端のスルーホールにはA0~A3しかでていないが、拡張されたA4~A7を使うためのスルーホールが内側に用意されている。
このモジュールにはUSBポートが載っていないので、表面の写真での左端にシリアル通信用のスルーホールが用意されている。ここにピンポストを立てておけばspakfun社のUSB-シリアル変換モジュールなどがすんなり接続できるらしい(ただ、ちょっと高い)。
AE-ESP-WROOM-02と並べてみたところ。WROOM-02というモジュール自体は、ブレッドボードからほぼはみ出している銀色の部分(および左側のアンテナ部分)のみなので、うまく2.54mmピッチに変換してくれれば、ほぼ同じ大きさになるだろう。ただ、2.54mmピッチの汎用工作基板の上で何かをこしらえるとすれば、どうしても変換基板のための面積が必要になってしまうのは致し方ないのだけど。
使ってみる
「ふつうのArduino」なので今さら感はあるものの、ARDUINO PRO MINIに、手持ちの秋月のAE-FT-231Xを組み合わせてブレッドボードに載せてみた。
ブレッドボードの上には以下のようなものを追加した。
- RESETスイッチ
ARDUINO PRO MINIのが押しにくいので。モジュール上でプルアップされているので、押下時にGNDになるように接続するだけでよい。 - I/Oピンの#2にHIGHで点灯するLED
- #4にタクトスイッチ(押下時にLOW検出)
pinMode(TACT_SW, INPUT_PULLUP); という書き方をすると、内部でプルアップされるというので、非押下時HIGHは保証されるはず。 - AE-FT-231Xのシリアル出力関係を図のように接続
AE-FT-231Xのシリアル側は、3.3Vロジックにも5Vロジックにもそのまま接続できる、とのこと。
DTRのアサートでArduinoにリセットがかかり、ブートローダによってしばらくの間プログラム転送待ちになるようである。 - AE-FT-231Xの+5V出力をブレッドボード上の電源とする
データシートによると最大350mAまで利用できるということなので、こういった構成ならば問題ないだろう。 - CBUS2# に緑色のLEDを追加し、プログラム転送時に点滅させる。
水魚堂さんの回路図エディタにも慣れてきたので、最近は回路図を手書きでは書かなくなってきた。
スイッチサイエンスの「ふつうのブレッドボード」に載せるとこんな具合になった。4本脚のタクトスイッチを使うと、しばしば装着するときに向きを間違えていたので、2本脚のタクトスイッチを使うことにした。
スケッチ
上記のような組合せでスケッチの転送やシリアルモニタがちゃんと使えるのか確認したかったので、LEDを点滅させるだけのスケッチを作ってみた。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
#include <FlexiTimer2.h> // http://playground.arduino.cc/Main/FlexiTimer2 #define START_MSG String(__FILE__) + " start." #define RED_LED 2 #define TACT_SW 4 #define INITIAL_INTERVAL 1024 int wait_time = INITIAL_INTERVAL; void timer_func() { digitalWrite(RED_LED, digitalRead(RED_LED) ^ 1); } void set_timer(int msec) { FlexiTimer2::set(msec, timer_func); FlexiTimer2::start(); Serial.println("Interval = " + String(msec)); } void setup() { Serial.begin(115200); Serial.print(START_MSG); pinMode(RED_LED, OUTPUT); digitalWrite(RED_LED, 0); pinMode(TACT_SW, INPUT_PULLUP); set_timer(wait_time); } void loop() { static bool pushed = false; delay(250); if (!pushed && digitalRead(TACT_SW) == LOW) { pushed = true; FlexiTimer2::stop(); wait_time >>= 1; if (wait_time < 128) wait_time = INITIAL_INTERVAL; set_timer(wait_time); } else if (digitalRead(TACT_SW) == HIGH) pushed = false; } |
LEDがチカチカするだけなら別になんでもいいのだけど、タイマーを使った定周期呼び出しは今後も必要なので、FlexiTimer2というライブラリを利用した(http://playground.arduino.cc/Main/FlexiTimer2)。
プログラムの転送が終わるとI/Oピン#2のLEDが点滅を開始する。#4に接続したタクトスイッチを押すたびごとに点滅の速度が速くなり、4回目の押下で元の速度に戻って、以降はそれを繰り返すという動作を意図している。
小技的なところでは、#define START_MSG String(__FILE__) + ” start.” とすることで、実行したスケッチのフルパスをシリアルモニタに表示されるようにしている(開発環境によって表示内容は変わる)。
動作状況
プログラム転送から一連の操作を動画に撮ってみた。
すでにスケッチを転送済で動作している状態から開始していて、2秒後くらいにArduino IDEの「マイコンボードに書き込む」を選択して転送を開始している。PRO MINIの上の緑色のLEDがチカチカッとして転送が開始し、FT231X側の緑色のLEDが点滅する。なお、緑色のLEDは暗いので撮影時には抵抗を1KΩに変更した。
転送が完了するとスケッチの動作が開始して赤いLEDの点滅が始まる。そしてタクトスイッチの押下に応じて点滅速度が変わっていく。
そのときのシリアルモニタには、以下のような具合に表示される。
(内情が見えないように一部フォルダ名を消した)。
きょうのまとめ
しょうしょう、今さら感がある内容になってしまったが、ARDUINO PRO MINIを初めて使った記録として書いておいた。ブレッドボード上に組んだものは用が済むとすぐに外してしまうのだけど、ここまで書いておけば後で思い出すときの役に立つだろう、という感じ。
次はジョイスティックを接続してサーボを動かすことになるのだけど、外で使うときの電源をどうするかに悩んでいる。サーボは、電源電圧が下がるとちゃんと動かないので、手持ちのモバイルバッテリで大丈夫なのか、とか、例えばエネループ6本使うとすると三端子レギュレータが必要になっちゃうなとか。結局、やってみないと分からないのである。