Telloの使い方 | Scratchでドローンプログラミング (Mac編)

人気の小型ドローン「Tello(テロ)」。

Tello(テロ)では、パソコン、タブレット、スマホを使ってプログラミング飛行ができます。

本記事では、Tello(テロ)でプログラミング言語「スクラッチ」を使い、Macでプログラミング飛行する手順を、図解つきでわかりやすく解説します。

Scratch(スクラッチ)とは、MITが開発したプログラミング教育用の言語。「ブロック」と呼ばれる部品を組み合わせ視覚的に簡単にプログラミングができます。

実際にドローンを飛ばす楽しさがあり、小中学生が興味を持ってプログラミングを学習するのにピッタリです。

目次

小型ドローン Ryze Tech/DJI社 Tello シリーズ

Ryze Tech/DJI ドローン Tello シリーズは、子供でも簡単に飛ばせるDJIの最小ドローンシリーズです。

Telloシリーズの機体重量は、200g未満のため、航空法の規制対象外。「手軽にドローンを初めてみたい」「安価なドローンがほしい」という、ドローン初心者にピッタリの機種です。

Tello シリーズは、「DJI ドローン Tello」「DJI ドローン Tello Boost コンボ」「DJI ドローン Tello アイアンマン エディション」「DJI ドローン  Tello EDU」の4機種のラインナップがあります。 

▼一般向けドローンシリーズ

DJI ドローン Tello Tello(テロー)シリーズ
子供でも簡単に飛ばせるDJI小型最小ドローン 
航空法規制対象外の200g未満
12,800円〜
DJI公式ストア
詳しく
SPARK(スパーク)シリーズ
手のひらサイズの小型ドローンシリーズ
54800円〜
DJI公式ストア
Mavic (マヴィック)シリーズ
小型ながら本格的なドローンシリーズ
104,000円〜
DJI公式ストア
DJI ドローン Phantom 4 Pro V2.0 PHANTOM(ファントム)シリーズ
DJIの代表的なドローンシリーズ
204,000円〜
DJI公式ストア

▼プロ向けドローンシリーズ

DJI ドローン INSPIRE シリーズ Inspire 2 INSPIRE(インスパイア)シリーズ
プロ向けの空撮用ドローンシリーズ
DJI公式ストア
389,000円〜

子供でも簡単に飛ばせる小型高性能ドローン

メリット

  • 航空法規制対象外の200g未満の軽量・小型ドローン
  • 子供でも簡単に飛ばせる
  • 安定飛行を実現するビジョンポジショニングセンサー搭載
  • 飛行時間13分・飛行距離100m
  • 自動で起動&ホバリング
  • 専用アプリでスマホで簡単操作(リアルタイムで映像表示、6つのフライトモード搭載)
  • 汎用Bluetoothゲームコントローラで操作可能
  • スマホ挿入型VRヘッドセット対応
  • 500万画素の静止画撮影
  • 720/30p動画撮影
  • 簡単プログラミング自動飛行(Tello EDUアプリ、Scrach)
  • 本格プログラミング飛行(Python、Swift)
  • プログラミング飛行をサポートする「ミッションパッド」
子供への誕生日プレゼントにもおすすめです。軽量で風に流されやすいので、屋外で飛ばすにはやや不向きで、屋内向け。

DJI ドローンの中で最も安価で軽量なTello(テロー)シリーズ。重さは航空法の適用外(200未満)となる約80gの軽量ボディなので、気軽に飛ばせます。

Telloアプリをインストールし、スマホ/タブレットからカンタンに操作可能。

720pでの動画撮影可能なカメラを搭載しています。静止画の撮影は500万画素。

1回のフル充電での最大飛行時間は約13分。バッテリーは交換式なのでサブバッテリーを持っていれば長時間楽しめます。

エアリアルスタント(宙返り)を決めて、EZショットでショートムービーを撮影。プログラミングまで学べます。

プログラミング教育用の言語「Scratch(スクラッチ)」

Scratch(スクラッチ)とは、MIT(マサチューセッツ工科大学 )が開発したプログラミング教育用の言語。

様々な機能を持つ「ブロック」と呼ばれる部品を組み合わせて、視覚的に簡単にプログラミングができます。複雑なコードを書く必要はありません。

主に小学生から中学生までを対象としたプログラミング言語です。そのため、初心者でも簡単に取り組むことができます。

Telloのドローンプログラミングの方法

