denshikobo’s blog

PICプログラミングやPCの操作で感じた日々の由無し事を綴ります

ラズパイマガジンの「パイ専ボード」を見て考えた

ラズパイマガジンが雑誌連動企画で「パイ専ボード」(ESP32を搭載したRaspiのドータ・ボード)を販売するようです。

ラズパイマガジン <お得な>Raspberry Pi販売サイト

しかし、『ESP32とRaspberry pi3との組み合わせ』っていうのは、どうもしっくりしません。

 

PIc-coloにESP-WROOM-02の搭載を決めた時も悩みました。IoTデバイスとしてESP8266を単独で活用する事例もあるのに、敢えてPICと組み合わせる意味はあるのだろうか?

 

Pic-coloは『新しいPICの開発環境を提供すること』が最大のテーマですから、PIC無しという選択は考えられません。ESP-WROOM-02の搭載は、PICにWifi機能を追加する最も手頃な手段です。

 

しかし、PIC16F1788とESP-WROOM-02が組み合わされていることに技術的な合理性が見いだせないと・・・

 

『温度や気圧を測ってパソコン画面に表示してみました』ではPic-colo+ESP-WROOM-02の実用アプリケーションとは呼べません。

 

やっぱり、PICのリアルタイム制御機能を生かした倒立ロボットでしょうか?

ハードル高いなぁ~(<==実はPIC24を使って一度失敗している)

 

 

Pic-coloアプリケーションの候補ができた

Pic-coloはPICを使った実用アプリの開発環境として提案していく予定です。

 

となると、PICの機能を紹介するサンプル・プログラムだけでは不十分で、実用アプリの開発例を提示しなければなりません。

 

実用アプリの候補はいくつかあります。しかし、どれも地味というか・・・華がないというか・・・

 

そんな中で何とか実現したいと考えているのが『Pic-colo Theremin』です。

 手の動きで音を操作する装置(楽器)で、DACの分解能が課題です。

 

『8bitDACのVref+とVref-に5bitDACの出力を加え、二つの5bitDACの出力差を256分割して12(13)bitDACを構成する』という方式を考えていて、その実現可能性を早急に確かめる必要があります。

 

MCCを使ってペリフェラルをサクサク設定して、DAC1、DAC2、DAC4の設定を変えながらAD変換した結果を画面表示する・・・Pic-coloなら簡単に実現できます。

 

早速、回路を組んでみたのですが、どうも5bitDACの出力がおかしいのです。5bitDACのPositive ReferenceにFVR_buf2を設定したのですが・・・

f:id:denshikobo:20171106180040p:plain

(MCCで Positive ReferenceにFVR_buf2を設定した)

 

マニュアルを調べると、Positive Source Selectは1bitで、VccまたはVref+のいずれかを指定することになっていました。orz

f:id:denshikobo:20171106180059p:plain

(5bitDACのPositive ReferenceにFVRは選べない)

 

Verf+には5bitDACの出力を接続しなければならないので、5bitDACのPositive Referenceとしては使えません。Vddを選択して5bitDACから0V~3.3Vの出力が得られるようになりました。(<==電源ノイズの影響が気になる)

 

実際、Raspiの3.3V電源だと12bitADCの計測値はばらつきます。しかし、平均化処理を施した結果を見ると、12bitbit分解能のDACとして動作していることが確認されました。

パチパチパチ~

 

この12bitDACが音源として使えるかどうか(?)まだ分かりませんが、『Pic-colo Theremin』の実現に向けて一歩前に進みました。

FT231XSを使ったUSBシリアル変換が動いた

1週間前に届いたPic-colo基板の組み立てを先延ばししてきました。

 

先ずは・・・

(1)ESP-WROOM-02Wifiのアクセス・ポイントに接続する。

           ==>O.K.

(2)MQTTでESP-WROOM-02からPC上のmosquittoにPubSubする。

           ==>O.K.

 (3)PC上のJAVAプログラムからmosquittoにPubSubする。

           ==>O.K.

(4)FT231XSをSSOP変換基板に半田付けして動作確認する。

           ==>N.G.  orz

実は、10月始めに FT231XSの試作で失敗しています。「0.65mmピッチなら半田付けできる(実績あり)」と気楽にやったらブリッジしまくり・・・

何とか半田付けをやり終えてPCに接続したのですが、USBデバイスとして認識されませんでした。

 

