こんにちは、あろっちです。
M5Stamp C3 Mateを入手したので試してみました。
M5Stamp C3U Mateも記事にしました。スケッチは、本記事に掲載したもので試しています。
本記事では、プログラムにArduino(C/C++)を使っています。
ピン配列
LED | G2 |
ボタン | G3 |
I2C
デフォルトのピン番号を記載します。
ピン | GPIO |
SDA | 8 |
SCL | 9 |
Arduinoでは、SDA、SCLをWire.begin(SDA, SCL);
という形式で任意のピン番号に変更できます。
以下は、SDA=0、SCL=1に変更する例です。
Wire.begin(0, 1);
SPI
デフォルトのピン番号を記載します。
ピン | GPIO |
SCK | 4 |
MISO | 5 |
MOSI | 6 |
SS | 7 |
Arduinoでは、SPI.begin(SCK, MISO, MOSI, SS);
という形式で任意のピン番号に変更できます。
この動画は、SPIのTFTディスプレイ ILI9341の表示例です。
回路図
内容物
USBシリアルについて
M5Stamp C3は、シリアルにCH9102Fというチップを搭載しています。
Mac シリアルドライバ
※2021年11月1日追記
M5Stackのサイトから、CH9102_VCP_SER_MacOSをダウンロードできます。
https://docs.m5stack.com/en/download
以下の情報は、自分の環境だと上記ドライバのインストーラで画像のようなエラーが発生し、インストールできなかったため、代替手段として書いています。
なお、上記ドライバがインストールできれば、以下のドライバのインストールは不要です。
macOS Catalina 10.15.7
自分の環境では、上述のエラーが発生したため、(WCH公式)最新のUSBシリアルドライバ(CH34xVCPDriver V1.1)をインストールすることで使用することができました。
GitHub
https://github.com/WCHSoftGroup/ch34xser_macos
こちらから、CH34xVCPDriver.pkgをダウンロードしてインストールします。
インストール手順なども書いてあります。
WCHサイト ※こちらからもダウンロードできます。
http://www.wch.cn/downloads/CH34XSER_MAC_ZIP.html
Windows シリアルドライバ
M5Stackサイトから、CH9102_VCP_SER_Windowsをダウンロードできます。
ダブルクリックでインストーラが起動し、[INSTALL]をクリックするとドライバがインストールできます。
https://docs.m5stack.com/en/download
Arduinoボード設定
M5Stamp C3では、次のボードが使用できます。
- M5Stackボード STAMP-C3
- ESP32ボード ESP32C3 Dev Module
本記事に掲載のスケッチは、いずれのボードでも動作することを確認しました。
M5Stackボード STAMP-C3を使用する場合
Arduino IDEにM5Stackボードを追加しておきます。
追加方法については、以下の記事をご参照ください。
- ボードインストール
[ツール] > [ボード] > [ボードマネージャ]からM5Stackボードをインストールします。
- ボードの選択
[ツール] > [ボード] > [M5Stack Arduino] > [STAMP-C3]を選択します。
- シリアルポートの選択
シリアルポートは、Macの場合、/dev/cu.wchusbserial*から始まるポートを選択します。
Windowsの場合は、COM*で認識されますので、それを選択します。
ESP32ボード ESP32C3 Dev Moduleを使用する場合
Arduino IDEにESP32ボードを追加しておきます。安定リリース版でOKです。
追加方法については、以下の記事をご参照ください。
- ボードインストール
[ツール] > [ボード] > [ボードマネージャ]からESP32ボード(Ver2.0.0以降)をインストールします。
- ボードの選択
[ツール] > [ボード] > [ESP32 Arduino] > [ESP32C3 Dev Module]を選択します。
- シリアルポートの選択
シリアルポートは、Macの場合、/dev/cu.wchusbserial*から始まるポートを選択します。
Windowsの場合は、COM*で認識されますので、それを選択します。
書き込みモード(Download Boot)
G9とGNDを短絡することで、書き込みモードにできるようです。
※ESP32-C3 Technical Reference Manual(7.2 Boot Mode Control)および回路図を参考にしました。
書き込みがうまくいかない場合に試すとよいかと思います。
今回は、ピンヘッダー未装着のため、スルーホール用テストワイヤで試してみました。
以下のようにUSBを接続し、Arduino IDE(1.8.15 Mac版)からスケッチが書き込めるのを確認しました。
参考(pdf):
ESP32-C3 Technical Reference Manual
ESP32-C3 Datasheet
今回使用したスルーホール用テストワイヤ(TT-200)は、秋月電子通商さんで入手したものです。
サンプルプログラム(Arduinoスケッチ)
Lチカ
カラフルにLチカしてみました。
Adafruit NeoPixelライブラリを使用しています。
#include <Adafruit_NeoPixel.h>
#define LED_PIN 2
#define COLOR_REPEAT 2
// create a pixel strand with 1 pixel on PIN_NEOPIXEL
Adafruit_NeoPixel pixels(1, LED_PIN);
uint8_t color = 0, count = 0;
uint32_t colors[] = {pixels.Color(125, 0, 0), pixels.Color(0, 125, 0), pixels.Color(0, 0, 125), pixels.Color(125, 125, 125)};
const uint8_t COLORS_LEN = (uint8_t)(sizeof(colors) / sizeof(colors[0]));
void setup() {
pixels.begin(); // initialize the pixel
}
void loop() {
pixels.setPixelColor(0, colors[color]);
pixels.show();
delay(1000);
pixels.clear();
pixels.show();
delay(1000);
count++;
if(count >= COLOR_REPEAT) {
count = 0;
color++;
if(color >= COLORS_LEN) {
color = 0;
}
}
}
レインボー
#include <Adafruit_NeoPixel.h>
#define LED_PIN 2
#define MAX_BRIGHTNESS 255
Adafruit_NeoPixel pixels(1, LED_PIN);
int rgbValues[] = {MAX_BRIGHTNESS, 0, 0}; // 0=Red, 1=Green and 2=Blue
int upIndex = 0, downIndex = 1;
void setup()
{
pixels.begin(); // initialize the pixel
}
void loop()
{
rgbValues[upIndex] += 1;
rgbValues[downIndex] -= 1;
if (rgbValues[upIndex] > MAX_BRIGHTNESS)
{
rgbValues[upIndex] = MAX_BRIGHTNESS;
upIndex = upIndex + 1;
if (upIndex > 2)
{
upIndex = 0;
}
}
if (rgbValues[downIndex] < 0)
{
rgbValues[downIndex] = 0;
downIndex = downIndex + 1;
if (downIndex > 2)
{
downIndex = 0;
}
}
pixels.setPixelColor(0, pixels.Color(MAX_BRIGHTNESS - rgbValues[0], MAX_BRIGHTNESS - rgbValues[1], MAX_BRIGHTNESS - rgbValues[2]));
pixels.show();
delay(5);
}
一撃入魂
内蔵ボタンを押すと、1/2でレインボーに光るというスケッチです。
ルール
チャンスは1回、ボタン押下時に抽選
ということで、今回のスケッチは、あえてボタン入力の受付は1回のみとしてみました。
再チャレンジしたい場合は、リセットボタンを押してみてください。
RGB LEDの状態について
ボタン入力受付は、白点滅
抽選演出は、赤で表現
抽選結果は、当選時 > レインボー、落選時 > フェードアウト
#include <Adafruit_NeoPixel.h>
#define BTN 3
#define LED_PIN 2
#define TOGGLE_PERIOD (1000u)
#define LED_STAND_BY_COLOR 0xffffff
#define LED_READY_COLOR 0xff0000
Adafruit_NeoPixel pixels(1, LED_PIN);
uint8_t rgbValues[7][3] = {
{255, 0, 0}, {255, 165, 0}, {255, 255, 0}, {0, 128, 0}, {0, 255, 255}, {0, 0, 255}, {128, 0, 128}};
int16_t randNumber;
int16_t brightness = 0;
int16_t fadeAmount = 10;
void toggleLED_nb(void)
{
static bool toggle = true;
static auto lastToggle = millis(); // saved between calls
auto now = millis();
if (now - lastToggle > TOGGLE_PERIOD)
{
if (toggle)
{
pixels.setPixelColor(0, LED_STAND_BY_COLOR);
pixels.setBrightness(18);
pixels.show();
}
else
{
pixels.clear();
pixels.show();
}
toggle = !toggle;
lastToggle = now;
}
}
void readyLED()
{
for (uint8_t i = 0; i < 3; i++)
{
brightness = 0;
pixels.clear();
pixels.show();
delay(100);
for (uint8_t j = 0; j < (100 / fadeAmount); j++)
{
pixels.setPixelColor(0, LED_READY_COLOR);
pixels.setBrightness(brightness);
pixels.show();
brightness = brightness + fadeAmount;
delay(80);
}
delay(1000);
}
brightness = 150;
pixels.setPixelColor(0, LED_READY_COLOR);
pixels.setBrightness(brightness);
pixels.show();
delay(3000);
}
void successLED()
{
for (uint8_t i = 0; i < 8; i++)
{
for (uint8_t j = 0; j < 7; j++)
{
pixels.setPixelColor(0, pixels.Color(rgbValues[j][0], rgbValues[j][1], rgbValues[j][2]));
pixels.setBrightness(18);
pixels.show();
delay(50);
}
}
}
void failureLED()
{
while (0 < brightness)
{
pixels.setPixelColor(0, LED_READY_COLOR);
pixels.setBrightness(brightness);
pixels.show();
brightness = brightness - fadeAmount;
delay(80);
}
pixels.clear();
pixels.show();
delay(200);
pixels.setPixelColor(0, LED_READY_COLOR);
pixels.setBrightness(10);
pixels.show();
delay(150);
}
void setup()
{
pinMode(BTN, INPUT_PULLUP);
pixels.begin();
while (digitalRead(BTN) == HIGH)
{
toggleLED_nb();
delay(10);
}
// 抽選
randomSeed(analogRead(0));
randNumber = (int16_t)random(0xffff + 1);
readyLED();
if (randNumber < 0)
{
// おめでとう
successLED();
}
else
{
// 残念
failureLED();
}
pixels.clear();
pixels.show();
}
void loop()
{
}
HelloServer
[スケッチ例] > [WebServer] > [HelloServer]のコードをM5Stamp C3用に修正したものです。
LEDにNeoPixelを使うように修正しています。
#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <ESPmDNS.h>
#include <Adafruit_NeoPixel.h>
const char* ssid = "........";
const char* password = "........";
WebServer server(80);
#define LED_PIN 2
Adafruit_NeoPixel pixels(1, LED_PIN);
void led_on() {
pixels.setPixelColor(0, pixels.Color(125, 0, 0));
pixels.show();
}
void led_off() {
pixels.clear();
pixels.show();
}
void handleRoot() {
led_on();
server.send(200, "text/plain", "hello from esp32!");
led_off();
}
void handleNotFound() {
led_on();
String message = "File Not Found\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod: ";
message += (server.method() == HTTP_GET) ? "GET" : "POST";
message += "\nArguments: ";
message += server.args();
message += "\n";
for (uint8_t i = 0; i < server.args(); i++) {
message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
}
server.send(404, "text/plain", message);
led_off();
}
void setup(void) {
pixels.begin();
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println("");
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
if (MDNS.begin("esp32")) {
Serial.println("MDNS responder started");
}
server.on("/", handleRoot);
server.on("/inline", []() {
server.send(200, "text/plain", "this works as well");
});
server.onNotFound(handleNotFound);
server.begin();
Serial.println("HTTP server started");
}
void loop(void) {
server.handleClient();
delay(2);//allow the cpu to switch to other tasks
}
スケッチを書き込む場合、ssidとpasswordを接続するWi-Fiの情報に書き換えてください。
シリアルモニターを開くと、HelloServerのIPアドレスが表示されますので、ブラウザからアクセスします。
以下のように表示されます。
http://IPアドレス
http://IPアドレス/inline
http://IPアドレス/適当な文字列
まとめ
小さくて高機能。USBシリアルポート搭載で、すぐ試せるというのが嬉しいですね。
お試し程度でしか触れていませんが、ご参考になればと思います。
以下は、当ブログで紹介したマイコンの記事です。よろしければ、ご覧ください。
コメント