WEMOS XI、ちょっぴり高機能なArduino互換機

WEMOS XI、ちょっぴり高機能なArduino互換機

Aliexpessを巡っていたら WEMOS XI という Arduino Pro mini 互換機を偶然見つけました。
コアはLGT8F328DというATmega328Pに似たチップのようです。
中華製のクローンのようですがDACとかがついているので少し高機能です。

WEMOS XI、ちょっぴり高機能なArduino互換機

スポンサーリンク

概要

WEMOS XI トップビュー

Aliexpressで売ってましたので、早速購入してみました。

普通の Arduino Pro Mini との大きな違いは以下のとおりです。

  • 16MHzの内蔵発振器(コアは32MHzまでいけるようです)
  • 8bit DAC 2ch搭載
  • 12bit ADC 8ch搭載

個人的にはDACがついているのが魅力的でしょうか。
「すごい便利!」とはなりませんが、1個あたり約170円と安いので Arduino Pro mini を買うよりはいいかもしれません。
命令等はほぼAVRと同じですので、特に勉強せずに内部プログラムが理解できるのも良い点だと思っています。

まだまだ情報が少なすぎて、簡単に使えるだけの状態になっています。
ライブラリはあるものの説明がほとんど無いですし、フォーラムも活発ではないです。

実際に使ってみる

ポチってから2ヶ月ほどして届きました、思ったより待たされました・・・
とりあえず2個買いました(笑)
 WEMOS XI 2つ
ピンヘッダは普通のやつが付属してありましたが、細ピンヘッダをつけました。
あと最初にPOWERのLEDがつかなかったので不良かなと思ったのですが、はんだジャンパがうまくいってなかっただけでした。

使うにはIDEに WEMOS XI のパッケージをインストールする必要があります。
GitHubから WEMOS XI 用のパッケージをダウンロードしてhardwareフォルダに入れます。

そして一番の魅力だと思っているDACのサンプルを試してみます。
DACは四角で囲っているピン、デジタル4ピンとPE5ピン(基板には「E5」と記載)で使用可能です。
それぞれDAC0とDAC1と定義されています。
以下はPE5ピンでランプ波を出力するスケッチです。

unsigned char value = 0;

void setup() {
  analogReference(INTERNAL2V56);
  pinMode(DAC1, ANALOG);
}

void loop() {
  analogWrite(DAC1, value);
  delay(1);
  value++;
}

これを書き込むと出力はこんな感じになりました。
Wemos Xのアナログ出力(DAC)
ちょっと直線ではないような、DACってこんなものなんでしょうか・・・
完全にオマケ機能ですね、精度を要するところには使えなさそうです。

DACはanalogReferenceで基準電圧を変えているようで、INTERNAL2V56 なら最大電圧は2.56V、それ以外なら最大電圧は1.25Vになります。

PORTEのピン配置

PORTEというポートが追加されましたが、説明がないのでどこが該当するか探しました。
こんなのICのデータシート見ないとわかりません・・・

PORTE 配置
PE0 C (1.27mmピッチの端子)
PE1 A6 (ADC6)
PE2 D (1.27mmピッチの端子)
PE3 A7 (ADC7)
PE4 E4
PE5 E5
PE6 AREF

PE1とPE3はATmega328P-AUではアナログ入力しかできなかったところがデジタル入出力でも使えるようになっているということです。
AREFピンはちょっとレジスタをいじる必要があり、標準では使えるようになっていませんでした。
IOCRというレジスタで設定するようです。
また、PE4とPE5はちゃんと端子として出ているのでわかります。(概要にある写真を見てもらうとわかりやすいです)
分りづらいのがPE0とPE3で、「1.27mmピッチの端子」というのは下の写真の緑色で囲った部分になります。
1.27mmピッチの端子
「R, C, V, D, G」は「RESET, PE0, VCC, PE2, GND」に該当します。
どこかに書いておいてくれないと分からないですよ、これ。

ADC(アナログ入力)の分解能を12bitにする

ADC(アナログ入力)は12bitだと期待していたら、初期では10bitになっていました。
中身を見てみたら、なぜか2bit右シフトしているという・・・
そこで12bitが使えるように analogReadResolution という関数を自前で追加しました。

使い方はsetup関数のなかで analogReadResolution(12); と書くだけで分解能が12bitになります。
引数に「12」以外を入れると勝手に10bitになるようになっています。
以下は analogReadResolution を使ったスケッチです。

uint16_t value;

void setup() {
  Serial.begin(115200);
  analogReadResolution(12);
}

void loop() {
  value = analogRead(A0);

  Serial.println(value);
  delay(10);
}

なぜコアファイルの中で無理やり10bitに下げているのか理解できません。
せっかくのメリットが使えないじゃないですか・・・

もっと使えるように・・・

今回自分なりに変更したファイルを含んだものを上げておきますので、機会があれば使ってみて下さい。
変更した点以下の通りとなります。

  • AREFピンをデジタル入出力(E6)として使えるようにしました。
  • analogReadResolution を追加し、12bitのADCが使えるようにしました。

本当はあともう1つの魅力である内臓の32MHz発振器を使いたかったのですが、うまくいかず悩み中です。
デフォルトで分周されて16MHzになっていてこれまた変な感じです。
うまいこといけば追記しようと思います。

WEMOS XI、ちょっぴり高機能なArduino互換機

スポンサーリンク

Leave a Comment