LEGOとATOM LiteでDIYリモコンカー 3 (サーボモータを動かしてみる 1/2)
今回はサーボモータを動かしたいと思います。
これ、税込みで550円です。LEGOがかちっとはまる物理的互換あり、です。とてもおすすめです。我が家では自然発生的にいつの間にか増えLEGOと一緒に転がっています。
サーボモータで遊ぶ前に、シリアルモニタについて簡単に触れておきます。Arduino IDEではシリアル通信を通じてデータを送り、Arduino IDE側のシリアルモニタにデータを表示することができます。たとえば以下のコードです。
#include <M5Atom.h> void setup() { M5.begin(true, false, false); Serial.begin(115200); Serial.println("Hello World!"); } void loop() { for (int i=1;i<=3;i++){ Serial.println(i); } }
M5.beginについては前回のLEDのときは「false」になっていたUARTの引数が「true」になっています。また、そのあと「Serial.begin」でシリアル通信の速度を設定しています。ここでは「115200」としています。この数字は、Arduino IDE側のシリアルモニタでも「同じ数値」を設定する必要があります。「Serial.println」(改行不要の場合は、Serial.print)でテキストを各種出力しています。
Arduino IDEで「Tools」→「Serial Monitor」を表示します。右下に通信の速度を設定する場所があるのでそこを先ほどのコード中で指定していた数字とあわせて「115200」を設定します。
その後、コードをアップロードするとシリアルモニターにテキストが表示されると思います。改行がうまく入らない場合は、「Serial.println」のあとに「delay」で少し間を入れてあげると改善するかもしれません。
今回のサーボモータでは、数字もみながら動きをみるコードを書いておきたいと思いますので、そこで使うかと思います。
ここからサーボモータに入ります。
ジャンパワイヤ3本をサーボモータから生えているケーブル先のコネクタに3本接続します。それをATOM Liteにつなげてあげます。以下の感じです。
今回「ESP32Servo」ライブラリを利用します。Arduino IDEの「Tools」→「Manage Libraries」で「esp32servo」と入れていただくと目的のライブラリが出てくると思います。「ESP32Servo360」の方ではなく「ESP32Servo」の方をインストールしていただければ。
コードは以下のとおりです。
#include <M5Atom.h> #include <ESP32Servo.h> Servo myservo; void setup() { M5.begin(true, false, false); ESP32PWM::allocateTimer(0); ESP32PWM::allocateTimer(1); ESP32PWM::allocateTimer(2); ESP32PWM::allocateTimer(3); myservo.setPeriodHertz(50); myservo.attach(22, 500, 2500); } void loop() { myservo.write(120); delay(1000); }
「M5Atom.h」の他に、先にいれておいた「ESP32Servo.h」を読み込みます。つづけて「Servo」クラスのオブジェクト「myservo」を作ります。
M5.begin(true, false, false);
今回、UARLをサーボモータ以外で使う予定なので今の段階で「true」にしておきました。上のコードではあまり意味をなしていません。
ESP32PWM::allocateTimer(0); ESP32PWM::allocateTimer(1); ESP32PWM::allocateTimer(2); ESP32PWM::allocateTimer(3); servo1.setPeriodHertz(50);
この辺はおまじないと考えていただければ。詳細は、こちらです。
myservo.attach(22, 500, 2500);
ここで引数に設定している箇所でGPIOの22番を指定しています。その後ろもモーター制御のPWM用の値が入っているのですが、とりあえずはおまじないとしてこのままで良いと思います。
myservo.write(120); delay(1000);
「myservo.write」でモーターの出力値を設定します。引数で入っている「120」がモーターの出力値です。LEDのときと同様、delayでモーターの出力を継続しています。loop関数なので、出力値「120」で延々とサーボモータの回転軸が延々と回ります。
出力値は「0-180」で設定しますが、360回転するモーターなので、「0-90、90-180」と「90」を境に回る方向が変わります。回転軸を上に向けておいたときに「0-90」のときは軸は右に周り、「90-180」のときは軸は左に回ります。実際には、ATOM Liteからの3.3Vか5V出力どちらの場合も「80-100」の間はほぼ停止している感じです。
出力値とモーターの回転軸の回り方を追いかけて確認してみたいと思います。loop関数内をfor文で「myservo.write」への入力値を0から180に数字が1ずつ上がっていく感じで記述します。その入力値をSerial.printで出力してArduino IDE側のシリアルモニターで確認できるようにします。
for (int i = 0; i <= 180; i += 1){ myservo.write(i); Serial.println(i); delay(200); }
とします。シリアル通信で数字の変化も追いたいので、「Serial.println」を入れます。全部まとめると、以下でしょうか。
#include <M5Atom.h> #include <ESP32Servo.h> Servo myservo; void setup() { M5.begin(true, false, false); Serial.begin(115200); ESP32PWM::allocateTimer(0); ESP32PWM::allocateTimer(1); ESP32PWM::allocateTimer(2); ESP32PWM::allocateTimer(3); myservo.setPeriodHertz(50); myservo.attach(22, 500, 2500); } void loop() { for (int i = 0; i <= 180; i += 1){ myservo.write(i); Serial.println(i); delay(200); } }
無事に動くとこんな感じになるかと思います。
ちょっと長くなってきたので、一旦ここで切りたいと思います。次もサーボモータの続き(たぶん)