2019年12月03日

RaspberryPi 4B と Ubuntu 19.10 でのUSB不具合(キーボード認識せず)と暫定対策

2020年にならないと出ないよと言われていたのに、なんか知らん内にRaspberry Pi 4Bが発売されておりました!(しかも半年近く前...汗)
色々性能が向上してRAMも4GBになってGbit Etherもフルスループットになって、なかなか侮れない感じです。
Raspberry Pi 3B+は2台とも天体観測システムで使ってしまっているので、とりあえず色々遊ぶ用に購入しました。
生産が追いついて無いのですかね、なぜかAmazonとかだと不当(?)に高いので、KSYさんが適正価格で間違いなし。
が、2019/11/20時点では在庫なし。しかし11/22に入荷予約受付とのこと。早速予約して無事購入できました(今は在庫は普通にありそうですね。)

さて、これにもINDIを入れることを考えて、OSはUbuntuにします。RaspberryPi 4Bには19.10から対応とのことで、ブツが届くまでの間にダウンロードとSDカードにbootイメージ書き込み、ようやく本日起動しました。

...が、どうもUSBキーボードがうまく動作しない。CapsLock等のLEDがつきっぱなしだし、どのキーを叩いても文字が表示されない。もちろん、RaspberryPi ZeroとかMacに接続すればきちんと動作します。

おやぁ?と思って、ネットを調べてみると、Ubuntu19.10とRaspberryPi 4B 4Gの組み合わせでUSBが動作しないという不具合があるとのこと。

ホゲ〜!?となりましたが、RAM容量を制限すればUSBは動作するとの解決策も同じページに記載がありました。
まぁ、そのうちBugFixされるだろうと思います(結構放置されているようですが...汗)ので、それまではRAMを制限すれば良いのでそうしましょう。

SDカードを抜いてMacに刺して見ると、SDカードのトップディレクトリにusercfg.txtがあるので、これに
total_mem=2048
とエディタで書き込みraspberrypi 4に刺して起動したらきちんとキーボード認識しました!

ということで、今Xubuntuインストール中(2時間くらいかかりまっす...)。

まぁ、ハマった人の参考になれば幸いです。
#本当は早く直して欲しいわ。2GBのRAMが無駄になってしまってますんで。
【その他の最新記事】
posted by k51 at 23:19| Comment(0) | その他

2019年09月01日

さくらのブログにソースコード表示をさせるようにする設定(忘備録)

Webプログラムではないですが、INDIサーバーとやりとりするshellスクリプトでソースコードをそれっぽく表示したかったので、さくらのブログでソースコード表示をする方法を調べました。が、色々ハマったので忘備録として記載します。
以下のURLが参考になります。
参考1: http://mindalign.sblo.jp/article/175971621.html
参考2: http://memoofcocoyan.seesaa.net/article/449499818.html
参考3: https://amimilab.com/2016/07/20/83/

0. 大まかな仕組み
ソースコードの表示をつかさどるJavaScriptとCSSを自分のさくらのブログのサーバーにアップロードし、ブログのHTMLのソースコードのテキストを<pre>...</pre>タグで囲んでスタイルを適用させるという方法です。
細かい部分で今のバージョンでは動かないようですが、参考1がブログサーバー側設定方法として参考となりますので、まず一読いただくことをおすすめします。

1. syntaxhighlighter-3.0.83のダウンロード
参考2にあるようにSyntaxHighlighterのバージョンは3.0.83を使用する必要があります。
参考2の手順通りにZIPファイルをダウンロードして展開しておいてください。
参考3ではjsやcssファイルをsyntaxhighlighterのサーバーURLで直に指定していますが、参考2の通り一旦ローカルにダウンロードして、必要なファイルをさくらのブログの所定場所にアップロードできるようにします。

2. js, cssファイルのアップロード
参考1の【設定手順】の通りにファイルをアップロードします。上記1でダウンロードし展開したsyntaxhighlighter-3.0.83ディレクトリ内の以下のファイルをアップロードしてください。
scripts/XRegExp.js
scripts/shCore.js
scripts/shBrushBash.js (<-使いたい言語のファイル 参考3を参照)
styles/shCore.css
styles/shCoreRDark.css (<-使いたいスタイルファイル 参考3を参照)

