TRYGEARのArduinoプログラミング

  • 投稿者:
  • 投稿カテゴリー:Arduino

端子名の定義

#if defined(PICO_RP2350) && (PICO_RP2350A == 0)
// RP2350B, TRYGEAR-VIZ
// #pragma message "TRYGEAR-VIZ RP2350B"

#define XD0 1
#define XD1 0
#define XD2 2
#define XD3 3
#define XD4 4
#define XD5 5
#define XD6 6
#define XD7 7
#define XD8 22
#define XD9 23
#define XD10 9
#define XD11 11
#define XD12 8
#define XD13 10

#define XA0 40
#define XA1 41
#define XA2 42
#define XA3 43
#define XA4 46
#define XA5 47

#define XD14 XA0
#define XD15 XA1
#define XD16 XA2
#define XD17 XA3
#define XD18 XA4
#define XD19 XA5

#define SW1 29
#define SW2 30
#define SW3 31

#define SRV1 32
#define LED2 32
#define DAC 32
#define SRV2 33
#define LED3 33
#define RGB 33

#define LED1 XD13
#define LED4 25
#define SPK 26

#define SDA0 20
#define SCL0 21
#define SDA1 46
#define SCL1 47
#define OLED_SDA 20
#define OLED_SCL 21

#define TFT_DC 36
#define TFT_CS 37
#define TFT_MOSI 39
#define TFT_MISO 36
#define TFT_SCK 38

#define SD_CS 24
#define SD_MOSI XD11
#define SD_MISO XD12
#define SD_SCK XD13
// ----------
#elif defined(ARDUINO_ARCH_RP2040)
// RP2040 or RP2350A, TRYGEAR-DASH/LITE/CORE RP2350/RP2040
// #pragma message "TRYGEAR-DASH/LITE/CORE RP2350/RP2040"

#define XD0 1
#define XD1 0
#define XD2 2
#define XD3 3
#define XD4 4
#define XD5 5
#define XD6 6
#define XD7 7
#define XD8 8
#define XD9 9
#define XD10 13
#define XD11 11
#define XD12 12
#define XD13 10

#define XA0 26
#define XA1 27
#define XA2 28
#define XA3 29

#define XD14 XA0
#define XD15 XA1
#define XD16 XA2
#define XD17 XA3
#define XD18 20
#define XD19 21

#define SW1 14
#define SW2 15
#define SW3 22

#define SRV1 0
#define LED2 0
#define DAC 0
#define SRV2 1
#define LED3 1
#define RGB 1

#define LED1 XD13
#define LED4 25
#define SPK 23

#define SDA 20
#define SCL 21
#define OLED_SDA 20
#define OLED_SCL 21

#define TFT_DC 16
#define TFT_CS 17
#define TFT_MOSI 19
#define TFT_MISO 16
#define TFT_SCK 18

#define SD_CS 24
#define SD_MOSI XD11
#define SD_MISO XD12
#define SD_SCK XD13
// ----------
#elif defined(CONFIG_IDF_TARGET_ESP32S3)
// ESP32-S3
// #pragma message "TRYGEAR-NET ESP32-S3"

#define XD0 44
#define XD1 43
#define XD2 1
#define XD3 2
#define XD4 3
#define XD5 38
#define XD6 39
#define XD7 40
#define XD8 41
#define XD9 42
#define XD10 10
#define XD11 11
#define XD12 13
#define XD13 12

#define XA0 4
#define XA1 5
#define XA2 6
#define XA3 7
#define XA4 8
#define XA5 9

#define XD14 XA0
#define XD15 XA1
#define XD16 XA2
#define XD17 XA3
#define XD18 XA4
#define XD19 XA5

#define SW1 XD2
#define SW2 47
#define SW3 48

#define SRV1 45
#define LED2 45
#define DAC 45
#define SRV2 46
#define LED3 46
#define RGB 46

#define LED1 XD13
#define SPK 21

#define SDA 8
#define SCL 9
#define OLED_SDA 8
#define OLED_SCL 9

#define TFT_DC 17
#define TFT_CS 18
#define TFT_MOSI 16
#define TFT_MISO 17
#define TFT_SCK 15

