LEGOとATOM LiteでDIYリモコンカー 2 (Lチカ的な)
まずはHello World的なLチカから。
Arduino IDEを使います。Win,Mac,Linux対応しています。
自分は、2021年1月にMacからChromeBookに乗り換えたので、ChromeBookに入れて使っています。ChromeBookに入れる方法はこちらを参考にしました。ただ、最新版がうまく起動できなかったので、少し古いバージョンを入れてみてそれが動いているのでとりあえずいいかな、と使っています。画面等最新版のIDEと画面が一部違うかもしれませんが、そういう理由です。
https://www.stevencombs.com/arduino/2020/01/20/arduino-on-chromeos.html
Arduino IDEインストール後、ATOM Lite用の設定をします。公式はこちら「m5-docs」です。
の2つです。M5StickやらM5Stackなどほかのものも混ざっているので少し見づらいかもしれません。日本語だと、この辺のブログに書かれていますので参考にしながらも、最終的には公式の最新情報を参照いただくのがよいかと思います。
ここまで準備ができたら、Lチカをやってみます。
今回利用するM5STACK社のATOM Liteは「RGB LED」が本体についています。押しボタンもあります。赤外線も使えて、Wifiつながります。本体についている「RGB LED」でLチカしましょう。
なお、GPIOについて詳細はこちらのブログが詳しいです(今回はそれほどGPIOの表とにらめっこする必要はないです)。
今回はArduino言語で書いていきます。C/C++をベースとした言語です。
C言語にある、main関数はなく、代わりに「setup関数」と「loop関数」があります。あります、というかこの2つが必ず必要です。「setup関数」は起動時一回のみ処理されますので初期設定を書き込むことが多いです。「loop関数」は「setup関数」起動後、延々と繰り返し実行させるプログラムを書きます。
#include <M5Atom.h> void setup() { M5.begin(false, false, true); } void loop() { M5.dis.drawpix(0, 0xff0000); delay(1000); M5.dis.drawpix(0, 0x000000); delay(1000); }
最初の一行目、「M5Atom.h」を読み込んでいますがATOM Liteのお約束と考えていただければ。
setup関数に入っている「M5.begin(true, false, true);」は「UART, I2C, 本体LED」を利用するかどうかの設定で先の並び順に引数になっています。今回、LEDのみなので、第3引数をtrueにしています。
loop関数の「M5.dis.drawpix(0, 0xf00000);」でLEDを光らせています。第1引数はLED番号でATOM Liteは1個しかないので「0」で固定、と考えてよいです。ATOM Matricsは本体LEDが25個あるのでここを「0-24」に変えてLEDを指定してピカチカできるわけです。ATOM Matricsは持っていませんが。第2引数は色指定です。RGBの並びではなく「0xff0000」->緑、 「0x00ff00」->赤、「0x0000ff」->青、なのでGRBの順です。今回、とりあえず緑にしました。
delay(1000);
でLEDが光っていることを「1,000ミリ秒=1秒」持続します。これでLEDが光る、状態になります。
続く「M5.dis.drawpix(0, 0xf00000);」はLEDを消灯、になります。もう一度「delay(1000);」で消灯状態を1秒継続します。
USB-TypeCで接続して、Arduino IDEで書き込みます。もし失敗するようであれば、Board : "ESP32 Pico Kit" , Upload Speed : "115200" , Port : USB-TypeCの接続ポートが表示、あたりが設定されているか確認すると良いです。成功すれば、緑が1秒光って、1秒間消灯、緑Lチカチカが延々と続くと思います。ATOM Liteにはプログラムをアップロード済なので、電源さえあたえてあげればいつでもどこでも緑Lチカチカをできることになります。G->R->B->白->消灯、だと以下の感じです。
#include <M5Atom.h> void setup() { M5.begin(false, false, true); } void loop() { M5.dis.drawpix(0, 0xff0000); // Green delay(1000); M5.dis.drawpix(0, 0x00ff00); // Red delay(1000); M5.dis.drawpix(0, 0x0000ff); // Blue delay(1000); M5.dis.drawpix(0, 0xffffff); // White delay(1000); M5.dis.drawpix(0, 0x000000); //Off delay(1000); }
特にsetup関数やloop関数が空ではいけない、ということもないようなので、たとえば「SDGsの時代なんだから2回だけ光らせればいいんだよ」みたいな方は、setup関数でチカチカさせてあげてloop関数は空にしてしまう、でよいと思います*1。
#include <M5Atom.h> void setup() { M5.begin(false, false, true); delay(3000); M5.dis.drawpix(0, 0xff0000); delay(1000); M5.dis.drawpix(0, 0x000000); delay(1000); M5.dis.drawpix(0, 0xff0000); delay(1000); } void loop() { }
ここまででよいのですが、GPIO使ってLED光らせるブレッドボード的なものもやっておきたいですよね。ブレッドボードと赤色LEDと抵抗とジャンパワイヤ数本を用意してGPIOでのLチカもやってみたいと思います。
LEDは秋月電子通商で購入した赤色LEDがあったのでそれで。
- LED 1個
- 抵抗 65Ω 1個 (LEDの性能によります)
- ブレッドボード 1個
- ジャンパワイヤ 2本
あと、もしここから先の手順を試して見る方は、保護メガネも用意したほうが良いです、LEDは割れることがあります。熱を持つ部品もあります。電気も通します、ので電子工作の一般的な注意事項をもれなく適用していただくようお願いします。濡れた手で触らない、おかしな匂いや抵抗など部品の色が変わったと思ったら電源を抜く、保護メガネをする、整理整頓をして作業をする、電流を流す前に配線違いがないかやショートを起こしていないかもう一度確認する、とかでしょうか。どこまでいっても最終的には自己責任でお願いいたします。
ATOM Liteは3.3V出力で*2、用意したLEDが順方向電圧が2VでこのLEDに20mA流すと想定して、オームの法則で計算すると必要な抵抗値は65Ωでしょうか。秋月電子通商で購入した抵抗で75Ωがあったのでそれを使いました。ATOM Liteをひっくり返すと、なにやら穴が空いていると思います。対応表がずれていて見にくいのですが、左側の列の上から2番目、対応表上は「G22」という番号、「22」番のGPIOを使います。それから、右の一番下、「G」も使います。グランド(GND)です。
LEDは向きがあるので注意が必要です。ATOM LiteのGにつないでいる方がカソード、線が短いほうです。ATOM LiteのGPIO22番側、抵抗側についているのが線の長い方がアノードです。抵抗の方は向きはありません。ブレッドボードがはじめて、という方は、この辺がわかりやすいかもしれません。
今回使っているミニブレッドボードは秋月電子通商で購入したもので、長辺を横にしておいたとき、縦の5つの穴が内部で連結されているものです。横の連結がないものなので部品の数が多くなるとつなげにくくなります。ちょっとつなげるときや工作物に載せるときに場所を取りたくないときに使います。
ATOM Lite GPIO 「22」→(ジャンパワイヤ)→75Ω抵抗→LEDアノード→LEDカソード→(ジャンパワイヤ)→ATOM LITE G(GND)、とつながっています。
プログラムは以下のような感じです。
#include <M5Atom.h> void setup() { pinMode(22, OUTPUT); } void loop() { digitalWrite(22, HIGH); delay(1000); digitalWrite(22, LOW); delay(1000); }
ATOM Lite用のM5Atom.hのヘッダーファイルを読み込みます。これはお約束ですね。
続いて初回のsetup関数、LEDをチカチカさせる、が今回の目的なのでGPIO「22」をOUTPUTにしておきます。これで22番につながったLEDをチカチカする準備が整いました。
延々とループするloop関数にはチカチカ部分を書き込みます。
digitalWrite(22, HIGH);
が22番を光らせろ、です。あるいは、22番ピンをオンにしろ、電流流してね、という感じでしょうか。ただし、この1行だけだと、目視できない時間光ることになります(あるいは実際には光っていないのかもしれません)。
delay(1000);
でLEDが光っていることを「1,000ミリ秒=1秒」持続します。これでLEDが光る、状態になります。
void loop() { digitalWrite(22, HIGH); delay(1000); }
ここまで書いたもので実行すると、上のものが延々と実行され続けるのでLEDが1秒光る、を延々繰り返し、つまり光っぱなしという感じになります。これでも良いですが、Lチカにならないので、チカチカさせたいと。
digitalWrite(22, LOW);
さきほどの「HIGH」が「LOW」になっています。22番ピンを消せ、です。あるいはオフにしろ、電流を止めろ、です。同じように、止めたあとに、
delay(1000);
を入れてあげます。ここまでで1秒光って1秒消えてまた光る、が繰り返しになると思います。delayを変えれば時間を変えられます。
あとは、ピン番号なんかは定数として名前をつけてあげると書きやすいし、読みやすいし、あとから変更が効きやすいです。
#define LED_PIN 22
としてあげれば
digitalWrite(LED_PIN, HIGH); digitalWrite(LED_PIN, LOW);
と書けます。以下のように書き換えられます。
#include <M5Atom.h> #define LED_PIN 22 void setup() { pinMode(LED_PIN, OUTPUT); } void loop() { digitalWrite(LED_PIN, HIGH); delay(1000); digitalWrite(LED_PIN, LOW); delay(1000); }
もちろんユーザ定義の関数もかけますので、LED点灯部分を関数化して、
#include <M5Atom.h> #define LED_PIN 22 #define DELAY_TIME 1000 void blink(int PIN,int TIME){ digitalWrite(PIN, HIGH); delay(TIME); digitalWrite(PIN, LOW); delay(TIME); } void setup() { pinMode(LED_PIN, OUTPUT); } void loop() { blink(LED_PIN,DELAY_TIME); }
とも書けます。ここだけみれば何やら見づらいですが、コードが膨らんでいくとまた変わってきます。これ以上変更しないものであれば最初の書き方の方がみたままなのでわかりやすいと思いますが。
今日はここまで、としたいと思います。次はサーボモータでしょうか。
そういえば、諸々の説明が正確さを欠けているものだと思って読んでいただけると。仕上がりも、コードも、まずは動かすこと、形にして楽しむこと、を最優先で作った過程を記録したものです。ただ、自分自身がそうなのですが、自分の昔のコードも、他人のコードも少しずつ分解して部分的に動かしながらしか再現・理解できないため、部分的に動かしていく流れで書き留めておきます。