ここで注意が必要なのは、XRegExp.jsファイルを必ずアップロードすること。
参考1ではこのファイルについては記載がないのですが、このファイルが無いとブラウザ側でSyntaxHighlighterが動作しませんでした。
Webブラウザの開発ツールでデバックし、XRegExpが未定義でshCore.js等のJavaScriptプログラムの実行が中断されていたことからこのファイルの必要性を認識し、参考2を見つけて対処しました。

3. ブログテーマHTMLファイルの設定
参考1に記載の通り、ブログテーマHTMLファイルを新たに作成し、以下のHTMLコードを</head>の直前に追加してください。言語やスタイルのファイルが異なる場合は、それに合わせて適宜修正ください。
また、下記xxxやyyyはご自身のブログサーバーに合わせて読み替えてください。









これで下準備は完了です。

4. ブログでソースコードを表示させる方法
資料1にはブログの記事エディターモードをリッチテキストモードでとありますが、これではうまく行きませんでした。
色々試したところ、標準テキストモードで、ソースコード部分を
<pre class="brush:bash">...</pre>
で囲むことでうまく動作しました。
ただし、改行処理がちょっとおかしいです。これは文字コード設定変更(SJIS -> utf-8)のせいかもしれませんが、原因はよくわかってません。どなたかわかればコメントいただけると嬉しいです。

以上でようやく目的は達成できたのですが、思っていたより面倒でした...。
まぁ、この方法ならばHPでも同じように利用できるでしょうから、良しとしましょう。
posted by k51 at 22:43| Comment(0) | Webプログラム

INDIサーバー経由でQSI583wsgのCCD温度を目標値まで徐々に変えるShell Script

INDI サーバーにはスクリプトを受け付けるツールが用意されており、このツールを使ってデバイスのモニタをしたり、パラメータを設定したりできます。
CCDの温度をいきなり目標値に設定するのは避けたいので、QSI583のCCD温度を徐々に冷却または外気温に戻すようなスクリプトを書きました。

まず、以下に示したshellスクリプトをcooler.shというファイル名でQSI583を制御するINDIサーバーが動作しているRaspberryPiに保存し、以下のように実行権を与えます。
$ chmod 744 cooler.sh
これでshellスクリプトとして実行できるようになりました。

使い方は ./cooler.sh step goal で変化ステップ温度をstepに、目標温度をgoalで与えます。
負(-)のstep値は冷却を、正(+)のstep値は加温を表しますので、例えば、
$ .cooler.sh -1.0 -20.0
とすると、-20.0になるまで、だいたい1分間ごとに(-1.0度づつ)冷却していきます。また、
$ .cooler.sh 1.0 25.0
とすると、25.0になるまで、だいたい1分間ごとに(+1.0度づつ)温めていきます。
目標温度に到達するか、設定温度に5分間経過しても到達しなかった時は処理を終了します。
#!/bin/sh
#
# Usage: ./cooler.sh step goal
#
# Example: ./cooler.sh -1.0 -20.0 (cooldown for - step value)
# Example: ./cooler.sh 1.0 33.0 (warmup for + step value)

step=$1
goal=$2

echo "Cooler step degree: `perl -se 'printf ("%.1f\n", $stp)' -- -stp=$step` deg"
echo "CCD goal temp: `perl -se 'printf ("%.1f\n", $gl)' -- -gl=$goal` C"

# indi server alive?
ids=`indi_getprop -1 "QSI CCD.CONNECTION.CONNECT"`
if [ "$ids" = "Off" ]
then
echo "CONNECTION IS NOT ESTABLISHED. Try to establish connection."
`indi_setprop "QSI CCD.CONNECTION.CONNECT=On"`
sleep 3s
echo "Retry ./cooler.sh, Bye."
exit
elif [ "$ids" = "On" ]
then
echo "CONNECTION IS ESTABLISHED."
ct=`indi_getprop -1 "QSI CCD.CCD_TEMPERATURE.CCD_TEMPERATURE_VALUE"`
pw=`indi_getprop -1 "QSI CCD.CCD_COOLER_POWER.CCD_COOLER_VALUE"`
echo "Current temp: `perl -se 'printf("%.1f", $tp)' -- -tp=$ct` C, Cooler power: $pw %"
echo "Please input initial setting temp"
read initemp
echo "Set initial temp: `perl -se 'printf("%.1f", $itp)' -- -itp=$initemp` C"
else
echo "Indi server might not be started."
exit
fi

