モーター
モーターは、電気エネルギーを機械エネルギーに変換する装置です。モーターは、固定されたステーターと回転するローターの2つの部分で構成されています。モーターが動作するとき、固定されている部分はステーターで、回転する部分はローターです。ステーターは通常モーターの外側ケースであり、電源に接続するための端子を備えています。ローターは通常モーターのシャフトであり、他の機械的装置を駆動して動作させることができます。以下の図は、2つのピンを備えた小型のDCモーターです。
モーターを電源に接続すると、モーターは一方向に回転します。電源の極性(電源のプラスとマイナス)を逆転させると、モーターは逆方向に回転します。
PWMについて
モーターを正確に制御するにはPWMを理解する必要があります。ただ、子どもたちには難しいかなと思いますので、大人が先に理解したほうが良いです。大人教室では以下が該当します。
PWM (Pulse Width Modulation)とは、デジタルピンを使って一定の周波数の矩形波を送る手法です。矩形波は、一定時間だけ電圧が高いハイレベルと、電圧が低いローレベルから成ります。ハイレベルとローレベルの一組が繰り返される時間のことを周期と呼びます (周期の逆数は周波数)。ハイレベルが継続する時間は一般的に「パルス幅」と呼ばれ、デューティーサイクルとはパルス幅 (PW) が周期全体 (T) に占める割合(%)のことです。
ハイレベルが継続する時間が長いほど、デューティサイクルが大きくなり、対応するアナログ信号の電圧が高くなります。以下の図は、パルス幅が0%から100%に変化したとき、0Vから5Vの間で変化するアナログ信号の電圧を示しています (ハイレベルは5Vとします):
大事なポイントとしては、デューティー比によってモーターの出力を変えるということです。
回路図
このチュートリアルでは、車に搭載されたドライバチップは、IIC通信チップ PCA9685の8〜15番目の出力チャネル(LED8~LED15)によって制御されます。 モーターを駆動する際は、まずPCA9685チップを初期化し、次に対応する出力チャネルのPWM値を設定して、出力電圧でモーターを動作させる必要があります。
PCA9685チップについては大人教室では扱いません。Project20.1LCDディスプレイでI2Cという通信規格を学びます。
PCA9685はI2C通信でPWM値を送信すると、LED0~15にそれぞれ出力してくれるという便利なICチップです。
そして、それぞれの出力先にモータードライバICが接続されていて、モーターを制御しています。
上の図からわかるように、モーターM1を制御したい場合は、PCA9685の14番目と15番目のチャネルを設定する必要があります。
同様に、モーターM2を制御するにはPCA9685の8番目と9番目のチャネルを、モーターM3を制御するには12番目と13番目のチャネルを、モーターM4を制御するには10番目と11番目のチャネルを設定する必要があります。
コード
『Freenove_4WD_Car_Kit_for_ESP32\Sketches』フォルダの『01.1_Car_Move_and_Turn.ino』を開きましょう。
このチュートリアルで、車が意図した方向と逆に動いてしまう場合(例えば、前進するべきところが後退してしまう、左折するべきところが右折してしまうなど)、”Freenove_4WD_Car_For_ESP32.h”という名前のファイルを修正することで解決できます。ファイル内のコメントに従って値を変更してください。
/**********************************************************************
Product : Freenove 4WD Car for ESP32
Auther : www.freenove.com
Modification: 2020/12/18
**********************************************************************/
#include "Freenove_4WD_Car_For_ESP32.h"
void setup()
{
PCA9685_Setup(); //Initializes the chip that controls the motor
}
void loop()
{
Motor_Move(2000, 2000, 2000, 2000); //go forward
delay(1000);
Motor_Move(0, 0, 0, 0); //stop
delay(1000);
Motor_Move(-2000, -2000, -2000, -2000); //go back
delay(1000);
Motor_Move(0, 0, 0, 0); //stop
delay(1000);
Motor_Move(-2000, -2000, 2000, 2000); //turn left
delay(1000);
Motor_Move(0, 0, 0, 0); //stop
delay(1000);
Motor_Move(2000, 2000, -2000, -2000); //turn right
delay(1000);
Motor_Move(0, 0, 0, 0); //stop
delay(1000);
}
プログラム自体はすごくシンプルです。制御構文などもなく、ツラツラと命令だけかが書いてあります。
まずはアップロードして動かしてみましょう。それぞれのプログラムがどんな動きに対応しているのか、よーく観察して見比べてみてください。
動きがわかったら、「こういう動きに変えたい!」というのをまずは宣言しましょう。
その上でプログラムを書き換えてみて、アップロードし、実際に動作させて思った通りの動きになったかどうか観察してみましょう。
この、『目標を宣言する』というのが教育に於いては大切で、ただなんとなく変えてみるだけでなく、PDCAのサイクルが回りだす瞬間になっています。考える力を養うためには、まずは『目標を宣言する』『試す』『結果を観察する』『改善策を考える』というステップが大事です。
プログラムの書き方について
コメント
まずはコメントについて学びましょう。
コメントとは、プログラム本体ではなく、プログラムについての説明等をソースコード中に書き残す物です。なぜそのようなコードにしたのか等を書いておくと、他の人が見たときに理解しやすくなります。
コメントの書き方は2種類あります。
コメントが1行のときは『//』から行末までがコメントです。
コメントが複数行のときは『/*』から始まって『*/』までです。間にある『*』は飾りです。
ライブラリの読み込み
前回の授業で色々なライブラリをインストールしました。ライブラリというのは『便利ツール』というような感じです。読み込んだライブラリを使用するための書き方が以下の行の部分です。
#include "Freenove_4WD_Car_For_ESP32.h"
ここに書いてあるファイル『Freenove_4WD_Car_For_ESP32.h』と対になるファイル『Freenove_4WD_Car_For_ESP32.cpp』に、今回だとMotor_Move()関数が定義されています。Motor_Move()関数はこの学習キットを開発したfreenoveさんが用意してくれている、便利ツールと言う感じです。大人教室で学習された方はモーターをPWMで制御することを学んだと思います。ですが、子ども教室ではそこまで複雑なことをしなくても簡単にモーターが動くようになっていますね。
初期設定とメインループ
いま教材で使用しているのはESP32というマイコンです。このマイコンをArduino言語で制御しています。
Arduino言語ではプログラム実行時に1回だけ実行されるsetup()関数と、以降繰り返されるloop()関数があります。
初期設定などはsetup()関数の中に記載して、メインの処理はloop()関数の中に記載する、というルールです。
待ち時間
プログラムの動作を一時的に止めたい時はdelay()関数を仕様します。括弧の中の数字が待ち時間で、ミリ秒単位になっています。1000と書いたら1秒、10000と書いたら10秒です。好奇心旺盛な子どもたちは、大人が説明する前に色々と数字を変えてみて動き方を試している頃だと思います。
次回はサーボ(首振り)について動作を確認してみましょう!
コメント