Windows 10にMosquittoをインストールした
MQTTを試すため、WIndows PCにMosquitto(これ↓)をインストールしてみました。
OSは64bit版ですがdownloadしたのはmosquitto-1.4.14-install-win32.exeです。
インストーラを実行すると、libeay32.dllとssleay32.dllが見つからない無いと言われ、0.9.8版をインストールしたら、「序数****が見つからない」という訳の分からないエラーになりました。orz
このエラーは、libeay32.dllとssleay32.dllが古いときに出るらしく、これ(↓)を入れ、
https://slproweb.com/download/Win64OpenSSL_Light-1_1_0f.exe
OpenSSLのインストール・フォルダにあったlibeay32.dllとssleay32.dll(1.0.2版)をSystemフォルダにコピーしpthreadVC2.dllも探してきて同様に処置し、なんとかインストールを完了しました。
Windows管理ツール==>サービス(ローカル)にあるMosquitto Brokerを起動して、1883ポートを開放し、MQTT publishコマンドと subscriveコマンドを試すと・・・
無事、subscriverのコンソールにpublisherのメッセージが表示されました。
パチパチパチ~
Pic-coloの構想が発散気味になってきた
Pic-coloはUSB-シリアルでPCと接続する構想で設計を進めてきました。リモート接続したい場合はRaspi-PICcoloを使ってもらう(Raspi-3BのWifi機能を利用する)計画です。
しかし、Raspi-3Bを独立電源で動かす(そのつもりでDCDC電源も手配した)のは、なかなか大変(特に運用時の充電)です。PIc-coloにESP-WROOM2(これ↓)を
espressif.com搭載することを考え始めました。
ところが、直ぐ¥150の差ならBluetoothの付いたESP-WROOM32(これ↓)の方が良いような気がしてきて・・・
でも、PIC16F1788では釣り合わない気がしてきて・・・
10月には基板化する計画だったのに、ここにきてPic-coloの構想が発散気味です。orz
--------------------------------------------------------------------------------
方針が決まりました。(早っ)
ESP-WROOM32はオーバー・スペックなのと基板レイアウトが厳しいので止めにして、ESP-WROOM-2をオプション扱いとしてswitch-scienceのこれ(↓)が取り付け
www.switch-science.comられるソケットを設けることにしました。
構想が発散しかけたけれど、これにて収束!
実は、ESP-WROOM-2とPCとの通信をどうするか?迷っています。
ATコマンド?
Socket通信?
MQTT?==>その場合、Brokerは?
この辺りはボチボチ詰めて行こうと思います。
Arduinoを試してみることにした
sw_operationプログラムのデバッグで苦労した
Raspi-PICcoloはPic-coloのRaspi搭載モデルです。
秋月電子のRaspi用ユニバーサル基板にRaspi-PICcoloを組んでみました。
これを使って、プログラムの試作を進めています。
先ずは基本のLチカプログラムから、これはすんなり動いて次はSW操作プログラムです。タクトSWの短押し一回で1点灯、短押し二回で2点灯、長押し一回で1秒間隔の点滅、長押し二回で2秒間隔の点滅を繰り返すというものです。動いたように見えたのですが・・・途中で動作が止まってしまいます。ちょっと嫌な不具合です。orz
いつもなら、PICkit3でプログラムの動作を追いかける所です。しかし、ここはPICkit3に頼らず、Raspi-PICcoloだけでデバッグできることを示さなければなりません。
しかし、何をどうすれば良いのか?PIc-coloに加えたいデバッグ機能が色々でてきましたが・・・
SW操作プログラムのベースはLチカプログラムです。先ずはLチカプログラムに戻って、そこに追加した機能を順番に試してみることにしました。
MainループのLED制御は初期状態では1点灯の反復です。これはLチカプログラムとほとんど同じなのですが、念のため確認しておきます。問題なし。
次は10msインターバルで行う、SWの状態読み取りです。これも問題なし。最後に残ったSW操作の判定処理・・・ん、不具合再現!
不具合箇所が絞られました。ソースコードを見直します。
100msインターバルでSW操作の判定を行っているのですが・・・ あ!
中でdi()ei()を使う関数をms_timer割り込みの中から呼び出していました。orz
関数の呼び出しをMainループに移すと・・・
ビンゴ~
動きました。SW操作プログラムの完成です。
やれやれ
commPortのclose処理で苦労した
Pic-coloは、COMMポートがオープンできない場合はPICとの通信は行わず、SettingメニューでCOMMポートの指定が修正されて、ポートがオープンできた場合にPICとの通信を始めます。
ここまでは、良いのですが問題はCOMMポートが複数ある場合です。一方のCOMMポートを開いた後に、SettingメニューでCOMMポートの指定が変更された場合、現在開いているCOMMポートをクローズしてから、新しく指定されたCOMMポートをオープンすることになります。ところが・・・何故かclose関数から戻ってこないのです。orz
ネット上にもrxtxのclose処理で困っている方が大勢いるようです。
”こうすると良い”という記事を見つけたのですが・・・
> serialPort.removeEventListener();
> serialPort.close();
https://marc.info/?l=rxtx&m=123544269723586&w=2
駄目でした。
諦め半分で、暫くジタバタして・・・
ん!出来た?
ReceiveThreadとSendThreadの停止を待ち、portのInputStreamとOutputStreamをcloseしてからportをcloseしたら、上手く行きました!
(パチパチパチ~)
コードはこんな感じです。
-------------------------------
private class CloseThread implements Runnable {
public void run() {
try {
thread_break = true; <== ReceiveThread、SendThreadの順に停止させる
while( !st_break ) <== SendThreadの停止を待つ
{
try {
sleep(100);
} catch (InterruptedException ex) {
Logger.getLogger(Comm.class.getName()).log(Level.SEVERE, null, ex);
}
}
out.close();
in.close();
port.close();
} catch (IOException ex) {
Logger.getLogger(Comm.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
close処理をThread化したのは、close処理を始めた後もメイン・ループからステータス受信のコマンドを出させるためです。それによって、ReceiveThreadとSendThreadが走り、whileループから抜けます。
やれやれ。
pickleでPICに書き込んでみた
pickleという、RaspiでPICの書き込みを行うプログラムがあることをご存知でしょうか?これです(↓)。
projects:pickle - wiki.kewl.org
lvpにも対応していて、5V電源があればPIC16F1788に書き込むことができます。
その存在は前から知っていたのですが、積極的に使ってみようと考えたのは、今回が初めてです。今まではPICkit3を使っていたので、使う必要がなかったのです。
Piccoloコンソール(JAVAプログラム)とPIccoloデバッガー(PICプログラム)はどちらも複製可能なので、Piccoloデバッガーの複製機能を積極的にアピールして、広めようという作戦です。¥(^_^)
で、Raspi-Piccoloの試作でPICへの書き込み機能を試してみました。
最初コマンドが良く分からなくでジタバタしましたが、ようやく使えるようになりました。
コマンドの操作はこんな感じです。
> p14 select PIC16F1788 lvp erase eeprom
> p14 select PIC16F1788 lvp program *****.hex
『Raspi-Piccolo』は通常版とZIFソケットを付けたFree版の二種類を用意しようと考えています。
構造体名が見つからない
Pic-coloは、readelfの出力を解析して変数のアドレスやサイズなどの情報を取得しています。今までは、(便宜上)全ての変数をバイト型の配列と見なして表示してきたのですが、もっと見やすい形式に整える作業に着手しました。
これまでは v_int BASE e803 だった
それを v_int int 0x3e8 1000 と表示するようにしました。
構造体も表示を改善しようとして、問題に気付きました。
typedef struct
{
I2C_TR_QUEUE_ENTRY *pTrTail; // tail of the queue
I2C_TR_QUEUE_ENTRY *pTrHead; // head of the queue
I2C_TR_QUEUE_STATUS trStatus; // status of the last transaction
uint8_t i2cDoneFlag; // flag to indicate the current
uint8_t i2cErrors; // keeps track of errors
} I2C_OBJECT ;
static I2C_OBJECT i2c_object;
変数(i2c_object )がstructure_typeだということは分かるのですが、構造体名(I2C_OBJECT)が見つかりません。orz
実は、構造体情報の出力は2種類( Abbrev Numberが5と21)あって、そのうちAbbrev Numberが5の方は構造体名が出力されないのらしいです。”I2C_OBJECT”という文字列が有るのかgrepで調べてみたですが、そもそもelfファイルに出力されていません。orz
readelfのオプション云々の問題では無さそうです。
何故、そんなことになっているのか?
?????????(<==暫く、悩んでみた)
ググッてみても、分かりません。
?????????(<==もう一度、悩んでみた)
考えてみても、分かりません。
どうすれば良いのか?
???(<==比較的簡単に結論が出た)
やれることからやる!
Abbrev Numberが21の方だけ先に処置することにしました。
Abbrev Numberが5の対策は、そのうちに見つかるかもしれません。
最後まで残ったときは、力任せにlstファイルを解析して、構造体名を取得することだってできるのですから。
Pic-colo開発の試練はまだまだ続きそうです。