今回は十分注意して慎重に半田付けして、仕上がりもしっかり確認・・・したのに矢張り駄目です。3回試作して同じ結果なのですから、これ以上同じことを繰り返しても無駄だと思われます。

-------------------------

部品の使い方に誤りは無いのか?
配線に誤りは無いのか?
SSOPの半田付けはちゃんと出来ているのか?
熱を加え過ぎて部品を壊していないか?<==10月の試作はこれを疑った
USBポートの給電容量は足りているのか?<==別電源も試してみた
etc.

-------------------------

FT231XSは初めて使う部品なので、(あれこれ、あれこれ)悩みは尽きません。

 

困ったときのWeb頼み。

しかし、”FT231XS 接続できない"で検索をかけても、『適切なデバイス・ドライバーをインストールする方法』しかヒットしません。

 

万事休す・・・FT231XS無しで基板を組み立てる(USBシリアル変換ケーブルを使う)ことを、真剣に考え始めました。

 

と、一つだけ『デバイス記述子が見つからない』という不具合がUSBケーブルを交換したら直った、という報告を見つけました。

 

これまで、手元にはそれ一つしか無いUSBケーブルを使ってテストしていました。

『藁をも掴む』心境で秋月電子にUSBケーブルを発注したのが昨日です。

 

で、今朝届いたUSBケーブルを使って、早速試作基板をPCに接続してみると・・・

ビンゴ~

 

試作した基板3枚ともCOMポートとして認識されました。

f:id:denshikobo:20171101114706p:plain

パチパチパチ~

 

これまでテストに使っていたUSBケーブルは丸めてゴミ箱に捨てました。

やれやれ。

 

これで要素試作は全て終わりました。

いよいよ、Pic-colo基板の組み立てに取り掛かります。

Pic-coloの開発は悩ましい

 Pic-coloは、PICkit3を使った従来のPICプログラム開発環境とは異なる、新しいプログラム開発環境を提供しようとしています。<==構えはでかい(^_^;)

 

 『これくらい出来なければ使い物にならない』という最低レベルの基準を満たすべく開発を続けてきました。

ーーーーーーーーーーーーーーーーーーーーーーーーーーー

 <第一段階>

全ての変数をバイト配列で表示した。

(Baseタイプの変数はこれでも良いが配列は扱いづらい)

<第二段階>

配列は要素サイズに応じてバイト区切りを変えた。

(Baseタイプの配列はこれでも良いが構造体は扱いづらい)

<第三段階>

構造体はメンバーのサイズに応じてバイト区切りを変えた。

(ポインタ・タイプは参照先の値が知りたい)

 <第四段階>

ポインタの参照先を別変数として表示した。

構造体メンバーを別変数として表示した。

 

今ここ。(<==ただしデバッグ中)

 ーーーーーーーーーーーーーーーーーーーーーーーーーーー

共用体はまだ扱えませんが、次に取り組む予定です。

f:id:denshikobo:20171030142030p:plain

背景はユーザの好みに合わせて変えられるようにしました。 ¥(^_^)

 

上の図は、Baseタイプ変数の他、構造体配列の要素(TEST_STRUCT構造体)のメンバーであるunsigned-char変数cとunsigned-int変数iの表示例です。

 

(配列の任意の要素を表示する機能が要るなぁ~ )<==今は先頭要素しか扱えない

 

ポインタへのポインタとか、構造体へのポインタとか、処理の階層化が適切に出来ていいれば、問題なく扱える筈ですが・・・確かめてみなと何ともいえません。

 

この作業をどこまで続けるか?(<==改善作業は、多分ず~っと続きます)

どこで仕様を一旦Fixしてリリースするか?(<==最低レベルの基準を満たしているか?)

 

悩ましい課題です。

 

JAVAでMQTTを試してみた

esp8266_MQTTで冷や汗をかきました。でも、なんとかクリア出来たので最後の関門『JAVAからMQTT接続』を試すことにしました。

 

参考にしたのはこちら(↓)の二つです。

JavaでMQTT入門 ローカル環境でPubSubの動作を検証してみる - Qiita

dotnsf.blog.jp

JAVAのソース・コードはこちら(↓)を使いました。

        リンク==> gist.github.com

必要なorg.eclipse.paho.client.mqttv3ライブラリはこちら(↓)から持ってきました。

