Septentrio mosaicHATを使ってみる2
前回まで
mosaicHATをGPIOを通してラズパイと通信できるようにしたいが,できない.これについて,再度取り組んでみる.(メモ的な意味合いが強いので,このエントリーは逐次更新していく)
前回はこれ.mosaicHATが死んでいる説は,WindowsからUSBで192.168.3.1を開き,通信を確認できたので,死んではいない.
今回行ったこと
ゼミやら就活関連の締切が終わり,今mustでやらないといけないことはそんなにないので,この隙に進めていきたい.
ラズパイでUSB介して通信
今回は,まず,ラズパイの方でUSBを通した通信ができるかを試してみる.試すと,できた.ドライブのインストールとかは要らなかった.
問題のGPIO
問題のGPIOを介した通信に取り組む.なんかよくわからん情報集めて,行き当たりばったりにやってもしゃあない.犬の道感がエグい.マジで進捗が生まれなくてつらい.
ちゃんと筋道立てて取り組んでみよう.「これをやってみたができなかった」というリストを作っていくだけでも話は変わる.逆にそれをこれまでやっていなかったのヤバイんだけど..
mosaicHATの使い方については,githubがあってそこで解説がなされている.
ひとまず,これの通りに試してみよう.
さて,「GPIOを使って通信する」ことをここでは"Serial Communication"(以降,シリアル接続)と呼んでいる.この言葉の意味もよくわかっていないのが現状なので,あとで調べよう.
さて,シリアル接続の章を読んでみると,「mosaicHATと通信する簡単な方法の一つは,COMポートの一つと説と接続することである.mosaicHATは2つのCOMポートコネクタを備えている.」とある.COMポートってなんぞやって感じ.これもあとで調べよう.
デフォルトのCOM-port settingは
baud rate | 115200 |
---|---|
data bits | 8 |
parity | no |
stop bits | 1 |
flow control | none |
PuTTYってなんやねん
さて,ラズパイとmosaicHATのシリアル接続は,PuTTYで出来るらしい.PuTTYはなんぞや..その言葉が,大枠として何を表しているのかもわからないのは,大変.
調べてみると,どうやらソフトウェアらしい.調べた結果Snapcraftのサービスを通すと簡単そう.これを使ってみる.
なんかエラーが表示されたが,「revisionされないことなどを考慮してインストールするか?するならこれをして」みたいなことが書いてあったので,とりあえずそれをした.無事インストールできたわけだが,なんか思っていたのと違う.ブラウザみたく,アプリケーションとして使えないっぽい.なんてこった.
なんと所望のものを簡単にインストールできる方法が
なんと,これをみると,
sudo apt install putty
で行けた.「俺はアホか」と思うわけですが,この前の段の意味のわからないことをした意味合いだってきっとある.これを繰り返して,習熟していくと信じている.
PuTTYが使えるように!でもダメ
なんとか無事インストールすることができた.こうして進んでいくことがだけが今は幸せである.
ところが,ここでまた悲しい出来事が.githubのページと同じように,対話形式で話を進めることができない.
githubのページを見てみると,「SeptentrioのRxToolsはARMアーキテクチャのラズパイには対応していない」とある.これのせいかもしれない.ひとまずPuTTYは諦めよう.
LED光らせることはできる
githubに記載されている,LEDの点滅動作は簡単にできる.
以下のコードを使う.
import RPi.GPIO as GPIO # Import Raspberry Pi GPIO library
from time import sleep # Import the sleep function from the time module
GPIO.setwarnings(False) # Ignore warning for now
GPIO.setmode(GPIO.BCM) # Use BCM pin numbering
# Set pins 6 &26 to be output pins and set their initial values to low (off)
GPIO.setup(26, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(6, GPIO.OUT, initial=GPIO.LOW)
while True: # Run forever
GPIO.output(26, GPIO.HIGH) # Turn 26 on
GPIO.output(6, GPIO.LOW) # Turn 26 off
sleep(1) # Sleep for 1 second
GPIO.output(26, GPIO.LOW) # Turn 26 off
GPIO.output(6, GPIO.HIGH) # Turn 6 on
sleep(1) # Sleep for 1 second
mosaicHATのリセット方法
ラズパイのGPIO5(物理だと29)を使って,リセットすることが可能.一応,やらなくても問題なく動作する.安定して動作させるためには,GPIO5をHIGHにするといいとのこと.まあ,これについては多分,今取り扱う問題ではない.
問題のPythonを使った通信
githubの上から順に対処してきたが,とうとう何も問題を捉えられないままここまで来てしまった.githubのPythonの章は何度も見たし,下記のコードも何度も実行してきたが,結局所望の出力が得られないままである.改めて,一縷の望みをかけて実行してみるも,うんともすんとも.
ラズパイは初期化して使っているので,ソフトウェア的な問題はないはず.あるとしたらハードウェア的な問題だけれど.シリアル通信の受信において何か問題が発生しているのだろうか.192.168.3.1から見れる"Data Stream"を見ると,コード実行時に一瞬inputが入っているのが見て取れる.なので,/dev/ttyS0が間違っているということもなさそう.
import serial
import time
# Establish serial connection
ser = serial.Serial('/dev/ttyS0', 115200)
# /dev/ttyS0 is the RPi UART, 115200 is mosaic default baud rate
# For USB Serial, this could be (/dev/ttyACM0),the number is not fixed, to check your ports run: dmesg | grep tty
# Your application may not have access to USB serial, if you got an error run: sudo chmod 666 /dev/ttyACM0
time.sleep(1) # Wait for connection
ser.write(b'SSSSSSSSSSSSS\n') # Push mosaic to run in command mode
time.sleep(0.1)
ser.write(b'sno, Stream1, COM1, GGA, sec1\n') # starting NMEA GGA stream command, for USB replace COM1 with USB1 or USB2
time.sleep(0.1)
while True:
nmea_bytes = ser.readline()
nmea_string = str(nmea_bytes.decode())
nmea_string = nmea_string.rstrip()
if (nmea_string.startswith('$GPGGA')):
nmea_array = [element.strip() for element in nmea_string.split(',')]
Quality_Indicator = int(nmea_array[6])
if Quality_Indicator==0:
print("No GPS Fix Available!") # NMEA GGA Quality indicator = 0 means no fix available
else:
# Parse NMEA GGA message
UTC_Time= float(nmea_array[1])
Latitude= float(nmea_array[2])*0.01
Latitude_direction = nmea_array[3]
Longitude = float(nmea_array[4])*0.01
Longitude_direction = nmea_array[5]
Height = float(nmea_array[9])
Height_unit = nmea_array[10]
# Print coordinates
print('UTC Time: ' + str(UTC_Time))
print(' Latitude: ' + str(Latitude) + Latitude_direction)
print(' Longitude: ' + str(Longitude) + Longitude_direction)
print(' Height: ' + str(Height) + Height_unit)
time.sleep(0.1)
else:
continue
ser.close()
戦いは続く
さて,3時間ほど作業してきたが,結局何も進められることはできなかった.悔しい.ここまで来ると,ハード的な問題を疑うのがよさそうだ.今後は,ハード的な問題も視野に入れて,取り組んでいこう.
課題と希望
最後に,課題と希望を挙げて終わる.課題は,謎のエラーメッセージについて.希望は,ファンを挟んでmosaicHATと通信することは可能そうだ,ということだ.
課題
puttyを起動する際に,謎のエラーメッセージが発動していた.これについて,深く考えずに次に進んでしまったが*1,そもそも論みたいな問題が起きている可能性はある.
希望
ファンHATとmosaicHATをスタック接続した状態で,puttyによる通信をしたところ,192.168.3.1からinputが確認できた.つまり,送信はできてるということだ.その逆もおそらくできる.まず,CLASと通信できるようになるってところを解決できれば,一気に前に進む公算が大きい.前に進んでいることを実感できず,厳しい局面だけれど,頑張っていこう.
*1:頑張っても良かったが,疲れていた