UMEHOSHI ITA TOP PAGE COMPUTER SHIEN LAB
[UMEHOSHI ITA]の制御で使っているIC「PIC32MX270F256B-I/SO」のフラッシュメモリには、テスト用プログラムが書き込まれいています。
これを利用したユーザー用のプログラムを「ウメ・エディットプログラム」と呼ぶことにします。
「ウメ・エディットプログラム」の開発では「umehoshiEditツール」が必要で、
その取得や最初の操作情報は、こちらを参照してください。
以下では、[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プログラム例を示しています。
次に、モータ制御のプログラミング例で遠隔操作をしている例を示します。
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 $
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ファイルを転送して実行している操作画面を以下に示します。
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が行われます。