fumiLab

fumimakerが作ったもの、やったことについて書いていきます。

超小型Arduino互換ボードSeeeduino XIAOの使い方

f:id:fumimaker:20200422003044j:plain
XIAO

超小型Arduino互換ボード:Seeeduino XIAOを動かす

秋月で最近発売された超小型Arduino互換ボードのXIAOを動かしてみます。(物自体はマルツとか共立でも1ヶ月前くらいから売ってたみたいだけどね)めっっっっっっちゃ小さいんですこれ。そんでもってそこそこ強い32bitCPU(ARM CortexM0)が乗ってて、フラッシュもいっぱいあって、安いしもうおそるべしチャイナパワーって感じ。ESPといい,最近の中国製品ほんとすごい...どうしたらそんなものが売れるの...って感じ.ちなみにXIAOは中国語で「小」という意味があります。(Maker界隈は中国語少しでもやっとくと役に立つことが多いのでお勧め)名前だけあって、たったの2cmの小型サイズ.なのにちゃんとUSB-Cついててつないでサクッと開発できる。めちゃ便利だなと思ってみてたら家に届いてました。おかしいなぁ.

f:id:fumimaker:20200422004125j:plain
秋月に登場
f:id:fumimaker:20200422003539j:plainf:id:fumimaker:20200422003641j:plain
ちっちゃくて可愛い!
スペックを簡単に書いておきます。

  • ARM Cortex M0+ 搭載
  • 32bitCPU 48MHz(SAMD21G18)
  • Flash 256KB
  • SRAM 32KB
  • 超小型20mm*17.5mm
  • IOいっぱい(UART, I2C, SPI, DAC, ADC×10, PWM×10, Digital×11, Analog×11)
  • バッテリー電源用PADあり
  • USB Type-Cコネクタ搭載
  • IOは3.3V

もう全部これでいいんじゃないかなっていうモリモリなマイコンボード。これが500円で手に入るんだからたまげたなぁ…。自作キーボード、ウェアラブルバイスとかの組み込み開発にとってもよさそう。こんなに豊富なリソースを見せつけられちゃったら普通のArduino MiniとかNanoとかMicroは立場なくなっちゃなこれ...。Amazonで格安Nanoが手に入るので普段はそれをよく使ってるけどこれに乗り換えてもいいかもしれないですね。

f:id:fumimaker:20200422003616j:plain
みんな大好きパチモンのNanoと大きさ比較
Type-Cでつながって開発できるってのは最高にいかしてるよね。今風でとても良い。当方はMacでの開発が多いのでとてもありがたい。MicroBはよくもげるのでType-Cに移行していってほしいもんですね。

とりあえずLチカしてみる

当方はMacで説明しますが、Windowsでもほとんど変わらないんので参考に進めてみてください。

開封

かわいい。お菓子の袋みたいだね。柿ピーとかと変わらない。間違って食べそう。シールがついてくるのでわからない人は貼っておきましょう。 f:id:fumimaker:20200422004335j:plain

USB Type-CコネクタとPCを接続

この記事見るような人であればUSB Type-Cケーブル持っていないひとなんていないと思いますけど、USB Type-Cという新しいコネクタが採用されていますので従来のMicroBなどは刺さりません。持ってない人は勝っておきましょう。接続するとPowerLEDが付き、もともと書き込まれているLチカが動き始めます。

f:id:fumimaker:20200422003719j:plain
接続

ArduinoIDEを起動

XIAOを開発するためにはArduino IDEを使います。持っていない人はArduino IDEをインストールしてください。 ArduinoIDEはここからダウンロードできます.

www.arduino.cc

ボード情報を登録

そのままだとArduino純正ボードしか認識されないので互換ボードも認識されるようにします。

ファイル==>環境設定を開きます。追加ボードマネージャのURLという欄があるのでそこに

https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json

と入力しOKをクリック。環境設定をOKで閉じます。 f:id:fumimaker:20200422005238p:plainf:id:fumimaker:20200422005243p:plain

私の場合はESP8266やESP32などの他の環境が入っているので複数ボードマネージャのURLに入ってますが,気にしないでください.複数ある場合は改行して一番最後に追加しておけば大丈夫です.

ボード情報を追加

次にArduino IDEにボード情報を追加します。

ツール==>ボード==>ボードマネージャをクリックします。開いたボードマネージャの検索バーにSeeeduinoと入れるとXIAOが出てくるのでインストールをクリック。 f:id:fumimaker:20200422005248p:plain ダウンロードが始まってしばらくすると終わります。終わったらボードマネージャを閉じてください。

f:id:fumimaker:20200422005254p:plain
インストール開始

Lチカ

ようやくLチカできます。

ファイル==>スケッチ例==>Basics==>Blinkを選択するとLチカのプログラムが出てきます。このままだといま動いているプログラムと全く同じでつまらないのでスピードを上げておきましょう。Delayの部分のスピードを0一つ減らして0.1秒ごとに点滅にしました。

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(100);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(100);                       // wait for a second
}

