はじめに
チーム課題を大学の授業において課されたので、ESP32とTello EDUを使ってTCASをドローンに移植するというテーマを行うこととなった。その参考として本記事を作成する。備忘録的な感じで。
環境
ドローン:Tello EDU
マイコン:ESP32-DevKitC-32D
GPSモジュール:GYSFDMAXB(秋月電子通商)
目標
TCASの実装が第一目標。具体的には、複数台のドローンが接近した状況で操縦制御に介入し、自動的に衝突回避操作を行うこと。学校の許可得たのちに、安全に充分配慮し実験を行う予定。
ESP32について
ESP32を一言で表すと、Arduinoの派生版。基本的にArduinoにはWi-FiとBluetoothを搭載していないが、ESP32はこれらを搭載している。また、今回使用しているESP32-DevKitC-32Dは、簡単に開発が行えるようにいろいろな部品がくっついたもの。具体的には、MicroUSBでPCと接続を行い適切な通信を行うことで簡単にファイルをESP32に書き込み、実行することができる。初期状態ではC/C++に似たArduinoの開発言語に対応しているが、本環境ではMicroPythonに対応させるために必要なプログラムを書き込み、MicroPythonが実装できるようにしてある。
ESP32でプログラムを実行するまでの手順
ESP32でプログラム(MicroPython)を実行するためには、
1.MicroPythonでプログラムを書く
2.ampyを使ってファイルをESP32を転送する
3.PCからシリアル通信を行うコマンドを用いてESP32と接続、コード実行の必要があれば対話環境で実行する
以上の手順となる。
1から順に解説する。
初めに、MicroPython(.py)でコードを記述する。MicroPythonについては、以下のサイトが参考になる。
今回は例として、ESP32に接続したLEDを点滅させるコードを記述した。
import time
from machine import Pin
led = Pin(27, Pin.OUT)
def run():
for i in range(10):
led.value(1)
time.sleep(1)
led.value(0)
time.sleep(1)
次に、作成したファイルをESP32に転送を行う。
まず、自身の環境にampyをインストールする。
Mac OSでの例
$ pip install adafruit-ampy
次に、PCとESP32を接続しているポートを調べる。筆者の環境では、USBポートによってポートの名称が変わるので、その都度調べるか常に決まったポートを使い続けるのが良いだろう。
Mac OSでの例
% ls -l /dev/tty.*
crw-rw-rw- 1 root wheel 9, 6 11 6 01:32 /dev/tty.usbserial-14220
この、「/dev/tty.usbserial-14220」がポートの名称である。
Windowsでの例
デバイスマネージャーを開き、そこから接続されているポートを調べる。どうやらCOM*と出るらしい。
ここまでできればあとは転送を行うのみである。
% ampy -p /dev/tty.usbserial-14220 put ./ESP32/blink.py
これは、上で調べて判明したポートに対して現在のディレクトリ下のESP32ディレクトリ下のblink.pyというファイルをESP32に転送している。
何もエラーが出てこなければ正常である。
次に、このコマンドをPythonの対話環境で実行する。まず、ESP32と通信しコマンドライン環境を表示させる。
% screen /dev/tty.usbserial-14220 115200
これは、ESP32とシリアル通信を行うコマンドである。115200とは、シリアル通信のレートのようなものを指定している。初期設定では115200としておけば良い。なお、他の都合で変更した場合はその数値を設定して通信を行うようにすれば良い。
このコマンドを一度行うと何も出てこない状態となるため、一度Ctrl+Cでリセットさせると、Pythonの対話環境が出てくる。
>>>print('hello')
>>>hello
以上のように正しくPythonの対話環境を実行できていることがわかるだろう。
さて、ampyを使ってblink.pyを転送したが、それを実行しよう。その前にblink.pyがESP32に正しく存在しているかどうかを調べよう。
以下のようにすれば良い。
>>>import os
>>>os.listdir()
['blink.py', 'boot.py']
blink.pyがESP32に正しく転送されていることがわかる。
さて、blink.pyのrunメソッドを実行する。
現在の対話環境において、
>>>import blink
>>>blink.run()
とすればESP32に繋がれたLEDが点滅を始めるだろう。
なお、配線は、LEDのプラス側を27ピンに、マイナス側をGNDピンに接続する。なお、ESP32の出力電圧は3.3Vである。必要に応じて抵抗値を計算し抵抗をLEDと直列に接続することでLEDにかかる電圧を調整して欲しい。
ここで、blink.pyはインポートをした後にメソッドを実行する形で実行を行なったが、main.pyという名前で保存されたファイルは、ESP32の起動すると実行が行われる。この機能も用途に応じて使い分けて欲しいと思う。
さて、ここまでできたところで、PCとESP32との通信の切断方法である。
Ctrl+A+Kでyes,noの選択が出てくるのでyと入力すれば良い。
とりあえず以上。GPSとESP32との接続や、Micropythonを用いたマルチスレッドプログラミング、ESP32同士の有線通信等は後にまとめようと思う。
個人的な願い
ラズパイZERO 2 マジで早く出てくれ。