小型ドローンTelloを使ったドローンプログラミングには、次の方法があります。

  • Scratch(スクラッチ):ビジュアルプログラミング
  • Tello EDUアプリ:アプリでゲーム感覚でビジュアルプログラミング
  • Python(パイソン)
  • Swift(スウィフト)

本記事では、Scratch(スクラッチ)使ったドローンプログラミング飛行を解説します。

Scratch(スクラッチ)でドローンプログラミング飛行

Scratch – Imagine, Program, Share

対象:小学生〜中学生向け
必要なもの:パソコン(Mac/Windows)

Tello EDUアプリでドローンプログラミング飛行

TELLO EDU

TELLO EDU

wistronT1無料posted withアプリーチ

対象:小学生〜中学生向け
必要なもの:スマホ(iOS/Android)、Tello EDUアプリ(無料)

DroneBlocksアプリでドローンプログラミング飛行

DroneBlocks

DroneBlocks

Dennis Baldwin無料posted withアプリーチ

DRONEBLOCKS(IOS/ANDROID/PC)アプリは、スマホ・タブレット(iOS/Android)に加えて、パソコンでもドローンプログラミングができるアプリ。英語は言語です。アプリの利用料金は無料。
 
対象:小学生〜中学生向け
必要なもの:スマホ/タブレット(iOS/Android)、DroneBlocks(無料)
 

Python(パイソン)でドローンプログラミング飛行

Welcome to Python.org

対象:中学生以上向け
必要なもの:パソコン(Mac/Windows)

Swift(スウィフト)でドローンプログラミング飛行

Swift – Apple Developer

中学生以上向け
必要なもの:パソコン(Mac/Windows/Linux)※Mac推奨

Tello でScratch(スクラッチ)を使ってドローンプログラミングに必要なもの

Tello でScratch(スクラッチ)を使ってドローンプログラミングに必要なものは、

  • Telloシリーズ
  • パソコン(Mac/Windows/Linux)
  • Scratch 2.0(オフライン)

の3つです。

必要なもの1:Telloシリーズ

Scratchを使ったドローンプログラミングは、Telloシリーズの「Tello」「Tello アイアンマン エディション」「Tello EDU」どの機種でも対応しています。

DJI ドローン Tello DJI ドローン Tello
✓航空法規制対象外の200g未満
✓子供でもスマホで簡単操作
✓動画、写真撮影
✓簡単プログラミング飛行
12,800円
詳しく
DJI ドローン Tello Boost コンボ DJI ドローン Tello Boost コンボ
✓航空法規制対象外の200g未満
✓子供でもスマホで簡単操作
✓動画、写真撮影
✓簡単プログラミング飛行
18,900円
DJI ドローン Tello アイアンマン エディション DJI ドローン Tello アイアンマン エディション
✓アイアンマン仕様
✓航空法規制対象外の200g未満
✓子供でもスマホで簡単操作
✓動画、写真撮影
✓簡単プログラミング飛行
16,900円
DJI ドローン  Tello EDU DJI ドローン  Tello EDU
✓プログラミング教育用ドローン
✓航空法規制対象外の200g未満
✓子供でもスマホで簡単操作
✓動画、写真撮影
✓簡単プログラミング飛行
16,800円

▼RYZE Tech/DJI Telloシリーズの詳しい比較は次の記事で解説しています。

Ryze Tech/DJI ドローン Telloシリーズの比較と選び方 Tello/Tello Boostコンボ/アイアンマン エディション/Tello EDU

必要なもの2:パソコン(Mac/Windows/Linux)

Scratch(スクラッチ)を使ったプログラミングに高性能なパソコンは不要です。

通常の家庭用パソコンで全く問題なく動かせます。

必要なもの3:Scratch 2.0(オフライン)

Scratch 2.0(スクラッチ)には、複数のバージョンがあります。

  • Scratch 1.4(オフライン版)
  • Scratch 2.0(オンライン版・オフライン版)
  • Scratch 3.0(オンライン版・オフライン版)

Tello のプログラミングでは、「Scratch 2.0」オフライン版を使います。

プログラミング言語「Scratch(スクラッチ)」ドローンプログラミングの準備

ここから、プログラミング言語「Scratch(スクラッチ)」を使ってドローンプログラミングを行うための準備を解説します。

  1. 「Adobe AIR」のダウンロード&インストール
  2. 「Scratch 2.0オフラインエディタ」のダウンロード&インストール
  3. 「Tello.js」と「Tello.s2e」をダウンロード
  4. 「node.js」ダウンロード&インストール

ステップ1:Adobe AIRのダウンロード&インストール