https://repo.eclipse.org/content/repositories/paho-releases/org/eclipse/paho/org.eclipse.paho.client.mqttv3/1.2.0/org.eclipse.paho.client.mqttv3-1.2.0.jar

 

ソース・コードには、以下の修正(2カ所)が必要でした。

@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
// throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
System.out.println("-------------------------------------------------");
System.out.println("| Topic:" + topic);
System.out.println("| Message: " + new String(message.getPayload()));
System.out.println("-------------------------------------------------");
}

// @Override
// public void messageArrived(MqttTopic topic, MqttMessage message) throws Exception {
// System.out.println("-------------------------------------------------");
// System.out.println("| Topic:" + topic.getName());
// System.out.println("| Message: " + new String(message.getPayload()));
// System.out.println("-------------------------------------------------");
// }

@Override
public void deliveryComplete(IMqttDeliveryToken token) {
try {
// throw new UnsupportedOperationException("Not supported yet.");
System.out.println("Pub complete" + new String(token.getMessage().getPayload()));
//To change body of generated methods, choose Tools | Templates.
} catch (MqttException ex) {
Logger.getLogger(MQTT_Client2.class.getName()).log(Level.SEVERE, null, ex);
}
}

// @Override
// public void deliveryComplete(MqttDeliveryToken token) {
// //System.out.println("Pub complete" + new String(token.getMessage().getPayload()));
// }

 

環境に合わせて以下のように指定しました。

static final String BROKER_URL = "tcp://localhost:1883";
static final String M2MIO_DOMAIN = "1ST CATEGORY";
static final String M2MIO_STUFF = "2ND CATEGORY";
static final String M2MIO_THING = "ID";
static final String M2MIO_USERNAME = "username";
static final String M2MIO_PASSWORD_MD5 = "password";

 

この設定に従って以下のようにtopicが設定されます。

String myTopic = M2MIO_DOMAIN + "/" + M2MIO_STUFF + "/" + M2MIO_THING;

サンプル・プログラムをNetbeansで走らせるとこんな出力になりました。

 

Connected to tcp://localhost:1883
Pub complete{"pubmsg":1}
-------------------------------------------------
| Topic:1ST CATEGORY/2ND CATEGORY/ID
| Message: {"pubmsg":1}
-------------------------------------------------
Pub complete{"pubmsg":2}
-------------------------------------------------
| Topic:1ST CATEGORY/2ND CATEGORY/ID
| Message: {"pubmsg":2}
-------------------------------------------------
Pub complete{"pubmsg":3}
-------------------------------------------------
| Topic:1ST CATEGORY/2ND CATEGORY/ID
| Message: {"pubmsg":3}
-------------------------------------------------
Pub complete{"pubmsg":4}
-------------------------------------------------
| Topic:1ST CATEGORY/2ND CATEGORY/ID
| Message: {"pubmsg":4}

-------------------------------------------------

publishとsubscribeのtopicを変え、google cromeのMQTT LENSアプリを使ってRetain設定による動作の違いも確かめることが出来ました。

 

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

実は、昨日走らせたときはpublishする度にdisconnectしていました。

(最初はそういう仕様なのだと思った)

何故、今日は動作が違うのか?原因は不明です。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

色々トラブルも有りましたが、ESP-WROOM-02を介してPic-coloコンソールとPic-coloデバッガを接続するための準備は何とか整ったようです。

 

次は、これ(↓)の半田付けだ!

akizukidenshi.com

ESP-WROOM-02のMQTT接続で嵌まった

Arduino IDEを使って行うESP-WROOM-02の開発は(小さな不具合を除けば)順調に進み、いよいよMQTTの接続を試すことにしました。

 

参考にしたのはこちら(↓)のサイトです。

電子工作界隈で話題のWi-Fiモジュール「ESP8266」でMQTTを使う方法 | 株式会社LIG


必要な作業がまとめて記されているので、初めての方でも取り組みやすいのではないか、と思います。(ただし、一点を除いて)

 

既にWindows環境にmosquittoブローカが立ち上がっていて、ESP8266の開発環境もArduino IDEに組み込み済みなので、これ(↓)をコピペして実行する所から始めたのですが・・・

esp8266-mqtt-quicktest/mqtt_esp8266_test.ino at master · kiyopikko/esp8266-mqtt-quicktest · GitHub

 

Exception (3)を起こし、リスタートを繰り返します。orz

