« Google AdSense落選 | トップページ | RaspiとTWELITEの会話の手助け »

2021年2月16日 (火)

なかなか会話できないRaspiとTwelite

Raspberry Pi 4とTWELITEを会話させようとして一日終わってしまった。

Raspberry Pi 4 と TWELITEの接続は至って単純で4本繋ぐだけ。

Raspberry Pi 4 TWELITE
3.3V (pin-1) VCC (pin 28)
GND (pin-6) GND (pin-1)
TXD (pin-8) RX (pin-3)
RXD (pin-10) TX (pin-10)

しかし、これを通信させるのには一苦労した。おまけに理由は分からないけれどTWELITEを一つ殉職させてしまった。

分からなかったのはRaspberry PiのGPIOのUARTに信号を出力する方法。あと、TWELITEのアプリのApp_Uartが送出する信号フォーマット。

まず、Raspberry PiのSerialポート機能を有効化する方法は幾つかの書き込みがあった。それは以下コマンドを実行すること。

$ sudo raspi-config

ここで表示される画面で 5. Interfacing Optionsを選ぶ。
02161
次に P6 Serial を選ぶ。 
02162
ここでは<いいえ>を選ぶ。<はい>を選ぶとLinuxのコンソールアウトプットが怒涛の如くこのシリアルポートに流れてくる。
02163
結果的に以下の組み合わせ(login shellは禁止でSerialをイネーブルにする)に設定する。
 02164

ここからが分からなかった。どのポートにどのボーレートでデータを書き込むのか。
採用したのは以下のファイルの記述。これは上のraspi-configでlogin shellの利用で<はい>を選んだ場合にcmdline.txtに書かれる内容。ここではconsole=serial0, 115200 と書かれている。login shellで<はい>を選ぶと、GPIOのUARTに怒涛の如くコンソール出力が書かれて、それをTWELITEは送り続ける。この様子はMONOSTICKをTeraTermで観察しているとわかる。つまり、serial0を115200でオープンすればよいわけだ。
02165

で、以下のコードをRaspberry Piで動かしてみた

import serial

s = serial.Serial("/dev/serial0", 115200)
bs = '112233445566778899\n\r'
s.write(bs.encode())

結果はビンゴで、MONOSTICK側のTeraTermに以下が出力された。

:0300313132323333343435353636373738383939000043

Byte0はTWELITE DIPのDevice ID
Byte1は不明(親機のMONOSTICKのDevice ID=0だから宛先か?)
一番後ろはチェックサム
その前の2バイトの0000は不明

いずれにせよRaspberry PiのUART出力をTWELITEで送信することが出来た。

なお親機側は以下のコードで文字列化された16進数データをアスキー文字列に変換している。

import serial

s = serial.Serial("COM6", 115200, timeout=1)

try:
  while True:
    line = s.readline()
    line = line.decode('utf-8')
    if len(line):
      print("%s" % line)
      rdata = [line[i:i+2] for i in range(5,len(line)-6,2)]
      for x in rdata:
        n = int(x, 16)
        print(chr(int(n)),end='')
      print('\n')

except KeyboardInterrupt:
  pass

s.close()

明日ははMONOSTICK側からTWELITE経由でRaspberry Piにコマンドを送ろう。

« Google AdSense落選 | トップページ | RaspiとTWELITEの会話の手助け »

ラズパイ日記」カテゴリの記事

TWELITE日記」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« Google AdSense落選 | トップページ | RaspiとTWELITEの会話の手助け »