#define SD_CS 14
#define SD_MOSI XD11
#define SD_MISO XD12
#define SD_SCK XD13
#elif defined(ARDUINO_ARCH_STM32)
#error "STM32"
#elif defined(__AVR_ATmega328P__)
#error "ATmega328P"
#else
#error "Unknown"
#endif

スイッチとLED

SW1,SW2,SW3を押すと、それぞれ対応するLEDが点灯するスケッチ例です。

#include "TRYGEAR.h"

void setup() {
  pinMode(SW1, INPUT_PULLUP) ;
  pinMode(SW2, INPUT_PULLUP) ;
  pinMode(SW3, INPUT_PULLUP) ;

  pinMode(LED1, OUTPUT) ;
  pinMode(LED2, OUTPUT) ;
  pinMode(LED3, OUTPUT) ;
}

void loop() {
  int hz = 0 ;

  if (digitalRead(SW1) == LOW)
     digitalWrite(LED1, HIGH) ;
  else
     digitalWrite(LED1, LOW) ;

  if (digitalRead(SW2) == LOW)
     digitalWrite(LED2, HIGH) ;
  else
     digitalWrite(LED2, LOW) ;

  if (digitalRead(SW3) == LOW)
     digitalWrite(LED3, HIGH) ;
  else
     digitalWrite(LED3, LOW) ;

  delay(100) ;
}

スイッチと圧電スピーカー

SW1,SW2,SW3を押すと、それぞれ異なる音を鳴らすスケッチ例です。

#include "TRYGEAR.h"

void setup() {
  pinMode(SW1, INPUT_PULLUP) ;
  pinMode(SW2, INPUT_PULLUP) ;
  pinMode(SW3, INPUT_PULLUP) ;
}

void loop() {
  int hz = 0 ;

  if (digitalRead(SW1) == LOW)
     hz += 220 ;
  if (digitalRead(SW2) == LOW)
     hz += 440 ;
  if (digitalRead(SW3) == LOW)
     hz += 880 ;

  if (hz != 0)
    tone(SPK, hz) ;
  else
    noTone(SPK) ;

  delay(100) ;
}

OLEDディスプレイへの文字表示

OLEDディスプレイに文字列を表示するスケッチ例を示します。

SENSOR-PLUS のOLEDディスプレイには、コントローラとしてSSD1306が使用されています。OLEDディスプレイの制御ライブラリは、様々なものが提供されていますが、ここではU8g2ライブラリを使用した例を示します。

U8g2 ライブラリの使用法は、以下のWEBページに紹介されています。

ライブラリマネージャを使用してU8g2ライブラリを導入して使用してください。

#include "TRYGEAR.h"

#include <U8x8lib.h>

#define SDA 20
#define SCL 21

U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(U8X8_PIN_NONE);

void setup() {
  u8x8.begin();
  u8x8.setFont(u8x8_font_amstrad_cpc_extended_r);
  u8x8.clearDisplay();
}

char tstr[20];

void loop() {
  u8x8.drawString(1, 0, "- TRYGEAR-AVR -");
  u8x8.drawString(4, 1, "MicroFan");
  u8x8.drawString(0, 2, "OLED Display");
  u8x8.drawString(0, 3, "Piezo Speaker");
  u8x8.drawString(0, 4, "Brightness SNSR");
  u8x8.drawString(0, 5, "Temp. Hum. SNSR");
  u8x8.drawString(0, 6, "Accelerometer");
  u8x8.drawString(0, 7, "WS2812 RGB LED");

  delay(1000);
}

WS2812カラーLED

WS2812はNeoPixelライブラリで操作できます。

NeoPixelライブラリがインストールされると、メニューバーの[ファイル] -> [スケッチ例...]を選択すると、メニューの下の方の[カスタムライブラリのスケッチ例]の中にインストールされたNeoPixelライブラリに関する項目が追加されていることがわかります。

その項目を選択すると、いくつかのデモスケッチが表示されます。

カラーLEDの動作テストとしては、カラーLEDの鮮やかな色の変化を楽しめるstrandtestがよいでしょう。スケッチを開いたら、図に示す様に2つの定数をSENSOR-PULSの接続に合わせて設定します。

#include "TRYGEAR.h"

strandtestをコンパイル・実行させると、SENSOR-PLUSの右側の3個のカラーLEDが、様々に色を変えながら点滅します。気温・湿度・明るさセンサー