”Exception Decorder”をインストールして解析すると・・・

---------------------
Exception 3: LoadStoreError: Processor internal physical address or data error during load or store

Decoding 9 results
0x402301e0: sleep_reset_analog_rtcreg_8266
0x40202f76: Adafruit_MQTT::connect()
0x40203408: Print::println()
0x40201e08: MQTT_connect()
0x40201e3a: loop
0x40203768: loop_wrapper
0x40100718: cont_norm

---------------------

どうやら、LoadStore命令で不正アクセスを起こしてたようです。

しかし、Arduino IDEでMQTT_connect()から先の処理を調べるには、どうしたら良いのでしょうか?いくら調べても、その方法が見つかりません。sleep_reset_analog_rtcreg_8266が何なのか?それも分かりません。orz


”MQTT Exception 3”で検索を掛けて、ようやくこれを見つけました。

mqtt.connect() throws Exception (3) rst cause:2, boot mode:(1,6) · Issue #68 · adafruit/Adafruit_MQTT_Library · GitHub

 

どうやら”PROGMEM”が悪さをしているようです。コピペしたサンプル・コードにもPROGMEMが使われています。

コピペしたコード(↓)

const char MQTT_SERVER PROGMEM = YOUR_SERVER;
const char MQTT_CLIENTID
PROGMEM = __TIME__ "_test_client_id";
const char MQTT_USERNAME PROGMEM = YOUR_USERNAME;
const char MQTT_PASSWORD
PROGMEM = YOUR_PASSWORD;

 

”最新のexampleを調べろ”ということなので、スケッチ例-->Adafruit MQTT Library-->mqtt_esp8266を実行すると・・・

 

WiFi connected
IP address:
192.168.2.108
Connecting to MQTT... MQTT Connected!

Sending photocell val 0...OK!

Sending photocell val 1...OK!

 

動きました!

勿論、こちらのコードにはPROGMEMは使われていません。¥(^_^)

一時はどうなることかと思い(ESP-WROOM-02の利用を諦めかけ)ました。

 

Arduino IDEを使っていると、ライブラリが頻繁にアップデートされます。ネット上のサンプル・コードではなく、ライブラリと一緒に提供される『スケッチ例』を最初に試すべきなのだと気づきました。

 

また、経験値が一つ上がった!

 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

今回のように、インストールしたライブラリの不具合を、皆はどうやって追いかけるんだろう?

謎だ!

 

ESP-WROOM-02を動かして見た

先ずはESP-WROOM-02の動作確認です。

これ(↓)にESP-WROOM-02を半田付けした (2年くらい放置していた)ものを

ESP-WROOM-02ピッチ変換用基板《シンプル版》 (基板のみ) - スイッチサイエンス

 ブレッドボードに取り付けました。IO0,IO2,EN,RSTを10kΩでプルアップして、電源(3.3vとGND)を接続して、USBシリアルのTX,RX,GNDを接続して配線完了です。

こちら(↓)に記されていた回路接続を参考にしました。 

ESP-WROOM-02動作確認 - <<梅>>備忘録 ~Random Walk~

 

プルアップされたENをジャンパー線で一瞬GNDに落とすと文字化けした文字列が表示されました。(起動直後は通信速度が115200と異なるらしい)
その後『AT』と入力すると『OK』が帰ってきました。

パチパチパチ~

 

その後はこちら(↓)を参考にして、Wifiでアクセスポイントに接続出来ることまで確認出来ました。パチパチパチ~

ESP-WROOM-02: ATコマンドによるWifi動作確認 - Qiita

 

いよいよATコマンドとお別れして、Arduino IDEを使ったプログラムに移ります。

先ずはこちら(↓)を参考に開発環境を整え、””Hello World"を動かしてみました。

keijirotanabe.github.io

順調な滑り出しだったのですが、ちょっとプログラムを書き換えてみようとしたら・・・書き込みでエラーを起こしました。orz

プログラムを書き換えるときは、毎回IO0をLOWレベルにして再起動しなければならないようです。(開発ボードを使い、Reset  Methodをnodemcuに設定すると楽になるらしい) 

f:id:denshikobo:20171025123229j:plain

 

最後にスケッチ例の中からESP8266Wifi-->WifiWebServerを動かしました。

f:id:denshikobo:20171025132548j:plain

ここまで至って順調です。

 

この後、MQTTの接続で嵌まることになるとは・・・orz