Scratch 2.0 オフラインエディターを最新版を使う為には、Adobe AIR 20が必要です。次の手順でダウンロード&インストールします。

  1. Scratch – Scratch 2.0にアクセスし、Adobe AIRをダウンロード
    関連:MacOS バージョンを確認する2つの方法
  2. 「今すぐダウンロード」をクリックします。
  3. ダウンロードしたファイル(AdobeAIR.dmg)をダブルクリックします。
  4. ウィンドウが開いたら、インストーラー(Adobe AIR Installer)をダブルクリックで起動します。
  5. 確認画面が表示されたら、「アップデート」をクリックします。
  6. インストールが完了です。

ステップ2:Scratch2.0(オフライン版)Mac版のダウンロード&インストール

  1. Scratch – Scratch 2.0にアクセスし、「Mac OS X – ダウンロード」をクリックします。
  2. ダウンロードしたファイル(Scratch-461.dmg)をダブルクリックし展開します。
  3. ウィンドウが開いたら、インストーラー(Install Scrach 2)をダブルクリックします。
  4. インストール先を確認し、「続行」をクリックします。
  5. インストールが完了すると、Scratchが起動します。
  6. 日本語化するには、左上の地球儀のアイコンから「日本語」または「にほんご」を選びます。

ステップ2:「node.js」ダウンロード&インストール

https://nodejs.org/ja/にアクセスし、「node.js」をダウンロードしてインストールします。

  1. https://nodejs.org/ja/にアクセスし、「10.16.3 LTS 推奨版」をクリックします。
  2. ダウンロードしたファイル(node-v10.16.3.pkg)をダブルクリックします。
  3. 「続ける」をクリック
  4. 「続ける」をクリック
  5. 「同意する」をクリック
  6. インストール先ディスクを選択し、「続ける」をクリック
  7. 「インストール」をクリック
  8. インストールを待つ。以上でNode.jsのインストール完了です。
     

ステップ3: 「Tello.js」と「Tello.s2e」をダウンロード