OLEDディスプレイに気温・湿度センサーAHT21で得られた気温と湿度と、明るさセンサー(フォトトランジスタ)で得られた明るさを表示するスケッチ例を示します。

SENSOR-PLUSの気温・湿度センサーには、AHT21が使用されています。AHT21の制御には、AHT20用のライブラリを使用することができます。ここでは、Adafruit AHTX0ライブラリを使用した例を示します。ライブラリマネージャを使用してAdafruit AHTX0ライブラリを導入して使用してください。

#include "TRYGEAR.h"

#include <U8x8lib.h>
#include <Adafruit_AHTX0.h>

#define SDA 20
#define SCL 21

U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(U8X8_PIN_NONE);
Adafruit_AHTX0 aht;

void setup() {
  u8x8.begin();
  u8x8.setFont(u8x8_font_amstrad_cpc_extended_r);
  u8x8.clearDisplay();
  aht.begin(); // AHT21の初期化
}

char tstr[20];

void loop() {
  sensors_event_t humidity, temp;

  aht.getEvent(&humidity, &temp); // AHT21から湿度と温度の取得

  u8x8.draw1x2String(0, 0, "TEMP: ");
  dtostrf(temp.temperature, 4, 1, tstr);  // sprintf は実数の変換ができない
  u8x8.draw1x2String(6, 0, tstr);
  u8x8.draw1x2String(10, 0, "'C");
  sprintf(tstr, "%2d%%", (int)humidity.relative_humidity);
  u8x8.draw1x2String(0, 2, "HUM: ");
  u8x8.draw1x2String(5, 2, tstr);
  u8x8.draw1x2String(0, 4, "BRT: ") ;
  dtostrf(analogRead(2)/4095.0, 4, 2, tstr);  // sprintf は実数の変換ができない
  u8x8.draw1x2String(5, 4, tstr);

  delay(1000);
}

加速度センサー

OLEDディスプレイに3軸の加速度と、基板の傾きを表示するスケッチ例を示します。

SENSOR-PLUSの加速度センサーには、XKTJ3-1057が使用されています。ここでは、XKTJ3-1057ライブラリを使用した例を示します。ライブラリマネージャを使用してXKTJ3-1057ライブラリを導入して使用してください。

#include "TRYGEAR.h"

#include <U8x8lib.h>

U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(U8X8_PIN_NONE);

// Accelerometer provides different Power modes by changing output bit resolution
#define LOW_POWER
//#define HIGH_RESOLUTION

#include <kxtj3-1057.h>
#include <Wire.h>
#include <math.h>

float sampleRate = 6.25;  // HZ - Samples per second - 0.781, 1.563, 3.125, 6.25, 12.5, 25, 50, 100, 200, 400, 800, 1600Hz
uint8_t accelRange = 2;   // Accelerometer range = 2, 4, 8, 16g

KXTJ3 myIMU(0x0E);  // Address can be 0x0E or 0x0F

void setup() {
  u8x8.begin();
  u8x8.setFont(u8x8_font_amstrad_cpc_extended_r);
  u8x8.clearDisplay();

  pinMode(21, OUTPUT) ; // 圧電スピーカーのノイズ止め

  myIMU.begin(sampleRate, accelRange);

  // Detection threshold, movement duration and polarity
  myIMU.intConf(123, 1, 10, HIGH);
}

char tstr[20];

void loop() {
  float x, y, t ;

  myIMU.standby(false);

  u8x8.draw1x2String(0, 0, "X: ");
  dtostrf(x = myIMU.axisAccel(X), 6, 3, tstr);  // sprintf は実数の変換ができない
  u8x8.draw1x2String(3, 0, tstr);
  u8x8.draw1x2String(0, 2, "Y: ");
  dtostrf(y = myIMU.axisAccel(Y), 6, 3, tstr);
  u8x8.draw1x2String(3, 2, tstr);
  u8x8.draw1x2String(0, 4, "Z: ");
  dtostrf(myIMU.axisAccel(Z), 6, 3, tstr);
  u8x8.draw1x2String(3, 4, tstr);

  t = atan2(-y, x) * 180 / 3.14 ;
  u8x8.draw1x2String(0, 6, "DEG: ");
  dtostrf(t, 6, 1, tstr);
  u8x8.draw1x2String(5, 6, tstr);

  myIMU.standby(true);

  delay(1000);
}