ツール==>ボードで先ほどインストールしたSeeeduino製品がいっぱい出てくるのでXIAOを選択。

f:id:fumimaker:20200422005411p:plain
Seeeduinoの中にXIAOがある
ツール==>シリアルポートでXIAOがパソコンに繋がってるポートを指定します。自分の場合はCOM4でした。
f:id:fumimaker:20200422005542p:plain
人によってポートが違います
左上の矢印ボタンをクリックして書き込みです。しばらくするとXIAOのLEDがさっきよりも高速に点滅し始めると思います。お疲れさまでした。

注意:IOは3.3Vレベルなので気を付けてください。VinだけはDCDCで降圧されてるので5V入れても大丈夫らしい。

外部LEDでLチカ

ピンの出力先を変えるだけです.6番pinに抵抗とLEDを直列につないでプログラムを書き込みます.当たり前ですがちゃんと動いてる.

void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(6, OUTPUT);
  digitalWrite(6,LOW);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(6, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(500);                       // wait for a second
  digitalWrite(6, LOW);    // turn the LED off by making the voltage LOW
  delay(500);                       // wait for a second
}

PWM出力: LEDホタルやってみる

PWMでホタルのようにLEDを点灯させてみます.ピンはさっきと同じでプログラムを書き換えて書き込みます.全部のデジタルピンにPWMが乗ってるらしいので嬉しいね.

int led = 6;           // the PWM pin the LED is attached to
int brightness = 0;    // how bright the LED is
int fadeAmount = 5;    // how many points to fade the LED by

// the setup routine runs once when you press reset:
void setup() {
  // declare pin 9 to be an output:
  pinMode(led, OUTPUT);
}

// the loop routine runs over and over again forever:
void loop() {
  // set the brightness of pin 9:
  analogWrite(led, brightness);

  // change the brightness for next time through the loop:
  brightness = brightness + fadeAmount;

  // reverse the direction of the fading at the ends of the fade:
  if (brightness <= 0 || brightness >= 255) {
    fadeAmount = -fadeAmount;
  }
  // wait for 30 milliseconds to see the dimming effect
  delay(30);
}

UART通信してみる

XIAOに何か喋らせてみます.とりあえずHello Worldを喋ってもらいました.これは何も配線しなくてもUSBさえ刺さってれば動きます.プログラムを書き込み,シリアルモニターを開き,したのボーレートを115200に変更するとマイコンが喋ってるのがわかります.

UART通信中(送信,受信)時には青色のLEDが光るみたいです.

int cnt=0;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.print("Hello World ");
  Serial.println(cnt);
  delay(1000);
  cnt++;
}

f:id:fumimaker:20200422005549p:plain
Hello World

ADC:電圧を測ってみる

XIAOで電圧を測ってみます.ここではその辺にあった適当な可変抵抗を用意してつなぎました.プログラムを書きこむと7ピンにかかってる電圧がわかります.XIAOは3.3Vまでしか対応してないのでご注意ください.

f:id:fumimaker:20200422003510j:plain
電圧をいじってる様子

void setup() {
  // put your setup code here, to run once:
  pinMode(7,INPUT);
  Serial.begin(115200);
}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.println(3.3/1024*analogRead(7));
  delay(100);
}

シリアルポートで115200を開くことで電圧がみれます.自分の場合は1.72Vくらいでした.

f:id:fumimaker:20200422005555p:plain
電圧測定結果
試しにテスタで電圧を測ってみたら1.7Vくらいだったのであっていそうですね.
f:id:fumimaker:20200422003604j:plain
なぜか小数点が消えてるけど気にしない

PWM出力:サーボを動かしてみる

サーボを動かしてみます.信号線に決められたフォーマットとPWM信号を送ることでサーボの角度を調整することができます.ArduinoにはServoを簡単に制御できるライブラリがあるのでそれを使うことにします.

f:id:fumimaker:20200422003258j:plain
サーボ

#include <Servo.h>

Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards

int pos = 0;    // variable to store the servo position

void setup() {
  myservo.attach(7);  // attaches the servo on pin 9 to the servo object
}

void loop() {
  for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
  for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
}

まとめ

まだほんのさわりしか試していませんがなかなか使えそう.I2CやSPI通信、UART、ADCなどたくさんの機能がついているのでもっと試してみたい.また,ArduinoCoreを使わずにCortex M0を直接レジスタから制御してやることで高速に動かすことが可能なので,使用用途が広がりそう.Cortex M0には他にも色々機能があってSingle Cycle IOBUSは1クロックでIO制御したりもできるそうで…すごいね.しっかり使ってあげたらもっと化けそう.勉強しましょうね...

今回はとりあえず動かしてみるところまででした.また使い込んでみて何かあれば追記します.今日はそんな感じです.

f:id:fumimaker:20200422003325j:plain
500円だし,みんなも買おう!