UMEHOSHI ITA TOP PAGE    COMPUTER SHIEN LAB

[UMEHOSHI ITA]の制御で使っているIC「PIC32MX270F256B-I/SO」のフラッシュメモリには、テスト用プログラムが書き込まれいています。
これを利用したユーザー用のプログラムを「ウメ・エディットプログラム」と呼ぶことにします。
「ウメ・エディットプログラム」の開発では「umehoshiEditツール」が必要で、 その取得や最初の操作情報は、こちらを参照してください。

Raspberry PI 3B とUSB接続してpythonで制御する例
(Raspberry PIとPCはSSHでWifi経由で遠隔操作)

以下では、[Raspberry PI]と[UMEHOSHI ITA]をUSBで接続して、 [Raspberry PI]側のpythonプログラムで[UMEHOSHI ITA]動かします。
なお、[Raspberry PI]をWifiのアクセスポイントにしてSSHで操作します。
(結果的に[Raspberry PI]を介して、[UMEHOSHI ITA]を遠隔操作できるようになります。)

なお、ここで使った[Raspberry PI 3B]のアクセスポイントやDHCP関連のインストール例は、 こちらに示します。




クリックで
←画像が
変わります
[UMEHOSHI ITA]に重なるように[Raspberry PI 3B]が配置されています。
モバイルバッテリーで[Raspberry PI 3B]へ電源(〜1.13A程度)を供給しています。
そして、[Raspberry PI 3B]と[UMEHOSHI ITA]をUSBで接続しています。この接続は、 通信を兼ねて[UMEHOSHI ITA]に電源を供給しています。
モータ関連の供給は、車体底にある単三電池3個の電池ボックスから[UMEHOSHI ITA]にDC-JACKで供給しています。

[Raspberry PI 3B]をWifiのアクセスポイントにし、同時にSSHのサーバを動かします。
SSHを使って[Raspberry PI ]と通信して、このコンソール画面で入力した文字列を送信し、 その応答を受信したPCで文字列を表示する例を示しています。

次に「umehoshiEditツール」のビルドで得られるHEXファイルを追加・編集して、 [UMEHOSHI ITA]に転送・実行を指示するファイルを作ります。
そして、そのファイル転送するPythonプログラム例を示しています。

次に、モータ制御のプログラミング例で遠隔操作をしている例を示します。

PCのSSHコンソールで入力した文字列を[UMEHOSHI ITA]に送信して制御する。

