UMEHOSHI ITA TOP PAGE

[Raspberry Pi 3 Model A+]に接続した[UMEHOSHI ITA]基板をアセンブラ言語で「 Lチカ 」する

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+]とモバイルバッテリーを接続して、電源を供給しています。

[UMEHOSHI ITA]へ転送する「 Lチカ 」のアセンブリコードからUME専用Hexコマンド文字列を得る

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のレジスタは、それぞれのメモリ上のアドレスは、0xbf8861280xbf886124です。
よって、これらレジスタにLEDに繋がるRB15のビットを表現するx8000を代入すれば、点灯や消灯ができます。

(UMEHOSHI ITA基板で使っている制御チップのPIC32MX270F256B用アセンブリ言語に必要な情報の概要です。)


  上記で編集したアセンブリソースを、左のボタンで「アッセンブル」できます。
番地から実行するUME専用Hexコマンドを、 最後に追加埋め込みする場合にチェックする==>

上記で生成した[UME専用Hexコマンド]のテキストを コピー(CTRL+A CTRL+C)してUMEHOSHI ITAへ転送して動かすことができます。
(このようなUME専用Hexコマンド文字列は、「umehoshiEdit」ツールで、C言語ソースからビルドして得ることも可能です。)

【1】上記で生成したUME専用Hexコマンドから転送する「command.txt」ファイルを作る。

先頭で示した写真のように、 [Raspberry Pi 3 Model A+]と[UMEHOSHI ITA]とモバイルバッテリーを接続して、電源を供給しています。
(接続直後は、OSが起動るまでの時間(約30秒程度)待つ必要があります。)
SSHで、Raspberry Piに「ssh suzuki@raspberrypi.local」の入力でログオンします。

以下の作業は、[suzuki]のユーザ名でのwindowsのコマンドプロンプトでログオン語の操作例で、[prjLT]のディレクトリを作って移動しています。
([prjLT]を作業ディレクトリとして、そこで今後の転送までの作業するため、その準備です。)
suzuki@raspberrypi:~ $ mkdir ~/prjLT
suzuki@raspberrypi:~ $ cd ~/prjLT
suzuki@raspberrypi:~/prjLT $ nano command.txt
上記の最後で、nanoと言うエディタを「nano command.txt」で起動し、送信ファイル「command.txt」の編集状態にしています。

ページ先頭の「アッセンブル」ボタンのクリックで得られた[UME専用Hexコマンド]のテキストを コピー(CTRL+A CTRL+C)して、貼り付け(CTRL+V)たイメージです。
nanoと言うエディタの保存操作の(CTRL+O)と、終了操作(CTRL+X)してプロンプトに戻ります。
以上で、カレントディレクトリの[prjLT]に、送信する「command.txt」が出来ているはずです。

【2】「command.txt」ファイルを[UMEHOSHI ITA]へ送信する準備(pythonプログラムのソースを作るなど)

ます、[Raspberry Pi 3 Model A+]において、USBがどのように使えるかを確かめます。次のように確かめました。
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」と同じ位置に作ります。)
一度作れば、次回は使うだけで、作る必要はありません。上記ソース部で、CTRL+A CTRL+C)操作で、コピー可能
nanoエディタ内では、開始位置の指定(Ctrl + 6)の後、範囲選択: 矢印キーで移動し、
コピーは (Alt + 6) / 切り取りは (Ctrl + k) / 貼り付けは (Ctrl + u)などのショートカットキー操作が可能

【3】 [UMEHOSHI ITA]基板へ[command.txt」を転送して実行させる。

上記で作った「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]を乗せたモータ付き台車を遠隔操作する作品の作成中ページ