Windows PCとUSBで接続した[UMEHOSHI ITA]をアセンブラ言語で「 Lチカ 」する解説は、このページを参考にしてください。
この参考ページのWindows PCを[Raspberry Pi 3 Model A+]に置き換えた内容が、以下のこのページです。
それは、Raspberry Piの中に置いた「 Lチカ 」の命令ファイルの「command.txt」を、Raspberry Piからpythonのプログラムで[UMEHOSHI ITA]に転送・実行させる方法です。
この操作は、[Raspberry Pi]をSSHで遠隔操作することで実現します。
(VNCを使って[Raspberry Pi]を操作する方法もあるのですが、遅いため操作性が悪いのでSSHで操作する方法を紹介します。)
なお、使用する[Raspberry Pi 3 Model A+]のインストールは、このページの内容でインストール済みであることを前提に説明しています。
[UMEHOSHI ITA]のプログラミングは、D1のLEDの点滅を行う無限ループで、このページで解説したコードです。
このコードは後述の編集部のアセンブルでUME専用Hexコマンド文字列を得て、それを送信して動作します。
写真の赤のUSBケーブルが、[Raspberry Pi 3 Model A+]と[UMEHOSHI ITA]を接続して、電源供給と通信を行います。
写真の白のUSBケーブルが、[Raspberry Pi 3 Model A+]とモバイルバッテリーを接続して、電源を供給しています。
D1のLEDは、使用制御チップのRB15の出力端子で、0にすると消えて、1にすればLEDに電流が流れて点灯します。
(D1は、PIC32MX270F256BのRB15のPortB 15bitに繋がっています。)
UMEHOSHI ITAで使っている制御チップは、PIC32MX270F256Bのメモリには特殊機能レジスタ(SFRs)が
割り当てられて、
例えばPORTBSETが、PORTBの指定ビットを1にすることでこの対応端子を1にする機能のレジスタです。
また、PORTBCLR が、PORTBの指定ビットを1にすることで対応端子を0にする機能のレジスタです。
そして
ORTBSETとPORTBCLRのレジスタは、それぞれのメモリ上のアドレスは、0xbf886128と0xbf886124です。
よって、これらレジスタにLEDに繋がるRB15のビットを表現するx8000を代入すれば、点灯や消灯ができます。
suzuki@raspberrypi:~ $ mkdir ~/prjLT suzuki@raspberrypi:~ $ cd ~/prjLT suzuki@raspberrypi:~/prjLT $ nano command.txt上記の最後で、nanoと言うエディタを「nano command.txt」で起動し、送信ファイル「command.txt」の編集状態にしています。
suzuki@raspberrypi:~/prjLT $ ls -l /dev total 0 crw-r--r-- 1 root root 10, 235 Apr 11 13:49 autofs ・・省略・・・ crw-rw---- 1 root dialout 166, 0 Apr 11 13:49 ttyACM0 crw-rw---- 1 root dialout 204, 64 Apr 11 13:49 ttyAMA0 ・・省略・・・ crw-rw-rw- 1 root root 1, 5 Apr 11 13:49 zero suzuki@raspberrypi:~/prjLT $
ttyACM0が接続中のデバイスと予想されます。
このデバイス名をpythonのプログラムで指定します。
pythonではserialモジュールを使うので、
使えない場合は『pip install pyserial』のコマンド操作でインストールしてください。
次コードで動作が可能か確認できます。右下は、会話モードで左下コードを貼り付けて確認している実行例です。
import serial usb = serial.Serial(port = '/dev/ttyACM0', baudrate = 115200) usb.write("G1080004000006C\r\n".encode('utf-8')) print("USB受信●",usb.readline().decode('utf-8')) print("USB受信●",usb.readline().decode('utf-8')) ''' 上記のプログラムは、usbにUSBの送受信オブyジェクトを用意し、 それで、"G1080004000006C\r\n"をUMEHOSHI ITAへ送信しています。 これは、0x80004000番地からのメモリ情報を16byte要求命令です。 次に、1行受信とその表示を、2回行っています。 最初の1行表示は、送信に対するエコー受信文字列の表示で、 次の1行が、16byteのメモリ内容の応答文字列です。 ''' |
suzuki@raspberrypi:~ $ python Python 3.9.2 (default, Mar 12 2021, 04:06:34) [GCC 10.2.1 20210110] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import serial >>> usb = serial.Serial(port = '/dev/ttyACM0', baudrate = 115200, timeout = 10) >>> usb.write("G1080004000006C\r\n".encode('utf-8')) 17 >>> print("USB受信●",usb.readline().decode('utf-8')) USB受信● G1080004000006C >>> print("USB受信●",usb.readline().decode('utf-8')) USB受信● :108000400000E0F7009D84EA009D8920C901C758000084 >>> quit() suzuki@raspberrypi:~ $ |
上記の確認ができれば、USBの送受信が正しくできるということです。(1行ごとにコピー貼り付けで確認してください)
このソースを変更して、カレントディレクトリ内の「'command.txt'」のファイル内容を[UMEHOSHI ITA]基板 送り、
その応答文字列を表示するプログラムが下記の内容です。
この内容のファイルを『instruct.py』の名前で作ります。
上記で作った「instruct.py」と[command.txt」が「raspberry Pi」の『~/prjLT』のディレクトに在るとして、
「ssh suzuki@raspberrypi.local」でログオンして遠隔操作します。
以下では、この作業位置(カレントディレクトリ)が、『~/prjLT』である場合の例で説明しています。
suzuki@raspberrypi:~/prjLT $ python instruct.py S10800050000088BF023C00800324286143AC00000000 C2チェックサム: 0 USB受信● b'S10800050000088BF023C00800324286143AC00000000C2\r\n' USB受信● b'SET:80005000\r\n' S1080005010000E14000C3F00043C0000000088BF023C AEチェックサム: 0 USB受信● b'S1080005010000E14000C3F00043C0000000088BF023CAE\r\n' USB受信● b'SET:80005010\r\n' S10800050200000800324246143AC0E14000C3F00043C B4チェックサム: 0 USB受信● b'S10800050200000800324246143AC0E14000C3F00043CB4\r\n' USB受信● b'SET:80005020\r\n' S1080005030000014000800000000F8FFBD270400BFAF 83チェックサム: 0 USB受信● b'S1080005030000014000800000000F8FFBD270400BFAF83\r\n' USB受信● b'SET:80005030\r\n' S10800050400021B88000FFFFF726FEFFE01600000000 46チェックサム: 0 USB受信● b'S10800050400021B88000FFFFF726FEFFE0160000000046\r\n' USB受信● b'SET:80005040\r\n' S0C80005050000800BD270800E00300000000 71チェックサム: 0 USB受信● b'S0C80005050000800BD270800E0030000000071\r\n' USB受信● b'SET:80005050\r\n' R008000500000 61チェックサム: 0 実行スタートの Enter >> USB受信● b'R00800050000061' 終了確認の Enter >>> suzuki@raspberrypi:~/prjLT $
[command.txt」の中に"R008000500000"のような実行コマンドが存在すると、実行スタートの Enter >>の
プロンプトが出て、一時停止します。
上記例では、そこでENTERキーを入力することで、"R00800050000061"が送られ、
UMEHOSHI ITA基板で「0x80005000」番地から実行により、「 Lチカ 」が始まります。
上記の手法は、[command.txt」の内容の命令のアドレス範囲がRAMである場合でも、リセットによって初期化されるものではありません。
電源供給を続けていれば、リセットしても、実行スタート用のコマンド文字列(上記の例では"R00800050000061")を送ることで、プログラムを起動できます。
このページで示した[Raspberry Pi]と[UMEHOSHI ITA]を乗せたモータ付き台車を遠隔操作する作品の作成中ページ