LoginSignup
1
2

More than 3 years have passed since last update.

[ev3dev×Python] SSH Control (キーボードでの遠隔操作)

Last updated at Posted at 2020-06-24

この記事はPythonでev3を操作してみたい人のための記事です。
今回はキーボードを使った遠隔操作をしていきたいと思います。
具体的にはwキーを押したら前に進むというような感じです。

目次

0 . 用意するもの
1 . SSH Control
2 . プログラムの実行
3 . 用語説明

0.用意するもの

◯ ev3(タンク) + Mモータ
◯ パソコン(VSCode)
◯ bluetooth
◯ microSD
資料(これをみながら進めていくのがオススメです。)
◯ 参考サイト : SSH Control

1.SSH Control

○押されたキーを取得してSSHで遠隔操作するプログラム

sshcontrol.py
#!/usr/bin/env python3

#必要なものだけをimportする
import termios, tty, sys
from ev3dev2.motor import OUTPUT_A,OUTPUT_B,OUTPUT_C,MoveTank,MediumMotor

#インスタンスの生成
tank_drive = MoveTank(OUTPUT_A,OUTPUT_B)
m_c = MediumMotor(OUTPUT_C)

#押されたキーを取得する関数を定義する
def getch():
    #標準入力のファイルディスクリプタを取得
    fd = sys.stdin.fileno()
    #ファイルディスクリプタの端末属性を取得する
    old_settings = termios.tcgetattr(fd)
    #エンターキーを押さなくてもいいようにする
    tty.setcbreak(fd)
    #キーボードで入力された文字を受け取る
    ch = sys.stdin.read(1)
    #ファイルディスクリプタの端末属性を設定する
    termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
    #ch(character = この場合は押されたキー)を返す
    return ch

#==============================================
#Mモータを動かす関数を定義する
def fire():
   m_c.on(80)
#==============================================
#タンクが前進する関数を定義する
def forward():
   tank_drive.on(80,80)
#==============================================
#タンクが後進する関数を定義する
def back():
   tank_drive.on(-80,-80)
#==============================================
#タンクが左折する関数を定義する
def left():
   tank_drive.on(50,80)
#==============================================
#タンクが右折する関数を定義する
def right():
   tank_drive.on(80,50)
#==============================================
#全てのモータが停止する関数を定義する
def stop():
   tank_drive.stop()
   m_c.stop()
#==============================================

#無限ループ
while True:
   #getch()が返す値をkに代入する
   k = getch()
   #k(押されたキー)を表示する
   print(k)

   #押されたキーに対応する動きを決める
   if k == 'w':
      forward()
   if k == 's':
      back()
   if k == 'd':
      right()
   if k == 'a':
      left()
   if k == 'f':
      fire()
   #もし押されたキーがスペースキーなら
   if k == ' ':
      stop()
   if k == 'q':
      exit()

2.プログラムの実行

1.緑のランプが点灯しているev3devを右クリックして、Open SSH Terminal をおす。

2.ssh robot@ev3dev.local と入力する。

3.パスワードを聞かれるので、makerと入力する。

4.pwdと入力してカレントディレクトリを確認しよう。(今現在の居場所)

5.cd ディレクトリ というようにして、自分のプログラムが存在するディレクトリまで移動しよう!(ディレクトリはフォルダ)

6.移動できたらpython3 プログラムの名前.py と入力してエンターを押す。

7.インテリジェントブロックの画面などは変化しないが実行できる。

3.用語解説

今回はたくさんわからない単語が出ていたと思うので、簡単に解説します。

SSH :
ネットワークを経由して他のコンピュータ(主にサーバ)に接続し、遠隔操作するための仕組み。
通信の際、扱われる情報は暗号化される。

termios モジュール :
低水準端末制御インターフェース。

端末 :
情報の入出力を受け持つ部分。
主となるコンピュータに対して入出力や通信を行う機器。

インターフェース
異なる種類のものを結びつける共用部分。

tty モジュール :
一般的な端末制御操作のための便利な関数群。

tty :
任意のテキスト端末を意味する略称。
ウィンドウシステムでの擬似端末デバイスを介した端末エミュレータなどを指す。

テキスト端末 :
テキスト(文字列)の入力と表示を行う入出力機器

端末エミュレータ :
端末として動くソフトのこと。

関数群 :
関数の集まり

ファイルディスクリプタ :
ファイル記述子、fd。
ファイル(への通り道)に割り振られる番号で、ファイルを識別するための目印

ファイル :
バイト列としてデータを読み込んだり書き込んだりできるもの

バイト列 :
バイト列とは、文字や数値といった特定の形式や意味が与えられていない、任意のビットパターンからなる1バイトのデータが並んだデータ集合のこと。

ビットパターン :
コンピュータが扱うことのできる最小単位である「0」と「1」のビットの組み合わせのこと

バイト :
コンピューターで情報量を表す単位で「B」と略す。 1バイトは、0か1かを表すビットという単位が8つ並んで構成される。メモリーやディスクの容量、プログラムの最小命令コードなどに使われる。

sys モジュール :
Pythonのインタプリタや実行環境に関する情報を扱うためのモジュール

モジュール :
(Python)コードをまとめたファイルのこと。

Python標準ライブラリ :
モジュールを集めたもの。
公式
標準ライブラリチュートリアル

インタプリタ :
ソースコードを1行ずつ読み込んではコンピュータが実行出来る命令に変換しながら動くソフトウェア。
プログラムを1行ずつ処理するので、処理速度は速くない。

stdin :
キーボードからの標準入力。standard input.
キーボードで入力された文字を受け取ることができる。
fd = 0

fileno :
= file-number = file.No 0,1,2..
ファイルオブジェクトのファイル記述子(fd)を得る関数
整数のファイル記述子を返す
今回は、
ファイルオブジェクト = キーボードで入力された文字

tcgetattr(fd) :
ファイル記述子 fd の端末属性を含むリストを返す。

・tc = terminal computer = 端末コンピュータ
・get = 取得する
・attr = attribute = 属性

setcbreak() :
エンターキーを押さなくて文字入力できるようにする。
逆にこれがないと1文字での入力ができない。

read() :
ファイルの読み出し

termios.tcsetattr(fd, when, attributes) :
ファイル記述子 fd の端末属性を attributes から取り出して設定する。
attributes(=属性) は tcgetattr() が返すようなリスト。
引数 when は属性がいつ変更されるかを決定します:
・TCSANOW は即時変更を行う。
・TCSADRAIN は現在キューされている出力を全て転送した後に変更を行う。
・TCSAFLUSH は現在キューされている出力を全て転送し、全てのキューされている入力を無視した後に変更を行う。

参考記事 :
Pythonでキー入力を検出する(Enter無しで)
標準入力・標準出力ってなに?
Macのターミナルコマンド一覧(基本編)
TERMIOS

最後に

読んで頂きありがとうございました!!

より良い記事にしていきたいので
 ◯こうした方がわかりやすい
 ◯ここがわかりにくい
 ◯ここが間違っている
 ◯ここをもっと説明して欲しい
などの御意見、御指摘のほどよろしくお願い致します。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2