windowsのpythonでキー操作を別ページで紹介していますが、 それを[Raspberry PI]で行った場合の例のプログラムです。
下記はpython実行は、「pip install pyserial」によるインストールが必要です。
(参考: https://pyserial.readthedocs.io/en/latest/pyserial.html

import serial
import threading
from time import sleep

serial = serial.Serial(port = '/dev/ttyACM0', baudrate = 115200)
loop_flag=True

def read_loop():
    global loop_flag
    while loop_flag:
       b=serial.readline() # binary入力
       print(b)
       #print(b.decode('utf-8'))
       if(b == b'end\r\n'):
           print("push enter key")
           loop_flag = False
           return

# スレッドに read_loop 関数を渡す
t_id = threading.Thread(target=read_loop)

# スレッドスタート
s = input("") # 例「G1080004000006C」
t_id.start()
while loop_flag:
    serial.write(s.encode('utf-8')) # byteに変換して出力
    serial.write(b'\r\n')
    s = input("")

serial.close()

デバイスごとにデバイス用ファイル名ができますが、 接続順序などよって名前も変わるケースもあるようです。 上記のUSBのデバイス名の'/dev/ttyACM0'は USBを接続して次の操作で現れた表示からより使っています。
下記は、その[Raspberry PI]とPCをWifiで接続して、SSHで操作している画面イメージです。 (「py」のフォルダを作って、そこをカレントディレクトリにして作業している例です。)


pi@raspberrypi:~/py $ ls -l /dev
・・省略・・・
crw-rw----  1 root dialout 166,   0 Mar 14 09:38 ttyACM0
crw-rw----  1 root dialout 204,  64 Mar 14 09:38 ttyAMA0
・・省略・・・
pi@raspberrypi:~ $

プログラムの実行例を、下記で示します。
キー入力してEnterした文字列が、 [UMEHOSHI ITA]に転送されます。
[UMEHOSHI ITA]のデフォルト状態で、エコーモードになっており、入力した文字列がそのまま返信されます。
そして、命令として意味がある文字列であれば、それを実行して、命令に対する応答文字列が返信されます。
以下では、[G1080004000006C]のキー入力で、 「80004000番地」から16byteのメモリ領域を列挙させる命令を実行させています。
その後[end]を入力して、プログラムを終わらせています。

pi@raspberrypi:~/py $ python3 sendtest.py
G1080004000006C
b'G1080004000006C\r\n'
b':108000400000F0B2009D34A6009D00000000C7580000D0\r\n'
end
b'end\r\n'
push enter key

pi@raspberrypi:~/py $


「umehoshiEditツール」で作った「UME専用Hexファイル」をPythonプログラムで転送・実行する

windowsでpythonプログラムで「UME専用Hexファイル」を、[UMEHOSHI ITA]に送信して実行するプログラムを 別ページで紹介していますが、 それを応用して[Raspberry PI]で行った場合の例のプログラムです。
まず、[Raspberry PI]で実行させる「UME専用Hexファイル」を作成します。
その内容は、実行させるとD1のLEDを点灯/消灯を逆転させ、消灯時にモータをONにするプログラムです。
また、モータNO/OFFに応じて対応する文字列(start/stop)を出力するプログラム例で、次のプログラムです。
これは、window側の「umehoshiEditツール」でプログラムしてします。

#include <xc.h>
#include <stdlib.h>
#include "common.h"

__attribute__((address( 0x80005000 ))) void test (void);
void test()
{
	_RB15 = ! _RB15;// 出力を反転  ★

	if( _RB15 == 0 ){
		// CN7の[1-2]に対応するRB14を0、[3-4]に対応するRB13を1にする。
		// CN6の[1-2]に対応するRB2を0、[3-4]に対応するRB3を1にする。
		PORTBCLR = 0b0100000000000100;// RB14,RB2を0
		PORTBSET = 0b0010000000001000;// RB13,RB3を1
		_send_string("start\r\n");
	} else {
		PORTBCLR = 0b0010000000001000;// RB13,RB3を0
		_send_string("stop\r\n");
	}
}

これをビルドしてえられたコードで、[Raspberry PI]側でファイルを作ります。
以下は、[Raspberry PI]の「py」フォルダを作った所をカレントディレクトリにして作業している例です。

pi@raspberrypi:~/py $ nano command.txt

ご使用するエディタは何でもよいですが、以下はSSHで「Tera Term」で遠隔操作をしている画面で、 nanoを使って編集し、上記コードをビルドして得られた「UME専用Hexファイル」よりコピー&貼り付けして、 最後に、「R00800050000061」の文字列を追加で貼り付けたイメージです。
これは[0x80005000]の絶対番地の関数を命令(「umehoshiEditツール」の[Excute]ボタンで得られる文字列です。


つまりこのファイルを、[UMEHOSHI ITA]に送信すると、プログラムを配置して実行できることになります。

次にこの「UME専用Hexファイル」の「command.txt」を転送するpythonのプログラムファイルを、[Raspberry PI]が側で作成します。

pi@raspberrypi:~/py $ nano instruct.py
次の内容です。(これをこの画面からコピーして、nano編集画面に貼り付け操作すると簡単に作れます)
import sys
import serial
import threading
import numpy as np
from time import sleep

serial = serial.Serial(port ='/dev/ttyACM0' , baudrate = 115200,timeout = 5)

def check_sum(s):
    ck = 0
    n = len(s)
    if n == 0: return
    for i in range(n-2):
        ck += ord(s[i])
        #print(ck)
        print(s[i] , end ="")
    print(' ',s[-2:] , end ="")
    ck += int(s[-2:] , 16)
    ck &= 0x0f
    print("チェックサム:", ck )
    if ck != 0 :
        print("ファイルフォーマット・エラー")
        exit()

def file_send():
    fr=open('command.txt') # このファイル内容が転送対象です。
    while True:
        s = fr.readline()
        if s == "" :
            break
        s = s.strip()#前後空白を除く
        check_sum(s) # ファイルからの1行を確認し、表示
        if s.startswith('R'):
            input("実行スタートの Enter >>")
        serial.write(s.encode('utf-8')) # byteに変換して出力
        serial.write(b'\r\n') # [UMEHOSHI ITA]USBへ送信
        sleep(0.1)
        #serial.flush()
    fr.close()

# ファイル入力、USB送信 スレッドに file_send 関数を渡す
t_id = threading.Thread(target=file_send)
t_id.start()# ファイル入力、USB送信 スレッドスタート

usb_read_loop = True
while usb_read_loop:
    b=serial.readline() # binary入力
    if(b == b''):
        usb_read_loop = False
        break
    s = b.decode('utf-8')
    print("USB受信●",b)
    #print("USB受信●",s)

input("終了確認の Enter >>>")
serial.close()
以上で作成した「instruct.py」のファイルで、「command.txt」のUME専用Hexファイルを転送して実行している操作画面を以下に示します。
[Raspberry PI]と[UMEHOSHI ITA]をUSBで接続して、その時のUSBデバイス名が「'/dev/ttyACM0'」であることを確認してから実行しています。
もし、デバイス名が「'/dev/ttyACM0'」でなければ、「instruct.py」のプログラムのデバイス名を変更してください。
pi@raspberrypi:~/py $ ls -l /dev/serial?
lrwxrwxrwx 1 root root 7 Jun 14 17:17 /dev/serial1 -> ttyACM0
pi@raspberrypi:~/py $
pi@raspberrypi:~/py $ python3 instruct.py
S108000500000E8FFBD271400BFAF1000BEAF21F0A003  17チェックサム: 0
USB受信● b'S108000500000E8FFBD271400BFAF1000BEAF21F0A00317\r\n'
USB受信● b'SET:80005000\r\n'
S10800050100088BF023C2061428C008042300100422C  B7チェックサム: 0
USB受信● b'S10800050100088BF023C2061428C008042300100422CB7\r\n'
USB受信● b'SET:80005010\r\n'
S108000502000FF00443088BF033C20616294C47B827C  63チェックサム: 0
USB受信● b'S108000502000FF00443088BF033C20616294C47B827C63\r\n'
USB受信● b'SET:80005020\r\n'
S108000503000206162A488BF023C2061428C00804230  ABチェックサム: 0
USB受信● b'S108000503000206162A488BF023C2061428C00804230AB\r\n'
USB受信● b'SET:80005030\r\n'
S108000504000100040140000000088BF023C04400324  F0チェックサム: 0
USB受信● b'S108000504000100040140000000088BF023C04400324F0\r\n'
USB受信● b'SET:80005040\r\n'
S108000505000246143AC88BF023C08200324286143AC  83チェックサム: 0
USB受信● b'S108000505000246143AC88BF023C08200324286143AC83\r\n'
USB受信● b'SET:80005050\r\n'
S10800050600000A0023CA44142340000428C0080033C  C7チェックサム: 0
USB受信● b'S10800050600000A0023CA44142340000428C0080033CC7\r\n'
USB受信● b'SET:80005060\r\n'
S108000507000C450642409F84000000000002B140008  E0チェックサム: 0
USB受信● b'S108000507000C450642409F84000000000002B140008E0\r\n'
USB受信● b'SET:80005070\r\n'
S1080005080000000000088BF023C08200324246143AC  BCチェックサム: 0
USB受信● b'S1080005080000000000088BF023C08200324246143ACBC\r\n'
USB受信● b'SET:80005080\r\n'
S10800050900000A0023CA44142340000428C0080033C  C4チェックサム: 0
USB受信● b'S10800050900000A0023CA44142340000428C0080033CC4\r\n'
USB受信● b'SET:80005090\r\n'
S0C800050A000CC50642409F8400000000000  56チェックサム: 0
USB受信● b'S0C800050A000CC50642409F840000000000056\r\n'
USB受信● b'SET:800050A0\r\n'
S10800050AC0021E8C0031400BF8F1000BE8F1800BD27  3Cチェックサム: 0
USB受信● b'S10800050AC0021E8C0031400BF8F1000BE8F1800BD273C\r\n'
USB受信● b'SET:800050AC\r\n'
S08800050BC000800E00300000000  13チェックサム: 0
USB受信● b'S08800050BC000800E0030000000013\r\n'
USB受信● b'SET:800050BC\r\n'
S08800050C40073746172740D0A00  ECチェックサム: 0
USB受信● b'S08800050C40073746172740D0A00EC\r\n'
USB受信● b'SET:800050C4\r\n'
S08800050CC0073746F700D0A0000  D5チェックサム: 0
USB受信● b'S08800050CC0073746F700D0A0000D5\r\n'
USB受信● b'SET:800050CC\r\n'
S10800050D40000000000222222222222222222222222  17チェックサム: 0
USB受信● b'S10800050D4000000000022222222222222222222222217\r\n'
USB受信● b'SET:800050D4\r\n'
R008000500000  61チェックサム: 0
実行スタートの Enter >> 
USB受信● b'R00800050000061\r\n'
USB受信● b'START:80005000\r\n'
USB受信● b'start\r\n'
USB受信● b'\r\n'
終了確認の Enter >>> 
pi@raspberrypi:~/py $ python3 instruct.py
S108000500000E8FFBD271400BFAF1000BEAF21F0A003  17チェックサム: 0
USB受信● b'S108000500000E8FFBD271400BFAF1000BEAF21F0A00317\r\n'
USB受信● b'SET:80005000\r\n'
S10800050100088BF023C2061428C008042300100422C  B7チェックサム: 0
USB受信● b'S10800050100088BF023C2061428C008042300100422CB7\r\n'
USB受信● b'SET:80005010\r\n'
S108000502000FF00443088BF033C20616294C47B827C  63チェックサム: 0
USB受信● b'S108000502000FF00443088BF033C20616294C47B827C63\r\n'
USB受信● b'SET:80005020\r\n'
S108000503000206162A488BF023C2061428C00804230  ABチェックサム: 0
USB受信● b'S108000503000206162A488BF023C2061428C00804230AB\r\n'
USB受信● b'SET:80005030\r\n'
S108000504000100040140000000088BF023C04400324  F0チェックサム: 0
USB受信● b'S108000504000100040140000000088BF023C04400324F0\r\n'
USB受信● b'SET:80005040\r\n'
S108000505000246143AC88BF023C08200324286143AC  83チェックサム: 0
USB受信● b'S108000505000246143AC88BF023C08200324286143AC83\r\n'
USB受信● b'SET:80005050\r\n'
S10800050600000A0023CA44142340000428C0080033C  C7チェックサム: 0
USB受信● b'S10800050600000A0023CA44142340000428C0080033CC7\r\n'
USB受信● b'SET:80005060\r\n'
S108000507000C450642409F84000000000002B140008  E0チェックサム: 0
USB受信● b'S108000507000C450642409F84000000000002B140008E0\r\n'
USB受信● b'SET:80005070\r\n'
S1080005080000000000088BF023C08200324246143AC  BCチェックサム: 0
USB受信● b'S1080005080000000000088BF023C08200324246143ACBC\r\n'
USB受信● b'SET:80005080\r\n'
S10800050900000A0023CA44142340000428C0080033C  C4チェックサム: 0
USB受信● b'S10800050900000A0023CA44142340000428C0080033CC4\r\n'
USB受信● b'SET:80005090\r\n'
S0C800050A000CC50642409F8400000000000  56チェックサム: 0
USB受信● b'S0C800050A000CC50642409F840000000000056\r\n'
USB受信● b'SET:800050A0\r\n'
S10800050AC0021E8C0031400BF8F1000BE8F1800BD27  3Cチェックサム: 0
USB受信● b'S10800050AC0021E8C0031400BF8F1000BE8F1800BD273C\r\n'
USB受信● b'SET:800050AC\r\n'
S08800050BC000800E00300000000  13チェックサム: 0
USB受信● b'S08800050BC000800E0030000000013\r\n'
USB受信● b'SET:800050BC\r\n'
S08800050C40073746172740D0A00  ECチェックサム: 0
USB受信● b'S08800050C40073746172740D0A00EC\r\n'
USB受信● b'SET:800050C4\r\n'
S08800050CC0073746F700D0A0000  D5チェックサム: 0
USB受信● b'S08800050CC0073746F700D0A0000D5\r\n'
USB受信● b'SET:800050CC\r\n'
S10800050D40000000000222222222222222222222222  17チェックサム: 0
USB受信● b'S10800050D4000000000022222222222222222222222217\r\n'
USB受信● b'SET:800050D4\r\n'
R008000500000  61チェックサム: 0
実行スタートの Enter >> 
USB受信● b'R00800050000061\r\n'
USB受信● b'START:80005000\r\n'
USB受信● b'stop\r\n'
USB受信● b'\r\n'
終了確認の Enter >>> 
pi@raspberrypi:~/py $

上記   の箇所がキー入力箇所で、python3 instruct.pyを2回実行しています。
最初の実行で、LEDが消灯してモータが回ります。
次の実行で、LEDが点灯してモータが止まりります。実行させるごとで、交互にstartとstopが行われます。