macsbug

Just another WordPress.com site

Try IMU with MPU6500 and ESP8266

leave a comment »

MPU6500 と ESP8266 で IMU を試してみました。                2016.12.08
IMU : inertial measurement unit :慣性計測装置。

画面で グリグリ回してみたい という発想です。
ワイヤレス方式 の費用は 1306円。USB 有線方式は 848円 です。


.
準備:費用=1306円   : 円レートで価格が変動します。

No.  Nomen  Link  Price(円)  Memo
01  MPU6500  MPU6500  172  2個344円
02  WeMos D1 mini  D1 Mini  382  1個
03  ESP-WROOM-02 TELEC  ESP8266 TELEC  458  1個
04  BATTERY NP-70  秋葉ガレージ中古品     250  4個1000円
05  スイッチ  Latch 7x7mm Push sw           8  20個152円
05  ショットキーダイオード  RSX101VA-30:秋月           9  20個180円
06  0.3mm厚基板Dタイプ  0.3mm厚基板:秋月        10  1個60円
07  ピンソケット8P  8pin Female socket        15  10個150円
08  低メスシングルピンソケット  ソケット:秋月           1  1個50円
09  L型ピンヘッダ  Single Right Angle Pin           1  3個110円
10  ケース( 3D Printer 自作)  –  –
 ———- スケッチ———-  ————————-  –
11  FreeIMU Processing sketch  FreeIMU_cube.zip  –
12  FreeIMU Arduino sketch  MPU6050_test.zip  –
13  processng Language  processng Language  –

.
ハードの選択:
_ センサーについては「Investigate Degrees Of Freedom」を参照してください。
_ 多くの種類と価格があり 低価格を優先し コストパフォーマンスの高い MPU6500
_ を選択しました。業者によっては MPU6500 を注文すると MPU9250, MPU9255
_ 同等品が来る場合もあります。この場合 Magnetic も使用できる事になります。

.
ソフトの選択:
_ ライブラリーやスケッチは センサーデータの処理がされた FreeIMU   を選択。
_ このスケッチの完成度は高く Mike S の mjs523氏 に感謝致します。
.


.
工作:
1. スイッチとバッテリーコネクタの製作。 部品は6つ。

_ 配線は コネクターピンやピンの余りを使用してハンダ付けします。
_ +BATTERY -> ダイオード -> スイッチ -> +BATT出力(WeMos +5V)
_ バッテリー出力から ショットキーダイオード を経由しスイッチへ配線する。
_ ショットキーダイオードは USB接続の電源からの逆流防止の為です。
_ 重要:ピンソケットの2つは バッテリ接点用ですので バネで接触する様に
_ 上手に折り曲げます。

2. ESP8266 と センサー 組み立て。スルーホール同士を直付けします。
_  ワイヤレス用:WeMos D1 mini with TELEC
_  ( D1 mini ) 3V3 = VCC (MPU6500)
_  ( D1 mini ) D8 = GND(Wire で GND へ配線) = GND (MPU6500)
_  ( D1 mini ) D7 = SCL (MPU6500)
_  ( D1 mini ) D6 = SDA (MPU6500)

_ USBシリアル接続用: WeMos D1 mini Pro と D1 mini ( without TELEC)
_ without TELEC の基板使用時は スケッチで WiFi.mode(WIFI_OFF); にします。
_ この命令で送信電波を停止し TELEC Not Applicable にします。

3. 組み立て。
_  ケース、スイッチ、ESP8266 + MPU6500、バッテリー の用意ができました。
_  ショートが予想される場所は カプトンテープ等で絶縁してください。

_  ケースに組み上げます。
_  D1 mini の +5V をスイッチコネクター の +BATTERY出力 に接続します。

.


.
FreeIMU を動かす方法:

_ USB シリアルについて:(前置き)
_  スケッチの接続は USB シリアルです。例:ESP8266 USB  — Mac(PC)。
_  ESP8266 の USBの名前 を設定すると繋がります。
_  例:myPort = new Serial(this, “/dev/cu.wchusbserialfd1420”, 115200);
_  Processing と ESP8266 のスケッチは 上記の設定をすると動作します。
_  ESP8266 は WiFi.mode(WIFI_OFF); にします。

UDP通信でワイヤレス化する:
_ USBシリアル の部分を WiFi (UDP通信)に 置き換え ワイヤレス にします。
_ これが出来ますと 多種多様なものを 簡単にワイヤレス化 できます。
_ 電波を使用する為 ESP8266 は with TELEC を使用します。

ESP8266 のスケッチの変更と追加:MPU6050_test.zip を UDP通信対応にします。
UDP通信は「Communicate ESP8266 and iPad directly with UDP」を参照ください。
仕組みは「UDPの設定」と 「udp.print(data); 」でデーターを送信します。
.

#include <ESP8266WiFi.h>              // WiFi
#include <WiFiUDP.h>                  // UDP
static WiFiUDP udp;                   // UDP Object
#define ESP_RX_PORT 7000              // ESP Receiver port
#define ESP_TX_PORT 9000              // ESP Transmit Port
IPAddress ESP_IP;                     // ESP IP 192.168.4.1
IPAddress EXT_IP;                     // ext IP 192.168.4.2
bool sw = LOW;                        // LED switch
String data = "";                     // OUTPUT DATA

.
void setup() の先頭に以下を追加する。
.

  Serial.begin(115200);                 //
  Wire.begin(D6,D5);                    // SDA, SCL. D6,D7:D1 mini
  pinMode(D4, OUTPUT);                  // BUILTIN_LED monitor
  WiFi.mode(WIFI_AP);                   // AP Mode:direct connection
  WiFi.softAP("MPU6500", "");           // ESP8266:SSID, password
  ESP_IP = WiFi.softAPIP();             // 192.168.4.1 localIP
  udp.begin(ESP_RX_PORT);               // ESP:UDP Rx port=7000