次に「Tello.js」と「Tello.s2e」をダウンロードします。

  1.  「Tello.js」と「Tello.s2e」をhttps://dl-cdn.ryzerobotics.com/downloads/tello/20180222/Scratch.zipからダウンロードします。
  2. ダウンロードした圧縮ファイル(Scratch.zip)をダブルクリックし展開します。
  3. 「Scratch 2」のフォルダの中に「Tello.js」「Tello.s2e」「TelloChs.s2e」が入っています。
  4. 「Tello.js」ファイルを開き、「var」から始まる部分から下まで全てコピーします。
    
    var dataToTrack_keys = ["battery", "x", "y", "z", "speed"];
    var lastDataReceived = null;
    
    
    var http = require('http');
    var fs = require('fs');
    var url = require('url');
    
    
    
    var PORT = 8889;
    var HOST = '192.168.10.1';
    
    var dgram = require('dgram');
    var client = dgram.createSocket('udp4');
    
    
    http.createServer( function (request, response) {  
    
        var pathname = url.parse(request.url).pathname;
           
        var url_params = request.url.split('/');
    
        if (url_params.length < 2)
            return;
    
        var command = url_params[1];
        
          switch (command){
            
            case 'poll':
                respondToPoll(response);
                break;
            
            case 'takeoff':
                console.log('takeoff');
                TakeoffRequest();
            break;
            
            case 'land':
                console.log('land');
                LandRequest();
            break;
            
            case 'up':
                dis = (url_params.length >= 3) ? url_params[2] : 0;
                console.log('up ' + dis);
                var message = new Buffer( 'up '+ dis );
                client.send(message, 0, message.length, PORT, HOST, function(err, bytes) {
                    if (err) throw err;
                });
            break;
    
            case 'down':
                dis = (url_params.length >= 3) ? url_params[2] : 0;
                console.log('down ' + dis);
                var message = new Buffer( 'down '+ dis );
                client.send(message, 0, message.length, PORT, HOST, function(err, bytes) {
                    if (err) throw err;
                });         
            break;
    
            case 'left':
                dis = (url_params.length >= 3) ? url_params[2] : 0;
                console.log('left ' + dis);
                var message = new Buffer( 'left '+ dis );
                client.send(message, 0, message.length, PORT, HOST, function(err, bytes) {
                    if (err) throw err;
                });
            break;
    
            case 'right':
                dis = (url_params.length >= 3) ? url_params[2] : 0;
                console.log('right ' + dis);
                var message = new Buffer( 'right '+ dis );
                client.send(message, 0, message.length, PORT, HOST, function(err, bytes) {
                    if (err) throw err;
                });
            break;      
            
            case 'forward':
                dis = (url_params.length >= 3) ? url_params[2] : 0;
                console.log('forward ' + dis);
                var message = new Buffer( 'forward '+ dis );
                client.send(message, 0, message.length, PORT, HOST, function(err, bytes) {
                    if (err) throw err;
                });         
            break;      
            
            case 'back':
                dis = (url_params.length >= 3) ? url_params[2] : 0;
                console.log('back ' + dis);
                var message = new Buffer( 'back '+ dis );
                client.send(message, 0, message.length, PORT, HOST, function(err, bytes) {
                    if (err) throw err;
                });         
            break;
    
            case 'cw':
                dis = (url_params.length >= 3) ? url_params[2] : 0;
                console.log('cw ' + dis);
                var message = new Buffer( 'cw '+ dis );
                client.send(message, 0, message.length, PORT, HOST, function(err, bytes) {
                    if (err) throw err;
                });
            break;
    
            case 'flip':
                dis = (url_params.length >= 3) ? url_params[2] : 0;
                console.log('flip' + dis);
                var message = new Buffer( 'flip '+ dis );
                client.send(message, 0, message.length, PORT, HOST, function(err, bytes) {
                    if (err) throw err;
                });         
            break;  
    
            case 'ccw':
                dis = (url_params.length >= 3) ? url_params[2] : 0;
                console.log('ccw ' + dis);
                var message = new Buffer( 'ccw '+ dis );
                client.send(message, 0, message.length, PORT, HOST, function(err, bytes) {
                    if (err) throw err; 
                });
                client.on('message',function(msg,info){
                    console.log('Data received from server : ' + msg.toString());
                    console.log('Received %d bytes from %s:%d\n',msg.length, info.address, info.port);
                });                             
            break;      
            
            case 'setspeed':
                dis = (url_params.length >= 3) ? url_params[2] : 0;
                console.log('setspeed ' + dis);
                var message = new Buffer( 'speed '+ dis );
                client.send(message, 0, message.length, PORT, HOST, function(err, bytes) {
                    if (err) throw err;
                });         
            break;              
                
          }
        response.end('Hello Tello.\n');
       
    }).listen(8001);
    
    
    console.log('---------------------------------------');
    console.log('Tello Scratch Ext running at http://127.0.0.1:8001/');
    console.log('---------------------------------------');
    
    
    function respondToPoll(response){
    
        var noDataReceived = false;
    
        var resp = "";
        var i;
        for (i = 0; i < dataToTrack_keys.length; i++){
            resp += dataToTrack_keys[i] + " ";
            resp += (i+10);
            resp += "\n";
        }
        response.end(resp);
    }
    
    function TakeoffRequest(){
        
        var message = new Buffer('command');
    
        client.send(message, 0, message.length, PORT, HOST, function(err, bytes) {
            if (err) throw err;
        });
        var message = new Buffer('takeoff');
        client.send(message, 0, message.length, PORT, HOST, function(err, bytes) {
            if (err) throw err;
    
        });
    }
    
    function LandRequest(){
    
        var message = new Buffer('land');
    
        client.send(message, 0, message.length, PORT, HOST, function(err, bytes) {
            if (err) throw err;
        });
    }
    
    
    
  5. ターミナルを起動し、キーボードで「 node 」と入力しエンターキーを押します。ターミナルとは、コマンドと呼ばれる命令文を使ってMacの操作や設定をおこなうためのツールです。
    ターミナルの場所:アプリケーション > ユーティリティ > ターミナル
    note
  6. コピーしたTello.jsの中身を貼り付けます。

ステップ4:Scratch 2.0にTelloのブロック追加

次に、Scratch 2.0でTelloの操作を指示するための「ブロック」を追加します。

  1. Scratch 2.0を起動し「Shift」キーを押しながら 「ファイル」メニューをクリックし、「実験的なHTTP拡張を読み込み(import experimental HTTP extension)」を選択します。
  2. 「Tello.s2e」ファイルを選び、「開く」をクリックします。
  3. 「スクリプト」>「その他」の中に「Tello Control」が追加されます。むらさき色の「take off」「land」等、追加されていればOKです。
ここまでの手順で、ScratchでTelloのプログラミングの準備が整いました。

プログラミング言語「Scratch(スクラッチ)」ドローンプログラミング

ここからは、いよいよプログラミングが組んでいきます。

ステップ1:ドローンプログラムを組む

Scratch(スクラッチ)では、「ブロック」という機能を部品を組み合わせて、視覚的にプログラムを組きます。

