Arduino Nanoで遊んでみるお話。

はじめに
珍しく、ハードウェアのお話です。IoT的なお話です。
タイトルにArduino Nanoと書きましたが、実際に使うのはその互換品(ですらない)、Seeed Studio Xiao ESP32 C6というボードです。
切手くらいのサイズに、WifiやBluetoothなんかまで載ってて、ちょっとしたIoTっぽい何かとか、それこそおもちゃみたいなものを作るのに、ちょうどいい感じのマイコンボードです。
その代わりに、GPIOなんかのポートが少ないですが、マイコンで何かやらせる程度なら、これだけあれば十分な気もします。

RaspberryPiなどはOSが動いたりしますが、こいつはそんな高度なことはできない、いわゆるマイコンボードという類のものですね。
その代わりに、とっても省電力でちょこちょこっとした細かい作業をやり続けてくれる奴です。
目標
とある作りたいものがあって、買ってきたのですが、筆者はほぼマイコンについて無知です。
ということで、今回はhowdy world
的なものを3つほど作ってみて、マイコンってのがどういうものであるかを理解することを目標にしてみます。
とはいっても、あんまりにも初歩的なことを書いたりするのは面倒だし、ググればいくらでも情報が出てきたりするので、初期設定なんかは駆け足で進みます。
準備
Arduino IDEのインストール
別に何も難しいことはないです。
下記のサイトからexe
なりdmg
なりをダウンロードしてちゃちゃっと適当にインストールしちゃいましょ。


セットアップ
IDEをインストールしても、USBに接続したマイコンを自動では認識してくれないです。
認識させるために、IDE開いて、左側のアイコンの2つめを押して、Boards manager
ってのを開きましょう。windowsならctrl+shift+B
でも開くみたいです。
出てきた左側ペインの入力ボックスにesp32
と入力して出てくるesp32 by Espressif
ってのをインストールしましょう。(画像下のもの。私の環境ではインストール済なため「REMOVE」になってます)

途中、「これ入れても大丈夫?」みたいなこと聞かれるかもしれないですが、まあ、確認しててきとうに入れてましょう。
おわったら、下記画像の箱を押して、select other board and port...
を押下して、自分のもってるボードの名前を探して、適切なCOMを選んだらok
COM番号がわからない場合には、デバイスマネージャーのPorts
から探してみるとよいです。
PORTS
にNO PORTS DISCOVERED
と表示されてる場合には、マイコンとUSBの接続がおかしいと思います。USB抜き差ししてみるといいと思います。


初期設定の仕方なんてのは、割とどうでもいいことなので、さっさと作り物をしてみるです。
制作物その1「LED点滅させてみる」
まずは電子部品が何もない状態で、かつ、動作確認がてら、てきとうに動かしてみることにします。
そして、動作確認するためのコードを書くのも面倒なので、サンプルを出してみます。
File > Examples > 01.Basics > Blink
を開いてみます。
IDEが別画面で開いて、サンプルコードが出てくると思います。

書いてることは大したことないし、解説することもないので、とりあえず動かしてみます。
IDEの左上「→」のボタンを押したら、コードをコンパイルしてマイコンに書き込んでくれます。

USBの差込口横のLEDが点滅しましたね。
delay(1000)
を増減させると、動きが変わったりして面白いかもしれないです。
とりあえず動かせたので、okです。
制作物その2「ほかのLED点滅させてみる」
創作意欲がわいてきたところで、今度は外部のLEDを光らせてみます。
使用するのは、下記のパーツです。
- 青色LED
- 2.8V-3.4V
- max 30mA
- 抵抗
- 200Ω


コードはこんなの。
クラス化したりそういうのはとりあえずなしで、とりあえず書いたってだけのソースです。
const int out = D2;
void setup() {
pinMode(out, OUTPUT);
}
void loop() {
digitalWrite(out, HIGH);
delay(500);
digitalWrite(out, LOW);
delay(1000);
}
setup()
でD2
というピンを、OUTPUT
に指定。
loop()
でそのピンの電圧をHIGH
→LOW
とするものを、回してるってだけですね。
※今回はたまたまD2
を使ってますが、デジタルの出力ができるポートなら何番を使っても問題ないと思います。
回路はD2
から出した線を200Ωの抵抗につなぎ、発光ダイオードを経てGNDに帰るというだけのもの。
回路図にすれば、単純にこれだけのことです。
なんて簡単!!

抵抗値は下記で計算しました。
前提:
手元にあるLEDのVfは、その袋のスペック表に2.8V-3.4Vと書いてたので、3Vってことにします。
電流量はmaxで30mAまでにしてねとのことなので、マージンとって10mA(0.01A)流してみます。
D2からの出力は5Vが出てます。
計算:
(D2からの出力電圧 - LEDのVf) / 電流量 = 必要な抵抗
(5V - 3V) / 0.01A = 200Ω
D2
というのは、このデバイスの3番ポート(下図・左上から3番目)のことです。

制作物その3「ボタン押下を検知してみる」
光らせるだけじゃ何の役にも立たないですよね。
ってことで、ボタンが押されたとかそういうのを検知してみます。
使用するのは、下記のパーツです。
さっきと同じです。
- 青色LED
- 2.8V-3.4V
- max 30mA
- 抵抗
- 200Ω
- タクトスイッチ
※ 「タクトスイッチ」は押してる間だけ通電する「ボタン」のこと。

コードはこんなの。
ほんのちょっとだけ小難しくなりました。
const int din = D1;
const int out = D2;
void setup() {
pinMode(din, INPUT_PULLUP);
pinMode(out, OUTPUT);
}
void loop() {
switch();
}
void switch(){
int state = digitalRead(din);
digitalWrite(out, !state);
}
今度は、D1
にINPUT_PULLUP
というモードが付けられました。
詳しい仕組みはググってもらうとして、このモードは要するに、当該ピン(今回はD1
)のデフォルト状態がHIGHとなり、グランドに接触したらLOW
となると思えばよいです。
その信号をdigitalRead(din)
で読み取り、その値を反転してD2
から出力する電圧を決定しているということですね。
つまり、D1
から生えてるスイッチを押していない(OFF)状態の時、D1
の値はHIGH
となっているため、D2
はLOW
となっている。(LEDが光らない)
そして、D1
から生えてるスイッチを押した(ON)状態のときは、D1
の値がLOW
となるため、D2
がHIGH
となる。(LEDが光る)
なんだかややこしい感じがありますが、回路図としては、下記のとおりです。
D1
から出ているスイッチが開いた(OFF)状態だと、D2
から出ているLEDが光らない。D1
から出ているスイッチが閉じた(ON)状態だと、D2
から出ているLEDが光る。

動画内、右側へのびている黄色の線が、D1
から出てスイッチへつながっている信号線です。
信号線の先でボタンを連打してみてます。
いつもの雑なまとめ
とりあえず、inputとoutputについて学べたので、もうこれだけでもいろいろと作れちゃいそうですね。
制作物の目標もあるので、ぼちぼち作っていこうかと思ってます。