その下の while(!Serial.available() は コメントアウトします。
これは USB ケーブルで接続の場合に使用します。
.

/*
  while(!Serial.available()){
    if(Serial.available()){
      byte hereWeGo = Serial.read();
      if( hereWeGo == 't'){
        break;
      }
    }
  }
  */

.
void sendQuat() の Serial.print(“\n”); の下に以下を追加する。
.

data = data + "\n";
udp.beginPacket(EXT_IP, ESP_TX_PORT); // Packet transmit
udp.print(data);                      // data   transmit
udp.endPacket();                      // end of transmit
Serial.println(data);                 //
sw = !sw; digitalWrite(D4,sw);        // LED indication
data = "";

.
void serialPrintFloatArr(float * arr, int length) の Serial.print(“,”); の下に以下を追加する。
.

data = data + ",";

.
void serialFloatPrint(float f) の Serial.print(c2); の下に以下を追加する。
.

data = data + String(c1) + String(c2);

.


.
Processing スケッチの変更と追加:FreeIMU_cube.zip を UDP通信対応にします。
processing Language は事前に多少 理解しておく必要があります。
記述は Arduino や ESP8266 と似て 解り易く グラフィックが強力です。
使い方では プルダウンメニューの ライブラリーの追加 と フォントの作成は
少し知る必要があります。私のレベルでも出来ましたので大丈夫です。
Processsing からライブラリーやフォントの追加指示があれば 従ってください。
余談ですが Processing は アプリケーションのエクスポート機能があり 単独の
アプリが作れます。

import hypermedia.net.*;
UDP udp;

void setup() の冒頭に以下を追加する。

  udp = new UDP( this, 9000 );
  udp.listen( true );

void readQ() ルーチン全体を以下に変更する。

void receive( byte[] data, String ip, int port ) {
  data = subset(data, 0, data.length-2);
  String inputString = new String( data );
  String [] inputStringArr = split(inputString, ",");
  q[0] = decodeFloat(inputStringArr[0]);
  q[1] = decodeFloat(inputStringArr[1]);
  q[2] = decodeFloat(inputStringArr[2]);
  q[3] = decodeFloat(inputStringArr[3]);
}

.
他の試して動作したスケッチです:それぞれグリグリ回転します。
シリアル通信の所を削除しUDP通信を追加し直ぐ動きました。
スケッチの出来具合にもよりますが 水平の回転ができないものが多いです。
かなり検討されたものや 3D画像を直ぐ使用できる優れものもあります。

.


.
データーの処理方法:加速度センサーの例
x,y,z 軸の値:をそのまま(ローデーター) 使用し 3D で動かしている物があります。
_ このままでは 量と現実との差が生じる為 受け側での処理が必要です。
.
pitch,roll,yawの値:x,y,z 軸から pitch,roll,yaw を算出し 3D で動かしている物が
_ あります。このままでは 量と現実との差が生じる為に 受け側デの処理が必要
_ です。さらにこれだけでは水平軸の回転は表示できません。
.
FreeIMU:水平軸の回転も可能になっています。そして動かした大きさも ほぼ同じ
量で表示しています。値の取得は 16bit hexで 私にはレベルが高く理解できません。
.


.
感想:
画面で グリグリ回してみたい という発想から始め モーションを体験できました。
知識も無く 加速度センサー や 磁気センサーを購入し作られたスケッチをいろいろ
試してみました。表示をどうするでは 素人でも扱い易いグラフィックは Processing
が最適です。その点でも先人が Processing を使用していましたので 助かりました。
殆どが USB 接続によるものですが 事前に ESP8266 による UDP 直接通信の方法を
解説しておきましたので 容易に表示する事が出来ました。
.
加速度センサー:奥が深く感じました。データーを取得して表示するだけでは使用
_ できないと言う事です。KalmanFilter 等のフィルターが必要です。GPSの精度
_ は 50cmですが加速度やジャイロを使用する事により 8cm まで可能と聞いてい
_ ます。
.
スイッチ:小さなケースに入れる場合、スライドスイッチ や トグルスイッチは
_ 押しづらい事やケースに固定が難しい。押しボタンスイッチが最適と判断し
_ ましたが 秋葉原ではこの手のスイッチは入手できず ebay から購入しました。
.
バッテリー:デジカメ用のバッテリーは 平たく四角の為に工作しやすくケースを
_ 薄く作る事が出来ます。ただし 高価で費用に大きく影響します。中古ですが
_ 秋葉原のガレージショップで安く入手しました。充電回路は場所を取る事と
_ 面倒です。古いデジカメの様にバッテリ交換方式にしました。バッテリーは
_ 充電後に 4V とかにもなり ESP8266 の 3.3V 電源には 直接接続できません。
_ よって D1 mini の場合は 5V 端子へ接続し 基板のLDOで 3.3V に変換されます。
.
消費電流:USB 5V 測定に於いて 約110mA、消費電力は 約5.9AHです。 
.
価格:ESP8266 ボードとセンサーの国内の価格は非常に高いです。今回の分野で
_  は 7000円台になるでしょう。これに対し低価格を追求した中では 1306円
_  で出来る事が判明しましたが TELEC代が35%にもなります。
.
混信:モーションセンサーを 多数使用すると これまでに無い事ができます。ただし
_  WiFi を多数動作させると混信の問題が起きてきます。この件は検討課題です。
.


.

Written by macsbug

12月 8, 2016 at 7:24 am

カテゴリー: ESP8266

CH340 with EI Caption

leave a comment »

Mac OS X EI Caption で CH340 を試してみました。      2016.12.05

CH340 は OS X で使用する時に 認識されません。
「署名のないkernel extensions(kext)を実行できない」事から
始まっている様です。

これまで CH340 について 2回も書きましたが 未完成で申し訳ありません。
妙な内容で 今回も不十分と思われますが 備忘録として書きました。


.
EI Cartion では CH340 は 認識しません。 妙な方法ですが 以下の様にすると
認識して Arduino IDE で書込みが出来ます。

1. 接続しても CH340 は認識されません。例:WeMos D1 mini を接続。

2. WeMos D1 mini の 左上の Reset ボタンを押します。

3. 認識されます。ただし、Reset ボタンを離すと消えます。
_  認識には ほんの少し時間がかかります。このタイミングが重要、、。
_  指先が疲れますが 我慢して しばらく Reset ボタンは 押したままにします。

4. 「ボード情報を取得」を選択します。

5. ボード情報が表示されます。
_  名前は 名無しの権兵衛で 「不明なボード」です。
_  VID は 「1A86」。PID は「7523」 。これが CH340 の値です。
_  そして その下になにか書いてある、、。
_  意味が解りませんが 期待して 素直に 書いてある通りにします。

6. スケッチを書き込んでみます。
_  ここで Reset ボタンを離すのですが タイミングが 難しいです。
_  ボタンが 黄色になって コンパイル終了頃の 書き込む前に離します。
_  Reset ボタン は ESP8266 を停止状態にしますので
_  Reset ボタン を 押した状態では 書き込めません。
_  しかし 離すとマックが「署名が無い」と言ってくる ジレンマ。

7. なんと、いつもの白い字 が出た後に 赤い字 が進んでいます。
_  当たり前の事なのですが 新鮮に嬉しい 感じになります。

8. L チカ等 しっかり動きます。
_  でも もうこの時には USB の名前は 消えています。
_  しかし、変な方法ですね。
.


.
ボード情報:
_ CH340 が 認識されている時は システムリポートの USB情報にでてきます。
_ 5. での 値はこれと同じです。
_ 


.
感想:
たまたま書込みが出来たかの様な方法にも見えたり ハッキング的な方法とも
_ 思えるし 混乱させる記事かも、、。
_ 「ボード情報を取得」は 何をする為の物か 理解していませんが
_ 動いたので良しとします。
.
CH340 の対応策:なにかと問題を起こし 時間を浪費しますので
_ CH340 以外の モジュールを買う事にして 沢山発注しました。
_ サイト訪問者からの「乗り換え」の言葉に背中を押されました。
_ しかし、Arduino でも CH340 の物があり 本当に困っています。
.
疑問:
マックは USB に流れる電流を モニターしている。ハード的には 流れ過ぎた
_ 場合は ポリスイッチが スイッチ動作して 奥の回路の破損を防止する。
_ そのポリスイッチが自分で正常に戻るには時間がかかる。それでマックが
_ 動かなくなってから 数時間待ってください言う話がある訳です。
_ ソフト的にも何かをやっているはず。
.
接続した時に マックが USB ( +D か -D を調べる ) を調べ 不明のデバイスから
_ 信号が流れ 「署名が無い」という事で マックが怒ってカーネルパニックを
_ 起こすのでしょうか。そんな事で 〜気にせずに カーネルパニックを 起こさ
_ ず 通信して欲しいですけどね。
.
何故 Reset ボタンを押した状態でマックは CH340 のシリアルポート名
_ を知るのでしょうか? 恐らく CH340 の中に書いてあるから。
_ ESP8266 を停止しても USBを介して信号が流れているという事でしょうね。
_ つまり CH340 は 外付けクリスタルが動いていれば マックと通信していると
_ 言う事でしょうか?
_ こう考えると ハッキング対策にも見えてきます。

Written by macsbug

12月 5, 2016 at 11:27 am

カテゴリー: Arduino, ESP8266

Investigate Degrees Of Freedom

leave a comment »

ESP8266 で使用できる 加速度関係のセンサー部品を調査しました。 2016.12.04
.
単独のセンサーから統合されたセンサーまで 価格も含め 様々で
Accerelometer, Gyro, Magnetometer, Pressure(Atitude), Temp を調べました。
これにより 安価で多様な モーションセンサー を作る事ができます。


.
ワイヤレス・モーションセンサー装置 予想価格:1010円
_ MPU6500 ( 159円 ) + WeMos D1 mini ( 382円 ) + ESP-WROOM-02 TELEC ( 469円 )

センサー 結論:Cost欄 緑色3点。
安価:159円。MPU6500。スケッチ:FreeIMU

安価+機能 (Accerelometer, Gyro, Magnetometer):453円。MPU-9255

安価+高機能 (Accerelometer, Gyro, Magnetometer, Atitude):453円。GY86
_       ( MPU6050, HMC5883L, MS5611 )

メモ:Nomen の青色は試したモジュール。 2000円以上の製品は割愛しました。


.
D O F : Degrees Of Freedom

 Cost
(yen)
Nomen  IC wire Accere_
lometer
+-(G)
  Gyro
+-(dps)
Magnet
ometer
+-(uT)
,(g)
Pressure
(hpa)
 t
e
m
p
   memo
 159  MPU6500  MPU6500 I2C
SPI
2,4,8,16 250,500
,1000,
,2000
Replace
MPU6050
 172  GY-521  MPU6050 I2C 2,4,8,16 250,500
,1000,
,2000
 6DOF
Caution
C13=0.1μF
 453  MPU-9255 MPU-9255 I2C 2,4,8,16 250,500
,1000,
,2000
 4800 Replace
MPU9150
MPU9250
 588  MPU-9250 MPU-9250 I2C
SPI
2,4,8,16 250,500
,1000,
,2000
 4800  9DOF
 632  GY-91 MPU9250
BMP280
I2C
SPI
2,4,8,16 250,500
,1000,
,2000
 4800 300-
1100
25cm
 10DOF
 643  BMX055 BMX055 I2C 2,4,8,16  1300  9DOF
 687  GY-85 ITG3205
ADX345
HMC5883L
I2C 2,4,8,16 250,500
,1000,
,2000
 4800  9DOF
 827 MPU6050
HMC5883L
BMP180
MPU6050
HMC5883L
BMP180
I2C 2,4,8,16 250,500
,1000,
,2000
 4800 300-
1100
25cm
 10DOF
 850 L3GD20
LSM303D
BMP180
L3GD20
LSM303D
BMP180
I2C
SPI
2,4,8,16 250,500
,2000
 2,4,8,12 300-
1100
25cm
 10DOF
 924  GY-951 ATMEGA328
ITG3205
ADXL345
HMC5883L
I2C 2,4,8,16 250,500
,1000,
,2000
4800  9DOF
 924 L3G420D
LSM303D
BMP180
L3G420D
LSM303D
BMP180
I2C
SPI
2,4,8,16 250,500
,1000,
,2000
 2,4,8,12 300-
1100
25cm
 10DOF
 1124  GY-87 MPU6050
HMC5883L
BMP180
 I2C 2,4,8,16 250,500
,1000,
,2000
 4800 300-
1100
25cm
 10DOF
 1161  GY86 MPU6050
HMC5883L
MS5611
 I2C 2,4,8,16 250,500
,1000,
,2000
 4800 10-
1200
10cm
 10DOF
 1202  GY-52  MPU6050 I2C 2,4,8,16 250,500
,1000,
,2000
 6DOF
 1252  GY80 L3G420D
ADXL345
HMC5883L
BMP085
 I2C 2,4,8,16 250,500
,1000,
,2000
 4800 300-
1100
25cm
 10DOF
 1605  GY-9150 MPU-9150 I2C 2,4,8,16 250,500
,1000,
,2000
 1200  9DOF
 1641 GY-81-3205 ITG3205
HMC5883L
BMA180
BMP085
I2C 2,4,8,16 250,500
,1000,
,2000
0.88,1.3
,1.9,2.5,
4.0,4.7,
5.6,8.1
300-
1100
25cm
 10DOF
 1712  LSDM9DS0 LSDM9DS0 I2C
SPI
2,4,8,16 250,500
,1000,
,2000
 2,4,8,12  9DOF
 1729  GY-953  AHRS SPI row,
pitch,
roll,
yaw
250,500
,1000,
,2000
 9DOF
 2043  GY-86 MPU6050
HMC5883L
MS5611
I2C 2,4,8,16 250,500
,1000,
,2000
0.88,1.3
,1.9,2.5,
4.0,4.7,
5.6,8.1
10-
1200
10cm
 10DOF

.


.
国内価格 比較:結論、国内は高すぎて問題外です。

    Nomen          Type   ebay  SWITCHSCIENCE  aitendo  Strawberry-linux
 GY521  Acc+Gyro   172円  4992円  –  –
 MPU-9250  Acc+Gyro+Mag   588円  –  –  2000円
 GY-85  Acc+Gyro+Mag   687円  9367円  –  –
 GY-80  Acc+Gyro+Mag  1252円  –  3500円  –
 GY-9150  Acc+Gyro+Mag  1605円  2160円  –  2000円

.


.
感想:
遊び:3D で グリグリ回してみたい という発想です。
_  この分野の知識ゼロから始めましたので不十分な点もあるかと思います。
.
価格:
_ ebay と 国内価格の差には驚きます。国内の価格では ちょっと作るという
_ 価格ではありません。例として GY521 は 29個 も買える価格です。
_ GY-9150 ( MPU-9150 ) という対策品もありますがそれでも高いです。
.
モーションセンサー入門:Accerelometer, Gyro の2つだけですが
_ MPU6500 159円 で充分遊べます。ライブラリーやスケッチを体験すると
_ スケッチの充実で如何様にも安定し高機能のあるものが作れます。
_ 生データーはノイズやスパイクを含みカクカクした動作にもなります。
_ この為に 信号処理としてフィルターが必要です。
.
ワイヤレス:UDP通信 が便利です。
_ Communicate ESP8266 and iPad directly with UDP で示した方法は
_ 容易で便利です。
.
スケッチとライブラリー:最も重要な事。
_ センサーから 安定した信号の取得を行う事や フィルター機能は
_ 古いセンサーの方が多く 先人の努力により磨かれています。
.
センサーの表示:PC や マックで Processing言語
_ Processing言語 により既に作られた物が便利です。
_ 先人により作られた物があり そのまま使用するか変更や追加をしましょう。
_ Processing は 容易に扱える言語で PC に応じたアプリ化も可能です。

Written by macsbug

12月 4, 2016 at 1:47 am

カテゴリー: ESP8266

ESP32 with TELEC will be released.

leave a comment »

ESP32 の技適対応版が販売開始されました。             2016.12.03

Aliexpress で Official DOIT ESP32 Development Board と言う名前で
技適マークの付いた ESP-WROOM-32 の製品が販売されました。
技適番号は「211-161007」です。
販売業者は iHardware , InRobotics と Banggoodの3つです。
調査の為  iHardware へ注文しておきました。
.
iHardware:US$ 21.54:既に1 ORDERあり。

InRobotics:US$ 24.85:0 ORDER。

Banggood:2237円。:Pre Order が 63 個。
.
ORDER状況:12/04 AM9
iHardware = 2, InRobotics=2, Banggood=68。

.
技適番号と思われる番号は販売業者の写真からです。
販売業者のページには TELEC の事は表示されていません。
又 基板の裏に記載されている http://www.doit.am には 現在このBoard の
情報は書かれていません。


基板の違いについて:

.
Official DOIT ESP32 Development Board:
特徴:30ピン。縦の幅が1ピン分広い。
利点:技適対応有り。
利点:表に番号が書かれていている。
利点:右上のピン配置が D2,D15,GND,3V3 で I2Cボード(OLED)を直付可能。
弱点:ブレッドボードでの空きピンは1つしかない。
.
NodeMCU-32S:
特徴:36ピン。
利点:ブレッドボード上下に1ピンづつ空きがある。
弱点:表に番号が無く裏に番号が書かれていています。
弱点:技適対応無し。
.
Nano32:
特徴:40ピン。
利点:ブレッドボード上下に1ピンづつ空きがある。
利点:表に番号が書かれていてる。
弱点:技適対応無し。


まとめられているサイト:ESP32 the INTERNET of THINGS with ESP32.


ESP32 によるキーチェーンサイズの Game Boy Color:
_ 2016.11.5 パサデナ カリフォルニア州で Hackaday Superconference が行われ
_ 「SpriteTM Game Boy Programs」として Espressif // priteTM の Jeroen Domburg 氏
_ が説明されました。ビデオは 2016.11.28 に YouTube にアップされました。
_ The Tiniest Game Boy for Your Key Chain
_ 46分の内容は随所にノウハウ(部品, 画像, サウンド, メモリー交換)や意気込みも含め見応え
_ があります。本体の紹介は37分からで 最後にVNC方法や今後について話されていました。
_ 12月4日には 36298 の視聴数に達しました。


ESP8266の新情報。
ESP8266 は 通常 80MHz Clock であるが 非SDKアプリケーション開発手法によって
346MHz が可能との事。
是非やってみたいと思うが 私には高レベルでさっぱり解からず驚くばかりです。
しかしこれが出来れば ESP32 は買う必要は無いかも知れないと言う事になりますね。
cnlohr / nosdk8266


感想:
11月末に ある人から EspressifSystem の John Lee 氏への質問があり その回答は
_ TELEC 版は 私の担当でやっていますよと 言っていた記憶があります。
.
Game Boy Color を作られた Jeroen Domburg 氏の製作手法は電子工作の基本と応用で
_ 非常に参考になる内容でした。部品の選択は低価格が重要である事、無い回路は
_ 設計する事、画像処理の検討と試作と実験、ソフトウエアーでの努力、どれも
_ 素晴らしいレベルで感嘆致します。
.
現状:
ESP32への高速性の期待は大きいですが 周波数は現在のESP8266と同じです。
_ これでは ESP8266 と機能は同じで 価格が遥かに高いという事になります。
_ ダイレクト・ポートアクセスを検証しましたが ESP3266 より周波数が伸びていません。
_ 高速性をアピールするものが出て来ていますが Arduino IDE でのレベルではできません。
_ スタッフにより日々メインの部分が構築されています。
_ まだ、開発途上ですのでスタッフに期待したいと思います。応援しています。

Written by macsbug

12月 4, 2016 at 12:33 am

カテゴリー: ESP8266

CH340 kernel crash memorandum

with 2 comments

USB to serial chip CH340 は マックで カーネルクラッシュ を起こす。      2016.11.30

最新では CH340ドライバー 「CH34x_Install_V1.3.pkg」をインストールし
動作しているのが正常です。しかし私の場合 それでは認識しませんでした。
つまり ver 1.1「ch34xInstall.pkg」や ver 1.3「CH34x_Install_V1.3.pkg」を
インストールできないという不可解な現象。
私だけの現象かも知れませんが その解決方法を備忘録としました。

解決方法:古い  CH340ドライバー (2012.10.15) (左) を インストール後に
_    新しい CH340ドライバー (2013.12.25) (右) を インストールする。


 

使用環境:
iMac 27 Mid 2010 OS X 10.8.5 Mountain Lion。 Arduino IDE 1.6.13。


 

経緯:「とりあえず対策」で過ごす。
USB to serial chip CH340 を使用したモジュールは マックでカーネルクラッシュ
を起こす。原因不明の中で対策としてCH340を接続してからマックの電源を起動
すると CH340 を認識し使用するという恥ずかしい状態。
ところが 最近になり これも効かずカーネルクラッシュの嵐が発生しました。

過去にこの経緯から「CH340G USB Serial Module in OSX」を記載しましたが
解決はしていませんでした。

原因と思われる「usb.kext」をターミナルで削除するとカーネルクラッシュは
無くなりましたが 以下の2つのバージョンをインストールしても
「全く認識しない」という 悲惨な状態になりました。
_  CH341SER_MAC 2013年12月25日 「ch34xInstall.pkg」
_  CH341SER_MAC 2016年8月16日  「CH34x_Install_V1.3.pkg」


 

原因:
1. カーネルクラッシュの原因は usb.kext である。
_  場所は System/Library/Extensions/usb.kext にある。


 

対策:以下の3つ( usb.kext 削除, OLD Driver, New Driver Install ) を実施します。
1. usb.kext を削除する。
_  usb.kext を直接ゴミ箱へ捨てるか ターミナルを使用しコマンドを実行します。
_  sudo rm -rf /System/Library/Extensions/usb.kext
_  これにより System/Library/Extensions/ の中の usb.kext は無くなります。
_  マックを再起動します。

2. 古いドライバー「USB CH341/CH340 MAC OS32, MAC OS64」を入手する。
_  Модуль: CH340G にある USB CH341/CH340 MAC OS32, MAC OS64 を DL する。
_  確認:DLファイルの中にある ch34xInstall.pkg の日付は 2012.10.15 である。
_  ch34xInstall.pkg でインストールする。
_  System/Library/Extensions/ に usb.kext ができ ver は 1.1 です。
_   
_   
_  マックを再起動します。
_  Arduino IDE のシリアルポートは 「/dev/cu.wch ch341 USB=>RS232 fd1420」となる。
_ 
_  ただし この状態では Arduine IDE は コンパイルエラーがでます。

3. 新しいドライバー「CH341SER_MAC.ZIP」を入手する。
_  How To Use Cheap Chinese,,,Ch340G Serial/USB chip にある
_  CH341SER_MAC.ZIP を DL する。
_  確認:DLファイルの中にある ch34xInstall.pkg の日付は 2013.12.25 である。
_  ch34xInstall.pkg でインストールする。
_  System/Library/Extensions/ に usb.kext があり ver は 1.1.1 です。
_   
_   
_  マックを再起動します。
_  Arduino IDE のシリアルポートは 「/dev/cu.wchusbserialfd1420」となる。
_ 
結論:
_  マックの電源オン状態で CH340 を接続してもカーネルクラッシュは起きず
_  コンパイルも正常に行われる様になりました。


 

システムレポート:システムレポートによる USBの状態 は以下です。
_ 左:CH340:確かに名前の無いチープなUSBです。 右:CP2102。


CH340 を認識しない場合のハード的回避方法:CP2102 を介して読み書きする。

1. ESP-01 に書き込む方法:
_  nodeMCU Board の CP2102 を使用する。(nodeMCUは ebayで380円です)
_  NodeMCU のEN端子(青矢印)を GND に接続し nodeMCUを停止する。
_  Arduino IDE: “Generic ESP8266 Module” を選択し
_        Reset Method : “nodemcu” にする。

 nodeMCU  ESP-01  OLED
 EN = GND  –  –
 RX  RX  –
 TX  TX  –
 RST  RST  –
 D3(0)  GOPI 0  –
 3V3  CH_PD  SDA
 –  GPIO 2  SCL
 GND  GND  GND
 3V3  VCC  VCC


 

2. WeMos D1 mini に書き込む方法:
_  nodeMCU Board の CP2102 を使用する。
_  NodeMCU のEN端子(青矢印)を GND に接続し nodeMCUを停止する。
_  D1 mni CH340 の Pin 8 – 9 を Jumper ( Short ) し CH340 を停止する。
_   ( D1 mini X1:CH340 の X’tal を停止する為です)
_  Arduino IDE ツールの設定:”WeMos D1 R1 R2 & mini” を選択する。

 nodeMCU  D1 mini  OLED
 EN = GND  –  –
 –  CH340
pin 8 – 9 Short
 –
 RX  RX  –
 TX  TX  –
 RST  RST  –
 D3(0)  D3(GPIO 0)  SDA
 –  D2(GPIO 2)  SCL
 GND  GND  GND
 3V3  VCC  VCC

 

感想:CH340 は チープで 何かと疲れるチップです。
カーネルクラッシュの経緯:OSはSnowleopard の時は問題なく「/dev/cu.wchusbserialfd1420」
_ で使用できていました。OSをMountain Lion後に 徐々にカーネルクラッシュが起き始める。
.
認証:最近 safariブラウザーで幾つかのサイトにアクセスできなくなりました。
_ 代表的なものは Processing のサイトでこれが繋がらない為 極めて不便。(Sierra OSはOK)
_ たぶん Safari ブラウザーは セキュリティー機能強化の為だと思っています。
_ とりあえずは Google Chrome でしのいでいます。たぶん機能が甘いからかも知れません。
_ この問題は どうやらセキュリティーアップデートの件でアップルでの認証期限が切れた
_ 件の現象だと思っています。他にも時折「認証」文字がでてくる事が多くなりました。
_ これらは OSのバージョン と ブラウザー の組み合わせによるものと思われます。
.
CH340 搭載モジュール:カーネルクラッシュの場合 WeMos D1 mini や CH340 タイプの
_ nodeMCU は使用できなくなります。特に今まで作成した物が変更できなくなる事態。
_ OTA書き込み方法もあると思いますが USB接続が必要となる場面も多々あります。
_ この中国産の怪しいチップは本当にチープに感じます。安いですが手間がかかり
_ 困ります。それで最近は少し高くても CP2102製品 を購入しています。
_ ま〜 何はともあれ 解決してホットしました。
.
CH340 ドライバー:3つのバージョンがある。
_  v 1.1     :CH341SER_MAC  2012年10月15日 「ch34xInstall.pkg」
_  v 1.1.1  :CH341SER_MAC  2013年12月25日 「ch34xInstall.pkg」
_  v 1.3    :CH341SER_MAC  2016年  8月16日  「CH34x_Install_V1.3.pkg」
_  新しいバージョンとして「CH34x_Install_V1.3.pkg」があるが これを実行しても
_  CH340 を認識しませんでした。
_  OS X Yosemite や EI Captain での対応も必要らしい。
.
_  友人の情報では「CH34x_Install_V1.3.pkg」で問題なく動いているとの事。
_  私の場合 v 1.1 は インストールできるが v 1.1.1 はその後にタマにインストールできる。
_  そして v 1.3 は どうやってもインストールできない状態。
_  インストーラーが何故インストールできないのかは不明。
.
USBシリアル変換モジュール:秋葉で1000円位する物があり 結構高い製品だと感じました。
_ CP2102 の NodeMCU なら 300円台で買えますからね。
.
ネット情報:多くの記事がありますが 私の様な状況を一気に解決する記事は見受けられ
_ ませんでした。それは 恐らく一部の条件を前提に解決していたと思われます。
.
疑問:CH340 のドライバーは何処に入ったのでしょうか? usb.kext とも思われます。
_  usb.kext を削除しても CP2102 は動作しています。そうなるとCP2102 ドライバー
_  は どういう名前で何処に入っているのでしょうか?
_  他、過去に使用した USB の名前が残っており 消したいのですが 方法が解りません。
_

 

Written by macsbug

11月 30, 2016 at 2:22 am

カテゴリー: Arduino, ESP8266

Communicate ESP8266 and iPad directly with UDP

leave a comment »

ESP8266 と iPad を UDP で 直接通信する方法。              2016.11.20

直接通信は インターネット無しで 接続が可能です。特に外出時に便利です。
相手側は ESP8266 や PC でも直接通信が可能になります。
既に ネット上で解説記事がありますが 備忘録として まとめました。

便利な直接通信:
以前の記事「Display the graph on the iPad」でセンサーの値を ネットワーク
経由 ( 家庭内LAN経由 ) iPadで受信し 表示する方法がありました。
しかし 目の前にある装置に ネット経由で接続する必要は無い事と 外では
無線環境が無い事や ネット経由で簡単に通信が出来ない 場合があります。
.
そこで ESP8266 と iPad を 直接通信する事により ネット環境が無くとも
接続が可能になります。さらに 通信費用もかかりません。
ESP8266 (192.168.4.1:9000) → iMac(192.168.4.2:9000) : IP,PORT
ESP8266 (192.168.4.1:7000) ← iMac(192.168.4.2:7000) : IP,PORT

フィードバックの必要性:
装置間の通信は 相手が指示通りの状態になったか 確認が必要です。
送信後に 相手の結果 を受信する必要があり 通信が回転します。



 

ESP8266 の設定: WiFiUDP を使用し PORT を設定する。

// ESP8266
#include <ESP8266WiFi.h>                 // WiFi
#include <WiFiUDP.h>                     // UDP
const char *ssid = "wifi";               // SSID
const char *pass = "";                   // PASSWORD
static WiFiUDP udp;                      // UDP Object
#define ESP_RX_PORT 7000                 // ESP Receiver port
#define ESP_TX_PORT 9000                 // ESP Transmit Port
IPAddress ESP_IP;                        // ESP IP 192.168.4.1
IPAddress EXT_IP;                        // ext IP 192.168.4.2
char buff[32];                           // receive buffer

void setup(){
 WiFi.mode(WIFI_AP);                     // AP Mode:direct connection
 WiFi.softAP(ssid, pass);                // ESP8266:SSID, password
 ESP_IP = WiFi.softAPIP();               // 192.168.4.1 localIP
 udp.begin(ESP_RX_PORT);                 // ESP:UDP Rx port=7000


 

iPad の設定: socket を使用し IP と PORT を設定する。

// iPad
import socket
HOST, PORT = '192.168.4.1', 7000          # ESP8266 ip,port
rx = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
rx.bind(('192.168.4.2', 9000))            # ipad tx port
tx = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)


 

ESP8266 から 送信する。

// ESP8266 transmitt
String data = "t/0/0/0";                  // 送信データ
udp.beginPacket(EXT_IP, ESP_TX_PORT);     // Packet transmit
udp.print(data);                          // data   transmit
udp.endPacket();                          // end of transmit

iPad で 受信する。

// iPad receiver
udp udp_receiver('')                     # ipad を受信状態にする
while mode != 'd':                       # 受信データの中味を確認する

udp_receiver('1')                        # 音声出力時の為の socket を遮断する

def udp_receiver(s);                     # udp 受信ルーチン
 gloval rx, d1, d2, temp, humi           # 共通変数
 if s == "1": rx.setblocking(1)          # socketの遮断をする
 d1 = str(rx.recv(32), 'utf-8')          # rx : socket を受信する
 d2 = d1.split('/')                      # '/' で区切られたデータを d2[] に一括保存する
 mode = d2[0]                            # 受信データの先頭 [0]
 if mode == "d":                         # 先頭データが "d" の場合の処理をする
  temp = round(float(d2[1]), 1)          # 受信データの分類その1
  humi = round(float(d2[2]), 1)          # 受信データの分類その2


 

iPad から 送信する。

// iPad transmitt
udp_transceiver('1')                      # ipad -> ESP8266   '1' を送信する
udp_receiver('1')                         # '1' に対する ESP8266 の返事を受信する
ret = str(mode) + str(sw)                 # 受信したデータ
while (ret) != 't1':                      # 't1' の場合の処理をする

def udp_transceiver(s);                   # udp 送信ルーチン
 global tx, HOST, PORT                    # 共通変数
 tx.sendto(bytes(s,'utf-8'),(HOST,PORT))  # データ s を送信する

ESP8266 で 受信する。

// ESP8266 receiver
int rx = udp.parsePacket();              // Packet 受信状態を調べる
 if (rx) {                               // 受信がある場合の処理をする
  int len = udp.read(buff,rx);           // 受信(buff)の長さを調べる
  if (len>0)buff[len] = '\0';            // 受信がある場合の処理をする
   ipad_RX_IP = udp.remoteIP();          // iPad IP 192.168.4.2
   buff[len] = '\0';                     // Termination charactor
   int c = buff[0];                      // header:受信データの先頭
   if ( c == '1' ){                      // header:受信データの先頭
                                         // 受信データの処理をする


 

感想:
無線環境:目の前にある装置にインターネット経由で接続する必要は
_ 無い事とネット回線の無い所でも自由に接続して使用できる訳で
_ す。
.
IP アドレス:最初は 192.168.4.2 が自動的に割り振られます。
_ もう一台追加すると 192.168.4.3 が 割り振られます。
.
フィードバックの重要性:温度測定程度ならフィードバックは必要
_ ないかも知れませんが IoTで遠隔操作や特に電力をコントロール
_ する時はかならず必要です。航空機では2重3重の回路やソフト
_ がありフィードバックも含め 安全性が確保されています。
_ この様な視点で IoT 製品がどの程度 安全な製品であるかを仕様
_ として表示していない場面が多いのを見受けます。
_ 又 その商品を説明するメディアや記事も同様です。
.
ワイヤレス:直接通信の例として 3軸アクセレーターやジャイロの装置
_ から データをWiFiでPCに送り PCの画面に表示ができる様になり
_ ワイヤレスの小型モーションセンサー等が出来ます。
_ こうした装置のワイヤレス環境はなかなか面白い感覚です。次回!
_  



Written by macsbug

11月 20, 2016 at 10:00 am

カテゴリー: ESP8266

Digital Compass HMC5883L with ESP8266

leave a comment »

ESP8266 + HMC5883L で デジタル・コンパス を作りました。           2016.11.15

HMC5883L は 3軸地磁気センサー です。費用は 927円です。


 

Processing によるマック上での表示。(スケッチ:HMC5883L_processing)


 

準備:費用=927円   : 円レートで価格が変動します。2016.11.15 現在(1$ 107.85)。

No.  Nomen  Link  Price(円)  Memo
01 WeMos D1 mini *  D1 Mini 347  1個 C 4.34
02 HMC5883L  HMC5883L 262  1個 GBP 1.94
03 1.4″ 128X120 SPI Color TFT  1.44″ Color TFT 318  1個 C 3.98
04 チップ抵抗 10KΩ  4個  –
05 カプトンテープ  –  –
05 両面テープ  –  –
06 Library:HMC5883L Arduino-HMC5883L jarzebski氏に感謝
07 設定:magnetic declination  地域の設定  –
08 校正  HMC5883L_calibrate  –

.
* WiFi.mode(WIFI_OFF);:この命令で送信電波を停止し without TELEC にします。
.
1.44″ TFT:Ver 1.1, V1.4, V2.1 があります。基板の裏に記載してあります。購入者
_ からは選択ができなく どれが来るか解りません。おおまかにはイニシャライズ
_ によって画素の位置が変わります。今回のスケッチは 宣言文で Ver A,C を選択
_ する事により対応できる様にしてあります。調べるとかなり奥が深いです。
_ 1.44″ でなく 1.8″ TFT を使用する方法が得策です。
.
HMC5883L ( GY-273 ):VCC=3.3V, SDA,SCLは 3.3V入力です。DRDYは使用しません。
_ 回路図参照の事。回路図に誤記あり:詳細は参照の*に記載。


 

配線:TFT基板は 3.3V使用の為 基板上の U1 LDO(5V to 3.3V) の J1 Jumper は
_  ジャンパーをします。(しなくても動作します)
_  チップ抵抗4個は TFT基板の上にカプトンテープを敷きハンダ付けします。
_  D1 mini は両面テープで TFT基板に直付けし 11本の配線をします。


 

地磁気センサーの設定:TFTの表示と地磁気センサーの向きを合わす必要があります。
_ 方位磁石やスマホの方位計を参照し 針とN極の方向を合わせ 基板に磁気センサー
_ を固定します。


 

地磁気センサー:
低価格と動作確認済みの中から HMC5883L(GY-273) を使用しました。
GY-85(HMC5883L) も動作確認しましたので使用できます。
3軸地磁気センサー( Magnetic ) は 以下の物があり 価格は高いですが GY-9150 や
GY-85 は Gyro, Acclerometer を含み  他の応用が可能となります。
MAG3110 は 値の幅が狭く正しい値が取れない為に 課題とします。


 

ライブラリー HMC5883L:magnetic-declination 値 と 校正値の設定。
_ HMC5883L ライブラリーは 複数ありますが 動作しない物があります。
_ 設定値:magnetic-declination.com の値を設定します。
_  Find the magnetic declination at your location に接続し magnetic-declination
_  を入手。東京の場合は  「-7’25E (negative)」 で 以下のスケッチになります。
_  float dec_angle=(-7+(25.0/60.0))/(180/M_PI); // Tokyo:-7.25
_ 校正値:ライブラリの中にあるサンプル「HMC5883L_calibrate」を実行。
_  以下のスケッチになります。
_  compass.setOffset(32, -202); // Set calibration offset
_ 感度:HMC5883L_RANGE_1_3GA を使用しています。*=同文
_  HMC5883L_RANGE_8_1GA : 8.1 Ga 4.35 mG 230 Lsb/gauses
_  *5_6GA : 5.6 Ga 3.03 mG 330,*4_7GA : 4.7 Ga 2.56 mG 390
_  *4GA : 4 Ga 2.27 mG 440,*2_5GA : 2.5 Ga 1.52 mG 660
_  *1_9GA : 1.9 Ga 1.22 mG 820,*1_3GA : 1.3 Ga 0.92 mG 1090 : default
_  HMC5883L_RANGE_0_88GA : 0.88Ga 0.73 mG 1370
_ レンジ:3つ:HMC5883L_SINGLE を使用しています。
_  HMC5883L_IDLE, HMC5883L_SINGLE,HMC5883L_CONTINOUS
_ 計測モード:HMC5883L_DATARATE_30HZ を使用しています。
_  HMC5883L_DATARATE_75HZ, *30HZ,*15HZ, *7_5HZ,*3HZ, *1_5HZ
_ サンプルアベレージ:HMC5883L_SAMPLES_8 を使用しています。
_  HMC5883L_SAMPLES_8, *4,*2,*1


 

参考:
haoyuelectronics:Index of /Attachment/GY-273:モジュール回路図
_  * この回路図はピン番号がずれています。1,2,3,4,5 は 1,5,2,3,4 です。
Axis_Compass_Magneticfield_Module-SCHEMATIC:モジュール回路図
_  SDA,SCLにPull_up 抵抗の無い回路図です。
Henny’s Bench:Arduino GY-273 HMC5883L Magnetometer Compass Tutorial
I2Cdevlib:HMC5883L Class Reference
dev/jarzebski:3-osiowy magnetometr HMC5883L
Manualzz:29133-CompassModuleHMC5883L-v1.0
HMC5883L_3-Axis_Digital_Compass_IC
simtronyx-:Digitaler Kompass: HMC5883L(GY-271),TFT(HY-1.8)
HMC5883L 製作マニュアル:秋月さんのページから。
HMC5883L 半導体資料:秋月さんのページから。
秋月:HMC5883L DIP, HMC5883L / HMC5883L モジュール・データシート
Strawberry Linux:HMC5883L


 

感想:
コンパスの凄さ:子供の頃 初めて手にした丸いコンパス を回して遊んだものです。
_ その時 目に見えない磁力で方向が解る事が不思議でした。 現在 電子コンパス
_ を個人で作れる時代になりました。
部品価格:国内での価格は相変わらず高いです。4桁には驚きます。
_ ebay:HMC5883L:262円。
_ 秋月:HMC5883L DIP KIT:600円
_ aitendo:デジタルコンパスモジュール [ATD5883L]:695円
_ Strawberry Linux:HMC5883L:700円
_ スイッチサイエンス:HMC5883L:1868円
_ 
地磁気センサーとライブラリー:価格では HMC5883L を 選択。ライブアリーは
_ Arduino-HMC5883L を選択。jarzebski氏に感謝致します。
_ 地磁気測定は要素が多く 設定や校正等も必要です。
周囲の磁力:磁力の付いた物を近づけると針が回る感度があります。
ESP8266の端子:GPIO15はスケッチ書込みの為に Low です。Hi を出力する物は
_ 接続できません。CS 信号は接続可能で書込み時のエラーも回避できます。
GY-85, GY9150:Gyro とAccelero Meter のチップが搭載されていますので これを
_ 使用した物が直ぐ作れる環境になり 3次元の位置情報や加速度を楽しめます。
Processing :ライブラリーにある Processing でのスケッチは大変助かりました。
_ 完成度の高い表示は 素晴らしいですね。再び jarzebski氏 に感謝致します。


 

スケッチ:

// Digital Compass                             // 2016.11.12 macsbug
// ESP8266 + HMC5883L + 1.44" Color TFT        //
//--------------------------------------------------------------------
// http://www.jarzebski.pl/arduino/czujniki-i-sensory/3-osiowy-magnetometr-hmc5883l.html
// https://github.com/jarzebski/Arduino-HMC5883L  Arduino-HMC5883L
// https://www.youtube.com/watch?v=zG3uzQW3wc0
// Digital Compass: HMC5883L (GY-271), 1.4" SPI TFT (HY-1.8)
// http://blog.simtronyx.de/digitaler-kompass-hmc5883l-gy-271-tft-hy-1-8-und-ein-arduino/
// http://www.ngdc.noaa.gov/geomag-web/#declination : Magnetic Field Calculators
//--------------------------------------------------------------------
// Find yours here: http://www.magnetic-declination.com/
// Tokyo:
// Latitude: 35° 41' 22.2" N
// Longitude: 139° 41' 30.1" E
// Magnetic declination: -7° 25' 
// Declination is NEGATIVE (WEST)
// Inclination: 49° 32' 
// Magnetic field strength: 46597.1 nT
//--------------------------------------------------------------------
// Set declination angle on your location and fix HDG
// You can find your declination on: http://magnetic-declination.com/
// (+) Positive or (-) for negative
// Tokyo declination angle is -7'25E (negative)
// Formula: (deg + (min / 60.0)) / (180 / M_PI);
// float dec_angle = (-7 + (25.0 / 60.0)) / (180 / M_PI);
// TFT 128x128 : x = 1 to 127, y = 0 to 127
//--------------------------------------------------------------------
#include <ESP8266WiFi.h>                        // ESP WiFi
#include <Wire.h>                               //
#include <SPI.h>                                //
#include <HMC5883L.h>                           // HMC5883L
#include "Adafruit_GFX.h"                       // Adafruit Grafic
#include "Adafruit_ST7735.h"                    // Adafruit ST7735
#define CS    D8                                // TFT CS  : D0 = 16
#define RST   D2                                // TFT RST : D2 =  4
#define DC    D1                                // TFT DC  : D1 =  5 
#define SCLK  D5                                // TFT SLCK: D5 = 14 
#define MOSI  D7                                // TFT MOSI: D7 = 13 
Adafruit_ST7735 tft 
  = Adafruit_ST7735( CS, DC, MOSI, SCLK, RST);  // TFT
HMC5883L compass; 
int pre_HD = 0;
float HD = 0;                                   // Heading new
float HD_old = 360;                             // Heading oled
uint16_t cx, cy;                                // center x,y
const uint16_t rad = 64;                        // radius of length
const float deg = 2 * PI / 360;                 // radian to degree
uint16_t osx, osy;
//String v = "A";                               // TFT ver A : V1.1
//String v = "B";                               // TFT ver B : V1.4 ?
  String v = "C";                               // TFT ver C : V2.1

void setup(void){
  WiFi.mode(WIFI_OFF);                          // without TELEC
  Serial.begin(115200);Serial.println();        // 
  Wire.begin(D4, D3);                           // HMC5883L SDA,SCL,D4,D3
  while (!compass.begin()){delay(500);}         // Initialize HMC5883L
  compass.setRange(HMC5883L_RANGE_1_3GA);       // Set measurement range
  compass.setMeasurementMode(HMC5883L_CONTINOUS);//Set measurement mode
  compass.setDataRate(HMC5883L_DATARATE_30HZ);  // Set data rate
  compass.setSamples(HMC5883L_SAMPLES_8);       // Set number of samples averaged
  compass.setOffset(32, -202);                  // Set calibration offset
  //--------------------------------------------// See HMC5883L_calibration.ino
  if (v == "A"){tft.initR(INITR_144GREENTAB);}  // 1.44 v1.1
  if (v == "C"){tft.initR(INITR_18GREENTAB);}   // 1.44 v2.1 
  tft.fillScreen(ST7735_BLACK);                 //
  tft.setTextColor(0x5FCC);                     // GREEN
  tft.setRotation(1);                           //
  //--------------------------------------------//
  cx = tft.width()/2; cy = tft.height()/2;      // Center Calculate
  if (v == "C" ){ cx = cx + 14; }               //
  osx = cx; osy = cy;                           //
  face();                                       // indicator face
}

void loop(void){
  Vector norm = compass.readNormalize();        // data read
  float HDG = atan2(norm.YAxis, norm.XAxis);    // Calculate HDG
  float dec_angle=(-7+(25.0/60.0))/(180/M_PI);  // Tokyo:-7.25
  HDG += dec_angle;                             // heading data
  if (HDG < 0   ){HDG += 2 * PI;}
  if (HDG > 2*PI){HDG -= 2 * PI;}
  float fixeds_HD = HDG * 180/M_PI;             // Convert to degrees to fix
 
  int smooth_HD = round(fixeds_HD);             // Smooth angles +/- 3deg
  if (smooth_HD < (pre_HD + 3) &&
      smooth_HD > (pre_HD - 3)){
      smooth_HD = pre_HD;
  }
  pre_HD = smooth_HD; HD = smooth_HD;
  Serial.print(norm.XAxis);Serial.print(":");   // Output to processing
  Serial.print(norm.YAxis);Serial.print(":");
  Serial.print(norm.ZAxis);Serial.print(":");
  Serial.print(HD);Serial.print(":");
  Serial.print(fixeds_HD );Serial.print(":");
  Serial.print(smooth_HD);Serial.println();
  delay(30); // One loop: ~5ms,115200,delay ~28ms:allow data rate 30Hz (~33ms)

  if(HD != HD_old){
    indication_Triangle();                      // Triangle indication
  //indication_Line();                          // line     indication
    indication_Dot();                           // dot      indication
    HD_old = HD;                                // old HD save
  }
  delay(250);
}

void face(){
  uint16_t xd,yd;
  tft.fillScreen(ST7735_BLACK);                 // Dsplay Clear
  tft.fillCircle(cx, cy, rad-2, 0x3CDF);        // BLUE  Ring
  tft.fillCircle(cx, cy, rad-5, 0x0000);        // BLACK
  tft.setTextSize(1);
  tft.setTextColor(ST7735_WHITE);
  xd = cos(-90 * deg) * (rad - 11) + cx;
  yd = sin(-90 * deg) * (rad - 11) + cy;
  tft.setCursor(xd-1, yd-1);tft.println("N");   // N
  xd = cos(  0 * deg) * (rad - 11) + cx;
  yd = sin(  0 * deg) * (rad - 11) + cy;
  tft.setCursor(xd-3, yd-3);tft.println("E");   // E
  xd = cos( 90 * deg) * (rad - 11) + cx;
  yd = sin( 90 * deg) * (rad - 11) + cy;
  tft.setCursor(xd-1, yd-5);tft.println("S");   // S
  xd = cos(180 * deg) * (rad - 11) + cx;
  yd = sin(180 * deg) * (rad - 11) + cy;
  tft.setCursor(xd-0, yd-2);tft.println("W");   // W
  for (int i = 0; i < 360; i += 30) {           // 12 point
    xd = cos((i - 90) * deg) * (rad - 5) + cx;
    yd = sin((i - 90) * deg) * (rad - 5) + cy;
    if ( i ==   0 ){ xd = xd + 1;}
    if ( i == 180 ){ xd = xd + 1;yd = yd + 1;}
    if ( i == 270 ){ yd = yd + 1;}
    tft.drawPixel(xd, yd, 0xFFFF);              // pixel ring
  }
  if ( v == "A" ){ apple_icon( 1,1);}           // apple icon
  if ( v == "C" ){ apple_icon(31,1);}           // apple icon
}
void apple_icon(int px,int py){                 // apple icon
  tft.drawLine(6+px, 1+py,7+px, 1+py,0x07E0);
  tft.drawLine(5+px, 2+py,6+px, 2+py,0x07E0);
  tft.drawLine(5+px, 3+py,5+px, 3+py,0x07E0);
  tft.drawLine(2+px, 4+py,8+px, 4+py,0xFFE0);
  tft.drawLine(1+px, 5+py,9+px, 5+py,0xFFE0);
  tft.drawLine(1+px, 6+py,7+px, 6+py,0xFD24);
  tft.drawLine(1+px, 7+py,7+px, 7+py,0xFD24);
  tft.drawLine(1+px, 8+py,9+px, 8+py,0xF800);
  tft.drawLine(1+px, 9+py,9+px, 9+py,0xF800);
  tft.drawLine(2+px,10+py,8+px,10+py,0x3CDF);
  tft.drawLine(3+px,11+py,4+px,11+py,0x3CDF);
  tft.drawLine(6+px,11+py,7+px,11+py,0x3CDF);
}

void indication_Triangle(){
  int cr = 41; float r = M_PI/180;
  float h1 = HD_old;
  tft.fillTriangle(                              // analog clear
    cx-cr*cos(r* h1   ),cy+cr*sin(r* h1   ),
    cx+cr*cos(r*(h1+5)),cy-cr*sin(r*(h1+5)),
    cx+cr*cos(r*(h1-5)),cy-cr*sin(r*(h1-5)),
    ST7735_BLACK);
  float h2 = HD;
  tft.fillTriangle(                              // analog draw
    cx-cr*cos(r* h2   ),cy+cr*sin(r* h2   ),     // x0,y0
    cx+cr*cos(r*(h2+5)),cy-cr*sin(r*(h2+5)),     // x1,y1
    cx+cr*cos(r*(h2-5)),cy-cr*sin(r*(h2-5)),     // x2,y2
    ST7735_RED);
  float d1,d2;                                   // deg decode
  if ((h1<=360)&&(h1>=90)){d1=90*((h1/90)-3);}   // 90-270:-180-  0
  if ((h2<=360)&&(h2>=90)){d2=90*((h2/90)-3);}   // 90-270:-180-  0 
  if ((h1<= 90)&&(h1>= 0)){d1=90*((h1/90)+1);}   //  0- 90:+180- 90
  if ((h2<= 90)&&(h2>= 0)){d2=90*((h2/90)+1);}   //  0- 90:+180- 90
  int xa = 103; if (v == "C" ){ xa = 135;}
  set_text(xa, 1, String(int(d1)), 0x0000, 1);  // digital clear
  set_text(xa, 1, String(int(d2)), 0x5FCC, 1);  // digital draw
  tft.fillCircle(cx, cy, 7, ST7735_RED);         // Circle r = 6
  tft.fillCircle(cx, cy, 3, ST7735_BLACK);
//apple_icon(64-5,64-5);
}
void set_text(int x,int y,String text,
              uint16_t color,byte size){
  tft.setTextSize(size);  tft.setCursor(x,y);
  tft.setTextColor(color);tft.print(text);
}

void indication_Dot(){
  uint16_t xa,ya,xb,yb;
  int h1 = HD_old - 90;
  int h2 = HD - 90;
  xa = sin(h1 * deg) * (rad - 8) + cx;          // ring old x
  ya = cos(h1 * deg) * (rad - 8) + cy;          // ring old y
  xb = sin(h2 * deg) * (rad - 8) + cx;          // ring new x
  yb = cos(h2 * deg) * (rad - 8) + cy;          // ring new y
  tft.fillRect(xa, ya-1, 3, 3, 0x0000);         // 9 dot clear
  tft.fillRect(xb, yb-1, 3, 3, 0x07E0);         // 9 dot draw
}

void indication_Line() {
  float h = HD - 90;
  float sx = sin(h * deg) * (rad - 18) + cx +1;
  float sy = cos(h * deg) * (rad - 18) + cy;
  tft.drawLine(osx, osy, cx, cy, 0x0000);       // Erase old positions 
  tft.drawLine(sx,  sy,  cx, cy, 0xFFFF);       // Draw  new positions           
  tft.fillCircle(cx, cy, 3, 0xFFFF);            // r = 3 Circle
  osx = sx; osy = sy;                           // Update x & y coords
}

Written by macsbug

11月 13, 2016 at 3:27 am

カテゴリー: ESP8266