むらさき色の「ブロック」1つ1つには意味があります。例えば、「take off」では離陸を支持します。

▼ブロック一覧

ブロック 説明
take off 離陸
land 着陸 
fly up with distance 上昇(数字は距離) 
20~500cm
fly down with distance 下降(数字は距離) 
20~500cm
fly left with distance 左移動(数字は距離) 
20~500cm
fly right with distance 右移動(数字は距離) 
20~500cm
fly forward with distance 前進(数字は距離)
20~500cm 
fly back with distance 後進(数字は距離) 
20~500cm
rotate CW with angle 右回転(数字は角度) 
1°~3600°
rotate CCW with angle 左回転(数字は角度) 
1°~3600°
flip with duration 8方向フリップ(F,B,R,Lで方向指定) 
set speed  

※上昇、下降、左移動、右移動、前進、後進は、20~500cmの範囲内で指定します。
※右回転、左回転は、1°~3600°の範囲内で指定します。

▼サンプル

はじめに、「スクリプト」の中の「スペースキーが押されたとき」をドラッグ&ドロップで右側のウィンドウに配置します。

次にむらさき色の「ブロック」をドラッグ&ドロップで「スペースキーが押されたとき」の底部のくっつけます。

  • 離陸(take off)
  • 50cm上昇(fly up with distance)
  • 50cm下降(fly up with distance)
  • 着陸(take off)

プログラムが完成したら、上部メニューの「ファイル」 > 「保存」または「名前をつけて保存」で内容を保存します。

 

ステップ2:TelloとパソコンをWi-Fi接続

  1. Telloの電源をONにします。
  2. Mac画面右上のWi-Fi設定から「TELLO-◯◯」を選択します。

    ※TelloにWi-Fi接続している間は、パソコンのインターネット接続ができなくなります。

ステップ3:ドローンプログラムを実行

イベントで設定したボタンをクリックすると自動飛行が開始されます。

Tello Scratch 開発元の英語マニュアル

https://www.ryzerobotics.com/jp/tello/downloads

Telloを開発したRyze Tech社のウェブサイトからScratchのプログラミング飛行にPDFマニュアル(英語)をダウンロードできます。

Tello Scratch README

  1. Visit https://scratch.mit.edu/download and follow the instructions to install the Scratch 2.0 Offline Editor.
  2. Download and install node.js from https://nodejs.org/en/.
  3. Download Tello.js and Tello.s2e from https://dl-cdn.ryzerobotics.com/downloads/tello/20180222/Scratch.zip, open the terminal, go to the file directory where you saved the previous files,and type “node Tello.js”
  4. Open Scratch 2.0, hold the “Shift” key, click the “File” menu, click “Import Experimental HTTP Extension,” and select “Tello.s2e” file in the file directory.
  5. The Tello interface will be shown in Scratch under “More Blocks.”

出典:Tello Scratch README 0320.pdf

内容を翻訳すると次のとおりです。

  1. Scratchのウェブサイトで「Scratchオフラインエディタ」をダウンロードしてインストール
  2. https://nodejs.org/ja/へアクセスし、「node.js」をダウンロードしてインストール。
  3. 「Tello.js」と「Tello.s2e」をダウンロード
  4. Scratchのソフトを立ち上げたら、Shift”キーを押しながら 「ファイルメニューをクリック」し、一番下に表示される「実験的なHTTP拡張を読み込み(import experimental HTTP extension)」を選択し、 “Tello.s2e”ファイルを開く
  5. Telloインターフェースはスクラッチの「その他(More Blocks)」に表示される

DJIドローン 製品ラインナップ

▼一般向けドローンシリーズ

DJI ドローン Tello Tello(テロー)シリーズ
子供でも簡単に飛ばせるDJI小型最小ドローン 
航空法規制対象外の200g未満
12,800円〜
DJI公式ストア
詳しく
SPARK(スパーク)シリーズ
手のひらサイズの小型ドローンシリーズ
54800円〜
DJI公式ストア
Mavic (マヴィック)シリーズ
小型ながら本格的なドローンシリーズ
104,000円〜
DJI公式ストア
DJI ドローン Phantom 4 Pro V2.0 PHANTOM(ファントム)シリーズ
DJIの代表的なドローンシリーズ
204,000円〜
DJI公式ストア

▼プロ向けドローンシリーズ

DJI ドローン INSPIRE シリーズ Inspire 2 INSPIRE(インスパイア)シリーズ
プロ向けの空撮用ドローンシリーズ
DJI公式ストア
389,000円〜