LEGOとATOM LiteでDIYリモコンカー 3 (サーボモータを動かしてみる 1/2)

 今回はサーボモータを動かしたいと思います。

f:id:haseharu:20210721074840j:plain

www.youtube.com

 これ、税込みで550円です。LEGOがかちっとはまる物理的互換あり、です。とてもおすすめです。我が家では自然発生的にいつの間にか増えLEGOと一緒に転がっています。

www.switch-science.com

 サーボモータで遊ぶ前に、シリアルモニタについて簡単に触れておきます。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」で少し間を入れてあげると改善するかもしれません。
 今回のサーボモータでは、数字もみながら動きをみるコードを書いておきたいと思いますので、そこで使うかと思います。
 
f:id:haseharu:20210721212912p:plain

 ここからサーボモータに入ります。

 ジャンパワイヤ3本をサーボモータから生えているケーブル先のコネクタに3本接続します。それをATOM Liteにつなげてあげます。以下の感じです。

f:id:haseharu:20210721075645j:plain

 今回「ESP32Servo」ライブラリを利用します。Arduino IDEの「Tools」→「Manage Libraries」で「esp32servo」と入れていただくと目的のライブラリが出てくると思います。「ESP32Servo360」の方ではなく「ESP32Servo」の方をインストールしていただければ。

f:id:haseharu:20210721090810p:plain

 コードは以下のとおりです。

#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);

 この辺はおまじないと考えていただければ。詳細は、こちらです。

github.com

platformio.org

  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);
  }
}

 無事に動くとこんな感じになるかと思います。

www.youtube.com

 ちょっと長くなってきたので、一旦ここで切りたいと思います。次もサーボモータの続き(たぶん)