# initial setting
tgt=`perl -se 'printf("%.1f", $pt + $stp)' -- -pt=$initemp -stp=$step`
tpt=`indi_getprop -1 "QSI CCD.CCD_TEMPERATURE.CCD_TEMPERATURE_VALUE"`
fin=0

while [ $fin -eq 0 ]
do
#tgt=`perl -se 'printf("%.1f", $pt + $stp)' -- -pt=$ctp -stp=$step`
#indi_setprop "QSI CCD.CCD_TEMPERATURE.CCD_TEMPERATURE_VALUE=`perl -se 'printf("%.1f", $pt + $stp)' -- -pt=$ctp -stp=$step`"
indi_setprop "QSI CCD.CCD_TEMPERATURE.CCD_TEMPERATURE_VALUE=$tgt"
echo "Set target temp: $tgt C"
sleep 5s

if [ `echo "$step < 0" | bc` -eq 1 ]
then
#Cool down
if [ `echo "$tpt <= $goal" | bc` -eq 1 ]
then
fin=1
else
cnt=0
loopc=0

while [ $cnt -lt 10 ]
do
tpt=`indi_getprop -1 "QSI CCD.CCD_TEMPERATURE.CCD_TEMPERATURE_VALUE"`
tpw=`indi_getprop -1 "QSI CCD.CCD_COOLER_POWER.CCD_COOLER_VALUE"`
echo "Current temp: `perl -se 'printf("%.1f", $tp)' -- -tp=$tpt` C, Cooler power: $tpw %, Cnt:$cnt, Loopc:$loopc"
if [ `echo "$tpt <= $tgt" | bc` -eq 1 ]
then
cnt=`expr $cnt + 1`
elif [ $loopc -gt 60 ]
then
echo "CCD temp cannot reach goal. Abort to cooler.sh."
exit
else
loopc=`expr $loopc + 1`
fi
sleep 5s
done

# next targt
tgt=`perl -se 'printf("%.1f", $pt + $stp)' -- -pt=$tgt -stp=$step`
if [ `echo "$tgt < $goal" | bc` -eq 1 ]
then
tgt=$goal
fi
fin=0
fi
else
#Warm up
if [ `echo "$tpt >= $goal" | bc` -eq 1 ]
then
fin=1
else
cnt=0
loopc=0

while [ $cnt -lt 10 ]
do
tpt=`indi_getprop -1 "QSI CCD.CCD_TEMPERATURE.CCD_TEMPERATURE_VALUE"`
tpw=`indi_getprop -1 "QSI CCD.CCD_COOLER_POWER.CCD_COOLER_VALUE"`
echo "Current temp: `perl -se 'printf("%.1f", $tp)' -- -tp=$tpt` C, Cooler power: $tpw %, Cnt:$cnt, Loopc:$loopc"
if [ `echo "$tpt >= $tgt" | bc` -eq 1 ]
then
cnt=`expr $cnt + 1`
elif [ $loopc -gt 60 ]
then
echo "CCD temp cannot reach goal. Abort to cooler.sh."
exit
else
loopc=`expr $loopc + 1`
fi
sleep 5s
done

# next targt
tgt=`perl -se 'printf("%.1f", $pt + $stp)' -- -pt=$tgt -stp=$step`
if [ `echo "$tgt > $goal" | bc` -eq 1 ]
then
tgt=$goal
fi
fin=0
fi
fi
done
echo "Done."
(注)上記のスクリプト領域をダブルクリックすると全選択できます。

時々、サーバーからの返答が遅くなると表示がおかしくなりますが、表示が元に戻って動作していればそのまま何もしなくて問題ないと思います。
shellスクリプトでは小数点演算ができないので内部でperlを使ってますが、特段難しいことはしていません。
また、プログラムの無駄が多いように思いますので、改造等は自由にしていただいて結構です。
ただし、このスクリプトで万が一問題が発生しても当方は免責とさせていただきます。
posted by k51 at 20:59| Comment(0) | 天体撮影